Showing posts with label computational misc. Show all posts
Showing posts with label computational misc. Show all posts

Wednesday, February 11, 2015

PostgreSQL homebrew로 9.3 에서 9.4 로 upgrade 하기

Mac home-brew update & upgrade를 하면 PostgreSQL 이 버젼업 되는데 아래와 같은 에러가 난다.

LOG:  skipping missing configuration file "/usr/local/var/postgres/postgresql.auto.conf"
FATAL:  database files are incompatible with server
DETAIL:  The data directory was initialized by PostgreSQL version 9.3, which is not compatible with this version 9.4.0.
이때 아래 사이트를 따라하면 해결됨.

http://rcmachado.github.io/postgres/postgis/2014/12/20/upgrading-postgresql-using-homebrew.html

Monday, January 2, 2012

head first design pattern 4

  • state pattern : 스테이트 패턴을 이용하면 객체의 내부 상태가 바뀜에 따라서 객체의 행도응ㄹ 바꿀 수 있다. 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다.
    • 예제 : 뽑기 기계가 있다. 뽑기 기계는 4가지 상태(동전 있음, 동전 없음, 알맹이 판매, 알맹이 매진) 가 있고 각 상태를 전환하기 위한 행동(손잡이 돌림, 동전 반환, 동전 투입, 알맹이 내보냄)이 있다. 이를 코딩하라
    • 단순 답변 : 각 상태를 나타내는 상수를 정적 변수에 저장한다. 그리고 행동을 메소드로 표현해서 if문을 사용해서 상태에 맞는 각 행동을 취한다. 만약에 10번중에 한번은 특별 당첨으로 2개의 뽑기가 나온다는 기능을 확장하려 한다. 이러면 단순 답변의 코드를 전부 뜯어 고쳐야 한다.
    • state pattern : 상태를 나타내는 state 인터페이스를 정의 하고 이를 구현하는 구상 클래스들에서 각 상태에 따른 행동을 정의한다. context는 state를 구성으로 갖고(맴버 변수) 이 상태를 나타내는 맴버 함수에서 state 객체의 메소드를 호출한다.
  • proxy pattern : 어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴
    • 예제 : 클라이언트에서 서버에 특정 작업(메소드)를 호출하여 결과값을 받을때

Wednesday, December 21, 2011

head first design pattern 3

  • adapter pattern & facade pattern
    • adapter pattern : 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다.
      • 객체 어댑터 : client 클래스에서는 target 인터페이스를 구성 맴버 변수로 가지고 있고 target 인터페이스를 구현한 구상 클래스인 adapter 클래스가 adaptee를 맴버 변수로 가지고 있어서(구성:composition) client에서 target 변수로 adaptee 객체를 쓸수 있도록 target의 기능에 맞게 adaptee 기능들 wrapping 한다.
      • 클래스 어댑터 :  객체 어댑터가 adapter가 adaptee를 구성 맴버로 갖으면서 target 인터페이스를 구현한 것에 반해 클래스 어댑터는 adapter가 target과 adaptee를 다중 상속한다.
    • facade pattern : 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공한다. 퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할 수 있다.
      • 최소지식원칙을 지키는데 퍼사드 패턴을 사용할 수 있다.
  • template method pattern : 템플릿 메소드 페턴에서는 메소드에서 알고리즘의 골격을 정의한다. 알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있다. 템플릿 메소드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브클래스에서 특정 단계를 재정의할 수 있다.
    • hook : 추상클래스에서 선언되는 매소드이지만 일반적으로 아무 것도 들어 있지 않다. 서브클래스들은 이 후크를 사용해서 특정 순서에 특정 메소드를 시행할 수 있다. 다르게 말하면 추상클래스에서 hook라는 매소드를 만들고 탬플릿 메소드에서 실행시키면 필요 없는 서브 클래스들은 hook에서 null을 return 하면 되고 특정 메소드를 해야 하는 서브클래스에서는 hook 메소드를 오버라이드해서 사용.
  • iterator pattern & composite pattern
    • iterator pattern : 이터레이터 패턴은 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어 있는 모든 항목에 접근할 수 있게 해주는 방법을 제공한다.
      • 예제 : 두 음식점이 합병됐다. 메뉴판을 합쳐야 하는데 메뉴 클래스는 두 음식점이 통일했다. 하지만 두 음식점이 매뉴들를 담고 있던 컬랙션이 다르기 때문에 웨이트리스라는 객체를 만들었을때 메뉴를 출력하려면 각 컬랙션을 가각 for문을 돌려야 하는 현상이 나타난다.
      • 이터레이터 패턴 : iterator 라는 인터페이스를 만들고 각 음식점의 컬랙션에 맞는 구상 iterator 클래스를 만든다. 각 음식점 클래스에서는 이 자신의 메뉴 컬랙션에 맞는 구상 iterator 클래스를 return 한다. 그러면 웨이트리스 객체는 동일한 메소드를 가지고 두 음식의 메뉴 리스트를 출력 가능하다.
    • composite pattern : 컴포지트 패턴을 이용하면 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있다. 이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체를 똑같은 방법으로 다룰 수 있다.



