2020/07/30

作業環境

COVID-19 の影響で 2 月から完全自宅勤務になったので、 自宅の作業環境を整えてみました。

Image: 20200730_013237043_iOS.jpg

作業スペース

メインマシンの MacBook Pro はデスク横の台に設置して Belkin の Thunderbolt 3 Dock Pro 経由で給電かつモニタ出力です。 モニタは作業場所 (デスクのサイズ) の関係で 23.8 インチの Dell P2415Q を選びました。 少し古めの設計ですが 60Hz の 4K 対応の割に安価なので満足しています。

Image: 20200730_031841179_iOS.jpg

Belkin Thunderbolt 3 Dock Pro

Belkin の Dock Pro は 85w で MacBook Pro に給電しつつ 4K のモニタ出力や USB ハブとして機能するので非常に便利です。 問題は少し高価な事なのですが、今回は貸与された MacBook Air の備品扱いとして職場で購入して貰えたのでラッキーでした。

ディスプレイの横には職場から貸与された MacBook Air をサブマシンとして設置しています。 こちらは職場の連絡用の Slack や Zoom などを常時起動しています。 作業終了後などでも気軽に自宅内を持ち歩いてちょっとした作業や調べものなどに重宝しています。

音響は少し奮発して B&W の MM-1 を調達しました。USB DAC 内蔵のアクティブスピーカーなので、 MacBook Pro からは 上記の Dock Pro 経由で USB 接続していますが、さすが老舗オーディオメーカーの製品だけあって素晴らしい音質です。 既に随分以前に廃盤となった製品なのですが eBay で程度の良い中古品をゲットできました。

Image: 20200730_032052347_iOS.jpg

B & W MM-1

真ん中に見える白いのは無印良品のポータブルアロマディフューザーです。 こちらは加熱せずにアロマオイルの原液をファンの微風で拡散させるタイプ。 説明書によると有効範囲は 50cm 程度との事ですが、香りが強すぎず良い感じです。 普段作業時はヒノキかホワイトムスクを仄かに香らせています。

Image: 20200730_031919075_iOS.jpg

無印良品 ポータブルアロマディフューザ

2020/07/22

awk による IPv4 アドレスのマッチ処理

標準入力から入力されるテキストデータから IPv4 アドレスを awk(1) を利用して抽出する。
その際に CIDR 形式でないアドレスに関しては末尾に "/32" を付与して CIDR 形式にして出力する。

  1awk '{
  2    if(match($0, /([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}(\/[[:digit:]]{1,2})?/))
  3        print match((ip = substr($0, RSTART, RLENGTH)), /\/[[:digit:]]{1,2}/) ? ip : ip "/32";
  4}'
    

1 行目の match() 関数で入力データから正規表現を利用して IPv4 アドレスを抽出し、 2 行目の substr() 関数を利用してマッチした範囲を切り出して IPv4 アドレスを変数 ip に格納している。 2 行目の match() 関数で変数 ip に格納された IPv4 アドレスにに CIDR 部分があるかを調査し、 CIDR 部がない場合は "/32" を付与して出力している。

IPv4 アドレスは "192.0.2.1" の様に「0 から 9 までの数字 1 桁から 3 桁が "." を挟んで 4 組連続する」形式で、 CIDR は "/24" の様に「"/" に続いて 0 から 9 までの数字 1 桁から 2 桁」なので、 正規表現は

[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(\/[0-9]{1,2})?
となるが、 煩雑になるので
([0-9]{1,3}\.){1,3}[0-9]{1,3}(\/[0-9]{1,2})?
とまとめ、 更に数字部分を POSIX クラスに置き換えて
([[:digit:]]{1,3}\.){1,3}[[:digit:]]{1,3}(\/[[:digit:]]{1,2})?
とした。

入力データ中の IPv4 アドレスが重複する可能性がある場合は、直接出力せず一度連想配列に格納する事で uniq(1) 相当の処理も可能となる。

  1awk '{
  2    if(match($0, /([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}(\/[[:digit:]]{1,2})?/))
  3        list[match((ip = substr($0, RSTART, RLENGTH)), /\/[[:digit:]]{1,2}/) ? ip : ip "/32"] = 1;
  4} END {
  5    for(i in liset)
  6        print i;
  7}'
    


Copyright © Mitzyuki IMAIZUMI 2008,2009. All rights reserved.