Author: byun1114

  • 쉘 스크립트 다중 코어.

    제목은 거창한데 실제 구현하고자 하는 것은 동시에 여러 프로세스를 실행하는 것이다. 여러 CPU를 동시에 사용하는 프로그램으로 제작된 것이 아닌 이상 다중 코어 기반의 현재 CPU에서는 idle CPU를 줄이는 것이 시간을 아끼는 일이고, 퇴근 시간과 연구 시간을 줄이는 것이다. bfconvert를 이용하고 있는 지금의 나에게는 파일 변환 시간을 줄이는 것이다. SVS 파일을 4000×4000 pixel로 분할하는 작업을 실행하면 CPU는 100% 정도 밖에 되지 않는다. 나머지 코어 5개 분량은 놀고 있는 것이다. SVS 파일을 통째로 TIFF로 변환하면 250% 정도로 상승하지만 여전히 노는 CPU 자원이 생긴다. 그래서 원하는 수준으로 적당히 여러개를 실행할 수 있는 것이 필요하다.

    실행에 시간이 짧게 걸리거나 시스템에 부하가 많이 없다면 한 번에 다 실행하는 방법도 좋을지 모르겠다. 이 방법은 반복문에서 실행 부분에 &를 붙여 모두 백그라운드에서 실행하게 하면 된다.

    먼저 알아두어야 할 것은 bfconvert는 실행하면 1초쯤 후에 java 프로세스로 실행이 된다.

    나의 목표는 동시에 2 ~3개 정도에서 조절해 보는 것이다. 여러 방법 중에서 조건문 if와  wait를 이용해 보기로 했다. 여유있게 하나 실행하고 10초후에 다시 판정하는 방법을 이용했다. 기다리지 않으면 앞서 언급한 시간차(?)로 인해서 목표한 2개가 아닌 3개가 실행되는 사태가 생긴다. 처음에 if 의 조건문이 자꾸 오류가 나서 찾아본 결과, 대괄호에 띄어쓰기가 필요하다는 것을 알았다.

    이 방법은 좋은데 백그라운드로 2개가 동시에 실행되고 있는 경우, 2개가 모두 종료되어야 3번째가 실행이 된다. 그리고 bfconvert는 2번째 변환되는 파일은 속도가 좀 느려진다. 1번째 파일의 변환이 끝나면, 2번째 파일이 혼자 변환되는 것이다.

    for file in $file_list; do
      child_proc=`ps -e | grep java | wc -l`
      if [ "${child_proc}" -eq 2 ]; then
      wait
      fi
      file=`basename $file .svs`
      ~/bftools/bfconvert -series 0 -bigtiff ${file}.svs converted/${file}.tif &
      sleep 10
    done

    계속 2개를 유지시키기 위하여 if 를 기반으로 한 조건문을 여러 번 변경해 보았는데 잘 되지 않았다. 그래서 방법을 좀 바꾸어서 무한 반복 while을 이용해 보기로 했다. 하나씩 계속 실행하다가 실행중인 java 프로세스가 2개 이상이면 일단 60초 대기 후 다시 java 프로세스 숫자 확인한다. 하나가 종료되었다면 while 구문에서 벗어나서 새롭게 변환 프로세스를 실행하는 방식이다. 쉘 스크립트의 숫자 판별식이 등호나 부등호를 이용하지 않기 때문에 매우 적응이 안되는데, 본인의 시스템에 맞는 적절한 숫자와 조건을 이용하면 될 것이다.

    for file in $file_list; do
      file=`basename $file .svs`
      ~/bftools/bfconvert -series 0 -bigtiff ${file}.svs converted/${file}.tif &
      sleep 10
      while :
        do
        child_proc=`ps -e | grep java | wc -l`
        if [ "${child_proc}" -lt 2 ]; then
        break
        fi
      sleep 60
      done
    done
  • CSV export 시 column 이름 빼고 하기

    write.csv()를 이용할 경우 다 괜찮은데, 첫 줄이 강제적으로 필요하게 된다. 이를 해결하기 위해서는 write.table()을 이용하면 된다. 내가 사용하는 옵션은 다음과 같다.

    write.table(x, file = ‘’, quote = F, row.names = F, col.names = F, sep=",")
  • 쉘 스크립트

    그 동안 리눅스에서 반복 작업을 수행할 경우에는 컴퓨터를 2개 사용하더라도 R에서 해당 과정을 수행할 수 있는 스크립트를 작성하여 실행하였다. 이제는 그런 방법보다는 쉘 스크립트를 이용하는 것이 좋을 것 같아서 이번 기회에 배워 보기로 했다.

    #! /bin/bash
    file_list=`ls ~/work/*.svs`
    for file in $file_list; do
    file=`basename $file .svs`
    ~/bftools/bfconvert ${file}.svs converted/${file}_converted_%x_%y.tif
    done

    첫 줄에는 #! /bin/bash.

    두 번째 줄부터 내용이다. 변수 사용에 있어 따옴표 종류가 중요하다. 작은 따옴표는 내부에 묶인 것이 글자 그대로 인식해야 할 때 사용한다. 큰 따옴표는 변수를 사용해야 할 때에 이용하면 된다. 벡틱이라고 불리는 1왼쪽에 있는 기호는 터미널에서 명령어를 실행하고 결과를 받아올 때 이용한다. 그리고 확실하지 않은데 변수 받을 때 띄어쓰기 않으며, 변수명에 .을 넣지는 않는다. 따라서 2번째 줄의 등호 오른쪽은 벡틱을 이용했다.

    스크립트를 사용하는 주된 이유는 반복 실행과 관련된 것이다. for [ ] in { }은 R과 문법 자체는 동일하다. 따라서 어렵지 않다. {   } 쪽에 변수 를 받아서 사용할 것이기 때문에 $를 붙여준다. 그리고 실행할 때에는 do를 붙여주면 된다. 아랫줄에 넣어도 되고, 새미콜론으로 오른쪽에 넣어줄 수도 있다.

    4번째 줄에서 basename은 파일 경로에서 파일 이름만 이용할 때 사용하는 것이다. 나는 확장자를 제외한 파일 이름이 필요하기 때문에 추가 옵션을 이용한다. 한 칸 띄우고 .svs 를 붙이면 해당 단어는 빼고 결과를 출력한 다. 상세 사용은 basename –help를 참고하면 된다.

    5번째 줄에서 변수를 이용하여 명령어를 실행할 경우 ${변수} 요런 식으로 이용하는 것 같다.

    마지막에 6번째 줄에 done을 입력한다.

    들여쓰기가 있는데, 보기 편하라고 한 것이지 실행에 영향을 주는 것은 아니다.

  • 대학 중용 강설, 이기동 역해, 성균관대학교 출판부

    내가 대충 읽었는지 아니면, 내용이 없다고 생각했는지 모르겠다. 논어에 비하면 와닿지 않는 느낌이라고 할까. 대학보다는 중용이 조금 더 내용이 좋은 것 같다. 예전에 봤던 구절인 박학지 심문지 신사지 명변지 독행지가 중용 20장에 나오는 구절이었다.

    제1장 -116
    喜怒哀樂之未發 謂之中 發而皆中節 謂之和 中也者 天下之大本也 和也者 天下之達道也 致中和 天地位焉 萬物育焉
    희노애락지미발 위지중 발이개중절 위지화 중야자 천하지대본야 화야자 천하지달도야 치중화 천지위언 만물육언
    기뻐하고 성내고 슬퍼하고 즐거워하는 정이 아직 나타나지 아니한 상태롤 ‘속’이라는 의미로서 중이라 하고, 나타나서 모두 절도에 알맞게 된 상태를 화라 한다. 중이란 천하의 큰 뿌리이고 화란 천하에 통하는 도리이다. 중과 화를 이루면 하늘과 땅이 제자리로 돌아가고 만물이 (제대로) 길러진다.

    제12장 – 197
    子曰 好學 近乎知 力行 近乎仁 知恥 近乎勇 知斯三者 則知所以修身 知所以修身 則知所以治人 知所以治人 則知所以治天下國家矣
    자왈 호학 근호지 력행 근호인 지치 근호용 지사삼자 즉지소이수신 지소이수신 즉지소이치인 지소이치인 즉지소이치천하국가의
    공자께서 말씀하셨다.”배우기를 좋아함은 지에 가깝고 실천을 힘씀은 인에 가까우며 부끄러움을 아는 것은 용에 가깝다.” 이 세 가지를 알면 몸을 닦는 방법을 알며, 몸을 닦는 방법을 알면 남을 다스리는 방법을 알며, 남을 다스리는 방법을 알면 천하와 국가를 다스리는 방법을 안다.

    제 20장. -207
    凡事 豫則立 不豫則廢 言前定則不跲 事前定則不困 行前定則不疚 道前定則不窮
    범사 예즉립 불예즉폐 언전정즉불겁 사전정즉불곤 행전정즉불구 도전정즉불궁
    무릇 모은 일은 미리 준비되면 이루어지고 미리 준비되지 않으면 어그러진다. 말이 미리 정해져 있으면 착오가 생기지 않고, 일이 미리 정해져 있으면 곤란하지 않게 되며, 행동하는 것이 미리 정해져 있으면 탈이 없게 되고, 방법이 미리 정해지면 궁하지 않게 된다.