Wednesday, April 20, 2011

submission of genome - 4

NCBI submit 하면서 Q&A 와 최종 정리


genbank에 있는 genome의 annotation은 정해진 규칙이 없다. 곧 각자 어느정도의 로직을 가지고 annotation을 한것이며 NCBI에서 체크하는 것은 각 sequence의 id가 겹치지 않게끔 체계를 갖게 하는것 뿐이다. 


protein_id 는 locus tag를 따르기를 권유한다. genome submit하고 나면 나중에 protein들에 대한 accession number가 NCBI로 부터 할당되어 통보된다.


<Sequin 프로그램에서 주의 사항>
1. topology 변경
2. codon table 변경
3. protein page랑 annotation page는 넘겨도 된다. 나중에 sequin feature table로 로드하면 됨.
4. gene이 reverse strand 일때 annotation input 파일에서 end position이 start position보다 앞에 나와야 한다.
5.다 만들었다 싶으면 search에서 validate를 실행.


Sequin 프로그램이 오작동 하면 이건 input 파일이 잘못 된거다(내가 겪은 예로 genome 이 circular 인데 orf가 -strand로 genome 끝에서 다시 처음으로 연결된 orf가 있었다. 이때 위의 3번 주의 사항으로다가 아무 생각없이 annotation input file을 만들었더니 계속 오류가 나더라. 결국 다시 genome 셋팅하고 annotation position 다 바꿈).

Monday, April 18, 2011

submission of genome - 3

아직 NCBI에 submit 하는걸 완벽히 다 안거는 아니지만(특히 sequin 프로그램 사용법이 아직 약하다) 이번에는 journal of bacteriology 의 genome announcement 에 대해 좀 자세히 알아 보고 거기에 나온 논문 두개 정도 읽어보면서 어떤 내용을 넣어야 할지 정해보려 한다.


일단 뭔가를 읽기 전에 checklist를 생각해보자면..
1. 반드시 NCBI 등이 데이터베이스에 등록이 된 genome만 publish가 가능한가 확인
2. 500 words 안으로 써야 하는데 어떤걸 써야 하는가
3. annotation의 reference를 어떻게 처리 했나?




<genome announcement 논문 훓어보기>
뭐 어떤 균주냐 이런건 안 중요하고 
review 첫번째 논문
1.균주에 대한 intro: genus부터 소개, 왜 중요한지, source가 어딘지, 어떤 특성을 갖는지 등등
2.de novo assembly 전체적인 소개 및 annotation 방식 소개: 무슨 기계로 얼마만큼의 데이터를 만들어 냈는지 그리고 assembler로 뭘 썻는지,  CRITICA와 glimmer2를 이용해서 cds를 prediction했고, 그담이 이해가 안가는데 GO로 분류했고 상용 프로그램인 뭐를 썻다네.
3.genome에 대한 overview : 게놈 사이즈가 어떤지, ORF 갯수, 그리고 같은 genus 의 다른 species와의 길이 및 orf 갯수 비교. GC content.
4.orf annotation에 대한 overview : nr,cog blast 결과 보고. 다른 species에 없는 기능을 하는 유전자 소개


review 두번째 논문 
1.균주에 대한 intro : 이 균주는 beneficial 한 균주다 뭐 이런 내용.
2.또 균주 소개
3.시퀀싱 방법과 annotation 에 대한 내용: 이거 특이하게도 AB3700 DNA analyzer를 이용했다. 물론 solexa로 confirm을 하긴 했지만. 여튼 Yacop으로 orf  prediction했고 Uniprot, COG, KEGG, TIGRFAMs을 이용해 annotation했단다.
4.genome 에 대한 설명 : genome size, GC content, structural RNA 갯수, 몇개의 유전자가 putative function이 있는지, 


음 보아하니 유전자에 대한 comment 가 있어야 할 듯 하다. 다른 species와의 비교로 어떤 유전자가 더 있었다 이정도.. 


<genome announcement 논문 들어가야 할 list>
실험 방식(FLX+ sanger 3730), FLX 데이터 양(read, depth, paired-end), de novo assembler(GS De Novo Assembler version), 첫 de novo assembly 했을시 scaffold 갯수 및 양, sanger 3730으로 gap closing 시 read 양과 bp 길이, 어떤 프로그램 (phred/phrap/consed), annotation tool(glimmer3, rnammer, trnascan,) 및 방식(nr blastp, cog rpsblast, signalp, pfam) 




