見出し画像

いまさらですが、CGIで座席表作りました

 21世紀に入って20年も経った2021年にいまさらですが、CGIで座席表を作ったお話です。

CGI 【Common Gateway Interface】
 CGIとは、Webサーバが、Webブラウザなどからの要求に応じてプログラムを実行する仕組みの一つ。Web上で最も初期から用いられている動的なプログラム起動のための技術仕様で、多くのWebサーバソフトウェアが対応している。

 発端はフリーアドレスを始めたってことなんですが、フリーアドレスは毎日違う席に座るので、簡単に更新できる座席表が必要です。

 1.座席表の条件

座席表の条件としては
1.簡単に座席を登録できる
2.来訪者もわかるように、座席表を掲示したい
3.電話の取次ぎに便利なように、イントラでも見られるようにしたい
4.コロナ禍でもあるので、毎日の履歴は残す必要がある
5.できれば予約もやってみたい

ということで、まずはExcelでVBAを使って座席表を作り始めました。
ところが

2.Excelの課題

1.ファイルが重たい
2.イントラからの閲覧、履歴の保存がめんどくさい
3.多重アクセスが避けられない
4.座席に座らないと登録できない

と、いろいろ問題があることがわかってきました。

2-1.重たい

 VBAでいろいろな機能(座席登録、閲覧・履歴用のpdfの書き出し、毎日のクリア、予約など)は実装できたんですが、重たくて開くのに時間がかかります。特に朝いちは座席をクリアしたり予約を座席に展開するので重たいです。

2-2.イントラからの閲覧、履歴の保存がめんどくさい

 一応VBAでファイルを閉じるときにpdfファイルを書き出すようにして、書き出したpdfをイントラで閲覧できるようにしたんですが、ファイルを閉じるのに時間がかかったり、溜まっていくpdfファイルが重かったり。

2-3.多重アクセスが避けられない

 Excelファイルを共有フォルダに置いておきみんながアクセスすることにしましたが、朝いちなどはアクセスが集中します。誰かがファイルを開いている間はほかの人がアクセスできないという事態が頻発しそうです。

2-4.座席に座らないと登録できない

 フリーアドレスでは朝出勤したら「今日はどの座席に座ろうか」と考えて好きな座席を選ぶわけですが、いざ座席表に登録しようとすると、まだ登録していない座席に座ってパソコンを立ち上げ、Excelに登録しないといけません。パソコンを立ち上げてみたら誰かが既に登録している(たまたまトイレに行っていたり)ことだってあり得ます。

3.cgiで座席表を作る

 そこで、せっかくExcelで作った座席表ですがこれをいったんあきらめ、cgiで座席表を作ることにしました。

 cgiといえばすっかり枯れた(すたれた?)技術で、いまならJavaScriptとか使うんでしょう。なぜいまさらcgi?とよく聞かれます。

・うちのイントラで走っているWebサーバで使える、動的な処理のできる言語はcgiぐらい
・以前、自宅でApatcheとPearlを入れたWebサーバを立てていたときに掲示板も立ててたんで、cgiをちょっといじったことがある
・枯れた技術なので、ネットにフリーのサンプルがいろいろある

ということで、cgiで座席表を作ることにしたわけです。

 仕事の合間にちまちまと作り、2か月でだいたい出来上がりました。盛り込んだ機能は以下の通り。

4.cgi座席表に盛り込んだ機能

4-1.レイアウトの設定

座席や什器のレイアウトをそれぞれテキストファイルで設定して、カスタマイズが簡単にできるようにした。
 升目の縦横の座標と連結数で座席と什器を定義してテキストファイル①②に設定して、<table>で表示しています。座ることを登録できる「座席」と、表示するだけの「什器」をそれぞれ別のテキストファイルに設定することで、室内の配置をわかりやすく、設定も簡単にしました。

4-2.メンバーの設定

 メンバーの氏名、グループ、肩書をテキストファイル③で設定して、人事異動でのメンテが簡単にできるようにした。
 グループごとに表示する色、肩書ごとにつける文字の色も、それぞれ別ファイル④⑤で設定できるようにしました。

