薬剤師のプログラミング備忘録

変人薬剤師の独り言

錠散水剤相互換算ツール

(※現在blog移転中→薬剤師のプログラミング備忘録 | 素人エンジニアの日記

今回も、センノシド換算に次いでjavascriptで作ってみました。

 

Titer calculation ー 錠散水剤相互換算ツール

どうにも自信を持って暗算で計算できない人間なので、確証がほしいときにこういうものがあったら便利だなーと思って作ってみました。

内容は手計算で行っている時と同じ式を代用しているだけです。

ページのソースを見ればわかるのですが(汚いですが)、単純にformに入力された値(value)を読み取って計算しているだけです。

formに入力されると、onchangeで関数が動き出します。

一部のレセコンや散剤秤量システムは自動計算してくれますが、粉砕での換算や水剤への変更を医師に伝える際には使えるかなーと思います。

こういうささっと計算できるアプリは、スマホなんかだと既にあるのでしょうかねー。

---HTML---

<tr>
<td><input type="text" id="per" size="6" onchange="calculation()" style="text-align: right; " autocomplete="off"> %</td>
<td><input type="text" id="mg" size="6" onchange="calculation()" style="text-align: right; " autocomplete="off"> mg</td>
<td><input type="text" name="g" size="6" value="0" style="text-align: right; " readonly="readonly"> g</td>
<td><input type="text" name="day" size="6" onchange="calculation()" style="text-align: right; " autocomplete="off"> 日分</td>
</tr>
<tr>
<td align="right" colspan="3">合計量</td>
<td><input type="text" name="total" size="6" value="0" style="text-align: right; " readonly="readonly"> g</td>
</tr>

---javascript---

function calculation(){
// gからmgへ
var calc = document.form.per.value * document.form.g.value * 10;
document.form.mg.value = calc;

// 合計を計算
var total = calc * document.form.day.value;
document.form.total.value = total;
}

次回処方日の計算

これが非常に苦手です。何度やっても理解できないのです。

なので、自動計算のシステムを作ってみようと思います。

一応、到達点としては用法も加味したシステムですので、用法不要であればjavascriptで動的に作ることもできますが、今回はPHPで作ります。コーディングの練習用に2種類作ってもいいかもしれませんね。

変わらず、今回もPHPは同一ページでの入力と表示を目指す予定です。

 

Day count - 処方日数計算機

 

まずは、日にちの自動計算です。

日にちというのは文字(str)や数字(int)と異なる属性です。

コンピュータでは文字は足し算の足し算は結合されてしまいます。

通常のプログラミング言語では文字は以下のようになります。

は + る = はる

しかし、数字の場合も以下のようになります。

1 + 1 = 11

これは数字の「1」ではなく、文字としての「1」を認識してしまっているためです。

これを文字(string)ではなく、数字(integer)として認識させる必要があります。

pythonなんかの言語では自動判断してくれますが)

同様に、日付も特殊な属性を持ち、計算結果が自動繰り上げされるようになります。

数字としての"20180516"は加算すると以下のようになります。

20180516 + 365 = 20180696

しかし、これに日にちとしての属性を持たせると、以下のようになります。

20180516 + 180 = 20181112

このように、その文字列の持つ属性がプログラミングでは非常に重要になります。関数や引数、変数なんかも同様です。

今回はPHPでの計算ですので、まずは入力された文字列を日にちとして組み込まなければいけません。

その際に使用する関数がdate_createですが、今回はDateTimeクラスを使用します。また、いつもの手続き型ではなく、オブジェクト指向にチャレンジしてみます。

 

//ここからプログラムの内容

まず、入力の西暦部分は変更することがほとんどないと思われるので、最初から入力されていて問題はないので、(念の為、日本標準時(東京)に時刻を設定して)西暦を引っ張ってきます。

ーーーーー

西暦<input type="text" name="指定する西暦"  autocomplete="off"
value="<?php
//日本標準時の時間で設定
date_default_timezone_set(' Asia/Tokyo ');