reference list도 10~15 개 정도로 하고, 쓸데 없는 말은 전부 배제하기로 한다. 논문 본연의 목적에 맞게 쓰도록 한다. 딱 지금 한 것만 쓰자.

Sunday, April 17, 2011

submission of genome - 2

여행 다녀왔는데.. 봄이라.. 아.. 몸살인지 감기인지.. 거의 좀비 상태다. 아.. 힘들어 죽을거 같어.. 휴가를 내고 싶지만 벌써 놀러 갔다 오느라 이틀을 쓴 상태라 최대한 아끼려는 생각에.. 버텨볼려 했다가 탈수에 병원 응급실까지가서 드러누워버리는 바람에.. 내 태어나서 이리 고생해보긴 첨인듯. 아직도 머리가 어지럽지만.. 집에서 드러누워 티비보면 뭐할쏘냐.. 병이 낫는것도 아니고, 빅토르 위고는 억지로라도 글쓸려고 하인시켜서 가운가지고 가게 했다는데 같은 심정으로다가 회사에 일단 왔으니 뭐라도 좀 하고 가자..


일단 저번에 포스팅하면서 genome project 등록했고 locus tag prefix 까지 등록을 했으니 annotation 부분을 좀더 자세하게 읽어보고 Sequin 사용법을 알아봐야 할 것이다.


<annotation>
http://www.ncbi.nlm.nih.gov/genbank/genomesubmit_annotation.html#disrupted_genes
일단 annotation 에 들어갈 feature들(gene, CDS, 등등)은 feature table(five-column tab-delimited table) 파일 안에 다 들어가 있어야 한다. 이 feature table 파일이란게 뭐냐 그럼. 이게 Sequin이나 tbl2asn 프로그램의 input 파일인 듯 싶다. 그럼 컬럼이 5개라고 했는데 뭐가 들어가냐? 1.start location of feature, 2.stop location of feature, 3.feature key, 4.qualifier key, 5.qualifier value.
딴건 별내용 없고.. 아 중요한거 하나 feature table에 맨 첫줄에 >하고 나서 seqid를 넣어야 하는데 이는 fasta 파일의 seqid와 동일해야 한다. 그런데 뭘 seqid로 정하냐? 아하.. 이거 임시다. 아무거나 정해도 된다. NCBI staff가 review 할때 accession number로 바꿔준단다.  protein id는 locus id랑 동일하게 하면 될것 같고, CDS 가 반드시 product qualifier (protein name)이 있어야 하는거 같은데.. naming 에 대해서는 주의해야 할건.. function, cellular location 같은 정보를 이름에 담지 말아햐 한다(이는 note feature에 넣을 것). protein의 unkown 일때 hypothetical protein이라는 용어를 쓸것. 여차함 gene symbol이랑 같은거 쓰는데 단 첫글자는 대문자로 할것. multigene family에 속하는 것들(이게 좀 이상한데 multigene family 에 대한 항목과 sequence similarity나 function share에 의한 homology 항목을 분리 시켰는데 같은 의미 아닌가?) 숫자로 구분하고 복수형 단어는 사용하지 말것. 기능이 알려지지 않은 protein인데 defined domain을 갖었을 때 -containing protein 이라고 명명할 수 있다.
notes feature에는 데이터베이스의 entry와의 sequence similarity 를 넣는것을 피하란다.
tRNA의 경우 어떤 amino acid에 해당하는것인지 명시하고 잘 모르겠으면 tRNA-Xxx 라고 하란다. 
글고 2005년 미팅으로 /experimental과 /inference 라는 항목이 정해졌다는데 이 설명은 여기.
해석해보자면.. 2005년에 INSD, DDBJ, EMBL, GenBank 모여서 회의했을 때 feature의 evidence 항목에 대해서 새로히 뭔가 정했다는데..기존의 evidence=expermental이라는 항목을 대체해서 /experimental=text 라는 항목과 /inference=TYPE:text 라는 항목을 넣자고 정했단다. text는 규격화된 text(곧 설명한다)를 TYPE에는 정해진 list에서 뽑아서 선택하는거. experimental 항목은 말그대로 실험한 내용쓰는거, 단 간단하게. inference는 non-experimental evidence를 명시하는것. TYPE은  11가지중 하난데.(이건 직접 링크 따라가서 보자) 


