Raspbian で RDP

RasPi 4 メモリ 4GB を購入して、せっかくなので専用の 7 inch ディスプレイまで購入。
デスクトップ端末として遊んでいるところで、この端末を RDP 中継用のサーバとして利用できないかなと思って少し調べてみた。

Linux から Windows への RDP 接続

今回試したのが、次の二つ。

  • remmina
  • rdesktop

remmina

Raspbian での remmina インストール方法

インストールは、いつもの通り。

$ sudo apt update
$ sudo apt install remmina
起動方法(デスクトップ画面)

スタートメニューから「インターネット」→「Remmina」
f:id:KuroNeko666:20200419171308p:plain

すると、どこへ、何を使って、どのユーザでアクセスするのか、を入力する Web GUI が表示される。

f:id:KuroNeko666:20200419173509p:plain

起動方法(コマンドライン

スタートメニューから「Run」の画面を出して、次のコマンドを実行。
f:id:KuroNeko666:20200419172829p:plain

remmina

次のコマンドラインは、GUI とか Xming とかを使っている環境で利用する想定。

$ remmina

WebGUI を介したリモートデスクトップ接続。
一度ブラウザが開くので、そこでアクセス先を入力すると、ウィンドウが開く。
設定ファイルを作ればスキップできそうに思えるが、それでも少し手間と感じる。

ただ、RDP 以外にも VNCSSH 等の選択肢がある。
RDP アプリではなく、ターミナル機能を有したサーバ(Webアプリ)だと思えば、優秀と思える。

rdesktop

Raspbian での rdesktop インストール方法

インストールは、こちらもいつもの通り。

$ sudo apt update
$ sudo apt install rdesktop

うん。
update は remmin のときにやっているから、やらなくてもよかったんだけどね。

起動方法(コマンドライン

スタートメニューから「Run」の画面を出して、次のコマンドを実行。
f:id:KuroNeko666:20200419172829p:plain

rdesktop xx.xx.xx.xx

次のコマンドラインは、GUI とか Xming とかを使っている環境で利用する想定。

$ rdesktop xx.xx.xx.xx

リモートデスクトップで接続した先の画面は、ウィンドウが開く。
オプションでフルスクリーン等を指定する。
CUI に慣れていると、こちらの方が直感的に扱いやすい。

自分が使うなら

すぐに対象 Windows へログインできたという意味で、個人的に使いやすかったのが rdesktop だった。
コマンドライン的に、対象を指定する方法が好き。

本当に、単純な好みの問題。

remmina は、目的の動作を実現するアプリではなかったので、ちょっと残念。
でも、文中にも書いたけど、使い方が合っていればすごく優秀と思えた。
実際、思いついて WindowsXming を起動して Tera Term と連携して remmina を起動したら、使い勝手の良さに驚いた。

www.mikitechnica.com

……使い分けかなぁ。

Windows から Linux への RDP 接続

いくつかあるようだけれど、最初に試して都合がよかったので使い続けているのが次のアプリ。

  • xrdp

Raspbian でのインストール方法

$ sudo apt update
$ sudo apt install xrdp

【余談】Windows から Linux への RDP 接続

いくつかあるようだけれど、最初に試して都合がよかったので使い続けているのが次のアプリ。

xrdp

Raspbian でのインストール方法

$ sudo apt install xrdp

Windowsリモートデスクトップ (mstsc.exe) で Linux にアクセス出来るって言うのが、ことのほか楽しい。

Excel VBA で Tera Term Macro を実行

Tera Term マクロを Tera Term に読み込ませるのはコマンドラインで実行すればいいので、シェルから実行させる。
現状、参考程度に。

変更点としては
・マクロを実行するプログラムを呼び出す機能を追加
・マクロファイルの保存先をデスクトップに変更

ttpmacro.exe ってば、ttl ファイルの指定がフルパスでない場合に、自分と同じ場所にないと読み込まないという制限がある。
そして、ttpmacro.exe をデフォルトインストールすると、後から追記しようとするファイルがユーザアカウント制御 (UAC) により別管理されることがあり、うまく動いてくれない可能性があるという……
ということで、とりあえずデスクトップに置く仕様にしている。

WSH.SpecialFolders に指定した場所を変えれば、いろいろ対応できそう。

あと、以前実装した ping 機能は、今回は割愛。

応用としては、ttpmacro.exe ではなく ttermpro.exe に、シェル(コマンドライン)からオプション指定してもいい……というか、シンプルな内容ならそちらの方がよさそう。

ソース

以下、出来上がったソースを。

まず Excel の ThisWorkbook に貼り付けて xlsm 形式で保存する。
A2 以下 A 列にアクセス先サーバ名もしくは IP アドレスを。
B2 以下 B 列に使用するユーザID を。

保存したら、A列に入力したアクセス先をダブルクリックすると、Tera Term が起動してくれる。

なお Tera Term は C ドライブにインストールしている前提。

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
' Excel VBA マクロによる TeraTerm マクロ生成するサンプルソース(暫定版)
' Modify : 黒猫666 - 2013/1/1
' Update : 黒猫666 - 2020/3/20
' Site   : http://d.hatena.ne.jp/KuroNeko666

''' 変数の宣言 ''''''''''''''''''''''''''''''''''''''''''''
' Object 設定
Dim FSO         As Object
Dim TXT         As Object
Dim WSH         As Object

' 変数設定
Dim pFILEDIR    As String       ' 格納先ディレクトリ
Dim pFILE       As String       ' TeraTerm マクロ用ファイル名
Dim pFILEPATH   As String

Dim pHOST       As String       ' アクセスするサーバ用変数
Dim pUSER       As String       ' アクセスユーザ用変数

Dim pPID        As Double

' 列数設定
Dim nHOST       As Integer      ' アクセス先
Dim nUSER       As Integer      ' ユーザID

' Tera Term 実行ファイル
Dim pTTERMDIR   As String       ' インストールフォルダ
Dim pTTMEXE     As String       ' Tera Term マクロ実行
Dim pTTMACROPATH As String      ' インストールパス

' マクロファイル格納先

''' 変数の定義 ''''''''''''''''''''''''''''''''''''''''''''

' デフォルト定義
Set WSH = CreateObject("WScript.Shell")
pFILEDIR = WSH.SpecialFolders("Desktop")

pFILE = "teratermmacro.ttl"
pHOST = "localhost"         ' アクセス先(定義だけ)
pUSER = "default"           ' ユーザID

pFILEPATH = pFILEDIR & "\" & pFILE

' 列の数値定義
nHOST = 1                   ' アクセス先
nUSER = 2                   ' ユーザID

pTTERMDIR = "c:\Program Files (x86)\teraterm"
pTTMEXE = "ttpmacro.exe"
pTTMACROPATH = pTTERMDIR & "\" & pTTMEXE

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

' 強制初期化…
Cells(1, 1) = "アクセス先サーバ"
Cells(1, 2) = "ユーザID"

' ダブルクリックしたセルが A 列じゃなかったり、さらに 1 行目だったりしたら、強制終了。
If Intersect(Target, Range("A:A")) Is Nothing Or Target.Row = 1 Then Exit Sub
Cancel = True

' セルの色彩情報で、処理を変更
If Target.Interior.ColorIndex = xlNone Then
    
    ' もしアクセス先の記載がなかったら終了。
    If Target.Value = "" Then
        Exit Sub
    Else
        ' あったら、とりあえず信じ込む。
        pHOST = Target.Value
    End If
    
    Target.Interior.ColorIndex = 6
    
    ' 併せて 2 列目に入力があれば、ユーザIDだと信じ込む。
    If Cells(Target.Row, nUSER) <> "" Then
        pUSER = Cells(Target.Row, nUSER)
    End If
    
Else
    Target.Interior.ColorIndex = xlNone
    Exit Sub
End If

Cancel = True
Set FSO = CreateObject("Scripting.FileSystemObject")
    ' 上書き     : する = true, しない = false (存在したらエラー)
    ' 文字コード : Unicode(UTF) = true, ASCII = false
    Set TXT = FSO.CreateTextFile(pFILEPATH, True, False)
        TXT.WriteLine ("; Generate by Excel VBA (KuroNeko666)")
        TXT.WriteLine ("; Original ttl by TeraTerm sample")
        TXT.WriteLine ("; Creation http://d.hatena.ne.jp/KuroNeko666/20130101")
        TXT.WriteLine ("")
        TXT.WriteLine ("username = '" & pUSER & "'")
        TXT.WriteLine ("hostname = '" & pHOST & "'")
        TXT.WriteLine ("")
        TXT.WriteLine (";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;")
        TXT.WriteLine ("")
        TXT.WriteLine ("msg = 'Enter password for user '")
        TXT.WriteLine ("strconcat msg username")
        TXT.WriteLine ("passwordbox msg 'Get password'")
        TXT.WriteLine ("")
        TXT.WriteLine ("msg = hostname")
        TXT.WriteLine ("strconcat msg ':22 /ssh /auth=password /user='")
        TXT.WriteLine ("strconcat msg username")
        TXT.WriteLine ("strconcat msg ' /passwd='")
        TXT.WriteLine ("strconcat msg inputstr")
        TXT.WriteLine ("")
        TXT.WriteLine ("connect msg")
        TXT.Close
    Set TXT = Nothing

    ' 作成したマクロを利用して、対象ホストにアクセス

    pPID = Shell(pTTMACROPATH & " " & pFILEPATH)

Set FSO = Nothing

End Sub

Excel VBA で祝日一覧を出力

まだちょっと不便なところがある……というか、貼り付けてそのまま関数書けば実行できるということろまではいけなかったんだけども。
一応、ActiveX のボタン(フォームコントロールのボタンでは呼び出せなかった)もしくは、メニューに項目を追加して、そこで関数名で呼び出せばなんとかリスト出力まではできるようになったので、残しておく。

2019年、2020年の、なんとイレギュラーなことか。

いちおう、2030年までは、他のサイトの情報と照らし合わせて正確に出力していることを確認済み。
この1~2年のようなイレギュラーがなければ、問題なく動いてくれるだろう。

これで、この関数は
・休日・祝日判定
・第x週目の月曜日を出力
・祝日リスト出力

という、なんとも気の抜けそうな機能を充実させることに成功した!

Option Explicit

' セル位置関係
Dim aRow            As Long
Dim aCol            As Long
Dim wi              As Long

Function getHolidayList()
' #########################################################################
' # 西暦を入れるとアクティブセルから下に祝日一覧を入れるマクロ
' # セルに関数名を入れた使い方はできないので、改造中。
' # ActiveX コントロールのボタン、もしくはメニューバーから呼び出すこと。
' #########################################################################

Dim msgInputYear    As String
Dim msgOverRideChk  As String

Dim pInputYear      As Variant

Dim chk             As Variant
Dim tmp             As Variant

msgInputYear = "出力したい西暦を入力してください。"
msgOverRideChk = "現在のアクティブセルから下に2列、リストを出力します。" & vbCrLf & "(既存の情報は上書き)"

wi = 1

pInputYear = InputBox(msgInputYear, "西暦", Year(Now))
Select Case VarType(pInputYear)
    ' Empty値 (0)
    Case vbEmpty
        Exit Function
    
    ' 文字列型 (8)
    Case vbString
        pInputYear = StrConv(pInputYear, vbNarrow)
    
    Case Else
        MsgBox "Error"

End Select

If IsNumeric(pInputYear) = False Then
    'MsgBox "数字を入力してください", vbOKOnly, "Error"
    Exit Function
End If

If MsgBox(msgOverRideChk, vbYesNo) Then
    ' アクティブセルの位置を取得
    aRow = ActiveCell.Row
    aCol = ActiveCell.Column

    Cells(aRow, aCol) = pInputYear & "年"
    Cells(aRow, aCol + 1) = "祝日"
    
    '元日 1月1日
    tmp = DateValue(pInputYear & "/1/1")
    chk = wDD(tmp, "元日")
    If Weekday(tmp + 1) = vbMonday Then chk = wDD(tmp + 1, "振替休日")
    
    '成人の日 1月の第2月曜日
    chk = wDD(NumWeek(pInputYear, 1, 2), "成人の日")
    
    '建国記念の日 政令で定める日(2/11)
    tmp = DateValue(pInputYear & "/2/11")
    chk = wDD(tmp, "建国記念の日")
    If Weekday(tmp + 1) = vbMonday Then chk = wDD(tmp + 1, "振替休日")
    
    '天皇誕生日 12月23日 → 2月23日(2019年 天皇の即位に伴う変更)
    If 2019 < pInputYear Then
        chk = wDD(DateValue(pInputYear & "/2/23"), "天皇誕生日")
        If Weekday(DateValue(pInputYear & "/2/24")) = vbMonday Then chk = wDD(DateValue(pInputYear & "/2/24"), "振替休日")
    End If
    
    '春分の日
    tmp = DateValue(pInputYear & "/3/" & Int(20.8431 + 0.242194 * (pInputYear - 1980) - Int((pInputYear - 1980) / 4)))
    chk = wDD(tmp, "春分の日")
    If Weekday(tmp + 1) = vbMonday Then chk = wDD(tmp + 1, "振替休日")

    '昭和の日 4月29日
    tmp = DateValue(pInputYear & "/4/29")
    chk = wDD(tmp, "昭和の日")
    If Weekday(tmp + 1) = vbMonday Then chk = wDD(tmp + 1, "振替休日")
    
    '天皇の即位の日 2019年5月1日
    If pInputYear = 2019 Then
        chk = wDD(DateValue("2019/4/30"), "国民の休日")
        chk = wDD(DateValue("2019/5/1"), "天皇の即位の日")
        chk = wDD(DateValue("2019/5/2"), "国民の休日")
    End If

    '憲法記念日 5月3日
    chk = wDD(DateValue(pInputYear & "/5/3"), "憲法記念日")
    
    'みどりの日 5月4日
    chk = wDD(DateValue(pInputYear & "/5/4"), "みどりの日")
    
    'こどもの日 5月5日
    tmp = DateValue(pInputYear & "/5/5")
    chk = wDD(tmp, "こどもの日")
    
        ' 5月5日が日曜~火曜日だったら、振替休日確定
        If vbSunday <= Weekday(tmp) And Weekday(tmp) <= vbTuesday Then
            chk = wDD(tmp + 1, "振替休日")
        End If

    '海の日 7月の第3月曜日
    If pInputYear = 2020 Then
        chk = wDD(DateValue("2020/7/23"), "海の日")
        chk = wDD(DateValue("2020/7/24"), "スポーツの日")
    Else
        tmp = NumWeek(pInputYear, 7, 3)
        chk = wDD(tmp, "海の日")
        If Weekday(tmp + 1) = vbMonday Then chk = wDD(tmp + 1, "振替休日")
    End If
    
    '山の日 8月11日
    If pInputYear = 2020 Then
        chk = wDD(DateValue("2020/8/10"), "山の日")
    Else
        tmp = DateValue(pInputYear & "/8/11")
        chk = wDD(tmp, "山の日")
        If Weekday(tmp + 1) = vbMonday Then chk = wDD(tmp + 1, "振替休日")
    End If

    '敬老の日 9月の第3月曜日
    chk = wDD(NumWeek(pInputYear, 9, 3), "敬老の日")
    
    '国民の休日 祝日に挟まれた平日
    tmp = DateValue(pInputYear & "/9/" & Int(23.2488 + 0.242194 * (pInputYear - 1980) - Int((pInputYear - 1980) / 4)))
    'If Weekday(tmp) = vbWednesday Then chk = wDD(tmp - 1, "国民の休日")
    If tmp - 2 = NumWeek(pInputYear, 9, 3) Then chk = wDD(tmp - 1, "国民の休日")
    
    '秋分の日
    'tmp = DateValue(pInputYear & "/9/" & Int(23.2488 + 0.242194 * (pInputYear - 1980) - Int((pInputYear - 1980) / 4)))
    chk = wDD(DateValue(tmp), "秋分の日")
    If Weekday(tmp + 1) = vbMonday Then chk = wDD(tmp + 1, "振替休日")

    '体育の日 10月の第2月曜日 (2020年からスポーツの日に名称変更)
    If pInputYear < 2020 Then
        chk = wDD(NumWeek(pInputYear, 10, 2), "体育の日")
    Else
        If pInputYear <> 2020 Then chk = wDD(NumWeek(pInputYear, 10, 2), "スポーツの日")
    End If

    '即位礼正殿の儀の行われる日 2019年10月22日
    If pInputYear = 2019 Then chk = wDD(DateValue("2019/10/22"), "即位礼正殿の儀の行われる日")

    '文化の日 11月3日
    tmp = DateValue(pInputYear & "/11/3")
    chk = wDD(tmp, "文化の日")
    If Weekday(tmp + 1) = vbMonday Then chk = wDD(tmp + 1, "振替休日")
    
    '勤労感謝の日 11月23日
    tmp = DateValue(pInputYear & "/11/23")
    chk = wDD(tmp, "勤労感謝の日")
    If Weekday(tmp + 1) = vbMonday Then chk = wDD(tmp + 1, "振替休日")
    
    '天皇誕生日 12月23日 → 2月23日(2019年 天皇の即位に伴う変更)
    If pInputYear < 2019 Then
        tmp = DateValue(pInputYear & "/12/23")
        chk = wDD(tmp, "天皇誕生日")
        If Weekday(tmp + 1) = vbMonday Then chk = wDD(tmp + 1, "振替休日")
    End If

End If


End Function

Public Function wDD(Serial, HolidayName)

' Write Date Data
Cells(aRow + wi, aCol) = Serial
Cells(aRow + wi, aCol + 1) = HolidayName

wi = wi + 1

End Function

Public Function chkWorkDay(Optional Serial As Date)
' #########################################################################
' # 呼び出されると、翌営業日を返すマクロ
' # 2020/3/11 初版作成
' #########################################################################

' ### 変数 ################################################################

Dim chkDate As Date
Dim fDate   As Integer

If Serial > 0 Then
    chkDate = Serial
Else
    chkDate = Date
End If

fDate = 1

' ### メイン ##############################################################

Do While fDate > 0
    chkDate = chkDate + 1
    fDate = chkHoliday(chkDate)
Loop

' ### 終了処理 ############################################################

chkWorkDay = chkDate

End Function


Public Function chkHoliday(Serial, Optional RVFlag As Byte = 0)
' #########################################################################
' # 呼び出されると、引数のSerialから休日/祝日判定フラグを返すマクロ
' # 更新履歴
' # 2019/12/5 2020年の特殊な祝日情報に対応した。
' # 2020/3/11 土日を休日と返すようにした。
' #########################################################################

' 戻り値の定義
' 0 = 平日
' 1 = 日曜日(vbSunday)
' 7 = 土曜日(vbSaturday)
' 8 = 祝日

' 変数の宣言
Dim RV As Byte
Dim DayName As String
Dim YYYY As Integer
Dim fSubstitute As Boolean ' 振替休日フラグ

' ### メイン ##############################################################

DayName = "平日"
YYYY = Year(Serial)

' ## 祝日判定 #####
'元日 1月1日
'成人の日 1月の第2月曜日
'建国記念の日 政令で定める日(2/11)
'春分の日 春分の日
'昭和の日 4月29日
'憲法記念日 5月3日
'みどりの日 5月4日
'こどもの日 5月5日
'海の日 7月の第3月曜日
'山の日 8月11日
'敬老の日 9月の第3月曜日
'秋分の日 秋分の日
'体育の日 10月の第2月曜日 (2020年からスポーツの日に名称変更)
'文化の日 11月3日
'勤労感謝の日 11月23日
'天皇誕生日 12月23日 → 2月23日(2019年 天皇の即位に伴う変更)
'国民の休日 祝日に挟まれた平日
'天皇の即位の日及び即位礼正殿の儀の行われる日を休日とする法律 2019年5月1日と2019年10月22日


' 規定の日付
Select Case Serial
  Case DateValue(YYYY & "/1/1")
    DayName = "元旦"
  Case DateValue(YYYY & "/1/2")
    DayName = "年始"
  Case DateValue(YYYY & "/1/3")
    DayName = "年始"
  Case NumWeek(YYYY, 1, 2)
    DayName = "成人の日"
  Case DateValue(YYYY & "/2/11")
    DayName = "建国記念の日"
  Case DateValue(YYYY & "/2/23")
    If 2019 < YYYY Then
      DayName = "天皇誕生日"
    End If
  Case DateValue(YYYY & "/3/" & Int(20.8431 + 0.242194 * (YYYY - 1980) - Int((YYYY - 1980) / 4)))
    ' 参考URL http://www.wanichan.com/pc/excel/2010/5/page07.html
    DayName = "春分の日"
  Case DateValue(YYYY & "/4/29")
    DayName = "昭和の日"
  Case DateValue("2019/4/30")
    DayName = "国民の休日"
  Case DateValue("2019/5/1")
    DayName = "天皇の即位の日"
  Case DateValue("2019/5/2")
    DayName = "国民の休日"
  Case DateValue(YYYY & "/5/3")
    DayName = "憲法記念日"
  Case DateValue(YYYY & "/5/4")
    DayName = "みどりの日"
  Case DateValue(YYYY & "/5/5")
    DayName = "こどもの日"
  Case NumWeek(YYYY, 7, 3)
    DayName = "海の日"
  Case DateValue(YYYY & "/8/11")
    DayName = "山の日"
  Case NumWeek(YYYY, 9, 3)
    DayName = "敬老の日"
  Case NumWeek(YYYY, 9, 3) + 1
    If DateValue(YYYY & "/9/" & Int(23.2488 + 0.242194 * (YYYY - 1980) - Int((YYYY - 1980) / 4))) = NumWeek(YYYY, 9, 3) + 2 Then
      DayName = "国民の休日"
    End If
  Case DateValue(YYYY & "/9/" & Int(23.2488 + 0.242194 * (YYYY - 1980) - Int((YYYY - 1980) / 4)))
    ' 参考URL http://www.wanichan.com/pc/excel/2010/5/page07.html
    DayName = "秋分の日"
  Case NumWeek(YYYY, 10, 2)
    If YYYY <= 2019 Then
      DayName = "体育の日"
    Else
      DayName = "スポーツの日"
    End If
  Case DateValue("2019/10/22")
    DayName = "即位礼正殿の儀の行われる日"
  Case DateValue(YYYY & "/11/3")
    DayName = "文化の日"
  Case DateValue(YYYY & "/11/23")
    DayName = "勤労感謝の日"
  Case DateValue(YYYY & "/12/23")
    If YYYY < 2019 Then
      DayName = "天皇誕生日"
    End If
  Case DateValue(YYYY & "/12/31")
    DayName = "年末"
End Select

' 振替休日
' 「国民の祝日」が日曜日に当たるときは、その日後においてその日に最も近い「国民の祝日」でない日を休日とする
' なので「国民の祝日」の翌日が月曜日だったときも、振替休日となる
Select Case Serial
  Case DateValue(YYYY & "/1/1") + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/2/11") + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/2/23") + 1
    If YYYY > 2019 And Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/3/" & Int(20.8431 + 0.242194 * (YYYY - 1980) - Int((YYYY - 1980) / 4))) + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/4/29") + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/5/5") + 1
    ' 5月5日が日曜~火曜日だったら、振替休日確定
    If vbSunday <= Weekday(DateValue(YYYY & "/5/5")) And Weekday(DateValue(YYYY & "/5/5")) <= vbTuesday Then fSubstitute = True
  Case DateValue(YYYY & "/9/" & Int(23.2488 + 0.242194 * (YYYY - 1980) - Int((YYYY - 1980) / 4))) + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/11/3") + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/11/23") + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/12/23") + 1
    If YYYY < 2019 And Weekday(Serial) = vbMonday Then fSubstitute = True
