OmniAICreator/Qiita-1.07M huggingface dataset:
【AWS/ECS on EC2】 EC2コンテナインスタンスの登録方法

# はじめに
AWS Elastic Container Service (ECS)は、Docker コンテナを簡単に実行できるようにするためのフルマネージド型のコンテナオーケストレーションサービスです。ここでは、ECSをEC2インスタンスと一緒に使用する方法を紹介します。特に、Fargateとは異なり、EC2を使用する場合はEC2インスタンスをECSに登録する必要があります。本記事ではその登録手順を記載しいます。

# IAMロール作成
まず始めに、任意のIAMロールを作成し、以下の2つのポリシーをアタッチします。
- AmazonEC2ContainerServiceforEC2Role	
- AmazonSSMFullAccess
※EC２インスタンスにセッションマネージャーで接続したくAmazonSSMFullAccessを設定しています。

# EC2インスタンスの作成
Amazon ECS最適化 AMIを使用して、EC2インスタンスを作成します。

### 最新のAMIの設定
以下のコマンドをCloudShell等で実行して、最新のAMIを取得します。ここでは、x86_64アーキテクチャのみをフィルタリングしています。

```bash
aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn2-ami-ecs-hvm-*" "Name=architecture,Values=x86_64" --query 'reverse(sort_by(Images, &CreationDate))[0].ImageId' --output text --region ap-northeast-1
```

### IAMロールの設定
先ほど作成したIAMロールをEC2インスタンスに紐付けます。

### ユーザーデータの設定
EC2インスタンスが起動時にECSクラスターに自動的に登録されるように、ユーザーデータを設定します。

```/etc/ecs/ecs.config
#!/bin/bash
echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.config
```

以上の設定を行った上で、EC2インスタンスを起動します。

# 参考URL
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/launch_container_instance.html

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/agent-install-al2.html

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-agent-install.html
HTMLとCSS 〜Flexboxの使い方を学ぼう〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/ec430b3b-3ebe-bbdd-0826-8c881648b307.png)
1:横並びの方法
 これからブロックレベル要素を横並び配置にする方法について学びます。ブロックレベル要素を横並びにするためには、displayプロパティにflexという値を指定します。

①display
 displayプロパティは、要素の種類(ブロックレベル要素、インライン要素)を変更することができるプロパティです。値には、変更したい要素の種類を設定します。
	
値との組み合わせdisplay: block;	説明：指定された要素はブロックレベル要素として表示されます
値との組み合わせdisplay: inline;	説明：指定された要素はインライン要素として表示されます
値との組み合わせdisplay: inline-block;　説明：指定された要素はインライン要素とブロックレベル要素の特性を併せ持ちます
値との組み合わせdisplay: flex;	説明：指定された要素の子要素は横並びになる
値との組み合わせdisplay: none;	説明：指定された要素は非表示になる

※ Flexboxでの横並び：親要素にdisplay: flex;を付与すると、直下の子要素が横並びになる。
TypeScript入門（2023年7月）

## この記事で分かること

* TypeScriptが勉強できる（2023年7月時点）
* どの記事を参照してインプットしたか

## 読んでほしい人（私のレベル）
* HTML、CSS、JavaScriptをProgateで勉強した
* TypeScriptを仕事で使用予定
* 実務経験、開発経験ゼロ

### 実際にやったこと
* もくもく会に参加
    モチベーションのきっかけとして都内でオフライン参加しました。
    実務で使用されている方々にお話しを聞くこともできたので、助かりました。
* TypeScript Deep Diveのドキュメントを読む
    こちらは、あまり初心者向けではなかったので動画を見るのが良いかと思います。
    他の言語と比べての利点などが記載されており、他の言語を理解していないと分かりません。
    Google翻訳で英語の翻訳をしているような若干不自然な日本語も、私の場合はインプットの妨げとなってしまいました。
    また、ソフトウェア業界でよく使用されるやや専門的な語句が使用されています。
    「ドキュメントを読んだだけでだいたいのことは分かった」、という方は実際にTypeScriptを使用して、アプリケーション開発なり手を動かしながらアウトプットするのが良いかと思います。

### 学んだことの要約
#### TypeScriptの利点
JavaScript　×　型システム　=　TypeScript
利点としては、
型システムがあるおかげで書いている時点でミスに気づくことができる
実行時に気づくのでは遅い、改修するのに時間がかかってしまう

#### TypeScript環境構築
##### 語句説明
* webpackについて
    モジュールバンドラと呼ばれるもの。モジュールバンドラとは複数のJSファイルを一つにまとめて、依存関係を考慮してくれる。

* tsconfigについて
    コンパイラを使用して、TypeScriptで書いたコードをJavaScriptに変換
    これにより、新しい構文だとしても古いブラウザで問題なく使用することができる