??궁극적으로 의문이 드는건.. 그렇다면 annotation의 제한은 없다는 건가? 누구는 이런식으로 ORF를 prediction하고 또 prediction한 ORF의 protein을 특정 방식으로, 그러니까 sequence similarity로 만 따져서 protein naming을 해도 되는 것인가? 아.. 이거 그냥 inference 항목으로 사용한 프로그램 명시하면 되는건가? 뭐.. 관리자한테 메일 보냈으니 답장오겠지..근데 전에 COG 관련 해서 질문했다가 씹힌거 같은데.. 제대로 올려나 모르겠네. 


<Sequin>
http://www.ncbi.nlm.nih.gov/Sequin/QuickGuide/sequin.htm
사실 이 프로그램 별거 아니다(아.. 다만 내가 하려는거에 한해서만 이야기 하자면). 위의 feature table을 genbank format으로 바꿔주는건데.. (내가 만든 파이프 라인 돌아가면 biopython을 이용해서 genbank 파일 만들어주긴 하지만 아무래도 혹시나 라는 생각에 그냥 이거 쓰기로 한다) 뭐 여튼.. 
fasta 파일을 일단 읽어들이는데 의문점 하나가.. nucleotide sequence가 하나 이상의 protein product를 endoing 하면 2개의 파일, 그러니까 하나는 nucleotides, 다른 하나는 protein 을 위한 파일이 필요하다는데.. 이건 뭔소린지.. 더 읽어봐야 알듯. 글고 fasta 파일의 title 그러니까 첫줄( > 있는 라인) 에 각종 modifier를 이용해서 정보를 넣을 수 있는데 어떤 modifier를 써야 할지 모르겠다면 그냥 note 라는modifier를 써라(staff이 바꿔준단다). 

Monday, April 11, 2011

submission of genome

음.. 점점 1년 반동안 회사에서 했던 일들을 마무리 해야 겠다는 생각이 든다. 너무 한곳에 오래 있었던 거 같기도 하고 이제는 제자리 걸음을 하는게 아닌가 하는 생각이 든다. 해서 얼마전에 genome assembly를 끝낸 2 개의 균주에 대해 논문을 써볼려고 한다. 

