GItHubリポジトリ上の.shに実行権限をつけたい

GItHub Codespaces用にdotfileリポジトリ+ install.sh を作成の際に、こういう仕様があることを知らず困ったのでメモ。

やりたいこと

  • GitHubリポジトリ上の .sh ファイルに実行権限(x)を付与し、 git clone 直後に実行できる状態にしたい

実現方法

  • 以下のいずれかの方法で実現できる
    • git update-index --chmod=+x path/to/file
    • git add --chmod=+x path/to/file

背景知識

  • git add したファイルは、GitHubのInternal Storage上で通常、 10644 で管理される。
    • 例外的に、上記の操作を行った場合、 10755 として登録される。
  • git ls-files --stage にて確認することができる。
$ git ls-files --stage
100644 8f8a948b9c6321e1be1982a77ad5d5c879f7a60b 0       .bashrc
100644 f981c6ac7684e2bd5178a803c85097deca4372c9 0       README.md
100755 afad65e82e2ad9450ccdd73276605ecf367ddcc5 0       install.sh

出展

ChatGPTで英語のブログ記事を翻訳するプロンプト例

仕事柄、欧米のTech系のブログ記事を読む機会がしばしばあります。 今までは、DeepLを使っていたのですが、翻訳品質が高いため、 今後はChatGPT(GPT4)をメインで使っていこうと思います。

前提

2023.06.現在、ChatGPTはデフォルトでは与えられたURLの内容を取得してくれません。 そのため、WebPilotプラグインを使います。また、GPT4を使用する前提でプロンプトを作っています。

英語のブログ記事を翻訳する

30分ほど、思考錯誤してみた範囲内ですが、以下のプロンプトが比較的安定していました。

プロンプト

以下の文書を翻訳してください。作業工程とルールの出力は不要です。

# 作業工程
1.パラグラフ単位で英文を和文に置き換えてください
2.その後、章単位の構成に置き換えてください。章のタイトルには#を付与してください。
 例: # Chapter1

# ルール
・要約はせず、英文を機械的に日本語に置き換えてください。
・Atomicityなどのコンピューターサイエンスの用語は翻訳せずに、前後を**で囲み英単語として出力してください。
 例: **atomicty**
・domainは専門用語ですので、「領域」と訳さずに「ドメイン」と置き換えてください。

翻訳例

原文

工夫ポイント

工夫ポイントですが、

  • 作業工程 の指示を与えることで、各章のタイトルがマークアップされて見やすくなります。

    • この指示がなくても、適切にマークアップされるケースもあるのですが、記事に依存する模様
  • 要約はせず、英文を機械的に日本語に置き換えてください。 をつけることで、文章を意訳されることをガードさせようとしてみました。(この部分を外した時に振る舞いがどの程度変わるのかは要確認)

その他の試み : パラグラフライティング的な観点で構造分解するプロンプト例

英文は日本語よりも構造が厳格ですので、以下みたいなこともできました。 文章の意味をしっかり理解したい/分析したい時に便利かもです。

プロンプト例

以下の文をtopic / detail / support sentenceに分解し、
その後、和文に置き換えてください

出力例 ※原文はこちらもReclaim unreasonable software.です。

終わりに

AIの時代になり、欧米のTech系の記事が英語苦手勢にも気軽によめるようになったのはいいことですね! 翻訳した成果物の外部ファイルへの出力ができるともっと捗る気がするので、それらしいプラグインがないか探してみようと思いました。APIの方で自作すれという話もあるかと思いますが。

WSL2あれこれ

Windows11機にて、WSL(WIndows Subsystem Linux)を使っているため、 メンテナンス系のコマンドeycの諸々の情報をを備忘メモとして残しておこうと思います。

WSL2のアーキテクチャ

WSL2の操作

ref

https://www.tohoho-web.com/ex/wsl.html

WSLバージョンの確認

Powershellにて以下を実行します。

wsl -v

出力結果は以下となります。

WSL バージョン: 1.2.5.0
カーネル バージョン: 5.15.90.1
WSLg バージョン: 1.0.51
MSRDC バージョン: 1.2.3770
Direct3D バージョン: 1.608.2-61064218
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.19045.2965

WSLの更新

Powershellにて以下を実行します。

wsl --update

WSL仮想マシン(Linuxディストリビューション)の操作

