GN⁺: 기차를 놓치지 않기 위한 Rust 프로젝트
(lilymara.xyz)- 샌프란시스코에 살면서 대중교통을 많이 이용하게 되는데, 많은 앱들이 도착알림을 전체 경로에 대해서만 제공
- 현재 위치와 가까운 도착알림만 킨들에 표시하도록 만들어서 나가기전에 확인 가능하도록 함
- Kindle을 탈옥하여 USBNet을 활성화하고 SSH를 통해 접근할 수 있도록 설정함.
- 이를 통해 디스플레이를 업데이트하는 cron 작업을 설정할 수 있음.
- Kindle에 이미지를 표시하기 위한 첫 단계로, BART의 실시간 출발 페이지에서 스크린샷을 가져와 Kindle에 전송함.
- 초기 시도에서는 이미지가 심하게 왜곡되어 표시됨.
- 이미지의 크기와 색상 깊이를 조정하여 문제를 해결함.
유용한 이미지 제공하기
- Node.js 서버를 구축하여 Puppeteer를 사용해 BART 페이지의 스크린샷을 찍고, Kindle에 적합한 크기와 색상으로 조정하여 HTTP 엔드포인트를 통해 반환함.
- Raspberry Pi에 서버를 설치하고, cron을 사용해 매분 이미지를 가져오도록 설정함.
처음부터 다시 시작하기 - 아키텍처
- Rust와 Axum을 사용하여 새로운 HTTP 서버를 구축함.
- 511.org의 API를 사용해 Bay Area의 모든 정류장에 대한 도착 시간을 가져옴.
- Skia 그래픽 라이브러리를 사용해 PNG 이미지를 직접 렌더링함.
데이터 가져오기
- 511.org의 API를 사용해 SF MUNI의 도착 시간을 가져옴.
- JSON 응답을 파싱하여 필요한 정류장의 도착 시간만 필터링함.
- 도착 시간을 정렬하여 각 방향별로 표시함.
GN⁺의 정리
- 이 프로젝트는 오래된 Kindle을 활용하여 실시간 대중교통 정보를 표시하는 시스템을 구축하는 과정을 다룸.
- Rust와 Skia를 사용하여 효율적이고 신뢰성 있는 시스템을 구축함.
- 대중교통 정보를 실시간으로 제공함으로써 사용자에게 유용한 정보를 제공할 수 있음.
- 유사한 기능을 가진 프로젝트로는 Raspberry Pi 기반의 스마트 디스플레이 프로젝트가 추천됨.
Hacker News 의견
-
OneBusAway는 오픈 소스 프로젝트로, 많은 사람들이 매일 버스, 기차, 트램, 케이블카의 위치와 도착 시간을 확인하는 데 사용됨
- OneBusAway 서버가 있는 도시에서는 새로운 SDK를 사용하여 맞춤형 앱을 개발할 수 있음
- 서버가 없는 도시에서는 Docker 이미지와 OpenTofu 설정을 통해 GTFS 및 GTFS-RT 피드를 REST API로 변환할 수 있음
- 미국의 모든 교통 기관은 새로운 연방 규칙에 따라 최소한 정적 일정 데이터를 GTFS로 공개해야 함
- 소프트웨어 개발에 관심이 있는 개발자를 항상 필요로 하며, 모든 수준과 언어의 개발자를 환영함
- 특히 iOS 개발자가 250,000명의 일일 사용자에게 필요한 개선을 제공하는 데 필요함
-
다른 사용자는 OneBusAway와 유사한 기능을 제공하는 Öffi라는 앱을 언급함
-
BART와 MUNI는 General Transit Feed Specification을 지원하며, 표준 방식으로 데이터를 얻을 수 있음
-
Boston에서 차 없이 살았던 사용자는 다양한 경로를 통해 목적지에 도달하는 방법을 찾았으며, "다음 출발" 뷰가 유용했음을 언급함
-
영국에서는 역 출발 보드를 모방한 출발 보드를 구매할 수 있음
-
Washington, DC에서는 버스와는 작동하지만 기차와는 작동하지 않으며, 기차와의 호환성을 위한 도움이 필요함
-
Kindle을 탈옥하지 않고도 웹 브라우저를 사용하여 날씨, 교통, 뉴스 화면을 쉽게 작성할 수 있음
-
SF에 사는 사용자는 iOS 앱 "A Better Ride"를 개발하여 주변 정류장의 출발 시간을 보여주고, 교통을 예측 가능하고 탐색 가능하게 만듦
-
사용자는 Google Maps와 같은 대안을 원하며, 기차가 고장 나거나 노선이 차단된 경우 대체 경로를 제공받고 싶어함
- 예를 들어, 도쿄에서 시부야에서 아자부주반으로 가는 다양한 경로와 각 경로의 장단점을 설명함
-
Lenovo ThinkSmart View 태블릿을 사용하여 지역 교통 기관과의 통합을 통해 다양한 기능을 제공하는 시스템을 구축함