End Select
If fSubstitute = True Then
  DayName = "振替休日"
End If

' 2020年特殊対応
Select Case Serial
  Case DateValue("2020/7/20")
    DayName = "平日"
  Case NumWeek(2020, 10, 2)
    DayName = "平日"
  Case DateValue("2020/8/11")
    DayName = "平日"
  Case DateValue("2020/7/23")
    DayName = "海の日"
  Case DateValue("2020/7/24")
    DayName = "スポーツの日"
  Case DateValue("2020/8/10")
    DayName = "山の日"
  Case DateValue("2020/9/22")
    DayName = "秋分の日"
End Select

' 祝日値判定
If DayName = "平日" Then
  ' ## 曜日選択 #####
  If IsDate(Serial) Then
  Select Case Weekday(Serial)
  Case vbSunday
    RV = vbSunday
    DayName = "休日"
  'Case vbMonday
  ' RV = vbMonday
  'Case vbTuesday
  ' RV = vbTuesday
  'Case vbWednesday
  ' RV = vbWednesday
  'Case vbThursday
  ' RV = vbThursday
  'Case vbFriday
  ' RV = vbFriday
  Case vbSaturday
    RV = vbSaturday
    DayName = "休日"
  End Select

  'RV = Weekday(Serial)
  Else
    Exit Function
  End If
