Oracle CloudのAlways FreeのAPEX環境を使って、我が家の体重管理アプリを作ってみた

#背景
体重の増加が気になる日々なので、我が家で体重計を買うことになりました。Wi-Fi対応の体重計でアプリを使って健康管理、、と思ったのですが、結構なお値段がするので断念。だったら自分で作ってみようと思い、我が家の体重管理をするアプリを自分で作ってみることにしました。

何で作ろうかなと思ったのですが、コストをかけずに手っ取り早く作りたかったので、Oracle Cloudの無期限で無料のAlways Freeに含まれる、Auonomous DBのAPEX機能を使って、我が家の体重管理アプリを作ってみました。

#参考文献
###実施に参考になるリンク
- [Qiita記事： Oracle Cloud Free Tierにアカウントを登録してみる(2020年1月版)](https://qiita.com/hrkt/items/223b02461bed5cee9d19)
- [Autonomous Database(ADB,ADW,ATP)の作成とSQL Developerからの接続](https://qiita.com/ts_carp/items/a22bdd565bdf5c6e4ea8)
- [Autonomous Databaseの作成手順（Always Freeデータベース作成方法）](https://www.hitoriit.com/entry/2019/10/22/080000)
- [Oracle APEXを触ってみた](https://www.s-style.co.jp/blog/2019/11/5334)
- [Oracle APEXユーザードキュメント](https://docs.oracle.com/cd/F23071_01/buildapplications.html)
- [Oracle APEX勉強会 - 認証と認可の実装を学ぶ](https://speakerdeck.com/ujnak/oracle-apexmian-qiang-hui-ren-zheng-toren-ke-falseshi-zhuang-woxue-bu)

###その他、参考文献
- [Oracle APEXサイト](https://apex.oracle.com/ja/)
- [Oracle APEX備忘録](http://apexugj.blogspot.com/)


#手順
以下のような手順で実施します。
1.Oracle Always Free環境を入手する
2.Oracle Autonomous Datawarehouseを構築、起動する
3.APEX セットアップ（Work Spaceの作成）
4.APEXを使ってアプリケーションを作成する
　４-0.作りたいものをデザインする
　４-1.必要なテーブルを作る
　４-2.アプリケーションをとりあえず作る
　４-3.アプリケーションを修正する


###1.Oracle Always Free環境を入手する
上記参考文献の「Oracle Cloud Free Tierにアカウントを登録してみる(2020年1月版)」 を参考にOracle CloudのFree Tierにアカウントを登録し、Oracle Cloudの環境を使えるようにします。


###2.Oracle Autonomous Datawarehouseを構築、起動する
上記参考文献の「Autonomous Database(ADB,ADW,ATP)の作成とSQL Developerからの接続」 を参考にOracle CloudのFree TierのOracle Autonomous Databaseを構築します。今回は、Oracle Autonomous Datawarehouseを構築しました。
上記参考文献の「Autonomous Databaseの作成手順（Always Freeデータベース作成方法）」 に記載のとおり、Always Free環境を選択します。
Always Free環境は１コア限定ですが、我が家の体重管理アプリなので、十分ですね。


###3.APEX セットアップ（Work Spaceの作成）
上記参考文献の「Oracle APEXを触ってみた」 を参考に、Autonomous DatawarehouseのADMINユーザーでログインし、APEX用のユーザーとWorkSpaceを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/1d4cc490-3796-d07d-514e-f10aceb8f323.png)


###4.APEXを使ってアプリケーションを作成する
いよいよアプリケーションを作ります。

####4-0.作りたいものをデザインする
どんなものを作るのか、~~紙ナプキンに~~ 息子の勉強用ノートに書いてみました。（汚い字ですいません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/31e79f52-7de7-3041-4e14-f86e52b6300c.png)
・家族で毎日体重が記録でき、グラフで推移が見れること
・子供の分の入力もできるように、誰のデータでも入力できること
・家族なので他の人の体重が見れてもOK
・ケータイから簡単に入力したい
・レイアウトとかはこだわらなくてもいい、が子供でもわかるように日本語で表示

####4-1.必要なテーブルを作る
正直一個のテーブルで十分じゃないのか、、と思って作ったのですが、やはりログイン認証あったほうがいいなと思い、以下2つのテーブルを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/4e19f586-fa4e-e87f-39d0-92649b68e22b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/b9bbd76e-3408-1574-34c2-b9fbcff25251.png)


で、このDDL文を作るわけですがメンドクサイ。
実はAPEXにはクイックSQLという機能があり、こんなテーブルがほしいと書いて、SQLの作成ってボタンをポチッと押すと、自動的にDDL文を作ってくれて必要な制約などを作ってくれます。
これめちゃくちゃ便利でした。誰だってよくわからないDDL書きたくないので。

実際今回つくったクイックSQL文はこちら。

```sql
USERS
  NAME vc20
  PASSWORD vc20
 
WEIGHT
   USER id
   MEASURED_DATE    DATE
   WEIGHT num
   FEELING vc20
   MEMO VC4000
```
このスクリプトを実行するだけで、テーブルが生成されるだけでなく、トリガーとか、こんなのいるのかなと思うところもあるのですが、必要と思われるDDL文が自動的に作成されます。
あとはこれを、一回保存したのち、実行するだけ。便利。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/106b7da2-b311-e9ab-5e77-bd8462898db0.png)


####4-2.アプリケーションをとりあえず作る
実は4−1でテーブルを作ったあと、名前を入れて「アプリケーションを作成する」を押すと、いきなりアプリケーションができてしまいました。これで十分じゃないかと思うようなアプリケーションです。
APEXすごい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/976c20cb-0246-c5b4-727b-b0a5ef89f6a3.png)

ここまでできてるので、とりあえず動かしてみて、もともと作りたかったアプリとの差分を見つけ出し、工数と相談しながら、修正点の範囲と優先順位付けを把握します。

####4-3.アプリケーションを修正する
最初に作りたかったアプリをイメージしながら、手を加えるところ、妥協するところを、使う家族の顔を思い浮かべながら洗い出しました。その結果、以下に手を加えることにしました。

１）ユーザーの登録画面の変更
　　　日本語表示、必須項目の設定
２）ユーザーの表示画面の変更
　　　日本語表示
３）体重の入力画面の変更
　　　日本語表示、必須項目の設定、選択入力の設定
４）ホーム画面にグラフを表示する
　　　グラフ表示
５）ログイン画面でのユーザー名/パスワード認証
６）アプリケーションの日本語表示
７）展開するためのURL短縮

実際手を加える前に、このアプリケーションがどういう構成で成り立っていて、どこに手を入れるべきか全体を把握してから実施するのが便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/93f75553-f8be-494a-d9c5-30e6edb54733.png)

ここから１−７）の修正をしていくのですが、正直ほとんど画面キャプばかりになるので、PPTにまとめましたので、後述するリンクからPDFを参照してください。
ここではいくつかの実装する上でのポイントや便利だなと思ったことをご紹介します。

#####SQLオブジェクトブラウザ
作成していく上で、どうしてもテーブルの修正だったり、テーブルに直接値を入れる必要がでてくることがあると思います。そんな場合にもSQLを打たずに、画面から変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/a90b51f2-cec1-9a5d-23cf-fa273707d798.png)

#####認証について
ログインの認証は認証スキームに関数を登録します。

```sql
function my_authentication (
    p_username in varchar2,
    p_password in varchar2 )
    return boolean
is
    l_user users.name%type := upper(p_username);
    l_pwd users.password%type := p_password;
    l_id   users.id%type;
begin
    select id,password into l_id, l_pwd
      from users
      where upper(name) = upper(l_user)
        and password = l_pwd;
     return true;
exception
    when NO_DATA_FOUND then return false;
end;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/8b9161ad-d4d4-b38d-21a8-7f94f9bce5da.png)


今回は簡易アプリを作ってみたかったので、パスワード簡略化されてますが、、実際は、パスワードをハッシュして保存するとか、ハッシュもそれだけではなく、ソルトをつける、繰り返しやる、など、いろんなことをしないと人前にだせないかと思います。
そこらへんは参考文献の「Oracle APEX勉強会 - 認証と認可の実装を学ぶ」を参照してください。**STANDARD_HASH関数**を使うようです。

#####LOV（List of Value）の作成について
ユーザードキュメントのこのあたりを参照しました。
https://docs.oracle.com/en/database/oracle/application-express/19.2/htmdb/creating-lists-of-values-at-the-application-level.html
今回の場合、体重の入力画面でのユーザー項目は、USERS表のUSER_IDを使ったLOVを作成して設定することになるのですが、なんと４−２で作成したデフォルトのアプリケーションで自動的に、**USERS.NAME**というLOVが作られ設定されていました。
APEX、、気が利くな。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/68efc2d4-3073-16c7-3d7c-74bbc7847014.png)

[追記]
これ実は、上でクイックSQLで作ったときに、「こんなのいるかな？」という、参照制約がUSER_IDに設定されたから自動で作られた、んだそうです。なにそれ、めっちゃ気が利いてるな。。


#####レイアウトについて
レイアウトに関しては自由度があるのと、アプリケーションギャラリーと呼ばれるサンプリアプリを使って、もっと高度かつきれいなアプリができそうです。が、今回家庭用であることと、こだわるときりがなさそうだったので、着手しませんでした。。
詳細はユーザードキュメントのこのあたりにありそうです。
https://docs.oracle.com/cd/F23071_01/htmdb/utilizing-packaged-applications.html#GUID-A850A48B-2AEC-42C9-9247-969129E52249
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/fc4bbc1e-1505-7271-1269-b56f53e43c5f.png)

#####モバイルでの使用について
作ったアプリをモバイルに転送し、アクセスするだけでモバイル用の表示に最適化されています。
あとはこのページを、「ホーム画面に追加」しておけば、まるでアプリのように1クリックでアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/d95f9f33-b651-aeda-e5b8-74e4d88cad85.png)


**以上、手順の詳細は、画面キャプチャつきでまとめたのて、[こちらの資料](https://speakerdeck.com/maato/oracle-cloudfalseapexwoshi-tutejian-dan-naapurikai-fa-sitemita)を参照にしてみてください。**


#今回APEXを使ってみての感想
今回APEXを使ってみての感想です。
　・ここまで構築自体は1-1.5時間ぐらいでできてしまいます。はじめまだツールに慣れていないうちから、最初から細部にこだわって実装しようとして、結構時間とられてしまいました。今回の最小限の要件ならば、結構簡単にできます。
　・何よりほとんど、コードレスで実装できるのはめちゃ便利。テーブル作成からアプリの変更、実行まで、ほとんどコードを書く必要がありません。
　・途中に「1つのテーブルでいいじゃないか」と記載しましたが、参考文献「Oracle APEXを触ってみた」にあるとおり、一つのEXCELのデータをインポートしてテーブル作成、アプリ作成をまでできちゃいます。これでも十分な場合も多々あるのではと思います。
　・作り始めると、いろいろやりたいことが出てくるので、優先順位と本当に必要かどうかの見極め重要ですね。ただ、こういうツールはとりあえず設定変えてみるという、トライアンドエラーがやりやすいので、思いつきを実装するサイクルが早いなと感じました。
　・コードを書く必要がないがゆえ、ツールのどこをどう変更すればいいのか、を理解しなければいけません。。自由度も高くやれることも多いので、その分、設定できる項目も多く、やはり最初は時間がかかります。なれてしまうと、なんとなく勘所がつかめてきて、トライアンドエラーできるようになりますが、最初は結構苦労しました。。
　・そういう意味では、今回は簡単なアプリなので、初心者には作りやすいですが、プログラムが得意な人なら自分で作ったほうが早いかもしれません。今後さらにアプリ機能を充実していったときに、どこかでプログラムするより早いという分岐点がくるのか、それはどのあたりなのか、は気になるところです。

今後の拡張としては以下をやってみたいです。
　・ハッシュなど、認証のちゃんとした設定
　・画面レイアウトをもっときれいに
でもまあ、家族で使うには十分ですね。


#今後の展開
今回は家庭用の体重管理アプリを作成してみましたが、多少の修正を加えながら、アイデア次第で、使用用途の可能性は無限大にありそうです。

例えば家庭用途だと、
　・体重だけでなくて、体温や心拍数など、幅広い健康管理とその報告
　・遠隔で離れた実家の家族にも、毎日入力してもらうようにして、遠方に離れて住む家族の健康管理
　・子供の宿題や勉強管理
　・子供のなわとび回数記録
　・家計簿
例えば業務だと、
　・毎日の勤怠や業務報告、日報
　・ちょっと使うにちょうどいい、簡単なデータ入力アプリ

ちなみに今回利用したAlways Free環境は、7日間アクセスしないと自動的にDBが停止されるみたいなので、毎日頻度よく見る用途がよいかもしれません。
https://docs.oracle.com/en/cloud/paas/autonomous-data-warehouse-cloud/user/autonomous-always-free.html#GUID-03F9F3E8-8A98-4792-AB9C-F0BACF02DC3E


なお、今回利用しているAPEXは、ExadataベースのAutonomous Database上で起動しています。

**Exadataで我が家の体重管理！
いよいよ、一家にExadata一台の時代がやってきました！**

#最後に
冒頭も書きましたが、世の中にはWifi付きの体重計もありますし、似たようなモバイルアプリも既に存在します。それだったらLINEでいいんじゃね？っていう意見もあるかと思います。

だけど、こんな時代ですし、誰かが作ってくれるのを待たずに、**まず自分でできることを自分でやってみる**、というのも重要なんじゃないでしょうか。
それがクラウドの醍醐味ですし、今回のAlways Free環境だと、なんと無料で始めることもできます。始めるためのハードルは、確実に下がってきています。


**何より、愛する誰かを思い浮かべながら、深夜土日の時間を費やして何かを作るというのは、きっとその相手にも喜ばれると思いますし、とっても素敵なことだと思いませんか！**


#### ぜひ皆さんも、Let's Enjoy Development!