はじめに

2023年10月-11月に開催された,JPHACKS 2023 に参加した記録をまとめる。 チーム「B4_M2_D3 Last Year」にソフトウェアエンジニアとして参加した。

私は技術的な話を中心に記録する。 チームのアイデアやプレゼン資料については,Toku氏の note にまとめてられているので,そちらを参照されたい。

JPHACKS 2023 とは

イノベータを目指す学生のための日本最大のハックイベント

JPHACKS(ジャパンハックス)は、学生を対象にした日本最大規模のハックイベントで、 2014年より全国の複数都市で開催されています。 本年度は、記念すべき10周年!日本全国4拠点でみなさんも一緒にJPHACKSを盛り上げていきましょう!

1週間の事前学習期間「Learning Sprint(ラーニングスプリント)」を経て「Hack Day(ハックデイ)」でチーム開発をおこないます。 今年の「Hack Day(ハックデイ)」は2019年ぶりにオフライン開催が復活し、日本全国4つのオフライン会場とオンライン会場の5会場にて同時開催されます。 Hack Dayの成果物をもとに、オンライン審査を経て選ばれたファイナリスト達がピッチをおこなう「Award Day(アワードデイ)」を開催いたします。 Award DayではJPHACKS Innovator認定のほか、様々な賞を用意しています。 皆さんの新しい未来を共に切り拓きましょう! – JPHACKS 2023

日本最大級のハッカソンで,全国の複数都市で開催される地方予選・Hack Day と,東京で開催される Award Day から構成される。 テーマは自由で,製作物もハードウェアからソフトウェアまで様々。

チーム B4_M2_D3 Last Year

概要

今回もランダムで参加した。チーム名は B4_M2_D3 Last Year である。 由来は,チーム全員が大学の各最終学年であることから。 読み方は「びーよん・えむつー・でぃーすりー・らすといやー」,B4だけ日本語読み(笑)。 また,「Last Year」は「去年の」という意味であるため, “The” をつけないといけない(笑)。

メンバーと担当

  • motty

    • Arduino のソフトウェア
    • サーバサイド API の実装
    • インフラ・デプロイ
  • Toku

    • アイデア・プランナー
    • プレゼン資料
  • A 氏

    • Arduino のソフトウェア
    • ハードウェア
    • プレゼン

革靴メンテなんです!!

概要

「革靴メンテなんです!!」は革靴のメンテナンスをサポートするアプリケーションである。

リポジトリは GitHubにて公開している。

革靴を履いた後,体温で革は伸びている&湿気ており,そのままでは革靴が傷む。 そこで,革靴のメンテナンスをサポートするアプリケーション・ハードウェアを作成した。

ハードウェア

マイコンに ESP32 および M5Stack 社の製品を中心に利用した。 M5Stack を利用することで,ハードウェアの開発期間を短縮した。

センサは温湿度センサを3つ搭載した。 それぞれ,革靴の中1・革靴の中2・室内の温湿度・を計測する。 革靴が2つある理由は,比較実験のためである。

駆動系に乾燥用の DC モータを利用した。

Arduino のソフトウェア

ここをメインに担当した。 ハードウェアの開発は私と A 氏の2人で行った。

開発環境について

開発ソフトウェアとして PlatformIO を利用した。 今回は,多くのマイコン(ESP32M5Stack Core2M5Stick CM5StickC Plus)を試したので,PlatformIO は便利だった。

platformio.ini を書き換えることで,開発環境を切り替えることができる。

[platformio]
default_envs = m5stickc
workspace_dir = ./arduino/.pio
include_dir = ./arduino/include
src_dir = ./arduino/src
lib_dir = ./arduino/lib
data_dir = ./arduino/data
test_dir = ./arduino/test

[common]
lib_deps =
 adafruit/DHT sensor library@^1.4.4
 me-no-dev/ESP Async WebServer @ ^1.2.3
 bblanchon/ArduinoJson@^6.21.3
 m5stack/M5Stickc@^0.2.5

[env:m5stickc] 
platform = espressif32
board = m5stick-c
framework = arduino
monitor_speed = 115200
lib_deps =
 ${common.lib_deps}

と,env を増やすことで,共通部分と個別部分で環境を切り分けた。

JsonExporter

温度や湿度は数秒単位の計測で間に合い,長時間の観察を要する。 そこで,デバッグを容易にするため,計測データを JSON 形式で出力する機能を実装した。