Else
  RV = 8
End If

' ### 終了処理 ############################################################

Select Case RVFlag
  Case 0
    chkHoliday = RV
  Case 1
    chkHoliday = DayName
End Select

End Function

Public Function NumWeek(Year, Month, Weeks)
' 参考資料
' http://www.relief.jp/itnote/archives/003241.php

Dim MonNum As Byte
Dim FirstMonDay As Date

' 第1週目の月曜日を求める
Select Case Weekday(DateValue(Year & "/" & Month & "/1"))
  Case vbSunday ' 1
    MonNum = 1
  Case vbMonday ' 2
    MonNum = 0
  Case vbTuesday ' 3
    MonNum = 6
  Case vbWednesday ' 4
    MonNum = 5
  Case vbThursday ' 5
    MonNum = 4
  Case vbFriday ' 6
    MonNum = 3
  Case vbSaturday ' 7
    MonNum = 2
End Select
FirstMonDay = DateValue(Year & "/" & Month & "/" & 1 + MonNum)

' 第1週目月曜日から何週間後なのか、シリアル値を出力
NumWeek = DateValue(Year & "/" & Month & "/" & 1 + MonNum) + 7 * (Weeks - 1)

End Function

Excel VBA で翌営業日判定

過去作成した、休日/祝日判定を応用して、翌営業日を返すマクロを書いてみました。