계획하고 있는 논문은 journal of bacteriology의 genome announcements(http://jb.asm.org/misc/about.dtl). 음.. 이런 걸 논문이냐라고 할수 있을 정도의 것. 이 feature의 목적은 다만 genbank에 genome을 올리고 인증하는 정도하라고 할  수 있겠다(이 글이 이 논문의 목적을 가장 잘 설명하는 듯).

일단은 지금 해야 할 일은 두가지. NCBI에 어떻게 bacterial genome을 submit 하는지와 타겟 저널의 report 형식을 보고 writing 하는 것.


<NCBI submission instruction>
우선 NCBI submission instructions 부터 보자. 
Register your Project
일단 genbank에 올리기에 앞서 genome project에 등록을 해야 한다. 이때 locus_tag의 prefix도 정해 줘야 하는데 그 proposal은 다음과 같다. 요약하자면 locus_tag prefix는 3개 이상의 문자와 숫자(symbol은 사용 금지), 첫글자는 반드시 문자, 모든 유전자(structural RNA 포함, repeat region은 제외)는 고유의 locus_tag를 갖으며, 한 유전자의 여러 feature는 같은 locus_tag를 갖는다.
nucleotide sequence는 FASTA format을 따른다.
Annotation
complete genome 일때는 annotation은 필수. gene name(biological name) 은 standard bacterial nomenclature rule (three lower case letters)를 따르고 다른 loci는 대문자 suffix를 붙여 구분한다. 같은 genome project에 있는 genome이라면 동일한 locus_tag prefix를 사용해야 하고 유전자마다는 unique한 locus_tag(systematic identifier)를 사용해야 한다. 
CDS는 protein coding region으로 반드시 product qualifier(protein name)이 필요하며 여차하면 그냥 gene name이랑 같은 걸 써라(단, 첫글자는 대문자). 그리고 protein이 안알려진거면 hypothetical protein이라고 써라. 그래서 나중에 release 되고 검색하면 locus_tag로 대신 나타내게 하기 위해.
CDS의 한 qualifier 중 중요한게 protein id 인데 음.. (이것 좀더 자세히 읽어봐야 겠다)
structural RNA는 tRNA, rRNA만을 의미. 이것 역시 locus_tag 필요(그 위의 proposal에서 보면 RNA던 CDS 던 같은 locus_tag numbering 방식을 사용할것을 권장하나 굳이 locus_tag에 그런 정보를 넣고 싶다면 _t112 식으로 underscore 뒤에 쓸라고 한다).
자세한 내용은 다음을 참조한다.
Create your submission
submission file을 만드는데 Sequin과 tbl2asn 이렇게 두 개의 프로그램이 있다. 정확하게 아직 이 프로그램의 정체를 모르겠으나 여기서 말하기를 두 프로그램의 가장 큰 차이가 2개인데 Sequin은 GUI고 tbl2asn은 command line이라는거, 그렇기 때문에 아직 assembly가 미완이라 contig가 많거나 아니면 chromosome이 많을 경우 tbl2asn을 사용하는게 용이하단다, 아.. 그리고 assembly가 아직 완성되지 않았으면 WGS 에 submit해야 한다. 난 게놈 completion이 된거라 Sequin을 사용해본다. 아래의 것을 봐야 할것(뭐이리 볼게 많다냐.. 에이..).
Sequin Quick Guide


submitting 
FTP를 이용하거나 아니면 Genomes Submission Tool을 사용한다. 자주 submission을 한다면 NCBI에서 FTP account를 만들어 준다고 한다니 Email 보내란다. 
What happens next
일단 submission하면 NCBI 쪽에서 review하고 별문제 없으면 accession number를 보내준다. 그 뒤 다시 annotation에 대한 review가 들어간다.public release는 바로 할수도 있고 publication문제가 있다면 특정 기간 동안 release를 보류할 수 있다고 한다.


요약하자면
1.genome project에 등록하기 (locus_tag prefix 도 등록)
2.Sequin이나 tbl2asn 프로그램을 사용하여 submission file(.sqn) 생성
3.discrepancy ReportGenome submission check tool 로 annotation 파일에 에러가 있는지 체크
4.genomes submission tool을 이용해서 NCBI에 등록.




<Instructions to authors (journal of bacteriology) >
아 요거.. genome announcements가 July에 없어진단다. 시간이 없다.

Tuesday, April 5, 2011

approximate string matching

전에 이야기 했던 당착한 문제점 중 하나. read에서 특정 문자열이 포함된 substring을 찾아서 이를 clipping 하는 일. 사실 바로 전 포스팅, sff 파일 파싱도 그 작업의 일환으로다가 찾아본것. 
그럼 최종적으로 해야 하는 일이 뭐냐. sff 파일에서 MID 별로 분류한 뒤 adaptor 시퀀스를 찾아서 clipping point를 변형해서 MID 별 각각의 sff들을 생성하는것. 
그럼 Roche에서는 이런 프로그램이 없냐? 있단다. 그런데 듣기로 adaptor clipping인가를 5' 쪽만 한다고 했나 뭐래냐. 여튼 필요하단다.

규칙은 간단하다. 
1.MID는 perfect matching으로 찾고 
2.adaptor clipping을 위한 string matching은 n 개의 mismatch (insertion, deletion, mismatch) 를 허용해서 찾는다.

2번 항목을 어떻게 할 것이냐.. 알고리즘에 심하게 취약한 나로서 검색, 이해, 적용을 해보기로 한다.

검색,이해,적용
역시 위키다. 기부금 내길 잘했다. 이런걸 approximate string matching이라고 하는군. edit distance는 몇번 고쳐야 exact match가 되느냐, 고치는 횟수를 의미(여기서 고치기 위한 primitive operation중  swap 이라는 방식은 나에겐 필요 없을 것).
완전 노가다로 찾는 brute-force 방식은 아닌거 같고, 그 다음으로 언급되는 것이 dynamic programming을 이용한 것. 이건 preprocessing이 필요없는 on-line 방식이란다. 그리고 다음에 언급하는 것이 suffix tree. 아.. 역시나.. 진짜 내가 이거 공부하고 만다.

그래서 선택한 것은 bitap algorithm.
요건 levenshtein distance term으로다가 pattern 이 text에 있는지 확인한다. 그러니까 levenshtein distance는 두 string을 줬을때 거리가 얼마인지 그 값(아마도 insertion, deletion, mismatch 갯수를 세는게 아닐까 싶은데) return 하고 ... 아 근데 결정적으로 fuzzy searching의 c 코드를 이해 할수가 없다. 망했다. 


http://en.wikipedia.org/wiki/Levenshtein_distance
이건 그냥 insertion, deletion, substitution까지 고려해서(transposition 까지 포함하고 싶다면 Damerau-Levenshtein distance 참고) 문자열 A와 B의 거리를 판별하는 알고리즘. dynamic programming으로 하는건데 이해는 쉬우나 내 아쉬운 능력으로는 원하는 걸(문자열 A에서 pattern B를 error k 까지 허용했을때 match 되는 substring 모두 찾기) 만들기 위해 변형하기가 힘들다(생각하는 능력이 많이 모자람). 


아 근데 왠걸.. 
http://www-igm.univ-mlv.fr/~lecroq/seqcomp/node3.html
최고다. 요거다. 딱. 한줄기의 빛이 되는 사이트. 아 근데 이거 그냥 Levenshtein distance랑 같다. 다만 text의 -1 index들을 전부 0으로 놔서 시작의 insertion 값을 안줬다는 차이만 있을 뿐. 역시 똑같은 걸 봐도 이해도에 따라 응용도가 달라진다. 다만 이 사이트에서 이해가 안되는건 back trace. 7개의 결과가 나오는데 첫 3개랑 마지막 꺼는 이해가 되는데 가운데 3개는 어떻게 해서 나온건지.. 아.. 이것 참.. 여튼 중요한건 clipping point를 찾는거기 때문에 Levenshtein distance로 나온 matrix의 마지막 행에서 cutoff 보다 작은 최소 값을 찾아서 그 곳을 clipping point로 해주면 될 것같다. 

sff 파일 파싱해보기(?)

바이너리 파일 핸들링 두번째 시간으로(첫번째는 여기) 저번에 어떻게 binary file 핸들링 하는지 대충 감잡았으니까 이번에는 실전으로다가 지금 필요한 일을 하면서 적용해 보려한다.


이번 미션의 목표 : FLX의 sff 파일을 변경하기. 정확하게 이야기 하자면.. sff 라 함은 the Standard Flowgram File의 약자인데 여기에는 GS FLX 기기의 read와 그것의 trace data가 들어 있다. 보통 read를 trim할때 sff 파일을 fastq 파일로다가 전환해서 quality trimming을 하는데, 회사 과장님 말씀으로는 fastq 파일로 newbler로 assembly 한거랑 sff 파일로 assembly 한거랑은 결과가 다르다는데(fastq가 아닌가.. 그냥 fasta 파일로 했을 때 다르다는건가. 음 근데 다르다면 sff 파일에 뭔가 더 들어 있어서 그 정보를 이용한다는 건데.. 음).. 해서 sff 파일의 format을 이해하고 원하는 방향(trimming)으로다가 변형을 하고자 한다.


sff file format 
http://sequence.otago.ac.nz/download/GS_FLX_Software_Manual.pdf page 528부터
여기에 따르면 sff 파일에는 각 homopolymer의 길이에 대한 측정값이 있단다(이건 좀 더 뒷 내용을 봐야 할 것 같다).
일단 sff 파일은 3 section으로 구성
1. common header section : 파일에 한번 나옴, byte size는 31 + number_of_flows_per_read + key_length보다 크거나 같은 가장 가까운 8의 배수. number_of_flows_per_read 가 800이고 flow_char를 보면 TACG가 200번씩 있는걸 보아하니.. 이 flow 라는게 read 그러니까 emulsion PCR이 된 bead를 시퀀싱 할때 TACG 순서대로 각각 200 번씩 nucleotide를 보내줬다는 의미. 
2. read header section : byte size는 16 + name_length 보다 크거나 같은 최소의 8배수, 이 section에서 나타내는 position 숫자는 1-based indexing.
3. read data section : byte size는 2*number_of_flows + 3*number_of_bases 보다 크거나 같은 최소의 8배수, number_of_flows는 common header section에 number_of_bases는 read header section에 있다.


% uint8_t, uint16_t, uint32_t, uint64_t 는 각 각 1,2,4,8 byte numeric value를 뜻함, big endian byteorder, character field는 sinlge-byte ASCII character임, 모든 section은 "eight_byte_padding" 이라는 field로 끝난다(이 필드는 0 to 7 bytes of padding, 이게 뭔소리냐, 각 section의 byte가 8 배수가 되게끔 8배수가 되기에 모자라는 byte 만큼 0 으로 padding이 되어 있다.. 뭐 이런 소리). 나머지는 pdf의 표 참조.


보니까 각 section별로 byte size 만큼 읽어 들여서 필요한 정보만 빼오는데.. 내가 원하는게 read clipping(manual 보니까 trimming이란 용어보다 clipping이란 용어를 사용하는거 같다) 이므로 건드려야 할 부분이  read header section의 clip_qual_left, clip_qual_right, clip_adapter_left, clip_adapter_right 부분이다.

Saturday, April 2, 2011

iphone 개발 수업 4주차-2

4/2
<frame work>
frameworks 는 라이브러리다. 프레임 워크를 사용하려면 이를 프로젝트에 add 해야 한다(라이브라러파일을 같은 폴더에 넣어야 한다).


<UITable View 다시 보기>
UITableViewDataSource; 내용관리, 관련 메소드는 교재 159p
UITableViewDelegate; 이벤트 관리(셀선택, 셀 내용편집 및 삭제), 관련 메소드는 교재 167p


UIApplication 객체가 이벤트를 감시하고 있는데 화면의 셀을 선택하면 UIApplication 객체가 UITableViewDelegate 객체의 didSelectRowAtIndexPath 메소드를 호출한다. 이때 넘겨주는 인자가 NSIndexPath 객체, 이 객체는 속성으로 section(선택된 센션 인덱스)와 row(선택줄의 인덱스)를 가지고 있다.


프로토콜은 자바의 인터페이스와 동일, 속성은 없고 구현을 하지 않은 메소드만 존재, 대표적으로 UItableDelegate와 DataSource.




<ViewController 하나 더 만들기>
navigation based application 을 만들면 하나의 ViewController 만 생기는데 하나의 화면을 더 만들고 싶으면 classes에서 우클릭해서 add , new File, 거기서 UIViewController subclass를 선택(UIViewController 클래스를 상속받는 클래스). 옵션도 선택(iPad용이냐, UITableViewController 를 상속 받을 것이냐, xib 즉 xml 파일을 만들 것이냐).
그리고 UInavigation Bar 에 right 버튼을 생성하거나 back 버튼 대신 다른걸 만들고 싶을 때 Bar Button Item 클래스(버튼 클래스와 비슷한데 다만 단순화 시킨것, 곧 클릭했을때의 이벤트만 메소드로 가지고 있음)를 가져오는데 interface builder에다가 navigation bar 위치에 넣을려면 안되고 xib 에다가 넣는다. 이것들을 UIViewController의 UIBarButtonItem 클래스의 변수에 연결시키고 또 이것이 선택되어졌을 때(이벤트가 발생했을때) 진행되어야 할 메소드를 연결시킨다.


UIViewController 의 initWithNibName 메소드(이때 인자가 xib 파일의 이름과 그 파일의 경로(bundle의 인자, nil이면 현재 경로))를 사용하면 xib 파일과 객체를 연결시켜준다.  




<셀의 UI 바꾸기>
xib 를 하나 생성하는데 user interface 에서 View xib를 선택. 그러면 View 에 관한 interface가 생기는데 이걸 생성하려는게 아니기 때문에 이 View 를 지운다음에 Table View Cell 을 라이브러리에서 xib로 가져온다. 그런다음에 그 UI, 즉 Table View Cell에 넣을 UI 를 라이브러리에서 가져다가 Table View Cell 안에 드레그 한다. 그리고 이것들(Table View Cell 안의 다른 UI들, 즉 UIImage나 UILabel들)의 객체를 리턴 받아야 하는데 이때 사용하는 것이 tag. 그 다음에 이 변형된 table View cell을 갖을 delegate(여기서는 RootViewController)로 가서 cellForRowAtIndexPath메소드를 바꿔준다. NSArray * topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"PhotoTableCell" owner:self options:nil] ; 이렇게 하면 topLevelObjects에는 DOM(Document Object Model) 형식의 객체가 리턴된다. 이 DOM에는 PhotoTableCell.xib의 객체들이 트리 형태로 들어 있게 된다. 이 DOM 객체를 가르키는 topLevelObjects는 index로 DOM 안의 객체(Table View Cell, UIImage, UILabel)로 접근하거나 아니면 앞에서의 tag로 접근 가능하다.


