2021년 11월 8일 월요일

도커(Docker) 컨테이너를 다른 컴퓨터로 옮겨서 실행하기

직장 전상망 내에서 Bactopia를 사용하면서 가장 불편한 것은 일부 general dataset이 SSL 인증서 문제로 다운로드가 불가하다는 것이다. 소위 SSL 가시성 확보를 위해 설치한 웹프록시 장비에서 발급한 인증서를 인정하지 못하는 상황이 벌어지기 때문이다. 장비 제조업체에서 제공하는 인증서를 웹 브라우저 등 일부 애플리케이션에 설치하여 대부분의 업무는 해결이 가능하지만, 프로그램에 따라서는 매우 까다로운 설정을 요구하는 것이 있다. 우분투나 CentOS 각각에 맞추어 system-wide하게 인증서를 설치하는 방법을 따라서 진행을 해도, 파이썬 코드 안에서 직접 파일을 다운로드하도록 짜 놓은 애플리케이션에서는 한계에 부딪히고 만다. 함수를 직접 건드려서 이 문제를 해결하는 방안이 인터넷에 종종 보이지만, 나는 파이썬을 잘 하지도 못하고 더군다나 고칠 곳이 여러 군데라면 여간 성가신 일이 아니다!

그래서 집에 리눅스 서버를 하나 더 설치해 둔 뒤 여기에서 필요한 파일을 받은 다음 이를 다시 직장에 가져와서 덮어 씌우는 번거로운 노력을 들여야만 했다. 이런 편법을 이용하여 Bactopia를 사용해 왔었다. 

만일 도커(Docker)를 이용하여 Bactopia를 사용한다면, 집 서버에서 이를 어떤 형태로든 export하여 직장 컴퓨터로 가져온 뒤 실행하면 되지 않을까? 생각이 여기까지 미쳐서 이를 실제로 테스트해 보기로 하였다. 

도커를 사용한다면 집에 있는 서버가 실제 직장 서버와 같은 리눅스 배포판을 쓸 이유도 없다. 노트북 컴퓨터를 들고 다니면서 도커 환경을 구축한 뒤 파일 형태로 가져올 수만 있으면 된다. 자, 그러면 시작해 보자. 우분투에 최신 도커 엔진을 설치하는 방법은 공식 문서에 잘 나오니 라를 따라하면 된다.


노트북 컴퓨터(집)에서

$ sudo docker pull bactopia/bactopia 
$ mkdir bactopia
$ cd bactopi
$ sudo docker run --rm -it --workdir /bactopia --volume $(pwd):/bactopia:rw bactopia/bactopia:latest bactopia datasets

도커 컨테이너가 생성·실행되면서 general dataset이 현재 디렉토리에 설치되고, 도커는 곧 종료된다. 현 디렉토리(bactopia) 하위에 만들어진 datasets(2021년 11월 7일 기준으로 1.1 GB)를 그대로 가져다가 직장 컴퓨터에 만들어진 Bactiopia 환경에 그대로 복사를 해도 된다. 실제로 지금까지 해 온 방식과 같다. 단지 도커를 사용하지 않았을 뿐이다.

그러나 이렇게 다운로드한 데이터셋을 한 덩어리의 파일로 전환한다면 다른 곳에 이전하기도 쉽고 교육 등의 목적에 활용하기에도 편리할 것이다. 그러기 위해서는 일단은 도커 컨테이너 형태로 실행 중이어야 하고 파일의 위치도 살짝 바꾸어야 한다. /bactopia 안에 설치된 datasets 디렉토리와 하위 구조들이 컨테이너의 export 결과물에 포함될 것 같지만 내가 테스트해 본 바로는 그렇지 않았다. 현재 상태에서 컨테이너를 다시 기동한 뒤 /bactopia 하위의 자료를 컨테이너 내부의 다른 곳으로 복사해 두어야만 했다. 혹시 내가 잘못 알고 있는 것은 아닌지 모르겠다.

다음과 같이 현재의 작업 위치에서 다시 도커 컨테이너를 생성하되, 편의상 test라는 이름을 붙인다('--name test'). 그리고 /bactopia/datasets을 /datasets으로 복사한다.

$ sudo docker run --rm -it -w /bactopia -v $(pwd):/bactopia:rw --name test bactopia/bactopia:latest
(base) root@6016f6628419:/bactopia# cd ..
(base) root@6016f6628419:/# cp -r bactopia/datasets/ .

