2019-12-18

Clipping Planes 뜻

(초록색은 근거리 클리핑 평면을,
빨간색은 원거리 클리핑 평면을 나타내고 있음.)



0. Clipping Planes는 장면의 일부 형상을 제외하고,

장면의 특정 부분만 렌더링하는데에 쓰이는 가상의 평면을 말한다.

출처



1. 카메라 객체에는 근거리 및 원거리 클리핑 평면이 있는데,

근거리 클리핑 평면보다 가깝거나, 원거리 클리핑 평면보다 먼 물체는

렌더링되지 않는다.



2. 검색해보니 '전방 절단면', '후방 절단면'이라고 부르는 것 같다. 출처

영어로는 'near clipping plane', 'far clipping plane'으로 부른다.

2019-12-02

카카오톡 PC 톡게시판 파일 보내기 중 에러

(꼴보기도 싫은 에러 메세지)

0. 카카오톡 PC에서 파일을 보내다가 마주한 에러다.

예상하지 못한 오류가 발생했습니다. 잠시 후 다시 시도해 주세요. (32)



1. 해결법 : 파일을 닫고 다시 보내본다.



2. 원인 : 파일이 열린 채로 보내는 것이 불가능하기 때문.

2019-11-20

인체유래물 세포주 연구에 관한 것

0. 인체유래물인 A549 세포를 이용해 연구를 진행한 경우,

기관생명윤리위원회의 심의를 받아야 할까?



1. 결론부터 말하자면 '면제될 수 있다'고 한다.

아래의 답변을 참조하였다.

(면제다 야호!)

원칙대로라면 인간대상 혹은 인간유래물 연구는 생명윤리위원회에 회부하여

심사를 거쳐 통과된 경우에만 해당 연구를 진행할 수 있다.

생명윤리 심의를 받는 이유는, 동물실험에서 동물 학대가 발생하거나,

자살 혹은 기타 부정적인 영향이 미칠 것으로 생각되는 연구들에 대한

적절한 예방조치를 취하기 위해서라고 한다.



하지만 세포주은행에서 분양받는 세포주로 연구하는 경우에는

이런 윤리적인 문제로부터 해방될 수 있다.

법에서 그 심의를 면제할 수 있는 조항을 정의하고 있기 때문.



인체유래물을 직접 채취하지 않고, 연구재료로서 사용한 경우엔

심의를 면제받을 수 있다.

대학기관에도 윤리위원회가 설치되어 있으니

연구자들은 자신의 소속기관에 문의하면 된다.

2019-11-04

Pycharm의 run tool window 콘솔의 한글이 깨질 때

0. 증상은 다음과 같다.

(한글이 깨지고 있다.)

이미 Ctrl + Alt + S --> File Encodings는 문제없이 UTF-8로 설정된 상태다.



1. 어째서 이런 일이?

도움말(F1 참고)에 따르면 해당 VM box는 Run Tool Window라고 부르는데

이 부분은 IDEA encoding을 사용하고 있다고 한다.

IDEA가 Java application이고, 인코딩을 idea.exe.vmoptions 파일로 설정할 수 있다.

Wikipedia에서도 Pycharm이 Java로 작성된 프로그램이라고 적혀있다.



2. 그래서 Java Virtual Machine (JVM) parameters를 추가시켜줘야 한다.


idea.properties 파일은 IntelliJ 플랫폼의 특정 옵션을 설정할 수 있는 파일이다.


파일 끝에

-Dfile.encoding=UTF-8

를 추가한다.



3. Pycharm restart

실패.



4. 다른 시선으로 접근해보았다.

원래 나의 목적은 os.system() 을 이용했을 때 출력물의 한글이 깨지지 않도록 만드는 것.

고로 Windows 10 CMD 한글 깨짐과 관련이 깊지 않을까 하는 추측이 들었다.

(깨지지 않게 만드는 데엔 성공했다.)

chcp 명령어를 미리 실행시켜 코드페이지를 UTF-8로 만들었다.

한글은 사라졌지만 읽을 수 있는 형태로 바뀌게 되었다!



부분적 문제 해결.

matplotlib.pyplot 히스토그램 외곽선 그리기

0. 아래와 같이 외곽선을 그리고 싶어졌다.

(어케했냐)



1. 외곽선이 그려지지 않았던 원인은

- linewidth가 0으로 설정되어 있었거나

- edgecolor'none'으로 설정되어 있었을 경우이다.



2. 해결방법

plt.hist(gaussian_numbers, edgecolor='black', linewidth=1.2)

를 추가시켜주면 된다.



3. 추가 정보

출처의 댓글에 보면 'edgecolor에 대해선 어떻게 알 수 있었던거죠?

문서에선 그에 대한 언급이 없었는걸요?'라고 궁금해하는 사람이 있다.

그 대댓글로 답변이 달렸다.

내가 주목한 부분은 이 곳이었다.



4. **kwargs

"문서 링크의 마지막 세션을 보시면 'Other Parameters'에 **kwargs가 들어있습니다.

그 링크를 타고 넘어가면 kwargspatch에 관한 문서란걸 알 수 있죠"

(**kwargsPatch 속성이라고 쓰여 있다.)



그래서 Patch 문서에 가보면 edgecolor 아규먼트가 들어있음을 볼 수 있다.



(edgecolor는 기본값이 None으로 되어있다.)

이게 의미하는건 Patch에 적용할 수 있는 키워드는 hist(히스토그램)에도

똑같이 적용될 수 있음을 의미한다. (물론 edgecolor도 마찬가지다.)

Patchmatplotlib.artist.Artist에 기반을 두고 있으며

외곽선, 채움색, 패턴 채움 등을 설정할 수 있다.


2019-10-28

파이썬 멀티프로세싱의 .join() 메서드는 무슨 일을 하는걸까?

0. 멀티 프로세싱을 진행할 필요성이 있어 파이썬 예제 코드를 찾아보았고

multiprocessing을 사용하는 코드들은 대개 아래와 같은 구조를 갖고 있음을 발견했다.

from multiprocessing import Process

procs = []

proc = Process(target=sample_func, args=(number,))
procs.append(proc)
proc.start()
proc.join()

근데 마지막에 .join()은 역할이 뭘까?



