원문 캡처 · github.com
원문 캡처 · github.com

JSynth는 캔버스에서 입력값과 함수, 그래프를 연결해 Julia 프로그램을 구성하는 시각적 편집기다. 설계를 Julia로 실행하면 각 노드에서 값을 확인할 수 있고, 완성한 설계는 일반 Julia 스크립트로 내보낼 수 있다. Windows와 Linux에서 실행되며 WSL도 지원한다.

설치와 실행 조건

설치 스크립트는 최신 릴리스를 내려받고 필요한 항목을 설치한 뒤 시작 메뉴나 애플리케이션 메뉴에 JSynth를 추가한다. Julia가 아직 설치되지 않았다면 juliaup으로 Julia도 설치한다.

Windows 64비트에서는 PowerShell에서 실행한다.

powershell
irm https://raw.githubusercontent.com/ozanbora/JSynth/master/install/install.ps1 | iex

Linux x64와 macOS Apple Silicon에서는 터미널에서 실행한다.

sh
curl -fsSL https://raw.githubusercontent.com/ozanbora/JSynth/master/install/install.sh | sh

Linux에서 fontconfig가 없으면 설치 스크립트가 패키지 관리자를 통해 이를 설치하며, 이때 암호를 묻는다. Windows에서는 JSynth를 %LOCALAPPDATA%\Programs\JSynth에 설치하고, 그 밖의 환경에서는 ~/.local/share/jsynth에 설치하며 ~/.local/bin에 jsynth 명령을 둔다.

VNC로도 JSynth를 제공하려면 --vnc를 추가한다. 셸에서는 sh -s -- --vnc를 사용한다. Windows에서는 -Vnc 옵션이 적용되지 않으며, VNC를 위해 추가로 할 일은 없다. 제거하려면 스크립트를 --uninstall 옵션으로 다시 실행한다. Windows에서는 스크립트를 내려받아 .\install.ps1 -Uninstall로 실행한다. 제거 후에도 설정과 설계는 남는다.

릴리스 페이지에서 파일을 직접 내려받아 압축을 풀어 설치할 수도 있다. 각 운영체제에 필요한 항목은 릴리스 페이지에 설명돼 있다.

필요한 조건은 .NET SDK 10 이상이다. 프로젝트는 net10.0을 대상으로 하며 global.json이 이 조건을 적용한다. Julia는 다운로드 페이지에서 받을 수 있고, 프로젝트는 juliaup 사용을 권장한다. JSynth는 PATH와 일반적인 설치 폴더에서 Julia를 찾는다. 사이드바에서 Julia 실행 파일을 선택하거나 Run → Choose Julia… 메뉴를 이용할 수도 있다.

설계와 데이터 처리

JSynth 설계는 노드 그래프로 이뤄진다. 입력 노드에는 숫자, 벡터, 행렬, 희소 행렬, zeros, rand, range 등으로 만든 배열, CSV·Matrix Market(.mtx)·JLD2·PNG 파일에서 불러온 배열을 넣을 수 있다. 함수 노드에는 사용자가 작성한 Julia 코드를 넣으며, 매개변수에는 자료형을 지정한다. 각 매개변수는 입력 포트가 되고 함수의 값은 출력이 된다. 출력 노드는 값 표시, 선 그래프·산점도·히트맵, 파일 저장을 지원한다.

출력과 입력을 연결하면 값이 전달된다. F5를 누르면 JSynth가 설계를 Julia 스크립트로 바꾸고, 계속 열어 두는 Julia 세션에서 실행한다. 실행 뒤 각 노드에는 값, ✓ 또는 ✗ 배지, 실행 시간이 표시된다. 출력 패널은 모든 값을 변수 이름과 함께 나열한다.

데이터가 들어오는 흐름에 맞춰 설계를 실행하는 기능도 있다. 폴더 안의 파일을 한꺼번에 처리하거나 하나씩 반복 처리할 수 있다. 감시 폴더에서는 새 파일이 도착할 때 처리하거나 몇 초 간격으로 웹 주소를 가져올 수 있다. Every는 몇 초 간격으로 값을 발생시키고, Button은 누를 때마다 값을 만든다. Map, Window, Only when, Zip, Merge는 각각 값마다 함수를 적용하고, 최근 몇 개의 값을 유지하고, 조건에 따라 걸러내고, 흐름을 결합하는 데 쓴다.