Excel VBA で休日祝日判定(再掲) - KuroNeko666’s blog
Excel で休日祝日判定 - KuroNeko666’s blog

もちろん Excel ですから workday 関数を使っても良いのですが、休日や祝日を自分で判定する関数をつくっているのですから簡単だと思ったのですよね。

体裁にこだわらないなら、10行も必要ないプログラムになりました。
まるっと貼り付けておきます。

Option Explicit
Public Function chkWorkDay(Optional Serial As Date)
' #########################################################################
' # 呼び出されると、翌営業日を返すマクロ
' # 2020/3/11 初版作成
' #########################################################################

' ### 変数 ################################################################

Dim chkDate As Date
Dim fDate   As Integer

If Serial > 0 Then
    chkDate = Serial
Else
    chkDate = Date
End If

fDate = 1

' ### メイン ##############################################################

Do While fDate > 0
    chkDate = chkDate + 1
    fDate = chkHoliday(chkDate)
Loop

' ### 終了処理 ############################################################

chkWorkDay = chkDate

End Function


Public Function chkHoliday(Serial, Optional RVFlag As Byte = 0)
' #########################################################################
' # 呼び出されると、引数のSerialから休日/祝日判定フラグを返すマクロ
' # 更新履歴
' # 2019/12/5 2020年の特殊な祝日情報に対応した。
' # 2020/3/11 土日を休日と返すようにした。
' #########################################################################