1. 일단 제일 먼저 하는건 역시나 문서 검색(한글, 영문)

.join([timeout]) 의 아규먼트인 timeout의 값이 None(기본값)인 경우

메서드는 join() 메서드가 호출된 프로세스가 종료될 때까지 block된다.

timeout 값이 양수(positive number)인 경우 최대 해당 시간 동안 block된다.

프로세스가 종료되거나 메서드가 시간초과된 경우엔 None을 돌려준단 점에 주의하라.

프로세스는 여러번 join될 수 있다.

교착 상태를 유발할 수 있으므로 프로세스는 자기 자신을 join할 수 없다.

프로세스가 시작되기 전에 프로세스에 조인하려고 하면 에러가 발생한다.

뭔소리지 이게.. 조인? 메서드?



2. 그래서 더 찾아보았다. 스택오버플로우에 올라온 글을 번역하였다.



질문자의 글 : 파이썬 멀티프로세싱 모듈의 .join() 메서드는 정확히 무슨 일을 하는거죠?

파이썬의 멀티프로세싱에 대해 공부하던 중 join() 메서드가 무슨 일을 하는지 알고 싶어졌다.

2008년의 튜토리얼에 따르면 "아래처럼 p.join()을 넣어주지 않으면

자식 프로세스는 유휴상태(idle)에 들어가고 종료되지 않아 좀비 프로세스가 되어

손수 kill해줘야만 하게 된다"고 한다.

from multiprocessing import Process

def say_hello(name='world'):
    print("Hello, %s" % name)

p = Process(target=say_hello)
p.start()
p.join()

테스트를 위해 time.sleep 동안에 PID를 출력하게 만들었고

프로세스는 알아서 종료되게끔 만들어보았다:

from multiprocessing import Process
import sys
import time

def say_hello(name='world'):
    print "Hello, %s" % name
    print 'Starting:', p.name, p.pid
    sys.stdout.flush()
    print 'Exiting :', p.name, p.pid
    sys.stdout.flush()
    time.sleep(20)

p = Process(target=say_hello)
p.start()
# no p.join()

그랬더니 20초 이내엔 다음과 같은 출력물이:

936 ttys000    0:00.05 /Library/Frameworks/Python.framework/Versions/2.7/Reso
938 ttys000    0:00.00 /Library/Frameworks/Python.framework/Versions/2.7/Reso
947 ttys001    0:00.13 -bash

20초 후엔 아래와 같이 출력됐다:

947 ttys001    0:00.13 -bash



출력 양상은 p.join()을 코드 맨 마지막에 추가했을 때와 같았다.
(p.join이 있던 없던 프로세스는 잘 종료됐다는 뜻)

Python Mole Of The Week엔 멀티프로세싱에 대해 이해하기 쉽게 설명해준 글이 있다.

"프로세스가 작업을 완료하고 종료될 때까지 기다리려면 join() 메서드를 사용하십시오"

하지만 겉보기엔 최소한 OS X가 어찌됐건간에 처리해주는 것 같이 보였다.

또한 이 메서드의 이름에 대해서도 궁금점이 생겼다.

메서드 이름인 .join()은 무언가를 '연결'시킨다는 것을 의미하는 것인가?

이 메서드로 인해 프로세스를 무언가의 끝에 이어주는 것인가? 아니면

이 이름은 파이썬이 가진 내장함수 .join()의 이름을 공유하는 것 뿐인가?



답변 :

join() 메서드는 threading이나 multiprocessing에서 쓰이는 메서드로,

파이썬의 str.join()과는 아무 상관이 없습니다.

이 메서드는 실제로 두 가지 이상의 무언가를 '연결'시켜주는 개념이라기보단

"이 쓰레드/프로세스가 완료될 때까지 기다린다"는 것을 의미합니다.

join이라는 이름이 붙게 된 이유는 multiprocessing 모듈의 API가 뜻하는게

threading 모듈의 API와 비슷하게 보였기 때문입니다.

threading 모듈에서 join은 해당 모듈의 Thread 객체에 사용되는 메서드명이었습니다.

그래서 join이라는 말은 일반적으로 많은 프로그래밍 언어에서

'스레드가 작업을 완료할 때까지 기다림'을 의미하게 되었습니다.

파이썬도 그저 그 관례를 차용했을 뿐입니다.



자 이제 질문자님이 본대로 join()을 호출한 것과 호출하지 않은 것 사이의

20초 딜레이에 대해 이유를 설명해드리죠.

메인 프로세스가 종료될 준비를 끝마쳤을 때(모든 작업이 끝났을 때)

기본적으로 이 프로세스는 암묵적인 룰을 통해

작동하고 있던 multiprocessing.Process 인스턴스에서

join()을 호출할 준비가 되어있습니다.

이 사실이 multiprocessing 문서에 명확하게 적혀있는 내용인 것은 아니지만

Programming Guidelines 섹션에는 다음과 같이 언급이 되어 있습니다.

"Remember also that non-daemonic processes will be automatically be joined"
(비-데몬성 프로세스들이 자동으로 join될 것이란 점도 기억하십시오)

사용자는 'daemon' 플래그를 통해 이 설정을 변경할 수 있습니다.

p = Process(target=say_hello)
p.daemon = Truep.start()
# Both parent and child will exit here, since the main process has completed.

이렇게 하면 자식 프로세스는 메인 프로세스가 완료되자마자 종료될 것입니다.



3. join은 '프로세스가 완료됨을 기다리다'라는 뜻이었다.

아래의 다른 답변에서 이 단어에 대한 어원을 설명한 글도 있어서 함께 끌어왔다.

<

개념은 이렇습니다, 여러개의 프로세스에 "forks"를 수행하는데

그 프로세스들 중 하나는 마스터이고 다른 것들은 노동자들인 셈이죠.

노동자들이 일을 끝마치면 그들은 마스터에게 합쳐(join)집니다.

>

Fork와 join은 멀티프로세싱에 사용되는 개념으로, 따로 읽어보아도 좋다.


2019-10-23

오토바이를 타고 출근하게 됐을 때 연비 계산

0. 일단 출퇴근 목적지까지 거리는 13.5km.

버스를 타고 다니는게 좋을까, 오토바이를 구하는게 좋을까.

계산해보기로 하였다.



