termuxで mariadb を利用して、リストに挙げられたタスクの実行時刻を記録するスクリプトを書いてみました。termux-dialog のような、 termuxAPI も活用しています。
まずはメインとなる親スクリプトです。
#!/bin/bash kill `pgrep mysqld` mysqld& sleep 1 bin_dir=$HOME/storage/shared/bin/delivery_log . ${bin_dir}/set_path.sh . createDB.sh . select_course.sh . set_station.sh . free_input_termux.sh . insertDB.sh . create_rep.sh kill `pgrep mysqld`
mariadb の二重起動を避けるために、まず kill してからバックグラウンドで起動しなおします。mariadb はオーバーヘッドに多少時間がかかるらしく、順調に進むとエラーが出るため sleep コマンドでタイミングを取りました。
#/bin/bash # set_path.sh パスの設定 bin_dir=$HOME/storage/shared/bin/delivery_log report_dir=$HOME/storage/shared/Documents/配送ログ if [ -d "${bin_dir}" ] then PATH="${bin_dir}:$HOME/bin:$PATH" fi # その他変数の設定 host=127.0.0.1
set_path.sh で PATH を始めとする幾つかの変数を設定します。シェル変数 bin_dir にディレクトリ中に全ての実行形式が入ってますので、set_path.sh 呼び出し以後は一々ディレクトリを指定しなくても実行形式が呼び出せます。変数 report_dir は最後にログを書き出すディレクトリの名称です。
#!/bin/bash # createDB.sh データベーステーブルの作成 # コース名 mysql -h ${host} -u user delivery << _SQL_ create table if not exists t_course ( id int primary key auto_increment, コース varchar(10) ); _SQL_ # 駅名 mysql -h ${host} -u user delivery <<_SQL_ create table if not exists t_station ( id int primary key auto_increment, コース varchar(10), 駅名 varchar(10), 通常順 int ); _SQL_ # カレンダーログ mysql -h ${host} -u user delivery <<_SQL_ create table if not exists t_log_convenient( id int primary key auto_increment, 日付 date unique, コース varchar(10) ); _SQL_ # 詳細ログ mysql -h ${host} -u user delivery <<_SQL_ create table if not exists t_log ( id int primary key auto_increment, 日付 date, 駅名 varchar(10), 時刻 time, 東経 double, 北緯 double, メモ varchar(100) ); _SQL_ # 当日既に登録された駅名のビューを作成 mysql -h ${host} -u user delivery <<_SQL_ create view if not exists v_通過済 as select 駅名 from t_log where 日付=date(now()); _SQL_ # 当日のコースに含まれる駅名のビューを作成(通常順0は大阪駅なので排除) mysql -h ${host} -u user delivery <<_SQL_ create view if not exists v_コース as select 駅名,通常順 from t_station s join (select コース from t_log_convenient where 日付=date(now())) t on s.コース=t.コース where 通常順>0; _SQL_
データベースを作成します。もちろん、1回作成してしまえば必要ありませんので、SQL文中の if not exists に従って何もせずに外へ出ます。
#!/bin/bash
# select_course.sh コースを選択します
today=`\ mysql -h ${host} -u user delivery -N << _SQL_ select * from t_log_convenient where 日付=date(now()); _SQL_` # 当日のコースが決まっていなければ if [ -z "${today}" ] then #### 本日のコースを設定します #### declare -a course_a=(`\ mysql -h ${host} -u user delivery -N << _SQL_ select コース from t_course; _SQL_` ) value=`echo ${course_a[*]} | sed -e "s/ /,/g"` line=`\ termux-dialog spinner -t "本日のコースを選択してください" -v "${value}" |\ tr "\n" " "` code=`echo ${line} | jq -r .code` if [ ${code} -eq -2 ]; then exit; fi course=`echo ${line} | jq -r .text` mysql -h ${host} -u user delivery << _SQL_ insert into t_log_convenient(日付,コース) values(date(now()), "${course}") on duplicate key update コース="${course}"; _SQL_ kill `pgrep mysqld` exit fi
既に当日のコースが決まっていれば変数 ${today} に値が入りますので、何もせずに外へ出ます。もし、値が無ければ if 文中でリストボックスダイアログを起動し当日のコースを t_course テーブル中から選択します。その結果は t_log_convenient テーブルに挿入されます。3つ目のSQL中、 on duplicate key 文で再挿入ではなく更新を掛けるように設定していますが、変数 ${today} に値が入りますから、このSQLに辿り着くことは無いでしょう。必ず mariadb を停止してから exit 文で親スクリプトごと終了します。
#!/bin/bash ### set_station.sh 通常順が最も若い駅名を返します ### station=`\ mysql -h ${host} -u user delivery -N << _SQL_ select c.駅名 from v_コース c left join v_通過済 p on c.駅名=p.駅名 where p.駅名 is null order by c.通常順 limit 1; _SQL_` if [ -z ${station} ] then kill `pgrep mysqld`; exit fi
テーブル t_log_convenient に当日のレコードが挿入されている、すなわち既に当日のコースが決まっていれば、このスクリプトにやってきます。既に訪れた駅はビュー v_通過済 に駅名が登録されますから、それ以外の駅名でかつ通常順が最も若い駅名が変数 ${statiaon} に返されます。ビュー v_コース に挙げられた駅を全て通過していた場合は、該当するレコードが存在しませんから、${station} に値は入りません。そのため mariadb をkillして親スクリプトごと終了します。
#!/bin/bash line=`\ termux-dialog text -t "${station}駅" -i "メモを自由に入力して下さい" |\ tr "\n" " "` code=`echo ${line} | jq -r .code` if [ ${code} -eq -1 ] then input=`echo ${line} | jq -r .text` else kill `pgrep mysqld` exit fi
テキストダイアログを起動し、メモを自由入力します。何も書かなくても構いません。このOKボタンを押した瞬間がタスク実行時刻となります。自由入力されたメモは変数 ${input} に返されます。
#!/bin/bash # insertDB.sh テーブルにログを入力します . time_set.sh . location_set.sh
insertDB.sh はOKボタンが押されたときにするジョブです。location_set.sh はスマホのGPS機能を使用して位置情報を取りに行くスクリプトですが、絶対必要というわけでもありませんので詳細は割愛します。
#!/bin/bash
# time_set.sh ログに駅名、日付、時刻、メモを挿入します key=`\ mysql -h ${host} -u user delivery -N << _SQL_ insert into t_log(駅名,日付,時刻,メモ) values("${station}",date(now()),time(now()),"${input}"); select last_insert_id(); _SQL_`
テーブル t_log に必要な情報を挿入します。最後に create_rep.sh で所望のディレクトリにレポートファイルを出力します。
#!/bin/bash month=`date +"%m"` day=`date +"%d"` course=`\ mysql -h ${host} -u user delivery -N << _SQL_ select コース from t_log_convenient where 日付=date(now()); _SQL_` repfile=${report_dir}/${month}月${day}日${course}.html temp=`mktemp ./XXX` mysql -h ${host} -u user delivery -N << _SQL_ > ${temp} select 駅名,時刻,メモ,北緯,東経 from t_log where 日付=date(now()); _SQL_ cat << _HEADER_ > ${repfile} <html> <head> <meta charset="UTF-8"> <style type="text/css"> h3 { margin-left:60%; font-size:16pt; font-family: serif } table { page-break-inside:auto; margin-left:15%; font-size:16pt} th { background-color: #ccc; } tr { page-break-inside:avoid; page-break-after:auto } </style> </head> <body> <table border="1px" width="70%" > <caption><span style="font-size: 120%;">${month}月${day}日 ${course}コースのタスク実行時刻</span></caption> <meta http-equiv="content-type" charset="utf-8"> <tr> <th width="30%">駅名</th> <th width="20%">時刻</th> <th width="30%"> 備考</th> <th width="10%"> 北緯</th> <th width="10%"> 東経</th> </tr> _HEADER_ cat ${temp} |\ awk -F"\t" --assign line="$line" \ '{printf " <tr valign=\"top\">\n"} \ {printf " <td align=\"center\">%s</td>\n",$1} \ {printf " <td align=\"center\" style=\"font-size:100%;\">%s</td>\n",$2} \ {printf " <td align=\"left\" style=\"font-size:100%;\">%s</td>\n",$3} \ {printf " <td align=\"left\" style=\"font-size:60%;\">%s</td>\n",$4} \ {printf " <td align=\"left\" style=\"font-size:60%;\">%s</td>\n",$5} \ {printf " </tr>\n"}' >> ${repfile} cat << _FOOTER_ >> ${repfile} </table> <h3> 以上、御報告申し上げます。<BR> 担当者 安倍晴明<BR></h3> </body></html> _FOOTER_ rm ${temp}
駅名 | 時刻 | 備考 | 北緯 | 東経 |
---|---|---|---|---|
新大阪 | 14:54:00 | 出発 | NULL | NULL |
彦根 | 15:33:20 | 備忘録を残します | NULL | NUL |
名古屋 | 16:02:50 | 通過時刻 | NULL | NULL |
静岡 | 17:25:00 | NULL | NULL | |
小田原 | 18:14:00 | 実行時刻 | NULL | NULL |
東京 | 18:48:30 | 終了時刻 | NULL | NULL |