//$nowyearを指定し、DateTimeとして内容を設定。

$nowyear = new DateTime();

//$nowyearの内容は日にちとしての属性を持っているので、そのY(西暦)の部分を取り出して表示
echo $nowyear->format('Y');
?>" />年

ーーーーー

これで、inputのテキストエリアに自動で現在の西暦が入力されます。

月日についても同様に入力しておきます。

これらをformからaction=""で同一ページに飛び、内容をPOSTします。

ーーーーー

<form action="" method="post">

<input ~上記のコード~ />

//処方日数の指定はPOSTした後に削除されないようにvalueの値を指定

<input name="処方日数" type="text" autocomplete="off" value="<?php echo $_POST['処方日数']; ?>" style="text-align: right;"/>

<input type="submit" value="計算" />

<form />

ーーーーー

この辺りはHTMLの知識かもしれませんね。少しCSSも加えてますが。

POSTされた数字は、念の為全角を半角に強制的に修正しておきます。

これはmb_convert_kana関数を使用すると楽です。全角→半角や半角→全角など、入力された文字を強制的に変換させます。Drug Searchでも使用しています。薬の検索は半角カタカナ・数字になるとパターンマッチできない(正規表現的に異なってしまう)、なんて互換性無くなってしまうとマズいので強制的に全角に変換してしまうわけです。

ーーーーー

$_POST['指定された年'] = mb_convert_kana($_POST['指定された年'],"a");

//同様に月日も設定(内容は略)

//再度DateTimeクラスを使用して、指定された日にちの計算を行います。

$date = new DateTime();

//POSTされた数字をDateTimeの日にちに入力

$date->setDate($_POST['指定された年'],$_POST['指定された月'],$_POST['指定された日']);

//入力された数字を加算(指定日は服用を「開始」する日なので、更に1日引く)
$date->add(new DateInterval('P'.$_POST['加算する日数'].'D'));
$date->sub(new DateInterval('P1D'));

//DateTimeクラスの曜日は数字に割り当てられているので、配列を利用して番号=その番目の文字に変換

$week = array("日","月","火","水","木","金","土");

//計算された日にちを表示
echo $date->format('Y年m月d日');

//曜日を数字から文字に変換して表示
$weeknum = $date->format('w');
echo "(",$week[$weeknum],")";

ーーーーー

と、他にも内部でいろいろやってますが、大まかにこんな感じです。PHPだとサーバー側で処理しているので、コードが見れないのが難ですが、そんな感じのことしてるんだなー程度に理解していただければいいのかなと。

なかなか帰宅後の時間で作るのも難しいですが、今後もちまちまとやっていきたいと思います。

 

f:id:MC753:20180517010045g:plain

 

 

移転します

使いやすくはあったのですが、自分のサイト内で完結させたいというところもありましたし、本来はpharmanaの開発blogでしたので、

pharmana.info

で継続することとします。相変わらずシンプルな感じです。

暫くは、どちらのブログも内容同じで並行して書いていこうと思います。

 

そういえば、今日はTwitterでこのような紹介を受けました。

 

スマホで薬剤師国試ゴロ@yakugoro
 
 

【薬学生にも知って欲しい個人薬剤師アカウントまとめ】@Fizz_DI(就職したら即買い本の著者)@yakkyokumemo(メモメモ)@keisyukeblog(薬剤師の広報さん)@kojima_aponet厚労省や海外情報ありがたい)@varatoril(事務員さんに嫌われた仕事できません!)@highlander_tk異世界薬局!)

 

 

 

スマホで薬剤師国試ゴロ@yakugoro

【薬学生にも知って欲しい個人薬剤師アカウントまとめ】@Fizz_DI(就職したら即買い本の著者)@yakkyokumemo(メモメモ)@keisyukeblog(薬剤師の広報さん)@kojima_aponet厚労省や海外情報ありがたい)@varatoril(事務員さんに嫌われた仕事できません!)@highlander_tk異世界薬局!)