디자인 원칙 : 
  1. 최소 지식 원칙 : 정말 친한 친구하고만 얘기해라. 아무 객체의 매소드를 호출하는 것이 아니라, 특정 객체(1.객체 자신, 2.메소드에 매개변수로 전달된 객체, 3.그 메소드에서 생성하거나 인스턴스를 만든 객체, 4.그 객체에 속하는 구성요소) 의 메소드만 호출한다.
  2. 헐리우드 원칙 : 먼저 연락하지 마라. 우리가 연락하겠다. 이는 고수준 구성요소에서 저수준 구성요소에 하는 소리. 
  3. 클래스를 바꾸는 이유는 한 가지 뿐이어야 한다.

Saturday, December 17, 2011

head first design pattern 2

  • Factory pattern
    • Factory method pattern : factory method pattern에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만든다. 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것이다.
    • abstract factory pattern : 추상 팩토리 패턴에서는 인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성할 수 있다.
    • factory method pattern은 상송을 통해서 객체를 만들고 abstract factory pattern은 객체 구성(interface의 구현)을 통해서 만든다. 
    • 예제 : PizzaStore을 예로 든다. factory method pattern 은 PizzaStore를 추상클래스로 만들어서 이 클래스의 추상 메소드를 derived class 들이 구현하게 한다. abstract factory pattern에서는 PizzaIngrediantFactory 라는 인터페이스를 만들어서 이를 정의 하는 구상 클래스를 만든다.  이때 PizzaStore의 derived class들은 각기 다른 PizzaIngrediantFactory를 맴버변수로 갖고 있어서 이 PizzaIngrediantFactory를 Pizza 객체를 만들때 인자로 넘겨준다. factory method pattern의 PizzaStore에서는 지역별 Pizza 클래스가 있어서 string(예를 들어 "cheese", "clam") 등을 인자로 넘기는데 반해 abstract factory pattern의 경우 지역별 Pizza 클래스가 있는것이 아니라 종류별 Pizza 클래스(예를 들어 "CheesePizza") 가 있어서 PizzaIngrediantFactory 객체를 인자로 넘긴다.
  • singleton pattern : 싱클턴 패턴은 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴이다.
    • 필요성 : 스레드 풀, 캐시, 대화상자, 사용자 설정, 레지스트리 설정등을 처리하는 객체는 여러개의 객체가 필요하지 않고 오히려 하나의 객체만 있어야 한다.
    • 단순 답변 : 생성자를 private로 하고 생성자를 호출하는 getInstance 라는 static 함수를 만들고 이 함수가 호출 되었을때 private로 되어 있는 생성자를 호출해서 자신의 객체를 만들고 이를 static 맴버 변수에다 넣어서 return 한다.
    • 문제점 : 멀티스레드에서 접근할 때 하나 이상의 객체가 생성될 가능성이 여전히 존재
    • singleton pattern : 1. getInstance 메소드 자체를 synchromized 키워드를 이용해서 동기화 한다. 혹은 2.static 맴버 변수에다가 프로그램이 시작 하자마자 클래스 객체를 생성해서 집어 넣는다. 혹은 3. DCL(double-checking locking)을 사용한다. 
  • command pattern : 커맨드 패턴을 이용하면 요구 사항을 개체로 캡슐화 할 수 있으며, 매개변수를 써서 여러 가지 다른 요구 사항을 집어넣을 수도 있다. 또한 요청 내역을 큐에 저장하거나 로그로 기록할 수도 있으며, 작업취소 기능도 지원 가능하다.
    • 예제 : 특정 리모컨이 있는데 여기에는 10개의 슬롯이 있고 각 슬롯에는 on/off 스위치가 두개씩 있다. 그리고 undo 라는 스위치가 하나 있다. 이 리모컨을 만능 리모콘이 되도록 코딩한다. 그러니까 어떤 슬롯은 형광등의 스위치 버튼이 되고 어떤 슬롯은 자동문의 버튼이 되는 것. 문제는 어떤 슬롯이 어떤 일을 할지 모른다는것. 결국 필요한건 메소드의 캡슐화
    • command pattern : client는 receiver를 command 객체에 넣어서 이 command 객체를 invoker에게 넘기면 invoker는 command 객체를 실행 시킨다. command 는 interface 이고 execute라는 virtual 함수가 있고 이를 구현한 구상 객체들이 존재한다. 실질적으로 이 구상 객체들이 execute 라는 함수를 구현한다. 이 execute 함수 안에 각 command가 구성 객체로 받는 receiver들의 함수들을 호출하는 것이다. 결국 invoker는 command를 받아서 command 객체의 execute 만 실행 할 뿐 어떤 메소들이 실행되는지는 알 수가 없다. 위 예제를 비유하자면 client는 리모컨을 사용하는 사람이 되겠고 invoker가 리모컨, receiver가 리모컨이 컨트롤 하는 각종 기기들의 function을 정의한 클래스가 되겠고, command는 단지 리모컨의 메소드 캡슐화를 위한 실제적인 receiver 핸들 객체가 되겠다.

