ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

AWS EC2 Windows Serverのキーボードが英語レイアウトから変更できなかった話

今回は、タイトルの通りAWSのEC2でWindows Serverを立ち上げたときにキーボードが英語レイアウトから、日本語レイアウトに変更できなかったときの話をしたいと思います。最終的には日本語レイアウトに変更することはできたので、その経緯等を順を追って説明します。

久しぶりにAWSのEC2で検証したいことがあり、無料利用枠の対象である以下のAMIを指定してEC2を立ち上げました。

無料利用枠対象のAMIの選択

Windows Serverのバージョンは、やや古いですが2016です。このAMIのロケールは、英語なのでEC2を立ち上げた後に日本語化することにしました。今回は、日本語化するときの手順は、省略します。

日本語化対応をした後に、キーボードの入力がおかしいことに気づきました。
記号部分が通常のキーボードレイアウトとは、異なる文字が入力されてしまいます。

例えば、記号の「@」(アットマーク)を入力してみると以下のように「[」(開き角括弧)が入力されてしまいました。

日本語配列のキーボードの「@」を入力した様子

調べてみると、どうやらキーボードの設定が英語レイアウトになっているようなので、キーボードの設定を以下の手順で日本語に変更しました。

まずは、Windowsの設定を開き以下赤枠の設定欄をクリックします。

Windowsの設定から言語の設定画面へ遷移する

左ペインの「言語」を選択し、日本語のオプションを選択します。

言語設定欄の画面

すると、以下の通りキーボードレイアウトが英語になっているようですのでここから変更します。

キーボードレイアウトが英語

上記の画面の「レイアウトを変更する」を押下して日本語レイアウトに変更してから「サインアウト」ボタンを押下します。

日本語レイアウトへ変更する

そうするとサインアウトされるので再度ログインしてみます。
しかし、再度ログインしてもどうやら反映されていないみたいです。サーバーの再起動してもダメでした。

少々途方に暮れていたのですが、色々と設定を触っていたところ解決しました。

なんと、サーバーの設定ではなくクライアントの設定が原因だったようです。私の環境は、Windows 11 Proなのですがキーボードレイアウトの設定を見てみたところ以下のようになっていました。

クライアント側のキーボードの設定

この設定「接続済みキーボードレイアウトを使用する」は、日本語レイアウト、英語レイアウトのキーボードをよしなに選択してくれる感じの設定のようなのですが、どうやら今回のリモートデスクトップ接続時にはいい感じに動作してくれなかったようです。

この設定を日本語レイアウトに明示的に設定してあげてから、再度リモートデスクトップ接続してみると今度はちゃんと「@」(アットマーク)を入力することができました。

「@」(アットマーク)が正常に入力できた

因みに、日本語レイアウトに変更すると以下のように再起動しなくてはならないので再起動しました。

日本語レイアウトに変更すると再起動を促される

正直、細かい仕組みなどは全然理解できていないのですが、とりあえず解決したことをメモしておこうと思い記事にしました。

あと、補足ですがキーボードのレイアウトの設定の「接続済みキーボードレイアウトを使用する」ですが、これはWindows 11から選択できるようになったみたいです。Windows 10では、この選択肢が表示されなかったので。

今回はこの辺で失礼いたします。最後までお読みいただきありがとうございました。

Javaのプロパティファイルで日本語を扱う場合

本当にいまさらなのですが、最近調べたのでメモをしておきます。

現在良く使用しているJavaのバージョンが8なのですが(少し古いですが)、プロパティファイルで日本語を扱っている場合にUnicodeエスケープ処理をしています。ちょうど以下のような形です。

test = \u3053\u308C\u306F\u30C6\u30B9\u30C8\u3067\u3059

このUnicodeエスケープしている箇所は、日本語で「これはテストです」という文字列となっています。

Javaのプロパティファイルは、元々ISO 8859-1エンコーディングで作成されていたみたいで、このエンコーディングでは日本語が使えないので、上記のようにUnicodeエスケープをする必要があったのです。

しかし、さすがにもう日本語使えるよなということで調べたのが今回の記事を書いた発端です。

結果として、読み込むときにちゃんとすればUTF-8などのエンコーディングで作成したプロティファイルで、日本語を使用してもうまくいくようです(それはそうですよね)。

因みに、これが標準APIでできるようになったのは、どうやらバージョン1.6からのようです(参考の記事に書いてありました)。

具体的な実装は、参考の記事に譲りますが、これで快適にプロパティファイルを編集できそうです。native2asciiコマンドという面倒な作業をしていたのが少し懐かしいです。

意外とこういうのは、少しずつ知識をアップデートしていないと、今の時代ではかなり効率が悪いことしてしまっていたりするので、定期的に勉強しておくことは大切だなと感じます。

円マークとバックスラッシュの表示の問題について

Windowsにおける円マークとバックスラッシュの表示の問題について、きちんと理解していなかったので調べたときのメモです。

本記事の下部の参考にリンクを貼り付けさせていただいていますが、その記事がとても分かりやすいです。詳しい説明はそちらにお任せするとして、ポイントのみをメモしておきます。

  • 元々は、円マークとバックスラッシュの文字コードはどちらも同じ(0x5c)
  • 日本語環境では、0x5cは円マークを割り当て、他国(アメリカなど)はバックスラッシュを割り当て
  • Windowsのパス区切り文字は、0x5c。日本語Windowsでは円マークが表示、他国(アメリカなど)版Windowsではバックスラッシュが表示
  • フォントによって、日本語系フォントでは円マークが表示、他国系(アメリカなど)フォントではバックスラッシュが表示されたりする


たぶんだいたい合っていると思います。なかなかややこしいですね。。。

Windows環境でも、Javaの文字列でパス区切り文字はスラッシュが使える

タイトルの通りですが、Windows環境でもJavaの文字列でパス区切り文字でスラッシュ(/)が使えることを最近知りました。

Windows環境では、パス区切り文字は「\」なのですが、それを以下のようにそのまま記載することはできません。コンパイルエラーになります。
(以下では、「\」がバックスラッシュで表示されていますが表示上の問題だけですのでスルーしてください)

File file = new File("C:\work\sample.txt");


なぜならば、Javaの文字列では「\」がエスケープ文字なので「\」自体を文字列として表したい場合は、もう一つ「\」を重ねて以下のようにする必要があります。

File file = new File("C:\\work\\sample.txt");


2個の「\」を重ねる必要がありますので、冗長だなと思っていたのですが、実はスラッシュ「/」でも問題ないようです。

File file = new File("C:/work/sample.txt");


スラッシュ(/)は、本来はUnix環境のパス区切り文字なのですが、そこらへんはいい感じに吸収してくれるようですね。

また、環境に依存しない書き方としては以下もありですね。「File.separator」は、環境毎に異なるパス区切り文字を変換してくれるものです。

File file = new File("C:" + File.separator + "work" + File.separator + "sample.txt");


環境毎に異なる部分を吸収してくれるので本来ならば良い書き方だとは思うのですが、上記の通りやや冗長なのがネックですね。

個人的には、一番シンプルなスラッシュ「/」で良い気がします。WindowsUnix環境で動作すれば基本は問題ないと思うので。

Java言語の文字ストリーム、バイトストリームについて

Java言語を使ってプログラミングしている場合、ストリームという言葉を聞くことがあると思います。

そのストリームには2種類あり、タイトルの通り文字ストリームとバイトストリームに分けることができます。

今回は、それらの区別を分かりやすく説明している有志の方のブログ記事がありましたので個人的な備忘録としてリンクを添付させていただき、必要に応じて参照したいと思います。

色々な記事がありましたが、以下の記事が一番わかりやすかったです。
今更ながらJavaのI/Oストリームを整理する

何かしらのデータを読み込みしたり、書き込みしたりする場合にはストリーム関連のクラスライブラリを使用すると思いますが、それらの使い分けなども参考になりました。

正直今まで、適当に一括りで何らかのデータを読み込みするライブラリである認識はあるけど、違いが分かっていなかったので良い機会になりました。

今後、データ読み込み処理などを実装する場合は意識したいですね。
今回は中身は何もないですが、この辺で失礼いたします。

複数あるSSHの公開鍵暗号アルゴリズムにはどれを使えば良いかについて

複数あるSSH公開鍵暗号アルゴリズムで、どれを使えば良いかについて記載された記事を見つけたのでこちらに残しておきます。
SSHの公開鍵暗号には「RSA」「DSA」「ECDSA」「EdDSA」のどれを使えばよいのか? - GIGAZINE

2020年8月の記事なので、少々古いことは否めませんがまとめると以下のようです。

・基本的には、「RSA」もしくは、「EdDSA」を使えば良い
・「DSA」および「ECDSA」はセキュリティが完全ではないので使わない
・最近では、「EdDSA」が使われてきている(しかし、互換性などでは「RSA」には劣る。まだ広くは使われていない。しかし、2024年現在ではどうかは不明)

セキュリティの専門家ではないですが、ここらへんの知識で最低限知っておくべきことはあると思いますので、このような情報は常日頃からキャッチアップしていきたいと思います。

しかし、この「ECDSA」や「EdDSA」、「DSA」などは名前が似ていて非常にややこしいですね。慣れの問題でしょうか。。

暗号周りの話になると数学の話が必ず出てくるので、少し勉強してみたいなとは思いますがなかなか難しいですよね。。
今回はこの辺で失礼いたします。最後までお読みいただきありがとうございました。

Javaのスタックトレースの出力が省略されているときの話

Javaスタックトレースについて調べてたところ、有志の方が書かれている以下の記事を見つけました。
スタックトレースの出力が省略されてると思ったそのときに - 理系学生日記

Javaスタックトレースで以下のように「... 1 more」、「... 3 more」という、省略されてしまっている表示を見かけたことがあるかもしれません。

Javaスタックトレースが省略しているときの出力結果

私自身そうだったのですが、この先が見たいのに!と思っていました。でも、たいして調べもせずに省略されてしまうのは仕様でそういうものなのだと勝手に思っていました。

しかし、冒頭の記事を読んで分かったのですがこれは単なる省略ではなく、不要な出力をしないための省略であったということです。

JavaDocの公式のページにて、省略することについての記述を見ることができます。
Throwable (Java Platform SE 8)

Javaはかなり前から触っているのですが、このことを初めて知りました。。当たり前ですが、知らないことはたくさんありますね。

今回は簡単ですが、この辺で失礼いたします。最後までお読みいただきありがとうございました。