1. 오토바이 기종은 무난하다고 알려진 가성비 깡패, 혼다 SCR 110 알파로 정했다.

신차 가격은 248만원.

중고 매물은 보배드림 사이트를 기준으로 했을 때

(2019-10-22 캡쳐)

이 정도의 가격이 형성되어 있었다.

이걸 보기 편하게 엑셀로 정리해보았다.



2. 엑셀

(대체적으로 1년에 20만원 가량의 하락이 있다.)

특이하게 값이 많이 떨어진 중고 물건의 경우엔 제품에 하자가 있는 경우가 있었다.

이걸로 스쿠터의 가성비는 증명됐다.

1년에 20만원씩 떨어지는 몸값 = 구매 후 n년 경과시 가격이 248 - 20n 만원에

형성되고 있던 것(중고 매물 몇 개만 보고 판단함).

물론 오토바이를 12년이나 타고 다닌다면야 뽕을 뽑고도 남겠지만...



3. 한편 버스를 타는 것은 다음과 같이 계산된다.

버스 1회 탑승비용이 1350원. 왕복 2700원.

주 5일 이용하고, 한 달은 4.3주라는 점을 감안했을 때(365 ÷ 7 ÷ 12)

1년 버스요금만 703,929원이다.



4. 이제 스쿠터의 소요비용을 더해보면

스쿠터는 기름값, 보험료, 각종 정비료 등 보수에 비용이 든다.


기름값부터 보자면

위에서 연평균 3000km정도를 타는 것으로 알 수 있다.

(맨 밑에 비정상적인 주행거리는 계산에 포함하지 않았다.

아마도 영업용으로 움직인게 아닐까 싶다.)

혼다 SRC110알파는 60km/h 정속주행시 56.4km/L의 공식 연비 스펙을 갖고 있다.

실제로는 그보다 덜 나올거라 생각하니 (계산도 용이할겸) 깔끔하게

50km/L로 계산하면 1년에 총 60L의 휘발유를 사용할거고,

현재 전국의 평균 유가는 1538원/L이므로

1년 기름값은 92,280원이다.



다음은 보험료.

출처에 따르면 매우매우 비싸게 레저나 출퇴근을 하고 싶다면

연 100만원에 마음 놓고 스로틀을 당길 수 있다

(하지만 덩달아 당겨지는 나의 수명...)

하지만 오토바이가 자동차를 때려박는다 하더라도 승용차 운전자가 다칠 일은 없으니

대물을 안 든다고 가정하면 대략 보험료 18만원에도 가능해진다.

1년 보험료는 만원 잡았다.

1년에 50만원 냈다.


다음은 유지보수 비용.













2019-10-22

내가 사용하는 PyCharm Live Template

0. 파이참에는 라이브 템플릿(Live Template)이라는 기능이 있다.

잘 활용하면 코딩을 한결 편리하게 할 수 있다보니

즐겨 사용하게 되는 기능 중 하나이다.



1. 기존에 추가되어 있는 템플릿은 아래와 같다.

(이미 추가되어 있는 나의 템플릿)

2. 이 중에서 내가 추가한 것은

open, printer, sur이다.

각각의 Template text는 다음과 같다.

open :
with open('$name$', '$mode$', encoding='utf-8') as $as$:
    $as$.
open 함수를 더 쉽게 이용할 수 있게 해준다.

printer:
print($SELECTION$)
선택된 블록을 print() 함수 안에 넣어준다. (해당 변수를 출력하고 싶을 때 사용함)

sur :
$with$($SELECTION$)
선택된 블록을 어떤 함수로 감쌀지 입력해줄 수 있다. (float()이나 int()로 감쌀 때 사용함)

main :

if __name__ == '__main__':
    $END$
if __name__ == "__main__" 구문을 자동완성해준다.



3. 사용법은 이렇다.

("op"까지 입력한 상태)

open이라는 built-in 함수가 있다보니 내가 추가한 템플릿과 함께 뜨는 것을 볼 수 있다.

여기에서 위의 open을 선택하면 평범한 자동완성이 되지만

맨 아래의 open을 선택하면 다음과 같이 템플릿이 생성된다

()

이 상태에서 입력하면 open 함수의 첫 번째 파라미터($name$)에 값을 입력할 수 있고

Tab키를 누르면 다음 파라미터($mode$)를 입력할 수 있다.

'이미 추가되어있는 나의 템플릿' 사진의 OK 버튼 위에 옵션을 보면

Tab키 대신에 어떤 키로 확장시킬 것인지도 선택할 수 있다.

사용자가 라이브 템플릿을 추가 및 수정할 수 있으니 매우 편리하다.



4. 단축키는 Ctrl + Alt + T 이다.

(커서를 대거나 블록설정한 뒤 단축키를 입력한 모습)

해당 hotkey를 입력하면 'Surround With'이라는 윈도우가 뜨게 된다.

간편하게 숫자 1부터 0까지, 그리고 a 키를 눌러서

기본적으로 탑재되어 있는 라이브 템플릿을 이용해볼 수도 있으며

p, s, q를 눌러서 내가 만든 라이브 템플릿을 사용할 수도 있다.

이제 블록 설정 후 Ctrl + X(잘라내기)는 그만.

스마트하게 라이브 템플릿을 활용해보자.



5. 추가 내용은 홈페이지에서 확인할 수 있다.

2019-10-21

matplotlib.mlab.normpdf --> scipy.stats.norm

0. matplotlib의 버전이 3.1.1이 되어가는 무렵... 해당 패키지를 이용해

histogram을 작성하기 위해 example들을 찾아보던 중이었다.

그러다 발견한 이 부분이 내 발목을 잡았다.

(코드)

위의 코드는 아래의 그래프를 그리는 코드이다.

(Histogram)

문제는 바로 이 부분.

# add a 'best fit' liney = mlab.normpdf(bins, mu, sigma)

뭐지 이게...



1. 구글에서 검색 * n회

일단 matplotlib.mlab은 매트랩(MATLAB)의 명령어와 호환되게끔

(같은 이름으로) 파이썬 함수를 작성해놓은 것들이다.

그래서 매트랩에 익숙한 사람들은 쉽게 사용할 수 있을 것이다.

