2021年6月12日土曜日

研究タイトル考案!

研究タイトルを考えました。

家族健康記録「薬シェア」の開発と評価

Development and evaluation of Family Health Record "Drug-Share"

個人健康記録(PHR:Personal Health Record)は有名ですが、私たちが開発しているシステムは個人で健康を管理するというよりも家族でお年寄りの健康管理を支援するというコンセプトが強いので、家族健康記録(FHR: Family Health Record)という造語をタイトルに使ってみました。

我ながら良い用語を思いついたものだとほくそえんでいたら、なんと既に中国人と思しき人が彼の作ったアプリにこの用語を使っていました!うそ~、残念。でも、このアプリ、普通のPHRのように見えますが・・・。

"Family Health Record"でGoogleを検索すると、あるは、あるは・・・・。

しかし、どれも普通のPHRか、あるいは一つのアプリで家族全員の健康記録を管理するアプリのようです。私たちのアプリのように「高齢者を見守る」というコンセプトは入っていないようです。少しホッとしました。

新規性・有用性・信頼性

医療情報学会が公開している「論文・詳細抄録の書き方(システム開発研究編)」によれば、システム開発研究の論文にとっての必要条件は「新規性・有用性・信頼性」の3つであるとのことだ。

今回の研究の新規性は何かと考えると、QRコードで処方情報を読み込んだり、薬の時間になるとアラームを出したり、薬を飲んだかどうかを記録したり、薬剤情報を詳しく検索したり、血圧を音声で記録してグラフ表示したりするアプリなんてそこら中に転がっているので、これらの機能をもって新規性とは言えない。

新規性がもしあるなら、それは家族がお年寄りの健康記録を支援する機能を提供しているという点である。もちろん、既存の健康管理アプリを使えば今でもできるわけだが、既存アプリはそれを目的としているわけではない。その点を強調したい。

2021年6月9日水曜日

2021/06/08


まず初めに、学会準備のための話し合いをしました。 

時間はあまりありませんが、よい抄録が書けるよう頑張りたいと思います。


【Google Home班】

今日は前回に引き続き、グラフの表示に取り組みました。問題は、血圧です。最高血圧と最低血圧の2つを表示させなければならないため、時間がかかってしまいました。表示できました!! 

datasets: [{

label: '最高血圧',

data: [<? output._ = blood_pressure1 ?>],

borderColor: 'rgba(255, 99, 132, 1)', //線の色

fill: false,

},

{

label: '最低血圧',

data: [<? output._ = blood_pressure2 ?>],

borderColor: 'rgba(54,164,235,1)', //線の色

fill: false,

}]




次回は、下の部分を修正します。