4-3.出席の登録・消去

 プルダウン表示した座席と氏名を選択して登録・消去できるようにしました。
 当日の登録された情報(座席番号と座る人のコードだけ)をテキストファイル⑥に記録します。あわせて、登録・消去を行うたびに、日付の入った履歴ファイル⑦に(ない場合は作成して)、日時、登録・消去、座席番号、コードを書き加えています。

4-4.座席表の表示

 以上をまとめて、座席表へ表示しています。
 座席表の表示は基本、HTMLの<table>です。まず座席と什器の座標情報を①②から読み取ってセルに展開し、全体のテーブルを作ります。実はここが一番苦労しました(笑)。横連結があった場合に、その横のセル数を減らすのは、単に横連結数を見て判断すればいいのですが、縦連結+横連結があった場合に、当該セルの下のセル、さらにその横の横連結の分だけ、その横のセル数を減らさないといけません。結局、下のセルにダミーの横連結の関数を設定しました。座席の座標+連結数と、什器の座標+連結数の最大の値で、テーブル全体の大きさを決めます。
 そして⑥から座席番号に一致するコードを読み取り、③からコードに一致する氏名・肩書、グループを読み取り、氏名、肩書はそのままセルに設定し、④から読み取ったグループの色をセルの色に、⑤から読み取った肩書の色をセルの肩書の色に設定します。

4-5.予約

 別画面で次の日の予約の登録・消去をできるようにしました。
・予約登録された座席番号とコードは、予約用のテキストファイル⑧に記録しています。予約用の画面でも、上記の当日用の座席表の表示と同様の表示を行っています(表示をサブルーチンにして、引数を「当日の座席ファイル⑥」にするか「予約用の座席ファイル⑧」にするかを変えるだけ)。

・日にちが変わったら座席表をクリアして予約が当日の座席表に反映される(「予約 Aさん」のように)よう、更新するようにしました。
 予約用の座席ファイル⑧の内容を読みだして(ファイル⑧の内容は消去)、当日の予約表示ファイル⑨に書き込み、当日の座席ファイル⑥をクリアします。
 当日の予約表示ファイル⑧は、当日の座席ファイル⑥の表示の前に、当日の座席ファイル⑥の表示と同様のルーチンで表示を行っています((これもサブルーチンで)。
(氏名の前に「予約 」だけ付け加えて、フォントを小さくしてますが)
 日にちの変わったことの判定は座席ファイル⑥の更新日付と現在の日付との比較で行っていますが、現在の日付が休日の場合は更新しないようにしました(休日の判定はちょっと面倒でしたが)。休日の回避処理を行わないと、例えば日曜日に誰かが座席表を閲覧すると一度更新されてしまい予約用の座席ファイル⑧が空になってしまいます。そのあと月曜日に日にちが変わるので再度更新されると、金曜日に入力していたはずの予約が消えているので当日の予約を表示できなくなってしまいます。これを防ぐために結局休日判定を入れざるを得ませんでした。

5.まとめ

実は、最初に挙げた課題のうち、条件2(他部門からの来訪者もわかるように掲示したい)、課題4(座席に座らないと登録できない)は解決していません(毎朝印刷して貼りだすことで条件2はなんとかするつもりです)。

 抜本的な解決策としては、登録・表示用のタッチネル式のサイネージを入口に置くことだと思っています。入口を入ったところにサイネージを設置すれば、入ってきたときに座る席を登録できますし、他部門からの来訪者もサイネージを見れば誰がどこにいるかひと目でわかります。

 まあ、お金がかかることなのですぐにはできないでしょうし、そもそもcgiの座席表が使えるようにならないと偉い人がイメージわかないと思うので、すぐには無理でしょう。

 要望だけは挙げておいたので、サイネージの導入は情シスと偉い人にお任せして、私はcgiをきちんと仕上げることにします。

 残る問題はいつ試行を始めるかですね。まだバグは多いと思うので出来れば私が毎日出勤してトラブル対応できる状態で試行したいんですが、緊急事態宣言が解除されてテレワークがどうなるのかまだよくわかりません。

コロナめ!

※タイトル画像は適当にマッピングした座席表のサンプルです。

#cgi
#座席表
#フリーアドレス

この記事が気に入ったらサポートをしてみませんか?