Linuxでライブラリを使わず通信量を取得しよう

###はじめに
　こんばんは、麻菜結です。最近ツイッターでつぶやいた
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">いつかラズパイをwifiルーター兼アレクサ兼ファイルサーバー兼テレビ兼時計にしてそれらのアイテムを廃業にしたい</p>&mdash; 麻菜 結🐜🚪👿🍹 (@asana_yui) <a href="https://twitter.com/asana_yui/status/1297183921138880512?ref_src=twsrc%5Etfw">August 22, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
これを実現していくうえで得た様々な知見に関して書いていこうのやつです。
　今回は置時計に表示する通信量データを、ライブラリを使わずゴリゴリ取得したやつです。

###環境
Raspbian64bit

```
Linux asana 5.4.51-v8+ #1333 SMP PREEMPT Mon Aug 10 16:58:35 BST 2020 aarch64 GNU/Linux
```
Debian系の傍流です。あんまりこの辺は気にしなくてよさそう。

###やりかた
`/proc/net/dev`にアクセスしてみるだけです。結構わかりやすく書いてある。

```
$ cat /proc/net/dev
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo:    9120     152    0    0    0     0          0         0     9120     152    0    0    0     0       0          0
 wlan0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
  eth0: 2265270920 1920829    0    0    0     0          0      8753 2436031286 2437082    0    0    0     0       0          0
```
左側は受け取った通信、右側は送り出した通信です。それぞれの行からインターフェースを選んで、バイト数なりパケット数なりを切り取っていけばよい訳です。ここで表示される数は起動してからの累計の数なので、もし『今どのくらい通信しているかのグラフを作成したい』となったら、前の数値との比較を行えばいいわけですね。

###実際の取得例
Python3.7.3でやってみます。いわゆる`with句`が使えるやつにしましょう。
今回は、古い値と新しい値を比較して差を標準出力するプログラムを作成してみます。
0.5秒間隔で出力するので、適当な所で`Ctrl+C`で止めてください。

```python:print_traffic.py
from time import sleep

data = []
now = [0, 0]
old = [0, 0]
interface = "eth0"

try:
    while(True):
        with open("/proc/net/dev", mode="r") as f:
            for l in f.readlines():
                if(interface in l):
                    data = [e for e in l.split(" ") if e != ""]
        now = [int(data[1]), int(data[9])]
        print(f"Receive:  {now[0] - old[0]} Byte Transmit: {now[1] - old[1]} Byte")
        old = now
        sleep(0.5)
except KeyboardInterrupt:
    pass

```

```:出力結果
$ python3 print_traffic.py
Receive:  2268743515 Byte Transmit: 3012744264 Byte
Receive:  60 Byte Transmit: 146 Byte
Receive:  60 Byte Transmit: 130 Byte
Receive:  60 Byte Transmit: 130 Byte
Receive:  222 Byte Transmit: 275 Byte
^C
```
　0番目の値がはねていますが、初期値が0の為です。ちゃんとしたグラフアプリケーションを作る人はエラー値として消しておくと無難だとおもいます。
　ちなみに、スクリプトの内包表記の部分の処理、一回実行してみればわかりますが、このように書くと、その行の空白を除いた、インターフェース名と数値だけのリストになるので便利です。そのあとお好きな値を取り出してみてください。

###終わりに
　今回は、知ってる人にとってはLinuxの基礎の基礎みたいなところから記事を作りました。もちろんLinuxUnix弱者の私は最近知ったわけですが。ラズパイの5インチのディスプレイを買ったとたんいろんな使い道が思いついてやばいですね。これ系統で記事がいっぱいかけそう。なお
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">置き時計できた！<br>タッチパネル採用でipアドレス表示とか画面消灯とかができます。<br>qiitaで質問に答えてくれた兄貴ありがとう！ <a href="https://t.co/bOGuSIT1rC">pic.twitter.com/bOGuSIT1rC</a></p>&mdash; 麻菜 結🐜🚪👿🍹 (@asana_yui) <a href="https://twitter.com/asana_yui/status/1300321404802314240?ref_src=twsrc%5Etfw">August 31, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
のCPUとメモリ部分はpsutilライブラリを使いました。この記事の意味が問われます。（画像の通信量部分はこの記事のモノと仕様が異なります。）
　ここまで読んでくださってありがとうございました。お役に立てたならば幸いです。