function doGet() {

  return HtmlService.createTemplateFromFile("体重").evaluate();

 

【LINE班】

LINE公式アカウントから特定の相手へメッセージを送る「プッシュメッセージ」と、公式アカウントを登録している 全員宛にメッセージを送る「ブロードキャストメッセージ」のプログラムを理解し、練習で「薬シェアmini」にブロードキャストメッセージを遅らせることを確認しました。次回は、服薬が できたことをスピーカーに伝えた際、LINE公式アカウントがブロードキャストメッセージを送れるようプログラムを編集していきたいです。

【IFTTT班】

時間を遅らせたい時スピーカーに「待って」「ちょっと待って」「後で」と伝えた際、(Googleカレンダーで確認)開始時間を10分遅らせるようにしました。

2021年6月8日火曜日

Google Homeがしゃべった!

 今朝、突然、Google Homeがしゃべった。google-home-notifierが復活したみたいです。でも、何もしていないから「復活」はおかしいですね。きっと、Google HomeのAPIが元に戻ったんだろうと思います。

この件に関して何か情報がないかとネットを検索したけれど、特に情報はありませんでした。
でも直ってよかった。この服用督促を音声で利用者に伝える機能はこのシステムの目玉だから。


2021年6月6日日曜日

Google Homeはあいかわらずしゃべらない

 Google Homeが喋らなくなって2週間以上が経つが、あいかわらずしゃべらないままで、google-home-notifierに関するトラブルの記事もネットに見かけない。

それはさておき、先日、AIアシスタントの中でGoogle Homeが一番薬品名を理解できるといった論文を読んだ。

Google アシスタントは商品名(86.0%)と⼀般名(84.3%)の両⽅で最⾼精度を達成し、続いてApple Siri(それぞれ78.4%, 75.0%)、Amazon Alexa(64.2%, 66.7%)となった。

とのことだ。

これは英語圏(カナダ)での研究なので、日本語の場合はこの結果をそのまま鵜呑みにするわけにはいかないが、調べてみる価値はあると思う。

そのような知見がないならば、やってみてもよいかもしれない。それにはまず論文のように日本で最も処方されている薬剤の一般名と商品名のリスト(ベスト50)を入手すること。そして、Google Home(これはGoogle アシスタントで代用可能)とSiri(iPhoneがあれば可能)があればすぐにでも実行に移せる。

2021年6月4日金曜日

2021/06/03

 【Google Home班】

年越しが昨日のように感じられますが、早いものでもう2021年半分終わってしまいました...


今日は、日付の表示を修正しました。

2021/05/15と表示されなければいけないのに2021/05/135と表示されていました。

余計な ’ 3 ’ を消すためにコードgsにある日付の書式を"yyyy/MM/dd , HH:mm"にしました。


身長のグラフの表示ができたので、次回は体重・血圧の表示から進めたいと思います!!

 

 

【LINE班】

 ~ 前回のゼミから本日までの間での活動~

「くすりのしおり」をスクレイピングして薬の画像、詳細URLをとってくることができ、無事LINEのカルーセルメニューで表示することに成功しました。

 スクレイピングという技術を用いると、LINEでのカルーセルの表示にかなり時間がかかります。そこで、一度スクレイピングしたお薬の名称と画像リンク、詳細URLをスプレッドシートに保存し、次回の表示からはスクレイピングせずシートから情報を取り出すようプログラムしました。こうすることで、2回目からのカルーセルの表示がかなり早くなり、使いやすさもぐんと上がりました!

 ~本日・今後の活動~

スクレイピング部分のプログラムを整理し、その後LINEへの服薬完了通知を行うプログラムを見て内容を理解しました。システムの大事な機能の一つである「服薬できたことを知らせる」機能、 これを実現できるよう、次回は頑張っていきたいです。

また、学会への応募の際必要な 抄録の準備にも取り掛かり始めました。学会の応募締め切りも迫ってきていますし、こちらは余裕をもって作成していきます。


【IFTTT班】

スピーカーに「薬 $ 飲んだ」「お薬 $ 飲んだよ」「お薬 $ 飲んだ」($=朝、昼、夜、寝る前)と伝えると、Googleカレンダーの(未)が(済)に変わるようになりました。


2021年5月27日木曜日

2021/05/25

【Google Home班】

 今日はスプレッドシートに記録されたデータをグラフとして表示させようと取り組みました。まず、ブログに掲載されていた例(体温)を実際に作成することで理解を深めました。そのプログラムを応用して身長のグラフの表示にとりかかりました。もう少しで完成しそうですが、横軸の表示に苦戦しています...。 次回は、続きを!

 

【LINE班】 

まず前回記述したプログラムの整理と改善を行い、その後はお薬の一覧を表示するためのカルーセルの作成に引き続き取り掛かった。

本日はスクレイピングという技術を用いて、薬品名を自動検索し必要な情報をとってくる方法を理解した。(参考:「くすりのしおりスクレイピング」)

Webページから必要な情報をとってくるために、まずページの解析を行った。GoogleやFirefoxには開発者ツールというものがあるので、これを用いてページ内にどのような要素があるのかやネットワークの通信の動きを見ていった。

次にプログラムで、実際に情報を受け取ってみた。UrlFetchApp.fetchgetContentText('UTF-8')を用いてHTMLを取得し、その後正規表現をうまく活用することで欲しい情報が手に入った。

次回までに、実際にカルーセルにて画像の表示やURLの記述ができるようプログラムしていきたいと思う。


2021年5月20日木曜日

Google Homeがしゃべらなくなった

 2021.5.19の朝、突然Google Homeがしゃべらなくなった。前日までは確かにしゃべっていた。「朝の食後のお薬を飲んでください」と。ところが5/19の朝は時間が来たら「ぴょろろん」といういつもの音は出るけれどもしゃべらない。

そこで、curlコマンドを入力して発話サーバに発話を依頼したがダメ。日本語だけでなく、英語でもやってみたがダメ。

Google Homeを再起動(電源抜いて再び差し込む)したがダメ。YakuShare.jsをいったん停止(forever stop YakuShare.js)してから開始(forever start YakuShare.js)したが、やはりダメ。ログには正常に発話した旨表示される。エラーは起きていない。

以前、突然、Google Homeがしゃべらなくなることがあった。Google Home自体のアップデートがあってか、それまでのgoogle-home-notifierがエラーを吐いてしゃべらなくなることが。その場合は、Nodejsのgoogle-home-notifierのライブラリをアップデートすることで直った。

今回もその類ではないかと疑っているが、情報がない。そんなとき、今朝の新聞にGoogleがAndroidの新しいバージョンを公開したとの記事が。また「自然な対話「LaMDA」など登場 」といったニュースがネットで飛び交う。

きっと何かあったんだ。google-home-notifierは3rdパーティのライブラリなので、置いてかれたのだ。そう思った。Googleが何かするたびにGoogle Homeがしゃべらなくなる。これからもあるだろう。google-home-notifierのようなGoogleがサポートしない3rdパーティのライブラリは使うのをよそう。強制発話ができなくなってしまうが、やむを得ない・・・。

2021年5月18日火曜日

2021/05/18

(Google Home班)

今日は急遽予定を変更して、身長と体重のシートを分けてそれぞれで記録できるようにしました。苦戦しましたが、何とかスプレッドシートに記録されるようになりました。

身長、体重を別々に記録されるようにしたので、以前のように身長と体重を同時に記録することはできなくなりました。

次回こそは、スプレッドシートの最新の記録(間違えて認識されたものや数字を間違えたもの)を削除するところから進めたいと思います。(一応)グラフの作成に取り掛かろうと思います(Chart.js)。

2021/05/20追記

最新の記録のみ削除できるようにしました。

(LINE班) 

前回カレンダーから取り出した薬の情報を、さらに医薬品の名称のみ取り出すプログラムを作成した。

薬品名の前には「*(アスタリスク)」、後には半角スペースと容量が付いている。これらを『正規表現』を用いることで薬品名のみ取り出すことができる。

【今回使用した正規表現】 
    文字列.match(/^\*(.+?)\s(.+)$/)[1]
・"^" 文字の先頭にマッチする
・"." 任意の一文字にマッチする
・"+" 直前の文字の1回以上の繰り返しにマッチする 
・"?" 直前の文字の 0 回か 1 回の出現にマッチする
・"$" 文字の最後にマッチする
・"\s"  ホワイトスペースにマッチする
・丸かっこ() かっこの中の文字列を記録する
             配列内の2行以降に 記憶されるので、[1]などで取り出せる。

 理解するのに時間がかかったが、なんとか取り出すことができた。

次回は、配列内に同じ薬品が入らないためのプログラムを作成していきたい。 

2021/5/24追記

同じ薬品名が配列内に複数入らないようになった。

また、配列に保存した薬剤名をカルーセルとしてLINEで表示できるようにした。

カルーセルは、どうやら10個ほど表示できる模様。

使いやすさも考えながら、表示の仕方を考えていきたい。

2021年5月12日水曜日

2021/05/11

(Google Home班)

    前回の修正をしました。血圧は血圧のシートに、身長・体重は身長・体重のシートにデータが保存されるように修正をしました。

 続いて、間違えて認識されたデータを削除するプログラムの作成にとりかかりました。Google Homeとのやり取りは完成しましたが、問題のシート削除ができませんでした。

次回はシート削除を完成させるところから取り掛かります。

(LINE班)

 Googleカレンダーから薬の情報を取得し、リッチメニューを作成するためのプログラムについて取り掛かりました。

 今回はカレンダーの中から、閲覧当日のイベントを取得し、薬の情報が入っている「説明」部分を取り出すところまで完了。この際、薬の情報とその他の情報を区別できるよう、「QR3.カレンダーに登録.gs」のプログラムを一部変更し、薬剤名の前に「*」が付くように変更しました。次回は取り出したイベントの「説明」部分から薬の情報だけを抽出して、配列として保存し、リッチメニューとして表示できるところまで完成できるよう目指します。

(検証)

検証結果をグループLINEのノートに貼り付けた。

2021年5月2日日曜日

2021/04/27

 【Google Home班】

「OK Google テスト用アプリにつないで」と呼びかけて起動していましたが、「OK Google 薬シェアにつないで」と呼びかけると起動できるようにしました。

その時に、”薬シェア”という言葉が聞き取りにくいのか、「よくわかりません」という返事が多かったので、呼び出すときに利用者の好きな名前で呼び出せるようにしようかなと考え中です。

スピーカーに言った数値をスプレッドシートに記録するようにしました。

血圧、身長、体重完了!!


次回は、間違えた数値を削除できるようにします。

  

【LINE班】

カレンダーに服薬スケジュールを登録する機能を作成しました。

 

〈プログラムの説明〉 (詳しくはこちら

・処方オブジェクトの中の”RPs配列”を用い、「用法」部分から、服薬のタイミングを判断している。

・朝・昼・夕・就寝の4つの服用タイミングに分けて、イベントを作成している。その際、食前、食後なども判断し、イベント時刻を調整している。

・ スプレッドシートの「設定」シートにて食事の時間を指定した際、その時間を基準にイベントが作成される。もしシートがないならデフォルトの時間でイベントが作られる。


今回で、「お薬の登録」機能の基本的な一通りの流れは作成することができました。あとはユーザインタフェースにも気を配りつつ、使いやすいシステムを作成できるようこれから頑張りたいです。

【検証】

Google アシスタントをスマホにインストールすれば、Google Homeを使う代わりにGoogleアシスタントでActions on Googleアプリのデバッグができる。以下の動画はそれを利用して「血圧入力」を行ったところ。



このアプリを利用して血圧入力したところ、スプレッドシートの「血圧」シートではなく、「身長・体重」シートにデータが追加された。


2021年4月20日火曜日

2021/04/20

 

3-4限

今日は、LINE班とGoogleHome班でお互いの進み具合を確認した後、作業に取り掛かりました。

【GoogleHome班】

血圧を記録したいときに

if (req.queryResult.intent.displayName == 'ketsuatsu') {
text = '今日の最高血圧'+ parameters['systole.original'] +
'、最低血圧'+parameters['diastolic.original'] + 'を記録しました。';

「上150、下80」→「今日の最高血圧〇〇、最低血圧△△を記録しました。」

身長・体重を記録したいとき
else if (req.queryResult.intent.displayName == 'sintai') {
if (parameters['height.original'] == ''){
text = '今日の体重'+ parameters['weight.original'] +'キロを記録しました。';
}else if(parameters['weight.original'] == ''){
text = '今日の身長'+ parameters['height.original'] +'センチを記録しました。';
}else {
text = '今日の体重'+ parameters['weight.original'] +'キロ
、身長'+parameters['height.original'] + 'センチを記録しました。';
}
}
「身長154、体重50」→「今日の体重50キロ、身長154センチを記録しました。」 身長のみ、体重のみの場合は「今日の身長154センチを記録しました」「今日の体重54キロを記録しました。」とスピーカーが答えてくれます。


 

【LINE班】

QRコードの読み取り機能を作成(お薬QRコードサンプルを参照)
1.まず、QRコード内にどんな情報が格納されているかを確認した。 2.次に、QRコードのデータ配列を、プログラムで使えるjavascriptの配列に変換できるようにした。 2-1.複数のQRコードに分かれたデータを1つにマージしたものを用意する。   今回はプログラムに直接書き込むので、各一行ごとに「'」で囲み、次行とを「,」で区切った。
     (TeraPadを活用)  2-2.2-1で作成したデータをGASに書き込み、プログラム上で実行しログを確認した。    const obj = barcode2obj(lines);  Logger.log(JSON.stringify(obj,null,' ')); 3.プロジェクト上で実行し、必要な情報が配列から取り出せることを確認した。 例:Logger.log(JSON.stringify(obj.patientInfo.No1.name,null,' ')); と記入したら、
 名前のデータが返される。
次回は、LINEのメッセージでQRコードのデータを送信した時、Googleスプレッドシートへ保存できる
仕組みを開発していきたいと思います!!

2021年4月14日水曜日

2021/4/14

 まず初めに、ユースケース「薬の情報を閲覧する」について話し合いを行いました。これですべてのユースケース記述が完了!いよいよ開発の方に本腰を入れていきます。

 また、リッチメニューのデザインについても定まり、システムの外観のイメージがはっきりとしてきました。しかし1番重要なのは中身。これからの活動にますます力が入ります。

▼今まで作成したイラストたち


------------------------------------------

 LINE班とGoogle班に分かれての活動も、コツコツと進んできております。

少しずつ理解を深めながら、完成時のシステムをイメージしつつ作業中です。

いろいろデモ版を試しつつ、完成目指して頑張りましょう!


LINE班

テンプレートメッセージのボタンとカルーセルを作成した。ボタンやカルーセルのカラムの画像には「くすりのしおり」の薬の画像を表示してみた。

また、ボタンをタップするとGoogleカレンダーのURLへ分岐するようにしてみた。このように、しばらくの間はユーザインターフェースを設計するため、Look&Feelを試しながらプロトタイプを作ってみることにする。

Google Home班

DialogflowとGoogle Assistantの統合を一通り作ってみたので、今度はこれを応用して血圧入力のIntentを作ってみる。

2021年4月6日火曜日

2021/4/6

 3限

前回に引き続き、以下のユースケースについて考えました。

・服薬指示を通知する

・服薬完了を通知する

・服薬完了を家族に知らせる

この3つは一連の流れになっているので別々にユースケースを考えるのが難しかったです。

ユースケース記述も残り1つなので着々と進んでいます。


4限

やっとシステム開発に入りました!

LINE班とGoogle Home班に別れて作成していきます。

Google Home班ではいきなりテスト画面のテキストボックスが出てこないというトラブルが発生しました。先生がやってみるとうまくいったようですがなぜ出てこなかったのかは原因不明のようです…。次回もう一度やってみます。


LINE班

Programming TipsのLINEの記事Webhookに従ってLINE公式アカウントアプリの基本構造を実装した。また、クラスResponseを使ってテキストメッセージスタンプメッセージ画像メッセージなど、Messaging APIで送出できる基本的なメッセージを作成した。次回は、テンプレートメッセージボタンテンプレートカルーセルテンプレートを作成する。

また、リッチメニューは「リッチメニュー画像の作り方から設定方法まで!」に従って作成する。

Google Home班

Google Homeで動作するアプリ(Googleアシスタントアプリ)を作成するために、Actions on Googleというツールを使用する。また、Google Homeに話しかけた会話を自然言語解析するツールとしてDialogflowというツールを使用する。そのためにProgramming TipsのDialogflowとGoogle Assistantの統合の記事に従って設定を行った。

ところがプロジェクトを作成し、DialogdlowとGoogleアシスタントを統合しようとすると、何故か、図4-3「Googleアシスタント統合設定画面」で「Auto-preview changes」が表示されず、スイッチをオンにできなかったため、Action on GoogleとDialogflowの連携ができなかった。そのため、図4-5「テスト画面」で入力テキストボックスが表示されず、テストを実行できない。

何故このようなことになったのか現時点では原因は不明だが、もう一度最初から手順を踏み、図4-1「デフォルトの挨拶インテントの修正」のResponsesを修正する際に「DEFAULT」タブ右横の「+」ボタンをクリックして「GOOGLE ASSISTANT」を追加したら、今度はうまく連携ができた。ただし、これが原因かどうかはわからない。