2021년 5월 11일 화요일

6LQ8 싱글 앰프 전원부 제작 3부 - 마무리

처음부터 철저히 계획을 세우고 앰프를 만든 것이 아니라서 통일성도 없고 공간 배치 효율도 나쁘다. 좋은 점이 있다면 비교적 가볍다는 것이 전부이다. 나무판에 앰프 회로와 출력 트랜스를 고정한 원래의 구조를 유지하느라 전원부는 별도의 플라스틱 수납용 바구니에 담아서 아래로 보내는 2층 배열을 택하지 않을 수가 없다. 이 바구니는 '다이소 큐브 바구니(정식 품명은 큐브스텝바스켓 3호; 46004)'라는 이름으로 몇년 전에 팔리던 물건이다. 지금은 구할 수 없다. 요즘 다이소에서 파는 수납용 플라스틱 바구니는 재질이 너무 부드러워서 앰프의 케이스로 쓰기에는 적합하지 않다. 

다음 사진과 같은 상태로 몇달 동안 듣다가, 갑자기 마음이 바뀌어서 싹 다른 모습으로 개작을 할지도 모르는 일이다. 어떤 상황이 되든 투명 아크릴판을 가공하여 만든 상판은 그대로 유지하고 싶다.

이 사진에서 보이는 구멍이 뚫린 흰색 플라스틱 바구니는 지금으로부터 꼭 5년 전에 Sanken power amplifier IC를 이용하여 만든 앰프를 만들 때 썼던 것이다. 관련 글은 여기에 있다. 당시에 정류회로기판(28x28 hole 만능기판, 가로세로 80mm)을 고정하느라 뚫은 4개의 구멍을 그대로 사용할 수 있었다. 그때는 페놀 기판을 썼고 지금은 에폭시 양면기판이니 비용 차이는 상당하다.

부품 고정은 완료하였으나 아직 납땜이 끝나질 않아서 악어 클립이 보인다.

뒷면은 약간 너저분하다. 두꺼운 커넥터는 B전원과 히터 점화용 전원(직류 12V)를 앰프 본체로 공급하는 용도로 쓰인다. 히터 점화용 전원 공급을 위한 직류 어댑터(12V 2A)를 전원 '바구니' 안에 넣을까 말까 고민하다가 밖으로 꺼내기로 하였다. 주전원과 직류 어댑터를 통제하는 전원 스위치도 달지 않았다. 음악이 듣고 싶으면 전원 플러그와 어댑터를 각각 연결해야 하는 매우 원시적인 형태의 앰프이다. 여기에 사용한 12V 어댑터는 2014년 (주)케이벨의 소형 앰프(KB20W)와 함께 구입했던 것이다(당시에 쓴 링크; 어댑터 판매글 링크). 국내 안전 인증을 받지 않은 저가 어댑터가 너무 많이 돌아다니는 것이 안타까운 현실이다.

어댑터를 전원부 바구니에 넣은 다음 하나의 전원 스위치로 on/off를 조절하게 만들 수도 있다. 그러려면 어댑터를 연결할 1구 콘센트를 바구니에 넣든가, 또는 어댑터를 분해해야 한다. 하지만 왠지 그렇게 하기는 싫었다.
티라미수-II 앰프를 만들면서 여분으로 준비했던 재료가 남았다. 이것은 또 어떤 앰프의 통으로 쓰이게 될 것인가?

2021년 5월 10일 월요일

Conda가 SSL 인증서 문제로 말썽을 부릴 때..하루 이틀 겪는 문제가 아니다

나에게 SSL 인증서 문제는 끊이 없는 떡밥이다. 도대체 몇번째 글을 쓰는 것인지 모르겠다. 해결이 된 것도 같다가, 여전히 이해가 가지 않는 상태로 되돌아가다가..

.condarc 파일에서 ssl_verify: false로 하여도 conda 명령이 제대로 작동하지 않는다면 어떻게 해야 될까? 깨끗하게 우분투 최신판을 설치한 서버(설치만 새로 했을 뿐, 서버의 구입 연도는 정말 오래되었음)에서는 별다른 조치를 취하지 않았음에도 conda 명령은 잘 돌아간다. 그런데 왜 CentOS 서버에서만 다음과 같은 에러가 나는 것일까? 약 2년 전에는 문제를 일으키지 않았었다. 현 근무지의 네트워크 보안이 강화된 것과 분명히 관계가 있으리라.

$ conda install -c conda-forge -c bioconda quickmerge
Collecting package metadata (repodata.json): failed

CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/linux-64/repodata.json>
Elapsed: -

An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.

If your current network has https://www.anaconda.com blocked, please file
a support request with your network engineering team.

u'https://repo.anaconda.com/pkgs/main/linux-64'

