기본 콘텐츠로 건너뛰기

추천 가젯

[프로그래밍 이야기 6] 포터블 라이터기의 재발견: 웹소켓과 스크립트가 만든 현장 대응 파이프라인

 임베디드 장비나 FPGA 칩이 탑재된 하드웨어를 현장에서 다룰 때, 가장 고민스러운 부분은 펌웨어 라이팅 환경을 구축하는 일입니다. 공장 PC나 현장 컴퓨터에 무겁고 거대한 벤더 전용 프로그램(IDE)을 일일이 설치하고 환경을 설정하는 것은 지극히 비효율적입니다. 이때 가장 똑똑하고 유연한 접근법은 공장 PC에 무언가를 설치하려 애쓰는 대신, 엔지니어의 노트북 한 대를 즉시 '포터블(Portable) 라이터기'로 탈바꿈시켜 현장에 투입하는 것입니다. 노트북을 포터블 라이터기로 만드는 전략과 웹소켓 노트북을 이동식 포터블 라이터기로 활용하기 위해 거창한 프로그램을 깔 필요는 전혀 없습니다. 핵심은 펌웨어를 입히는 CLI(명령줄 인터페이스) 툴과, 이를 원격에서 실행해 줄 지극히 단순하고 가벼운 웹소켓(WebSocket) 서버 하나만 준비하는 것입니다. 중요한 점은 여기서 사용하는 웹소켓 프로그램이라는 것이 결코 복잡하거나 무거운 시스템이 아니라는 사실입니다. 단 몇 킬로바이트 수준의 경량 훅(Hook) 역할만 수행하는 웹소켓 서버를 노트북에 띄워두면, 공장 PC 환경을 오염시키지 않고도 노트북 한 대가 완벽한 이동식 라이팅 단말기로 변신합니다. 가장 가벼운 웹소켓 훅과 Shell 스크립트의 결합 이 시스템의 실체는 놀라울 정도로 가볍고 명확합니다. 노트북 내부에서는 하드웨어(.sof)를 구운 뒤 MCU 펌웨어(.elf)를 연달아 다운로드하는 아래의 Shell 스크립트가 실행의 중심을 잡습니다. // flasher.sh - FPGA 및 Nios II 펌웨어 연속 라이팅 스크립트 #!/bin/bash 1. FPGA Hardware (.sof) 구우기 #!/bin/bash echo "Hello World" echo "=== Programming FPGA Hardware ===" quartus_pgm -c "USB-Blaster [1-4]" -m JTAG -o "p;mcu.sof...

[AI번역] Gnuplot으로 출판 수준의 그래프 그리기

원문 게시일: 2015년 4월 20일

저자: Matt

여러 플랫폼의 대안들을 신중하게 검토한 결과, 출판 수준의 그래프를 생성하는 데 가장 적합한 소프트웨어는 Gnuplot이라는 결론을 내렸습니다. R 스위트(suite)는 통계 분석에는 훨씬 뛰어나지만, 그래프 생성 기능은 그만큼 유연하지 않고 제 눈에는 그리 예뻐 보이지 않았습니다. (솔직히 말씀드리면 저는 주로 기본 플로팅 라이브러리만을 염두에 두고 말하는 것이며, lattice나 ggplot2 같은 다른 라이브러리를 광범위하게 사용해 보지는 않았습니다.) 엑셀(Excel)로도 출판 수준의 그래프를 만들 수는 있지만 번거로운 작업이며, 무엇보다 다이어그램의 정확한 크기를 설정하거나 고해상도 이미지를 생성하기가 쉽지 않습니다.

어떤 면에서 Gnuplot의 언어 구문은 다소 구식처럼 보일 수 있지만, 일단 익히고 나면(혹은 이를 생성하는 프로그램을 작성하는 법을 배우면) 매우 강력합니다. Gnuplot의 PNG 드라이버는 결과물이 아주 훌륭하지는 않지만, Postscript와 SVG 드라이버는 매우 잘 작동합니다. 저는 특히 출판 수준의 산점도(scatter diagram)를 만들 때 이들이 유용하다는 것을 알게 되었습니다. 일반적으로 something.plt라는 파일을 만들고 여기에 gnuplot 명령어를 입력하여 실행합니다.

3인치 정사각형 정도의 EPS 파일을 생성하려면 Postscript 터미널을 사용하며 아래 명령어를 입력합니다:

코드 스니펫
set terminal postscript eps enhanced size 3in,3in
set output 'file.eps'

6~6.5인치 정사각형 정도의 Postscript 파일을 생성하려면:

