Win11 SSH サーバ設定 @22H2

2024/03/23 09:12 OS別::Windowsその他::技術情報
Windows 10 での SSH サーバ設定は、かなりの方に参照いただいているようで、感謝いたします。
基本的には Windows 11 でも同じような設定を行うのですが、手順としては微妙に変わるので、リライトしました。

ssh サーバの説明や接続方法等は Win10 SSH サーバ設定 を参照いただくとして、対象のバージョン、手順、起動方法までを説明範囲とします。

Windows 対象バージョン

設定 選択

スタートメニューを右クリックして「設定」を選択します。
設定
スタートメニューから設定選択

バージョン情報 選択

表示された設定画面をスクロールして、バージョン情報を選択します。
win11 バージョン情報
バージョン情報 選択
バージョン情報が表示されます。

表示されているバージョンが今回の記事で利用しているバージョンです。
この場合、Windows11 Pro のバージョンが 22H2 で、OS ビルドが 22621.1848 になります。
win11 Version
Windows バージョン情報
続けて ssh をインストールするため、この画面のメニューからアプリを選択します。

sshd インストール手順

アプリ

アプリ画面に移動したら、オプション機能を選択します。
オプション機能
オプション機能

アプリ > オプション機能

「オプション機能を追加する」の「機能を表示」を選択します。
機能を表示
機能を表示

オプション機能を追加する

OpenSSH サーバーを選択して、チェックがついたら「次へ」を選択します。
オプション機能を追加する
オプション機能を追加する

インストール

追加する機能を確認されるので、OpenSSH サーバーが表示されていることを確認して「インストール」を選択します。
インストール対象確認
インストール対象確認
OpenSSH サーバーがインストールされるのを待ちます。
win11 OpenSSH サーバー インストール待機
インストール 待機
インストールされると、インストール済みと表示されます。
もしくは、もう一度アプリのオプション機能画面を表示して、OpenSSH サーバーがあればインストールされています。
インストール済み
インストール確認
インストール確認

sshd 利用

サービス起動手順

OpenSSH サーバーは、サービスとして起動しないと SSH ログインできません。

サービス起動するために、まずスタートメニューを右クリックして「コンピューターの管理」を起動します。

win
コンピューターの管理選択画面
ここから「サービスとアプリケーション」→「サービス」へ移動すると「OpenSSH SSH Server」があります。

サービス選択
サービス選択画面

「OpenSSH SSH Server」をダブルクリックして「OpenSSH Server のプロパティ」を開きます。

まず、サービスが停止していることが分かります。

OpenSSH SSH Server のプロパティ
OpenSSH SSH Server のプロパティ画面
「開始」ボタンをクリックして、サービスを実行しておきます*1

また、Windows を起動したらサービスも起動させたい場合は、「全般」タブの「スタートアップの種類」を「手動」から「自動」に変更して「OK」ボタンをクリックします。

スタートアップの種類選択
スタートアップの種類選択画面

ユーザ

普段、私は Windows に xxx@hotmail.co.jp のアカウント(いわゆる Microsoft アカウント)を利用してログインしています。
このアカウントでは、ssh によるリモートアクセスができませんでした。

ということで、ローカルアカウントの作成が必要です。

スタートメニューを右クリックしたときにでる「コンピューターの管理」は、すでに起動しているものと思います。
「コンピューターの管理(ローカル)」→「システムツール」→「ローカル ユーザーとグループ」→「ユーザー」と開いていくと、sshd ユーザが自動で作られているのが確認できました。

この「ユーザー」か、「ユーザー」を選択して出てきた右ペインを右クリックすると「新しいユーザー」が出てくるので、これをクリックして ssh 接続するための新しいユーザーを追加します。

RDP だと、Administrators グループまたはリモートデスクトップユーザーグループに追加しなければなりません。
ここで作成したアカウントは Administrators グループに入れてしまいましたが、OpenSSH でのアクセスの場合はユーザー登録だけで良いようです(未確認)。

sshd_conf

OpenSSH サーバーとして設定は、以下フォルダの設定ファイルで行います。
%SystemRoot%\System32\OpenSSH
管理者権限でテキストエディタを起動したら sshd_config_default を開いて sshd_config という名前で別名保存します。

コマンドプロンプトを管理者権限で起動すると、簡単にコピーできます。

Win キーを押して cmd を入力し、Ctrl + Shift キーを押しつつ Enter すると、管理者権限でコマンドプロンプトを起動できます。
C:\WINDOWS\system32>cd OpenSSH
C:\Windows\System32\OpenSSH>dir
C:\Windows\System32\OpenSSH>copy sshd_config_default sshd_config
C:\Windows\System32\OpenSSH>notepad sshd_config
C:\Windows\System32\OpenSSH>

アンチウィルスソフト

Norton Internet Security をインストールしていますが、LAN 内の Linux サーバからアクセスする場合、特に何の設定も必要なくアクセスできました。

アクセスできない場合、インストールされているアンチウィルスソフトの設定を確認してみてください。

*1 : プロパティ画面ではなく、サービス選択で「OpenSSH SSH Server」を右クリックして「開始」を選択しても SSH 接続を受け付けるようになります。

Windows 11 への SSH 接続

Tera Term でアクセスする場合、通常の UNIX / Linux へアクセスするのと手順は同じです。

そのまま localhost:22 へ ssh アクセスすると、通常のログイン処理でアクセス可能です。

詳細については、Win10 SSH サーバ設定 の SSH 接続方法を参照してみてください