이 상태에서 터미널 창을 하나 더 열고 'docker export' 명령을 이용하여 실행 중인 컨테이너를 파일로 저장한다. 

$ sudo docker export test > save.tar

한 덩어리의 파일로 전환하였으므로 어디로든 복사하여 가져갈 수 있다.


실제 작업을 할 서버 컴퓨터(직장)에서

save.tar 파일 다른 컴퓨터로 복사했다 하여도 이를 직접 로드할 수는 없다. 이를 도커 이미지 저장 창고에 밀어 넣은 뒤에 실제로 사용이 가능하다. 이때 사용하는 명령어는 'docker import'이다. 

$ sudo docker import save.tar test
sha256:54f65ae7f5b380804d5b5ffa220774fd5a6c4da90eba1ee47e8554cc498b71e9
$ sudo docker image ls
REPOSITORY                       TAG                    IMAGE ID            CREATED              SIZE
test                             latest                 54f65ae7f5b3        About a minute ago   2.97 GB
hyjeong/ununtu                   v3                     731d875559ed        2 days ago           72.8 MB
hyjeong/ubuntu                   revised                cf60cacf2511        2 days ago           72.8 MB
docker.io/ubuntu                 latest                 ba6acccedd29        3 weeks ago          72.8 MB
docker.io/hello-world            latest                 feb5d9fea6a5        6 weeks ago          13.3 kB
docker.io/centos                 latest                 5d0da3dc9764        7 weeks ago          231 MB
docker.io/ncbi/pgap              2021-07-01.build5508   d84e714fc606        4 months ago         8.43 GB
docker.io/bactopia/bactopia      latest                 20dfd67122b5        5 months ago         1.82 GB
docker.io/antismash/standalone   latest                 c535168192d3        5 months ago         10 GB

특별히 tag를 지정하지 않았다면 'latest'가 붙을 것이다. 이제 컨테이너를 기동해 보자. 간단히 확인만 하기 위하여 복잡한 옵션은 하나도 붙이지 않았다. 단, 이번에는 맨 마지막에 엔트리포인트('bash')를 지정해 주어야 한다.

$ sudo docker run --rm -it test:latest
/usr/bin/docker-current: Error response from daemon: No command specified.
See '/usr/bin/docker-current run --help'.
$ sudo docker run --rm -it test:latest bash
(base) root@451b3e3692f2:/# ls datasets/
antimicrobial-resistance  ariba  minmer  species-specific  summary.json
(base) root@451b3e3692f2:/# ls -l datasets/
total 4
drwxr-xr-x 2 root root   63 Nov  7 23:59 antimicrobial-resistance
drwxr-xr-x 2 root root  102 Nov  7 23:59 ariba
drwxr-xr-x 2 root root  141 Nov  7 23:59 minmer
drwxr-xr-x 3 root root   29 Nov  7 23:59 species-specific
-rw-r--r-- 1 root root 2021 Nov  7 23:59 summary.json
(base) root@451b3e3692f2:/# du -sh datasets/
1.1G	datasets/서

서버 컴퓨터에서 실제로 Bactopia 분석 작업을 하려면 디렉토리 구성을 어떻게 하는 것이 바람직한지는 약간 머리를 써야 되겠다.

이 과정을 익히기 위하여 다음 웹문서를 주로 참조하였다.

[~/xo.dev] 실행 중인 Docker 컨테이너를 파일로 저장하고 다시 불러오기


삽질 후기

도커 콘테이너 안에서 외부 자료를 가져오려다가 또 SSL 인증서 문제로 막혔다. 어휴... 도커 이미지를 고치느니 적당히 쓰고 말겠다. 물론 도커 잘못은 아니지만.

2021년 11월 3일 수요일

AMD Ryzen 5950X 우분투 데스크탑에 LVM2로 SATA HDD 2개 올리기

1TB SSD로 근근이 버텨왔지만 늘어나는 데이터를 더 이상 감당하기 어려워서 SATA HDD를 추가로 장착하기로 하였다. 재고로 갖고 있던 6TB HDD는 지난달 NAS에 교체용으로 사용하고 말았다(당시 작성한 글 링크). 하드 디스크가 수북하게 쌓여있는 장을 열어 보았다. 바로 그 NAS를 처음 구입하여 사용할 때 장착되어 있던 5개의 HDD를 업그레이드하면서 떼어 놓은 상태로 보관되어 있었다. 용량은 4TB. 이것 두 개면 당장은 부족함이 없으리라.