많은 파이썬 함수들은 numpy와 scipy 라이브러리에서 찾을 수 있고

matplotlib에 남은 것은 스펙트럼 계산을 위한 것들 뿐이다.



그래서 matplotlib.mlab.normpdf같은 것들은 matplotlib 2까지는 있었지만

3에서는 사라진 듯하다.

정확하게는 사라질 예정이고, 아직 기능을 쓸 수는 있는 모양이다.

(대충 조만간 해당 기능이 scipy.stats.norm.pdf로 대체된다는 내용)

그래서 matplotlib 2.1.0까진 살아있었던 것이 흔적으로 남아있다.



2. 해당 함수는 x에 대한 정규 pdf를 리턴합니다.

Return the normal pdf evaluated at x; args provides mu, sigma.

pdf??

()

논문 볼 때마다 보이는 그 PDF?

가 아니라 다른 의미를 찾아보고 싶을 땐 항상 위키피디아를 먼저 뒤져본다.

또한 DeprecatedWarning을 던지던 위의 경고문에서도

scipy.stats.norm.pdf에서 관련 내용을 찾을 수 있으니

어서 달려가 읽어보았다.

matplotlib에서 PDF란 probability density function의 줄임말이다.



3. 그래서 이걸 왜 썼지.

아마도 best fit을 그린다는 의미가 '추세선'을 의미하는게 아니라

해당 랜덤 함수에 의해 생성된 수의 배열이 확률밀도함수와 동일하게 나와야

가장 이상적이기 때문일 것이다.

즉, histogram에서 데이터들의 추세선을 그린 것이 아니란 말씀.

2019-10-16

Pycharm 심볼 의미들

0. 파이참에서 심심하게 볼 수 있는 심볼들, 아래와 같은 것들이다.

(Numpy 패키지 아래엔 무수히 많은 것들이)

대체 옆에 있는 저 f나 v나 c는 무슨 의미인걸까.



1. 홈페이지에서 확인 가능하다. (아카이브 링크)


C는 클래스, m은 메서드, F는 함수, f는 필드

V는 변수, P(보라색)는 속성, P(노란색)는 파라미터 등을 의미한다.











2019-10-07

파이썬 리스트 원하는 크기로 자르기

0. 0부터 99까지 총 100개의 숫자를 3개씩 나눠야 할 필요가 있었다.

즉 리스트(l)에서 n개씩 뭉쳐서 다시 리스트로 만들어야 했다.

아래처럼.

[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14], [15, 16, 17], [18, 19, 20], [21, 22, 23], [24, 25, 26], [27, 28, 29], [30, 31, 32], [33, 34, 35], [36, 37, 38], [39, 40, 41], [42, 43, 44], [45, 46, 47], [48, 49, 50], [51, 52, 53], [54, 55, 56], [57, 58, 59], [60, 61, 62], [63, 64, 65], [66, 67, 68], [69, 70, 71], [72, 73, 74], [75, 76, 77], [78, 79, 80], [81, 82, 83], [84, 85, 86], [87, 88, 89], [90, 91, 92], [93, 94, 95], [96, 97, 98], [99]]



1. 해법은 간단했다.

딱 한 줄이면 끝난다.

[l[i:i + n] for i in range(0, len(l), n)]

어떻게 이런 코드가 나왔는지 살펴본다.

l = [i for i in range(100)]
n = 3
for i in (range(0, len(l), n)):
    print(i)

print([l[i:i + n] for i in range(0, len(l), n)])



2. 해설

[i for i in range(100)]

위의 코드는 리스트를 생성할 때 사용할 수 있는 '표현식(list comprehension)'이다.

원리에 관한 내용은 공개 강의인 코딩 도장에서 확인할 수 있다.

그렇게 0부터 99까지 총 100개의 정수가 담긴 리스트가 l이라는 변수에 바인딩 되어있다.
(실제로는 0부터 차례대로 생성해내는 제너레이터를 쓰지만 여기에선 편의상 이렇게 부르기로)

찬찬히 표현식의 뒷쪽부터 살펴보자.

range(0, len(l), n)

range() 함수를 이용해서 0부터 l의 개수만큼의 리스트를 만드는데

세 번째 아규먼트는 step 수를 나타낸다.

세 번째 값이 생략되어 있으면 0, 1, 2, 3, 4, 5...를 만들겠지만

세 번째 값이 만약에 3이라면, 0, 3, 6, 9, 12, 15...를 만들게 된다.

해당 값에 대한 앞의 표현식은

l[i:i + n]

이다.

즉, 리스트인 l에서 i번째부터 i + n번째 엘리먼트까지 슬라이싱하게 되므로

0:3, 3:6, 6:9, 9:12, 12:15... 와 같은 방식으로 슬라이싱이 이루어진다는 뜻이다.

파이썬은 끝 번호를 넣지 않으므로 [0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]... 처럼

깔끔하게 3개씩 슬라이싱이 가능해진다.

실로 간결하고 아름다운 표현식이 아닐 수 없다.


2019-09-26

히스티딘 델타 엡실론 질소 뜻(Histidine delta and epsilon nitrogen nomenclature)

0. 이게 다 일반화학을 꼼꼼하게 공부하지 않아서 생기는 문제다.



(HIS의 자태. 출처 : 링크)

1. PDB(Protein Data Bank) files 내의 histidine은 실제로 아래 세 가지 모양 중 하나로 표현된다.

HID : 히스티딘의 수소가 delta nitrogen에 붙은 것
HIE : 히스티딘의 수소가 epsilon nitrogen에 붙은 것
HIP : 히스티딘의 수소가 두 nitrogen에 모두 붙어 positive charge를 띠는 것.

pH에 따라 히스티딘의 잔기는 protonated 될 수도, neutralized 될 수도,

혹은 negative charge를 띠게 될 수도 있다.

위의 사진에서도 알 수 있듯이 histidine의 functional group의 pK_R은 6.0이다.

일반적으로 생리식염수가 pH 7.4 정도 된다는 점을 감안하면

HIP는 존재하기 힘들고, 주로 HID나 HIE 중 한 가지 형태로 나타나게 된다.

(Amber와 CHARMM에서 atom type의 이름이 다를 수 있다. 참고하자.
출처 : 링크)



2. 이거 말고도 Amber에선 아래 표와 같이 여러 상황에 따라