매개변수 패널에 입력값을 넣으면 슬라이더와 입력 상자로 값을 조정할 수 있으며, 값이 바뀌고 잠시 뒤 설계가 다시 실행된다. 입력에 이름을 지정하면 스크립트에서도 그 이름을 변수로 사용한다. 예를 들어 loan = 250000.0처럼 표현하므로 출력에서 각 값이 무엇인지 식별하기 쉽다.

중단점을 설정해 실행을 멈출 수도 있다. F9를 누르면 선택한 연결선에서 실행을 멈추며, 조건을 지정할 수도 있다. 이때 값을 확인한 뒤 F5로 계속 실행하거나 F10으로 다음 값까지 진행한다.

프레임은 노드 주변에 제목이 있는 상자를 만든다. 여러 노드를 그룹으로 묶으면 하나의 노드처럼 다룰 수 있다. 프레임 제목을 두 번 클릭해 그룹으로 만들고, 그룹의 ⧉ 버튼으로 다시 연다. 노드와 그룹은 이름을 붙여 라이브러리에 저장하고 다른 설계에 복사해 넣을 수 있다.

여러 설계를 탭으로 동시에 열 수 있으며, 각 탭은 별도의 실행 취소 기록을 가진다. 탭을 독립된 창으로 열 수도 있다. 설계에 사용된 패키지가 설치돼 있지 않으면 설치할 수 있도록 안내한다. Ctrl+Shift+A는 노드를 정렬하며, 프레임 안의 노드는 함께 유지한다.

설계는 변경 후 잠시 지나면 자동 저장된다. 한 번도 저장하지 않은 설계도 보관했다가 다음 실행 때 다시 연다. 설계는 Julia 스크립트나 캔버스의 PNG 이미지로 내보낼 수 있다. 화면은 밝은 테마와 어두운 테마를 제공하며, 테마를 직접 고르지 않으면 시스템 설정을 따른다. 인터페이스에는 Julia의 색상을 사용한다.

예제와 단축키

File → Examples 메뉴와 시작 페이지에서 예제를 열 수 있다. 대용량 데이터가 필요한 예제는 다운로드 전에 확인을 요청하고 저장 위치를 묻는다.

  • Loan payment: 대출 금액, 이자율, 기간을 슬라이더로 조정해 월 납입액을 계산한다.
  • Projectile: 던진 공이 날아가는 거리와 높이, 시간을 살펴본다.
  • Line fit: 공부 시간과 시험 점수 데이터에 최소제곱 직선을 맞춘다.
  • PageRank: 링크로 연결된 웹페이지 네 곳의 중요도를 계산한다.
  • Heat in a rod: 희소 행렬로 막대의 정상 상태 온도를 구해 그래프로 표시한다.
  • Monte Carlo π: 정사각형 안에 무작위로 점을 뿌려 π를 계산한다.
  • Live Monte Carlo π: 매 주기 점을 추가해 π 추정값을 실시간으로 갱신한다.
  • Random walk: 버튼을 누를 때마다 길어지는 무작위 보행을 보여준다.
  • Weather station week: 시간별 기온을 담은 하루치 CSV 파일을 날짜별로 처리해 한 주를 살펴본다.
  • Network spread: 작은 네트워크 네 개를 희소 행렬로 표현하고 각 네트워크에서 확산되는 속도를 비교한다.
  • Savings growth: 범위 값으로 연도별 저축 증가를 계산한다.
  • Radar clutter map: Boreas 데이터셋의 레이더 스캔을 하나씩 처리한다.
  • Live radar: 같은 스캔을 레이더에서 들어오는 것처럼 스트림으로 처리한다.
  • Bearing wear: NASA IMS 베어링 시험 장치의 일주일치 진동을 분석하고 베어링 마모에 경보를 설정한다.
  • Bearing week in parallel: 같은 일주일치 데이터를 Julia의 모든 스레드에서 처리한다.
  • Earthquake detector: 2019년 Ridgecrest 지진이 발생할 때 지진계 기록을 분 단위로 살펴본다.
  • Earthquake network: 지진계 네 대의 기록을 맞춰 지진을 감지한 지진계를 확인한다.
  • Motion in video: 고정 카메라 영상에서 움직이는 부분을 찾아 사람이 표시한 프레임과 비교해 점수를 매긴다.
  • Live air traffic: OpenSky Network에서 네덜란드·벨기에·독일 서부의 항공기 정보를 실시간으로 가져온다.
  • Storm surge: 조석 관측소 여섯 곳과 폭풍 경로를 바탕으로 허리케인 Helene이 플로리다 걸프 연안에 일으킨 폭풍 해일을 살펴본다.