그런데 이 데스크탑 케이스는 SATA HDD를 도대체 어디에 넣어야 하나? 드라이버를 들고 씨름을 하다가 겨우 공간을 찾아냈다. 심각한 수준의 케이스 & 파워 서플라이가 아니라서 2-3개 정도의 HDD를 추가로 달 수 있었다. 파워 커넥터기 본체와 미묘하게 걸려서 HDD의 고정 위치를바꾸라 시간을 조금 더 소비하였다. 첫 부팅에서 BIOS 셋업으로 진입하여 디바이스가 잘 인식됨을 확인한 뒤 AHCI 모드로 설정하였다. 만약 이것은 RAID 모드로 한다면 LVM의 도움 없이 여러 디스크를 하나로 합쳐서 쓸 수 있을까? 그것도 우분투에서? 그건 나도 모르겠다.

LMV(Logical Volume Manager) 설정을 어떻게 하더라? 블로그의 기록으로는 2012-2013년 무렵에 조립 랙마운트 서버에서 5개의 HDD를 LVM으로 묶어서 사용하면서 겪었던 오류를 복구하던 약간의 경험이 남아 있다. 그 후로 RAID 콘트롤러 카드가 달린 서버를 새로 구입하면서 LVM은 까맣게 잊고 있었다. 이번에 LVM을 쓰려는 것은 단지 두 개의 물리적 HDD를 하나로 합쳐서 큰 용량으로 쓰기 위함이다. 저장 매체의 오류에 대비하려는 것은 아니다.

Disks GUI 유틸리티에서 이전의 파티션 정보를 전부 지우고 각 디스크마다 하나의 파티션을 생성하였다. 이 화면을 보려면 명령행에서는 'gnome-disks'라고 입력하면 된다.

그 다음으로는 명령행에서 작업을 수행하였다. LVM 설정을 위한 GUI 도구가 있을법도 한데 우분투에서 사용 가능한 것을 찾지 못하였다. 놀랍게도(!) lvm2는 아예 설치가 되어 있지 않았다. 구글을 뒤져 가면서 찬찬히 진행해 보았다. lvcreate로 작은 크기의 논리 볼륨(logical volume)을 먼저 만든 뒤 최대 크기로 확장(lvextend 명령 사용)하는 과정을 이해하기가 조금 어려웠다. 처음부터 최대 용량으로 하면 안되나?

$ sudo pvcreate /dev/sda1
$ sudo pvcreate /dev/sdb1
$ sudo vgcreate VolGroup00 /dev/sda1 /dev/sdb1
$ sudo lvcreate -l 20 -n logical_vol0 VolGroup00
$ sudo lvdisplay
$ sudo lvextend -l 100%FREE /dev/VolGroup00/logical_vol0
$ sudo mkfs.ext4 /dev/VolGroup00/logical_vol0
$ sudo fsck -y /dev/VolGroup00/logical_vol0
$ sudo mkdir /work
$ sudo mount /dev/VolGroup00/logical_vol0 /work
$ sudo blkid /dev/VolGroup00/logical_vol0

마지막으로 논리적 볼륨에 대한 UUID를 생성한 뒤 이를 /etc/fstab에 기록하여 재부팅 시에도 알아서 마운트가 되게 하였다. 

물리적 볼륨, 볼륨 그룹, 그리고 논리적 볼륨이라는 계층 구조로 구성되는 LVM의 체계를 이해한다면 GUI 도구가 없어도 설정을 하는데 큰 어려움은 없을 것이다. 다음의 스크린샷은 LVM 설정을 마친 뒤 Disks의 화면을 보이고 있다.

10년이 넘은 컴퓨터를 앞으로 얼마나 더 쓸 수 있을까? 정년 퇴직 전까지 도전을 해 보자.


LVM에서도 RAID4/5/6이 된다고?

Red Hat Enterprise 6.3부터 LVM은 RAID4/5/6을 지원한다는 글을 찾게 되었다(링크). 그렇다면 매우 고무적인 일이 아닐 수 없다. 우분투에서도 되지 않을까?


RAID 5를 쓰려면 최소 3개의 디스크 드라이브가 필요하다. Ryzen 데스크탑에 SATA 디스크 드라이브를 하나 더 쑤셔 넣을 수만 있다면 불가능한 일도 아니다. 