仮想マシンの一覧(Linuxディストリビューション)の出力

Powershellにて以下を実行します。

wsl -l -v

出力結果を見る限りですが、WSLでは各ディストリビューションにつき1台の仮想マシンが提供される?

> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Running         2

デフォルトで起動する仮想マシン(Linuxディストリビューション)の変更

Powershellにて以下を実行します。

wsl --set-default <Distribution Name>

実行例とは以下となります。

wsl --set-default Ubuntu-22.04
この操作を正しく終了しました。

利用可能なLinuxディストリビューションの一覧を確認

Powershellにて以下を実行します。

wsl --list --online

出力結果の例は以下となります。

インストールできる有効なディストリビューションの一覧を次に示します。
'wsl.exe --install <Distro>' を使用してインストールします。

NAME                                   FRIENDLY NAME
Ubuntu                                 Ubuntu
Debian                                 Debian GNU/Linux
kali-linux                             Kali Linux Rolling
Ubuntu-18.04                           Ubuntu 18.04 LTS
Ubuntu-20.04                           Ubuntu 20.04 LTS
Ubuntu-22.04                           Ubuntu 22.04 LTS
OracleLinux_7_9                        Oracle Linux 7.9
OracleLinux_8_7                        Oracle Linux 8.7
OracleLinux_9_1                        Oracle Linux 9.1
SUSE-Linux-Enterprise-Server-15-SP4    SUSE Linux Enterprise Server 15 SP4
openSUSE-Leap-15.4                     openSUSE Leap 15.4
openSUSE-Tumbleweed                    openSUSE Tumbleweed

ChatGPT(GUI)でmarkdownを使いたい

気になったの仕様を調べてみたメモ。

目次

ChatGPTに回答時の書式を伝える方法

ChatGPT(GUI)では、以下の様に期待する出力フォーマットを明示的に伝えることで、 出力をマークダウン書式で受け取ることができるようです。

プロンプト例

日本で人口の多い都市を3つ挙げてください。

# 出力例

## 東京
- **東京**の人口は *約xxxx万人* で、日本の首都であり、最も人口の多い都市です。

解答

利用可能な出力

こちらの記事に詳しいですが、少なくとも以下が使えるようです。

  • 見出し
  • 太字
  • イタリック
  • 打消線
  • 引用
  • リンク
  • チェックボックス
  • リスト、番号付きリスト

ubuntuのapt周りを理解する

ubuntuのapt周りで理解できていないことを調べた際に、読んだ記事群のメモです。

aptとは何か

apt はDevian系Linuxに標準搭載される、パッケージ管理用のCLIコマンドです。

よく使うupgrade系コマンド

  • apt update : apt コマンドが保持するアップデート可能なパッケージの リストを更新する
  • apt dist-upgrade : リストに基づき、 apt コマンドにて管理の パッケージを更新するfull-upgradeとの違いについてはこちらを参照

aptリポジトリは /etc/apt/sources.list で管理される

Ubuntu の公式リポジトリ情報は /etc/apt/sources.list ファイルに記述されています。このファイルには、Ubuntu がパッケージを取得するためのリポジトリの URL が含まれています。

一方、サードパーティリポジトリ情報は、 /etc/apt/sources.list.d/ ディレクトリ以下に ***.list という名前のファイルで保存されます。これにより、公式リポジトリサードパーティリポジトリを分離し、管理を容易にしています。

リポジトリの設定行で、 deb で始まるものはバイナリパッケージを提供するリポジトリを示し、 deb-src で始まるものはソースパッケージを提供するリポジトリを示します。一般的なユーザーがコマンドやライブラリを使用する場合は、バイナリパッケージだけで十分です。

apt update コマンドを実行すると、apt は各リポジトリInRelease ファイル、または Release ファイルと Release.gpg ファイルをダウンロードします。これらのファイルには、リポジトリ内のパッケージの一覧とそれらの整合性を検証するための署名が含まれています。apt はこれらのファイルを使用して、システムにインストールされているパッケージを最新の状態に保ちます。

apt update はパッケージインデックスファイルを更新する

apt update コマンドは、 /etc/apt/sources.list ファイルに記載されているリモートリポジトリから最新のパッケージ情報を取得し、 /var/lib/apt/lists ディレクトリ配下にパッケージのインデックス情報を管理するファイルを格納します。このファイルは、パッケージの名前、バージョン、依存関係などの情報を含んでいます。