以降、2024.3.2 追記。

質問があり、現時点のバージョンでローカルアカウントを作って、Tera Term でアクセスできることを確認しましたので、簡単に追記します。

[追記] Tera Term ログイン

Windows11 端末に、管理権限のあるユーザでログインしていることをユーザー作成の前提条件とします。

バージョン情報

記事に投稿当時より Windows のバージョンが上がっているので、現時点のバージョン情報を記載します。
Win11 Version

sshd サービス確認

Ctrl + Shift + Esc 等でタスクマネージャーを起動し、サービスを選択します。
sshd サービス起動
ここで、状態が「停止」であれば、右クリックして開始をクリックし、実行中にさせます。

上記画像の通り、sshd の「状態」欄が「実行中」になっていれば大丈夫です。

ローカルアカウント追加

ユーザー作成ですが、開いているタスクマネージャーのメニューからユーザーを選択して、そのままユーザーアカウントの管理をクリックします。
ユーザアカウントの管理

ユーザーアカウントの画面がでたら、別のアカウントの管理を選択します。
別のアカウントの管理

「PC 設定で新しいユーザーを追加」をクリックします。
PC 設定で新しいユーザーを追加

「アカウントの追加」をクリックします。
アカウントの追加

Microsoft アカウント画面が表示されたら「このユーザーのサインイン情報がありません」を選択します。
Microsoft アカウント 1

続いて「Microsoft アカウントを持たないユーザーを追加する」を選択します。
Microsoft アカウント 2

やっとローカルアカウントを作成する画面が表示されるので、必要事項を入力します。
Microsoft アカウント 3

ここでは、サンプルとして test ユーザーを作成します。
まず、ユーザー名とパスワードを入力します。
Microsoft アカウント 情報入力 1

下へスクロールして、パスワードを忘れた場合の質問に回答します。
ここでは、すぐに削除するので x で埋めていますが、忘れた際に必要になります。
Microsoft アカウント 情報入力 2

すべて入力して「次へ」をクリックすると、以下の「ほかのユーザー」画面に戻りますので、ユーザーが作られたことを確認します。

ここで作られたユーザーの「アカウントの種類」は「標準ユーザー」です。
アカウント確認画面

リモートアクセスするユーザーに管理者権限が必要な場合は、別途管理者権限を付与してください。

レビュービルド26052以降であれば、Linux の sudo コマンドと同じコマンドが実装されるとのこと。

Windows11 へ SSH アクセス

Tera Term で Windows 11 に対してアクセスし、先ほど設定したユーザー名およびパスワードを入力すると、Windows 11 のターミナル(ここではデフォルトの cmd.exe を利用)にログインできます。
Tera Term から SSH ログイン
ここでは Raspberry Pi からアクセスしていますが、ローカル (localhost)でもアクセス可能です。


流れを見てもらえれば分かる通り、SSHd が動作していれば、Windows 端末の「標準ユーザー」で Tera Term から SSH アクセスが可能です。

祝日を返すマクロ [Excel VBA]

2024/03/26 05:56 OS別::Windowsその他::技術情報
Excel VBA で、毎年祝祭日リストを更新しなくても祝日を自動計算して返すマクロができないか見ていたら、なんとできそうでした。

使うためには、fnWeekday 関数(Public 関数)を Excel のセルに記述して利用してください。
少なくとも、2023年~2025年は問題なさそうです。
(2023.6.25 2025年の「敬老の日」が祝日にならない問題を修正)
(2024.3.2 Date 関数の戻り値が日付型と判定できない問題を修正)

最終的に挙動を確認した Excel バージョンは、次の通りです。
Microsoft® Excel® for Microsoft 365 MSO (バージョン 2401 ビルド 16.0.17231.20236) 64 ビット

仕様

モジュール

モジュール内の関数を Excel のセルで利用します。
主に利用する関数は fnWeekday です。

セルには =fnWeekday(シリアル値) を指定することで戻り値を得ることができます。

fnWeekday 実行サンプル
fnWeekday 実行サンプル

また、=fnWeekday(シリアル値, 1) のように第2引数に 1 を指定すると、平日と休日、祝日の名称のいずれかを得ることができます。
これが 2 の場合は「祝日の趣旨」(画像における D 列)を得ます。

fnWeekday オプションを指定時の実行サンプル
fnWeekday オプションを指定時の実行サンプル

出力利用例
セル内の記述例出力例備考
=fnWeekday(DATE(2024,5,5))8祝日を示す 8 を表示する
=fnWeekday(DATE(2024,5,5),1)こどもの日平日/休日/(祝日の名称)の、いずれかを表示する
=fnWeekday(DATE(2024,5,5),2)こどもの人格を重んじ、こどもの幸福をはかるとともに、母に感謝する。祝日の趣旨を表示する
fnWeekday 以外の関数は、内部で細かい計算をするために使われます。
(もちろん、セル内で利用することも可能です)

戻り値

戻り値は、第2引数の指定で変化します。
上述したように、デフォルトで weekday 関数とほぼ同じ*1ですが、追加で 8=祝日としています。

