たばこを減らさねばと、新年の目標としてこの前掲げたばかりだけど。まぁ、吸ってるよね。モクモクと。
基本的に俺は自分がかわいくて欲望に忠実な人間なので、漠然と減煙と謳ったところで絶対に成果が出るはずもなく・・・。やっぱり自分がどれだけ吸ってるかというのを、具体的に可視化しないとダメだなと思った訳でありんす。
で、誰も招待しない自分だけのLINEグループを作成し、一本吸うたびに記録するという作業に取り組んでおりました。
これはこれで前回吸った時間が分かるので、「まだ1時間しか経ってないの!?」みたいな気づきもあったし、何より「これから自分はたばこを吸うぞ」という意識が持てるので意味はあった。何かをしながら吸うっていうのは、向かっている作業に対してもたばこに対しても失礼だからな。この作業のお陰でフィルターギリギリまでちゃんと吸うようになった。
でも、あまりスマートじゃないよな。もっとこう・・・平均のインターバルが伸びてるのか縮んでるのかとか、今月何箱買ったのかとか・・・それこそシステムエンジニアなんだからBIっぽくデータベース管理したいな。何より、当たり前だけど誰の既読もつかないトークルームに延々と投稿を続けるのは寂しい・・・。
というわけで、アプリを作ってみようと思いたったのでありんす。
初めは、Swift勉強してiPhoneアプリでも作ってみるかと思ったのだが、iPhoneの場合、販売するつもりがなくてもApple様に年間99ドルを上納しないと実機に落とせないらしいということを知り諦めた。ただ、途中まではその気で取り組んでいて、ある程度Xcodeにも触れたので、それはそれで機会があれば別の記事に書きたい。
iPhoneアプリがダメなので、Webアプリにしよう。ちょうどこのブログのために借りてるサーバーを使えばいい。このサーバーのデータベースにレコードを蓄積すれば、統計情報をこのブログページで表示できる。俺の父親は俺が喫煙し始めた頃から禁煙しているが、コツは「なるべく多くの人に禁煙宣言をする」ことだと言っていた。辞めるには人の目が必要だと。ま、俺は辞めるつもりまではないけど・・・。たばことウイスキーは・・・文化なんだよ・・・!
今回はWordPressと親和性が高いphpで作ろうと思う。phpなんて扱ったことないけど。htmlもあまり詳しくないけど。まぁ、なんとかなるやろ!
本来ならこういうのは設計前のイメージが一番大事だが、今回は趣味程度なので見切り発車する。とりあえず、単純にボタンを押したらその時刻がデータベースに登録されるWEBページを作りたい。喫煙した時と、たばこを買った時のボタンはそれぞれ分ける。
テーブル作成
まず、データを収める先のテーブルを作ろう。
このブログのサーバーはお名前.comという業者から借りていて、その他の業者のことはよく知らないが、たぶん大抵のレンタルサーバーはWordPressを簡単にインストールできるようなサポートが付いている。従ってWordPress用のMySQLデータベースも親切に用意されていて、それをWeb上で管理できるphpmyadminも連携されてたりする。新しいテーブルを作るならおとなしくこのphpmyadminで作業するのが安全安心。
sqlに詳しくなくてもテーブル管理ができるというのがphpmyadminの利点なのだけれども、俺は触るの初めてだし、職業柄直接DDL打つ方が早い。喫煙記録のテーブルと、購入記録のテーブルを二つ作るぞ。
喫煙記録の方には、喫煙した日時と、前回の喫煙からの間隔を持たせてみた。そのせいで後々ひどい目に遭うとも知らずに・・・。あと、基本的に1回の喫煙につき1本という数値は固定なのだけども、これもレコードして持っていた方が統計する時に便利かと思って列を作っておいた。
購入記録の方は、購入日時と金額情報だけ。これも当分は500円(MEVIUS Eシリーズ)の固定だろうけども、列としてあった方が便利だし、我々喫煙家は常に明日の増税に備える身だから・・・。
というわけで、MySQLデータベース上に2つ新規作成出来やした。
ページ作成
次、実際に俺がアクセスしてボタンをポチポチする画面。まぁ、この画面自体は俺だけがアクセスできれば良い、っていうか誰でもアクセスできてポチポチできたら正しいログが取れない・・・、ので正直ボタン2つさえあれば最低限事足りるんだが。
とりあえずベースはこんなもんか・・・?
実際に使用するときはiPhoneからを想定しているので、試しに表示してみるか・・・。
小せえ!!
そしてバッテリー少ねえ!!
仕方ない。デザインに対するこだわりはないが、CSSシートも書いとくか・・・はぁ・・・(面倒くさがりのシステム屋)
とりあえず幅広げて上下のマージン空けとけばいいべ・・・。
・・・・・・・ヨシ!!(?)
PHPコーディング
しかし、これだけではただのHTML。ここからがマグマなんです!
実際にボタンを押したらテーブルへInsert処理を行うようにコーディングする。面倒臭いから上のHTML拡張子をPHPに換えて、同じファイルでプログラミングしやす。処理自体はSQLのいろは的な単純なものだけども、何せphpが初めてなもんで、phpでどうやってデータベースに接続するんや?っていうところでまず突っ掛かってしまった。
まぁ、接続のための関数(mysqli_connectとか)は調べたら出てきたんだけど、最終的に分かった事は、WordPress上でデータベースアクセスするのはもっと簡単ということ。というのも、WordPressはデータベース通信するためのwpdbクラスというのを定義してくれているらしい。$wpdbというグローバルオブジェクト変数が提供されている、基本的なデータベース操作のための関数をほとんどインスタンス化してくれている。まぁ、つまりどういうことかと言えば、WordPressで利用しているデータベースがあるサーバ上で、そのデータベースに接続するのは簡単☆ってこと!!それ以外のデータベースは知らん。
ともかく、phpファイルからデータベースに接続するには、そのファイル上でwp_load.phpというファイルを読み込んで$wpdbをグローバル変数として宣言するだけ。
require_once( dirname(__FILE__). '/wp-load.php'); global $wpdb;
これだけ。
そんでもって、SQL文を叩いてデータベースをやりとりしたいときは
if (isset($_POST['purchase'])){ $current_time = date("Y/m/d H:i:s"); $purchasing_amt = 500; $wpdb -> insert( $tbl_puc, array( 'purchasing_time' => $current_time, 'amt' => $purchasing_amt, ), array( '%s', '%d' ) );
こんな感じで$wpdbでインスタンス化された関数を使う。直接関数を呼び出すことはできない。ちなみに上のコードは、「買います」ボタンが押された時に、購入記録テーブルに現在時刻と金額情報を登録しておりやす。
こんな調子でコーディングしていって、実際にテーブルにデータが入るのか試してみた。
画面の動作ではエラーがないけども・・・ちゃんとテーブルに登録されてるのか?
ワァーオ!登録はされてるけど時間情報が全然入ってなーい!
0000-00-00で登録されてるってことは、値の受け渡しに使った変数がNULLってわけじゃないみたい。事実、デバッグのために変数の内容を出力させてみたらちゃんと日時が出るんだよね・・・。結局この問題、最後までよく分からなかったんだが、いろいろ調べたところphpのdatetime型でテーブルに値を渡そうとするとうまくいかず、date型を使うと上手くいった。テーブル定義はdatetime型なのに。よく分からん☆
そしてもう一つ、time_interval(喫煙間隔)の列だけども、この値は、現在時刻から登録前のテーブルのsmoking_timeの最大値(最新の日付)を引いて、その差分をDatetime型で格納しようとしていた。が、色々調べたところ、どうやらtimestamp同士で差分計算してもそんな想定の値は得られん、ということだった。しょんぼり。いや、まぁ、色々と関数組み合わせればやりようはあるんだろうけど、それ考えてる間にそれこそ俺のニコチン摂取量が爆増してしまうので・・・。
たどり着いた結論として、そもそも時間間隔をDatetime型で格納しようとしていたことがボーンヘッドだろう。ここはシンプルに秒数で管理する。データを統計して処理するときに時分なり日付なりに変換かませばよろし。よって、テーブル定義を作り替えたでござる。interval_in_secondsという列に置き換えてデータ型を整数にした。
そんでもってphpの日付時刻に関するデータ型や関数の事はもうよう分からん。やっぱりsqlの方が俺は得意や、仕事柄。だから時間差の計算はphpでなくてsql側でさせるような書き方に直した。
$query3 に代入したSQL文の中で時差分を計算しておる。初めからこうすりゃよかった・・・。
ただボタンだけ、というのも寂しいので、最後の喫煙時間や購入時間などを見られるようにしたりとか、その他ちょこちょこ手を加え、いざ、テスト・アゲイン!
動く・・・こいつ・・・動くぞ!
テーブル上にもちゃんと時刻が登録されていることを確認。テストのためにポチポチしたのであって、実際に2秒間隔でたばこを吸ってる訳ではないというのは申し上げておきたい。念の為。
ということで、サーバ上にを登録するというところまではなんとか形になった。あとは、このデータを表示させて活用するページを作るってところだが。これはまた、時間がある時に取り組みます。どっちみち、今日作ったテーブルにある程度データが蓄積されてないと見せれるもんも見せれないしな。
さて、データ蓄積のためにいっぱい吸うぞーー!(破滅)