주요 키보드 단축키는 다음과 같다.

  • F5: 실행하거나 중단점에서 계속 실행한다.
  • Shift+F5: 실행을 멈춘다.
  • F9: 선택한 연결선에서 실행을 멈춘다.
  • F10: 연결선의 다음 값까지 진행한다.
  • Ctrl+N / Ctrl+O / Ctrl+S / Ctrl+Shift+S: 새 설계, 열기, 저장, 다른 이름으로 저장을 실행한다.
  • Ctrl+T / Ctrl+W / Ctrl+Tab: 새 탭, 탭 닫기, 다음 탭을 실행한다.
  • Ctrl+B: 사이드바를 표시하거나 숨긴다.
  • Ctrl+Z / Ctrl+Y: 실행 취소와 다시 실행을 한다.
  • Ctrl+C / Ctrl+X / Ctrl+V / Ctrl+D: 복사, 잘라내기, 붙여넣기, 복제를 한다.
  • Ctrl+Shift+C: 선택 항목을 Julia 코드로 복사한다.
  • Ctrl+G / Ctrl+Shift+G: 선택 항목을 그룹으로 만들거나 그룹을 연다.
  • Ctrl+Shift+A: 노드를 정렬한다.
  • Ctrl+A / Delete / Esc: 모두 선택, 삭제, 선택 해제를 한다.
  • Ctrl+마우스 휠, Ctrl+0: 확대·축소하거나 100% 배율로 돌아간다.

캔버스에서 드래그하면 화면을 이동한다. Ctrl을 누른 채 드래그하면 상자로 영역을 선택하고, 마우스 오른쪽 버튼을 누르면 노드를 추가한다.

개발·운영 환경

개발 환경에서 빌드하고 실행하거나 테스트하려면 다음 명령을 사용한다.

sh
dotnet run --project JSynth.Desktop
dotnet test JSynth.Tests

일부 테스트는 실제 Julia를 실행하며, Julia를 찾지 못하면 해당 테스트를 건너뛴다. 예제에서 내려받는 데이터가 필요한 테스트도 데이터가 없으면 건너뛴다.

명령줄 옵션은 다음 명령으로 확인할 수 있다.

sh
dotnet run --project JSynth.Desktop -- --help

렌더링 옵션과 함께 --enableVncServer를 사용하면 창 없이 실행하고 VNC 뷰어에 화면을 표시할 수 있다. --open <file>은 설계 파일 하나를 창에서 단독으로 연다. --untitled <file> --name <name>은 아직 저장하지 않은 설계를 창에서 단독으로 연다. 탭을 새 창으로 열 때 이 옵션을 사용한다.

설정, 라이브러리, 저장하지 않은 설계와 로그(Logs)는 Windows에서는 %AppData%\JSynth에, Linux에서는 ~/.config/JSynth에 보관한다.

Linux와 WSL에서도 실행할 수 있다. WSL 2에서 WSLg를 사용하는 Ubuntu 환경도 지원하며, Windows 11에서는 창이 Windows 데스크톱에 표시된다. Linux에서는 Skia가 필요한 네이티브 라이브러리를 설치한다.

sh
sudo apt install libfontconfig1

Ubuntu 22.04의 apt는 SDK 10을 제공하지 않으므로, 원문은 Microsoft 설치 스크립트로 .NET을 설치하도록 안내한다.

sh
curl -sSL https://dot.net/v1/dotnet-install.sh -o dotnet-install.sh
bash dotnet-install.sh --channel 10.0 --install-dir ~/.dotnet
export PATH=~/.dotnet:$PATH
DOTNET_ROOT=~/.dotnet