スマホで薬剤師国試ゴロ@yakugoro
 
 

@answers_news(製薬就活生は必須)@kuriedits(ドラッグストアから)@indus_pharm(産業薬剤師)@syuichiao89,@89089314(JJCLIP)@pharmacist753(エンジニア薬剤師)@yakutiti(薬の味なら)@ph_lelouch四コマ漫画◎)@4motion_tiguan(データ系)@koishimariko(新薬情報ありがたい)

 

 

諸先生方に並んで紹介されるというのは、非常に嬉しいことです。

エンジニアと言えるレベルでは無いとは思っていますが、少しずつでも何か皆さんの力になれるものを作っていけたらと思います。

今後とも宜しくお願いします。m(_ _)m

小児薬用量の自動換算

引越し作業でしばらくパソコンに触れなかったのですが、今もネット環境がありません。しかし時代の流れは凄いもので、PCとiPhoneを接続するだけでネット環境ができるんですよね。いい時代になったものです。ネットが開通するまでは、iPhone様に頼って作業しようと思います。

 

さて、前回はセンノシドの自動換算表(laxative converter)をjavascriptで書いてみたのですが、それの応用で小児薬用量もできないかと思いたち、1時間ほどで作ってみました。

 

 

Pediatric dose

(今回からディレクトリをtest→appにしています。そのうち他のページも変更するかもしれません)

 

思いつきで書いたのでコーディングは雑です。

それぞれの医薬品について、手入力で最小用量と最大用量、規格を入力しています。

今回もjavascriptなのでページのソースを見ればわかるのですが、以下のようになっています。

// アスベリンドライシロップ2%

アスベリンの最小用量をaugsbergerの式より、成人量の最小用量で求めます。(但し、適宜増減については加味していません)

var asbmin = 60*(document.forms.age.value*4+20)/100;

document.forms.asbcalcmin.value = asbmin;

・同じように最大容量を計算

var asbmax = 120*(document.forms.age.value*4+20)/100;

document.forms.asbcalcmax.value = asbmax;

・g換算で製剤量を求めます

document.forms.asbmin_g.value = asbmin/0.02*0.001;

document.forms.asbmax_g.value = asbmax/0.02*0.001;

一つの薬剤でこれだけ長いコードになってしますので、小児に使用する薬剤一覧を作るとかなり長くなってしまいますね…。なんとか簡略化したいものです。

最大量や最小量、規格をdatabaseに登録しておいて連携させればもっと楽なんでしょうけども。

ただ、アスベリンのように年齢で用量が決まっている薬や、ニポラジンのように適応症で用量が決まっている薬、ムコダインのように適宜増減を加味すると750mg~3000mgと幅が広くなってしまう薬など、一筋縄ではいかないです。なんとか形にしてみたいですね。

 

f:id:MC753:20180511011036g:plain

センノシド換算表っぽいもの

 

と、呟いてからしばらく飲みながらぼーっとしていましたが、動的フォームの練習も兼ねて作ってみたところ、案外普通にできました。

laxative converter

javascriptはまだまだ勉強中ですが、PHPと違って動的に動かせるのがいいですね。AjaxjQueryなんかも使えるといいのですが、まだまだ勉強中です。

今回は全てjavascriptで作っていますので、構造自体は簡単です。

htmlのinput type="text"に入力された値を関数としてリアルタイムに登録し、けいしゅけ先生の記事による換算式に当てはめて出力しています。PHPだと、一旦データをサーバーに提出する必要があるので、formを送信しなければいけないのがデメリットでした。

ページのソースから丸見えではあるのですが、簡略化するとこんな感じです。

入力・表示:<input type="text" id="alozenn_in" onchange="calculation"> 錠

計算:var price_al = document.form.alozenn.value * 24;

   document.form.alozenn.value = price_al;