residue의 이름을 다르게 명명하고 있다.

Aspartic acid, cysteine, glutamic acid, histidine같은 잔기들은 pH에 따라 다르다보니

MD에서 명시해줄 필요가 있는 것이다.

(출처 : 링크)


3. 이걸 찾게 된 경위는 사실 Amber package에서 뱉어낸 오류 때문이었다.

<
Created a new atom named: HD1 within residue: .R

...

FATAL:  Atom .R.A does not have a type.
Failed to generate parameters
Parameter file was not saved.
>

PDB 파일을 가져와 pdb4amber에서 cleaning을 하던 중 제멋대로 110번 HIS를 HIE로 인식하고

에러를 뱉어낸 모습이다.

원래 알아서 다 해준다는데.. 어쩔 수 없이 수동으로 위치를 조정해주어야 했다.



4. HIE를 시뮬레이션에서 나타내면 이런 모양을 띤다.

(powered by Maestro)

오른쪽 빨간색 동그라미가 산소, carboxylic acid 방향, 즉 C-terminal 방향이고

그 왼쪽의 파란색 동그라미가 질소, 그래서 N-terminal이다.

그 사이에 수소(흰색 동그라미)를 달고 있는 탄소가 alpha carbon,

거기서부터 세어나갈 때 beta(carbon), gamma(carbon), 

우측 delta(nitrogen), 좌측 epsilon(nitrogen)까지 확인할 수 있어서

이 residue는 HID가 아니라 HIE라는걸 볼 수 있다.

+a : 참고로 이 histidine에는 chirality가 없다. 쉽게 생각해도 된다.

(powered by Maestro)

한편 요 히스티딘은 delta nitrogen에 붙어있어 HID인 것을 알 수 있다.



5. 그럼 그 두 개가 다르긴 다른건가? 왜 구분했지?

이는 hydrogen이 어디에 붙었느냐에 따라 파라미터가 달라지기 때문이다.

실제로 저 HID의 파일 구조를 보면 다음과 같다.

<
...
ATOM   1736  OE2 GLU   109     -22.741 -12.827  22.328  1.00  0.00           O  
ATOM   1737  C   GLU   109     -19.755  -9.187  25.344  1.00  0.00           C  
ATOM   1738  O   GLU   109     -20.752  -8.600  24.940  1.00  0.00           O  
ATOM   1739  N   HID   110     -19.151  -8.916  26.506  1.00  0.00           N  
ATOM   1740  H   HID   110     -18.466  -9.533  26.943  1.00  0.00           H  
ATOM   1741  CA  HID   110     -19.425  -7.677  27.276  1.00  0.00           C  
ATOM   1742  HA  HID   110     -19.596  -6.920  26.511  1.00  0.00           H  
ATOM   1743  CB  HID   110     -20.667  -7.821  28.151  1.00  0.00           C  
ATOM   1744  HB2 HID   110     -20.572  -8.725  28.753  1.00  0.00           H  
ATOM   1745  HB3 HID   110     -20.711  -6.980  28.843  1.00  0.00           H  
ATOM   1746  CG  HID   110     -21.960  -7.884  27.376  1.00  0.00           C  
ATOM   1747  ND1 HID   110     -22.596  -9.046  27.117  1.00  0.00           N  
ATOM   1748  HD1 HID   110     -22.279  -9.969  27.414  1.00  0.00           H  
ATOM   1749  CE1 HID   110     -23.714  -8.799  26.406  1.00  0.00           C  
ATOM   1750  HE1 HID   110     -24.422  -9.537  26.060  1.00  0.00           H  
ATOM   1751  NE2 HID   110     -23.792  -7.477  26.204  1.00  0.00           N  
ATOM   1752  CD2 HID   110     -22.719  -6.881  26.781  1.00  0.00           C  
ATOM   1753  HD2 HID   110     -22.495  -5.824  26.779  1.00  0.00           H  
ATOM   1754  C   HID   110     -18.266  -7.182  28.115  1.00  0.00           C  
ATOM   1755  O   HID   110     -18.467  -6.341  29.001  1.00  0.00           O  
ATOM   1756  N   LYS   111     -17.049  -7.657  27.819  1.00  0.00           N  
ATOM   1757  H   LYS   111     -16.871  -8.306  27.052  1.00  0.00           H 
...
>

4번째 열(column)이 HID인 점을 주목하라.

해당 단백질은 HIE도 가지고 있다. 아래처럼 140번째 아미노산이 또한 히스티딘이다.

<
...
ATOM   2236  C   VAL   139     -22.341 -32.938  42.156  1.00  0.00           C  
ATOM   2237  O   VAL   139     -22.630 -33.834  41.395  1.00  0.00           O  
ATOM   2238  N   HIE   140     -22.141 -31.690  41.750  1.00  0.00           N  
ATOM   2239  H   HIE   140     -21.767 -30.955  42.350  1.00  0.00           H  
ATOM   2240  CA  HIE   140     -22.445 -31.249  40.381  1.00  0.00           C  
ATOM   2241  HA  HIE   140     -23.490 -31.511  40.214  1.00  0.00           H  
ATOM   2242  CB  HIE   140     -22.240 -29.752  40.241  1.00  0.00           C  
ATOM   2243  HB2 HIE   140     -22.710 -29.249  41.086  1.00  0.00           H  
ATOM   2244  HB3 HIE   140     -21.173 -29.533  40.294  1.00  0.00           H  
ATOM   2245  CG  HIE   140     -22.795 -29.183  38.960  1.00  0.00           C  
ATOM   2246  ND1 HIE   140     -22.181 -29.339  37.760  1.00  0.00           N  
ATOM   2247  CE1 HIE   140     -22.908 -28.734  36.802  1.00  0.00           C  
ATOM   2248  HE1 HIE   140     -22.668 -28.697  35.750  1.00  0.00           H  
ATOM   2249  NE2 HIE   140     -23.985 -28.185  37.387  1.00  0.00           N  
ATOM   2250  HE2 HIE   140     -24.716 -27.659  36.908  1.00  0.00           H  
ATOM   2251  CD2 HIE   140     -23.944 -28.443  38.718  1.00  0.00           C  
ATOM   2252  HD2 HIE   140     -24.671 -28.131  39.453  1.00  0.00           H  
ATOM   2253  C   HIE   140     -21.630 -31.937  39.346  1.00  0.00           C  
ATOM   2254  O   HIE   140     -22.174 -32.421  38.362  1.00  0.00           O  
ATOM   2255  N   ARG   141     -20.314 -31.938  39.554  1.00  0.00           N  
ATOM   2256  H   ARG   141     -19.895 -31.485  40.366  1.00  0.00           H 
...
>