以下、第2引数を明記した場合の挙動を記載します。
0の場合:数値(デフォルト)
第2引数に 0 を指定した(もしくは指定しない)場合に出力される番号です。
デフォルト
番号内部変数意味備考
1vbSunday日曜日
2vbMonday月曜日
3vbTuesday火曜日
4vbWednesday水曜日
5vbThursday木曜日
6vbFriday金曜日
7vbSaturday土曜日
8-祝日
1 の場合:名称
第2引数に 1 を指定した場合に出力される文字列です。
名称を返す
文字列意味備考
休日土日どちらか
平日土日祝以外の平日(実際は月~金曜日)
(各祝日名)祝日
祝日の名称は、国民の祝日に関する法律に準拠しています。
2 の場合:趣旨
第2引数に 2 を指定した場合に出力される文字列です。
趣旨を返す
趣旨意味備考
(Nothing)平日/休日であり、祝日ではない日
(各祝日の趣旨)法律などで定義される趣旨
(Nothing) については、表示しないように(Null 表示に)するかもしれません。

*1 : weekday 関数のデフォルトの戻り値は 1=日, 2=月, 3=火, 4=水, 5=木, 6=金, 7=土になっています。

関数

作成したモジュールは、つぎの五つの関数から成り立っています。

fnWeekday(Serial, [Switch])

このモジュールの本丸で、公式の weekday 関数のように使います。
戻り値として曜日(vbMonday から vbSaturday)だけでなく、追加で Holiday を意味する 8 も返します。

オプションには、シリアル値が必要です。
戻り値の内容を変えるために、Switch 番号も指定可能です。

第2引数を指定した際に、セルに表示される内容は、次の通りです。
Switch意味備考
0曜日と祝日を意味する 1~8 の数字を返すSwitch を省略した場合のデフォルト
1平日/休日/祝日の名称を返す
2祝日の趣旨を返す

fnDate(Year, Month, Day)

Excel 関数 date コマンドを模したものです。
オプションには、年・月・日の、三つが必要です。

Excel VBA の場合、DateValue コマンドを使えばいいのですが、年月日を文字列で指定しなければならないため、コードがかなり読みにくくなっていました。
可読性を目的に関数化しています。

fnHappyMonday(Year, Month, Weeks)

ハッピーマンデー制度でシリアル値を取得するのに必要な、x年x月の第x月曜日、という指定でシリアル値を取得するための関数です。
オプションには、年・月・第x週の、三つが必要です。

考え方としては、月の1日が何曜日なのかを見て、そこから月曜日が何日なのかを割り出します。
あとは、7日に第x週のx-1 を掛けたものを足してあげれば、シリアル値を取得できます。

fnVernalEquinox(Year)

春分の日を割り出し、シリアル値を取得するための関数です。
オプションには、年の指定が必要です。

1行しかない、かなり短いコードですが関数化しています。
計算で出力した日付ではない場合、ここで出力情報を調整する予定です。

fnAutumnalEquinox(Year)

秋分の日を割り出し、シリアル値を取得するための関数です。
オプションには、年の指定が必要です。

1行しかない、かなり短いコードですが関数化しています。
計算で出力した日付ではない場合、ここで出力情報を調整する予定です。

ソースコード

Option Explicit

Public Function fnWeekday(Serial As Date, Optional Switch As Byte = 0)
' #########################################################################
' #
' # 呼び出されると、引数の Serial から曜日/祝日情報を返すマクロ
' # デフォルトの戻り値は、以下の通り
' #
' # 戻り値の定義
' #  0 = 平日(月曜~金曜)
' #  1 = 日曜日(vbSunday)
' #  2 = 曜日月(vbMonday)
' #  3 = 火曜日(vbTuesday)
' #  4 = 水曜日(vbWednesday)
' #  5 = 木曜日(vbThursday)
' #  6 = 金曜日(vbFriday)
' #  7 = 土曜日(vbSaturday)
' #  8 = 祝日
' #
' #########################################################################

' ### 変数定義 #########################

Dim DEFpDayName     As String
Dim DEFpDayMeaning  As String
Dim pDayName        As String
Dim pDayMeaning     As String
Dim pRV             As Byte
Dim pYYYY           As Integer
Dim fSubstitute     As Boolean

' ### 変数設定 #########################

DEFpDayName = "平日"
DEFpDayMeaning = "(Nothing)"

pDayName = DEFpDayName
pDayMeaning = DEFpDayMeaning

pYYYY = Year(Serial)

' ### メイン処理 #######################

' serial に指定された年月日と、該当する年の祝日に相当するシリアル値を比較する。
' 該当の祝日であれば、第2引数通りに変数を設定する。
' もし該当の祝日名があれば、戻り値 8 を指定する。