出力・表示:<input type="text" name="alozenn_out" size="4" value="0" > mg

ーーー以下同様に数種類...

出力:document.forms.field_total.value = total;

センノシド換算:<input type="text" name="field_total" > mg

 

今回の発見は、セチロ9錠=センノシド12mgなのですが、これを計算式に当てはめて結果だけ表記しておくと、

data_sechiro = document.form.sechilo.value * 1.333;

にした場合、9錠入力しても「11.997」と表示されるんですね。

しかし、計算結果ではなく計算式を入力しておけば、つまり以下のようにすると

data_sechiro = document.form.sechilo.value * 12/9;

9錠と入力した場合には「12」と、3錠の場合は「4」と表示されるようです。

勉強になりますね。

※コードは例として提示していますので、実際に使われているコードは当該ページより参照してください

 

計算式自体は、けいしゅけ先生の記事

keisyuke-blogyakkyoku.xyz

を参考にさせていただきました。この場をお借り致しまして、お礼申し上げます。

 

f:id:MC753:20180505165657g:plain

 

 

新薬価と旧薬価を比較するためのページ

便利ツールを開発していることで有名なジム子さんのblogを拝見させていただき、excelでもできることはwebでもできるのでは?と思い立ちまして

参照:調剤薬局事務の仕事 H30年4月に薬価改定につかえる新旧の薬価比較表

 

 

思い立ったが吉日で作ってみました。

 

厚労省社会保険診療報酬支払基金のマスタから引っ張ってきただけのものではありますが。

メーカーや一部のデータが入ってないのはご了承ください。そのうち直します。そのうち…。多分。

 

 

Price Comparison

 

f:id:MC753:20180330223146g:plain

ランダムに出題をするプログラム

忙しさの合間を縫ってdatabaseの方を充実させるはずが、国家試験を見ているうちに出題システムを作る方が楽しくなってしまっていました。

 

正誤の照合が上手くいかないので、いろいろとテストしていますが、自動的に問題を出題させるのはそれほど難しくありません。

まず、

<form action="" method="post"

<input type='submit' value='出題' />

</form>

で出題ボタン作ります。クリック後の転送先は同じページにしています。

特に理由もありませんが、基本的に私は同一ページで全ての動作を終わらせるようにしています。

 

この際に、inputにhiddenを加えて、何らかのpostを組み込みます。

このpostが存在することによって、出題をクリックしたことを認識して、問題をランダムに表示させています。postが無ければ問題は表示されません=初回にページを開いた際には問題は表示されません。

 

問題は、databaseから取得しています。

先に作成した自動出題プログラムとは別に、問題自体をまるごとdatabaseに登録しています。(前回のものは、医薬品名を登録することによって、出題形式、つまり文章そのものを自動で作成していました)

まず、特定の数だけ数字を並べて、その後ランダムに数字を入れ替えします。

//1から5までの数字を並べる

$array_num = range(1,5);

//前述の数字をランダムに並び替える

$s_ar_num = shuffle($array_num);

擬似的に非重複性の乱数を生成することによって、"11245"というような数字の重複を防ぎます。

これをforループで指定回数databaseから問題文を取得します。

 for ($i = 0; $i < 5; $i++){

mysql_queryなど~

$question_data;

echo $question_data['question']."<br>";

}

という感じです。

その後、inputのsubmitで回答を押すと正誤判定ができるようにしていますが、少し行き詰まっています。

同一問題を表示しようとすると、再度ランダムに表示する判定が起きてしまうのは回避できましたが、その問題自体をdatabaseと照合し、問題の正誤判定を行わせるのが目標です。

 

薬剤師とはミスがあってはならないのでトライ・アンド・エラーはなかなかできない仕事ですが、プログラミングは常に試行錯誤と失敗の連続です。

あくまで趣味の範疇なので仕事と異なるという前提ですが、何度でも失敗できるということは精神的なストレスが少なくてよいですね。

 

テスト中:問題自動生成プログラム