一方、 apt install コマンドを実行すると、apt はこれらのパッケージインデックスファイルを参照し、指定されたパッケージ名に一致するレコードを検索します。もしパッケージが見つかれば、apt はインターネット上のリモートリポジトリからそのパッケージをダウンロードし、システムにインストールします。このプロセスにより、必要なパッケージとその依存関係が自動的に解決され、インストールされます。

GPG鍵 (GNU Privacy Guard)

aptを利用する際に理解する必要がある技術として GPG があります。

GPGは(インストールしようとしているsoftwareが)自分が意図した作成者が作ったソフトであるか検証するために使用される技術で、公開鍵暗号を使用します。

通常,Linux環境では自分が意図した作成者が作ったソフトであるか、 使うインストーラーが本物である事を検証(身元が正しいかどうか)してからインストールします. このとき,ソフトウェアの検証に使用される仕組みの一つがgpgです.

_

「正当性を保証」するために、APTの場合はGPGを利用した公開鍵方式で検証しています。バージョンや設定、リポジトリによって若干の差異はありますが、リポジトリからパッケージをダウンロードする際の検証方法は次のとおりです。

1.sources.listに記録されているURLからInReleaseファイルをダウンロードする

2.InReleaseファイルを、ローカルにあらかじめ保存しておいたリポジトリ鍵で検証する

3.main/binary-amd64/PackagesなどのPackagesファイルをダウンロードする

4.Packagesファイルのハッシュを、InReleaseの中の情報で検証する

5.Packagesのパスに応じてpool/main/以下などから、対象のパッケージファイルをダウンロードする

6.ダウンロードしたパッケージファイルのハッシュを、Packagesファイルの中の情報で検証する

gihyo.jp

Mermaid記法で図にcaptionを埋め込む

  • Mermaid記法で作成の図にcaption(表題)を埋め込みたいと思ったのですが、Github Issueを見る限り、2022年9月現在、未対応の様子でした。
  • 上記Github Issue中のこちらの投稿にてWorkaroundが共有されていたので、以下に書き残しておこうと思います。
  • subgraphの公式リファレンスはこちらのようです。

sample

graph LR;
  subgraph イシューツリー
    Issue---Sub_Issue_1;
    Issue---Sub_Issue_2;
    Issue---Sub_Issue_3;
  end

Azureの認証認可周りを整理する

はじめに

Azureの権限設計を考える上で、頻出するサービスプリンシパルとマネージドIDについて、調べた事項のメモです。 ※調べながら書いているのに、誤っている点などあればご指摘いただけると嬉しいです。

前提 :AAD空間とサブスクリプション空間

Azureには2つのリソース空間が存在します。

AAD空間

1つ目は、 Azure Active Directory (以下、AAD)により管理されるリソース空間です。このリソース空間には、Azure ADテナントおよびその配下のリソースが収容されます。

サブスクリプション空間

2つ目は、 Azure Resource Manager (ARM)により管理されるリソース空間です。このリソース空間には、管理グループ - サブスクリプション - リソースグループ - リソース という階層構造が存在し、VMやVNetなどAzureが提供する各サービスのリソースが収容されます。

Azureのハイレベルな認証認可のモデル

Azureの認証認可ですが、概ね以下のような設計となっています。 ※理解を容易にするため、AAD空間やサブスクリプション空間内部の詳細な構造は割愛しています。

サブスクリプション空間 : ロールベースのアクセス制御(RBAC)による認可

Azureのロールベースアクセス制御(RBAC) では、以下の2要素で認可の権限を割り当てます。

Azure RBAC におけるロール

  • 各リソースへのアクセス権限のコレクションをロール と呼びます
  • Azure には以下の2種のロールが存在します

    • 組み込みロール
    • カスタムロール
  • 代表的な4種の組み込みロール

Azure RBACにおけるロールの適用スコープ

AAD空間 : セキュリティプリンシパルの類型

前述の通り、AAD空間とはAzure Active Directory (以下、AAD)により管理されるリソース空間です。AAD空間にはセキュリティプリンシパルが格納されます。セキュリティプリンシパルは認証IDとPWを持ちユーザーアカウントとして機能するエンティティであり、4つのサブタイプが存在します。マネージドIDについては、更に2種のサブタイプに別れます。