오늘은 conda 공식 문서에서 안내한 Using non-standard certificates를 따르기로 하였다. 연구소에서 쓰도록 배포되는 SSLPrism.crt 파일을 이 체계에 쑤셔넣으면 될 것이라고 생각했었지만 마음먹은대로 되지는 않았다.

크롬 웹브라우저에서 문제가 되는 웹사이트를 접속한 뒤 주소창 왼쪽의 잠긴 자물쇠를 클릭하여 '인증서(유효)'를 택한다. '인증경로' 탭에서 최상위에 있는 CA를 선택한 뒤 인증서 내보내기를 한다.


그 다음 과정은 conda 공식 문서에 나온대로 하면 된다. openssl 명령을 사용하여 DER로 인코딩하여 파일로 저장한 인증서를 .pem으로 바꾼 뒤 이를 REQUESTS_CA_BUNDLE 환경 변수에 지정하면 된다.

환경변수를 쓰지 않고 인증서의 위치를 .condarc 파일에 지정할 수는 없을까? 여러 사이트의 접속이 전부 문제라면, 인증서 번들을 전부 일정 디렉토리에 복사해 넣은 뒤 .condarc에서 해당 디렉토리를 지정해 버리면 되지 않을까? 

도대체 어디까지를 내가 알고 있고 어디부터를 모르는 것인지를 모르겠다. 이건 진짜 모른다는 뜻이다. 진정한 앎은 아는 것과 모르는 것의 경계를 명확히 아는 상태에 이르렀음을 의미하므로.

2021년 5월 9일 일요일

6LQ8 싱글 앰프 전원부 제작 2부 - 조정 작업

저항을 조정하여 필요한 전압에 가깝도록 조정을 하고, 싱글용 출력 트랜스를 초크 코일 대신으로 쓰는 실험을 마무리하고자 오늘도 다시 인두를 들었다. 최적 조건은 다 잡은 것으로 생각된다.

우선 돌입전류 제한용 저항을 총 30옴이 되도록 만들었다. 5와트 10옴 시멘트 저항을 직렬로 3개 연결하였다. 최종 전압을 낮추려면 이 위치에 저항을 삽입하는 것이 더욱 효율적이다. 합성저항 30옴이 적용된 구간의 전압 강하는 3.4V이므로 전류는 옴의 법칙에 의해 3.4/30 = 0.113, 즉 113mA이다. 40VA 전원트랜스포머가 지나치게 크게 느껴진다. 최근까지 쓰던 전원회로(6LQ8 PP 및 싱글 앰프에 공통으로 쓰던 것)은 220V:220V 전원트랜스를 브리지 정류한 것이었는데, 전압 강하를 위해 트랜스포머 2차 권선 직후에 삽입한 시멘트 저항의 발열이 심하여 방열판을 달아야 할 정도였었다. 이번에는 열이 거의 나지 않는다.

두번째는 OPT의 1차 권선을 이용한 초크 코일 대용 실험을 확정하는 것. 초크 코일의 출력쪽에 100uF 400V 전해 캐패시터를 연결하고 앰프를 켜니 히터에만 불이 들어오고 소리가 나지 않는다. 무슨 일이 벌어진 것일까? 확인을 해보니 초크 코일에 단선이 일어난 것 같다. 무리하게 작동을 하여 권선이 끊어진 것일까? 그 이유는 알 수 없다. 초크 코일이 하나 더 있어서 이것으로 대체하였다.

초크 코일 직전의 전압은 직류 234V, 직후에는 213V가 나왔다. 220옴 저항을 하나 더 달아서 204V가 앰프 회로에 공급되게 하였다. 설계자가 권장한 전압이 207V이니 매우 근접한 수준이다. 최종 전압 강하용 저항 양단의 전압 차이는 9V이므로 9V/220R = 약 41mA의 전류가 흐른다. 과거 기록을 보면 꼭 1년 전에 6LQ8 싱글 앰프를 처음 제작하여 테스트를 하였는데, 전원부와 출력 트랜스가 다르지만 51mA의 전류가 흘러 들어가는 것으로 적어 놓았다(2020년 5월 7일 글 링크).

전원부에 사용한 평활용 전해 캐패시터(250V 47uF)의 내압은 딱 한계점 수준이다. 배전압 정류회로에서는 두 개의 캐패시터가 직렬로 연결된 상태라서 문제가 없지만, 바로 다음의 캐패시터에는 거의 250V에 가까운 전압이 걸리기 때문이다. 초크 코일 다음에 연결한 전해 캐패시터는 내압이 400V라서 안전하다. 캐패시터의 윗면이 부풀어 오르지 않는지 주기적으로 점검할 필요가 있다. 만약 그런 상태가 된다면 부품을 교체하느니 차라리 전원부를 새로 만드는 것이 낫다. 양면형 기판에 납땜된 부품을 떼어내는 것은 매우 어렵기 때문이다. 