2021년 11월 1일 월요일

뭔가를 만들고 싶다는 생각(착각?)

오디오 DIY와 관련해서 현재로서는 시급하게 해결할 문제를 갖고 있지 않다. 손가락이 너무 심심해서 지난 주말에는 PCL86 싱글 앰프의 잘못된 그라운드 배선을 개선하였다. 이제 뭘 해야 하는가? 이래서 많은 자작인들이 직접 만든 앰프를 하나 둘씩 남에게 선물하거나 처분하기 시작하는 것 같다.

그런데 상용 220V 전원에 직접 연결하여 작동하는 물건을 만들어서 함부로 팔았다가는 문제가 될 수 있다. 유튜브에서 공돌이파파 님의  '진공관 앰프 자작의 불편한 진실'이라는 동영상을 소개해 본다.

모든 일에는 책임이 따르는 법이다. 많은 자작인들이 여러 경로를 통해서 직접 만든 진공관 앰프를 팔고는 있지만, 결함으로 인해 화재가 나거나 감전 사고가 발생한다면 법적인 책임을 벗어나기 어렵다. 키트를 만들어 파는 것도 법적인 요구사항을 슬기롭게(?) 피해 나가는 한 방법일 것이다. 혹은 KC 인증을 받은 상용 DC 어댑터를 통해 저전압 전원을 쓰게 하고, 기기 내부에서는 DC-DC boosting converter를 써서 진공관을 구동하는 고전압을 만들게 하는 것도 아이디어가 될 수 있다. 물론 스위칭 전원은 진공관 앰프(아니, 모든 오디오 앰프?)와 맞지 않는다는 생각을 가진 사람들이 아직 많이 있다.

따라서 나 혼자 즐기기 위한 용도로만 앰프를 만들어야 하는데, 비용이야 어떻게든 조달한다 해도 만든 앰프를 둘 자리가 점점 없어진다. '앰프 총량제'라도 실시하지 않는다면 정말 곤란하다. 아니면 취미를 위한 별도의 공간이 있는 넓은 집으로 이사를 가야 한다.

6LQ8 진공관은 8개가 남았다.

만약 다음 프로젝트를 구상한다면 무엇이 그 대상이 될까? Push-pull? 출력관은 무엇으로? 혹은 반도체 파워 앰프가 이미 있으니 다른 종류의 진공관을 써서 간단히 만드는 재미를 즐길 것인가? 


2021년 10월 26일 화요일

장장 일주일에 걸친 핀다이렉트 유심 개통(번호 이동)

알뜰폰, 즉 가상 이동통신망 사업자(MVNO, Mobile Virtual Network Operator)는 휴대폰을 뜻하는 것이 아니라 기존 이동통신사의 망을 빌려서 저가로 제공하는 통신 서비스다.  '핀다이렉트'는 카카오의 계열사인 스테이지파이브에서 제공하는 서비스의 이름으로, KT의 통신망을 이용한다. 바로 어제(2021년 10월 25일), KT가 네트워크 장애를 겪으면서 많은 이용자가 대혼란을 겪기도 했다. 규모의 경제를 통하여 많은 소비자가 혜택을 입는다고 자랑하지만, 이렇게 뜻하지 않은 오류가 발생하면 그만큼 많은 사람들이 불편을 겪는다. 이럴 때에는 다양성이 얼마나 중요한지를 새삼스럽게 깨닫게 된다.

스테이지파이브가 제공하는 이 저가 이동통신 서비스의 정식 명칭이 '핀다이렉트(샵?)'인지 '핀플레이'인지 혼동스럽다. 결국 같은 서비스를 다른 이름으로 부르는 것인가? 혹은 핀플레이가 정식 명칭이고 핀다이렉트'샵'은 이를 판매하는 온라인 상점인가? URL도 https://www.pindirectshop.com/과 https://www.pinplay.co.kr/가 별개로 존재한다. 이번에 번호이동을 하면서 핀다이렉트샵에 회원으로 가입했지만 핀플레이에 로그인하려면 별도로 가입을 해야 된다. 이렇게 혼동스러워서야...

카카오톡에서 핀다이렉트샵을 통해 유심을 구입한 것이 지난주 월요일이었다. 배송은 이틀 뒤인 수요일에 이루어졌다. 