それぞれのセキュリティプリンシパルが想定する利用者

セキュリティプリンシパルの4つのサブタイプが想定するユースケースを以下に整理します。

  • ユーザーグループ は、人間のアクターが利用することを想定しています
  • サービスプリンパルマネージドID は、人間以外のアクター利用することを想定しています。マネージドIDはAzure上に存在のリソースのみが使用するプリンシパルであり、Azure外のリソースは使用する事ができません。

サービスプリンシパルとアプリケーションオブジェクト

前項で「サービスプリンシパルは人間ではないシステムによる利用を想定されている」と説明しました。このケースにおいては、システムによるアクセスに際し、間に アプリケーションオブジェクト というAADリソースが入る形のアクセス経路となります。アプリケーションオブジェクト は「Azureを利用するアプリケーションを表すオブジェクト」であり、サービスプリンシパルとの関係性は以下となります。

  • サービスプリンシパル:AAD認証に際し使われる、ユーザーアカウント(認証ID + 認証PW)
  • アプリケーションオブジェクト:認証を実行するアクター(システム)

参考にした記事

設計についてあれこれ考えたこと

About

本記事は、設計についてここ一年で考えたことの備忘録です。ADR、問題空間、ペースレイヤリング、Wardlley Mapsなどの話題を扱っています。

1. 意思決定行為は記録できるか?

Whyをどこまで/どうやってドキュメントするのか問題

実装されたコードは意思決定の結論(What)は語るが、意志決定のコンテキストや結論を支持する論理(Why)は語らない」的な話をソフトウェア開発の文脈でしばしば耳にします。

そのような情報を永続化するためには、コメントあるいはソフトウェア外のドキュメントという形で自然言語で情報を残す必要がありますが、特に後者の方法、つまりドキュメントを作るに際しては「どれくらいのボリュームのものを作る?」「更新し続けることは可能?」などの話について意見が分かれることが多かった印象です。*1

Arthitecture Decision Record (ADR)

Arthitecture Decision Record (ADR) *2 が普及するにつれて、「設計意図を残すドキュメントのレベル感としてはこれぐらいがいい塩梅だね」というコンセンサスが徐々に普及しつつありますように見えます。*3

ADRは優れた手法ですが、使う際の目的感がきちんとしていないと形骸化するリスクを孕んでいると自分は考えます。自分が考えるADRの本質的な価値は以下です。大雑把にいうと「何を解決したいのか/なぜこの方法で解決できると考えるのかを背景/仮定/推論という形式で記録し、事後的に検証できるようにする」が大事なポイントかな、と。

引用元

原文

Writing a doc is not a perfunctory gesture, and asking for a doc on something is not a punishment or a mechanism for control. Writing a doc is a way of i) surfacing requirements and assumptions, ii) driving clarity of reasoning stemming from those requirements and assumptions. Without this step, our software has little hope of delivering the results we want over the long term.

和訳

ドキュメントを書くことは形式的な行為ではないし、何らかのモノづくりの際にドキュメントの作成を要求することは罰でもなければ、無意味な管理メカニズムでもない。 ドキュメントは、i) 要件と前提を明らかにし、ii) それらの要件と前提から生じる推論を明確にするために作成される。 このステップを怠れば、私たちのソフトウェアは私たちが望む成果を長期で達成できないだろう。

2. 検討にどれくらいの時間を投資するべきか?

あるモノのカタチを決める時に、実際に実装を始める前の設計検討にどれくらいの時間を投資するべきか? という問題があります。

ウォーターフォールだと時間をかけていい、アジャイルだと時間をかけなくていい、だと乱暴すぎる気がする。じゃあ、どういう観点で考えればいいのかな?」とモヤモヤしていた時に、AmazonOne-way-door vs Two-way-doorという考え方に出会ったのですがこの考え方のおかげで、自分の中で指針めいたものが得らました。設計検討をする時に押さえておくべき、有用性の高い考え方に思います。

3. 問題空間、理解のカバレッジ、集団の英知

優れた設計をするためには、問題空間に占める理解のカバレッジを一定以上にすることが大事です。

ここでいう 問題空間 とは、大雑把にいうと「あるもののカタチを決める時に考慮すべき事項の集合」です。また、理解とは「気にすべき課題を既知にできている。その問題をどのような道筋で考えるべきか/考えるべき課題の全体感がつかめている」です。