초크 코일을 사용하는 일반적인 진공관 앰프용 전원회로에서는 정류단 다음 π-형태의 매우 단순한 필터가 쓰인다. 초크 코일을 쓰지 않는 것을 가정하여 설계된 전원부 PCB라서 필터 단의 수가 많은 것은 어쩔 수가 없다. 그러나 필터 단의 수가 많아야 했던 또 다른 이유는, 되도록 기성품 전원 트랜스를 쓰려다보니 전압 강하의 폭이 넓어서 다단 필터를 쓰지 않을 수가 없다. 

비교적 간단한 자작 활동이었지만 이것저것 공부하고 궁리할 것이 많았던 좋은 기회였다.


6LQ8 싱글 앰프 전원부 제작 - 일단 소리를 내다

양면 에폭시 만능기판에 납땜하기가 이렇게 힘들다니! 용량이 큰 인두를 쓰니 녹은 납이 구멍을 통과하여 반대쪽으로 흘러내린다. 보통의 단면형 기판이라면 구멍을 관통한 리드선이 없는 상태에서 도넛형 패턴 위에 인두를 대고 납을 녹이면 고대 왕릉처럼 완만한 곡면을 이루며 납이 잘 붙는다. 그런데 양면형 기판에서는 관통 구멍(일반적인 기판과는 달리 금속 채널)을 따라 납이 주르륵 흘러버린다. 아마 15W 정도의 저용량 납땜인두를 사용했다면 그러지 않았을지도 모른다. 

7번째 줄 첫번째 열에 솟아오른 납 봉오리를 보라. 기판을 뒤집어 놓고 납땜을 할 때 흘러내린 것이다.

제이앨범에서 범용으로 사용하는 배전압정류회로 기판에서는 초크를 쓰지 않고 다단의 RC 필터를 쓴다. 제이앨범 밴드에서 제공했던 6LQ8 싱글 앰프 키트 제작 가이드27. 전원 PCB 항목에 최신 회로도가 있다. 여기에서 권장한 부품과 내가 이번에 사용한 것은 무엇이 다른지 비교해 보자.

  • 전원 트랜스: 2차 108V 90mA 대신 40VA급 220V:110V 기성품 사용(히터는 12V DC 어댑터로 공급)
  • 돌입전류 제한용 저항은 50옴(5~10W) 대신 10옴 5W 저항 2개를 직렬 연결하여 20옴으로 만들었음
  • 저항: 25옴 1W 대신 50옴(100옴 1/2W 저항 2개를 병렬 연결)
  • Breeder 저항과 여기에 붙어있는 캐패시터는 그렇게 중요한 것이 아니라서 기록하지는 않음

납이 구멍을 관통하여 흘러내려서 애를 먹은 것 말고는 오배선 실수도 없었고, 감전을 당하지도 않았다. Breeder 저항은 평활회로를 다루면서 수도 없이 감전을 당했던 경험이 있어서 이번에는 잊지 않고 적용하였다.

부하를 걸지 않은 상태에서 전압을 재 보았다. 280V 정도가 나온다. 흠, 정류부를 구성하는 내압 250V 전해 캐패시터에는 가혹한 것이 아닐까... 앰프를 연결하고 나도 전압이 원하는 수준으로 떨어지지 않아서 몇 개의 시멘트 저항을 연결했다. 도합 1킬로옴은 되는 듯. 권장되는 B 전압은 그라운드를 기준으로 측정했을 때 207V이다.

소리는 무난하게 잘 나는데 약간의 험이 들린다. 이걸 개선할 수는 없을까? 초크 코일? 원래 제이앨범의 전원 PCB에서는 다단 RC 필터를 사용하여 험을 실용적으로 문제가 없는 수준까지 낮추는 것이 목표였다. 그래도 초크 코일을 연결하면 조금이라도 낫지 않을까? 하지만 일부러 주문을 하고 싶지는 않았다. 혹시 예전에 전원 트랜스를 개조하여 싱글용 출력 트랜스로 만든 것의 1차 권선을 이용하면 초크 코일을 대용할 수 있지 않을까?

