20年ぶりの IGP、1年経ちました
前職から古河電工の古河ネットワークソリューションに移って1年が経ちました。前職で入社して最初に携わったのが gated ベースのルータで、そこから10年ほど RIP/OSPF を中心に開発してたけど、そこから firewall に移ったり、さらにネットワークから離れたりっていうのが、だいたい20年。現職に来て担当するのは IS-IS で、IGP の世界は 20 年ぶりになります。
あわせて 20 年も離れてると、いろんなところで知らないことが沢山あります。「ネットワークは best effort だろうよ QoS なんて」なんてことを言ってた頃からすると隔世の感があって、
QoS に限らずいろんな技を駆使して耐障害性が本当にあがっていました。
まーそれだけネットがシビアに使えて当たり前という時代になったんだなぁ。
IGP の世界に戻ってきて、若かった頃と同じようなことをやるようになって、
懐かしいとも思うのですが、当時よりは周囲が見えるようになってるのもあって、
検証対応なんかは思ってたよりずっとすいすい話が進むのが嬉しい。
むかしむかし U さんや S さんに鍛えられたのは、いまでも役に立つんだなあ
と、感謝。
さらに今の職場は顧客ありきではなく、IETF / Interop / Janog など多方面に
アンテナを伸ばしてて、とくに若手をそういったところにどんどん送り出すので、
開発テーマがとても活気があって、居心地がいい職場です。
OSPF 時代に同じ OSPF 屋さんとして交流を持った小原さんと、
まさにいま一緒に仕事できてる、っていうのも面白いポイントで、
刺激的におしごとできるのも嬉しい。
というわけで、転職一周年ブログでした。若返った気持ちで楽しんでいます。
WSL2でのGitHub認証
wsl2 から github.com へ push/pull するのが最近かなり面倒だったのが、解決した。
背景は、github.com でパスワード認証をやめたこと。安全性は高まるけど、そのぶん不便になった。
それからしばらくは、どうやって取得していたのかもはや覚えてないけど、クライアント用のパスワードを発行して、vi .git/config に埋め込んでいた。そうすることで、wsl2 Ubuntu 環境からはパスワードレスで github.com にアクセスできていたんだけど、まぁ安全ではないわな。
PC 更改をきっかけに、この安全じゃない方法をやめたいな、といろいろ調べてみた。
GitHub CLI
sudo apt install gh でインストールできる gh コマンドを使って、gh auth login で認証すると、それからはパスワードレスで github にアクセスできる。ちょうど SSH で言うところの ssh-agent みたいな感覚で使える。
この gh auth login コマンドは内部でブラウザを起動して、ブラウザで github.com にログインしたうえで認証 (OAuth2かな?) するという仕組みになっている。WSL2 ではそこが厄介なところ。母艦の Windows のブラウザなら普段から起動しっぱなしだが、WSL2 にブラウザをインストールしようとはなかなか思わない。同種のブラウザをふたつ入れても仕方ないし、入れるとディスク食うし動かすとメモリ食うし。
それでもしばらくは、WSL2 に firefox をインストールしていた。firefox の起動にめたくそ時間がかかるのを我慢していた。
wslu
先日ふと、「WSL2でのGitHubの認証をできる限り楽に行う | cloud.config Tech Blog」 を見かけた。wslview というコマンドを使えば、母艦のブラウザで認証できるらしい。
さっそく sudo apt install wslu と sudo apt remove firefox して、gh auth login してみた。
快適!!!ちゃんと母艦のブラウザで認証できる。
久し振りに OSS でも考えるか
もう10年ちかく、自作のツールを OSS 化する、みたいなことをやっていませんでした。
ちょっと切っ掛けがあったので久し振りに、手持ちの手慰みツールのひとつを OSS 化してみようと思います。
趣旨
銀行残高をうっかりチェックし損ねてて、 カード引き落としに失敗して、余計な手数料とられちゃったこと、ありませんか?
僕はあります。
カード会社 ATM に行って、わざわざ振り込みしなくちゃいけない。 しかもカード会社の ATM って、銀行 ATM みたいに多くないんですよね。 駅前とか行かなくっちゃいけない。
それで、月末と月初にカード会社のページを開いて、請求額を合計して、銀行のページを開いて、残高を見て、 両者を見比べて、よーし大丈夫、とか思ってたら固定資産税のことを忘れてて、 やっぱりカード引き落としに失敗してたり。
しかも、カード引き落としの失敗って、銀行の残高にもカード会社の請求額ページにも出てこなくて、 ハガキが来てやっと気付くんですよね。
こうなるともう、
コンチクショー
と叫びたくなっちゃう。
そこで、忘れちゃいそうな請求、カードの請求、いろんな請求をまるっとメモしておいて、 残高やばくないよね? っていつでも確認できるツールを考え始めました。
第1世代
ただシンプルに、Excel です。
市役所から固定資産税の引き落とし事前通知が来たら、引き落とし日付と金額を Excel にメモる。 カード会社からの請求額が確定したら、引き落とし日付と金額を Excel にメモる。 新聞、マンション管理費、水道、ガスなどもひたすらメモる。
これだけで当初の目的は達成できます。
さらに、カード会社のページを普段から開くようになると、 カードの使用履歴もついでに確認できます。 というか確認しろってカード会社も言ってますよね。
これも Excel にメモっておけば、あとでレシートや Amazon の購入履歴と照合することができます。
さて、これでだいぶ便利になりました。
第2世代
ただ、この第1世代って全手動なんですよね。ブラウザから Excel へのコピペって、とっても面倒。
また、カード会社のページごとに表のフォーマットが違うので、Excel にコピーした表もカード会社ごとにバラバラ。そうなると合算するのも面倒。
もやもやしながら、しばらくこの方法を続けていました。
面倒が続くとイヤになるもので、表フォーマットを統一したくなりました。
表フォーマットを統一すると、カード会社のページからコピペしたくても、フォーマット違いでコピペできなくなるので、 何らかの方法でフォーマットを合わせてあげる必要があります。
そこで第2世代として、フォーマットを合わせてあげる部分を Firefox extension 化しました。
銀行・カード会社の明細ページを開いておいてから、exension を起動すると、あらかじめ決めておいたフォーマットに沿って明細表を手直しして、コピペバッファに転送します。あとは Excel 側にペーストすればおっけー。日付順にソートすれば、時系列まで見えてカンペキ。
……と、ここまでが現時点です。
第n世代
これを OSS 化しようかなーと考え始めたのですが、やるべきことはわりといろいろあります。
金融機関の規約
本筋としてはスクレイピングではなく、カード会社や銀行のユーザー向け API を確認した方が便利に決まってます。
しかし、規約などでクローリングに制限がかかっていると、岡崎市立中央図書館事件 - Wikipedia のようなこともあったりなかったりするわけです。
いっそのこと、認証はブラウザ・人力に任せたままにして、スクレイピングだけを想定した方がいいのかもしれません。
まぁなんにせよ、各金融機関の API 利用規約を調べてからですね。
スクレイピング
もし API ではなくスクレイピングでやるとしたら、 今度は DOM からどうやってデータをピックアップするか、というのが次の課題になります。
現行の第2世代では、ブラウザの開発ツールで HTML 要素を確認しながら、データ抽出する javascript を書いています。
僕が使っていない金融機関のページを監視対象に加えるかもしれない、ということを念頭に置くと、 「開発者ツールを見ながら javascript 書いてね」というのは鬼ですよね。
uBlock Origin – フリーかつオープンソースの広告ブロッカー。 みたいな GUI で、データの領域を指定できるといいなあ。
台帳
第2世代では、データは最終的にぜんぶ Excel に収めています。
それでもいいっちゃあいいんだけど、ブラウザだけで完結した方が便利くならない? なんとなくそんな気がしてる。
まとめ
まだ全然まとまってないけど、手慰みツールを公開しようとすると、なかなか大変そうであることは見えてきました。
さて、どこから手を付けようかなあ。
キーボードがおかしい (2/2)
去年「キーボードがおかしい」という記事を書いたっきり、1 年半ばかり何も書いていませんでした。
この期間に、職場が変わったこともあって、あまり余裕がなかったんですよね。
さて、前回書いた「キーボードがおかしい」ですが、現在は解消しています。
なにをやったかというと、WSL2 起動のたびの setxkbdmap コマンドです。
しかしこのコマンド、WSL2 起動直後にやっても効きません。たとえば ~/.bashrc に書いておいても、なぜか効かない。なにか遅延処理が走ってるような気もする。
そこで代替策として、Emacs 起動後に setxkbdmap するようにしました。
(define-key global-map "\C-z\C-j" '(lambda () (interactive) (call-process "setxkbmap" nil nil nil "-layout" "jp") (message "setxkbmap -layout jp")))
Emacs 起動後に Ctrl-Z Ctrl-J 打鍵で、キーボードなおります。
振り返り
この設定にして 1 年以上たちますが、 いま改めてこのブログを書くために振り返ってみると、
なんで打鍵せにゃいかんの?
という気持ちが沸いてきます。 なんで当時こうしたんだろう?
そこで上記の設定を削って、その場所はシンプルにこれだけにしました。
(call-process "setxkbmap" nil nil nil "-layout" "jp")
はい、ぜんぜん問題ありませんでした。
解決させたつもりのことも、たまに見返すと意外な発見があるものですね。 今回の発見はしょーもないものでしたが (^^;
キーボードがおかしい
PC に久し振りに Emacs を入れたら、キーボード配列がおかしい。 どうすれば直るんだろう。
ここ最近はエディタに VSCode ばかり使ってたけど、 C のソースを追っかけるのにどうも便利じゃないもんで wsl2 のうえに久し振りに Emacs を入れた。
最近の wsl2 は便利になったもんで、 Windows 側に X サーバ入れなくても X のアプリが動く。 Emacs を "-nw" オプションなしで開くなんて何年ぶりか。
ただ、どういうわけかこの Emacs、Shift-2 で "@" が出る。 いわゆる英語キーボードだ。 ぐぐってみると、WSL2 の X アプリで割とあることみたい。
割とあるし割とみんなさくっと直せてるみたいなんだけど、 なんでか直らないんだよなあ。どうすりゃ直るんだろう。
まずは WSLのキーボードが英語配列になってしまふ - Qiita と emacsやgnome-terminal上でキーボードが英語配列になってしまうとき を参考にしてみた。
環境変数
ターミナルで動かすアプリは日本語化できているので、 以下はそもそも完了していた。
sudo apt instal language-pack-ja sudo update-locale LANG=ja_JP.UTF-8
dpkg の設定
sudo dpkg-configure keyboard-configuration すればよいという。
これをやるとインストーラみたいなテキスト GUI が出てきて、
キーボード設定ができるという。
そこでこのコマンドを唱えてみた。しかし何も起きなかった。
wsl2$ sudo dpkg-reconfigure keyboard-configuration Your console font configuration will be updated the next time your system boots. If you want to update it now, run 'setupcon' from a virtual console. wsl2$
なんでフォントがどうとか言われてるのか知らないけど、 本来ならこの "Your console font configuration will be ..." は設定を完了させたあとに出てくるものらしい。 コマンド実行したら即これが出てきて終わるのは、なんでだろう。
そして、これで解決したっぽい記事の、なんと多いことか。(うらやましい)
X の設定 1
/etc/default/keyboard にキーボードを指定する必要があるらしいので、
sudo vi /etc/default/keyboard する。
XKBMODEL="pc105" XKBLAYOUT="us"
と記載されていたので、ここに jp106 キーボードを書く。
XKBMODEL="jp106" XKBLAYOUT="jp"
そして Emacs を起動。だめだから wsl2 を再起動して Emacs を起動、Windows を再起動して Emacs を起動。だめ。
この方法もだめか。
X の設定 2
fcitx-configtool というツールで設定できるらしい。
fcitx は Linux 用の多言語文字入力ツールだったような。
このコマンドはインストールされていなかったが、fcitx-tools というパッケージに入っていたので、
sudo apt install fcitx-tools でインストールして実行してみた。

日本語も英語もなんも選択できんし、検索もできんから追加もできん。
現在の対策
いっしょーけんめい思い出しながら使っています、us 配列。
学生の頃 us 配列と jp 配列が混在してる環境でよかった。
写真を整理したい (2/n)
昨日の記事 の続き。 おうち NAS にある大量の写真から、キャプチャやコピーとそのオリジナルを探そうとしています。
昨日はファイルぜんぶ列挙してたので、今日は画像ファイルに絞り込んで、その数を数えてみました。 画像ファイルに絞り込むのは、mimetypes というライブラリで確認できそうです。 目標としては動画ファイルのキャプチャもあるんだけど、今日のところは静止画に絞りました。
#!/usr/bin/env python3
import mimetypes
from pathlib import Path
from typing import Generator
def iterfile(path: Path) -> Generator[Path, None, None]:
first = "" if path.name == "" else path.name[0]
if first == "." or first == "@" or first == "_":
return
if path.is_file():
yield path
if path.is_dir():
for child in path.iterdir():
for item in iterfile(child):
yield item
count : int = 0
for file in iterfile(Path(".")):
filetype = mimetypes.guess_type(file)[0]
if filetype and filetype[:6] == "image/":
print(file)
count += 1
print(count)
うえ半分は昨日のままですね、import が増えてる程度。 した半分でファイル種別を判断しています。
さてこの結果、80888個の静止画ファイルが見つかりました。
キャプチャやコピーとそのオリジナルを探すとなると、
80,887 * 80,886 = 6,542,625,882 って 65億回のマッチングが必要になるので、
マッチング 1 回に 1 秒かかるとして、200年かかりそうです。
まじか。どうしたもんかなあ、これ。
写真を整理したい
2000年代半ばにフィルムカメラからデジカメに乗り換えて、ビデオカメラも DV テープから HDD, SD カードと変遷し、今では気軽に何でもスマホで撮るようになりました。おうち NAS には気付いたら 1Tbyte 弱ものデータがあります。
普通にカシャっと撮った写真とビデオが中心ですが、誰かにシェアするとかいった目的でコピーした写真や、キャプチャ画像なんかもいっぱいあります。そういった写真は、あとでたまに目にした時に「これいつ頃のだっけ?」「覚えはあるんだよね、どこだっけ?」「アレの時でしょアレのとき」「アレって?」「ほらーアレだよアレ」ということに陥りがちで、困っていました。
そんな折に、OpenCV を使えば、写真のなかから断片をマッチングできるらしい、と聞きました。画像から切り取った断片がどこにあるか、見つけてくれるそうです。これを使えば、キャプチャ元の写真や動画を特定できるかもしれません。
そんなわけで目標は、おうち NAS に入っている写真から、キャプチャとコピーとその元画像・元動画を見つけることにしました。見つけたら、どう見せるようにしようかな。今はひとまず、シンボリックリンクでも置いとけばいいかな。あとでいいアイデア出てきたら変えよう。
さて、そもそも対象ファイルをぐるっと巡る必要があるんだけど、いくつあるんだろう。OpenCV は python から呼んでる事例が多いので、WSL2 から NAS をマウントして、python でぐるっと巡ってみることにしました。python 何年ぶりだろ。覚えてないくらい昔なので、文法とかぐぐり直しながらになります。
まずはその前に、NAS 上のフォルダ構成を観察してみます。
u939b$ cd とあるフォルダ u939b$ ls -CFla 合計 4648 drwxrwxrwx 3 kashima users 4096 9月 6 2020 ./ drwxr-xr-x 33 kashima users 4096 4月 10 14:13 ../ drwxrwxrwx 3 kashima users 4096 9月 6 2020 '.@__thumb'/ -rw-rw-rw- 1 kashima users 1095488 9月 6 2020 IMG_0001.jpg -rw-rw-rw- 1 kashima users 1076122 9月 6 2020 IMG_0002.jpg -rw-rw-rw- 1 kashima users 791437 9月 6 2020 IMG_0003.jpg -rw-rw-rw- 1 kashima users 845503 9月 6 2020 IMG_0004.jpg -rw-rw-rw- 1 kashima users 897136 9月 6 2020 IMG_0006.jpg
ファイル名が "." から始まるディレクトリがあるのね。Windows 絡みらしい。こういうのは除こう。もうひとつ、pathlib の Path クラスを使うと、ディレクトリ内のファイルをぐるっと for で巡れるらしい。
#!/usr/bin/env python3
from pathlib import Path
for file in Path(".").iterdir():
if file.name[0] != ".":
print(file)
あぁ、サブディレクトリに対応してないや。あと、"." 以外にもいくつかの文字で始まるファイル名は、取り除いたほうがいいな。
#!/usr/bin/env python3
from pathlib import Path
from typing import Generator
def iterfile(path: Path) -> Generator[Path, None, None]:
first = "" if path.name == "" else path.name[0]
if first == "." or first == "@" or first == "_":
return
if path.is_file():
yield path
if path.is_dir():
for child in path.iterdir():
for item in iterfile(child):
yield item
for file in iterfile(Path(".")):
print(file)
よしこれでサブディレクトリ対応 OK。次は写真ファイルだけを for で巡れるようにしてみよう。