Thursday, December 15, 2011

head first design pattern 1

head first design pattern에 정의된 내용.
  • strategy pattern : strategy pattern 은 알고리즘군을 정의(인터페이스)하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 이를 이용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.
    • 예제 : 연못의 오리 게임. Duck 이라는 super class를 만들고 이를 상속 받은 여러 종류의 오리 class가 있다. 원래 Duck class에는 없는 기능을 넣을 려면 어떻게 해야 하는가?
    • 단순 답변 : Duck class에 특정 기능의 함수를 넣어준다. 하지만 이는 Duck class를 상속 받은 클래스 모두에게 이 기능이 생기게 된다. 만약 특정 derived class는 이 기능이 변형되어야 한다면?
    • strategy pattern : 위 문제는 함수 오버라이딩으로 가능하기는 하지만.. 이보다는 변형 가능한 것들을 하나의 인터페이스로 만든 다음 이것을 Duck class 의 맴버 변수로 넣는다. 구현은 이 인터페이스를 상속받는 여러 클래스들에서 구현. 
  • observer pattern : observer pattern 에서는 한 객체(subject)의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의한다.
    • 예제 : 기상스테이션 예제로 WeatherStation이라는 클래스가 있고 이 클래스에서는 기상변화를 관찰 한다. 기상 정보는 실시간으로 WeatherData라는 클래스의 객체로 넘어가고 이때 WeatherData 객체는 이 업데이트된 정보를 각각의 Display 객체들에게 통보해야 한다. 
    • observer pattern : Subject 라는 인터페이스를 만들고 그 안에는 Observer 라는 interface를 갖고 있다. WeatherData 클래스는 Subject 인터페이스를 구현하고 있다. Observer 는 여러 Display 클래스들에 의해 구현되어 지고 이 Display 클래스들은 WeatherData 클래스 객체를 맴버 변수고 갖고 있어서 생성자가 호출될 때 WeatherData 객체를 넘겨 받아서 넘겨받은 WeatherData의 add 함수를 호출해서 WeatherData의 observer 맴버 변수 배열에 Display 자기 자신을 등록한다.
  • Decorator pattern : decorator pattern에서는 객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터는 서브클래스를 만드는 것을 통해서 긴능을 유연하게 확장할 수 있는 방법을 제공한다.
    • 예제 : 스타버즈라는 커피숍의 주문 시스템을 만든다. 각 매뉴들을 표현하고 가격을 구현해야 한다. 
    • 단순 답변 : Beverage라는 베이스 클래스를 만들고 새로 생기는 메뉴마다 이 슈퍼 클래스를 상속받는 서브 클래스를 만든다. 아니면 베이스 클래스에다가 서브 클래스에서 쓸 맴버 변수들을 포함시킨다. 이러한 경우 서브 클래스가 엄청 많아진다거나 혹은 서브 클래스가 필요하지도 않은 많은 맴버 변수들을 상속받게 된다.
    • decorator pattern : 문제를 파악해보면 DarkRoast, HouseBlend, Decaf는 기본이 되는 음료가 되고 여기에다가 Mocha나 Whip (휘핑크림) 등은 decorator가 되겠다. 모든 음료의 기본이 되는 베이스 가상 클래스인 Beverage를 정의 하고 각종음료(DarkRoast, HouseBlend, Decaf)는 이를 상속하고 구현하는 구상 클래스가 되겠다. 그리고 decorator들(Mocah, Whip) 역시 Beverage 가상 클래스를 상속하게 한다. 이것의 목적은 Beverage로 부터 행동을 상속 받기 위함이 아니라 decorator의 형식과 각종 음료의 형식을 맞취기 위한 것이다. 확장되는 행동들은 decorator 안에 구현하고 decorator 안에는 또한 Beverage를 구성 요소로 갖는다. 결론적으로 기본음료를 decorator가 감싸고 이 감싼 객체를 또다른 decorator가 감싸는 형식으로 구현하는 것이다. 