눈치가 좀 있다면 알아챌 수 있다.

3번째 열의 atom type에 H가 여러 종류로 표현되고 있다는 점을.

자세히 살펴보면 HA, HB, HD 등이 있다. 이는 alpha carbon에 달린 H, beta carbon에 달린 H,

마지막으로 delta carbon에 달린 H 등을 나타내고 있다.

또한 뒤에 붙은 숫자는 (위의 HID 사진을 기준으로 설명하자면)

delta 위치에 붙은 hydrogen은 총 두 개, 하나는 C에, 하나는 N에 붙어있다보니

그 둘을 분리하기 위해 숫자를 붙인 것에 불과하다.



그래서 HID에선 N에 붙을 HE2가 존재할 수 없고

마찬가지로 HIE에선 delta 위치에 붙을 HD1이 존재할 수 없는 것이다.

그래서 까탈스럽고 짜증나는 영리한 Amber가 에러를 뱉었던 것.



이걸로 에러를 해결했다.

2019-09-25

Linux CentOS에서 스마트폰 /data 폴더에 루팅 없이 접근해 목소리톡 데이터를 백업하게 된 경위

-1. 뻘짓을 하게 된 경위를 기록하였다. 결론은 4번 항목으로.



0. 목소리톡 앱에서 내부적으로 저장한 음성 파일들을 백업하고 싶어졌다. 루팅 없이.



1. 찾아보니 adb를 쓰면 된다기에 바로 리눅스 켰다.

$ yum install adb

(2013이 신경쓰이지만 일단 가자..)



2. USB와 폰을 연결시켰다. 근데 윈도우즈처럼 알아서 연결이 성립하지 않는다.

리눅스에서 ADB가 내 장치를 인식하게 만드려면 어떻게 해야 하죠?

이렇게 하면 된다고 한다.

스마트폰 설정에서 'USB 연결 시 디버그 모드를 활성화'시킨다.

$ lsusb

명령어로 장치가 어디에 연결되어있는지 확인한다.

(없는데?)

그래서 본체의 USB 포트를 갈아 끼워보았더니 세상에

폰에서 '이 컴퓨터에서 디버깅을 허용하시겠습니까?'라는 메시지가 뜬다.

아까 꽂았던 USB 포트가 죽어있었다!

모든 소프트웨어적 조작의 기반엔 완벽한 물리적 연결이 가정되어 있단걸

이럴 때 다시금 느끼곤 한다. 모든 것을 의심해야 한다...

내 폰을 연결시켰더니 다음과 같은 디바이스가 목록에 나타나기 시작했다.

(내 폰은 LG G6인데 어째서)

디바이스 아이디를 얻었다. 이제 adb로 돌아오게 되었다.

기본적인 아이디어는 이곳에서 시작했다.

adb shell을 통해 해당 패키지에 접근해 파일을 읽어와서

내 PC의 디렉토리에 저장하는 것이 주요 골자였다.



3. adb shell "run-as com.jkchat.votok ls -l"

실행 결과는 다음과 같았다.

(디버그가 안되네요.)

구글에서 'adb run-as package not debuggable'라고 검색해보았다.

결과 중 이러한 글을 찾을 수 있었다. 아마도 권한의 문제인 것 같다.

그래서 application is not debuggable일 땐 어떻게 할 수 있는지 검색해보니

이 정도가 한계인 것 같았다.


실패.

여기에서 apk까지 백업하는 기능은 흔히 Astro 파일관리자라던가 7zip같은 앱들이

인앱에서 제공하는 기능인 '앱 백업'의 그것이다.



즉, 결론은 아래와 같다.

애초에 app store에서 debuggable로 릴리즈된 앱이 아니라면

해당 방법을 통해 인앱 데이터를 추출해낼 수 없다.



뻘짓했다!!!



4. 그런데 그럴 필요가 없었다.

사용자가 접근 가능한 저장소(storage/emulated/0/Android/data/com.jkchat.votok/files/agreed)

에서 .8gp로 인코딩된 음성 파일들을 찾을 수 있었다.

난 뭘 한거지.

목소리톡을 백업할 땐 해당 경로를 이용하자.

스페셜 땡큐 : https://xr705.tistory.com/76


2019-09-24

Western blot (1)

0. Western blot은 특정 단백질의 유무 또는 양을 알기 위해 수행하는 분석 방법이다.

주로 protein expression, sub-cellular localization (via cell fractionation),

post-translational modifications, protein processing, protein-protein interaction

등을 연구할 때 사용된다.

쉽게 말하면, 특정 유전자가 발현되어 단백질이 생산되었는지 여부와

생산됐다면 얼마나 생산됐는지를 알아보기 위해 정량해보는 실험이다.



1. 이름의 유래는 동서남북 한 과학자의 이름과 장난질에서 유래했다고 한다..

(방향별 쓰임새)

1975년, 영국의 생물학자인 Edwin Southern 이라는 사람이

특정 DNA 서열을 탐지하기 위해 방법을 고안한다.

그래서 그 실험법을 Southern blot이라고 이름지었다.



근데 이름이 이름이었던지라(...) 2년 뒤인 1977년 스탠포드 대학에서

George Stark 외 2명이 RNA 탐지를 위한 방법을 고안해내고

'DNA 다음 RNA니까 이번엔...'이라는 마인드로 이름을 northern blot이라고 짓는다.



그로부터 또 2년 뒤, 1979년,

스와질랜드의 Friedrich Miescher Institute 소속 Neal Burnette가

조직세포 단백질의 분석법을 고안해 western blot이라고 이름 짓는다.



이후에 lipids, phosphates, glycoconjugates, post translational modifications (PTM) 등을

분석하기 위한 용도의 eastern blot까지 등장하면서

분자생물학 실험계의 사방위가 완성된다.



