Kasasagi’s memorandum

JavaとかProcessingとか。最近はAtcoderとか。

電車の時刻になったら通知を飛ばすシステム Growlで通知編

どうもかささぎです。ヒンナヒンナ。

前回の記事の続きです。

時刻表のデータを取得することができ、これをもとに通知する部分を作ったのでその部分を書きます。


Growl for Windows

Windowsの通知にはGrowlを利用することにしました。

本当はWindowsの通知センターに直接表示できる通知を送りたかったのですが、どうやらC#のプログラムでないと厳しそうなのでGrowlという通知を送ることができるソフトウェアを利用することにしました。



以下のHPからダウンロード&インストールします。

http://www.growlforwindows.com/gfw/



その後コマンドラインで以下のコマンドを実行し、ruby_gntpというライブラリを実行できるようにします。

gem install ruby_gntp

Hash

Rubyでは連想配列としてHashクラスが用意されています。連想配列とは名前を付けられる配列のようなものです。



前回出力したCSVのデータ構造は以下の通りです。

5,27
6,14
7,4,29
8,10
...

これを行の先頭の値をkey,残りを配列としてvalueに格納することにします。


コードは以下のようになりました。

data = CSV.read("TimeTable.csv")

data.map! { |item| [item[0].to_i,item[1..item.length].map! { |i| i.to_i } ] }

table = Hash[*data.flatten(1)]

CSV.readは以下のような構造で取得できます。

[["5","27"],["6","14"],["7","4","29"],["8","10"],…]

数値ではなく文字列型となります。

次の行ではブロックごとに処理を行い、戻り値で配列を生成して返すmapメソッドを利用しています。

長さが2の配列で、最初の要素は元データの先頭の値、次の要素には元データの先頭以外を配列にしたものを格納しています。


また、同時にデータとして扱いやすいようint型にキャストしています。

これを行った時のdataは以下の通りです。

[[5,[27]],[6,[14]],[7,[4,29]],[8,[10]],…]


最後の行では配列をHashに変換するHashメソッドを用いています。

これはこちらの記事を参考にさせて頂きました→
ArrayからHashに変換する方法いろいろ


最終的にtableは以下のような感じになります。

{5=>[27], 6=>[14], 7=>[4, 29], 8=>[10],…}

実装

学校から駅まで徒歩で15分ほどかかるので、余裕を持たせて20分前に通知を飛ばすことにしました。


ソースコード


gist2564d5b69bcffe5382c2ccd75d0bb0e9


GNTP.nontifyメソッドで通知を送ることができます。

app_name → アプリ名、
title → 通知のタイトル、
text → 通知の内容、
icon → アイコン画像、
sticky → クリックするまで通知を出したままにするかどうか

を設定することができます。


<実行結果>

f:id:yh9092:20180616184040p:plain


とりあえずやりたいことは完成することができました。



あとはこれをタスクスケジューラでトリガを1分毎に設定し…と思っていたのですが。。。

f:id:yh9092:20180616184353p:plain


トリガは最短でも5分間隔でしか設定できないみたいですね。


まあ20分を切ったら通知のようにしてもよいのですが、なんだか思ってたのと違うなって感じです。



やはりユーザサイドでなくサーバサイドで実装するべきだった気がします。

余裕があったらAWSかAzureでも利用して作り直してみたいと思います。


それでは。