みんなが優しくなれるテレワークのはじめかた

# はじめに
この記事は、シスコシステムズの有志による [Cisco Systems Japan Advent Calendar 2020](https://qiita.com/advent-calendar/2020/cisco) の 12 日目として投稿しています。

- 2017 年版: https://qiita.com/advent-calendar/2017/cisco
- 2018 年版: https://qiita.com/advent-calendar/2018/cisco
- 2019 年版: https://qiita.com/advent-calendar/2019/cisco
- 2020 年版: [その 1](https://qiita.com/advent-calendar/2020/cisco), [その 2](https://qiita.com/advent-calendar/2020/cisco2)


# TL;DR
![解決したいお悩み](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/c98eb034-c30d-4eef-9b26-13711ee448e9.gif)

- リモートワークが浸透するにつれて、こんなお悩みをよく耳にします
  - Web 会議中に自宅の **私生活のノイズ** が聴こえてくる💥 (掃除機や洗濯機)
  - Web 会議の **品質がすごく悪い** けれど、家族が **NetFlix を再生** 📺 していたのが原因らしい
- この記事では 🔅**会議始めるよ・終わったよボタン**🔅 を作りました
- ボタンを押すと家中のスマートスピーカーから **音声で「会議が始まるよ」「会議が終わるよ」という告知**📢 します
- 会議中は業務に関係のないトラフィックの **通信速度を制限🔇** します
- 用意するのは **ルータと AP とボタンだけ** です、サーバは要りません


# 動作例

[<img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/d629b513-e283-5a1c-3e95-f8b0d73f459f.png">](https://vimeo.com/489768835)

クリックすると別ページで再生されます。この動画の音声は[音読さん](https://ondoku3.com/)を使用しています。

# At-A-Glance

![At-A-Glance](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/092a30ad-b9f4-bc14-02fb-890ba0eebc04.png)

1. ユーザが **ReButton (IoT ボタン) を押す**
2. Cisco ルータが ReButton (の MAC アドレス) がネットワークに現れたことに気づく
3. Cisco ルータの中で Python スクリプトを実行する
    1. **スマートスピーカー (Google Home) でアナウンス** する
    2. Cisco IOS XE の **QoS 設定を変更** する


# 課題

COVID-19 に伴って多くの企業では急ピッチでリモートワークの体制が整えられつつあります。同様に私たち労働者も、慣れないリモートワークで少しでも生産性を高めるために戸惑いながらも日々努力しています。関連タグの Qiita 記事数も緊急事態宣言ごろを堺に爆発的に増加 🔥 しており、私たちエンジニアが **突然始まった在宅勤務を hack しよう** と努力していることがよくわかります。

![関連タグの Qiita 記事数](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/481a84c7-03c7-68be-ee13-ec4051dbf1a0.png)

この記事では、主たる就業場所が自宅に変化するにつれて **家庭ならでは** のお悩みが増えていることに注目して、Web 会議に関する **2 つのお悩み** を解決したいと思います。

ここで述べる問題は、**積極的なコミュニケーション💬** や **部屋の入口に立て札を設置する** といった **小さな工夫で解決できる** 問題です。しかし、在宅勤務が長期化していく中で気持ちの緩みが生じてしまい、結果的に問題が目に見える形で起こってしまうことが増えているのではないでしょうか。

## 課題 1. Web 会議していたら、突然掃除機の音が聞こえてきた😱
![Web 会議していたら、突然掃除機の音が聞こえてきた](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/a0c45908-0afa-4388-5edc-999a217248ca.png)


Web 会議を行うにあたって、**ノイズを減らす** ためや **カメラの背景に変なものが映らないように** 書斎やベッドルームなどに移動されるかたが多いようです。また、そもそも仕事に集中するために書斎に籠もっているような場合も多かろうと想像します。しかし個室に入ってしまうと、部屋の外からは「**いま Web 会議中かどうか**」わかりません。

## 課題 2. Web 会議の品質が悪いのは、他の通信が原因だった😱
![Web 会議の品質が悪いのは、他の通信が原因だった](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/1dc36cb3-819c-8a3c-4f3d-826d8a362976.png)

多くの Web 会議システムは **会議を継続することが最優先** だと考えており、例えば通信品質が悪い環境では自動的にビデオをオフにしたり、ビデオ品質を下げるような機能を備えています。それでもなお、通信環境の悪い状況では **とぎれとぎれの音** や **カクカクのビデオ** に遭遇することがあります。限られた通信帯域を、できる限り業務のために使いたいと考えるのは当たり前の願いです。

# 課題を解決する技術, 製品
## IoT リモコン - ReButton
<img alt="Seed Rebutton" src="https://seeedjp.github.io/ReButton/img/1.png" width=400>[^1]

[^1]: SeeedJP さんの画像を改変して制作しました。これらの画像は [クリエイティブ・コモンズ 表示-継承 4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.en) でライセンスされています。

Seeed ReButton はマルチクリックやロングクリックもサポートしている IoT ボタンです。特徴は Wi-Fi を経由してインターネットに接続するだけではなく、**Azure IoT Central** または **Azure IoT Hub** とネイティブに連携することができる **✨クラウドネイティブ対応の IoT ボタン✨** であるということです。[ロボショップ](https://www.robotshop.com/jp/ja/rebutton-iot-button.html)でだいたい 2,300 円で買ってきました。

<img alt="Amazon-dash" src="https://raw.githubusercontent.com/Nekmo/amazon-dash/master/images/logo.png" width=400>[^2]

[^2]: Copyright (c) 2016 Nekmo. Released under [the MIT license](https://github.com/Nekmo/amazon-dash/blob/develop/LICENSE.txt).

従来、このような用途では **Amazon Dash ボタン** が大活躍していたのですが、惜しくも [サービスが終了](https://www.watch.impress.co.jp/docs/news/1199661.html) してしまうだけではなく、サービス終了後に Amazon Dash ボタンをインターネットに接続すると [文鎮化してしまう](https://docs.nekmo.org/amazon-dash/rescue.html) という恐ろしいはなしを聞き、今回は **不採用** となりました。

![Say Goodbye to Azure](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214716/c0175e21-d544-930b-bc27-b7add7d1e493.png)[^1]

前述の通り、ReButton は Azure のサービスと連携する大変素晴らしい製品ですが、~~わたしにはよく分からなかったので~~この記事では**完全にオンプレミス**で利用します。具体的には、ルータと組み合わせて以下のような仕組みを実装しました。

1. ReButton を押すと電源が ON になり **Wi-Fi に接続**する
2. ルータは **DHCP でアドレスを割り当てる**
3. ルータは **ReButton の MAC アドレスに対するアドレス割当をきっかけに**色んな処理を実行する

## Cisco ルータ + Cisco IOS XE

### 通信制御: Strategic QoS Policy

QoS とは主に優先制御 (データを **通す順番** を調整する) と帯域制御 (データの **通る量** を調整する) によって、**安定したネットワークを実現する** ための技術です。つまり、QoS では「**どういう通信を** `(class-map)`」「**どういうふうにする** `(policy-map)`」という設定が必須となります。

ここで大きな問題になるのは「**どういう通信を**」の部分です。IP アドレスやポート番号で対象を絞ることは、無数のサービスが CDN など多様な方法で提供されている現代では全く通用しません。そこで Cisco では 2000 年頃に **NBAR** (**N**etwork-**B**ased **A**pplication **R**ecognition) と呼ばれるアプリケーション識別/分類の技術を開発しました。

現在では、これが進化した **NBAR2** が普及しており、L7 のペイロード識別 (**データの中身まで見る**) ことで、より正確なアプリケーション識別が可能となっています [^2]。しかし「NBAR2 のおかげでアプリケーションで識別できる！**どんどんアプリケーションを指定しよう**」と考えると、莫大な量のアプリケーションを 1 行 1 行記述した**長大な設定**が必要になってしまいます🤯

[^2]: 詳しくは [Cisco AVC and NBAR2](https://learningnetwork.cisco.com/s/article/Cisco-AVC-and-NBAR2) Posted by @kikuta2055 さん をご参照ください。

このように私たちエンジニアは「なにを (**WHAT**)」「どういう設定で (**HOW**)」に目が行ってしまいがちですが、この方法では複雑なネットワークやビジネスに太刀打ちすることができません。そこで Cisco では、本質である「どうして (**WHY**)」に立ち返った設計構築が可能となる技術/製品開発を積極的に行っています。

今回は「**業務に関わらない通信を遅くしたい**」と考えましたので、QoS における制限の対象は「**業務に関わらない通信**」となります。それならば、なんと**たった一行**で定義することができるんです。


```terminal:show&#x20;run&#x20;class-map
!
class-map match-any scavenger-class
 match protocol attribute business-relevance business-irrelevant
!
```

上記の設定では**「業務への関連性 `business-relevance`」が「関係ない `business-irrelevant`」**を対象にすると宣言しています。すごくないですか？たった一行です。実際のところ、以下のようなアプリケーションが制限の対象となります (分かりやすいように `Japan` でフィルタしてみました)。

```terminal:show&#x20;ip&#x20;nbar&#x20;attribute&#x20;business-relevance&#x20;business-irrelevant&#x20;|&#x20;i&#x20;Japan
  ameba                  Ameba - Japanese blogging and social networking website.
  fc2                    Japanese web hosting service
  gree                   Japanese social gaming platform
  gyao                   Gyao is a video site operated by yahoo Japan
  keyholetv              KeyHoleTV, a Japanese P2PTV program
  kuro                   Japanese file sharing client
  livedoor               Livedoor - Japanese Internet service provider.
  mixi                   Mixi, Japanese social network
  nico-video             Video sharing website in Japan
  rakuten                Rakuten - Japanese e-commerce site.
```

このように NBAR2 では **1,000 以上の** アプリケーションを識別すると同時に、それぞれのアプリケーションに対する **メタ情報** (例えばカテゴリやビジネスとの関連性など) を持っています。この情報を元にして **極めてシンプルな QoS 設定** が可能です。詳しくは [Campus QoS Design-Simplified - DGTL-BRKCRS-2501 (Cisco Live)](https://www.ciscolive.com/global/on-demand-library.html?#/session/1573153542853001JUbe) をご参照ください。

### 処理の実行: EEM + On-Box Python

2018 年のアドベントカレンダーにて解説しましたのでそちらをご参照ください。

- [EEM (Embedded Event Manager)](https://qiita.com/matagawa/items/8213a3dde1a23a93f1eb#eem-embedded-event-manager): 「〜が起こったら〜を実行する」というロジックを装置に実装する機能
- [Guest Shell, On-box Python](https://qiita.com/matagawa/items/8213a3dde1a23a93f1eb#guest-shell-on-box-python): ルータやスイッチの中で Docker コンテナや Python が使える機能
- [Google Home as a Speaker](https://qiita.com/matagawa/items/8213a3dde1a23a93f1eb#google-home-as-a-speaker): `pychromecast` ライブラリを使って任意の音声を Google Home から再生します

Cisco IOS XE のバージョンによって、GuestShell にインストールされている Python のバージョンが異なることに注意してください。最近は色々なライブラリが Python 3+ only サポートとなっているので、自分で backporting する？！という手間が生じるかもしれません。

- Cisco IOS XE 17.1 より前: **Python 2 のみ**
- Cisco IOS XE 17.1 - 17.2: **Python 2 + Python 3** (Cisco Catalyst 9200 Series Switches を除く)
- Cisco IOS XE 17.3 以降: **Python 3 のみ**

# 導入方法

**[GitHub: mochipon/goto-meeting-button](https://github.com/mochipon/goto-meeting-button)** に公開しました。

また、このプログラムは **[Cisco DevNet Code Exchange](https://developer.cisco.com/codeexchange/github/repo/mochipon/goto-meeting-button)** でも公開されています。Cisco DevNet Code Exchange は Cisco の製品やソリューションに関連するプログラムの GitHub レポジトリが集約されている便利なキュレーションサイトです。製品名やキーワードで検索するとパッとサンプルコードにたどり着いて、中身を読んで勉強することができるのでオススメです。掲載にあたっては Cisco の専門チームが `README.md` やライセンス等をレビューしています（わたしも１度蹴られました）。

# 最後に
- ネタ出しに協力してくれた @take01x に感謝 🙏
-  本記事の 4 日前に **ほぼ同じネタ** で素晴らしい記事が投稿されていて白目剥きました 😂
    - See: [8日目 - Webexと連動した「会議中」標示灯を作ってみた。](https://qiita.com/samasuda_sm4jan/items/8ee7223a27f11b66bb80)
    - **なにが出てくるか分からない** というアドベントカレンダー企画の素晴らしさを身をもって体験しました
    - きっと **困っている人が世の中に多くいるんだろう** と思いましたので、勇気を持って投稿します


# 免責事項
本サイトおよび対応するコメントにおいて表明される意見は、投稿者本人の個人的意見であり、シスコの意見ではありません。本サイトの内容は、情報の提供のみを目的として掲載されており、シスコや他の関係者による推奨や表明を目的としたものではありません。各利用者は、本 Web サイトへの掲載により、投稿、リンクその他の方法でアップロードした全ての情報の内容に対して全責任を負い、本 Web サイトの利用に関するあらゆる責任からシスコを免責することに同意したものとします。