宅配物をコマンドライン上で追跡する

lapla

https://slide.lapla.dev/zatsu/takuhai(.pdf)
whoami
  • 筑波大学情報科学類4年
  • 興味:システムプログラム,クラウドネイティブな技術 etc...
  • よく書く:Rust,TypeScript
  • イーブイ
  • 突然ですが
    • 宅配物を受け取る機会は多いですか?
    • 宅配業者って,送り主が依頼するからバラバラじゃないですか?
      • 日本国内ならクロネコヤマト,佐川急便,日本郵便などが主流
    • 各宅配業者ごとに,荷物に対して追跡番号が発行されて,それを元に追跡できるサービスがある(場合もある)

    こういうの

    problem formulation
    • 追跡サービスがあるのは結構だが,以下のような課題がある
      • 業者ごとにページがバラバラ(仕方ないけど)
        • 統一されたインターフェースから追跡情報にアクセスしたい
      • 追跡番号はメールで届く場合が多い(と思う)ので,他の雑多なメールと混ざる可能性がある
        • 追跡情報だけを隔離して管理したい
        • 各荷物に対してメールから追跡番号を追跡サービスにコピペするのも面倒(特に複数の荷物の情報を一度に見たいとき!!)
      • 追跡番号だけでどの荷物なのか分かるほど,一般人の記憶力は良くない
        • エイリアスを張りたい(ex: 宅配番号が"123456789"の荷物はこういう荷物という説明)
    • どう解決するか
      • プログラマーなら日常的にシェルを触っている
      • そもそも追跡情報を表示するだけならリッチなUIは必須ではない

    \rightarrow コマンドライン上で宅配物の追跡情報を管理するツールを作りたい

    作った
    • lapla-cogito/takuhai
    • Go製
    • 現状クロネコヤマト,佐川急便,日本郵便に対応
    • 以下の機能を持つ(日本語で書いた使い方あり)
      • 追跡番号を使った宅配物の登録(エイリアスの付与は任意)
      • 宅配物の削除
      • 登録された宅配物の一覧表示
      • 登録された宅配物の追跡情報を最新に更新して表示
      • エイリアスの張替え
      • 追跡情報のインポート・エクスポート(後述)
    どうやってる?追跡情報保管編
    • yamlに入れている
    • Goは標準でyamlのmarshal/unmarshalをサポートしている
    - company: sagawa
      tn: "123456789"
      alias: 荷物だよ~
      timeline:
      - date: 09/05 14:49
        status: 集荷
        office: 適当営業所
      - date: 09/05 18:43
        status: 輸送中
        office: 適当中継センター
    .
    .
    .
    
    どうやってる?追跡情報取得編
    • 各宅配業者の追跡サービスが裏でどのような通信を行っているかを解析して,適切なリクエストの送り先と形式を見定める
    • 大体謎のエンドポイントに謎のパラメーターとして追跡番号を投げるとHTMLが返ってくるのをやっている気配があるので,それをGoで模倣してレスポンスをパースして情報を取り出す
    追跡情報のインポート・エクスポート
    • 時には荷物の追跡情報を複数人でシェアしたいこともある
      • takuhaiを使えば各自が荷物を登録して追跡できる
      • しかし,それも複数の荷物があると各自がやるのは面倒
    • そこで,追跡情報のインポート・エクスポート機能を実装
      • エクスポートするサブコマンドを叩くと,指定した荷物1^1の現在の追跡情報が乗ったyamlファイル2^2が生成される
      • そのyamlファイルを共有された人が,インポートするサブコマンドを叩くと,その人のtakuhaiに荷物が登録される
      • ほぼエクスポートされたyamlの共有だけで済むので楽

    1: 複数指定可
    2: 当然情報保管用のyamlとは別のファイル