このような状態に人間一人の頭で至ることは極めて難しく、集団の英知を頼ることが現実的です。設計レビューでみんなでわいわい話していると、個人では思いつかなかったような優れた観点が手に入った経験がみなさんにもありませんか?

これが自分が考える「集団の叡智に頼る」のイメージです。このような多様な観点は多様性のある集団から生まれます。ですから、優れた設計をするためには多様性のある集団が大事とも言えます。

詳細は、書籍『多様性の科学』 を参照ください。

4. 問題空間を時間方向に広げる

前項で上げた 問題空間 という概念は、「ある特定の時点において、その時点で決めないといけないもののカタチを、その時点での与件に従い検討する」的なイメージでした。

それよりも、より広い視座 - 意志決定を行う時点では見通すことが難しい、将来の外部環境・要求仕様の変更、システムの拡張など - を見通してもののカタチを決めている人たちにしばしば出会います。すごいなーと思います。

「この説明だとピンとこない」という方もいると思いますので、具体的にイメージしてもらえるよう、以下に小説からの引用を添えます。*4

何故こんな無駄があるのか?とびっくりするようなストラクチャを見たことがあった。島田は真賀田博士に、その疑問を実際にぶつけた。この部分が無駄だと思う、と意見をしたのだ。そのとき、博士は、微笑んでこう答えた。 「貴女が生きている間は、無駄かもしれませんね」 そのときは、何かの皮肉だと思った。自分にはそれが無駄にしか見えない。生きている間はずっとわからないだろう、という意味に取った。それが、今ではそうではないことが理解できる。世界中でまだ、真賀田四季が初期に作ったシステムが稼働しているのだ。それに代わるものが現れない。多少の変更が必要だけれど、その変更も見越して作られている。新たなデバイスにも対応している。ハードの進歩を予想していたかのように、適切なエリアが割り当てられている。 それがかつての島田には無駄に見えた部分なのだ。
『χの悲劇』森博嗣

ここで上げられた 時間の経過を前提に設計を考える というはすごく面白いテーマです。

ペースレイヤリング

https://webtan.impress.co.jp/sites/default/files/images/web_project/web_project03_02.jpg

画像の出展

このような観点で考える際に有益なツールの1つに、ペースレイヤリングというフレームワークがあります。ペースレイヤリングでは、「時間の経過に応じた変化の発生のしやすさ」という観点でシステムをレイヤー分けします。そして、依存は「時の経過に応じて変わりやすいもの」から「変わりにくいもの」への片方向にのみ発生させるというルールを設定することで、システムの変更容易性を保とうとします。

参考 : 「依存性逆転の原則」の自分なりの解釈

Wardley Maps

https://cdn-ak.f.st-hatena.com/images/fotolife/s/smatsuzaki/20210404/20210404113652.png

また、Wardlery Maps という考え方も異なる観点ですが有益なツールに思います。Wardley Mapsは、バリューチェーンとそれを構成する個別の技術要素を可視化し、技術革新によりバリューチェーン全体がどのように変わっていくかを描き出します。ペースレイヤリングとは異なるアプローチですが、ここでも「時間の経過に応じたカタチの変化」が主題になっています。

*1:この問題について詳しく知りたい時は Living Documentation という本がおすすめです

*2:ADRの概要についてはこちらの記事がわかりやすいです。 -> https://qiita.com/fuubit/items/dbb22435202acbe48849

*3:昨今、欧米のTech系企業を中心にドキュメントのフォーマットにADRを採用する企業が増えつつある印象です -> https://twitter.com/shin_matsuzaki/status/1542136436182630401?s=21&t=Ja7_lJUq320l1Bqgi5dMpg

*4:「それって拡張性の話で、別に新しい話題ではないよね」という指摘もごもっともかと思います。そのうえで自分としては、そのような機能追加やスケーラビリティなどのカテゴリに考える範囲を閉じずに、もっと広範なパースペクティブ/視点でこの問題を考えられるといいなと思っています。もやったした言い方ではありますが。。

トラブルシュートの進め方

本記事は社内wiki向けに書いたのですが、反応がよかったので本ブログにも転載します。


仕事柄トラブルシュートをする機会が多いのですが、いけてないトラブルシュートに膨大な時間を溶かした結果、「こういうやり方がいいんじゃないか?」と思いに至りました。以下にその手順をまとめます。