Select Case Serial
    ' 日付が固定されているもの
    Case fnDate(pYYYY, 1, 1)
        pDayName = "元旦"
        pDayMeaning = "年のはじめを祝う。"
    Case fnDate(pYYYY, 1, 15)
        If pYYYY <= 1999 Then
            pDayName = "成人の日"
            pDayMeaning = "おとなになったことを自覚し、みずから生き抜こうとする青年を祝い、励ます。"
        End If
    Case fnDate(pYYYY, 2, 11)
        pDayName = "建国記念の日"
        pDayMeaning = "建国をしのび、国を愛する心を養う。"
    Case fnDate(pYYYY, 2, 23)
        If 2019 < pYYYY Then
            pDayName = "天皇誕生日"
            pDayMeaning = "天皇の誕生日を祝う。"
        End If
    Case fnDate(pYYYY, 4, 29)
        If 2007 <= pYYYY Then
            pDayName = "昭和の日"
            pDayMeaning = "激動の日々を経て、復興を遂げた昭和の時代を顧み、国の将来に思いをいたす。"
        ElseIf 1989 <= pYYYY Then
            pDayName = "みどりの日"
            pDayMeaning = "自然の恩恵に感謝する"
        ElseIf 1948 <= pYYYY Then
            pDayName = "天皇誕生日"
            pDayMeaning = "天皇の誕生を祝う(昭和天皇)"
        ElseIf 1927 <= pYYYY Then
            pDayName = "天長節"
            pDayMeaning = "天地が永久であるように天皇の治世も続くように"
        End If
    Case fnDate(pYYYY, 5, 3)
        pDayName = "憲法記念日"
        pDayMeaning = "日本国憲法の施行を記念し、国の成長を期する。"
    Case fnDate(pYYYY, 5, 4)
        If 2007 <= pYYYY Then
            pDayName = "みどりの日"
            pDayMeaning = "自然に親しむとともにその恩恵に感謝し、豊かな心をはぐくむ。"
        End If
    Case fnDate(pYYYY, 5, 5)
        pDayName = "こどもの日"
        pDayMeaning = "こどもの人格を重んじ、こどもの幸福をはかるとともに、母に感謝する。"
    Case fnDate(pYYYY, 7, 20)
        If pYYYY <= 2002 Then
            pDayName = "海の日"
            pDayMeaning = "海の恩恵に感謝するとともに、海洋国日本の繁栄を願う。"
        End If
    Case fnDate(pYYYY, 8, 11)
        ' 2014年制定、2016年より施工
        If 2016 <= pYYYY Then
            pDayName = "山の日"
            pDayMeaning = "山に親しむ機会を得て、山の恩恵に感謝する。"
        End If
    Case fnDate(pYYYY, 9, 15)
        If pYYYY <= 2002 Then
            pDayName = "敬老の日"
            pDayMeaning = "多年にわたり社会につくしてきた老人を敬愛し、長寿を祝う。"
        End If
    Case fnDate(pYYYY, 11, 3)
        pDayName = "文化の日"
        pDayMeaning = "自由と平和を愛し、文化をすすめる。"
    Case fnDate(pYYYY, 11, 23)
        pDayName = "勤労感謝の日"
        pDayMeaning = "勤労をたっとび、生産を祝い、国民たがいに感謝しあう。"
    Case fnDate(pYYYY, 12, 23)
        If pYYYY < 2019 Then
            ' 以降、上皇陛下
            pDayName = "天皇誕生日"
            pDayMeaning = "天皇の誕生日を祝う。"
        End If
End Select

Select Case Serial
    ' ハッピーマンデー
    Case fnHappyMonday(pYYYY, 1, 2)
        ' 2000 年より適用
        If 2000 <= pYYYY Then
            pDayName = "成人の日"
            pDayMeaning = "おとなになったことを自覚し、みずから生き抜こうとする青年を祝いはげます。"
        End If
    Case fnHappyMonday(pYYYY, 7, 3)
        If 2003 <= pYYYY Then
            ' 2003 年より適用
            pDayName = "海の日"
            pDayMeaning = "海の恩恵に感謝するとともに、海洋国日本の繁栄を願う。"
        End If
    Case fnHappyMonday(pYYYY, 9, 3)
        If 2003 <= pYYYY Then
            pDayName = "敬老の日"
            pDayMeaning = "多年にわたり社会につくしてきた老人を敬愛し、長寿を祝う。"
        End If
    Case fnHappyMonday(pYYYY, 10, 2)
        ' 2000 年より適用。2020 年より名称変更
        If 2020 <= pYYYY Then
            pDayName = "スポーツの日"
            pDayMeaning = "スポーツを楽しみ、他者を尊重する精神を培うとともに、健康で活力ある社会の実現を願う。"
        ElseIf 2000 <= pYYYY Then
            pDayName = "体育の日"
            pDayMeaning = "スポーツにしたしみ、健康な心身をつちかう日"
        End If

    ' 春分/秋分の日
    Case fnVernalEquinox(pYYYY)
        pDayName = "春分の日"
        pDayMeaning = "自然をたたえ、生物をいつくしむ。"
    Case fnAutumnalEquinox(pYYYY)
        pDayName = "秋分の日"
        pDayMeaning = "祖先をうやまい、なくなった人々をしのぶ。"
End Select

' 天皇の即位の日及び即位礼正殿の儀の行われる日を休日とする法律
Select Case Serial
    Case fnDate(2019, 5, 1)
        pDayName = "天皇の即位の日"
    Case fnDate(2019, 5, 2)
        pDayName = "国民の休日"
    Case fnDate(2019, 10, 22)
        pDayName = "即位礼正殿の儀の行われる日"
End Select

' 振替休日
Select Case Serial
    Case fnDate(pYYYY, 1, 1) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnDate(pYYYY, 2, 11) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnDate(pYYYY, 2, 23) + 1
        If 2019 < pYYYY Then
            If Weekday(Serial) = vbMonday Then fSubstitute = True
        End If
    Case fnDate(pYYYY, 4, 29) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnDate(pYYYY, 5, 5) + 1
        ' 5月5日が日曜~火曜日だったら、5/6 が振替休日
        If vbSunday <= Weekday(fnDate(pYYYY, 5, 5)) And Weekday(fnDate(pYYYY, 5, 5)) <= vbTuesday Then
            fSubstitute = True
        End If
    Case fnDate(pYYYY, 8, 11) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnDate(pYYYY, 11, 3) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnDate(pYYYY, 11, 23) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnDate(pYYYY, 12, 23) + 1
        If pYYYY < 2019 Then
            ' 以降、上皇陛下
            If Weekday(Serial) = vbMonday Then fSubstitute = True
        End If
        
    ' ハッピーマンデー
    Case fnHappyMonday(pYYYY, 1, 2) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnHappyMonday(pYYYY, 7, 3) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnHappyMonday(pYYYY, 9, 3) + 1
        ' シルバーウィーク対応
        ' もし、敬老の日の2日後が秋分の日なら、国民の休日にする。
        If fnHappyMonday(pYYYY, 9, 3) + 2 = fnAutumnalEquinox(pYYYY) Then
            pDayName = "国民の休日"
        ElseIf Weekday(Serial) = vbMonday Then
            fSubstitute = True
        End If
        
    Case fnHappyMonday(pYYYY, 10, 2) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True

    ' 春分/秋分の日
    Case fnVernalEquinox(pYYYY) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnAutumnalEquinox(pYYYY) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    'Case DateValue("2020/9/22")
    '    DayName = "秋分の日"