' 戻り値の定義
' 0 = 平日
' 1 = 日曜日(vbSunday)
' 7 = 土曜日(vbSaturday)
' 8 = 祝日

' 変数の宣言
Dim RV As Byte
Dim DayName As String
Dim YYYY As Integer
Dim fSubstitute As Boolean ' 振替休日フラグ

' ### メイン ##############################################################

DayName = "平日"
YYYY = Year(Serial)

' ## 祝日判定 #####
'元日 1月1日
'成人の日 1月の第2月曜日
'建国記念の日 政令で定める日(2/11)
'春分の日 春分の日
'昭和の日 4月29日
'憲法記念日 5月3日
'みどりの日 5月4日
'こどもの日 5月5日
'海の日 7月の第3月曜日
'山の日 8月11日
'敬老の日 9月の第3月曜日
'秋分の日 秋分の日
'体育の日 10月の第2月曜日 (2020年からスポーツの日に名称変更)
'文化の日 11月3日
'勤労感謝の日 11月23日
'天皇誕生日 12月23日 → 2月23日(2019年 天皇の即位に伴う変更)
'国民の休日 祝日に挟まれた平日
'天皇の即位の日及び即位礼正殿の儀の行われる日を休日とする法律 2019年5月1日と2019年10月22日


' 規定の日付
Select Case Serial
  Case DateValue(YYYY & "/1/1")
    DayName = "元旦"
  Case DateValue(YYYY & "/1/2")
    DayName = "年始"
  Case DateValue(YYYY & "/1/3")
    DayName = "年始"
  Case NumWeek(YYYY, 1, 2)
    DayName = "成人の日"
  Case DateValue(YYYY & "/2/11")
    DayName = "建国記念の日"
  Case DateValue(YYYY & "/2/23")
    If 2019 < YYYY Then
      DayName = "天皇誕生日"
    End If
  Case DateValue(YYYY & "/3/" & Int(20.8431 + 0.242194 * (YYYY - 1980) - Int((YYYY - 1980) / 4)))
    ' 参考URL http://www.wanichan.com/pc/excel/2010/5/page07.html
    DayName = "春分の日"
  Case DateValue(YYYY & "/4/29")
    DayName = "昭和の日"
  Case DateValue("2019/4/30")
    DayName = "国民の休日"
  Case DateValue("2019/5/1")
    DayName = "天皇の即位の日"
  Case DateValue("2019/5/2")
    DayName = "国民の休日"
  Case DateValue(YYYY & "/5/3")
    DayName = "憲法記念日"
  Case DateValue(YYYY & "/5/4")
    DayName = "みどりの日"
  Case DateValue(YYYY & "/5/5")
    DayName = "こどもの日"
  Case NumWeek(YYYY, 7, 3)
    DayName = "海の日"
  Case DateValue(YYYY & "/8/11")
    DayName = "山の日"
  Case NumWeek(YYYY, 9, 3)
    DayName = "敬老の日"
  Case NumWeek(YYYY, 9, 3) + 1
    If DateValue(YYYY & "/9/" & Int(23.2488 + 0.242194 * (YYYY - 1980) - Int((YYYY - 1980) / 4))) = NumWeek(YYYY, 9, 3) + 2 Then
      DayName = "国民の休日"
    End If
  Case DateValue(YYYY & "/9/" & Int(23.2488 + 0.242194 * (YYYY - 1980) - Int((YYYY - 1980) / 4)))
    ' 参考URL http://www.wanichan.com/pc/excel/2010/5/page07.html
    DayName = "秋分の日"
  Case NumWeek(YYYY, 10, 2)
    If YYYY <= 2019 Then
      DayName = "体育の日"
    Else
      DayName = "スポーツの日"
    End If
  Case DateValue("2019/10/22")
    DayName = "即位礼正殿の儀の行われる日"
  Case DateValue(YYYY & "/11/3")
    DayName = "文化の日"
  Case DateValue(YYYY & "/11/23")
    DayName = "勤労感謝の日"
  Case DateValue(YYYY & "/12/23")
    If YYYY < 2019 Then
      DayName = "天皇誕生日"
    End If
  Case DateValue(YYYY & "/12/31")
    DayName = "年末"