결론은 특정 UI를 바꿀려면 UI 안에 UI를 넣은 xib 파일(그러니까 변형된 UI)을 만들고 NSBundle mainBundle로 가져온다.
---------------------------------------------------------------------------------------------


<메모리 관리>
저장 장치, 그러니까 하드디스크에 저장된 것은 클래스, 이것을 메모리에 올리면 객체가 된다(메모리에 올려야 작동). 메모리에 올리려면 사용하는 메서드가 alloc 제거하려면 사용하는 메서드가 dealloc 이는 둘다 NSObejct클래스가 가지고 있는 메소들이다. 그런데 dealloc은 잘 사용하지 않음(다른 변수가 참조 할때 dealloc 해서 메모리에서 지우면 다른 변수가 참조시 에러가 나기 때문). 그래서 이때 사용하는 것이 NSObject의 retainCount라는 속성. retainCount는 몇개의 포인터에서 이 객체를 참조하는가 하는 카운트 값을 가지고 있다. 초기값, 그러니까 처음 생성되면 1을 갖는다. 이 retainCount 값은 NSArray, NSSet, NSDictionary, UITableView등에 삽입시 1 증가.  또 retain 메소드 호출시 1 증가. 반대로 NSArray등에서 빼거나 release 메소드를 호출하면 1 감소. retainCount가 0이 되면 자동으로 그 객체는 자동으로 삭제된다.