디자인 원칙
  1. 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리 시킨다.
  2. 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.
  3. 상속보다는 구성을 활용한다. 
  4. 클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다.

    Tuesday, June 21, 2011

    ubuntu 설치기

    fedora 만쓰다가 이번에 ubuntu를 설치 해보게 됐는데.. 
    중간 중간 막혔던거 나중에 필요할 때 찾기 편하도록 정리 해 보련다.


    일단 ubuntu 받아다가 구워서 깔면 되는데(생각보다 작다. 용량이 고작 600M)..


    1.root 계정 비번 정하는게 첨에 안나온다. 따로 설정해야 하는데 여기를 참조.
    2.그담에 네트워크를 설정해야 하는데 여기를 참조.
    3.아.. 그 전에 vi 편집기가 이상한데 여기를 참조해서 vi 설정을 한다.
    4.마지막으로 ssh를 이용하려는데 openssh-server를 설치해야 한다. 이때 apt-get을 사용하는데 첨에 apt-get openssh-server 하면 에러남.. apt-get update 후 앞의 명령어를 실행해야 한다.


    일단은 여기까지 담에 disc mount 하는거랑 infiniband  설정하는거 추가 하겠음.

    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 부분이다.

    Friday, March 25, 2011

    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 방법이 있는데 요건 이해가 안됨.


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

    Wednesday, December 29, 2010

    language benchmark

    python을 주로 쓰는데 비슷한 작업을 친구가 perl로 짯는데.. 속도가... 너무 차이난다. file IO가 많아서 그런지.. 좌절.. perl도 공부해야 겠다는 생각이 든다. 아래는 언어 performance 비교한거.
    http://www.bioinformatics.org/benchmark/results.html

    그리고 보통 프로그램 시간 체크 하기 위해서 time 명령어를 쓰는데 default로 real, user, sys 모드의 시간이 나온다. 거기에 대한 설명은 아래 링크
    http://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1


    그렇다면 두 프로그램의 퍼포먼스를 비교할려면.. user + sys 로만 비교해야 하는건가... 음..


    -이번에 이런저런 check하면서 알게된 tip
    --어떠한 key값이 사전형 변수에 key로 있는지 없는지 확인하고 대입할경우 예를 들어 
    key = 'good'
    d_some = {#something in here#}
    if key in d_some.keys():
          d_some[key] = "something"
    


    이렇게 하는 것보다
    try:
          d_some[key] = "something"
    except:
          pass
    
    식으로 하는것이 더 빠르다. 특히 d_some의 key가 많을때.


    --그리고 itertools 괜찮은거 같다. 활용해 볼 만하다.
    http://www.builderau.com.au/program/python/soa/Faster-smaller-clearer-Python-iterator-tools/0,2000064084,339280043,00.htm
    위 내용을 간단하게 정리 하자면 zip()을 써서 두 list 합쳐서 거기서 하나씩 iterative하게 뽑나낼려면 우선은 두 리스트를 합치는 과정이 들어가기 때문에 느린데 izip을 쓰면 합치는 과정 없이 그냥 iterative object를 생성한다는 것 같은데..  그렇다면 고스란히 메모리에 올려놓는건가? 두 리스트를? 음.. 


    --python에서 프로세스 시간을 재는 방법
    http://www.tutorialspoint.com/python/time_clock.htm

    Friday, December 24, 2010

    web server

    이것저것 고려해보다가.. 결국 웹 서버를 만드는데 옵션 사항들을 결정했다. 웹서버를 만드는데 들어가는 대부분의 사항들이 내가 약한 부분이라 많은 시간을 들여 공부해야 할것이다. 우선적으로 hanil 서버에다가 web server를 구축 할 것이 아니라 google app engine을 사용하기로 한다. python을 이용하며 google app engine에 django가 포함되어 있으므로 장고 식으로 갈거고 이 참에 jquery까지 공부해 보도록 한다.또한 버젼 관리를 위해 전에 해보지 않았던 svn을 이용하기로 한다. (아.. 근데 문제가 있긴 있구나.. 만약 내가 python에서 특정 모듈을 사용할려면 그게 서버에 깔려 있어야 하는데.. 이런 문제는 어떻게 해결하지.. 음.. biopython모듈을 사용해서 사이트를 만든 것이 있는걸로 보아 기본적으로 외부 모듈을 지원하는거 같은데 조금더 알아봐야 한다.예 :http://biosqlweb.appspot.com/ )


    -결론적으로 봐야할 list
    django, jquery, svn


    초보자로서 큰 틀을 다시 그려보면 hanil 서버에 svn 저장소를 생성하고 내 계정에 권한을 줘서 계속 소스를 갱신해서 웹 프로그래밍을 한다. 웹 프로그래밍의 테스트 및 나중에 google app 에 올리는 것은 google_appengine을 이용한다.


    -setting & study-
    -google app engine SDK 설치
    google_appengine_1.4.0.zip 다운로드 하고 path와 PYTHONPATH에 goolge_appengine 위치를 잡아 놓는다.
    -svn
    http://www.oneone.kr/?document_srl=2030
    -html
    http://deadfire.hihome.com/html/html01.html
    -css 
    http://blog.naver.com/rusdudtn2?Redirect=Log&logNo=140047835464
    -javascript 
    http://deadfire.hihome.com/jscript/jscript01.html (참고 : http://ej5811.blog.me/80094536125 )
    -django
    http://www.wikidocs.net/read/955 (참고 : http://www.wikidocs.net/read/828)

    Friday, December 3, 2010

    send message by google gdata module

    금선생의 buzz에 올라온 perl calendar(http://advent.perl.kr/) 오.. 대단한데.. python도 이런거 하나하고 찾아봤는데 못찾고.. 다만 perl calendar의 12월 2일째에 올라온 구글 calendar로 문자보내기를 검색해본다. 했더니 오.. 이런 신세계가.. http://www.wikidocs.net/read/683 


    gmail로도 문자 보내기가 가능하다.(이건 잘 모르겟다...음..) 
    http://thesteveblog.blogspot.com/2009/02/python-script-to-send-sms-via-gmail.html
    그런데 첨에 내 gmail 계정에는 sms 사용 창이 없어서 setting을 바꾸는데.. 무자게 구글을 뒤졌다. 결국 나와 같은 분을 위해
    http://www.labnol.org/internet/send-sms-text-messages-from-gmail/5156/


    아래도 괜찮다.
    http://www.wikidocs.net/read/668



    확실히 언젠가 시간 잡고 google python api를 봐야 하겠다. 

    Tuesday, November 23, 2010

    MapReduce

    MapReduce 는 분산 컴퓨팅을 지원하기 위한구글에서 개발한 software framework 라고 한다.


    사실 GFF 파일을 파싱하고 있는데 요즘.. biopython에 있는 Bio.GFF 모듈이 없어지고 BCBio 라고 새로히 모듈이 생성되고 있다(아직 biopython에는 완전히 포함되지 않은듯). 그런데 이 모듈 개발자 블로그를 가보니 GFF parsing을 parallel 하게 할 수 있게 해놨다는 블로깅을 보고 거기서 사용한 것이 Disco 라는 것이란다. 그런데 그 Disco는 또 MapReduce를 이용한 것이고...
    아... 뭐래는 거냐 얘네.. 


    그래서! 알아봐야지.. BCBio 모듈을 만든 저자가 했던 말처럼 NGS 덕에 데이터 양 엄청 많아지는데 그냥 one core parsing하면 안되니까.. 사실 내가 하려는 것도 NGS 에서 나온 데이터를 파싱하려는 것이라서.. 해야지 뭐. 


    우선은 링크 
    -GFF module developer blog
    http://bcbio.wordpress.com/2009/03/08/initial-gff-parser-for-biopython/
    http://bcbio.wordpress.com/2009/03/22/mapreduce-implementation-of-gff-parsing-for-biopython/


    -Disco
    http://discoproject.org/


    -MapReduce (intro)
    http://en.wikipedia.org/wiki/MapReduce


    -MapReduce (example of using MapReduce)
    http://www.michael-noll.com/wiki/Writing_An_Hadoop_MapReduce_Program_In_Python
    http://atbrox.com/2010/02/08/parallel-machine-learning-for-hadoopmapreduce-a-python-example/

    Thursday, November 18, 2010

    phylogeny tree

    영건씨와의 프로젝트에서 내가 맡은 부분인 distance matrix에서 phylogeny tree를 그리는 것을 수행하기 위해.. 일주일 정도 나름 고생했다.. 아.. 

    나름 고생해서 얻은 것들은 대충 적는다.

    phylogeny tree를 그리는 방법에는 UPGMA (biological sequence analysis(BSA) 책에 보면 이름만 거창하다는 식으로 intro를 시작한다), neighbor joining, parsimony 가 있는데 이번에 선택한 방법은 neighbor joining (NJ). 왜냐고 물어보면... 음.. FFP를 사용한 reference가 되는 sims의 논문이 FFP를 구하고 나서 이를 NJ 방법으로 tree를 그렸기 때문에?(좀 구차한거 같은 느낌이.. 사실 위의 방법들의 장단을 봐야 하는데).. 

    NJ 방법이 알고보니 unrooted tree를 그리는 것이다 (아.. 것도 모르고 마지막 두개 남은 node에서 error가 나는걸보고 알고리즘이 이상하다고 느꼇음). BSA 책에 보면 rooted로 만드는 2가지 방법을 소개하는데, 하나는 완전 outgroup인 것을 넣어서 그걸 root로 삼으라는 것과 연결선의 가장 긴 chain의 midpoint를 root로 하라는 것인데.. outgroup을 억지로 넣어주면 edge의 값이 조금씩 변하는게 맘에 들지 않고 해서 그냥.. 나름 unroot인데 root인 마냥 나오게끔..

    그리고 결과 파일을 newick format으로 만드는 작업은 추가 해야 겠다. 다른 프로그램 (phylip 같은) 것에서도 사용할수 있게. 

    아래는 이번 작업하면서 무자비하게 search 한것 모음

    ---------------------------------------------------------



    정리해 보자면 현재 나에게 떨어진 해당 과제가.. FFP를 이용한 시퀀스 사이의 similarity matrix가 있을때 이를 phylogeny tree로 그려야 하는것.
    이는 clustalw가 모든 pairwise 시퀀스를 다이나믹 프로그래밍으로 alignment 해서 similarity를 구한다는 것 이외에는 그 뒤 과정이 내가 해야 하는 것과 동일하므로. clustalw를 참조하기로 한다.
    우선 clustalw가 neighbor joining 방식으로 similarity 트리를 그리므로 neighbor joining 한번 점검하고... 역시 clustalw 처럼 dnd 형식을 최종 output으로 만들고 싶기 때문에 neighbor joining 이후에 dnd 파일 만들기를 check 해야 할것이다.

    기본적으로 multiple sequence alignment와 phylogeny tree 그리기가 무엇이지를 알기위해서는 http://www.cbs.dtu.dk/courses/humanbio/2010/exercises/ExMulPhyl/Ex_Phylo.php에 나오는 HIV의 phylogeny tree 그리기 예제를 살펴 봐야 전체적인 그림이 나올것 같고..

    그런데 dnd 파일이 꼭 phylogeny tree를 나타내는 것이 아니라는 내용이 http://www.ebi.ac.uk/Tools/clustalw2/faq.html에 guide tree와 phylogeny tree의 차이가 무엇이냐라는 것에 있고.. 좀 헷갈리는데.. 알아봐야 할거 같네.. 그냥 clustalw2를 돌려서 나오는 dnd가 guide tree인지 아니면 phylogeny tree인지(아무래도 이건 최종으로 나오는 거라 phylogeny tree 인거 같지만)


    음 보아하니.. 순수하게 pairwise alignment 한거가지고 나온건 guide tree인것이고 이거로 multiple alignment 해서 나온 결과로 그린것이 phylogeny tree인 것인데.. 기본적으로 clustalw의 manual을 훑어볼필요가 있는듯

    -HMMER3는 multiple alignment file format을 clustalw2에서 나온 aln을 인식하지 못한다. 그래서 biopython의 AlignIO.convert 를 이용해서 HMMER3가 인식할수 있는 stockholm 파일로 변환해서 사용한다(AlignIO.convert('temp.aln','clustal','temp.sto','stockholm')).

    -clustalw2는 phylip의 file format으로 output file 생성 가능

    clustalw의 과정
    step1 : 가능한 모든 pair의 시퀀스를 align 하고 distance(mismatch position/non-gapped position)를 정한다. 그 다음 distance matrix를 만든다.
    step2 : neighbor joining method를 이용해서 similarity tree를 그린다.
    step3 : 위의 similarity tree를 참조해서 가까운 시퀀스부터 하나씩 combine 해서 multiple alignment 를 하는데.. 위의 similarity tree의 root 로부터의 거리를 weight를 갖게 된다. 그러니 같은 banch 안에 들어가는 시퀀스는 그 weight를 나눠 갖게 된다.

    -check list

    1.neighbor joining method

    2. dnd file format (newick)

    Thursday, November 11, 2010

    md5 checksum

    이번에 hanil 서버에 blast+를 설치 하고 nr과 nt만 ncbi (ftp://ftp.ncbi.nih.gov/blast/db/)에서 다운 받는데.. md5란 사이즈가 작은 파일이 있는것을 확인했다. 이것이 뭘까.. 아마도 사이즈가 작은걸로 보아 원본 파일에 대한 정보가 들어 있는걸일 거란 추측을 해본다. 그런데 웹에서 대충 뒤져보니... 파일 다운받고 나서 이게 제대로 된 파일인가를 검사할 수 있는 clue가 되는 파일이라는 것. 음 괜찮네.. 사실ftp나 update_blastdb.pl로 다운 받는데 끊기고 잘 안되서 for문으로 wget 써서 다운 받았는데 이게 온전한 것인지 확인할 필요가 있었는데.. 음 아래 링크가 가장 보기 편했다.


    http://blog.naver.com/redfreek2c?Redirect=Log&logNo=120108091920


    뭐 이런것도 가능하다 :
    http://mcchae.egloos.com/9759236




    위의 것을 정리하자면
    $md5sum nr.00.tar.gz         #라고 명령어를 치면
    b67116260f2d4962bd84b5b9ccafba89  nr.00.tar.gz    #다음과 같이 나오는데 이는 nr.00.tar.gz.md5의 내용과 동일
    그러므로 그냥
    $md5sum -c nr.00.tar.gz.md5    #라고 하면 알아서 md5와 원본파일의 md5sum과 비교해서
    nr.00.tar.gz: OK     #다음과 같이 나오게 된다.


    두번째 링크는 여러개의 파일의 md5sum을 해놓은 md5 파일을 만들어 놓고 확인하는 방법.이를 이용해서 update된 파일을 확인 가능하게 된다. 음 신기하네.




    MD5의 설명:
    http://ko.wikipedia.org/wiki/MD5

    Thursday, November 4, 2010

    클러스터 관련...

    요즘 회사에서 서버구축에 신경을 많이쓴다. human genome같은 경우에 assemble할려면 200기가 이상의 램이 필요하고... 뭐시기 뭐시기.. 하드웨어적인 감이 전혀 없는 별나라 이야기 같아서.. 이래선 안된다란 생각에 조금씩이라도 읽고 긁어보아보자라는 생각에 관련 링크 및 정보 정리를 한다.


    우선은 클러스터 제작과정의 블로그 : 
    http://blog.neosgen.net/84


    위 사이트에서 나오는 노드 컴퓨터에 하드 디스크 없이 사용하는 네트워크 방법 NFS : 
    http://hanyjuny.blog.me/40106543467

    NFS이 간략한 정의 : 
    리눅스를 비롯한 유닉스 운영체제 등 동일한 운영체제 상호 간에 파일을 공유하고자 할때 사용되는 서비스이다. NFS는 서버에 의해서 파일 시스템이 마운트되는 것이 아니라, 클라이언트에 의해서 서버의 파일 시스템이 마운트되어 클라이언트가 서버의 파일 시스템을 자신의 파일 시스템처럼 사용하는 것이 특징이다.


    ==> 쉽게 말하면 NFS(network file system)서버가 NFS 서비스에 필요한 패키지를 깔고 관련된 데몬을 띄운다음 /etc/exports 파일에다가 클라이언트에게 공유할 디렉토리명과 클라이언트 주소 그리고 관련 옵션을 적어주면 exports 파일에 적힌 내용대로 클라이언트들이 서버의 자원을 자신의 파일 시스템인 것 마냥 쓸 수 있게 해주는 것.