End Select

If fSubstitute = True Then pDayName = "振替休日"

' -----------------------------------------------------------
' 令和 2 年(2020年)及び令和 3 年(2021年)に限り、
' 東京オリンピック・パラリンピック競技大会の開催にあわせ、
' 「海の日」、「スポーツの日」及び「山の日」が移動している。
' -----------------------------------------------------------

' 令和2年 (2020) & 令和3年 (2021)
Select Case Serial
    ' 海の日
    Case fnHappyMonday(2020, 7, 3), fnHappyMonday(2021, 7, 3)
        pDayName = DEFpDayName
        pDayMeaning = DEFpDayMeaning
    Case fnDate(2020, 7, 23)
        pDayName = "海の日"
        pDayMeaning = "海の恩恵に感謝するとともに、海洋国日本の繁栄を願う。"
    Case fnDate(2021, 7, 22)
        pDayName = "海の日"
        pDayMeaning = "海の恩恵に感謝するとともに、海洋国日本の繁栄を願う。"

    ' スポーツの日
    Case fnHappyMonday(2020, 10, 2), fnHappyMonday(2021, 10, 2)
        pDayName = DEFpDayName
        pDayMeaning = DEFpDayMeaning
    Case fnDate(2020, 7, 24)
        pDayName = "スポーツの日"
        pDayMeaning = "スポーツを楽しみ、他者を尊重する精神を培うとともに、健康で活力ある社会の実現を願う。"
    Case fnDate(2021, 7, 23)
        pDayName = "スポーツの日"
        pDayMeaning = "スポーツを楽しみ、他者を尊重する精神を培うとともに、健康で活力ある社会の実現を願う。"

    ' 山の日
    Case fnDate(2020, 8, 11), fnDate(2021, 8, 11)
        pDayName = DEFpDayName
        pDayMeaning = DEFpDayMeaning
    Case fnDate(2020, 8, 10)
        pDayName = "山の日"
        pDayMeaning = "山に親しむ機会を得て、山の恩恵に感謝する。"
    Case fnDate(2021, 8, 8)
        pDayName = "山の日"
        pDayMeaning = "山に親しむ機会を得て、山の恩恵に感謝する。"
End Select

' 祝日値判定
If pDayName = DEFpDayName Then
    ' 平日/休日であれば、戻り値を 1~7 で指定する。
    ' ## 曜日選択 #####
    If IsDate(Serial) Then
        Select Case Weekday(Serial)
            Case vbSunday
                pRV = vbSunday
                pDayName = "休日"
            Case vbMonday
                pRV = vbMonday
            Case vbTuesday
                pRV = vbTuesday
            Case vbWednesday
                pRV = vbWednesday
            Case vbThursday
                pRV = vbThursday
            Case vbFriday
                pRV = vbFriday
            Case vbSaturday
                pRV = vbSaturday
                pDayName = "休日"
        End Select
    Else
        ' IsDate の判定内容にエラーがある場合
        fnWeekday = "祝日値判定エラー"
        Exit Function
    End If
Else
    ' 平日でなければ、戻り値を 8 で指定する。
    pRV = 8
End If

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

' オプションの内容で、戻り値を変更する。
Select Case Switch
    Case 0
        fnWeekday = pRV
    Case 1
        fnWeekday = pDayName
    Case 2
        fnWeekday = pDayMeaning
End Select

' ######################################

End Function

Public Function fnDate(Year, Month, Day)
' #########################################################################
' #
' # VBA の date 関数は、Excel sheet の date 関数と異なり、文字列を指定する。
' # この関数は、セルで利用する date 関数と同じ使い勝手を実現するもの。
' #
' #########################################################################

fnDate = DateValue(Year & "/" & Month & "/" & Day)

End Function

Public Function fnHappyMonday(Year, Month, Weeks)
' #########################################################################
' #
' # ハッピーマンデー用のシリアル値を返す。
' # 指定された、Year 年 Month 月の第 Weeks 週の月曜日(シリアル値)を返す。
' #
' # 参考資料
' # http://www.relief.jp/itnote/archives/003241.php
' #########################################################################

Dim pMondayDate     As Byte
Dim pFirstMonDay    As Date

' ## 第1週目の月曜日を求める。