ESP32 の HTTP Server 機能を利用して,HTTP GET リクエストを受け取ると,JSON 形式で計測データを返す。 また,Python ソフトウェアで計測データをリアルタイムで表示できるソフトを作成した。

ArduinoJson

Arduino Json は JSON を扱うためのライブラリである。 HTTP Server で JSON を返す,サーバにデータを送信する際に利用した。

ただ,データのシリアライズの負荷が重く,今後の利用は十分に注意する必要があると思った。

サーバサイド

サーバサイドは Python・FastAPIStreamlit を利用した。 技術選定の理由は,Python の経験が全員ある点,私が LineAPI・FastAPI・マイコンの組み合わせでの開発経験があったからである。

Rye

Rye は mitsuhiko氏の開発した,Python の ライブラリマネージャである。 Rust で記述されており,高速に動作する点が魅力である。

今回は,Rye を利用して,Python のライブラリを管理した。 Rye の lock ファイルの形式は requirement.txt と同じであるため,Dockerfile でマルチステージビルドが必要なく,非常に便利であった。

FROM python:3.11-slim

WORKDIR /src
COPY ../requirements.lock ../pyproject.toml ../README.md /src/

ARG UID=1000
ARG GID=1000

RUN groupadd -g $GID dev &&  \
    useradd -l -m -u $UID -g $GID dev && \
    pip install -r requirements.lock --no-cache-dir

USER dev

と,非常に記述量を短縮できた。

デプロイとインフラ

デプロイ関係の構成図はこんな感じ。

デプロイ構成図

Build

自動コンテナビルドに GitHub Actions を利用した。

Kubernetes

デプロイ先として,自宅サーバ上に構築している Kubernetes クラスタを利用した。

マニフェストは内部リポジトリを利用して,Argo CD でデプロイした。 (といっても,すぐに反映させたかったから,ほぼ手作業でデプロイしていた)

今年の夏ごろから Kubernetes を練習していたが,今回のハッカソンで初めて利用した。 なお,AwardDay 2日前の深夜3時ごろに,MetalLB の設定ミスでクラスタが壊れかけた。

また,開発には Docker Compose 環境も併用していた。

結果

神戸予選

  • サントリーホールディングス賞
    • 革靴のメンテナンスを通して,革靴の寿命を延ばすことは SDGs にもつながるということで,受賞した。
    • 副賞として,サントリーの飲料24本と,ハーゲンダッツのクーポンをいただいた。

Award Day

  • ウルシステムズ賞
    • 作りたいものを作っていた情熱を評価していただいて,受賞した。
    • 副賞として,Amazon ギフト券と,ウルシステムズ会長とごはんをいただく予定。
  • JPHACKS Innovator 認定

    JPHACKS Award Dayにてデモ、展示会を実施したチームの中から、組織委員会及び審査委員会によって、優れていると判断されたプロダクト及びチームがJPHACKS Innovator認定として表彰されます。

  • JPHACKS Best Hack Award
    • JPHACKS Award Dayにてデモ、展示会を実施したチームの中から、組織委員会及び審査委員会によって、審査基準に則った採点を実施し、集計の結果最も高得点を獲得したチームがJPHACKS Best Award として表彰されます。(Best Audience Awardとのダブル受賞もあり)

    • 優勝した

感想とか

感想

  • 多分,これが学生最後のハッカソン
  • 優勝できてとても良い思い出になった

技術面

  • 今回は,ハードウェア・ソフトウェア・インフラを担当した
  • 特にインフラは 5月の GMO のイベントHackBar神戸 など,様々な場所で会った"つよつよな"人達から学んだ経験が活きた

チームについて

  • 実は「できればフロントの人と組ませてください」と備考欄に書いて応募した
  • 全員ハードウェアの人で,ぶっちゃけ,やばいと思った(笑)

ライバル

  • KB2316:ねこみみハリケーン
    • HackDay 2日目に見たとき,3D プリンタの寸法ミスでセンサがはまらず,動作しない状況だった
    • そこで,手持ちの機材(ドリル)を使って穴をあけ,センサを取り付ける手伝いをしてた
    • 神戸会場で優勝 & Huawei 賞を受賞しており,うれし悔しい複雑な気持ちであった(笑)
  • NG_2312:とばかかし
    • 8月に参加した ElectricSheep で チーム Flügel のメンバーが参加していた

今後

このプロジェクト自体を継続開発したいと考えている。 また,未踏か未踏アドバンストへの応募も検討している。