1P by GN⁺ | ★ favorite | 댓글 1개
  • pISSStream은 국제우주정거장(ISS)의 소변 탱크 용량을 실시간으로 보여주는 앱으로, macOS 메뉴 바와 iOS, watchOS, visionOS를 지원함
  • 데이터는 NASA의 공식 공개 ISS 텔레메트리 스트림을 Lightstreamer로 받아오며, 지상국이 신호를 수신 중일 때 최신 탱크 채움 비율을 표시함
  • macOS에서는 메뉴 바에 🧑🏽‍🚀🚽와 채움 비율을 보여주고, 연결 또는 텔레메트리 신호가 끊기면 🧑🏽‍🚀❗와 마지막 수신값, “Connecting” 또는 “No Signal” 상태를 표시함
  • iOS와 watchOS는 단순 인터페이스로 실시간 탱크 수위를 보여주며, visionOS는 ImmersiveSpace API 기반 3D 시각화와 공간 오디오를 제공함
  • 첫 Swift 및 Apple 플랫폼 앱이라 오래된 데이터 처리와 오류 처리에 적극적이지 않으며, 버그 수정용 Pull Request는 받지만 다른 ISS 통계 추가 계획은 없음

pISSStream이 하는 일

  • pISSStream은 International Space Station의 소변 탱크 용량을 실시간으로 보여주는 앱임
  • 지원 플랫폼은 macOS, watchOS, iOS, visionOS
  • 주요 기능은 다음과 같음
    • ISS 소변 탱크 수위 실시간 모니터링
    • macOS 메뉴 바 통합
    • iOS 및 watchOS 앱의 실시간 업데이트
    • visionOS의 몰입형 3D 시각화
    • 몰입형 화면에서 deep-space soundscape 기반 공간 오디오
    • Vision Pro용 향상된 UI와 커스텀 앱 아이콘
    • NASA 공식 공개 ISS 텔레메트리 스트림을 Lightstreamer로 사용

설치와 빌드 조건

  • macOS는 최신 릴리스 DMG를 Download 링크에서 받을 수 있음
  • iOS, watchOS, visionOS는 Apple 보안 모델 때문에 소스에서 빌드하고 자체 개발자 계정으로 서명해야 함
  • 빌드 전제 조건은 다음과 같음
    • Xcode 15.2 이상
    • Apple Developer account
    • iOS 앱용 iOS 17.0 이상 기기
    • Apple Vision Pro 또는 visionOS 시뮬레이터
  • 기본 빌드 절차는 저장소를 클론한 뒤 pISSStream.xcodeproj를 Xcode에서 열고, Signing & Capabilities에서 개발팀을 선택한 뒤 대상 기기에서 빌드 및 실행하는 방식임
  • Apple Developer account가 없어도 무료 프로비저닝 프로파일로 시뮬레이터나 기기에서 최대 7일 동안 실행할 수 있음

visionOS 개발과 배포

  • visionOS 개발에는 Xcode에 visionOS SDK가 설치되어 있어야 함
  • 앱은 3D 시각화 경험을 위해 ImmersiveSpace API를 사용하고, 몰입감을 높이기 위해 공간 오디오를 포함함
  • 요구 사항은 다음과 같음
    • Apple silicon Mac
    • Xcode 15.2 이상
    • Apple Developer Account
    • 개발자 모드가 활성화된 Vision Pro
    • 같은 Wi-Fi 네트워크에 연결된 Mac과 Vision Pro
  • 무선 개발 절차는 Vision Pro에서 Developer Mode와 Remote Development를 허용한 뒤, Xcode의 Devices and Simulators에서 Vision Pro를 페어링하고 빌드 대상으로 선택해 실행하는 방식임
  • 흔한 문제는 다음과 같음
    • “Device not found”: Wi-Fi 연결 확인 필요
    • “Unauthorized device”: Vision Pro 재페어링 필요
    • “Build failed”: 프로비저닝 프로파일 업데이트 필요
    • “No paired Vision Pro found”: Vision Pro 연결 및 페어링 확인 필요
    • “Invalid signing”: 개발자 계정과 프로비저닝 프로파일 확인 필요

플랫폼별 사용 방식

  • macOS에서는 Lightstreamer 연결과 ISS 텔레메트리 신호 수신이 모두 정상일 때 메뉴 바 항목에 🧑🏽‍🚀🚽 와 채움 비율이 표시됨
  • 연결 또는 ISS 텔레메트리 신호가 끊기면 메뉴 바 항목은 🧑🏽‍🚀❗ 와 마지막 수신값을 표시하고, 메뉴에는 “Connecting” 또는 “No Signal”이 표시됨
  • iOS에서는 앱을 실행하면 단순한 인터페이스로 현재 탱크 수위를 볼 수 있음
  • visionOS에서는 ISS 폐기물 탱크를 몰입형 3D로 보고, 실시간 채움 수위를 시각화함
  • watchOS에서는 손목에서 ISS 폐기물 탱크 채움 수위를 실시간으로 추적함