' 先に指定月の1日が何曜日なのかを見て、次の月曜日が何日なのかを指定する。
Select Case Weekday(fnDate(Year, Month, 1))
    Case vbSunday       ' 1
        ' x月1日が日曜日なら、月曜日は翌日の 2 日
        pMondayDate = 2
    Case vbMonday       ' 2
        ' x月1日が月曜日なので、そのまま 1 日
        pMondayDate = 1
    Case vbTuesday      ' 3
        ' x月1日が火曜日なので、月曜日は 6 日後の 7 日
        pMondayDate = 7
    Case vbWednesday    ' 4
        ' x月1日が水曜日なので、月曜日は 5 日後の 6 日
        pMondayDate = 6
    Case vbThursday     ' 5
        pMondayDate = 5
    Case vbFriday       ' 6
        pMondayDate = 4
    Case vbSaturday     ' 7
        pMondayDate = 3
End Select

' 第1週目の月曜日から何週間後なのか、必要な日数を足してシリアル値を返す。
fnHappyMonday = fnDate(Year, Month, pMondayDate) + (7 * (Weeks - 1))

End Function

Public Function fnVernalEquinox(Year)
' #########################################################################
' #
' # 呼び出されると、引数の Year から算出した 春分の日 情報を返すマクロ
' #
' # 参考 URL http://www.wanichan.com/pc/excel/2010/5/page07.html
' #########################################################################
fnVernalEquinox = fnDate(Year, 3, Int(20.8431 + 0.242194 * (Year - 1980) - Int((Year - 1980) / 4)))

End Function

Public Function fnAutumnalEquinox(Year)
' #########################################################################
' #
' # 呼び出されると、引数の Year から算出した 秋分の日 情報を返すマクロ
' #
' # 参考 URL http://www.wanichan.com/pc/excel/2010/5/page07.html
' #########################################################################
fnAutumnalEquinox = fnDate(Year, 9, Int(23.2488 + 0.242194 * (Year - 1980) - Int((Year - 1980) / 4)))

End Function

その他

zip ファイル

コピペより、インポート可能なファイルが良いという方向け。
現在バージョン
過去バージョン

更新履歴

  • 2023.3.5 細かい表現と、マクロの微修正を行った。
  • 2023.6.25 敬老の日に関するご指摘をいただき、ハッピーマンデーの扱いを修正*2 した。
  • 2024.3.2 オプションに Date を指定した場合 0 が返ってくる現象についてご指摘をいただき、IsDate 関数で判断する値を CVDate 関数で日付型へ事前に変換*3するようにした。
  • 2024.3.2 IsDate 関数で判断する Serial について、fnWeekday 関数にオプションとして入力する時点で Date 型であることを強制した。

*2 : シリアル値で祝日を判断するフローで、固定されていた敬老の日(2002年以前)を分岐させたあとにハッピーマンデーの分岐が来ており、ハッピーマンデー対象である敬老の日が分岐済みの扱いになってチェックされない流れになっていた。

*3 : VBA の IsDate 関数が、Date 関数で取得した値そのままだと、数値を日付と判断できない。

参考サイト様

キーボードの誤認識対応


状況

OS は Windows11 で、時折スマホから RDP して利用しています。
その後、該当端末のコンソールでログインしても、キーボードは通常通り入力可能でした。
ただ、その時は Windows Update が走った直後らしく、RDP したあとのコンソール利用で入力が英語キーボードとして動いていました。

スマホからの RDP で、この時、スマホ接続のキーボード等は利用していません。
なので RDP のソフトウェアキーボードに疑義が持たれます。

ポイントとしては、OS アップデート直後に RDP したことによるキーボードレイアウトの誤動作になります。

対策

対処策

調べてみましたが、Windows11 での対処が情報として少ないですね。
今回は、最終的にハードウェアキーボードレイアウトの変更で対処できました。

予防策

Microsoft に文句言うくらいしか思いつきません。

対処

ということで、今回行った対処について。
設定反映には再起動が必須なので、何か作業中なら全部保存して閉じておく必要があります。

流れとしては、次の通りです。
  1. ハードウェアキーボードレイアウトの変更
  2. 再起動
  3. ハードウェアキーボードレイアウトの変更
  4. 再起動
なんで同じことを繰り返してるのかって?
同じことを繰り返さないと直らかなかったからです。

ハードウェアキーボードレイアウトの変更(1回目)

システムへのアクセス
Win + i で、システムへアクセスします。
次のような、システム画面が出てきますので、「時刻と言語」をクリックします。
システム
システム 画面
「キーボードレイアウトの変更」へのアクセス
次のような画面で、「言語と地域」をクリックします。

時刻と言語
時刻と言語 画面

次のような画面で、言語の「日本語」から … メニューをクリックして「… 言語のオプション」をクリックします。

時刻と言語>言語と地域
時刻と言語>言語と地域 画面
次のような画面で、キーボードレイアウト:日本語キーボード(106/109 キー) の「レイアウトを変更する」 をクリックします。

時刻と言語>言語と地域>オプション
時刻と言語>言語と地域>オプション 画面
「ハードウェアキーボードレイアウトの変更」での設定
次の画面で、キーボードレイアウト:日本語キーボード(106/109 キー) をクリックします。

なお、日本語キーボードとして登録されているのに OS は英語キーボードとして動いているので、この設定項目名ではなく、設定内容がおかしくなっていると推測されます。
一度別のものに変更して、正しいものに設定し直す作戦です。
ハードウェア キーボード レイアウトの変更(日本語)
ハードウェア キーボード レイアウトの変更(日本語) 画面

私の場合は「接続済みキーボード レイアウトを使用する」を選択しましたが、目的を考えれば英語キーボードでも問題ないと思います。

ハードウェア キーボード レイアウトの変更(選択画面)
ハードウェア キーボード レイアウトの変更(選択画面) 画面