##### 環境構築手順
1. nodeをインストールする
    nodeとはサーバーサイドでJavaScriptを動かすための仕組み
    ※ターミナルを使用して、インストールする方法は[別途動画](https://youtu.be/qSHlXcSces8?list=PLX8Rsrpnn3IW0REXnTWQp79mxCvHkIrad&t=718 "YouTube")参照
2. パスを通す
    今回調べても分かりませんでした、、
    一旦、このステップはスキップして環境構築を進めてみます。
    （以前、Angularの環境構築をしたときにはPATHの設定なしでできていた気がする）
3. nodeの環境を構築するディレクトリ（フォルダ）を作成する
4. ターミナルで以下を実行し、ディレクトリ直下に「package.json」が生成されていたらOK
    ※オプションは全てYes（Enter）でOK
    ~~~
    npm init
    ~~~
5. VScodeなどのエディタで作成したディレクトリを開く
6. 関連パッケージをインストール
    インストールするためのコマンドはこちらの[GitHub](https://github.com/deatiger/ts-basic-demo/tree/feature-env-settings "GitHub")に記載
    「--save-dev」がポイント。開発環境でしか使わないパッケージのためのオプション。
    Web上で使用したりすることがあるが、今回は開発環境側（ローカル？）で使用するため。
7. 「webpack.config.js」というファイルを作成し、webpackの設定をする
    細かいオプションの設定はこちらの[GitHub](https://github.com/deatiger/ts-basic-demo/blob/feature-env-settings/webpack.config.js "GitHub")内のコメントを参照
8. tsconfigの設定
    【重要】この時点でエラー発生
    おそらく、PATHが設定できていないことによる問題
    ~~~
    tsc: The term 'tsc' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
    ~~~
8. 執筆中

### 参照した記事
[【入門】TypeScriptを２週間で習得した学習方法](https://kimuralog.com/?p=2535 "KIMURA LOG")

[日本一わかりやすいTypeScript入門【基礎編】【とらゼミ】トラハックのエンジニア学習講座](https://youtu.be/kd8VH10jXwc?list=PLX8Rsrpnn3IW0REXnTWQp79mxCvHkIrad "YouTube")

[【日本一わかりやすいTypeScript入門】tsconfigとWebpackの設定を理解して環境構築](https://youtu.be/qSHlXcSces8 "YouTube")

[TypeScript Deep Dive 日本語版](https://typescript-jp.gitbook.io/deep-dive "TypeScript Deep Dive")

## 次に学んだ方が良さそうなこと
JSとTSの概念の違いとかをchatGPTに聞いてみる
AWSの「クラウドナイン」なら最初から環境構築されている
MacにEclipseを簡単にインストールする方法

# はじめに
帝京大学理工学部の授業でEclipseを使用することになったので、Eclipseをインストールしました。

「Pleiades All in One」という、統合開発環境である Eclipse 本体と、日本語化を行うための Pleiades プラグインおよびプログラミング言語別に便利なプラグインをまとめた Windows、Mac 向けパッケージがあったので、そちらをインストールした手順になります。

# 1.パッケージをダウンロード
[こちら](https://mergedoc.osdn.jp/)からサイトにアクセスします。
最新版をダウンロードするので、赤枠のEclipseを2023をクリックします。

また、違うバージョンをダウンロードしたい方は、2022,2011をダウンロードしてください。

![スクリーンショット 2023-07-15 20.06.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608795/a8fc077a-a948-53b4-311a-5bc4a84b559b.png)


次に使用する言語をクリックしてください。
今回はJavaで使用するので、Javaをクリックします。

使用する言語が違う場合には、使用予定の言語をクリックしてください。

ダウンロードが開始されます。
![スクリーンショット 2023-07-15 20.17.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608795/1f5f8bdb-b025-76b4-90e3-8b3e630a8025.png)

# 2.パッケージをインストール
ダウンロードが完了したら、クリックしてアプリケーションフォルダにドラック&ドロップしてください

# 3.Eclipseを起動する
アプリケーションフォルダから「Eclipse_2023-06」をクリックするとセキュリティのエラーがでます
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608795/83063693-1a69-291f-b529-2fdcbeb56c88.png">

システム環境から「セキュリティーとプライバシー」をクリックして、「このまま開く」をクリックします。

![スクリーンショット 2023-07-15 19.57.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608795/aa1c8fa9-d7db-5402-a796-41d34ed0f3c8.png)

再度同じ画面がでるので、「開く」をクリックします。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608795/6d340991-e01b-30cd-cda1-e5620f6478c5.png">

ディレクトリーを変更したい場合は変更し、デフォルトのまま使用する場合は「起動」をクリックします。

![スクリーンショット 2023-07-15 19.58.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608795/dadafe08-b7a7-7385-532d-fe1f1a5fbb0a.png)

下記の画面が出たらインストール完了です。
お疲れ様でした！

![スクリーンショット 2023-07-15 19.59.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608795/ff00d9ba-22fb-ce4c-5858-4629587dfc34.png)

# 最後に
最後までお読みいただきありがとうございます。

都内で5店舗を経営する株式会社アキッチョのシステム開発責任者をやっています。
ピザが最高においしいのでぜひ弊社に食べにいらしてください！！

[アキッチョのネット注文](https://akiccio.com/)

# 参考
[【Mac】Eclipseインストール方法](https://qiita.com/yacchi1123/items/31c5ced9700b7c109c03)
Macbookで録画したmovファイルをGIF形式に変換し、それをQiitaに挿入する方法

手順（極簡）

１．録画：
使用アプリ：スクリーンショット（Mac工具）

２．録画した動画（mov形式）の時間と速度を修正し、mp4形式に変換する：
使用アプリ：CapCut

３．MP4形式の動画をGIF形式に変換する：
無料で利用できるオンラインツール：https://ezgif.com/video-to-gif

４．GIF動画をクラウドに保存する（ローカルとezgifの両方に保存しないでください）：
利用するクラウドサービス：Imgur

５．QiitaにGIF動画を挿入する：
クラウド上で保存されたGIF動画のリンクをコピーし、Qiitaに貼り付ける
infinityfreeでdeploy方法（PHP非商用）

手順（極簡）：

１．infinityfreeに登録する。
２．（creat account）アカウントを作成する：自分の好きな名前を使用して構いません。
３．Database　Nameを記入
４．MYSQL Databasesを開く。
５．creat　Databaseをクッリク（データベースを作成する）。
６．作成したデータベースを開く。
７．自分のデータベースをアップロードする。
８．ホームページの情報に基づいて、自分のPHPファイルを開き、以下の内容を変更する。
①USERNAMEユーザー名
②PASSWORDパスワード
③HOSTNAMEホスト名
④DATABASE　NAMEデータベース名
８．（file manager）ファイルマネージャを開く。
９．自分のファイルをアップロードする。
１０．ラベル（LABEL）の場所のリンクをコピーし、自分のログイン画面を開く。ログイン画面のリンクもコピーする。
１１．今後は直接ログイン画面のリンクを提供しても構いません。
ABC309 - A - Nine

# 問題

https://atcoder.jp/contests/abc309/tasks/abc309_a

# 考察
問題文をよく読めば`Yes`となるケースはかなり限られてくるのが分かるため、全てのケースを書くのも1つだと思います。ですが、そうではない考察をしていきます。
問題では盤面が下記となっております。
```
1 2 3
4 5 6
7 8 9
```
ですが、仮に0から始まった場合を考えてみましょう。
```
0 1 2
3 4 5
6 7 8
```
こうすると、ある数字に対して、何行目の何列目にあるかは以下の計算で求めることができます。
- 何行目：ある数字を3で割った数(小数点切り捨て)
- 何列目：ある数字を3で割ったあまり

これを利用していきましょう。そのために、まず$A$と$B$の入力を受け取ったあと、それぞれの値をマイナス$1$します。その後、上記の計算で各入力のものが何行目の何列目にあるかを求めていきます。そして、$A$と$B$が左右に隣接しているかを調べましょう。調べ方は、$A > B$であることから、下記の判定をすればいいです。
- $A$と$B$が同一の行にある。
- $(Aの列数) + 1$が$(Bの列数)$と一致する。

# 提出コード(コンテスト後)

https://atcoder.jp/contests/abc309/submissions/43578959

ご不明点などがあれば教えていただけると幸いです。
Emacs設定ファイルのバイトコンパイルを自動化する

Debian Linux 上で GNU Emacs 27.2.50を使っています。 現状の `emacs-init-time` は、0.6秒前後で何ら不満はないのですが、さらなる起動時間の短縮にこだわって日々試行錯誤しているEmacs馬鹿です。

設定ファイルを `leaf` に移行し、且つ`after-init-hook` を多用することでかなり短縮できました。で、最後にたどり着いたのが設定ファイルの全てを自動バイトコンパイルさせるという課題です。

## auto-async-byte-compile.el を試す
Web検索でよく見つかるTipsは、下記のパッケージを使ったものが多かったので私も試してみました。

* [auto-async-byte-compile](https://github.com/tam17aki/auto-async-byte-compile/blob/master/auto-async-byte-compile.el) 

```elisp
(require 'auto-async-byte-compile)
(setq auto-async-byte-compile-exclude-files-regexp "/junk/")
(add-hook 'emacs-lisp-mode-hook 'enable-auto-async-byte-compile-mode)
```
確かに便利なのですがいくつかの問題に遭遇しました。

一つは、設定ファイルの実行には特に支障のない警告レベルのコンパイルエラーでも Warningバッファーが表示されてコンパイルの実行が中止されてしまうことです。もちろん致命的な syntaxエラーは修正が必要ですが、警告レベルのバグを全て潰すのはきりがないので無視してほしいです。

下記Tipsにあるコマンドラインからも試しましたが、同様に警告がでて実行できませんでした。
* [ディレクトリ内のすべてのEmacs Lispファイルを一発でバイトコンパイル](https://qiita.com/skkzsh/items/26cec55dc50b1af25297)

`leaf.el` で書いた私の設定ファイルが不完全なのかも知れないのですが、なんとか警告レベルは無視してくれる方法はないかと模索しました。


## 標準コマンドで対応できた
思考錯誤の結果、標準コマンドの `byte-recompile-directory` が思い通りの仕事をしてくれることが確認できたました。最終的に下記を `init.el` に書くことで静かに快適に対応してくれるようになりました。

```emacs-lisp
  (defun auto-compile-inits ()
	"Byte-compile Lisp files modified in the directory."
	(interactive)
	(byte-recompile-directory (expand-file-name "~/.emacs.d/elisp") 0)
	(byte-recompile-directory (expand-file-name "~/.emacs.d/inits") 0))
  (add-hook 'kill-emacs-hook 'auto-compile-inits)
```
`~/.emacs.d/elisp` は、自作スクリプトを置いているデレクトリ、`~/.emacs.d/inits` は、`init-loader.el` で読み込むための設定ファイル群を置いているデレクトリです。

## 設定ファイルを削除やリネームしたときの注意と対策
.el ファイルをリネームしても古い名前の .elcファイルは残ったままです。同様に、.el ファイルを削除しても .elc ファイルは残ったままなので、うっかり放置すればそれらのファイルも読み込まれて混乱します。

これを避けるには、recompile する前に全ての .elc を削除するような設定に変えればいいのですが、その分 Emacsの終了や再起動に毎回時間がかかりストレスなので私は採用していません。

```emacs-lisp
  (defun auto-compile-inits ()
	"Byte-compile Lisp files modified in the directory."
	(interactive)
    (compile "rm ~/.emacs.d/elisp/*.elc")
    (compile "rm ~/.emacs.d/inits/*.elc")
   	(byte-recompile-directory (expand-file-name "~/.emacs.d/elisp") 0)
	(byte-recompile-directory (expand-file-name "~/.emacs.d/inits") 0))
  (add-hook 'kill-emacs-hook 'auto-compile-inits)
```

## emacs設定ファイルを複数端末で共有しているときの注意
設定ファイル群を dotfiles として Git管理し、GitHub のリポジトリに置いて複数端末で共有している場合は、ちょっと注意が必要です。

通常 .elc ファイルは Gitの管理下にはおかず .el のみというパターンが多いかと思うので、最新の設定ファイルをサブ機などへ pull しても、古いバージョンの .elc が残っているとそちらが優先的に読み込まれるからです。

その対策として私は `early-init.el` に下記の設定を追加しています。
```emacs-lisp
;; Always load newest byte code
(setq load-prefer-newer t)
```
この設定を追加しておけば、.elc よりも .el のほうが新しいときは、.el のほうを読み込みます。

そののち Emacsを再起動すれば、自動的に新しい .elc が自動生成されます。

## 起動時間短縮を追求することの意義
私の環境では、Emacs設定ファイル群をバイトコンパイルすることで `emacs-init-time` は、0.1secondsくらい短くなりました。たかだかコンマ何秒というごくわずかの起動時間短縮を図るのに何の意義があるのか？と問われたら苦笑するしかありません。たんなる自己満足です。

Emacs28/29の native-compile も試してみましたが、少なくとも起動時間の短縮にはつながらないようなので、もうしばらくEmacs27を使い続けます。
pushが出来ない　エラー解決メモ

### 発生したエラーについて



![スクリーンショット 2023-07-15 19.42.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/2c6239fe-da3a-21e7-4b9a-cc38bc897035.png)
:star:git pull origin tuboを行った結果、ローカルのtuboブランチとリモートのtuboブランチで競合が発生しました。これは、同じファイルの同じ部分が両方のブランチで異なる方法で変更されたためです。この場合のファイルはapp/views/layouts/application.html.erbでした。


:star:競合は手動で解決する必要があります。具体的には、競合しているファイルを開き、Gitが挿入したマーカー(<<<<<<<, =======, >>>>>>>)を見つけて、どちらの変更を保持するか（あるいは新しい変更を作成するか）を決定します。


![スクリーンショット 2023-07-15 19.49.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/55ddf2a6-b6fd-c5c8-1dba-fea21e514f99.png)

ローカルのbranch tuboとリモートのbranch tuboが異なるコミットを含んでおり、それらが分岐した（divergent）状態にあるために起こっています。このため、Gitはどのようにこれらの異なるコミットを調整（reconcile）するべきか尋ねています。

**git pull origin tubo**を実行すると、リモートのtuboブランチから変更を取得し、それを現在のローカルのtuboブランチに統合しようとします。しかし、あなたのローカルのtuboブランチとリモートのtuboブランチが異なるコミットを含んでいるため、Gitはどのようにこれらを統合するかを知りません。

:star:ここでgit config pull.rebase falseを実行したことで、今後git pullを実行したときにデフォルトでマージを行うように設定しました。これにより、git pull origin tuboを再度実行したときに、Gitはリモートのtuboブランチから変更を取得し、それを現在のローカルのtuboブランチにマージしようとします。

:::note warn
この設定は現在のリポジトリにのみ適用されます。すべてのリポジトリで同じ設定を適用したい場合は、--globalオプションを付けてgit config --global pull.rebase falseと実行します。
:::
![スクリーンショット 2023-07-15 20.00.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/90acac0b-7d17-f6f0-fadf-9c04fa4a595a.png)

次に **git add .** を実行しましたが、このコマンドは競合の解決を示すものではなく、新たに追加または変更されたファイルを次のコミットにステージングするものです。したがって、この時点ではまだ競合は解決されていません。

再度 **git pull origin tubo** を試みましたが、同様に競合が未解決のためエラーが発生しました。 

**git commit -m"tubo"** を実行したことで、競合が解決（あるいは無視）され、新たなコミットが作成されました。

最終的にgit pull origin tuboとgit push origin tuboを成功させることができました。これは、競合が解決され、ローカルブランチがリモートブランチの変更を取り込んだ後に行われました。
DXライブラリのDLL

# はじめに
DXライブラリって静的リンクライブラリですよね。(C#用DLLを除く)
ですから、DXライブラリを使うexeを複数作るときファイルサイズが馬鹿でかくなっちゃいます。DLLにすれば、共通部分を抜き出していますからファイルサイズを抑えることができます。
この記事はそんなDXライブラリDLL化の奮闘をまとめたものです。
# 方針
アップデートに迅速に対応したかったので、GitHub Actionsのファイルの変数をいじるだけでDLLを作成しようとしました。
DXライブラリはC++用のものなので、**そのままコンパイルすると各コンパイラが名前修飾した関数が含まれたDLLが出力されます**。例えば、VisualStudioでDLLを作ることができても、MinGWでは使えません。これを防ぐには、DXライブラリコンパイル時に`DX_COMPILE_TYPE_C_LANGUAGE`マクロを有効にする必要があります。

# 必要なライブラリ
DXライブラリは外部ライブラリを多用しており、外部ライブラリに依存するコードはすべて`DxUseCLib*.cpp`・`WIndows/DxUseCLib*.cpp`に記述されています。
`DxUseCLib スタティックライブラリについて.txt`によると、
- Bullet Physics
- libpng
- zlib
- libjpeg
- libtiff
- libogg
- libvorbis
- libtheora
- libopus
- libopusfile
こいつらを全部コマンドラインでビルドできるようにするのは面倒です。
特に、Bullet Physicsに関しては、名前空間衝突回避のため**全関数・型に`D_`プレフィックスを付けてコンパイルした**Libファイルを使用したそうで、リネーム用プログラムがBulletの**ver2.75にのみ対応**という曲者仕様でした。
他のライブラリはDLLを得るのにさほど苦労しませんでしたが、コイツのせいで挫折します。

# 最終兵器MSYS2
嗚呼、aptのようにコマンド一つでコンパイル済みのライブラリが手に入ったらいいのにと思っていたところ、思い出しました、MSYS2のpacman!
こいつのお陰で必要なライブラリのDLLのビルドが不要になり、ちゃっちゃとMakefileを記述するだけですみました。

# Bullet問題
名前空間の衝突回避のため`D_`をしたそうですが、別にやる必要なくね??ということで[`D_`プレフィックスを除去するヘッダ](https://github.com/777shuang/DxLib.dll/blob/main/D_.h)を記述。これによりv2.75に依存しなくて済みました。

# Vorbisのヘッダがない問題
pacmanで導入したlibvorbisには必要なヘッダがありませんでした。おそらく古いバージョンでは存在したヘッダだと思われます。入手が面倒だったので[dxlib-for-linux](https://github.com/dragoon2014/dxlib-for-linux/tree/main/insufficient_include)から借用。

# リポジトリ&ダウンロード
https://github.com/777shuang/DxLib.dll
[Releases](https://github.com/777shuang/DxLib.dll/releases)にビルド済みDLLがアップロードされています。

# 使用方法
長くなりましたが、これを**使うときにも** `DX_COMPILE_TYPE_C_LANGUAGE`を定義し、`DxLib-3_24b.dll`をリンクする必要があります。
上側確率、下側確率、パーセント点

# Abstract
上側確率、下側確率、パーセント点の概要を述べる
# 累積分布関数と相補累積分布関数
分布関数$f(x)$に対して
$F(x) = P(X\leq x) = \int_{-\infty}^{x}f(x)dx$
を累積分布関数、または下側確率という。
$\bar{F}(x) = P(X\geq x) =  1 -F(x)$
を相補累積分布関数、または上側確率という。

離散分布の場合は省略するが、同様に定義する。
# パーセント点と分位点
$a\in[0,1]$に対して、
$F^{-1}(a)$のことを「下側$100a$パーセント点」といい、これは$a$分位点に等しい。
$\bar{F}^{-1}(a)$のことを「上側$100a$パーセント点」といい、$1-a$分位点に等しい。

また、分布関数$f(x)$が$x = c$を中心に左右対称の場合、
$\bar{F}^{-1}(\frac{a}{2}) (=2c-F^{-1}(\frac{a}{2}) )$のことを「両側$100a$パーセント点」という。
Reactの開発環境を作る手順を残しました

# まずは設定(していない人)
### node.jsをインストール
https://nodejs.org/ja/download

### Yarnをインストール
~~~
brew install yarn
~~~

### バージョンが確認できたら成功
~~~
node -v
yarn -v
~~~

## アプリ作成

開発するディレクトリで以下のコマンドを実行
~~~
npx create-react-app react-test
~~~

## コンポーネントを作成
以下のディレクトリにコンポーネントを作成
~~~
- src
 - Header.js
 - About.js
 - Services.js
~~~
~~~md:Header.js
import React from 'react';

const Header = () => {
  return (
    <header>
      <h1>My</h1>
    </header>
  );
};

export default Header;
~~~
~~~md:About.js
import React from 'react';

const About = () => {
  return (
    <div>
      <h1>about</h1>
    </div>
  );
};

export default Services;
~~~
~~~md:Services.js
import React from 'react';

const Services = () => {
  return (
    <div>
      <h1>Services</h1>
    </div>
  );
};

export default Services;
~~~
## 基本文法

### export default
~~~
export default Header;
~~~
他のファイルで利用可能にするためのJavaScriptの文法です

### import React from 'react';
~~~
import React from 'react';
~~~
JavaScriptのコードでReactライブラリを使用するために必要なステートメント

## ルーティングを作成
ルーティングを設定できるdomを導入するために以下のコマンドを実行
~~~
npm install react-router-dom
~~~

## 起動
~~~
npm start
~~~
こちらで動作確認できます。
http://localhost:3000

## CSS適用
以下のディレクトリにcssファイルを設置
~~~
src/styles/Header.css
~~~
cssの中身
~~~md:Header.css
.header a {
  color: red;
  font-size: 18px;
}
~~~
~~~md:Header.js
import React from 'react';
import './styles/Header.css'; ##追記

const Header = () => {
  return (
    <header className="header"> ##追記
      <a>My</a>
    </header>
  );
};

export default Header;
~~~

## メソッドをインポートして適用

~~~md:./components/button.js
import React from 'react';

const Button = () => {
  const handleClick = () => {
    // メソッドの処理
    console.log('ボタンがクリックされました');
  };

  return (
    <button onClick={handleClick}>クリック</button>
  );
};

export default Button;
~~~

~~~md:Header.js
import React from 'react';
import './styles/Header.css';
import Button from './components/button.js'; //追記

const Header = () => {
  return (
    <header className="header">
      <a>My</a>
      {Button()} {} //追記
    </header>
  );
};

export default Header;
~~~
CSSでコンテンツやテキストを中央に配置する

Webデベロッパの皆さんには当たり前の情報かもしれませんが、個人的につまづいた部分でしたのでChatGPTに解説してもらいました

## CSSを使用してコンテンツを画面の中央に配置する方法

CSSを使用すると、コンテンツやテキストを画面の中央に配置することができます。この記事では、いくつかの方法を紹介します。それぞれの方法について、コード例とともに詳しく説明します。

### 方法1: Flexboxを使用する方法
Flexboxは、要素を柔軟に配置するためのCSSのモジュールです。以下のコードを使用すると、要素を水平および垂直方向に中央に配置することができます。

```css
.container {
  display: flex;
  justify-content: center; /* 水平方向に中央揃え */
  align-items: center; /* 垂直方向に中央揃え */
}
```

上記のコードでは、`.container`というクラス名を持つ要素を中央に配置します。このクラスを適用する要素の親要素に対して、`display: flex;`を指定し、`justify-content: center;`と`align-items: center;`を使用します。

### 方法2: Gridを使用する方法
CSS Gridは、要素をグリッド状に配置するための強力なツールです。以下のコードを使用すると、要素を画面の中央に配置することができます。

```css
.container {
  display: grid;
  place-items: center;
}
```

上記のコードでは、`.container`というクラス名を持つ要素を中央に配置します。このクラスを適用する要素の親要素に対して、`display: grid;`を指定し、`place-items: center;`を使用します。

### 方法3: positionとtransformを使用する方法
以下のコードを使用すると、要素を絶対位置指定して画面の中央に配置することができます。

```css
.container {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
```

上記のコードでは、`.container`というクラス名を持つ要素を中央に配置します。`position: absolute;`を使用して要素の位置を絶対指定し、`top: 50%;`と`left: 50%;`で要素を画面の中央に移動させます。さらに、`transform: translate(-50%, -50%);`を使用して要素を正確に中央に配置します。

### 方法4: text-alignを使用する方法
text-alignプロパティは、テキストの水平方向の配置を指定するために使用されます。以下のコードを使用して、テキストを画面の中央に配置することができます。

```css
.container {
  text-align: center;
}
```

上記のコードでは、.containerというクラス名を持つ要素内のテキストを中央に配置します。このクラスを適用する要素の親要素またはテキスト要素自体に対して、text-align: center;を指定します。

この方法は、単一の行のテキストやブロック要素内の複数行のテキストを中央に配置するのに適しています。ただし、テキスト要素がインライン要素である場合には、親要素に対して幅を指定するか、display: block;を設定してブロック要素に変換する必要があります。


## まとめ
この記事では、CSSを使用してコンテンツやテキストを画面の中央に配置する方法について紹介しました。FlexboxやGridを使用する方法や、positionとtransformを使用する方法など、いくつかのアプローチがあります。それぞれの方法を適切に使用して、ウェブページやアプリケーションのデザインを改善してください。


## あとがき
ほぼ素人の私個人的には`text-align: center;`が一般的だと思っていたので意外でした
他の方法も今後試していきたいです
参考になれば幸いです
ソフトウェアテストの必要性

## 1. リスク軽減
テストを全くしないでソフトウェアをリリースすると、ソフトウェア稼働時に以下のようなリスクがあります

- ユーザーの業務が止まることによる経済的な損失
- 信用を失う
- 障害や事故が起こる

ソフトウェアの複雑性は人間の能力以上に上がっており、完璧なソフトウェアは存在しないと言われています
テストはプログラムの欠陥を発見し、上記のリスクを低減させることができます

## 2. コスト削減
ソフトウェアは成長するものであり、後になればなるほど修正の影響範囲、コストが増大します
ソフトウェア開発の各フェーズでテストを行うことで、早期に不具合を発見し、低いコストで不具合を修正することができます

## 3. 品質証明
テストレポートは第三者へのソフトウェア品質証明の手段となります
テストレポートでは何がテストされたか、どのようにテストされたか、テストの制約について記載することができます
以下のようなテストレポートの内容が例として挙げられます
- 実行したテストの概要
- テスト計画からの逸脱
- テスト完了評価
- 進捗を妨げた要因
- テスト方法
- 残存リスク
- テスト成果物
- 再利用可能なテスト資産

以上のような情報をまとめてレポートにすることで、ソフトウェアの品質が一定の水準にあることを証明でき、第三者視点でも把握することができます

以上、ソフトウェアテストの必要性について自分なりにまとめてみました　

## 参考文献
- 大西 建児(他). JSTQB シラバス 2018対応. 2019. 株式会社翔泳社.
- 小川 秀人(他). 土台からしっかり学ぶーーソフトウェアテストのセオリー. 2023. リックテレコム.
技術者のためのコミュニケーション術：バイオハザードの飼育係の日誌から学ぶ

## July 7, 2023

昼、若手に依頼していた調査実装のタスクの状況を聞いた。

話を聞いても分からねぇから、調査メモを見せてもらったら
バイオハザードの飼育係の日誌みたいだった。

## バイオハザードと飼育係の日誌とは？

バイオハザードとは、1996年に発売されたプレイステーション用のホラーゲームで、飼育係の日誌はその中で登場するテキストです。

> 「飼育係の日誌」
最初の舞台となる洋館のとある部屋にあるファイル。全10ページで構成されている。
日誌の書き手である飼育係が、ウイルスに感染した末に徐々に人間性を喪失していく様を間接的かつリアルな文体で表現した秀逸な文章である。

[出典 : ピクシブ百科事典 かゆいうま ](https://dic.pixiv.net/a/%E3%81%8B%E3%82%86%E3%81%84%E3%81%86%E3%81%BE)

実際の調査メモは、特に人間性を喪失していく文章ではなく、色々試行錯誤した内容を自分用に離散的に書きとめていただけなのですが、他人が見た時に脳内で補完してつなぎ合わせないと読めないあたりが、なんとなくバイオハザードっぽいなと思って、一人でツボに刺さってしまいました。

## 面白さを伝えたい（共有したい）

個人的にはめちゃくちゃツボだったのでなんとかこの面白さを伝えたいとなったわけですが、1996年発売のゲームなど若手は知るわけがありません。

うっかりやりがちですが、**「自分が知っていることは相手も知っている」** と思って話を進めてしまうことがあります。

**相手が全く分からない話を延々楽しそうに語るのは悪手です。**
このような行いをすると「空気を読めない人」と思われがちですが、実際に読めていないのは **「相手に伝わっているのかどうか」** です。

前提が伝わっていない話を伝わっているつもりで続けると、相手の脳内には、分からないの上に分からないが積み重なった状態になります。
バイオハザードの話は最悪伝わらなくても仕事に支障はないので問題ありませんが、仕様の話などはきちんと伝えないと問題になります。

ではどう伝えるのがいいでしょう？

## 相手に確認する

相手が知っているか分からないのであれば、知っているか確認すればいいですね。

「バイオハザードって遊んだことあります？」
「ないです」

ここで会話を打ち切ればダダ滑る危険は回避できそうです。よかったです。会話を細かく切って相手の反応をところどころで確認するようにすれば、いい感じに会話のキャッチボールができそうです。

蛇足ですが、今書いている記事については、読者の皆さんのリアクションを確認することができないので怯えながら書き続けるしかないです。

会話を打ち切ることでダダ滑るという最悪のケースは回避できましたが、それだと、伝えるべきことも伝えられないとなってしまいます。

では、打ち切らないとしたら、どのように会話を続ければいいでしょうか？

## 前提から伝える

「前提」と言うと少しぼんやりした表現になってしまいますが、**相手に適切に質問や確認を行うことで相手が知っているところから**話をすることで、相手に理解してもらうことができるかと思います。

誰でも分かるようにと、毎回１から１０まで説明することもやってしまいがちですが、相手によっては、一度にたくさんのことを理解できなかったり、知っている話ばかりを聞いているうちに話に興味をなくして大事な部分を聞きこぼしたりするかもしれません。

相手がいて、相手に伝わったことがゴールなので、「相手に確認して相手に合わせる」が基本なのかなと思います。

## ところで伝えるべきことって？

仕様の話であればプロジェクトメンバー全員が知るべきですが、「バイオハザード」はプロジェクトメンバー全員が知る必要はないです。
リモートワークになって雑談が減った問題が話題になりますが、全く興味がないバイオハザードの話を延々として貴重な仕事時間を削ってしまっては本末転倒かもしれません。

しかも、延々語っても **「言葉」でなく「心」で理解できた！** という状況にはならなそうです。

『面白さを共有する』というのは、『相手が「言葉」でなく「心」で理解できた！状態になる』ことかと思います。

昭和の世の中であれば、サラリーマンは野球を見てゴルフをやる、みたいな価値観が共有されていましたが多様性がうたわれる令和では、同じ世代の中でも趣味嗜好が多様化していて、ただ同じものを見て同じ様に感じることも少なく、なかなか『「心」で理解できた』状態にするのは難しいでしょう。

この記事も「飼育係の日誌」をリアルタイムで見ていた方の一部が「すげー分かるｗ」ってなってくれたり、何かのヒントにしてくれた方や読み物として楽しんでくれた方がいれば幸いですし、読み飛ばしちゃう人もいるのかなぁと思います。

そんな難しい世の中で、若手もいずれ年を取って部下を持つと考えると「人ってみんな違うけど、お互いを尊重していこうね」みたいなざっくりした話をして、伝えることを楽しむことが大事なのかもしれません。

## おわりに

かゆい
うま

## おまけ１（新卒エンジニア向け手紙）

https://qiita.com/kaku3/items/2c8d4d783be7ce4fc9ea

https://qiita.com/kaku3/items/0bf1703cb8d6f84afbc5

## おまけ２（新卒エンジニア向け記事）

https://qiita.com/kaku3/items/fb949aa1a53f1f71c796

https://qiita.com/kaku3/items/aa2f81cf1e3974b8ad3a

https://qiita.com/kaku3/items/937354cc180c8bee823b

https://qiita.com/kaku3/items/b1c94328f273c750286b

## おまけ３（パイセン向け記事）

https://qiita.com/kaku3/items/cafccb1ee631d9f61190

https://qiita.com/kaku3/items/422b5427024d29da6a6e

## おまけ４（...は難しいシリーズ）

https://qiita.com/kaku3/items/34b40446337a59213a75

https://qiita.com/kaku3/items/f8411523cce000de750e

https://qiita.com/kaku3/items/5b11d2e1aace73c36340

## おまけ５（営業A短編シリーズ）

https://qiita.com/kaku3/items/03aae7b9e3c70c55f513

https://qiita.com/kaku3/items/3378ea55b1240d7360a1

## おまけ６（エンジニアのためのお仕事問題集）

2030年にIT人材が最大79万人不足するとのことで、学習用の資料をgitで**無料**公開してます(不定期更新)。
よろしければどうぞ。

[エンジニアのためのお仕事問題集](https://github.com/kaku3/workbooks)
プログラミングの教科書に書いてある「変数は箱」は適切なんだろうか

こんにちわ。hase-k0x01です。
私はとある学校でプログラミングを教えているのですが、多くのプログラミング教材では、変数に関する最初の説明で

> 変数はデータを格納するための箱（のようなもの）です

と表記されることが多くあります。

果たして、この説明は適切なんでしょうか。本当にこれで理解につながるのでしょうか。むしろこの説明がプログラミングの理解を阻害しているのではないでしょうか。
と、思っている方がいると思いますが、私も疑問に思っている今日このごろです。

# 実際の変数
実際の変数が何か、については、qiitaをご覧の皆様ならお分かりのことかと思います。
つまり、数字や文字、画像などを数値化して0,1だけで表記しメモリ上に格納し、そのデータに名前をつけたモノといえるでしょう。C言語ではすくなくともそんな感じです。

オブジェクト指向言語では、参照やインスタンスがあったりしますが、すくなくともプリミティブ型についてはそんな感じです。

# 初心者のつまづきポイントと教え方の困難さ
このような事実（変数はメモリ上にあって...）を理解した上で、「変数は箱」と言われれば、『あぁそうだな、確かに「箱」...かな？』、と理解出来ると思いますが、いきなり「変数は箱」と言われてもうまく伝わらないのではないでしょうか。

**「変数は箱」の前提で理解を進めていくと** 、「配列は箱を並べたモノ」「型は箱の形」という説明をすることになるのですが、この説明だとポインタや参照の説明をするのが非常に困難になります。
この場合、**ポインタのときになってやっとメモリとかアドレスの話が出てくる** ことになります。

>「変数は実はメモリに格納されていて、アドレスがあって...」

学習者からすれば、

>「変数は箱じゃなかったんか～～～！！」

って感じです。ポインタってなんやねん。意味分からん。ってなります。

参照にしたってそうです。箱とは別にそいつを指している参照が有るって言われても、

> え、箱を..指している？？？？

ってなります。

というわけで、最初に「変数は箱」って言ってしまうと、あとで話が矛盾してしまうのではないか、と思っています。

くわえて言うならば、「変数は箱」で説明するとき、箱のイラストが3次元になっているのですが、実際のデータの配置は1次元の連続した空間ですし、それを図で表現するなら1ワードずつ区切って並べた2次元の表のようにするのが実際のデータ構造に近くなります。
この差も理解を進める上での障害になっていると考えています。


# 最初からメモリとかアドレスを教えればいいんじゃない？
そこで、私の授業では、最初からメモリとアドレス（とCPU、バス）の存在を最初に説明しています。
もちろん、市販の教科書には書いていないので、補助教材や板書で説明ですが...

最初の説明はだいたいこうです

 - コンピュータの中では数字も文字も画像も、数値として扱われる
 - ちなみに、数値は英語でdigitで、digitalというのは数値のという意味
 - 数値はメモリに格納されていて、データはメモリの中を一定の大きさに区切って格納される
 - メモリ上のデータが格納される場所に「アドレス」で識別される。アドレスは重複しない数値で16進数で表記される（ことが多い）
 - メモリ上には0,1つまり2進数でデータが格納される
 - 変数(のデータ)はメモリ上に置かれる
 - 変数を定義するとメモリ上に変数(のデータ)を置くための領域が確保され、名前が関連付けられる
 - プログラムからは、変数を名前で識別できる

...というのを説明したうえで、

「変数は箱に例えられる場合もある」


という感じです。

説明が回りくどいんですが、「変数は箱」と説明して後で矛盾するよりはいいかなあと思います。

# 実際にそれで理解できるのか
私の授業では、最初に箱として説明した場合に比べて、理解が順調担ったように思われます。

ちなみに、私の授業では、変数の説明はたっぷり30分～1時間はかけるし、教科書もイラスト含め数ページつかっています。

プログラミングの基礎の基礎となる知識なので、時間をかけて理解を浸透させるわけですね。

まわりくどいような教え方ではありますが、これが一番後の伸びがよいのではないかとおもっています。

すべてを理解したうえでの「箱」は良いかも知れませんが、初学者に「変数は箱」と言ってしまうとその例えの背景を知らないので、より深いところを考えようとするための基礎データが頭の中にないわけですね。これではポインタで躓くのも当然といえます。

当然、「メモリってのがあって」という話から始めると、全員が？？？？？？っていう感じで宇宙猫の顔になります。
なので、何度も何度も同じ説明をするわけですよね。そうすれば、なんとなく理解も進んでいきます。

# おわりに
というわけで、「変数は箱」という説明をやめた方がいいんじゃないか、じゃあ、どういう説明をしたらいいのか、という提案でした。
Azure Cloud Shell で任意のバージョンの Azure CLI を使う例

Azure Cloud Shell で以前は実行できていた Azure CLI が、自動バージョンアップにより実行できなくなっていました。その時は、他の Azure CLI 環境を使用しましたが、今後のために Azure Cloud Shell で任意のバージョンの Azure CLI を実行する方法を考えてみました。

## Azure CLI でエラーが発生した例

api-version は`2023-07-01-preview` を使っているいるが、サポートしている api-version は、`2015-05-04-preview,2016-04-01,2017-09-01,2017-09-15-preview,2017-10-01,2018-03-01-preview,2018-05-01` のどれかだよ、というエラー。

```bash:bash
$ az version
{
  "azure-cli": "2.50.0",
  "azure-cli-core": "2.50.0",
  "azure-cli-telemetry": "1.0.8",
  "extensions": {
    "ai-examples": "0.2.5",
    "ml": "2.18.0",
    "ssh": "1.1.6"
  }
}

$ az network dns zone list -o table
(InvalidResourceType) The resource type 'dnszones' could not be found in the namespace 'Microsoft.Network' for api version '2023-07-01-preview'. The supported api-versions are '2015-05-04-preview,2016-04-01,2017-09-01,2017-09-15-preview,2017-10-01,2018-03-01-preview,2018-05-01'.
Code: InvalidResourceType
Message: The resource type 'dnszones' could not be found in the namespace 'Microsoft.Network' for api version '2023-07-01-preview'. The supported api-versions are '2015-05-04-preview,2016-04-01,2017-09-01,2017-09-15-preview,2017-10-01,2018-03-01-preview,2018-05-01'.
```

## 任意のバージョンの Azure CLI をインストール

```bash:bash
$ pip install azure-cli==2.49.0

$ export OLDPATH=$PATH

$ export PATH=~/.local/bin:$PATH

$ az version
{
  "azure-cli": "2.49.0",
  "azure-cli-core": "2.49.0",
  "azure-cli-telemetry": "1.0.8",
  "extensions": {
    "ai-examples": "0.2.5",
    "ml": "2.18.0",
    "ssh": "1.1.6"
  }
}
```

## 先ほどエラーになった Azure CLI を実行

```bash:bash
$ az network dns zone list -o table
ZoneName     ResourceGroup    RecordSets    MaxRecordSets
-----------  ---------------  ------------  ---------------
mnrsdev.com  mnrlabo-rg       7             10000
```

## Azure CLI のバージョンを戻す

```bash:bash
$ export PATH=$OLDPATH

$ az version
{
  "azure-cli": "2.50.0",
  "azure-cli-core": "2.50.0",
  "azure-cli-telemetry": "1.0.8",
  "extensions": {
    "ai-examples": "0.2.5",
    "ml": "2.18.0",
    "ssh": "1.1.6"
  }
}
```

## 参考

https://pypi.org/project/azure-cli/
Beta版のアップデートに失敗して死にかけた話。

# この記事の読者
macのβ版アップデートにミスった中でリカバリーモードで前のOSしか表示されない方

# 免責事項
この方法を用いてmacOSを復元しようとして仮にデータが破損しても、いかなる場合でも筆者は責任を負いません。

# 何が起こった
この前、macOS Sonomaの開発者β版2から3へアップデートしようとした時の話。
なぜか、Macの電源が落ちていて、アップデートが進まなかった。
おかしいと思い、気づいて起動したらりんごループが始まり、そこからが地獄の勝負の始まりでした。

# 解決策①：OSの再インストール
OSのインストールがミスっただけならもう一度インストールし直したらええだけやん楽正：）
と思って普通にそれで対処しようとしたら、なんとVenture用のリカバリーのメニューが出現。
恐れつつインストールを試してみようと思うとやはりOSのダウングレードはできなくてHDDのところがグレーアウトしている。ので、次の方法を模索することに。

# 解決策②：ダウンロードされているはずのOSファイルからインストールメディアを作成
OS自体はダウンロードが終わっているはずなので、それもう一度全部手動で展開したらいいんじゃね？ていうかそれでインストーラー作ったら勝ち組やん楽正：）
とやろうと思ったけどどうやらフォルダ構成が変わっているらしくそもそもダウンロードファイルが見つからない。と言うか、そもそもの話でインストールメディアをそんな簡単に作れるわけがなかった。

# 解決策③：パーティションを分割してそこにもう一つのOSをインストール
これが一番無難な方法でした。
リカバリーメニューからディスクユーティリティを使ってパーティションをAPFSで分割して、そこにVentureをインストール。
この時に僕が困ったのが、SSDがパンパンすぎて最初はインストールできなかったこと。
こんな時は、ターミナルを使ってXcodeやVisual Studioなど重いけどもう一度ダウンロードできるソフトを消していきましょう。
普通に消す時はrmコマンドで問題ないです。

~~~bash:
rm -R "消したいアプリ名 or ディレクトリ名"
~~~

ちなみに、これでも足りない場合は、Xcodeのキャッシュファイルを削除してみてください。とにかくXcode関連のファイルは消してみましょう。あるいは、重要ファイルに関してはSSH経由で逃してみてもいいでしょう。
これで消してパーティションを分割、できたらそこにとりあえずVentureをネット経由でインストールして、そこからSonomaにアップグレード、リカバリーモードを開いて、次はリカバリーモードにSonomaの再インストール画面が出てきましたのでそちらからインストールしました。

# 結論
バックアップはきちんとしましょう。
けど、Macのバックアップって難しいですよね。そう言う場合は、今回のようにパーティションを分割して最小限の環境のmacOSだけでも準備しておくと良いかもしれません。
ちなみに、かかった時間は５時間、傷ついたデータは0でした。
[AWS Q&A 365][ECR]AWSのよくある問題の毎日5選 #95

# Q1: Amazon ECRはどのようなセキュリティ機能を提供していますか？
A1: Amazon ECRは、保存時の暗号化、コンプライアンスの検証、アイデンティティとアクセス管理（IAM）、およびモニタリングなど、複数のセキュリティ機能を提供しています。また、強化されたセキュリティのためにインターフェースVPCエンドポイント（AWS PrivateLink）もサポートしています。さらに、Amazon ECRはAWS CloudTrailと統合してアクションをログに記録し、セキュリティ関連の問題のトラブルシューティングを提供します。

# Q2: Amazon ECRは認証とアクセス制御をどのように管理しますか？
A2: Amazon ECRはAWS IAMを使用して認証とアクセス制御を管理します。ユーザーやAmazon EC2インスタンスには、コンテナリポジトリとイメージへのアクセス許可を付与することができます。リポジトリへのアクセスは、リポジトリポリシーを使用して制御することができ、これにより詳細なアクセスルールを定義することができます。

# Q3: Amazon ECRはコンテナイメージの脆弱性をスキャンできますか？
A3: はい、Amazon ECRはコンテナイメージ内のソフトウェアの脆弱性を特定するためのイメージスキャン機能を提供しています。各リポジトリはプッシュ時にイメージをスキャンするように設定することができ、これにより新しいイメージが保存される前にスキャンされることが確認されます。イメージスキャンの結果は取得してさらなる分析や対策に利用することができます。

# Q4: Amazon ECRはデータの暗号化をどのように処理しますか？
A4: Amazon ECRは、リポジトリに保存されたデータの保存時の暗号化を提供します。データはAWS Key Management Service（KMS）キーを使用して暗号化されます。これにより、データは保護され、許可されたユーザーのみがアクセスできるようになります。

# Q5: Amazon ECRはモニタリングとロギングをサポートしていますか？
A5: はい、Amazon ECRはAmazon CloudWatchを通じたモニタリング機能を提供しています。リポジトリやイメージ活動を監視するためのさまざまなメトリクスと寸法を提供します。さらに、Amazon ECRはAWS CloudTrailと統合し、あなたのECR環境内の活動をログに記録し、モニタリングすることができます。
Android のログについて

Android の[ログ](https://developer.android.com/reference/android/util/Log)についての記事になります。

ログは、動作確認や不具合解析には有効ですが、セキュリティやパフォーマンスの観点からリリース時には出力内容を検討する必要があります。

私もリリース時は、DEBUG レベル以下のログは出力しないようにしています。
```kotlin:Logger.kt
object Logger {
　　　　　　　　private const val TAG = "myApp"
    private const val DEBUG = false

    fun e(msg: String) { Log.e(TAG, msg) }
    fun w(msg: String) { Log.w(TAG, msg) }
    fun i(msg: String) { Log.i(TAG, msg) }
    fun d(msg: String) { if (DEBUG) { Log.d(TAG, msg) } }
    fun v(msg: String) { if (DEBUG) { Log.d(TAG, msg) } }
}
```

## ログの出し分け
[Log#isLoggable](https://developer.android.com/reference/android/util/Log#isLoggable(java.lang.String,%20int)) を使用する方法もあります。
```kotlin
    fun d(msg: String) {
        if (Log.isLoggable(TAG, Log.DEBUG)) {
            Log.d(TAG, msg)
        }
    }

    fun v(msg: String) {
        if (Log.isLoggable(TAG, Log.VERBOSE)) {
            Log.v(TAG, msg)
        }
    }
```

上記の様にすることで、実行時にレベルを変更できます。
下記のコマンドを打つと、VERBOSE のログが表示されます。
```
adb shell setprop log.tag.myApp VERBOSE
```

tag をクラス毎、機能毎にすることで、さらに細かいログの出し分けも可能となります。
```kotlin
    Logger.d("MainActivity", "onCreate")

    fun d(tag: String, msg: String) {
        if (Log.isLoggable(tag, Log.DEBUG)) {
            Log.d(TAG, msg)
        }
    }
```

## パフォーマンス
細かい話をすると、文字列の結合はパフォーマンスに影響が出るので、文字列の結合部分をラムダ式にすることで、ログを出力しないときは、結合処理を行わせないことも可能となります。
```kotlin
    Logger.d { "setOnItemClickListener($position)" }

    fun d(block: () -> String) {
        if (Log.isLoggable(TAG, Log.DEBUG)) {
            Log.d(TAG, block())
        }
    }
```
[AWS Q&A 365][ECR]Daily Five Common Questions #95

# Q1: What security features does Amazon ECR provide? 
A1: Amazon ECR provides several security features, including encryption at rest, compliance validation, identity and access management (IAM), and monitoring. It also supports interface VPC endpoints (AWS PrivateLink) for enhanced security. Additionally, Amazon ECR integrates with AWS CloudTrail to log actions and provides troubleshooting guidance for security-related issues. 

# Q2: How does Amazon ECR handle authentication and access control? 
A2: Amazon ECR uses AWS IAM to manage authentication and access control. Users and Amazon EC2 instances can be granted resource-based permissions to access container repositories and images. Access to repositories can be controlled using repository policies, which allow you to define fine-grained access rules. 

# Q3: Can Amazon ECR scan container images for vulnerabilities? 
A3: Yes, Amazon ECR offers image scanning capabilities to identify software vulnerabilities in container images. Each repository can be configured to scan images on push, ensuring that new images are scanned before being stored. The results of the image scan can be retrieved and used for further analysis or remediation. 

# Q4: How does Amazon ECR handle encryption of data? 
A4: Amazon ECR provides encryption at rest for the data stored in repositories. The data is encrypted using AWS Key Management Service (KMS) keys. This ensures that the data is protected and can only be accessed by authorized users. 

# Q5: Does Amazon ECR support monitoring and logging? 
A5: Yes, Amazon ECR offers monitoring capabilities through Amazon CloudWatch. It provides various metrics and dimensions for monitoring repository and image activity. Additionally, Amazon ECR integrates with AWS CloudTrail, allowing you to log actions and monitor the activity within your ECR environment.
KVMでTerraform入門してみた(libvirt-provider)

## 目的
卒業研究の一環で、最終的にKubernetesの自動クラスタ構築を行う事が出来るソリューションを作らなければならない。プロビジョニングはterraformで行いたいと考えている。

## インストール
以下参考

https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli

```bash
$ sudo apt-get -y update && sudo apt-get install -y gnupg software-properties-common
wget -O- https://apt.releases.hashicorp.com/gpg | \
gpg --dearmor | \
sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
gpg --no-default-keyring \
--keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg \
--fingerprint
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \
https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \
sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update
sudo apt-get -y install terraform
```

### /etc/libvirt/qemu.confの設定変更
`security_driver = "none"`に変更する。
libvirtのリスタートは以下コマンドより
```
sudo systemd restart libvirt-bin
```


## 確認
```
$ terraform -v
Terraform v1.5.0
on linux_amd64
```

## libvirt-providerのインストール
```provider.tf
terraform {
  required_providers {
    libvirt = {
      source = "dmacvicar/libvirt"
      version = "0.7.1"
    }
  }
}

```

操作する対象が別ホストの場合
```provider.tf
provider "libvirt" {
  uri = "qemu+ssh://shoma@172.24.20.3/system"
}
```

## 構成ファイルの最小構成
```main.tf
provider "libvirt" {
  uri = "qemu+ssh://shoma@172.24.20.3/system"
}

resource "libvirt_volume" "os-image" {
  name = "terraform-disk.qcow2"
  source = "https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img"
  format = "qcow2"
}

resource "libvirt_domain" "domain-testvm" {
  name = "ubuntu-terraform"
  memory = 2048
  vcpu = 2

  disk { volume_id = libvirt_volume.os-image.id }

  network_interface {
    network_name = "default"
  }

  console {
    type = "pty"
    target_port = "0"
  }

  graphics {
    type = "spice"
    listen_type = "address"
    autoport = "true"
  }
}
```

## 確認
```
root@r620-shoma-001:/home/shoma/terraform# virsh list
 Id    Name                    State
----------------------------------------
223   ubuntu-terraform-1      running
```


## 複数台のVMを作成する
```main.tf
provider "libvirt" {
  uri = "qemu+ssh://shoma@172.24.20.3/system"
}

resource "libvirt_volume" "os-image" {
  count = 3
  name   = "${format("terraform-vm%02d.qcow2", count.index + 1)}"
  source = "https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img"
  format = "qcow2"
}

resource "libvirt_domain" "terraform-vm" {
  count = 3
  name = "${format("ubuntu-terraform%02d", count.index + 1)}"
  memory = 2048
  vcpu = 2

  disk { volume_id = libvirt_volume.os-image[count.index].id }

  network_interface {
    network_name = "default"
  }

  console {
    type = "pty"
    target_port = "0"
  }

  graphics {
    type = "spice"
    listen_type = "address"
    autoport = "true"
  }
}
```

## 確認
```
root@r620-shoma-001:/home/shoma/terraform# virsh list
 Id    Name                    State
----------------------------------------
 237   ubuntu-terraform02      running
 238   ubuntu-terraform03      running
 239   ubuntu-terraform01      running
```




## 参考文献
https://computingforgeeks.com/how-to-provision-vms-on-kvm-with-terraform/
【iOS15.0+】SwiftUI.Textでリンク付きテキストを実装する

# はじめに
iOS14以前はSwiftUIでリンク付きテキストを実装しようとすると、NSAttributedTextやUILabelなどを使う必要があり、結構面倒でした。

iOS15以降はめちゃめちゃ簡単に実装することができます。

# Textでリンク付きテキストを実装する
Textはマークダウンを解釈できるので、以下のように実装するだけでリンク付きテキストを実装できます。

```swift
Text("[リンク](https://example.com)だよ")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/007fa1d5-3578-40d5-dc8e-a8dad58b3c3d.png)

しかし、例えばURL部分に変数やメソッドを使用するとリンクになりません。

```swift
let url = "https://example.com"
Text("[リンク](\(url))だよ")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/22739020-9fb7-537c-8e7e-729836a2603b.png)

変数やメソッドを使用する場合は、以下のように実装しましょう。

```swift
let url = "https://example.com"
Text(.init("[リンク](\(url))だよ"))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/007fa1d5-3578-40d5-dc8e-a8dad58b3c3d.png)

## Textのイニシャライザについて補足
どうして変数を使用するとリンクが解釈されないのでしょうか？
それを理解するにはSwiftUI.Textのイニシャライザの挙動について知る必要があります。

以下のように**文字列リテラル**を使用した場合、[init(_:tableName:bundle:comment:)](https://developer.apple.com/documentation/swiftui/text/init(_:tablename:bundle:comment:))が使用されます。
そして、このイニシャライザでは文字列にマークダウンが含まれている場合、テキストをスタイリングして表示するようになっています。

```swift
Text("[リンク](https://example.com)だよ")
```

一方、**変数あるいは変数を含む文字列**を使用した場合、[init(_:)](https://developer.apple.com/documentation/swiftui/text/init(_:)-9d1g4)が使用されます。
`[リンク](https://example.com)だよ`という表示にはならないのでマークダウンを解釈してないわけではない？のかもしれませんが、スタイリングはされません。

```swift
Text("[リンク](\(url))だよ")
```

以下のように実装した場合、Textに対して明示的に`init(_:tableName:bundle:comment:)`を使用することを指定しているため、スタイリングされるというわけです。

```swift
Text(.init("[リンク](\(url))だよ"))
```

...ちなみに、型を明示的に書くとこうなるはずなんですが、これだとスタイリングされませんでした。

```swift
Text(LocalizedStringKey("[リンク](\(url3))だよ"))
```

代わりにこうするとスタイリングされました。

```swift
Text(LocalizedStringKey(stringLiteral: "[リンク](\(url3))だよ"))
```

いまいち納得がいきませんが、、分かる方いたら教えてほしいです :pray: 

# リンクタップを検知して何かする
リンクなので、タップされたら何かアクションをさせたいですよね。
これは`environment(_:_:)`モディファイアを使用すると実現できます。

```swift
VStack(spacing: 16) {
    Text("[リンク](https://example.com)だよ")
    Text(.init("[リンク](\(url))だよ"))
}
.environment(\.openURL, OpenURLAction { url in
    print(url)  // タップされたURLを出力する
    return .handled
})
```

※`environment(_:_:)`モディファイアの説明はここでは割愛します

# Swift Playgroundで試す
以下のコードをPlaygroundに貼って試してみてください。

```swift
import UIKit
import SwiftUI
import PlaygroundSupport

PlaygroundPage.current.needsIndefiniteExecution = true

let url2 = "https://example2.com"
let url3 = "https://example3.com"

struct ContentView: View {
    var body: some View {
        VStack(spacing: 16) {
            Text("[リンク](https://example1.com)だよ")
            Text("[リンク](\(url2))だよ")
            Text(.init("[リンク](\(url3))だよ"))
        }
        .frame(width: 200, height: 200)
        .environment(\.openURL, OpenURLAction { url in
            print(url)
            return .handled
        })
    }
}

PlaygroundPage.current.setLiveView(ContentView())
```

![text-link.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/8943876f-b31f-fb87-18ba-1d83b4c51b0c.gif)
もう warp しか受け入れない身体になった。

Warpって知ってる？やばいんだぜ。

ってある友達から言われて、はや2週間。僕はもうtemianlやiTermを使うことをやめ、Warpしか受け付けない身体になってしまった。どうしたものか。。。

まじ、terminalがロマンだ、iTermで十分だとか何とか言ってる人の気がしれなくなって我慢できなくなったので、3年ぶりにQiitaの記事を書くことにした(笑)


# Warpまじやばい
ばかっぽい笑
でも、使い勝手がわかってくると感動する。。。
どんなものか簡単に紹介してみる！！！！


### Warpを簡単説明してみる。

#### < 良いところ >

- コマンドの予測を出してくれる。
- Rustでできてる。 **(←ここ重要、テスト出る(でない))**
- コマンドの検索機能がついてる
    - その場で簡単に調べられる。
- 今で十分なのにこれからどんどん発展していく予定があるらしい。
- optionとか使わずとも、打ちたいところにカーソル持ってクリックできる。
- おしゃん。
- タブの作成が簡単だし、画面内でのタブを分割できる。←つよない?

#### < 悪いところ >
- その他はなし。たぶん。表面的に使ってる限り、困ることがあんまりない。

#### 概要

https://www.warp.dev/

説明が遅くなりました。
Warpは、AIを組み込んだRustベースのモダンなターミナルだそうです。そう、みんな大好きRust言語で作られたもので、速度も速い速い。

ということで、たらたらと語っていこうと思う。


## 良いところの語り部分


1. Warpには、iTermとかterminalよりもめちゃ簡単に使える。あと、結構機能がある。

2. 現在のコマンドライン上のどこをクリックしても、その場所にカーソルを挿入できることだ。まじタイポした時に超使える。

3. タブ補完に関するGUI。これまでは実行したいコマンドを入力してタブを押すと、間違った表示がされたり、思い通りにいかないことが多かった。さらにそれを入力し直すのに消したり、めんどくさいめんどくさい。しかし！！！！！Warpを使えば、タブを押すと、過去に実行したコマンドや、入力した内容に関連する一般的なコマンドに基づく候補をちょーーーーーーーーーーー簡単に見ることができる。

4. 見た目がめっちゃ好き。（個人的感想）

5. 洗練された見た目。テーマを変えたり、背景の透過度やブラーもかけられる。あとフォントサイズやフォントの種類なども選べるので、かなり自分の好みにカスタマイズできる。僕は、ドラキュラっていうテーマで、フォントサイズを11、透過度60、ブラーも40くらいにしていた記憶がある。


6. いい感じに早いんよ。

[Warp Documentation - Performance](https://docs.warp.dev/how-does-warp-compare/performance)より。

|Terminal|Version|Terminal size (cols / rows, window is identical pixel-wise)|
|---|---|---|
|Warp|v0.2022.04.01.01.37.stable_03|208 cols / 54 rows|
|Terminal.app|Version 2.11 (440)|188 cols / 72 rows|
|iTerm2|Build 3.4.15|211 cols / 78 rows|

![https://848020679-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MbqIgTw17KQvq_DQuRr%2Fuploads%2Fgit-blob-4fd6246c4ec142bffccc1c34655a39f5c89114d4%2Fvtebench_avg.png?alt=media](https://848020679-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MbqIgTw17KQvq_DQuRr%2Fuploads%2Fgit-blob-4fd6246c4ec142bffccc1c34655a39f5c89114d4%2Fvtebench_avg.png?alt=media)

青がwarpなんだけど、全体的にみると結構圧倒的だと思うんだけど。ちなみに黄色と緑のやつもrust製なので（自慢げ）（何で）。


# ⚠️注意⚠️

初学者は注意。
確かに、調べたりもしながらできるかもしれないが、予測変換によって、そこまで意味わからず、実行してしまうこともありそうなので、itermと併用することをお勧めします。

僕自身は、まだ入社したばかりなこともあり、PCの申請などの関係でWarpを入れられていませんが、iTermを入れようと思っています。（申請が通るならWarpも入れたい笑）


# 試してみる気になれる動画はこれ。たぶん？

https://www.youtube.com/watch?v=XWQY8LgkiXM

これみてみるとまじダウンロードしなきゃいけないという気にさせられる。ぜひ。

# ここからどうぞ。

公式↓

https://www.warp.dev/

普及してこ。ああ、たまらん。
ソフトウェア開発における設計：その本質と重要性

## はじめに
こんにちは、エンジニア2年目のピヨピヨエンジニアです。今日は、ソフトウェア開発における設計の本質とその重要性について、深く掘り下げてみたいと思います。設計は、プロジェクトの成功を大きく左右する要素であり、ソフトウェアの機能と性能を決定するだけでなく、開発工程全体をスムーズに進めるための道筋を示す役割も果たします。

## 設計の本質
ソフトウェア開発における設計とは、ソフトウェアの機能や性能を決定する工程のことを指します。設計では、ソフトウェアがどのように動作するか、どのような機能を持つか、どのような性能を発揮するかを詳細に定義します。設計は、ソフトウェアの品質を保証し、開発工程を効率的に進めるために不可欠な工程です。

## 設計の重要性
ソフトウェア開発における設計の重要性は、以下の3つの点に集約されます。
1. 品質の保証：設計は、ソフトウェアの品質を保証するための最初のステップです。設計が不適切であれば、ソフトウェアの品質は低下し、バグが発生しやすくなります。

2. 開発効率の向上：設計は、開発工程を効率的に進めるための道筋を示します。設計が明確であればあるほど、開発工程はスムーズに進行し、開発時間を短縮することができます。

3. 保守性の向上：設計は、ソフトウェアの保守性を向上させます。設計が適切であれば、ソフトウェアの改修や機能追加が容易になります。

以上のように、ソフトウェア開発における設計は、ソフトウェアの品質、開発効率、保守性を向上させるために重要な工程です。設計の重要性を理解し、適切な設計を行うことで、高品質なソフトウェアを効率的に開発することが可能になります。

## おわりに
ソフトウェア開発における設計の本質と重要性について考えてみることで、設計は単なるプログラムの構造を決定するだけでなく、ソフトウェアの成功そのものに深く関わっていることが理解できました。

設計は、ユーザーがソフトウェアとどのように対話するか、どのように感じるかを決定します。つまり設計工程はユーザーの体験を形成し、ソフトウェアの価値を決定します。そのため、設計はソフトウェア開発の中心的な役割を果たし、その重要性は過小評価できません。

しかし、設計の本質を理解し、それを適切に適用することは容易なことではありません。それは深い洞察力、広範な知識、そして経験を必要とします。さらに、ユーザーのニーズと期待を理解し、それらを満たすための創造的な解決策を見つける能力を必要とします。

ソフトウェア開発における設計の本質と重要性についての探求は、ここで終わりではありません。この記事が、ソフトウェア開発における設計の重要性について新たな視点を提供し、あなたの開発プロセスに役立つことを願っています。
rootユーザーでssh接続する方法

## 概要
VSCodeからAWS EC2にssh接続をする場合、通常デフォルトユーザーでログインすることが多いが
root権限の必要なファイルの読み取り、書き込み、実行ができない。そこで今回はrootユーザーでVSCodeにログインする方法を記載する。

## 手順
**１．VSCodeからデフォルトユーザーでssh接続を行う。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733779/537850f3-7fa3-250b-9170-68ac53ba94e6.png)


**２．rootユーザーに切り替え**

下記コマンドでユーザー切り替え
>[ec2-user@ip-172-31-41-211 ~]$ sudo su

※sudo suとsudo su -の違い
コマンド実行後のホームディレクトリが変わるかどうか。（ほぼ同じと考えてよい）

**３．デフォルトユーザー(ec2-user)の公開鍵をrootユーザーの公開鍵へコピー**

>[root@ip-172-31-41-211 ec2-user]# cp /home/ec2-user/.ssh/authorized_keys /root/.ssh/authorized_keys

**４．sshd　再起動**

>[root@ip-172-31-41-211 ec2-user]# service sshd restart

**５．rootユーザーでssh接続**
userをrootに変更しssh接続をする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733779/29780436-a18b-dcde-2b6b-ea64640df409.png)

rootユーザーとしてログイン完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733779/b53d4674-3a5c-b53c-8b58-60557ad277ba.png)


## まとめ

セキュリティ的にあまりよくないため実際の運用とかではやることはない。
作業でroot権限が必要なファイルの中身を確認する必要があったため調べてみたが勉強になった。
基本的には**sudo suコマンド** で問題ないと思った。
RHEL9でrloginを無効化して、rshだけ有効化する方法

# はじめに
rsh.....、ずいぶん前にsshに取って代わられて、今となっては実運用で使うことは稀でしょう。
なおかつ「rloginは使えない状態で、rshだけ使えるようにする」なんて要件はまずないでしょう。

そんなレアケースに最近かかわり、若干ハマった箇所があったのでもろもろ共有します。
※引用しているドキュメントはAIXのものですが、コマンド仕様自体はRHELでも基本的に同じです

## 目次
<!-- タイトルとアンカー名を編集 -->
1. [rsh関連のサービスについて](#1-rsh関連のサービスについて)
2. [サーバー側の設定](#2-サーバー側の設定)
3. [クライアント側の設定](#3-クライアント側の設定)
4. [何故かrshでログインできない](#4-何故かrshでログインできない)
5. [結論](#5-結論) 
6. [参考文献](#6-参考文献)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
## 1-rsh関連のサービスについて
`rsh-server`、`rsh`をインストールすると、以下のサービスが利用できるようになります。
この中で今回は`rsh.socket`だけ有効化して、他は無効されている状態にします。

- rsh.socket
>rsh (リモートシェル) は、ユーザーがリモートホスト上でシェルコマンドを実行するためのプロトコルです。
このサービスは、rsh コマンドによる接続要求を待ち受け、それに応じて新しいシェルセッションを開始します。

- rlogin.socket
>rlogin は、リモートホストでのログインセッションを提供します。
rloginコマンドを使ってリモートホストに接続すると、ユーザーはそのホスト上で完全なログインシェルを開始できます。
rlogin.socket サービスは rlogin コマンドによる接続要求を待ち受け、それに応じて新しいログインセッションを開始します。

- rexec.socket
>rexec (リモート実行) は、リモートホストで指定したコマンドを実行するためのプロトコルです。
このサービスは rexec コマンドによる接続要求を待ち受け、それに応じて指定されたコマンドの実行を開始します。

<a id="#Chapter2"></a>
## 2-サーバー側の設定

rhel9ではrshが標準リポジトリに含まれていないため、epelからダウンロードします。
```terminal:実行
$ sudo dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
$ sudo dnf -y update
$ sudo dnf -y upgrade
```

rsh-serverをインストールして、起動しておきます。
```terminal:実行
$ sudo dnf -y --enablerepo="epel" install rsh-server
$ sudo systemctl enable rsh.socket
$ sudo systemctl start rsh.socket
```

ホスト名関連の設定をします。
本来は/etc/hosts.equivではなく~/.rhostで設定したほうがいいのですが、
設定を簡略化するためhosts.equivで設定します。
```terminal:実行
$ sudo hostnamectl set-hostname <ホスト名>
例：hostnamectl set-hostname rsh-server
```
```shell:/etc/hosts
<クライアントのプライベートIP> <クライアントのホスト名>
例：10.0.0.11 rsh-client
```
```shell:/etc/hosts.equiv
<クライアントのホスト名> <OSユーザー名>
例：rsh-client ec2-user
```

<a id="#Chapter3"></a>
## 3-クライアント側の設定

おなじくepelから、rshをインストールします。
```terminal:実行
$ sudo dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
$ sudo dnf -y update
$ sudo dnf -y upgrade
$ sudo dnf -y --enablerepo="epel" install rsh
```

同じくホスト名関連の設定をします。
```terminal:実行
$ sudo hostnamectl set-hostname <ホスト名>
例：hostnamectl set-hostname rsh-client
```
```shell:/etc/hosts
<サーバのプライベートIP> <サーバのホスト名>
例：10.0.0.10 rsh-server
```


<a id="#Chapter4"></a>
## 4-何故かrshでログインできない
この状態でクライアントからrshコマンドを実行すると、以下の状態になります。
結果だけ見ると、「コマンド実行は成功しているのに、ログインだけできていない...？？」
という何とも不思議な状態になります。

```terminal:①コマンド引数なし
$ rsh <サーバのホスト名>
例：rsh rsh-server
⇒応答が帰ってこない
```
```terminal:②コマンド引数あり
$ rsh <サーバのホスト名> <コマンド>
例：rsh rsh-server ls -la
⇒正常に実行できる
```

<a id="#Chapter5"></a>
## 5-結論
結論として、rshでログインできないのは正常な状態です。
なぜならrshは以下の仕様があるからです...。
>-コマンド名が指定されている場合には、リモート・ホスト上で単一のコマンドを実行する。
 -コマンド名が指定されていない場合は、rlogin コマンドを実行する。

つまりサーバー側で`rlogin.socket`を起動していないので、rshでログインはできない、ということです。
この仕様が判明するまで私はしばらくハマってしまったため、
同じくハマっている人にこの情報が届けば幸いです。

<a id="#reference"></a>
## 6-参考文献
- [ローカル・ホストとリモート・ホストの接続](https://www.ibm.com/docs/ja/aix/7.2?topic=users-local-host-connections-remote-host)
WORDのアウトラインスタイルの設定について

# 推奨スタイルだけ表示する方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/87f9895b-34b4-aa6b-4b73-4770260adb91.png)

## [スタイルの管理]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/fcfdf121-0af5-2291-d0cc-5387d4c74573.png)
[推奨]タブを選択
↓
[優先度]で優先順位を設定
↓
[スタイルを推奨スタイルとして表示するかどうか]
・[表示]を選択したものだけ、[スタイルの管理]に表示される
※段落フォントだけは、[表示]を選択してもファイルを保存すると[使用するまで表示しない]に分類される(バグ？)


# アウトラインの設定
画面右の[スタイルの管理]フォームやリボンの[スタイル]から編集することはできない。
そこから呼び出される[スタイルの変更]フォームからも編集することはできない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/bcc0a642-8845-878d-b1d1-15f2a4cf795e.png)

[ホーム]タブの[アウトライン]→[新しいアウトラインの定義]から設定画面を呼び出す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/cf39dbbf-7cc7-d1c5-4d5a-cc11e9c14e55.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/b4f15c96-a95e-51eb-8e04-5dc407df30e6.png)


[スタイル]との紐付けは[レベルと対応付ける見出しスタイル]から行う
この例では、[見出し2]と紐付けることで、[スタイル]から[見出し2]をクリックすると、レベル2のアウトラインが適用されるようになる。
他のアウトラインに[見出し2]を紐付けると、このアウトラインのレベル2からの紐付けが外れてしまう。
（スタイル１種類につき、紐付けができるアウトラインは１つに限定されている模様）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/4f349c24-2448-15f0-d02e-3f530f51f7fe.png)