Julia는 다음 명령으로 설치한다.

sh
curl -fsSL https://install.julialang.org | sh

WSL에서 저장소를 복제할 때는 /mnt/c 대신 ~/JSynth와 같은 Linux 파일 시스템 안에 둬야 한다. 그래야 Linux와 Windows 빌드가 bin과 obj 폴더를 공유하지 않는다.

다른 방법으로 Windows에서 자체 포함 빌드를 만든 뒤 libfontconfig1만 설치된 WSL에서 실행할 수 있다.

sh
dotnet publish JSynth.Desktop -c Release -r linux-x64 --self-contained -o publish/linux-x64

문제가 생겼을 때는 다음 안내를 참고한다.

  • 작업 표시줄에는 아이콘이 있지만 창이 나타나지 않고 제목이 [WARN:COPY MODE]로 시작하면, WSLg가 창을 Windows로 보내는 데 사용하는 공유 메모리를 설정하지 못했을 수 있다. /mnt/wslg/weston.log에서 rdp_allocate_shared_memory: Failed to open ... 메시지를 확인할 수 있다. 이는 JSynth만이 아니라 모든 Linux 앱에 영향을 준다. Windows에서 wsl --shutdown을 실행해 WSL을 다시 시작한 뒤 JSynth를 실행한다. 이 명령은 실행 중인 모든 배포판을 중지한다.
  • 시작할 때 Unable to load shared library 'libSkiaSharp' 오류와 함께 앱이 종료되면 libfontconfig1을 설치한다.
  • A compatible .NET SDK was not found 오류로 빌드가 실패하면 .NET SDK가 10보다 오래된 것이다. dotnet --version으로 버전을 확인하고 더 새 버전을 설치한다.

저장소와 라이선스

저장소는 네 프로젝트로 나뉜다. JSynth에는 노드 모델과 스크립트 생성기(Model), 뷰 모델과 예제(ViewModels), 뷰와 스타일(Views, Controls, Styles), 글꼴과 아이콘(Assets)이 들어 있다. JSynth.Runtime은 Julia를 찾고 스크립트를 실행하는 세션과 값 보고를 담당한다. JSynth.Desktop은 명령줄 옵션과 플랫폼 설정을 맡는다. JSynth.Tests에는 Avalonia의 헤드리스 플랫폼에서 실행하는 xUnit 테스트가 있다.

프로젝트는 Avalonia 12, ReactiveUI, 코드 편집기용 AvaloniaEdit, 그래프용 ScottPlot을 사용한다.

글꼴은 모두 SIL Open Font License를 따른다. 인터페이스에는 Inter, 코드·값·자료형에는 JuliaMono, 노드 기호에는 Noto Sans Math를 사용한다. 예제에서 데이터를 내려받으면 각 파일 옆에 전체 출처 표시를 기록한다.

  • 레이더: 토론토대학교 Autonomous Space Robotics Lab의 Boreas 데이터셋이며 CC BY 4.0을 따른다.
  • 베어링: NASA Prognostics Data Repository를 통해 제공되는 신시내티대학교 NSF I/UCR Center for Intelligent Maintenance Systems의 IMS 베어링 데이터다.
  • 지진 기록: EarthScope Consortium의 FDSN 웹 서비스를 통해 제공되는 Global Seismograph Network(IRIS/IDA)와 Southern California Seismic Network의 자료다.
  • 영상: CDnet 2014 변화 감지 데이터셋이다.
  • 폭풍 해일: NOAA CO-OPS의 수위와 조석 예측, National Hurricane Center의 HURDAT2 데이터베이스에 기록된 허리케인 Helene의 최적 경로 자료를 사용한다.
  • 항공 교통: OpenSky Network 실시간 API를 사용한다.

버그 신고와 풀 리퀘스트를 받는다. 빌드와 테스트 실행 방법, 풀 리퀘스트 요건은 CONTRIBUTING.md에 설명돼 있다. JSynth는 MIT License를 따른다. 글꼴과 예제 데이터에는 별도로 명시된 라이선스가 적용된다.

JSynth는 Julia 프로젝트와 제휴하거나 그 승인을 받은 제품이 아니다. Julia는 JuliaHub, Inc.의 상표다.