次の画面で、「今すぐ再起動する」をクリックすると、再起動されます。

ハードウェア キーボード レイアウトの変更(変更後)
ハードウェア キーボード レイアウトの変更(変更後) 画面

ハードウェアキーボードレイアウトの変更(2回目)

同じことをもう一度行います。

違うことは、もとの「日本語キーボード(106/109 キー) 」を選択するところだけです。
また再起動します。

確認

私の場合は、これで元に戻りました。

2021/11/03(水)GitHub 登録鍵の更新

2021/11/03 14:02 その他::メモ

GitHub 登録鍵の更新


更新のきっかけ

GitHub 公式から、次のような感じのメールを受け取りました。
Hi @kjimba,

We noticed your personal access token "(トークン名)" with notifications and repo scopes will expire in 6 days.

If this token is still needed, visit https://github.com/settings/tokens/669610437/regenerate to generate an equivalent.

If you run into problems, please contact support by visiting https://github.com/contact?tags=dotcom-accounts

Thanks,
The GitHub Team
見た瞬間、新手のフィッシングメールかなにかかと思った……。

本物のようなので、対応します。

更新作業

基本的には、GitHub 公式の手順に従えばいいですね。

案内文にあったリンクから、更新方法のページに移動して、内容を参照します。
https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

新しい鍵の作成

鍵生成
新しく登録する鍵を生成します。

以下のメールアドレス name@example.com は、実際には GitHub に登録しているメールアドレスを使っています。
$ ssh-keygen -t ed25519 -C "name@example.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/jimba/.ssh/id_ed25519):

鍵を置く場所がデフォルトでいいか聞かれたのですが、変更したいので /home/jimba/.ssh/keys/git/id_ed25519 を入力しました。
これは、そもそも私が以前の鍵を置いている場所なので、ディレクトリが存在します。

次に、パスフレーズを聞かれるので入力します。

Enter passphrase (empty for no passphrase): ***
Enter same passphrase again: ***

実際は 3 文字ではないですが……任意のパスフレーズを入力します。

フィンガープリント等が表示されたので、作成できたようです。
念のためファイルを確認します。

jimba ~/.ssh/keys/git $ ll
合計 20
-rw------- 1 jimba pi  419 11月  3 12:21 id_ed25519
-rw-r--r-- 1 jimba pi  104 11月  3 12:21 id_ed25519.pub
-rw------- 1 jimba pi 3434  5月 21 23:39 id_rsa
-rw-r--r-- 1 jimba pi  748  5月 21 23:39 id_rsa.pub
drwxr-xr-x 2 jimba pi 4096 11月  3 12:13 old

きちんとできていました。

id_ed25519.pub は公開鍵なので、GitHub に登録するために中身を確認しておきます。
$ cat id_ed25519.pub
ssh-agent 登録
さて、次に ssh-agent に登録のようです。

$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/keys/git/id_ed25519

これで登録できました。
ssh-agent 確認
確認コマンドは、次の通り。

$ ssh-add -l
256 SHA256:******************** name@example.com (ED25519)

いろいろ伏せてますが、こんな感じで表示されます。
鍵の保管場所を変更していなければ、これで鍵作成の作業は完了だと思います。

私の場合、いままで ssh-agent に登録していなかったので ssh-agent への登録作業はこれで終わりです。
すでに登録しているものがある人は、削除が必要だと思います。

利用する鍵の変更

GitHub 登録鍵の変更
これもいくつか方法がありますが、ブラウザで更新しました。
https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account

GitHub へアクセスして、プロフィール画像から Setting へアクセスします。
「SSH and GPG keys」へ移動して「New SSH key」ボタンで、上記で確認した公開鍵の内容をコピペします。
ちなみに、タイトルは自分でわかるものを任意で入力します。

「Add SSH key」ボタンで、入力内容を登録します。パスフレーズの入力画面が出てきたら、入れます。
config 変更
私の場合は、利用する鍵の保管場所がデフォルトではないので、config を変更します。
今回、ssh-agent に登録したので不要になったのかもしれませんが……それはあとで確認 *1 しておきます。
$ cd ~/.ssh
$ [ -d old ] || mkdir old
$ cp -p config old/config_$(date +%Y%m%d)
$ diff config old/config_$(date +%Y%m%d)
$ vi config
(既存の鍵を ~/.ssh/keys/git/id_ed25519 に変更)
$ diff config old/config_$(date +%Y%m%d)
5c5
<       IdentityFile    ~/.ssh/keys/git/id_ed25519
---
>       IdentityFile    ~/.ssh/keys/git/id_rsa

全体を確認すると、次の通り。

$ cat config
ServerAliveInterval 60

Host github github.com
        HostName        github.com
        IdentityFile    ~/.ssh/keys/git/id_ed25519
        User            git

疎通確認

GitHub に正しく設定できているか、テストします。
https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/testing-your-ssh-connection
$ ssh -T git@github.com
Hi kjimba! You've successfully authenticated, but GitHub does not provide shell access.
問題ないようです。

古い鍵の削除

利用しなくなった鍵は自動で削除される *2 っぽいですが、念のため自分で古い公開鍵を削除しておきます。

GitHub へアクセスして、プロフィール画像から Setting へアクセスします。
「SSH and GPG keys」へ移動して、削除したい鍵の「Delete」ボタンで、古い公開鍵が削除できます。

本当に削除してよいのか聞かれるので、削除したい鍵であることを確認の上で「I understand, plase delete this SSH key」ボタンで削除します。