정말로 효과가 있었다. 험이 거의 들리지 않는 것이다. 이 트랜스는 220V:0-3-6-9-12V 600mA의 제품이다. 600mA가 2차 정격이라면 1차 권선에는 이보다 권선비만큼 낮은 전류를 흘려야 한다. 그렇다면 초크 코일로 쓰기에는 용량이 너무 적지 않을까? 만약 과전류를 흘리고 있다면 열이 나거나 소리가 나빠질지도 모른다. 그러나 두 시간 정도 음악을 들으며 점검해 보았을 때 특별히 문제가 생기지 않았다. 초크 코일(전원트랜스)를 사이에 둔 전압 강하가 꽤 높은 것으로 보아 직류 저항 성분이 상당히 높은 것 같았다. 거의 470옴 저항 하나를 대체할 수준이었다. 초크 코일을 거친 다음에는 그라운드와의 사이에 전해 캐패시터를 하나 삽입해야 한다는데(전원 임피던스를 낮추기 위해?) 현 상태에서는 청감상 특별한 문제가 느껴지지 않는다. 늘 일정한 전류가 흐르는 A급의 저출력 앰프라서 그럴 것이다. 

전원트랜스의 전류 정격과 초크 코일의 전류 정격이 동등하지는 않을 것이다. 하지만 여기서는 대충 넘어가도록 하자.

5단 RC 필터의 저항은 100옴 저항을 2개씩 병렬로 연결하여 50옴/단으로 조정한 것이다. 따라서 등에 업힌 저항을 하나씩 끊으면 100옴/단으로 저항이 늘어난다. 그렇다면 전원회로기판을 거친 다음에도 전압이 충분히 떨어지지 않아서 시멘트 저항을 덕지덕지 붙일 필요가 없을지도 모른다. 그러나 1/2W의 저항에게는 감당하기 어려운 열이 날 수도 있다. 

저항이 저항을 하나씩 업고 있다. 총 5개의 합성 저항이 쓰였으며 3개는 기판 뒷면에서 직접 연결해 버렸다. 내 실력으로는 기판 윗면에 고정해 놓은 상태에서는 배선을 마무리하기가 너무 어려웠기 때문이다.

그동안의 경험과 제이앨범의 조언을 통해 들은 바에 의하면, 전원을 효과적으로 낮추려면 저항을 전원트랜스 직후에 삽입하는 것이 가장 좋다고 한다. 물론 발열 대책도 마련해야 한다. 이번 시험 제작에서는 합성 저항으로서 20옴을 사용했지만 권장치인 50옴을 사용했다면 전원회로의 말단에 저항을 계속해서 이어 붙이는 일은 없었을지도 모른다. 

자작의 장점은 케이스의 뚜껑을 닫지 않은 상태에서 작동 상태를 계속 관찰하면서 사고(?)가 발생하지 않는지를 관찰할 수 있다는 것이다. 그러고는 늘 만들다 만 것과 다를 바가 없는 상태를 유지하다가 어느날 맘에 들지 않는다 생각하고 완전히 뜯어 고치게 될 수도 있다. 그 흔적은 사진이나 기억, 그리고 블로그에만 남을 뿐이다.

이렇게 하여 2021년 오십 몇 회(?)의 생일 기념 자작을 마친다. 안전을 위해 최소한의 케이스 비슷한 것이라도 만들어 넣으려면 앞으로 일주일 정도는 더 걸릴 것이다.

2021년 5월 8일 토요일

5월 들어 처음 쓰는 글

연구 과제 관련한 서류를 준비하느라 뛰어다녔더니 5월하고도 벌써 8일이나 되도록 블로그에 아직 글을 한 편도 쓰지 못했다는 사실을 깨달았다. 마음의 여유가 없었던 것 같다. 2년이라는 길지 않은 기간 동안 기업체 파견 근무를 나갔다가 돌아와서 이제 한 달이 조금 더 지났다. 해야 할 일을 찾고, 또 나를 필요로 하는 사람들과 만나서 대화를 하는 과정 중에 조금씩 나의 자리로 되돌아 오고 있다는 느낌을 받는다. 기업에서 했던 일은 또 그것대로 새로운 '키워드'가 되어서 내 활동의 외연을 넓혀주고 있음을 기쁘게 생각한다. 나 자신을 소모하고 온 것이 아니라 새로운 보따리를 하나 챙겨서 돌아왔다는 표현이 맞을 것이다.

5월 8일은 나의 생일이기도 하다. 세상 구경을 하도록 낳아 주신 부모님에게 감사를, 그리고 부족한 용돈으로 티라미수 케이크를 사 온 아들 준영이에게도 고마움을!

미세먼지도 극심하고 701명 수준으로 부쩍 증가한 신종코로나바이러스감염증 확진자 수도 염려가 되어서 주말 외출은 자제하기로 하였다. 이럴 때에는 조용히 집에서 납땜이나 하고 있는 것이 좋은데, 납을 녹일 때 나오는 연기가 실내 공기 오염을 유발하는 원인이 되니 자주 환기를 하는 것이 바람직하다. 그런데 창문을 열면 외부의 미세먼지가 심하게 들어올 것이다. 이런..

