Asopitech With · 健康管理アプリ
Withingsアプリ with Alopex DB & Alopex Skulk
Withingsアプリは、Withingsの機器で測った体重や睡眠、心拍を記録して見せる健康管理アプリです。Alopex DBとAlopex Skulkで同じものを作るとしたら…?
更新: 2026/10/12
どんなサービスか
Withingsのような健康記録のサービスは、体重計、腕時計、血圧計、睡眠のセンサーで、体重と体組成、睡眠、活動、心拍などを毎日計測し、長い期間の傾向として見せます。扱うデータは、機器ごとの計測値の時系列、目標、そして計測から作る日々のスコアです。
データの置き場所
- Skulkの時系列:体重、心拍、歩数、睡眠の計測値を、機器と項目のタグを付けてSkulkに追記します。週ごとの平均や、日ごとの最大と最小は、時間で区切る集計で出します。PromQLでも同じデータを問い合わせられます。
- Alopex DBのテーブル:プロフィール、機器、目標、日々のメモをテーブルに持ちます。目標と、Skulkで集計した値を並べて、達成の度合いを見せます。
機器から届いた計測を書き込むのも、毎朝のスコアを作るのも、アプリのコードです。
配置の形
SkulkとAlopex DBを、端末のアプリに組み込みます。どちらも端末の中で動き、同じエンジンのままサーバー、クラスタへ広げられます。健康のデータは、端末の中のファイルに保存され、端末の外に出ません。Skulkが貯めたデータはParquetなので、ユーザーが書き出して、ほかの分析ツールでそのまま読めます。
Alopex DBとAlopex Skulkが合う理由
健康のデータは、いちばん手元に置いておきたいデータです。Skulkは、時系列の取り込みと集計をアプリの中で行い、Alopex DBは、目標と記録をSQLで支えます。長い期間の健康の記録を、端末の中で扱えます。
コードで見る
目標と記録はAlopex DBが持ちます(計測の時系列はSkulk)。最新の計測を目標と並べる中心だけを取り出したコードです。
import alopex
# 目標と記録は Alopex DB(計測の時系列は Skulk が集計)
db = alopex.Database.open("withings.alopex")
db.execute_sql("CREATE TABLE IF NOT EXISTS goals (metric TEXT, target REAL)")
db.execute_sql("CREATE TABLE IF NOT EXISTS scores (ymd DATE, metric TEXT, value REAL)")
for metric, target in [("weight", 68.0), ("sleep_hours", 7.0)]:
db.execute_sql("INSERT INTO goals (metric, target) VALUES (?, ?)", [metric, target])
for ymd, metric, value in [("2026-10-21", "weight", 69.5), ("2026-10-21", "sleep_hours", 6.5)]:
db.execute_sql("INSERT INTO scores (ymd, metric, value) VALUES (?, ?, ?)", [ymd, metric, value])
# 最新の計測値を目標と並べて、達成の度合いを見せる
rows = db.execute_sql("""
SELECT s.metric, s.value, g.target
FROM scores AS s
JOIN goals AS g ON g.metric = s.metric
ORDER BY s.metric
""")
for row in rows:
print(row["metric"], "今:", row["value"], "目標:", row["target"])目標と、Skulkで集計した計測値を並べて、達成の度合いを見せます。体重・心拍・睡眠の細かい時系列は、Skulkが機器と項目のタグ付きで取り込みます。
時系列はAlopex Skulk、目標と記録はAlopex DB。どちらも端末に組み込めるので、健康アプリの組み合わせとしておすすめします。