제작 동기와 한계

  • 제작 동기는 우주정거장의 화장실에서 나오는 실제 실시간 텔레메트리 데이터를 읽는 농담 앱을 오후에 만들 수 있다는 점이 “우스꽝스럽지만 동시에 놀랍다”는 데 있음
  • Swift를 배우기 위한 좋은 핑계이기도 했지만, 핵심 동기는 앱 자체의 터무니없음이었음
  • 알려진 문제는 다음과 같음
    • 첫 Swift 및 Apple 플랫폼 앱이라 좋은 코딩 관행의 정점은 아님
    • 작은 계기로도 예상 밖 방식으로 깨질 수 있음
    • 오래된 데이터에 적극적으로 대응하지 않음
    • 오류 처리에 크게 신경 쓰지 않음
  • 버그 수정용 Pull Request는 환영함
  • 데이터 스트림은 ISS Mimic을 통해 알게 되었고, ISS Mimic에는 소변 탱크 수위보다 훨씬 많고 흥미로운 통계가 있지만 pISSStream에는 추가하지 않을 예정임

댓글과 토론

Hacker News 의견들
  • https://iss-mimic.github.io/Mimic/에서 데이터 스트림을 알게 됐는데, 소변 탱크가 얼마나 찼는지보다 훨씬 많고 흥미로운 통계가 있음
    “그중 어떤 것도 추가하지 않을 것이다”라는 문장이야말로 프로젝트의 비목표를 전달하는 완벽한 방식임
    오픈소스 커뮤니케이션 모범 사례로 배울 만함

    • 왠지 통신이 모두 끊기고 작동하는 센서가 소변 탱크 센서뿐인 상황이 떠오름
      우주비행사들이 탱크 변화량을 조절해 모스 부호로 통신하고, ADHD가 있으면서 이 메뉴바 앱을 설치한 누군가가 상황을 알아채 모두를 구하는 영화가 될 듯함
    • https://iss-mimic.github.io/Mimic/뿐 아니라 프로젝트 페이지도 꼭 읽어볼 만함: https://github.com/ISS-Mimic/Mimic
    • 저 데이터가 전부 있으면 ISS와 승무원을 상대로 꽤 지저분한 사회공학 공격을 하는 데 도움이 될 것 같음
      이제 남은 문제는 거기까지 몸을 어떻게 올려 보내느냐임
    • 이런 위험한 정보를 알아버리면 안 됐음
      ISS의 SVG를 만들고 이 데이터로 애니메이션까지 붙이는 데 시간을 너무 많이 쓰고 싶어짐
    • 이제 에어록 압력 값에 맞춰 리베이스되는 토큰을 만들 차례임
      Real World Assets(tm)로 붐 세대를 낚을 수 있겠음
  • Bluesky에서 50점 넘은 HN 글을 올리는 봇을 팔로우하는데, 익숙한 GitHub 링크가 갑자기 보여서 놀랐음
    약 5일 전에 직접 Show HN으로 올렸던 글(https://news.ycombinator.com/item?id=42464454)이라 갑자기 왜 뜨나 했더니, 사실 내 글이 아니었음
    지난 15년 정도 만든 오픈소스 프로젝트 중 이게 가장 인기 있는 프로젝트가 된 게 진심으로 기쁨
    “근데 왜 만들었나?”라는 질문에는 “웃기다고 생각해서”가 솔직한 답이고, Swift 첫 프로젝트로 단순한 걸 찾다가 iss-mimic을 보고 바로 이걸 해야겠다고 느꼈음

    • 여기에 AI를 붙여서 수익화할 계획도 있나?
    • 나도 비슷한 걸 해봤는데, ISS 위치를 이용해 우주비행사들에게 “가장 많이 오줌 맞는 나라”를 계산했음
      데이터용 스크립트는 어딘가 작동하는 게 있을 텐데, 아쉽게도 순위표 웹사이트까지 만들지는 못했음
    • 이걸 라이브러리로 만들 생각은 없나? 모든 Swift 앱의 정보 패널에 이 중요한 지표가 필요해 보임
    • 내가 만든 이 지표와 데이터 소스를 결합해야 할 것 같음: https://www.secretbatcave.co.uk/electronics/shart-o-meter/
    • 소변을 물로 재활용하는 방법을 개발 중인 걸로 알고 있음
      물 수위도 표시하고, 두 탱크 사이에서 전환되는 순간을 보여줄 수 있나?
  • NASA에서 이 원격측정 데이터를 ISSLive 일부로 공개했던 팀의 기술 리드 겸 비행 관제사였음
    이 API를 ISS Mimic이 사용했고, 당시 우리는 몇 년 동안 대중에게 우주정거장 프로그램을 알렸음: https://youtu.be/xAhw_8B25N0?si=OZXH9sZ0bY_iX40V
    12년 뒤에 PissStream이 나오다니 꽤 웃김
    라이브스트림 서버가 잘 쓰이고 있어서 좋고, 사실 다른 좋은 원격측정 데이터도 많음
    ISSMimic을 좋아함

    • 미안하지 않고, 또 할 것임
      진지하게 말하면 ISS의 실시간 원격측정을 이렇게 극도로 하찮게 쓰는 사례도 드물겠지만, 이런 바보 같은 일이 가능할 뿐 아니라 아주 쉽게 된다는 게 놀라움
      처음부터 가능하게 만든 NASA와 관련자들에게 경의를 표함
      ISS Mimic 대시보드를 보니 흥미로운 원격측정 데이터가 정말 많다는 것도 새삼 느꼈음
    • ISS가 최종적으로 종료되고 파괴될 때 원격측정 스트림이 끝까지 계속될지 궁금함
      그렇다면 그 순간이 오면 터미널 앞에서 정거장의 마지막 작별을 기다리고 싶어짐
    • 음악이 Star Trek Voyager 테마를 떠올리게 하는데, 실제로는 같은 음악이 아니라는 점이 재미있음
  • 이걸 웹으로 포팅해 봄: https://gistpreview.github.io/?76f03f49be58344bfa64c9d5d9f0ec29
    소스 코드는 여기 있음: https://gist.github.com/simonw/76f03f49be58344bfa64c9d5d9f0ec29
    Swift GitHub 저장소 전체를 Gemini 2.0에 붙여 넣고 웹페이지로 포팅해 달라고 해서 만들었음: https://gist.github.com/simonw/b4aec4e879e50ac74f6f9cc6e1cdc0a1

    • 그 녀석이 기본적인 오류 처리까지 넣었음
    • Claude와 ChatGPT-4o에도 비슷하게 시켜봤는데 결과 편차가 꽤 컸음
      Aider에 같은 프롬프트를 주고 “Swift 코드와 같은 API를 쓰라”고 덧붙이니 한 번에 됐지만, Claude는 그냥 “웹페이지”라고만 하면 한 번에 못 했고 몇 번 더 프롬프트가 필요했음
      ChatGPT-4o는 lightstream.js를 불러올 URL을 환각했고, 결국 직접 디버깅해야 했음
      이렇게 작은 작업에서도 프롬프트 변화에 따라 결과가 크게 달라지니, LLM 코딩 보조가 두 번째 강림처럼 보이는 사람과 전부 허풍이라고 보는 사람이 HN에서 매번 갈리는 이유를 이해하기 쉬워짐
    • 윤리적으로 쓰려면 고마움에 대한 출처 표기도 포함해야 함
    • 누가 LLM이 Stack Overflow 복붙보다 나을 게 없다고 하면 이 웹 포팅을 인용할 생각임
  • 스트림 처리의 좋은 예시임

  • ISS Mimic 팀원인데, 마음에 듦. 훌륭한 작업임
    우주비행사 프라이버시가 걱정된다면, 소변 탱크 수치는 승무원의 직접적인 소변 추가를 반영하지 않음

    • ISS Mimic에 비하면 “훌륭”은 조금 과장일 수 있지만 칭찬은 감사히 받겠음
      그 수치가 실제로 무엇을 반영하는지도 궁금함
      아직 UWMS의 영혼 깊숙한 곳까지 들여다보지는 못한 듯함
    • 그렇다면 실제로는 무엇을 반영하는지 진심으로 궁금함
  • 변수명이 정확함
    static let pissYellowLight = Color(red: 0.95, green: 0.85, blue: 0.2)
    static let pissYellowDark = Color(red: 0.7, green: 0.6, blue: 0.1)

    • 원래 메뉴바 항목의 배경색과 전경색을 바꾸려 했는데, SwiftUI의 MenuBarExtra 레이블은 적어도 바로 보이는 방식으로는 색상 변경을 지원하지 않는 듯했음
      레이블 커스터마이즈를 포기한 뒤 사용하지 않는 enum을 지우는 걸 자연스럽게 잊어버림
  • apolloinrealtime.org 만든 사람이고, 지금은 ISS 프로그램에서 일하고 있음
    경의를 표함

    • Apollo in Real Time은 압도적으로 훌륭한 자료임. 고마움
  • 이게 공개 정보인 줄 몰랐음

    • 공적 자금으로 운영되니까 공개됨
    • API 하나가 정보공개청구를 대신했을 수도 있음
  • 승무원이 소변볼 때마다 알림을 보낼 수도 있겠음

    • 그러면 양으로 어느 우주비행사인지 식별할 수 있지 않을까?
      다른 화학 분석 데이터까지 있다면 가능할 수도 있음
      NASA는 그 분석 데이터를 데이터 수집광들에게 팔아 예산 문제를 해결하고, ISS의 모든 화면에 광고를 띄울 수도 있겠음
      오히려 아직 YC 스타트업이 이런 스마트 변기를 내놓지 않았다는 게 놀라움