今回はiPhoneから歩数をアップロードする宛先となる歩数収集APIを開発していきたいと思います。
やみくもに作り始めるのではなく、まずは計画から
要件定義
歩数競争アプリは競争と名前がつくように、他人と競いあうことを目的とするので、誰の歩数か識別できる形で歩数を収集する必要があります。
よって収集するデータ項目としては、
・ユーザ名(誰が)
・日時(いつ)
・歩数(何歩歩いたか)
を管理することにします。
日時と歩数についてはiPhoneで歩数を取得するのに用いるヘルスケアアプリの仕様を確認しますが、一定サイクル(数分から数十分単位でまちまち)で歩数を集計し、その集計値を保持しているようです。最終的な集計は歩数を利用するアプリ側に委ねることにし、歩数収集APIではiPhoneのヘルスケアアプリから取得できる形そのままに収集し、DBへ格納することにします。
実現方式
※アプリを開発するにあたって、ハードウェアやソフトウェアをどう組み合わせて機能させるかについてSIerだと「方式」という言い方をしています。
Heroku上にPythonを使ってAPIを作成するにあたって、ここでは軽量でほぼPythonだけで完結する、Flask(フラスク)というWEB-APフレームワークを使います。WEB-APフレームワークはWebサイトやWebアプリを作ってインターネット上に公開するための機能を提供します。PythonだとほかにDjnago(ジャンゴ)なんかが有名です。
収集した歩数は、PostgreSQLに格納します。
APIで情報取得するには、1件づつPOST、JSONでまとめてPOST、iPhone側でファイルにまとめてそのファイルをアップロードといったやり方がありますが、iPhone側で凝ったこともできないので、1件づつPOSTする方式を採用します。
設計
今までの話をまとめるとこんな感じになります。

歩数収集APIで同じユーザ名、日時の組み合わせで登録されると良くないので、歩数を管理するテーブルにはユーザ名と日時の組み合わせでユニークとなるよう、ユニークキー(UK)を設定します。
一応プライマリキー(PK)としてidを持ちますが、これはPostgreSQLで通番が設定されるようにします。後ここではテーブルの物理名を決めておきます。
データベース名:sampledb
テーブル名:step_hist_row
カラム名:id,user_name,step_date,step_count
データベースから作っていく
アプリ開発を始めるにあたって、まずは入れ物となるデータベースから固めていきます。
これが無いとアプリを作りながら確認することが難しくなるので。
ローカル環境にデータベースを作成
PostgreSQL上に今回歩数を管理するデータベースを作成します。
いきなりHeroku Postgres上に作成しても勿論良いのですが、うまくいかないときに切り分けが複雑となるので、一旦ローカル環境で試してから、Heroku上にデプロイする手順で進めます。
※ここからはお使いのパソコンにPostgreSQLのインストールが完了している前提となります。まだの方はこちらをご覧ください。
PowerShellを立ち上げ、初期DBのPostgresに接続します。
その後CREATE DATABASEして新しいデータベースを作成します。
psql -U postgres
CREATE DATABASE sampledb;
\lを入力してデータベース一覧を表示するとsampledbが作成されたことがわかります。
PS C:\Users\User> psql -U postgres
ユーザ postgres のパスワード:
psql (13.3)
"help"でヘルプを表示します。
postgres=# \l
データベース一覧
名前 | 所有者 | エンコーディング | 照合順序 | Ctype(変換演算子) | アクセス権限
-----------+----------+------------------+--------------------+--------------------+-----------------------
postgres | postgres | UTF8 | Japanese_Japan.932 | Japanese_Japan.932 |
template0 | postgres | UTF8 | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres +
| | | | | postgres=CTc/postgres
(3 行)
postgres=# CREATE DATABASE sampledb;
CREATE DATABASE
postgres=# \l
データベース一覧
名前 | 所有者 | エンコーディング | 照合順序 | Ctype(変換演算子) | アクセス権限
------------+----------+------------------+--------------------+--------------------+-----------------------
postgres | postgres | UTF8 | Japanese_Japan.932 | Japanese_Japan.932 |
sampledb | postgres | UTF8 | Japanese_Japan.932 | Japanese_Japan.932 |
template0 | postgres | UTF8 | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 行)
postgres=#次に作成したデータベースsampledbに接続しましょう。
\c sampledb
postgres-# \c sampledb
データベース"sampledb"にユーザ"postgres"として接続しました。
sampledb-#データベース”sampledb”にユーザ”postgres”として接続しました。と表示され、プロンプトもsampledb=#に変化したことがわかります。
テーブルの作成
次にcreate tableでテーブルを作成しましょう。
CREATE TABLE step_hist_row (id serial PRIMARY KEY,user_name TEXT NOT NULL,step_date timestamp NOT NULL,step_count integer default 0, unique (user_name, step_date));
sampledb=# CREATE TABLE step_hist_row (id serial PRIMARY KEY,user_name TEXT NOT NULL,step_date timestamp NOT NULL,step_count integer default 0, unique (user_name, step_date));
CREATE TABLE
sampledb=#id serial PRIMARY KEYはカラムidはserial(通番)でPRIMARY KEY(プライマリキー)と宣言しています。insertする際には通常このカラムに値を指定しません。勝手に通番が振られます。
user_name TEXT NOT NULLはカラムuser_nameはTEXT型でNOT NULL(省略不可)と宣言しています。insertする際に値を省略するとエラーとなります。
step_date timestamp NOT NULLはカラムstep_dateはtimestamp型でNOT NULL(省略不可)と宣言しています。timestamp型は日付と時刻両方を格納する型で、精度はμ(マイクロ)秒まで持ちますが、通常は秒まで扱います。
step_count integer default 0はカラムstep_countはinteger(整数)型で初期値0と宣言しています。insertする際に値を省略すると0が設定されます。
値をinsertして確認してみる
テーブルができたらinsertして実際に値を入れてみましょう。
insert into step_hist_row(user_name,step_date) values (‘tanupapa’,’2001-10-01 20:38:40′);
sampledb=# insert into step_hist_row(user_name,step_date) values ('tanupapa','2001-10-01 20:38:40');
INSERT 0 1
sampledb=#insertできたらselectして確認しましょう。
select * from step_hist_row;
sampledb=# select * from step_hist_row;
id | user_name | step_date | step_count
----+-----------+---------------------+------------
1 | tanupapa | 2001-10-01 20:38:40 | 0
(1 行)
sampledb=#ちゃんとidが設定されて、step_countも初期値の0が入ったことが確認できました。
次回はPythonで作成したアプリから歩数を登録してみます。






コメント