코드 스니펫
set terminal postscript enhanced size 6in,6in
set output 'file.ps'

4~6인치 정사각형 정도의 SVG 파일을 생성하려면:

코드 스니펫
set terminal svg enhanced size 500,500
set output 'file.svg'

SVG 터미널은 크기 옵션에서 'in' 단위를 허용하지 않는 것으로 보이지만, SVG 세계에서는 100이 1인치와 같습니다. 저는 SVG 방식을 가장 선호하는데, 결과 그래프를 오픈소스 SVG 편집 프로그램인 잉크스케이프(Inkscape)에서 추가로 편집하거나 주석을 달 수 있기 때문입니다. 따라서 이후 설명은 SVG 드라이버 사용을 가정합니다.

SVG 터미널에서 enhanced 옵션은 중요합니다. 이를 통해 더 정교한 제목을 설정할 수 있습니다:

코드 스니펫
set encoding iso_8859_1
set title 'This is the title of the graph'
set xlabel 'Molecular weight (kDa)'
set ylabel 'Solvent-inaccessible surface area x 1000 ({\305}^2)'

^는 상첨자를, _는 하첨자를 허용하며 이는 LaTeX와 유사합니다. 비 ASCII 문자도 포함할 수 있습니다 (예: {\305}는 옹스트롬 기호).

범례(Legend/Key) 제어:

코드 스니펫
set nokey          # 범례 끄기
set key top left   # 범례를 왼쪽 상단으로

축 범위 제어:

코드 스니펫
set xrange [0:10]
set xtics 0,2,10   # 증분 단위를 2로 설정
set yrange [0:1000]

회귀 곡선과 같은 함수 추가:

코드 스니펫
f(x) = 0.039440 * x + 0.678467

이제 모든 매개변수가 설정되었으므로 plot 함수를 사용하여 실제 그래프 데이터를 생성합니다:

코드 스니펫
plot 'data1.dat' using 1:2 w p, \
     'data2.dat' using ($2/1000):($3/1000) w lp pt 13 ps 1.5 lt 1 lc -1 lw 1, \
     f(x)

w는 'with'의 약자입니다. 첫 번째 인자는 스타일로, 데이터가 어떻게 그려질지를 결정합니다:

  • points(p) - 연결되지 않은 점들

  • linespoints(lp) - 선으로 연결된 점들

기타 인자들은 다음과 같습니다:

  • pointtype(pt) - 점의 모양 제어

  • pointsize(ps) - 점의 크기 제어

  • linetype(lt) - 선의 모양(실선, 점선 등) 제어

  • linecolor(lc) - 선 및 점의 색상 제어

  • linewidth(lw) - 선의 굵기 제어

불행히도 이러한 옵션의 인자들은 특정 드라이버에 의해 정의된 임의의 숫자로 지정됩니다. SVG 드라이버의 점 모양(pointtype)은 다음과 같습니다:

  • 1: +, 2: x, 3: *, 4: 빈 사각형, 5: 채워진 사각형, 6: 빈 원, 7: 채워진 원, 13: 채워진 다이아몬드 등

SVG 선 색상(linecolor):

  • -1: 검정, 0: 회색, 1: 빨강, 2: 초록, 3: 파랑, 7: 오렌지 등

SVG 드라이버에는 실선 이외의 다른 선 모양(linetype)이 없는 것으로 보입니다(단, 이는 잉크스케이프에서 수정 가능합니다). 이것이 문제가 된다면 많은 종류의 점선을 지원하는 postscript 터미널을 사용하십시오. 터미널의 기능을 확인하는 쉬운 방법은 test 명령을 내리는 것입니다.

생성된 이미지는 잉크스케이프를 사용해 원하는 해상도의 무손실 PNG 파일로 내보낼 수 있습니다. 명령행에서도 가능합니다:

Bash
$ inkscape --export-area-drawing --export-png=file.png \
             --export-dpi=300 file.svg

ImageMagick 도구 스위트의 convert 프로그램을 사용하면 이를 TIFF나 다른 형식으로 변환할 수 있으며, 투명도를 제거하거나 테두리를 추가할 수도 있습니다:

Bash
$ convert -background "#ffffff00" -flatten -bordercolor "#ffffff00" \
            -border 50x50 input.png output.tiff

convert는 EPS 이미지를 래스터 형식으로 변환하는 데도 사용할 수 있지만, SVG를 래스터로 변환할 때는 잉크스케이프보다 결과물이 떨어질 수 있습니다.


알림: 이 글은 AI를 사용하여 번역되었습니다.

원문 링크: Publication-quality plots with Gnuplot (작성자: Matt)

댓글