違っていた場合は、×ボタンで閉じればよいです。

*1 : ここでは、行った作業を記録する目的で記載しています。

*2 : SSH キーを 1 年間使っていない場合、セキュリティ上の理由により GitHub は使われていない SSH キーを自動的に削除するとの記載あり。

2021/10/27(水)電話系 IPアドレス

2021/10/27 17:59 その他::メモ

電話系通信用 IP アドレス帯域について

スマホなど、電話系の通信を制限(許可or拒否)したいときに利用するので、電話系の IP アドレスは公開されている。
また、どこを参照すればいいのか案内するようなサイトも、いくつも見つかる。
https://www.ipvx.info/2015/02/open_multi_cidr2_merge/

ここでは、その情報と、Whois gateway での探し方をまとめている。


nttdocomo

公開範囲

企業が、ユーザのネットワーク通信用に使用していると公開している IP アドレス範囲。
https://www.nttdocomo.co.jp/service/developer/smart_phone/spmode/

取得範囲

企業が取得している IP アドレスの範囲。
(Whois gateway での検索ワード)
http://whois.nic.ad.jp/cgi-bin/whois_gw
項目ワード
ネットワーク情報(組織名、Organization)NTT DOCOMO,INC.

KDDI

公開範囲

企業が、ユーザのネットワーク通信用に使用していると公開している IP アドレス範囲。
EZweb端末用
https://www.au.com/ezfactory/tec/spec/ezsava_ip.html
2011秋冬モデル以降
NoIPアドレスサブネットマスク (bit)備考
127.90.207.224/28
227.90.207.240/28
327.90.220.224/28
427.90.220.240/28
2019年12月5日時点
上記以外の EZweb端末
NoIPアドレスサブネットマスク (bit)備考
127.80.181.240/28
1827.90.206.0/26
1927.90.206.64/26
2027.90.206.128/26
2127.90.207.0/26
2227.90.207.64/26
2327.90.207.128/26
2427.90.220.112/28
スマートフォン/タブレット/4G LTE ケータイ
[au.com/developer/android/kaihatsu/network/]
NoIPアドレスサブネットマスク (bit)備考
1106.128.0.0/13106.135.0.0/16 を除く
2106.180.16.0/20
3106.180.32.0/20
4106.180.48.0/22
5111.86.140.128/27
6182.248.112.128/26
7182.249.0.0/16
8182.250.0.0/15
92001:268:9000::/36
102001:268:9800::/40
112001:268:9900::/40
122001:268:9a00::/40
132001:268:9b00::/40
2021年10月時点

取得範囲

企業が取得している IP アドレスの範囲。
(Whois gateway での検索ワード)
http://whois.nic.ad.jp/cgi-bin/whois_gw
項目ワード備考
ネットワーク情報(組織名、Organization)KDDI CORPORATION範囲が広すぎるとのこと

Softbank

公開範囲

企業が、ユーザのネットワーク通信用に使用していると公開している IP アドレス範囲。
スマートフォン/タブレット/4G LTE ケータイ
https://www.support.softbankmobile.co.jp/partner/home_tech1/index.cfm
NoIPアドレス/CIDR備考
1126.32.80.0/21
2126.32.89.0/27
3126.32.89.128/27
4126.32.90.0/23
5126.32.92.0/23
6126.34.0.0/18
7126.34.96.0/19
8126.133.192.0/18
9126.156.128.0/17
10126.157.64.0/18
11126.157.192.0/18
12126.158.128.0/17
13126.161.0.0/18
14126.161.64.0/21
15126.161.80.0/21
16126.161.96.0/22
17126.161.104.0/22
18126.161.116.0/22
19126.161.124.0/22
20126.166.128.0/17
21126.167.64.0/18
22126.179.0.0/18
23126.179.96.0/19
24126.179.128.0/18
25126.179.224.0/19
26126.186.32.0/19
27126.186.96.0/19
28126.193.128.0/18
29126.193.208.0/21
30126.193.216.0/22
31126.194.64.0/18
32126.194.192.0/18
33126.200.0.0/18
34126.200.112.0/20
35126.204.0.0/18
36126.204.64.0/21
37126.204.88.0/21
38126.204.96.0/19
39126.204.128.0/19
40126.204.176.0/21
41126.204.216.0/21
42126.204.224.0/19
43126.205.192.0/18
44126.208.128.0/17
45126.211.0.0/18
46126.211.112.0/20
47126.212.0.0/19
48126.212.80.0/21
49126.212.128.0/18
50126.212.240.0/20
51126.234.0.0/18
52126.234.96.0/19
53126.236.128.0/18
54126.237.0.0/18
55126.237.64.0/21
56126.237.80.0/21
57126.237.96.0/22
58126.237.104.0/22
59126.237.116.0/22
60126.237.124.0/22
61126.253.128.0/17
62126.254.128.0/17
63126.255.0.0/17
64126.255.128.0/18
2021年07月16日時点(集約済み)

取得範囲

企業が取得している IP アドレスの範囲。
(Whois gateway での検索ワード)
http://whois.nic.ad.jp/cgi-bin/whois_gw
項目ワード備考
ネットワーク情報(組織名、Organization)不明
APNIC WHOIS(whois.apnic.net) / ARIN WHOIS(whois.arin.net) / RIPE WHOIS(whois.ripe.net) / LACNIC WHOIS(whois.lacnic.net) / AfriNIC WHOIS(whois.afrinic.net) の Whois サーバに登録が無い模様。