私の職場では「IP Messenger」(略してIPMsg)を急ぎの連絡用アプリとして使ってましたが、テレワークになって送り先の宛先に誰も表示されなくなりました。
新しいバージョンだと設定次第で使えるようですが、特定のバージョンのみ利用を認められておりその機能は使えません…
そこで急遽IPMsgもどきのツールを作りました。通信プロトコルなどは使用せず、テキストファイルの移動などでメッセージのやり取りを実現しています。
ある程度のプログラム経験者向けの内容です。細かい実装などの説明はなくアルゴリズムの解説がメインです。
目次
使用するアプリ
IPMsgのようなメッセンジャーアプリを作るのに使ったアプリと機能の一覧です。アクセス(Access)がインストールされてるOfficeがあれば開発可能です。- アクセスVBA
- タスクスケジューラー
- データベース(DB)
- VBS
- バッチファイル
画面の構成はとてもシンプルなので直感的に利用できる画面となっています。利用者側の視点でプログラム経験のない方でも導入しやすいようにバッチファイルも準備しました。
アクセスVBA
作成したメッセンジャーアプリの画面です。メッセージを送信するだけのツールです。直感的に使えるような画面構成です。ボタンの使い方については後ほど解説します。
作り始めた当初はエクセルVBAで作成していましたが、アクセスVBAに変更しました。変更した理由は2つあります。
- エクセルを常駐したくない
- 宛先をDB管理したい
エクセルでツールを作って常駐すると、もし固まった時に他の開いてるエクセルにも影響が出るのでエクセルVBAは辞めました。
私の職場では人の出入りが激しいので、利用者(宛先)を管理しやすいようにDB管理しようと考えてました。
これらを考慮してアクセスVBAで開発しました。
タスクスケジューラー
定例作業を自動化するのにタスクスケジューラーを使っています。- 自分のIPアドレスの更新
- メッセージの受信
利用者のIPアドレスが固定ではなく自動取得の為、朝9時に毎日更新しています。朝9時から業務を開始する職場なので、それまでにパソコンを起動しておけば勝手に宛先が更新されます。
IPアドレスを更新する処理をバッチで作成し、そのバッチを毎朝9時に実行するようにスケジュール登録しています。
送信されたメッセージを受け取る処理もスケジュール登録しています。スケジューラーの最小のサイクルが1分なので、メッセージの受信はリアルタイムではなく1分ごとになります。
プログラム側で繰り返す間隔を短くする方法もありましたが、試行錯誤した結果パソコンに負荷がかかるのでスケジューラー登録に辿り着きました。何かメッセージが届いた!と気付ければ良い位のツールとして作っているのでそこまで凝っていません(笑)
データベース
宛先を管理するのにアクセスのデータベースを使いました。PCの端末名をキー項目として、表示する名称と並び順を変更できるようなテーブル定義にしています。宛先を管理しているテーブルの項目名については後ほど紹介します。
VBS
メッセージを送受信する処理はVBSで作成しました。処理の内容はローカルとファイルサーバーでテキストファイルのやり取りをしています。バッチファイル
タスクスケジューラーへの登録をバッチファイルで作成しました。導入時だけの作業ですが、利用者側からすれば面倒な作業なので準備しました。画面の機能説明
メッセンジャーアプリの画面の項目説明です。
処理内容 | 説明 |
---|---|
①:自分 | 自分の名前とIPアドレスを表示します。 |
②:宛先 | メッセージを送信する宛先を選択します。複数の選択も可能です。 |
③:メッセージ内容 | 送信するメッセージを入力します。 |
④:送信ボタン | 選択した宛先へメッセージを送信します。 |
⑤:更新ボタン | 宛先を更新します。 |
⑥:未読?ボタン | 送信したメッセージが開封されたか確認します。 |
画面の使い方は宛先を選択し、送信するメッセージを入力した後に送信ボタンを押すだけです。自分の宛先を表示しているのはリモート接続できているかを確認する為です。
テレワークで接続する方法によりますが、VPN接続なら自宅のWifiに接続しているIPアドレスとリモート接続先のIPアドレスが2つあります。
リモート接続されている事を判断し、リモート接続している側のIPアドレスを表示しています。リモート接続している側のIPアドレスの判断基準は、IPアドレスの先頭が〇〇から始まるなどで判断できると思います。
説明で使用している192.168…はローカル(自宅)のIPアドレスです。実際にはグローバルのIPアドレスなので192始まりではありません。VPN接続していない場合は使えないような制御を入れています。
使い始めてから気付きましたが、メッセージを送信しても相手が受け取ったか分かりません…そこで自分が送信したメッセージがファイルサーバーに残っていないか確認する為に「未読?ボタン」を用意しました。
自分宛てのメッセージを受け取るのと同様に監視しても良かったのですが、そこまでする必要はないかな?と相手からの反応がなければ押して届いてるか確認する運用にしました。
メッセンジャーアプリの使い方と運用
それではメッセンジャーアプリの使い方と運用について解説します。どのような仕組みで宛先の管理とメッセージの送受信を行っているか説明していこうと思います。宛先を追加する仕組み
処理内容 | 説明 |
---|---|
①:宛先の自動更新 | 朝の9時に自分のIPアドレスをファイルサーバーへ格納します。 |
②:宛先の手動更新 | ファイルサーバーの自分のIPアドレスを更新します。 |
③:宛先の取り込み | ファイルサーバーの宛先リストをメッセンジャーアプリの宛先へ反映します。 |
送信可能な宛先はファイルサーバーへ格納しているテキストファイルで管理しています。「PC[PC名]IP[IPアドレス]DATE[YYYYMMDD].txt」の書式のファイル名で中身は空っぽです。
宛先送信バッチの処理の中で、前日以前の宛先ファイルがあれば削除するような作りにしています。ファイルサーバーに格納されている宛先リストをもとにメッセンジャーアプリの宛先を表示しています。
宛先は朝の9時以降に変更するケースがあります。
- 9時以降の出社(遅刻、時差出社)
- 再起動によるIPアドレスの変更
このような理由から画面の更新ボタンを押せば、自分のIPアドレスの更新とファイルサーバーの宛先リストを取り直すようにしています。
宛先の管理方法
宛先に表示する利用者はアクセスのデータベースで管理しています。但し、アクセスのデータベースを開くのが面倒なのでエクセルで編集したものを取り込めるような作りにしました。
項目名 | 説明 |
---|---|
PCName | PCの端末名を設定します。このツールの仕組み上、キー項目になります。 |
UserName | 宛先に表示する名前です。端末名と紐付けます。 |
IPAddress | PCの端末名に紐づくIPアドレスです。 |
Sort | 宛先リストに表示する並び順を設定します。 |
Disp | 表示のON(1)/OFF(0)を設定します。 |
PC名と宛先に表示する名称は統一しておきたいので、宛先リストは管理者が修正し配布するような運用にしています。
ファイルサーバーの宛先ファイルをもとにIPアドレスを更新し、ファイルがあれば表示をONに更新します。ファイルがない宛先は表示しません。
更新ボタンを押すとエクセルの宛先リストとアクセスのデータベースの同期を取ります。但し、宛先が変わった時だけ宛先リストの同期をしたいので、エクセルの取り込みのON/OFFを切り替えれるように設定ファイルを準備しました。
設定ファイルの内容
2つの項目を設定ファイルで切り替えれるように用意しました。 ;ユーザーリストをExcelの内容で洗い替え 1:洗い替え 0:そのまま
userListUpdate=0
userListUpdate=0
宛先の追加や削除が発生する場合にはエクセルの宛先を修正した後に「洗い替え」に変更し更新ボタンを押します。
;メッセージ受信時の音 1:音あり 0:音なし
sound=1
sound=1
メッセージを受信した時に気づけるように音のON/OFFを切り替えれる設定を追加しました。「音あり」にすればBeep音(ポーンていう機械音)が鳴ります。
メッセージの送受信の仕組み
処理内容 | 説明 |
---|---|
①:メッセージの送信 | メッセージをファイルサーバーへ格納します。 |
②:メッセージの検索 | 自分宛てのメッセージがあるか検索します。 |
③:メッセージの受信 | 自分宛てのメッセージをダイアログ表示します。 |
メッセージを送信するには、メッセンジャーアプリで宛先を選んでメッセージを入力し送信します。
メッセージを送信すると「From[宛先元の名称]To[IPアドレス]Time[yyyyMMddHHmmss]」の書式のファイル名でメッセージ内容をテキストとしてファイルサーバーへ保存します。
メッセージを受信するのは、1分ごとにファイルサーバーへ自分宛てへのメッセージがないか検索をします。
自分宛てのメッセージがあれば自分のローカルへメッセージのファイルを移動し、ダイアログでメッセージを表示します。
まとめ
メッセンジャーアプリのアルゴリズムの解説でした。ツールを作るのが好きな方の参考になれば幸いです。実際に私が働いている職場では10人程度のチームで利用していますが、特に問題なく使えています。
ちょっとしたプログラムを組んでツールを作ってみるのに適した題材のような気がします。バッチや自動化の概念が盛り込まれているのでプログラムの良い勉強になるのでは?
何か気になる点やご意見があればコメントを頂けると嬉しいです。最後までご覧頂き、ありがとうございました。