지난 넉 달 동안 장치를 하나씩 붙였다.
2월에는 GUI가 없는 칩이었다. WeAct STM32H723을 USB로 꽂고, 보드가 화면 정의를 내놓게 했다. 3월에는 세 회사 계측기를 한 화면에 세웠다. 4월에는 블랙박스에서 영상을 만질 수 있는 도구를 아예 없앴다. 5월에는 온실 센서를 갈아 끼워도 규칙이 안 바뀌게 했다.
매달 하나씩 만들다 보면 좋은 이야기가 늘어나긴 하는데, 그게 정말 하나의 것인지 비슷하게 생긴 네 개인지는 모른다. 그래서 이번 달에는 새 장치를 안 만들고 지금까지 만든 걸 세어 봤다.
세어 본 방법
버전 번호를 대조하는 건 증거가 안 된다. 버전은 손으로 올리는 숫자고, 같은 번호를 붙인 채로 벌어진 사본은 흔하다.
그래서 화면을 실제로 그리고 들고 있는 세 파일의 바이트를 비교했다.
RENDERER="lib/src/renderer/renderer.dart"
FACTORY="lib/src/widgets/widget_factory.dart"
STATE="lib/src/state/state_manager.dart"
각 샘플은 자기 안에 런타임을 벤더링해서 들고 있다. 따로 다운받아서 혼자 돌아가야 하니까. 그래서 사본이 스물일곱 벌이고, 벌어질 기회도 스물일곱 번 있었다.
결과
sample version renderer widget_factory state_manager
bench-instruments 0.5.1 5d4989b6a199 fb156b4a17be 850341b1e8a3
board-over-serial 0.5.1 5d4989b6a199 fb156b4a17be 850341b1e8a3
booking-slots 0.5.1 5d4989b6a199 fb156b4a17be 850341b1e8a3
clinic-flow 0.5.1 5d4989b6a199 fb156b4a17be 850341b1e8a3
club-dues 0.5.1 5d4989b6a199 fb156b4a17be 850341b1e8a3
dashcam-boundary 0.5.1 5d4989b6a199 fb156b4a17be 850341b1e8a3
...
taxi-dashboard 0.5.1 5d4989b6a199 fb156b4a17be 850341b1e8a3
two-shops 0.5.1 5d4989b6a199 fb156b4a17be 850341b1e8a3
waiting-line 0.5.1 5d4989b6a199 fb156b4a17be 850341b1e8a3
27 copies of the runtime · renderer, widget_factory and state_manager
identical byte for byte · 0.5.1
한 줄도 안 벌어졌다.
그런데 뒤에 있는 것들은 하나도 안 같다
이 대조가 의미 있으려면 뒤에 있는 장치가 서로 달라야 한다. 전부 같은 종류였으면 화면이 같은 건 당연한 일이다.
sample device backing
bench-instruments c-sim instruments/instruments.c
board-over-serial hardware STM32H723 over USB serial, ESP32 over Wi-Fi TCP
booking-slots dart server process
greenhouse-independent c-sim greenhouse_bus/greenhouse_bus.c
lcd-hmi c-sim panel_firmware/panel_firmware.c
pos-kiosk-kds c-sim terminal_sim/terminal_sim.c
taxi-dashboard c-sim vehicle_bus/vehicle_bus.c
세 종류다. 진짜 보드(USB 시리얼과 Wi-Fi TCP 둘 다), C로 쓴 펌웨어·버스 시뮬레이터 다섯, 그리고 Dart 서버.
이걸 검증이 명시적으로 지킨다 — 종류가 셋 미만이면 실패하고, 실물 하드웨어가 목록에 없어도 실패한다.
[ "$NKIND" -ge 3 ] || { echo " only $NKIND kind(s) of device"; exit 1; }
grep -q "hardware STM32H723" "$S" || { echo " no real hardware in the corpus"; exit 1; }