6LQ8 싱글 앰프의 전원부를 새로 제작하는 것이 이번 주말의 과제이다. 원래는 하나의 전원부를 6LQ8 푸시풀 앰프와 공유하는 형태였으나, 푸시풀 앰프를 다시 만들면서 전원회로를 완전히 포함하는 것으로 바뀌는 바람에 싱글 앰프의 전원을 따로 만들어야 할 상황에 놓였다. 5월 4일 아세아전원에 주문한 전원 트랜스포머가 조금 전에 도착하였다.

참고할 회로도는 제이앨범에서 찾았다(링크). 캐패시터와 저항의 값은 앰프에 따라서 몇 가지 다른 버전으로 존재하는데, 내가 갖고 있는 부품 중에서 적당한 것을 골라서 사용할 생각이다. 오늘 저녁에는 오랜만에 6LQ8 싱글 앰프의 소리를 들을 수 있겠구나!
그림 출처: [제이앨범] 배전압 전원 PCB를 전파정류기로



2021년 4월 30일 금요일

.wgetrc 파일에 CA 인증서 파일 위치를 지정하여 'https://'로 시작하는 URL의 파일 다운로드하기

https://~(443 port)로 시작하는 URL의 파일을 리눅스 명령행(wget 사용)에서 다운로드할 때 에러가 발생하면 '--no-check-certificate' 옵션을 제공하면 된다는 것을 이제는 상식적으로 알고 있다. 하지만 왜 윈도우에서는 문제가 없을까? 집에서 테스트를 하면 왜 잘 될까? 리눅스 환경에서 프로그램이 자체적으로 다운로드를 실시할 때 알아서 진행되게 할 수는 없을까? 

이에 대한 고민을 2018년부터 해 왔고 부분적으로는 해결 방법을 찾았지만 체계적인 지식이 부족하여 늘 애를 먹다가 TORMES pipeline의 업그레이드를 계기로 진지하게 접근해 보기로 하였다.

간단히 설명하면 이러하다. SSL(TLS가 더 정확한 용어일지도 모름)은 서버와 클라이언트 사이에서 패킷을 암호화하여 주고받음으로써 외부에서 이를 가로채도 무슨 의미인지 알 수 없게 만드는 것이 목적이다. 또 다른 목적은 내가 접속하는 웹사이트가 가짜가 아님을 확인해 주는 것이다. 보안 전문가의 견해로는 SSL에 대한 나의 해석이 100% 정확하지 않을 수도 있지만, 일반인 수준에서는 이 정도로 이해하면 된다.

그런데 패킷이 암호화되어서 돌아다니게 되니 기관의 보안 관리 입장에서는 내부의 중요한 정보가 빠져나가도 알 수가 없게 되었다. 그래서 이를 감시하는 SSL 복호화 솔루션을 쓰게 된다. SOMANSA니 SOOSAN INT니 하는 회사가 바로 이런 네트워크 보안 솔루션을 제공하는 곳이다. 이런 보안 솔루션이 적용되는 전산망 내부에서 인터넷을 쓰려면 이들 회사에서 제공하는 CA 인증서를 받아서 웹브라우저에 설치해야 한다. 처음에는 이를 이해하지 못했었다. 왜냐하면 SOMANSA나 SOOSAN INT는 원래 인증서를 발급하는 기관이 아니기 때문이다. 기업에서 2년 동안 근무할 때에는 SOMANSA의 것을, 한 뒤 연구소에 돌아와서 처음으로 인터넷을 연결했더니 SOOSAN INT의 SSLPrisim.crt라는 파일을 웹브라우저에 설치하라고 한다. 이 파일은 일종의 CA(certificate authority 또는 root certificate) 역할을 한다. 웹브라우저의 주소창에 sslcert.cc라는 곳을 치면 자동으로 다운로드할 수 있다. 리눅스의 파이어폭스에서도 똑같은 일을 하면 된다.

만약 모든 인터넷 접속(파일 다운로드 포함) 작업을 웹브라우저에서 한다면 이렇게 하는 것만으로도 문제가 없다. 그런데 리눅스에서는 wget, curl 등을 써서 명령행에서 파일을 가져올 일이 많다. 또한 conda, curl, R, pip 등 자체적으로 https:// 위치에 있는 파일을 가져오는 명령어가 있는데, 웹브라우저(SSLPrism.crt를 이미 알고 있는)는 전혀 경유하지 않으므로 문제가 생긴다.

https:// 위치에 있는 모든 파일을 가져오는데 문제가 생기는 것은 아니다. 테스트를 해 본 결과 자체 인증서를 쓰는 웹사이트만 그러한 것 같다. 예를 들어 보자.