A *a = [[A alloc] init]; 이렇게 하면 반드시 release를 해야 한다.
A *a = [[[A alloc]init] autorelease]; 구현된 메서드 init()이 끝나면 자동으로 [a release]를 호출.


autorelease는 문제점이 하나 있는데 특정 메소드에서 객체를 생성해서 그 객체를 return 할때 autorelease를 하면 객체를 리턴받을때 삭제되어 있는 상태기 때문에 에러가 난다. 그래서 이럴때 autorelease를 사용하면 반드시 retain 메소드를 호출해야 한다. 


즉 상황에 따라 autorelease 를 사용하는 것이 좋을때도 있고 나쁠 때도 있는데 한 메소드 안에서 잠시 사용하는 것은 autorelease를 사용하는 것이 좋다.


autorelease모드인 경우 : 1.객체 생성이 autorelease 명시시, 2. alloc을 안해준 객체 생성, 예를 들어 [NSDictionary initWithArray:array]
-------------------------------------------------------------------------------------------------


<데이터 저장>
1.파일에 저장: NSFileManager사용
2.메모리의 저장 : 어플 종료시 내용 사라짐
3.코어 데이터 : sqlite 사용. 저장, 로드, 검색이 가능. ORM(객체 지향 DB); 직접 query를 이용하는것이 아니라 객체를 통해서 query를 던지다.


NSPersistentStoreCoordinator ; 파일(바이너리)을 읽어서 내용을 꺼내줌, 즉 파일에 있는 정보를  NSPersistentStoreCoordinator에 query를 던지면 관련 entity를 NSManagedObjectContext에 NSManagedObject 객체 형태로 메모리에 올린다. 이때 query를 던지는 클래스는 NSFetchRequest.