End Select

' 振替休日
' 「国民の祝日」が日曜日に当たるときは、その日後においてその日に最も近い「国民の祝日」でない日を休日とする
' なので「国民の祝日」の翌日が月曜日だったときも、振替休日となる
Select Case Serial
  Case DateValue(YYYY & "/1/1") + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/2/11") + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/2/23") + 1
    If YYYY > 2019 And Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/3/" & Int(20.8431 + 0.242194 * (YYYY - 1980) - Int((YYYY - 1980) / 4))) + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/4/29") + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/5/5") + 1
    ' 5月5日が日曜~火曜日だったら、振替休日確定
    If vbSunday <= Weekday(DateValue(YYYY & "/5/5")) And Weekday(DateValue(YYYY & "/5/5")) <= vbTuesday Then fSubstitute = True
  Case DateValue(YYYY & "/9/" & Int(23.2488 + 0.242194 * (YYYY - 1980) - Int((YYYY - 1980) / 4))) + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/11/3") + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/11/23") + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/12/23") + 1
    If YYYY < 2019 And Weekday(Serial) = vbMonday Then fSubstitute = True
End Select
If fSubstitute = True Then
  DayName = "振替休日"
End If

' 2020年特殊対応
Select Case Serial
  Case DateValue("2020/7/20")
    DayName = "平日"
  Case NumWeek(2020, 10, 2)
    DayName = "平日"
  Case DateValue("2020/8/11")
    DayName = "平日"
  Case DateValue("2020/7/23")
    DayName = "海の日"
  Case DateValue("2020/7/24")
    DayName = "スポーツの日"
  Case DateValue("2020/8/10")
    DayName = "山の日"
  Case DateValue("2020/9/22")
    DayName = "秋分の日"
End Select

' 祝日値判定
If DayName = "平日" Then
  ' ## 曜日選択 #####
  If IsDate(Serial) Then
  Select Case Weekday(Serial)
  Case vbSunday
    RV = vbSunday
    DayName = "休日"
  'Case vbMonday
  ' RV = vbMonday
  'Case vbTuesday
  ' RV = vbTuesday
  'Case vbWednesday
  ' RV = vbWednesday
  'Case vbThursday
  ' RV = vbThursday
  'Case vbFriday
  ' RV = vbFriday
  Case vbSaturday
    RV = vbSaturday
    DayName = "休日"
  End Select

  'RV = Weekday(Serial)
  Else
    Exit Function
  End If
Else
  RV = 8
End If

' ### 終了処理 ############################################################

Select Case RVFlag
  Case 0
    chkHoliday = RV
  Case 1
    chkHoliday = DayName
End Select

End Function

Public Function NumWeek(Year, Month, Weeks)
' 参考資料
' http://www.relief.jp/itnote/archives/003241.php

Dim MonNum As Byte
Dim FirstMonDay As Date

' 第1週目の月曜日を求める
Select Case Weekday(DateValue(Year & "/" & Month & "/1"))
  Case vbSunday ' 1
    MonNum = 1
  Case vbMonday ' 2
    MonNum = 0
  Case vbTuesday ' 3
    MonNum = 6
  Case vbWednesday ' 4
    MonNum = 5
  Case vbThursday ' 5
    MonNum = 4
  Case vbFriday ' 6
    MonNum = 3
  Case vbSaturday ' 7
    MonNum = 2
End Select
FirstMonDay = DateValue(Year & "/" & Month & "/" & 1 + MonNum)

' 第1週目月曜日から何週間後なのか、シリアル値を出力
NumWeek = DateValue(Year & "/" & Month & "/" & 1 + MonNum) + 7 * (Weeks - 1)

End Function

Excel VBA で休日祝日判定(再掲)

Excel VBA で祝日判定(再掲)

再掲

ずいぶん前に記載していた、専用シートを使わない Excel VBA での祝日判定。
Excel で休日祝日判定 - KuroNeko666’s blog

2020年は、いろいろ特殊っぽいのがいまさらわかったので、改造ついでに再掲します。

つぎのソースをコピペして使ってください。

ソース

Option Explicit

Public Function chkHoliday(Serial, Optional RVFlag As Byte = 0)
' #########################################################################
' # 呼び出されると、引数のSerialから休日/祝日判定フラグを返すマクロ
' #########################################################################

' 戻り値の定義
' 0 = 平日
' 1 = 日曜日(vbSunday)
' 7 = 土曜日(vbSaturday)
' 8 = 祝日

' 変数の宣言
Dim RV As Byte
Dim DayName As String
Dim YYYY As Integer
Dim fSubstitute As Boolean ' 振替休日フラグ

' ### メイン ##############################################################

DayName = "平日"
YYYY = Year(Serial)