$ wget https://cran.rstudio.com
--2021-04-30 09:28:19--  https://cran.rstudio.com/
cran.rstudio.com (cran.rstudio.com)() 해석하는 중... 52.84.166.5, 52.84.166.79, 52.84.166.102, ...
접속 cran.rstudio.com (cran.rstudio.com)|52.84.166.5|:443... 접속됨.
오류: cran.rstudio.com의 인증서를 확인할 수 없습니다. 발행자는 `CN=ePrism SSL,O=SOOSAN INT,C=KR'입니다:
  자기 자신이 서명한 인증서를 발견했습니다.
cran.rstudio.com에 안전하지 않게 연결하려면 `--no-check-certificate'를 사용하십시오.

OpenSSL 명령어를 사용하여 접속 테스트를 해 보아도 같은 종류의 메시지가 나온다. 

$ echo quit | openssl s_client -showcerts -servername "cran.rstudio.com" -connect cran.rstudion.com:443 > 
test.ca-bundle
depth=1 C = KR, O = SOOSAN INT, CN = ePrism SSL
verify error:num=19:self signed certificate in certificate chain
verify return:1
depth=1 C = KR, O = SOOSAN INT, CN = ePrism SSL
verify return:1
depth=0 CN = cran.rstudio.com
verify return:1
DONE

자체 서명한 인증서를 쓴다는 것이고, 직장 전산망을 보호(?)하는 ePrism SSL VA 장비는 이를 차단하는 것으로 보인다.만약 같은 웹사이트에 대해서 집에서 wget 명령어를 실행하면 어떻게 될까? 아무런 문제가 없이 다운로드가 잘 이루어진다. OpenSSL 명령어에 대한 결과는 이러하다.

$ echo quit | openssl s_client -showcerts -servername "cran.rstudio.com" -connect cran.rstudio.com:443 > test.ca-bundle
depth=1 C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
verify return:1
depth=0 CN = cran.rstudio.com
verify return:1
DONE

접속한 사이트가 자체 인증서를 쓰는지의 여부는 화면상으로 출력되지는 않는다. 파일로 리다이렉트한 CA bundle에는 혹시 그런 내용이 기록되는지는 아직 확인해보지 않았다.

SSLPrism.crt 파일은 자체 인증서를 쓰는 웹사이트임을 알게 된 경우에 사용하는 대체용 CA 인증서일 것이라는 생각이 들었다. 리눅스 혹은 윈도우 웹브라우저에서 이 사이트를 접속한 뒤 주소창 왼쪽의 잠겨진 자물쇠를 클릭하여 인증서 정보를 확인하여 보라. 발급자는 ePrism SSL로 나타난다.


자, 그러면 리눅스 명령행에서 wget 명령어가 SSLPrism.crt 파일을 이용하게 만들면, 매번 '--no-check-certificate'를 쓸 일이 없을 것이다. ~/.wgetrc 파일을 편집하여 사용자가 원하는 설정 사항을 기록하면 된다고 하여 그대로 따라해 보았다.

$ echo 'ca-certificate=~/SSLPrism.crt' > .wgetrc
$ wget https://cran.rstudio.com
--2021-04-30 09:05:11--  https://cran.rstudio.com/
cran.rstudio.com (cran.rstudio.com)() 해석하는 중... 52.84.166.102, 52.84.166.5, 52.84.166.64, ...
접속 cran.rstudio.com (cran.rstudio.com)|52.84.166.102|:443... 접속됨.
HTTP 요청을 전송했습니다. 응답을 기다리는 중입니다... 200 OK
길이: 850 [text/html]
다음 위치에 저장: `index.html'

index.html                          100%[======================================>]     850  --.-KB/s    / 0s       

2021-04-30 09:05:11 (27.9 MB/s) - `index.html' 저장됨 [850/850]

옳거니! SSLPrism.crt 파일을 이렇게 하여 웹브라우저가 아닌 다른 애플리케이션이 쓰도록 만들어 보았다. 이것으로 만족할 수 있는가? 전혀 그렇지 않다. 겨우 wget 명령어에 대해서만 개별적인 CA 인증서를 적용하게 만들었기 때문이다.

명령행을 위한 인증서 설치 방법

시스템 전체에 적용할 수 있는 인증서 설치 방법을 알아보자. 참고한 웹사이트는 다음과 같다. update-ca-certificates 유틸리티를 사용하여 SSLPrism.crt를 설치하는 것이 핵심이다.


작동이 잘 됨을 확인하기 위해 조금 전에 설정한 .wgetrc 파일을 지웠다.