(Antigen-Antibody reaction)

2. 기본 아이디어는 '항원-항체 반응(Antigen-Antibody)'의 결합 특이성이

다른 결합들에 비해 매우 높다는 점에서 착안한다.

Antibody는 특정 antigen의 부위를 특이적으로 인식하고,

그 부위를 epitopes (antigenic determinant)라고 부른다.



3. 단계는 이렇게 구성되어 있다.

Gel electrophoresis : 겔 전기영동. 단백질을 크기별로 분리시키는 젤리.

Transfer : 겔에서 위치별로 분리된 단백질을 필름으로 이동시킴.

Total protein staining : 단백질 염색하기.

Blocking : 항체와 membrane 사이의 상호작용 억제.

Incubation : Membrane에 원하는 항체를 심는 과정.

Detection and visualization : 탐지 및 시각화

Secondary probing : 2차 검증.



4. Gel electrophoresis.

시료의 단백질을 gel electrophoresis를 이용해 분리한다.

Gel electrophoresis (젤 전기영동)은 세포용해물(lysate)처럼 여러 물질이 섞여있을 때

분자량에 따라 분리시키는 방법이다.

(Gel과 전기영동 장치)

겔의 종류로는 agarose, polyacrylamide, starch 등이 있다. 익숙한 것은 가운데의 것..

그래서 PolyAcrylamide Gel Electrophoresis를 PAGE라고 줄여서 쓴다.

보통 5~2000 kDa 정도 범위의 물질들을 분획한다.

Polyacrylamide gel의 조성은 다음과 같다 :

ddH_2O, acrylamide, Tris buffer, SDS, APS, TEMED.

ddH_2O는 double-distilled water로, 흔히 말하는 pure water를 뜻한다. 깨끗하고 비싼 물

(주요 물들의 저항값)

+a : '3차 증류수'라는 말은 없다. 편의를 위해 사용되는 표현법인 것 같은데,

근본적으로 증류수를 사용하는 이유는 '불순물이 섞이지 않은 물'을 사용하고 싶어서이다.

'불순물'은 일반적인 자갈, 모래, 먼지같은 거대입자부터 미생물, 단백질, 이온류까지

광범위한 물질을 일컫고 있다.

이러한 불순물로 인해 물의 전도도(conductivity)가 증가하고, 실험에 오차가 생기게 된다.

흔히 '3차 증류수'라고 말하는 것은 pure water를 지칭하는데,

상온(25°C)에서 18.2 MΩ cm, 혹은 0.055 micro-siemens/cm 정도의 스펙을 갖고 있다.

즉, '불순물이 적어서 전도도가 매우 적은 물'이 초순수 증류수인 것이다.

(영하 12도에서 촬영한 겔의 사진.
위는 겔화 전, 아래는 겔화 후의 모습. 
출처 : 논문)

Acrylamide는 물에 용해시켰을 때 이렇게 카스테라같이 생겼다.

보기와는 다르게 가루일 때와 용액 상태일 때 잠재적인 신경독이 있다고 하니 조심한다.

카카오톡 대화 내역을 파이썬 정규식으로 정리

1. 카카오톡의 대화 내역을 텍스트로 깔끔하게 정리하고 싶어졌다.

그래서 말끔하게 다듬어 보관하려고 파이썬을 이용해보았다.



2. 카카오톡에선 채팅방의 대화 내역을 내보낼 수 있는 기능을 지원한다.

대화 내역을 보관하고자하는 채팅방에 들어가 해당 채팅방의 설정을 열고

'Export Messages(메시지 내보내기)'를 터치한 뒤

원하는 경로를 통해 PC로 txt 파일을 가져왔다.




3. 파일은 대략 이렇게 생겼다.

(내용은 모자이크 처리)

맨 앞엔 월, 그 다음 일, 그 다음 연도, 시간과 AM/PM이 적혀 있다.

이제 정규식을 이용해 위치별로 텍스트를 뽑아온 뒤 date format으로 바꿔주면 되겠다.

잠깐, 그런데 파이썬에선 날짜나 시간을 다루기 위한 모듈이 대략 이 정도 존재한다.

- date : 연, 월 일처럼 그냥 날짜 조작만 할 때 사용한다.
- time : 날짜에 비의존적이게 시간, 분, 초, 밀리초 등을 다를 때 사용한다.
- datetime : date와 time을 섞어놓았다. 연, 월, 일, 시간, 분, 초, 밀리초까지 아우른다.
- timedelta : 날짜 사이에 걸린 시간을 잴 때 사용한다.
- tzinfo - 국제시간을 다룰 때 사용 가능한 클래스들이 모여있다.

잘 사용하면 될 듯 하다.



4. 간혹 메시지 내의 줄바꿈 문자가 있는 경우가 있다.

그런 경우는 위의 사진처럼 'August 22 ...'처럼 시작하지 않고

바로 문자열부터 시작하다보니 정규식에서 제대로 된 메시지를 추출하지 못할 수 있다.

그래서 부정형 전방 탐색을 사용했다.

부정형 전방 탐색은 '특정 문자열이 아닐 때에만 통과한다'는 특징이 있다.

예를 들어서 위의 카톡 대화내역 사진에서처럼, 모든 lines는 'August'로 시작하고 있는데

줄바꿈이 들어간 경우엔 해당 문자열로 시작하지 않을 것이다.

이 점에서 착안하여 다음과 같이 정규식을 작성해보았다.

^(?!(September|August))

+a : 온라인에 정규표현식을 바로 시각화해주는 사이트가 있다. 매우 좋다!

맨 앞의 ^는 '라인의 맨 앞'에 매치되고

괄호를 통해 그룹핑을 해주었으며

?!는 부정형 전방 탐색에서 사용되는 메타 문자이다.

즉 September라는 문자열 혹은 August라는 문자열로 시작하지 않는 위치에만 매치되어

이전 라인에서 메시지 내의 줄바꿈기호 때문에, 메시지부터 시작한 라인을 잡아낼 수 있다.

그 부분을 공백 기호로 치환(re.sub())해주면

깔끔하게 한 줄이 하나의 메시지로 바뀌게 된다.



5. 그렇게 짧게 코딩해서 원하는 결과를 얻는다.