' ## 祝日判定 #####
'元日 1月1日
'成人の日 1月の第2月曜日
'建国記念の日 政令で定める日(2/11)
'春分の日 春分の日
'昭和の日 4月29日
'憲法記念日 5月3日
'みどりの日 5月4日
'こどもの日 5月5日
'海の日 7月の第3月曜日
'山の日 8月11日
'敬老の日 9月の第3月曜日
'秋分の日 秋分の日
'体育の日 10月の第2月曜日 (2020年からスポーツの日に名称変更)
'文化の日 11月3日
'勤労感謝の日 11月23日
'天皇誕生日 12月23日 → 2月23日(2019年 天皇の即位に伴う変更)
'国民の休日 祝日に挟まれた平日
'天皇の即位の日及び即位礼正殿の儀の行われる日を休日とする法律 2019年5月1日と2019年10月22日


' 規定の日付
Select Case Serial
  Case DateValue(YYYY & "/1/1")
    DayName = "元旦"
  Case DateValue(YYYY & "/1/2")
    DayName = "年始"
  Case DateValue(YYYY & "/1/3")
    DayName = "年始"
  Case NumWeek(YYYY, 1, 2)
    DayName = "成人の日"
  Case DateValue(YYYY & "/2/11")
    DayName = "建国記念の日"
  Case DateValue(YYYY & "/2/23")
    If 2019 < YYYY Then
      DayName = "天皇誕生日"
    End If
  Case DateValue(YYYY & "/3/" & Int(20.8431 + 0.242194 * (YYYY - 1980) - Int((YYYY - 1980) / 4)))
    ' 参考URL http://www.wanichan.com/pc/excel/2010/5/page07.html
    DayName = "春分の日"
  Case DateValue(YYYY & "/4/29")
    DayName = "昭和の日"
  Case DateValue("2019/4/30")
    DayName = "国民の休日"
  Case DateValue("2019/5/1")
    DayName = "天皇の即位の日"
  Case DateValue("2019/5/2")
    DayName = "国民の休日"
  Case DateValue(YYYY & "/5/3")
    DayName = "憲法記念日"
  Case DateValue(YYYY & "/5/4")
    DayName = "みどりの日"
  Case DateValue(YYYY & "/5/5")
    DayName = "こどもの日"
  Case NumWeek(YYYY, 7, 3)
    DayName = "海の日"
  Case DateValue(YYYY & "/8/11")
    DayName = "山の日"
  Case NumWeek(YYYY, 9, 3)
    DayName = "敬老の日"
  Case NumWeek(YYYY, 9, 3) + 1
    If DateValue(YYYY & "/9/" & Int(23.2488 + 0.242194 * (YYYY - 1980) - Int((YYYY - 1980) / 4))) = NumWeek(YYYY, 9, 3) + 2 Then
      DayName = "国民の休日"
    End If
  Case DateValue(YYYY & "/9/" & Int(23.2488 + 0.242194 * (YYYY - 1980) - Int((YYYY - 1980) / 4)))
    ' 参考URL http://www.wanichan.com/pc/excel/2010/5/page07.html
    DayName = "秋分の日"
  Case NumWeek(YYYY, 10, 2)
    If YYYY <= 2019 Then
      DayName = "体育の日"
    Else
      DayName = "スポーツの日"
    End If
  Case DateValue("2019/10/22")
    DayName = "即位礼正殿の儀の行われる日"
  Case DateValue(YYYY & "/11/3")
    DayName = "文化の日"
  Case DateValue(YYYY & "/11/23")
    DayName = "勤労感謝の日"
  Case DateValue(YYYY & "/12/23")
    If YYYY < 2019 Then
      DayName = "天皇誕生日"
    End If
  Case DateValue(YYYY & "/12/31")
    DayName = "年末"
End Select

' 振替休日
' 「国民の祝日」が日曜日に当たるときは、その日後においてその日に最も近い「国民の祝日」でない日を休日とする
' なので「国民の祝日」の翌日が月曜日だったときも、振替休日となる
Select Case Serial
  Case DateValue(YYYY & "/1/1") + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/2/11") + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/2/23") + 1
    If YYYY > 2019 And Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/3/" & Int(20.8431 + 0.242194 * (YYYY - 1980) - Int((YYYY - 1980) / 4))) + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/4/29") + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/5/5") + 1
    ' 5月5日が日曜~火曜日だったら、振替休日確定
    If vbSunday <= Weekday(DateValue(YYYY & "/5/5")) And Weekday(DateValue(YYYY & "/5/5")) <= vbTuesday Then fSubstitute = True
  Case DateValue(YYYY & "/9/" & Int(23.2488 + 0.242194 * (YYYY - 1980) - Int((YYYY - 1980) / 4))) + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/11/3") + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/11/23") + 1
    If Weekday(Serial) = vbMonday Then fSubstitute = True
  Case DateValue(YYYY & "/12/23") + 1
    If YYYY < 2019 And Weekday(Serial) = vbMonday Then fSubstitute = True
End Select
If fSubstitute = True Then
  DayName = "振替休日"
End If

' 2020年特殊対応
Select Case Serial
  Case DateValue("2020/7/20")
    DayName = "平日"
  Case NumWeek(2020, 10, 2)
    DayName = "平日"
  Case DateValue("2020/8/11")
    DayName = "平日"
  Case DateValue("2020/7/23")
    DayName = "海の日"
  Case DateValue("2020/7/24")
    DayName = "スポーツの日"
  Case DateValue("2020/8/10")
    DayName = "山の日"
  Case DateValue("2020/9/22")
    DayName = "秋分の日"
End Select

' 祝日値判定
If DayName = "平日" Then
  ' ## 曜日選択 #####
  If IsDate(Serial) Then
  Select Case Weekday(Serial)
  Case vbSunday
    RV = vbSunday
  'Case vbMonday
  ' RV = vbMonday
  'Case vbTuesday
  ' RV = vbTuesday
  'Case vbWednesday
  ' RV = vbWednesday
  'Case vbThursday
  ' RV = vbThursday
  'Case vbFriday
  ' RV = vbFriday
  Case vbSaturday
    RV = vbSaturday
  End Select

  'RV = Weekday(Serial)
  Else
    Exit Function
  End If