$ rm .wgetrc index.html
$ sudo mkdir /usr/local/share/ca-certificates/kribb
$ sudo cp SSLPrism.crt /usr/local/share/ca-certificates/kribb
$ sudo update-ca-certificates 
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
$  wget https://cran.rstudio.com
--2021-04-30 09:58:14--  https://cran.rstudio.com/
cran.rstudio.com (cran.rstudio.com)() 해석하는 중... 52.84.166.79, 52.84.166.5, 52.84.166.102, ...
접속 cran.rstudio.com (cran.rstudio.com)|52.84.166.79|:443... 접속됨.
HTTP 요청을 전송했습니다. 응답을 기다리는 중입니다... 200 OK
길이: 850 [text/html]
다음 위치에 저장: `index.html'

index.html                            100%[=============================>]     850  --.-KB/s    / 0s       

2021-04-30 09:58:14 (24.7 MB/s) - `index.html' 저장됨 [850/850]

잘 작동한다!  그러나 아직 안심을 하기는 이르다. Conda, git, pip, R(패키지 업데이트) 등의 명령이 잘 돌아가는지 전부 확인을 해 보지는 못했기 때문이다. TORMES v1.2.1를 지우고 새로 설치해 보니 CA 인증서를 업데이트한 것만으로 모든 명령어(443번 포트에서 파일을 다운로드하는)에 전부 대응하는 것은 아니었다. 이에 대해서는 다시 한번 확인을 한 다음 새 글에서 정리하겠다.

TORMES 1.2.1의 재설치 테스트

SSLPrism.crt를 system-wide하게 설치했다고 해서 https:// 위치의 파일을 가져오는 모든 응용프로그램이 다 정상적으로실행될까? TORMES를 재설치하는 과정에서 알아보았다. 역시나 그렇지는 않았다. 최소한 wget은 오류 없이 실행이 된다. 그러나 파일을 다운로드하는 기능이 포함된 파이썬 스크립트 quast-download-silva와 quast-download-busco는 작동을 하지 않아서 wget으로 직접 다운로드한 뒤 target 위치에 복사를 해야 된다. tormes-setup에서 treeio와 ggtree 및 기타 패키지를 받아오려면 명령행에서 CURL_CA_BUNDLE 환경변수를 선언하거나 ~/.Renviron에서 설정을 해야 된다. 이 변수가 가리킬 CA bundle  파일을 만드는 과정은 여기에 설명하였다.

마지막으로,  git가 SSL 인증 과정을 건너뛰도록 'git config --global http.sslVerify false' 명령을 주거나(~/.gitconfig 파일에 기록) 'export GIT_SSL_NO_VERIFY=0'을 실행해야 한다(참조글 링크). TORMES의 설치 과정에서 나오는 오류 - 아직 이해하기 어려운 - 는 다음과 같다. 실제 데이터를 이용한 tormes 실행에서는 특별한 문제가 발생하지 않았다.

# tormes-1.2.1 환경 셋업 과정에서
...
ClobberError: This transaction has incompatible packages due to a shared path.
  packages: bioconda/noarch::abricate-1.0.1-ha8f3691_1, bioconda/noarch::mlst-2.19.0-hdfd78af_1
  path: 'LICENSE'
...