(re.sub()는 포함되어 있지 않다)

8월과 9월 말고도 1~12월 전부 넣어주면 모든 달에 매치시킬 수 있다.

난 날짜나 시간을 정리할 필요가 없었다보니 코드가 매우 짧았다.

이렇게 쉽게 카톡 내용을 전처리할 수 있다.

2019-09-18

in situ 뜻

In situ (/ɪn ˈsɪtjuː, - ˈsaɪtjuː, - ˈsiː-/; often not italicized in English)[1][2][3] is a Latin phrase that translates literally to "on site"[4] or "in position."[5] It can mean "locally", "on site", "on the premises", or "in place" to describe where an event takes place and is used in many different contexts. For example, in fields such as physics, geology, chemistry, or biology, in situ may describe the way a measurement is taken, that is, in the same place the phenomenon is occurring without isolating it from other systems or altering the original conditions of the test.

발췌 - 위키피디아



<번역>

In situ는 라틴어로 'on site(그 자리에서)', 'in position(그 위치에서)' 라는 뜻이다.

영어에서는 이탤릭체로 사용하지 않는게 일반적이다.

이 어구는 'locally(지역적으로)', 'on site(그 자리에서)', 'on the premises(그 구역에서)'

등으로 설명되며, 주요 의미로는 '어떤 사건이 일어난 곳'을 지칭하지만

문맥에 따라 다르게 사용되기도 한다.

예를 들어서 물리학, 지리학, 화학, 생물학 등에서 in situ라는 표현은

어떤 대상을 측정하는 방법에 대한 설명이 필요할 때 사용될 수 있는데

특정 현상이 일어난 곳, 그 원래 환경, 그 원래 시스템에서 분리해내지 않고

해당 장소 내에서 측정하는 행위를 일컫는다.

혹은 원본의 조건을 최대한 유지한 채 실험을 진행시키는 것을 의미한다.


2019-09-06

TeamViewer 14를 설치하던 도중 만나게 된 오류들

1. sudo yum install ./teamviewer_14.5.5819.x86_64.rpm

팀뷰어 홈페이지에서 파일을 다운받아와서 yum으로 설치했다.


그러자 CentOS 7가 내게 내놓은 대답은


Error in file "/usr/share/applications/org.gnome.font-viewer.desktop": "font/ttf" is an invalid MIME type ("font" is an unregistered media type)
Error in file "/usr/share/applications/org.gnome.font-viewer.desktop": "font/otf" is an invalid MIME type ("font" is an unregistered media type)

이게 무슨 뜻인지 알기 위해 검색해보았다.



2. 'font/ttf'랑 'font/otf'라는 MIME 타입이 유효하지 않다는 뜻이다.

MIME 타입은 컨텐츠 타입이라고도 하는데, 해당 데이터가 어떤 타입인지를 알아야

이메일을 받는 입장에서 이 데이터를 해석할 수 있다.

게다가 'font' 자체가 미디어 타입에 등록이 안 되어있다고 한다.

그럼 미디어 타입에 등록되어 있는건 뭐가 있을까?



마이크로소프트 윈도우즈 사용자는 많이 접해봤을 화면이 있다.


만약 .pdf로 된 파일을 열려고 하면 위와 같은 화면을 보게 될지도 모른다.

해당 파일이 가진 데이터 타입을 처리할 수 있는 앱으로 데이터를 열어달라는 소리이다.

마찬가지로 GNOME Desktop에도 비슷한 기능이라고 보면 될 것 같다.

리눅스 데스크탑에서 어떤 파일의 속성을 보면 아래와 같은 창을 만날 수 있다.


이 파일은 image/png라는 MIME type을 가지고 있다.

(Terminal에선 'file' 명령어로 확인 가능하다. 아래는 예시이다.

$ file ./picture.png --mime-type

./Downloads/picture.png: image/png



3. 그래서 어떤 타입들이 있는가?

MIME database는 GNOME에서 사용하기 위해 모든 MIME type들을 저장해놓은 꾸러미이다.

$ vi /usr/share/mime/packages/freedesktop.org.xml

에서 MIME type에 대한 정보들을 확인할 수 있다.



4. 모든 유저를 위해 커스텀 MIME type을 추가하고 싶어요!

이 곳의 12.3.2. Adding a Custom MIME Type for All Users 파트를 따라가도록 하자.



5. 리눅스에는 이러한 데스크톱 파일들을 관리하기 위한 유틸리티가 존재한다.

desktop-file-utils는 다음의 네 가지 프로그램을 포함하고 있다.



desktop-file-edit : is used to modify an existing desktop file entry.

desktop-file-install : is used to install a new desktop file entry. It is also used to rebuild or modify the MIME-types application database.

desktop-file-validate : is used to verify the integrity of a desktop file.

update-desktop-database : is used to update the MIME-types application database.



자신의 desktop-file-utils의 버전을 확인하고 싶다면

$ rpm -qa | grep "desktop-file"

을 입력해서 확인해보자.


이렇게.



6. 그래서 팀뷰어 설치할 때 생기는 에러는 어떻게 없애는데?

삼천포로 빠져버렸다.

이 곳에서 나와 같은 문제로 고민하는 사람들이 남긴 대화 내역이 있다.

$ update-desktop-database

를 해봐도 위의 에러는 여전히 등장했다. 즉 데이터베이스를 업데이트 하려 해도

에러는 동일하게 발생했다는 것.

아마도 desktop-file-utils의 버전이 0.23-1보다 높은 곳에서 패치가 된 듯 한데

우분투, 페도라에 관한 글들은 많았지만 CentOS(RHEL)에 대한 얘기는 없었다.



7. desktop-file-utils 0.24를 찾아냈다. 컴파일해보려 했다.

근데 $ ./configure 부터 애를 먹었다.

(No package 'glib-2.0' found in CentOS 7)

glib-2.0이 없다고 한다.

그래서

$ sudo yum install glib2 glib2-devel

명령어로 설치해보았다.


뭔가 잘 된 것 같다.

그 다음 make


그리고 make install

(root 권한으로 진행해야 한다.)

(에러가 나지 않는다)



8. 그런데 진짜 문제는..

근데도 설치 안 된다.

TeamViewer.. 왜이렇게 설치 실행이 어려울까.