노란색 나노유심은 번호이동 직전까지 쓰던 것(SKT).

개통을 위해 유심에 인쇄된 번호를 입력하니 유효하지 않은 번호라고 한다. 이제부터 고생의 시작이었다. 목요일부터 금주 월요일까지, 핀다이렉트샵 카카오톡 상담창을 붙들고 상담사가 배정되기를 기다려야 했다. 어떤 검색 결과에서는 신규가입의 경우 셀프 개통이 가능하지만, 번호 이동은 상담을 통해서만 개통이 된다고 하였다. 기존 통신사는 약간의 대기 시간이 필요하지만 상담사와 음성으로 통화를 할 수 있으니 그런 면에서는 비싼 요금제를 치를 가치가 조금은 있는 것 같다.

핀다이렉트샵에서는 실시간으로 개통이 처리되는 것이 아니라 일단 휴대폰에서 정보를 입력하여 넘기면 순차적으로 접수하여 개통을 하는 시스템인 것 같다. 만약 주민등록번호를 잘못 입력했다면? 입력 및 제출 당시에는 이를 알 수가 없고, 나중에 발송되는 문자 메시지를 확인해야 한다. 이를 미처 모르고 있었으니, 왜 개통이 지연되는지를 묻기 위해 계속 카카오톡을 통해 상담을 신청하는 지리한 작업을 반복했던 것이다.

처음 지연의 사유는 주민등록번호를 잘못 친 것이었고, 두번째의 지연 사유는 이전 통신사의 요금 납부 정보가 틀렸다는 것이었다. 나는 당연히 은행 계좌에서 요금이 빠져나가고 있었다고 생각했는데 그게 아니라 2년쯤 전에 딸아이의 휴대폰을 새로 마련해 주면서 발급받은 신용카드를 통해 납부되고 있었던 것이다!

용어의 혼란은 여기에서도 존재한다. 우리카드는 BC카드인가? 휴대폰이나 인터넷으로 결제를 할 때 신용카드를 쓰겠다고 하면 우리카드와 BC카드가 별도의 항목으로 나오는 것으로 알고 있다. 그런데 위키에 의하면 현재의 모든 우리카드는 BC카드란다...

핀다이렉트(샵)과 핀플레이, 우리카드와 BC카드.

어찌되었든 이러한 우여곡절을 겪은 끝에 바로 어제(월요일) 가까스로 개통에 성공하였다. 생각보다 훨씬 까다로웠기에 통신비 절감을 원하는 가족에게 이를 권해야 할지 말아야 할지 고민이다. 그런데 어떤 MVNO는 개통 신청을 한 뒤 한 달이 넘도록 아무런 조치를 취해주지 않는다니 그것보다는 나은 것 아닌가? 아이즈모바일이라는 MVNO 업체에 개통 신청을 하고 한달이 넘게 기다리다 핀플레이로 갈아탄 사람이 남긴 기록을 보라. 이러니 수많은 MVNO 중 어느 것을 택해야 하는지 심각하게 고민하지 않을 수 없을 것이다. 지난 일주일 동안의 경험으로는 카카오톡을 통한 개통 상담을 거치지 않고 PC 환경에서 셀프 개통(특히 번호이동)이 되는지를 알아보는 것이 가장 중요하다.


내가 선택한 요금제는 LTE 통신망을 이용하는 '데이터 안심 15GB+ (기프티쇼)'이다. 월 납부액은 부가세 제외 2만원. 5G망을 쓰려면 월 27,000원의 '5G 슬림 10GB+'를 선택해야 한다. 그러나 안타깝게도 내가 사용하는 자급제폰인 갤럭시 M12는 LTE 전용이다. 5G 서비스가 그렇게 절실한 것일까? 9월 2일 머니투데이에 실린 기사를 보자.

LTE와 비교하면 5G는 평균적으로 5배가 더 빠르다고 한다. 그러나 실생활에서 이를 체감할 서비스가 아직 흔치 않다는 것이 불만의 원인이라고 한다. 빨라도 쓸 데가 없다는 것. 결국 현대의 기술 발전은 소비자가 제시하는 요구사항을 충족하기 위함이 아니라, 특별히 불만이 없는 소비자에게 부족함을 느끼게 하여 수요를 증대하기 위함이 아니던가?

2021년 10월 22일 금요일

베이즈 정리 공부를 위한 간단한 자료