# tormes-setup 스크립트의 마지막 부분인 RDPToos 설치 과정
...
BUILD SUCCESSFUL
Total time: 4 seconds
(cp Framebot/dist/FrameBot.jar Clustering/dist/Clustering.jar SequenceMatch/dist/SequenceMatch.jar classifier/dist/classifier.jar AbundanceStats/dist/AbundanceStats.jar ReadSeq/dist/ReadSeq.jar SeqFilters/dist/SeqFilters.jar ProbeMatch/dist/ProbeMatch.jar KmerFilter/dist/KmerFilter.jar Xander-HMMgs/dist/hmmgs.jar AlignmentTools/dist/AlignmentTools.jar ./; cp -r */dist/lib/* lib/; rm -r classifier/dist/)
cp: 방금 만든 'lib/ReadSeq.jar''AlignmentTools/dist/lib/ReadSeq.jar'로 덮어쓰지 않음
cp: 방금 만든 'lib/commons-cli-1.2.jar''AlignmentTools/dist/lib/commons-cli-1.2.jar'로 덮어쓰지 않음
cp: 방금 만든 'lib/ReadSeq.jar''Clustering/dist/lib/ReadSeq.jar'로 덮어쓰지 않음
...

도대체 update-ca-certificates로 수동 설치한 인증서를 쓰는 응용프로그램은 wget 말고 뭐가 더 있는지 모르겠다!


2021년 4월 28일 수요일

TORMES의 샘플 수가 오락가락한 이유는 metadata file에 들어간 작은 따옴표 때문이었다

TORMES v1.2.1은 어렵게 설치하고 테스트를 하면서 분석에 투입한 샘플이 제대로 다 결과에 반영되지 않는 현상을 기이하게 생각하면서 원인을 찾고자 며칠을 허비하였다. 텍스트로 구성된 샘플 metadata 파일에 문제가 있을 것이라 생각하면서 이러저러한 조합으로 계속 시험을 해 본 결과 원인은 아주 간단한 곳에 있었다. Description을 적는 컬럼에 따옴표가 들어간 것이 문제였던 것이다. 

ABC company's lead strain

신약 개발에서 lead compound라는 용어가 쓰이듯, 프로바이오틱스 혹은 미생물 치료제 개발 분야에서도 lead strain이라는 용어가 쓰이는 것을 알고 있다. 위에 보인 사례에서는 사실 소유격을 표시하는 특수문자이므로 아포스트로피(apostrophe)가 맞지만, 현재는 키보드 엔터키 왼쪽의 작은 따옴표와 혼용되고 있다.

이것을 R로 읽어 들이면서 문제가 되었던 것이다. 만약 분석에 사용할 metadata 파일이 정상인지 알고 싶다면 R에서 다음과 같이 입력해 보라.

> data=read.table("metadata.txt", header = T, sep = "\t", dec = ".", check.names = FALSE)

아무런 에러가 나오지 말아야 한다. 아포스트로피를 살리고 싶다면 다음과 같이 큰따옴표로 둘러싸서 입력하면 된다.

ABC company"'"s lead strain

실제 사례를 보자.

$ cat metadata.txt 
Samples	Read1	Read2	Description
XYZ01	GENOME	genomes/xyz.fasta	GenoGlobe's lead strain
JCM30893	GENOME	genomes/JCM_30893.fasta	JCM 30893 strain (a Japanese isolate)
ATCC_BAA-835T	GENOME	genomes/ATCC_BAA-835T.fasta	ATCC BAA-835T (type strain, aka Muc)
KGMB02009	GENOME	genomes/test.fasta	SAMN18309827 (a South Korean isoalate)
$ R
> data=read.table("meta.txt", header = T, sep = "\t", dec = ".", check.names = FALSE)
경고메시지(들): 
In read.table("metadata.txt", header = T, sep = "\t", dec = ".", check.names = FALSE) :
  'meta.txt'에서 readTableHeader에 의하여 발견된 완성되지 않은 마지막 라인입니다
> data
        Samples  Read1                       Read2
1 ATCC_BAA-835T GENOME genomes/ATCC_BAA-835T.fasta
2     KGMB02009 GENOME          genomes/test.fasta
                             Description
1   ATCC BAA-835T (type strain, aka Muc)
2 SAMN18309827 (a South Korean isoalate)

Metadata 파일에는 분명히 4개의 샘플을 선언하였지만 data 데이터프레임에는 단 2개가 남았다. 파일에 따라서는 '따옴표로 묶인 문자열내에 EOF가 있습니다'라는 약간 다른 형태의 경고메시지가 나오기도 한다. 그러나 '를 "'"로 바꾸면 경고메시지가 나오지 않는다.

균주에 따라서는 MLST 분석 결과가 나오지 않을 수도 있다. Assembled genome sequence를 입력했다면 Assembly statistic 항목을 리포트에 표시할 필요가 없다. 리포트에서 불필요한 섹션을 제거하려면 결과 파일 report_files.tgz의 압축을 해제하여 나오는 tormes_report.Rmd 파일을 적절히 수정한 다음, render_report.sh 스크립트를 돌리면 된다. 이 스크립트 역시 report_files.tgz에 포함되어 있다.

Bactopia: a flexible pipeline for complete analysis of bacterial genomes(mBio 2020)에도 관심을 가지기 시작하였다. 그러나 아직 설치 문제를 해결하지 못했다. https://로 시작하는 URL에 있는 DB 파일을 가져오는 파이썬 스크립트가 말썽을 부린다. 만익 일반 shell script에서 wget 명령으로 파일을 가져오게 하였다면, '--no-check-certificate' 옵션을 달아서 해결하면 되는데, Bactopia에서는 파이썬 스크립트 내에 아예 심어 놓았기 때문이다.  정확히 말하자면 Bactopia 자체는 아니고, 여기에서 같이 다운로드하게 만드는 Sanger Institute의 ARIBA(Antimicrobial Resistance Identification By Assembly)의 레퍼런스 DB 다운로드 및 설치 과정에서 문제를 겪는 것이다.

https, 443번 포트, SSL 인증서... 보안이 적용된 전산망 안에서 일을 하려니 이런 데에서 장애가 생긴다. wget, conda, R 등 서로 다른 계층에서 문제가 발생하고 있으며, 파이썬 스크립트는 또 어떻게 한담? 만약 집에서 똑같은 환경을 구축하면 아무런 문제가 없을 것 같다. 이걸 그대로 복사하여 들고 출근하여 이식을 하면 어떨까?