読者です 読者をやめる 読者になる 読者になる

ほんじゃら堂

めんどくさい仕事をラクにする作業自動化レシピ集

自動化のための「トリガー」について考える

IT系・技術系 自動化

f:id:piro_suke:20160901012222j:plain

何かしらの作業を自動化する際、

その作業を起動する「きっかけ(イベント)」を何にするかを考える必要がある。

例えば定期的に実行するなら、「曜日」や「時間」がきっかけになるし、

自分が実行したい時に実行するなら(それを自動化と呼ぶかどうかはさておき)

「手動実行」がきっかけになる。

この「きっかけ」をうまく設定できるかどうかで、

期待通りのタイミングで作業が行われるかどうか、

無駄な負荷を避けられるかどうかが決まるので、

作業の自動化において結構重要な要素となる。

プログラムの自動化に必要な「トリガー」

あるプログラムを何らかのきっかけによって

自動的に実行されるようにしたい場合、

  1. 何らかの対象の変化(きっかけ)を察知する

  2. きっかけに応じてあらかじめ決められたプログラムを起動する

  3. プログラムの処理が実行される

の3段階の処理が必要となる。

上記のうち、1と2が自動化にとって重要な「トリガー」となる。

特定の状況が発生した時にプログラムが起動されるようにすることで、

自動化を実現するわけだ。

トリガー処理と本体のプログラムは分かれている場合もあれば、

1つのプログラムが両方の役割を担う場合もある。

例えば

「特定の日時になったらチャットワークにメッセージを通知する」

ような自動化プログラムを作成する場合、

「日時の変更を察知してプログラムを起動する」トリガー処理は

Windowsならタスクスケジューラ、Linuxならcrondのようにすぐに使える

ツールがあるので、本体のチャットワーク通知プログラムだけ自作して

トリガー処理はこれらのツールに任せる。

上記のようなタスク管理ツールがない環境であれば、

1秒毎に時刻をチェックして指定した時刻になったら通知処理を呼び出すような

監視処理を自分で書いて、1つのプログラムとして提供するパターンもある。

何の変化をプログラム起動のきっかけとするか

だいたい下記のどちらかのイベントをきっかけとする場合が多い:

  • 日時の変化
  • データの変化

気軽に使えて、汎用性も高いのが上述したような

「日時の変化」をきっかけとしてプログラムを起動する方法だ。

これを使えば、特定の時間に処理を実行するだけでなく、

定期的にプログラムを実行することもできるので、

5分ごとにデータベースやファイルの内容をチェックして、

データが増えていたらプログラムを実行するような

「(日時+)データの変化」をきっかけとしたプログラム自動化も

実現できる。

blog.honjala.net

blog.honjala.net

このような定期処理は作りやすくていいのだけど、

もっと変更をリアルタイムで検知してプログラムを実行したいんだ、

という場合は

直接ファイルやフォルダ、データベースの変更を監視するような

「データの変化」をきっかけとしてプログラムを起動するトリガーを

用意することになる。

データベースの変更監視なら、データベースを管理する

DBMSがトリガー機能を持っているのでこの機能が使えるだろうし、

ファイルやフォルダの監視であれば、プログラム言語がライブラリとして

監視用ライブラリを持っている場合が多いので、それらを使うことになる。

JavaならWatchService、Pythonならwatchdog、Clojureならhawkが

そのようなライブラリになっている。

d.hatena.ne.jp

qiita.com

github.com

blog.honjala.net

日時の変化、データの変化の他にも、

別の動作中プログラムで特定の状態になった時に別の通知プログラムを起動するような、

「別プログラムの状態の変化」をトリガーとする場合も考えられる。

これは上記の2つとは異なり、どちらかというと呼び出し元のプログラムが

本体で呼び出される側がおまけみたいなケースが多いと思われるので、

「プログラムの自動化」とはまた別かな、ということで含めていないが、

IFTTTから自作サービスを呼び出すような場合は、

プログラムの状態変化をトリガーとした自動化、と言えるかも。

blog.honjala.net

おわり

自動化のためのイベントとトリガーについては、

もっと色々なパターンが考えられそう。

また考えがまとまったら書きたい。

ワールドトリガー 1 (ジャンプコミックスDIGITAL)

ワールドトリガー 1 (ジャンプコミックスDIGITAL)