오늘 심심풀이로 만든 소박한 베이즈 정리 공부용 자료이다. 혹시 공개해 놓으면 개념을 잡는데 도움이 될까 싶어서... 친구나 동생에게 편하게 이야기하는 것처럼 글을 썼으니 불편하게 느끼신다면 양해를 구한다. 

그림을 클릭하면 커지는데, 파워포인트에서 각 객체를 선택하여 그림으로 저장을 해버렸더니 어두운 바탕의 위에 얹힌 투명 이미지가 되어서 보기에 좀 불편하다. 그것까지는 생각을 못했다. 단, 모바일 환경에서는 괜찮다.

혹시 오류가 발견되면 언제든지 알려주세요! 맨 아래의 엑셀 스프레드시트는 파워포인트 안에 삽입한 것이라서 이 블로그에 올린 이미지에서는 작동하지 않는다. 

그림/화면을 확대하지 않고 글씨가 보이게 하려고 삽입 이미지를 "매우 크게"로 키웠더니 블로그 창의 폭을 넘어가고 말았다.



















2021년 10월 21일 목요일

Bactopia에서 다운로드한 fastq 원본 파일은 work directory 아래 어디에 있는가?

요즘 Bactopia를 쓰는데 재미를 들였다. 2020년 mBio에 실린 논문 제목은 다음과 같다.