1. エラーが出たらまず記録する

作業中に想定外のエラーに直面した場合、脊髄反射的にググって秒速で解決したくなるかもしれませんが、 グッと我慢 して、まずはローカル環境のNoteまたはWikiなど、永続化が可能な場所に 何をした結果⇒何が起きたのか? を記録しましょう。

具体的に書くといいこと
- トラブルの概要(20-30文字程度)
- トラブルの発生日時
- トラブルの内容
- 前提となるシステムや周辺環境の事前状態

そうすることで、

  • これから行うトラブルシュートで得られる経験が形式化され、再利用可能になります(後日役に立ちます)

  • これ以降のトラブルシュートにおいて、客観性やトレーサビリティを確保することができます(する遭難リスクが低下します)

※ 注意!! このタイミングで適当にググって、解決方法を理解しないままに適当にたくさん試して、対象システムも頭の中もぐちゃーっとなると、アンチパターンルートに突入します

※ 既に原因がわかっていて本当に秒速で解決できるものについては、この限りにあらずです

2. 予想を立てる

↑の記録で忍耐力を既に使っているあなたは、記録が終わった瞬間ググって秒速でエラーを解消したい衝動にかられるでしょう。が、ここもグッと堪えて1分だけ原因に関する予想を立てる時間をとりましょう。

ここで言う「予想」とは「このエラーメッセージは、〇〇が△△して□□した結果、出力されているのかもしれない」的な推測を指します。若干ぼんやりとしていてもいいので、とにかくまず一度考えてみましょう。

→ 1分考えて「なんもわからん!」となる場合はステップ3へ

→「予想が合っているか確認のため、これ試したい!」となったらステップ4へ

参考

3. ググる場合はURLをメモ (やれたらベター)

ググる場合はエラーメッセージを検索キーワードに、Stackoverflowの記事などを読み漁ることが多いと思います。この際ですが、閲覧したページの中で有益と感じたURLもメモに残しておくといいです。

※後日「あのページ見返したいかも!」となった時に幸せになります。

4.  一つ試したら、次を試す前に結果を記録する

さて、いよいよ解決方法を試すフェーズです。あなたの頭の中には沢山の「これを試したらfixできるのでは!?」的なアイデアが浮かんでいるかもしれません。猿のように大量の打ち手を矢継ぎ早に試したい気持ちになっているかもしれません。

が、ここでもグッとこらえて まずは一つだけ試す。試したら結果を記録する を徹底しましょう。

こうすることで、「いろいろ試したけど、頭の中も環境もぐちゃぐちゃでなんもわからん」となるリスクが大幅に低減できます。

このTIPSが本ナレッジの中で最重要です。とりあえずこれだけやっておけば、トラブルシュート中の遭難リスクを大幅に減らせます。この工程は本当に大事なので、辛いですが気合いでやりましょう。

5. 解決したら面倒な気持ちと戦いつつ結果を文章にまとめる

試行錯誤の結果、事象がついに解消されました!(やったあ!)

問題が解消されたことで、緊張が解けほっとした気持ちになり脱力感が訪れます。「疲れたしもういいかな」という気持ちになってることと思います。

が!業務時間に余裕があれば(というか気合いで余裕を作って)  、 最終的に何をして解決したのか?その背景にはどんなメカニズムが推定されるのか? を書き残しておきましょう。

そうすることであなたの成長のスピードが倍化します。後日、類似の問題を引いた時の有益な情報源になります。辛いし面倒ですが、頑張ってやりましょう!

その他TIPS

  • デバッグをしていて頭がぼーっとしてきて「あ、自分疲れているな」と感じた時は、迷わず休みをとり、次の日以降またフレッシュな頭で再挑戦しましょう。経過を文章化できていれば、コンテキストのキャッシュが脳内から消失する恐怖もだいぶ少なくなっているはずです。

  • 通信の到達性などのNW絡みの問題に取り組んでいる時は、紙とペンでわかったことを図にまとめながら調査を進めるととても捗ります。

  • 色々やっていて頭が混乱してきたときは「アヒルに話しかけるメソッド」や他の人と画面を共有して「モブトラブルシュート」をやることをお勧めします。人は物理的に声を出していると頭が整理される生き物なのです。

暗号の基礎

はじめに

