うつ病の人の家族、パートナーのための記録アプリ「うつメイト」をリリースしました
はじめに
こんにちは。naomichi-hと申します。
この記事では、私が所属するFJORD BOOT CAMP(フィヨルドブートキャンプ)の最終課題として作成し、リリースした「うつメイト」というアプリについて紹介させていただきたいと思います。
うつ病の人の家族、パートナーのための記録アプリ「うつメイト」
作った経緯
私の妻が重いうつ病を患っており、その関係でここ2年ほど付き添いや代行で毎月のメンタルクリニックに通っています。
メンタルクリニックに通われていた方には結構共感していただけるのですが、診察では、必ず「先月は、どうでしたか?」と聞かれます。そして大抵の場合、「先月...どうだったっけ...。というか何を答えればいいんだろう...。」と困り、いまいち上手く伝えられないまま診察は終わり、モヤモヤした気持ちを抱えながらメンタルクリニックを後にすることになります。
この、「毎月の診察で何と答えればいいのかわからない」という課題解決のために、妻との会話の中で、「毎日の記録を取って、それを元にレポートを作成する」というアプリを最初に考えました。
しかし、このアイデアには二つの大きな問題がありました。
まず、「毎日の記録を取る」部分ですが、これを例えば日記のような形式で行うのは結構な負担になることが予想されますし、その記録を元にレポートを作成するのも困難です。
そしてそもそも、何を記録したらいいのかがわからない。という根本的な問題も抱えていました。
この根本的な問題を解決するべく、思い切ってかかりつけの医師に、「診察で一番知りたいことはなんですか?」と聞いてみました。
すると先生は、「主に生活面での、客観的な行動がどうなのかが知りたい。それが上向いているのかどうかで、薬の量を判断している。」とおっしゃられ、うつ病がどのように治っていくことが多いのかを教えてくれました。
どうやらうつ病の症状は、客観的 -> 主観的 の順に好転していくらしく、毎月の診察の目的の一つは、生活が客観的にみてどうなったか?を知ることだそうです。
しかし、1週間前の自分が何を食べていたのかすら怪しいぐらいなのに、「先月の自分が客観的に見てどうだったか」に答えるのはあまりに難しいと感じました。
そこで、解決すべき課題を、「うつ病の人が、治療に大切な、自分の客観的な記録を毎日取るのが難しい問題」と定め直し、毎日の記録をなるべく負担のない形式に...と考え、思いついたのが、「必要最小限の質問に答えるだけで、十分な客観的生活記録がとれ、それを元にレポートを作成できる」アプリでした。
「うつメイト」でできること
1. 記録機能
5つの簡単な質問に答えるだけで、その日の十分な客観的生活記録が取れます。
2. うつレポ作成機能
記録を元に、生活記録をまとめたレポート、「うつレポ」を作成できます。 うつレポは印刷やpdf出力が可能です。
工夫した点
一番のポイントは記録機能の質問を、かかりつけの医師と相談して、「全て選択式」かつ、「生活行動に関する」、「客観的な」5つに厳選したことです。
全て選択式なため、文字を入力する手間が無く、記録の負担が最小限です。 また、生活行動に関する、「客観的」な質問であるため、うつ病を患っている本人だけでなく、その周りにいる家族や、パートナーでも記録を取ることができるのが最大の特徴です。
また、このアプリは、妻が描いてくれたイラストが多数配置されています。 これは、うつで孤独を感じている人たちに、少しでもこのアプリを身近に感じて欲しいと思ったからです。
アプリの名前を、うつ「メイト」としたのも同じ理由からです。
こんな人に使って欲しい
使用技術
開発を行う中で苦労したこと
うつレポを表示させる画面に、ブラウザの印刷機能を使うための印刷ボタンを配置しているのですが、これが原因でいろいろなところで苦労させられました。
まず、画面の状態にかかわらず、印刷のプレビューは一律の体裁になるように、印刷ボタンを押した時に、印刷時専用のCSSがあたるようにJavaScriptを使用しているのですが、プレビューの一部がどうしても崩れてしまうという問題がありました。
最初は、JavaScriptの非同期処理が原因と考え、Promiseを使って同期的に動作させてみたのですが、これでもうまくいかない。
CSSが最初から当たっている状態であれば問題なくプレビューされるのに、それを印刷ボタンが押される直前にJavaScriptを使ってやるとうまくいかない。
これらのことから、プレビューの仕様がおそらく、「印刷ダイアログが開く時点での画面をキャプチャする」というもののため、最速でJavaScriptを動かすと、CSSが画面に反映しきる前にキャプチャされてしまい、これが元でプレビューが崩れてしまうのかもしれない。
と考え、CSSがあたった後に少し時間を挟んでみると、うまくいきました。
次に、この印刷ボタンを挟んだシステムスペックを書いたのですが、「headless-chromeでは印刷機能を使用できない。」「webdriverの仕様上、印刷ダイアログを操作することができない。」という壁にぶつかりました。色々試した結果、このテストのみヘッドレスではないブラウザを使用し、テストブラウザのオプションで、「印刷ダイアログが開いたら自動でpdf保存される」というものを指定することで、なんとか印刷ボタンのテストをすることができました。
が、ほっとしたのも束の間、今度は印刷ダイアログが閉じた後のページがexpectと一致しないエラーに見舞われました。
これはどうやら、印刷ダイアログが閉じ切る前にexpectが走ってしまうようで、どうにか印刷ダイアログが閉じ切った後にexpectをするように...と考えたのですが、結局禁じ手としていたsleepを使ってテストを通しました。
JavaScriptもそうですが、時間を指定して処理を待つ手法は実行環境に左右されるので、代替手法を見つけ次第変更したいと考えています。
次に苦労したのが、AWSを使用したデプロイです。 前情報から難しいとは聞いていましたが、想像していたよりはるかにややこしかったです。
ネットの情報を元に進めていったのですが、少し進めばエラー。またエラー。すぐにエラーという感じで、とにかくログを読んで原因を探し、それを解決して少し進む...という感じでとにかく手間がかかりました。
中でも、ALBを使ってHTTPS化をしようとしたときに一番ハマりました。
ACMを使ってサーバー証明書を取得し、ALBに必要事項を設定。ロードバランサーを入れて...さあhttpsでアクセスだ!と思ったら秒で503エラー。
その後、「AWS 503エラー」などで調べ、ALBの設定をいじりながらアクセスするも、返ってくるのは無情の503エラー。3時間ほど苦しみながら、どうやらロードバランサーまわりの設定に問題があることが多いとわかり、調べていった結果...原因は「ロードバランサーのターゲットの登録し忘れ」というしょうもないミスでした。
自分では登録したつもりでいたので、これに気づいたときは力が抜けました。 初めて使うインターフェイスでは、自分が思った通りにできていないこともある...という学びを得ました。
なんとか構築を完了し、ブラウザに「https://utsumate」と打ち込み、本番環境で自分が作ったアプリケーションが動いているのを見たときは、ものすごい感動したのを覚えています。(ローカルよりも軽快に動いているのを見て、AWSすごいな...とも思いました。)
感想
アプリの作成を通じて、世にあるサービスが、いかに考え尽くされて作られているかをひしひしと感じるようになりました。
フォントの色一つ、ボタンの配置一つとっても、その裏には作った人の思いがあるとわかったことが一番の収穫だったと思います。
開発途中、エラーなどでうまくいかなくて苦しむこともありましたし、煮詰まって叫びたくなるような場面もありました。しかし、それでもエディタに向かったのは、ひとえに、「自分もその人たちの一人になりたい」という思いがあったからだと思います。
私が二年前、プログラミングを始めたのは、「アプリって、どういう仕組みで動いてるんだろう」という単なる興味からでしたが、今は、自分が身につけてきた知識、技術、調査力を持って、現実の問題を解決したい。そうすることで、もっと自分の知らない景色が広がるかもしれないとワクワクしています。
今後やりたいこと
うつメイトを使って妻を見守りながら、より良いサービスにしていけたらなと思います。
厚生労働省によると、うつ病は、100人に約6人がかかる病気とされています。 20人も集まれば、1人以上はうつ病にかかっていると考えると、身近な人や、自分自身がうつ病になったとしても全く不思議ではないと感じます。
近年、うつ病に関する理解や関心は、以前に比べて高まってきていると感じますが、その一方で、実際に自分や、自分の周りの人がうつ病にかかったとき、どうすればよいのか?という問いに対しては、病院に行く。ということ以外、はっきりとした答えがないことが、私の妻がうつ病にかかったときにわかりました。
生活は日常の連続であり、当然、うつ病にかかった人や、その家族にも日常があります。その日常の中に、「うつメイトを使う」という選択肢を作れたらいいなと思っています。
最後に
無事にアプリをリリースできたことは、本当に幸運でした。
二年前の年末、たまたまスマホのGoogleアプリでフィヨルドブートキャンプの卒業生の方のブログがおすすめされているのを見逃していたら、いまこうして満ち足りた気持ちでリリースブログを書いてはいなかったと思います。
フィヨルドブートキャンプという素晴らしいサービスを運営してくださっているメンター・アドバイザーの皆様。
世にある素晴らしい記事・技術書を執筆された諸先輩方。
そしてなにより、あたたかいRubyコミュニティの存在が、私を導いてくれたと思っています。
この場を借りて皆様に感謝を申し上げるとともに、自分もそのコミュニティの一員として、成長し、一助となりたいという思いをここに記して締めたいと思います。
最後までお読みいただき、ありがとうございました!
p.s. うつ病で苦しみながらも、アプリの相談に乗り、多数のイラストを書いてくれた妻へ
あなたがいなければ、このアプリが作られることはなかったでしょう。本当にありがとう。