Bactopia: a Flexible Pipeline for Complete Analysis of Bacterial Genomes (https://doi.org/10.1128/mSystems.00190-20)

이를 처음으로 접한 것은 지난 4월. 바로 어제까지 공식 문서를 보고 무릎을 탁 치면서 '아, 이럴 때는 이렇게 하는 것이구나!'라고 깨달을 정도로 기본 개념과 작동 원리를 정확히 이해하기가 조금 까다롭지만, 쓰면 쓸수록 활용성이 높다는 것을 깨닫게 된다. 특히 BioProject나 SRA의 accession을 입력하면 이에 해당하는 raw sequencing read를 자동으로 가져와서 분석 프로세스를 진행하는 것이 매우 편리하다.

결과 디렉토리에는 QC를 거친 read와 후속 처리 결과물(de novo assembly, AMR prediction, genome annotation, variant analysis 등)이 저장되고, bactopia 명령을 수행한 현 위치의 work 디렉토리에는 중간 과정 결과가 쌓인다. 만약 SRA에서 다운로드한 원본 그대로의 fastq 파일을 쓰고 싶다면 work 디렉토리 아래를 뒤져야 한다. 무슨 이유인지 NCBI의 SRA에서는 직접 다운로드가 되지 않아서 '--use-ena' 옵션을 주어야 한다. 아마도 인증서와 관련한 문제일 것으로 생각된다.

work 디렉토리는 매우 복잡한 구조이고 심볼릭 링크가 너무 많아서 Bactopia pipeline 진행 중 최초로 다운로드한 fastq file 원본의 위치를 찾으려면 약간의 수고를 들여야 한다. Bactopia가 그런 목적으로 만들어진 것은 아니니 이해할 수밖에.

SRX997206_R1.fastq.gz는 어디에 있는지 find 명령으로 찾아보자. 심볼릭 링크는 제외하도록 한다. 'find work'가 아니라 'find .'이라 해도 결과는 같다. 현 디렉토리에는 SRX로 시작하는 무수한 'official' 결과 디렉토리가 있지만, 그렇게 깊숙한 곳에 원하는 파일이 있는 것이 아니니 결과물은 같다. 현 디렉토리에서만 찾고자 한다면 '-maxdepth 0'이 아니라 '-maxdepth 1'이라 해야 된다.

$ find work -maxdepth 6 -type f -name SRX997206_R1.fastq.gz
./SRX997206/quality-control/SRX997206_R1.fastq.gz
./work/bactopia/fe/e4ace6f0ae219902471aba4c2f75ae/fastqs/SRX997206_R1.fastq.gz
./work/bactopia/d9/587964324ce23bcde690aaa8557c9a/quality-control/SRX997206_R1.fastq.gz

두 개의 파일이 나온다. 첫 번째 것은 진짜 원본 파일이고 두 번째의 것은 QC를 거친 것이다. 파일의 이름도 같고, 현 위치 기준의 레벨(6)도 같다. 따라서 전체 경로에 'fastqs'라는 문자열이 있는 것만 선택하면 된다. 만약 마지막 디렉토리 이름이 'fastqs'가 아니라 'fastq'였다는 원본을 고르는 일이 상당히 성가셨을 것이다.

work 디렉토리 하위에 있는 fastq 원본 파일 전부를 01_original_fastq 디렉토리로 옮기려면 다음과 같이 한다. 만약 find 명령에서 '-name */fastqs/*fastq.gz'과 같이 옵션을 줄 수 있다면, '-exec cp {} 01_original_fastq;'를 명령행에 추가하여 find 명령어 한 줄로 검색과 복사를 다 할 수 있을텐데 내 실력으로는 그렇게 하는 방법을 아직 모르겠다.

$ mkdir 01_original_fastq
$ find . -maxdepth 6 -type f -name *fastq.gz | grep fastqs | while read f
> do
> cp $f 01_original_fastq/
> done

grep 'quality-control' 필터를 쓰면 QC를 거친 fastq 파일만을 골라서 복사할 수 있다. 물론 QC를 거친 fastq를 찾으려면 work 디렉토리가 아니라 정식 결과물 디렉토리를 찾는 것이 더 현명하다. 사용자가 이해하기 쉬운 서브디렉토리 이름과 구조라서 depth를 고려할 필요가 없기 때문이다.

복사가 끝났나? 그러면 137 GB나 되는 work directory를 지우자. 이번 작업에서는 총 296개의 fastq 파일을 ENA에서 다운로드했었다.

2021년 10월 18일 월요일

끝이 없는 과제 보고서 작성

10월에 들어서 주말은 빼고 거의 매일 곧 종료될 수탁과제 보고서를 쓰는 중인데 도대체 끝날 조짐이 보이지 않는다. 마치 내가 연구 기간 동안에 대단히 많은 일을 한 것처럼 착각을 하기 딱 좋은 상황이다. 주 단위로 작성 목표를 대략적으로 수립한 상태에서 꾸준히 써 나가는데도 진도가 더디게 나가는 것만 같다.

때로는 너무 일찍 일을 계획하여 오히려 실행 단계에서 틀어지거나 피해를 입는 일이 많았다. 이번에는 보고서 작성에 연구 기간의 마지막 한 달을 쓰겠노라고 계획을 하였고, 시간을 좀 과하게 배정한 것이 아닌가하는 생각이 들었었다. 그런데 막상 10월이 되어 보고서를 쓰기 시작하니 결코 많은 시간을 미리 할당한 것이 아니었다!

잠시 쉬어가는 사진 한 장. 어제 구입한 갤럭시 M12로 찍은 사무실 테이블 위의 모습이다. Ryzen 5950x 컴퓨터 위에 개새 '비존'이 앉아 있다. 헤드폰을 얹은 기기는 롤랜드 사운드캔버스 SC-D70이다. 머리를 뒤로 돌리면 49건반의 MIDI 콘트롤러 키보드도 있고, 모니터 뒤에는 스콰이어 텔레케스터가 먼지를 하나 가득 뒤집어 쓰고 묵묵히 스탠드에 기대어 있다. 사무실용 장난감을 꽤 많이 갖고 있는데 실제 갖고 노는 것은 유튜브나 KBS Kong을 듣기 위한 자작 앰프와 스피커뿐.

갤럭시 M12의 카메라 화면의 종횡비는 4:3인가? 어제까지 썼던 갤럭시 S6 Edge+는 '와이드' 화면이었다. 갤럭시 M12의 카메라 앱을 조작해 보니 해상도 변경이 가능하다.

'앉는다'는 것은 어떤 물체에 엉덩이를 대고 발에는 거의 체중을 두지 않는 행위이다. 사람도 이렇게 앉고, 많은 네발 달린 포유동물이 그렇게 앉는다. 그러면 '새가 앉다'라는 표현을 한번 해부해 볼까? 날아다니던 새가 나뭇가지나 땅바닥에 제 몸을 의지할 때 결코 인간이나 다른 동물처럼 엉덩이를 어디에 지지하지 않는다. 인간으로 비유하자면 서 있는 것과 마찬가지의 모습을 한다. 그렇다고 '날아가던 새가 전깃줄 위에 섰다'라고는 하지 않는다.

음... 새가 알을 품을 때는 인간을 닮은 앉는 동작을 하는구나.

쓸데없이 진지했다. 퇴근하면서 한 컷.