Else
  RV = 8
End If

' ### 終了処理 ############################################################

Select Case RVFlag
  Case 0
    chkHoliday = RV
  Case 1
    chkHoliday = DayName
End Select

End Function

Public Function NumWeek(Year, Month, Weeks)
' 参考資料
' http://www.relief.jp/itnote/archives/003241.php

Dim MonNum As Byte
Dim FirstMonDay As Date

' 第1週目の月曜日を求める
Select Case Weekday(DateValue(Year & "/" & Month & "/1"))
  Case vbSunday ' 1
    MonNum = 1
  Case vbMonday ' 2
    MonNum = 0
  Case vbTuesday ' 3
    MonNum = 6
  Case vbWednesday ' 4
    MonNum = 5
  Case vbThursday ' 5
    MonNum = 4
  Case vbFriday ' 6
    MonNum = 3
  Case vbSaturday ' 7
    MonNum = 2
End Select
FirstMonDay = DateValue(Year & "/" & Month & "/" & 1 + MonNum)

' 第1週目月曜日から何週間後なのか、シリアル値を出力
NumWeek = DateValue(Year & "/" & Month & "/" & 1 + MonNum) + 7 * (Weeks - 1)

End Function

ここしばらくは

ここしばらくは、ツイッター(microblogging)ばかり更新していたのだけれど、思ったことを少し。

すごく、怨嗟の言葉が多いです。

愚痴を吐き出す場所という感じ。
僕自身がそういう使い方をしなかったわけでもないけど、そればっかりが増幅するので精神に影響をきたしそう、という感触があった。

いろいろ考えてたらマイナス思考になっていたので、それは全部カット。

Twitter は感情の増幅回路。

言い得て妙。

amazonaws を iptables で拒否

自宅サーバで公開しているサイトへの amazonaws からのアクセスが、かなりうざい。

amazonaws は、amazon がサービスしているウェブサービス aws からのアクセスとのこと。
そのサービスを使ってアクセスしてきているのは理解したけど、まともにページを表示するようなマネはしていなかった。
具体的には /js/lightbox.min.js のような、Web サービスを行うためのスクリプトだけが狙われてた。
思うに、google アナリティクスのようなサービスに検知されないための処理なんだろう。
あれは通常のページを開いて解析サイトにトラフィックを飛ばさないと解析できないもんだろうし。
それに、普通のユーザはコンテンツをすっ飛ばしてサイト情報を集めたりはしない*1

うん。これは amazonaws を拒否しておこう。

とは思ったものの、IPアドレスの範囲はかなり広い上に細かい。
なので、iptables で拒否するのを躊躇していたんだけど、amazon で情報が出てた。

https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-ip-ranges.html

Amazon Web Services (AWS) は、その現在の IP アドレス範囲を JSON 形式で公開します。現在の範囲を参照するには、.json ファイルをダウンロードします。

ということなので、時々チェックしないとダメみたい。
とりあえず肝心のデータは、次の URL で取得できた。

https://ip-ranges.amazonaws.com/ip-ranges.json

とはいえ、僕は JSON 形式のデータを解析する方法を知らないんだけど……
と思っていたら、同じページに jq コマンドによる解析例があった。
素晴らしい。

jq コマンドって、リポジトリにあるかな?

$ type apt-file || sudo apt install apt-file
$ sudo apt update
$ sudo apt-file search jq | grep "\/jq$"
jq: /usr/bin/jq

あった。

$ sudo apt install jq
(以下略)

うん、さくっとインストールできた。

次に、上記サイトで「例 3.すべての IPv4 アドレスを取得します」とのサンプルがあるので、試しに参照してみる。

$ wget -q -O /tmp/ip-ranges.json https://ip-ranges.amazonaws.com/ip-ranges.json
$ jq -r '.prefixes | .[].ip_prefix' < /tmp/ip-ranges.json
18.208.0.0/13
52.95.245.0/24
99.77.142.0/24
52.194.0.0/15
54.155.0.0/16
54.196.0.0/15
99.78.170.0/23
52.94.22.0/24
52.95.255.112/28
(以下略)

かなり長いな……
ってことで、行数をカウント。

$ jq -r '.prefixes | .[].ip_prefix' < /tmp/ip-ranges.json | wc
   1682    1682   25080

……重複とか、無いよね?
少し表示された内容を読んでて、重複がありそうだったので確認してみる。

$ jq -r '.prefixes | .[].ip_prefix' < /tmp/ip-ranges.json | sort -un | wc
    360     360    5140

……えーと。
こんなに重複があるとか、なんかの嫌がらせ?
と一瞬思ったけど、リージョン違いによる重複なんだろうな。

create-time を見れば更新されているかどうか分かるとのことなので、定期的に観測するなら create-time を参照すればよさそう。
このサイトだと、また amazonaws がログに表示されるようになったら更新を掛ける程度で。
Raspberry Pi だから、ファイルの更新が結構致命傷に繋がりやすいんだよね……。

iptables への設定については、シェルの for 文で一括登録しておく。

$ pTarget="$(jq -r '.prefixes | .[].ip_prefix' < /tmp/ip-ranges.json | sort -un)"
$ for s in ${pTarget}
do
  sudo iptables -A OUTPUT -d ${s} -o eth0 -j DROP
done
$ sudo iptables -n -L

確認コマンドとして iptables -L だけだと、名前の逆引きが行われてかなり表示が遅くなったので -n を加えた。

しばらく様子見。


あと、分割された CIDR をコマンドラインでまとめ直す方法があれば、調べておきたい。
たとえば、こんな CIDR 表記。

52.56.0.0/16
52.57.0.0/16
52.58.0.0/15
52.60.0.0/16
52.61.0.0/16
52.62.0.0/15

これって、連続してるんだから、CIDR として次のように書けるはずなんだよね。

52.56.0.0/13

もしかすると、IPアドレス 10 個をネットワークアドレス/ブロードキャストアドレスに消費しているのかもしれないけど、サイト管理者としては設定行数が増えるだけなのでメリットを感じられない。

*1:例を言えば、天気を知りたいのに、予報ではなく予報サイトの構成から調べるとか、なかなかトリッキーな性格の持ち主と思われる。