X509などの暗号化方式の基礎を理解できていないと思ったので復習しました。

1. 暗号化と複合化

1.1. 暗号化とは

あるメッセージを元がわからない別の情報に置き換えることを、暗号化( encryption ) と言います。

1.2. 複合化とは

暗号化されたメッセージ(暗号文)を暗号化前のメッセージ(平文)に戻すことを、複合化( decryption ) と言います。 また、複合する時に使う情報を 秘密鍵(secret key) と言います。

2. 共通鍵暗号公開鍵暗号

暗号化方式は、大別して共通鍵暗号公開鍵暗号の2種があります。

2.1. 共通鍵暗号

暗号化する鍵と複合化する鍵が同じ暗号化方式のことを、共通鍵暗号(common key cryptosystem)と言います。

IT用語辞典によると、秘密鍵暗号、synmetric key cryptsysystem とも呼ばれるようです

2.1.1. 共通鍵暗号アルゴリズム

共通鍵暗号アルゴリズムには、ストリーム型とブロック型の2種があります。

ブロック型の代表的なアルゴリズム

ストリーム型の代表的なアルゴリズム

  • DES
  • AES

2.2. 公開鍵暗号

暗号化する鍵と複合化する鍵が異なる暗号化方式のことを、公開鍵暗号(public key cryptsystem)と言います。公開鍵暗号において、暗号化に使用する鍵のことを公開鍵(public key)と言います。また、複合化に使用する鍵のことを秘密鍵(secret key) と言います。

2.2.1. 公開鍵暗号アルゴリズム

公開鍵暗号アルゴリズムとしては、RSAが有名です。

終わりに

公開鍵暗号の詳細までまとめたかったのですが、辿り着きませんでした。これについては後日改めて書きたいと思います。

参考文献

クラウドを支えるこれからの暗号化技術

Windows10でPC起動時にNTP時刻同期が行われない

問題

WindowsでPC起動時に時刻同期が自動が行われずに、実時刻とWindows OSが有している時刻がずれる。 以下の操作にて、手動で同期すれば一時的に時刻は合う。が、時間がたつと時刻ズレが再発する。

あるべき状態

「数時間ズレる」といったレベルの時刻ズレは、発生しないようにしたい。

解決策

  1. コマンドプロンプトを管理者として起動し、 sc triggerinfo w32time start/networkon stop/networkoff の実行に成功することを確認する。

  2. Windowsを再起動し、IPアドレスの取得(DHCP)が完了すると時刻同期が自動で実行され、Windows OSの時刻が実時刻に更新されることを確認する。

C:\WINDOWS\system32>sc triggerinfo w32time start/networkon stop/networkoff                                              
[SC] ChangeServiceConfig2 SUCCESS  

参考にした記事

kfujieda.hatenablog.com

IT英和辞典

Qiitaのこちらの記事を見てすごくいい!と思ったので、試作してみました。英文の記事を読むときに時々出てくる英単語の訳語集です。少しずつ追記して育ていこうと思います。

単語 意味
Agnostic 様々なシステムで相互運用可能な状態であること/「特定のシステムでないと動かない」という制約がないこと
Atomicity 状態の変更を伴う処理の処理中の状態が外部からは観測できないこと
edge Case, corner case (Bugs) 特殊な状況でのみ発生する発生頻度の極めて低い不具合
Design rationale 設計プロセス中に行われた決定と、その決定が行われた理由を明示的に列挙したもの
predicate 与えられた引数が特定の状態を満たすか否かを判定し、満たす場合 True を返す関数
in-flight request 処理中のリクエスト

Todo:
以下について調べる。

IntelliJでpom.xmlがMavenプロジェクトとして認識されない

問題

IntelliJJavaプログラムの含まれたディレクトリをインポートすると、
以下のように pom.xmlMavenプロジェクトのファイルとして認識されないことがある

f:id:smatsuzaki:20220309153409p:plain

対処

こちらのマニュアルに従い、 プロジェクトツールウィンドウを右クリック→フレームワークサポートの追加→Mavenにチェックを入れOK

それでも変わらないようなら、プロジェクトツールウィンドウ上で pom.xml を右クリックし、 Add as Maven Project を左クリックする。

f:id:smatsuzaki:20220309154614p:plain

/* https://sunrise033.com/entry/hatena-blog-how-to-hierarchicalize-categories */