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

奇特なブログ

「殊勝に値する行いや心掛け」を意味する、奇特な人になる為のブログです

システム開発における自動化の一例(あくまで一例)

こちらでは、すっかりご無沙汰しております。
まず、前回 2015年の振り返りと2016年の展望 - 奇特なブログ の年末年始に予告した記事は、
別に忘れてはいないんですけど、
内容があまりにも壮大になってしまいそうなのと、
どう書くかで悩んでいる(&調査中)ので、
時期未定に変更します。すいません。
対象になっている本を読んだ方が早いと思いますね、正直。


さて、本題なんですが、
最近「自動化」について考える事があったので、
これまでに見聞きした自動化手法なんぞをメモしておこうかと思いまして。
なので、「一例」なんですけど、
とりあえず以下の様な感じです。
あと、実装が簡単と思われる順番に書いてます。


1.この時間からこの時間まではイベント(別にソシャゲに限らず)を開催中にして、
時間外だったら、非開催中に自動で切り替わるようにして欲しい

以下が、方法(の一例)です。


方法:
DB(CSVとかでも良いけど)に、
イベント情報のテーブルを作り、その中に開始日時と終了日時を持たせる。
そして、イベントページ(仕様によってはTOPページとかも)にアクセスしたら、
アクセスした「サーバー(クライアントはダメ)」の現在日時が、
イベント開始日時と終了日時の範囲に入っているかチェックする。
入っていたら開催中、逆なら非開催中。


まぁ、これは簡単かなぁと。


2.指定時刻になったら、指定したファイルを自動で本番に反映してほしい

ここ(に限らない気もするが)は、やり方が以下の様に複数考えられますね。
あと、ここの(1)~(3)は、この後も出てくるので注意です。

(1)crontabに指定時刻を登録しておく場合
(2)DB(何度も言うが、別にDBじゃなくても可)のテーブルに指定時刻を登録しておく場合
(3)crontabに定期巡回をさせる場合

で、この場合は(1)が一番自然で簡単かなぁと思われます。
次が(2)で、(3)は出来るというよりやっちゃダメ(高確率で事故りそう)と思われます。
で、(1)だと以下の様な感じで。


方法:
crontabにファイルの反映(デプロイ)を開始したい時刻と、
デプロイするシェルスクリプト(ある現場、多いでしょ)を登録しておく。
デプロイするシェルスクリプトは、反映したいファイルパスが書かれているファイル名リストを参照し、
そのファイルのみを、本番に反映させる。
本番反映が終了したら、crontabの該当行はコメントアウト(しなくても良い気もするが)しておく。


ここは、「ファイル名リスト」って所が若干手間かなぁ・・・
コミットしたら、フックスクリプトで、そのファイル名リストを書き換えれば良いか(笑)
指定時刻も書き換え?出来るとは思いますけど、「こういう系って、あんまりやると事故ります」よ。
なので、この辺までかなぁと。


3.指定時刻になったら、自動でテストツールを実行して欲しい

ここは、例えば毎日何時って決まってるんだったら、
上記の(1)が一番かなぁと。
crontabの編集NGなら、(2)もありでしょうけど。
(3)は「頻度による」としか。


方法:
crontabにテストツールの実行を開始したい時刻と、
テストツールの実行コマンドを登録しておく。


で、ここから( or ここで)、カバレッジを取るだの何だのは、現場の方針次第ということで。
あと、上記2と合わせると、Jenkins不要説(まともに使った事無いので、これだけじゃないのかもしれないけど)も(笑)
いや、だって僕の口癖は「面倒だなぁ」ですから、
「覚えなくて良いなら、覚えたくない」んですよね(苦笑)


4.指定時刻になったら、DBのテーブル内の参照するレコードを変えてほしい

これは、ちょっとマニアック(別に、そう難しくはないと思われますが)かも。
あと、トランザクションデータだと、この辺はどうかなと思いますので、
マスタと履歴データ(さすがに怖いが、こっちは消す方でも使えるかも)が対象かなと思いますね。
あと、上記の(1)だと管理大変そうなので、
(2)か(3)かなぁと。


方法:
DB(何度もry)に、スケジュールを管理するテーブルを作り、
指定時刻になったら、
「このテーブル(テーブルAとする)の、この辺を参照する様にする」というレコードを「開始日時と終了日時」も合わせて登録する。
テーブルA側には、上記テーブルの「この辺を」と一致する列を作り、
列が一致しているレコードのみを参照する様にする。
そして、テーブルAからデータを取得する時には、
事前にサーバーの現在時刻に一致するレコードを、スケジュール管理テーブルから取得(この時、絶対にキャッシュから取ってはいけない)し、
「どの辺を参照するか」を決めてから、テーブルAのデータを取得する。


これ、「どの辺を参照するかを変えるじゃなくて、書き換えたら?」って意見もありそうで、
まぁ、確かにそっちでも全然良いと思いますね(書き換え後のキャッシュ消し忘れに注意)。
なので、ココは議論かなぁと。


5.指定時刻になったら、目覚まし時計代わりに、自分のPC内のアダルトDVDの再生が始まる(笑)自動化版Iot?(笑)

wwwwwwwwwwwwwww
で、ココは、実装は全く思い浮かばないですけど、趣味目的で作ってみるのもアリかも(笑)


ということで以上です。
あとは「番外編」として、
自動化とは全然関係無い、以下の様なモノを考えてみました。
・・・多分、以下の本の「キチガイ(では無いという人も、結構いそうなのが怖いですが)要求」辺りから、連想したと思われます。


www.amazon.co.jp


番外編:ファイルのバージョン管理を、バージョン管理ツールを使わないで行いたい

まず、以下の様なテーブル(書式などは若干適当)を作る。


CREATE TABLE file_version_history (
revision INT NOT NULL COMMENT 'リビジョン番号',
no INT NOT NULL COMMENT '識別番号',
file_name TEXT NOT NULL COMMENT '更新されたファイルのパス情報',
change_type INT NOT NULL COMMENT '追加や削除などの更新種別',
file_bosy TEXT NOT NULL COMMENT 'ファイルの中身の内容',
insert_date DATETIME NOT NULL COMMENT '追加日時',
PRIMARY KEY (revision, no)
) COMMENT 'ファイルのバージョン管理テーブル';


次に、クライアントツールやWebでの管理ツールを作り、
そこに、「コミットする」という項目(Webならボタンとか)を作る。
コミットする機能を使用すると、
上記テーブルにレコードが登録される。
差分を取りたい場合は、
上記テーブルの情報と現在の情報を比較する。
リバートしたい場合は、
上記テーブルの対象リビジョンのレコードをDELETEし、
DELETEしたレコードは、同じ様な構造のバックアップテーブルに入れる。
リバートした内容を更にリバートしたい場合は、
バックアップテーブルから、レコードを取ってきて入れ直す。
フックスクリプト?→あくまで番外編なので、一旦ここまで。

こんな感じですかね。

例によって、ご感想などをお待ちしております。