OmniAICreator/Qiita-1.07M huggingface dataset:
外部設計

# 2.外部設計（External Design）
外部設計は、基本設計や外部設計とも呼ばれ、一般的に外部設計までが上流工程に含まれます。
```要件定義で決定した機能や性能```、```制約条件などを基にしてシステムの基本となる設計```を行います。```操作画面や操作方法```、```データ出力など、ユーザーから見えるインターフェース部分の仕様```を決定したり、セキュリティや運用規定、システム開発のスケジュールや費用などを設計したりと、基本的にユーザーに向けた仕様を設計するのが外部設計です。
# 出典
https://hnavi.co.jp/knowledge/blog/external_design/#title2:~:text=2.%E5%A4%96%E9%83%A8%E8%A8%AD%E8%A8%88,%E5%A4%96%E9%83%A8%E8%A8%AD%E8%A8%88%E3%81%A7%E3%81%99%E3%80%82

# 外部設計とは？
まず、システム設計においては要件定義を行います。要件定義とは、```クライアントの要望を聞き取り、必要な機能や実現したい業務フローなどを要件定義書にまとめる```ことです。外部設計では、この要件定義書をもとに```操作画面や操作方法などのインタフェースを設計```します。外部設計は基本設計や概要設計といわれる場合もあります。```ユーザーが直接関わる部分の設計であるため、ユーザビリティを優先```しなければなりません。
# 出典
https://it-trend.jp/development_tools/article/32-0052#:~:text=%E3%81%AB%E9%96%8B%E7%99%BA%E3%81%97%E3%82%88%E3%81%86-,%E5%A4%96%E9%83%A8%E8%A8%AD%E8%A8%88%E3%81%A8%E3%81%AF%EF%BC%9F,%E3%81%9F%E3%82%81%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E3%82%92%E5%84%AA%E5%85%88%E3%81%97%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82,-%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E6%96%B9%E5%BC%8F
ボットネット

# ボットネット
* ボット、あるいはボットネットとは何だろうか？　簡単にいえば```あなたのパソコンやスマートフォンを「第三者の指示通りに動く操り人形（ロボット）」にしてしまう悪意のあるプログラムが「ボット」```、その```ボットをいくつも集めてネットワーク化したものボットネット```だ。
...
```ボットとはネットワーク経由でコマンドを実行できる悪意のあるプログラム```だ。「ロボット」を想像してもらえばいい。本来、パソコンやスマートフォンは、ユーザーの命令によって動作するが、ボットに感染すると、外部から遠隔操作される「操り人形」と化してしまう。

    厄介なのは、感染しているかの判断が見かけや症状からは難しいことだ。動作が重くなるなどの症状が現れることもあるが、多くのユーザーは気づかない。知らないうちに外部からの命令を受け、DDoS攻撃や迷惑メールの送信、フィッシングサイトの構築、サイバー攻撃の踏み台とされてしまうなど、端末が悪用されてしまう恐れがあるのだ。

    こうした```ボットを束ねてネットワーク化したものが「ボットネット」```だ。```ボットネットを構築すると、悪意のある攻撃者は、インターネットで繋がった大量のマシンをまとめて管理できるようになり、特定のターゲットに一度に大規模な攻撃を仕掛けられる```ようになる。

# 出典
https://eset-info.canon-its.jp/malware_info/trend/detail/150120_3.html

* ```ボットとは、様々な作業を自動化するプログラム```のことです。```ボットの中には悪意のあるプログラムもあり```、感染してしまうとそのコンピュータはボットネットの一部となってしまいます。
```ボットネットは、ボットに感染したコンピュータと、攻撃者の命令を送信する指令サーバによって構成されたネットワーク```のことで、```攻撃者はボットネットに接続したコンピュータに対して一斉に同じ指令を与える```ことができます。

# 出典
https://www.keishicho.metro.tokyo.lg.jp/kurashi/cyber/notes/botnet.html#:~:text=%E3%83%9C%E3%83%83%E3%83%88%E3%81%A8%E3%81%AF%E3%80%81%E6%A7%98%E3%80%85%E3%81%AA%E4%BD%9C%E6%A5%AD%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82%E3%83%9C%E3%83%83%E3%83%88%E3%81%AE%E4%B8%AD%E3%81%AB%E3%81%AF%E6%82%AA%E6%84%8F%E3%81%AE%E3%81%82%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%82%E3%81%82%E3%82%8A%E3%80%81%E6%84%9F%E6%9F%93%E3%81%97%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E3%81%A8%E3%81%9D%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AF%E3%83%9C%E3%83%83%E3%83%88%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E4%B8%80%E9%83%A8%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%E3%83%9C%E3%83%83%E3%83%88%E3%83%8D%E3%83%83%E3%83%88%E3%81%AF%E3%80%81%E3%83%9C%E3%83%83%E3%83%88%E3%81%AB%E6%84%9F%E6%9F%93%E3%81%97%E3%81%9F%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%A8%E3%80%81%E6%94%BB%E6%92%83%E8%80%85%E3%81%AE%E5%91%BD%E4%BB%A4%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E6%8C%87%E4%BB%A4%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E6%A7%8B%E6%88%90%E3%81%95%E3%82%8C%E3%81%9F%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%80%81%E6%94%BB%E6%92%83%E8%80%85%E3%81%AF%E3%83%9C%E3%83%83%E3%83%88%E3%83%8D%E3%83%83%E3%83%88%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%9F%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E4%B8%80%E6%96%89%E3%81%AB%E5%90%8C%E3%81%98%E6%8C%87%E4%BB%A4%E3%82%92%E4%B8%8E%E3%81%88%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

###  気づき
ボットをネットワーク化したものをいうのか。
それ全体が攻撃するのか。
怖いな。
Dockerfileで必須の7つのコマンド

## 概要
Dockerfileに必須の7つのコマンドについて解説します。

## Node.jsを動かすサンプル
```
FROM node

ENV NODE_ENV=production

WORKDIR /scripts

COPY . .

RUN npm install \
 && groupadd app \
 && useradd -g app -m app \
 && mv /root/.config /home/app/ \
 && chown -R app:app /scripts /home/app/.config

USER app

CMD ["npm", "start"]
```

## 7つの基本コマンド
### 1. FROM
ベースとなるimageの指定を行う。

タグなどを指定して、バージョンを固定したりも出来ます。
```
FROM <IMAGE_NAME>
FROM <IMAGE_NAME>:<TAG_NAME>
FROM <IMAME_NAME>@<DIGEST>
#記述例
FROM node:12
```

### 2. ENV
Docker内で使用する環境変数の指定を行う。
Dockerの起動時にデフォルトで定義されていてほしい環境変数を定義する

```
ENV <KEY> <VALUE>
ENV <KEY>=<VALUE>
#記述例
ENV NODE_ENV production
ENV NODE_ENV=production
```

### 3. WORKDIR
Dockerfileに書かれた命令を実行するための作業用ディレクトリを指定する。
このとき存在しないディレクトリを指定すると自動的にディレクトリが作成される。

＊「/」を指定すると
　　最悪の場合既存のディレクトリを上書きしてしまいコンテナが起動しなくなる可能性があるので注意

```
WORKDIR /scripts
```

### 4. COPY
Docker内へホストのファイル/ディレクトリをコピーする。

2つの引数を設定する。
1つ目はホスト側のディレクトリ。
2つ目はDocker側のディレクトリ。

ホスト側のディレクトリは、「docker build .」で指定したディレクトリになる。
「.」なのでカレントディレクトリ。

```
COPY <HOST_FILE_PATH> <DOCKER_IMAGE_FILE_PATH>
COPY ["<HOST_FILE_PATH>", "<DOCKER_IAMGE_FILE_PATH>"]
#記述例
COPY test.html /docker_dir/
COPY ["test.html", "/docker_dir/"]
COPY . .
```
### 5. RUN
Docker内でコマンドを実行する。
・ライブラリのインストール
・環境構築用のコマンドの実行
など

書き方もいろいろある。
```
RUN <COMMAND_FOR_IMAGE_CREATION>
#記述例(Shell形式)
RUN apt-get install -y nginx
#記述例(Exec形式)
RUN ["/bin/bash", "-c", "apt-get install -y nginx"]
```

### 6. USER
イメージ実行やDockerfileの以下の命令を実行するためのユーザーを指定する。
デフォルトは root 

```
USER <USER_NAME/UID>
#記述例
USER app
```

### 7. CMD
デーモンの実行。
イメージをもとに生成したコンテナ内でコマンドを実行する際に記載。

RUNと一緒で書き方がいろいろある。
```
CMD <COMMAND_EXECUTED_AFTER_IMAGE_CREATION>
#記述例(Shell形式)
CMD nginx -g 'daemon off;' 
#記述例(Exec形式)
CMD ["nginx", "-g", "daemon off;"]
CMD ["npm", "start"]
```

＊　Dockerはここで設定したコマンドがフォアグラウンドで実行されている間が生存期間になる
そのため、プロセスの処理が走っている間はフォアグラウンドで実行するように記述する
(バックグラウンドで起動するとDockerが終了してしまう)。

```
CMD ["npm", "run", "start"]
```
docker-desktop starting...から進まないときの対処法

# 概要
環境: windows11
docker-desktop

docker-desktop を立ち上げた際にdocker desktop starting...から進まなくなり、ハマってしまった。最終的にwslやdocker-desktop自体の再インストールで解決した。

これ以外に行った解決方法なども、備忘録として残しておく。

# 解決に至った方法

## wslとdocker-desktopの再インストール
### logの見方
```C:\Users\your-acount\AppData\Local\Docker```
にlogがある。ただ、私の場合はここから明確に問題を特定することができなかった。

### 手順
powershellでwslが使用できると仮定する。

なお、筆者の場合はpowershellだとwslコマンドが認識されなかったため、コマンドプロンプトで```手順3```まで行った後```手順4```からpowershellで実行した。

1.powershellを管理者権限で開く
2.powershellで以下を入力する

```powershell
wsl -l -v
```
|オプション|意味|
|--|--|
|-l|リスト形式でディストリビューションを表示する|
|-v|各ディストリビューションのバージョンを表示する|

(参考)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261812/fe2abef0-f2e4-53ad-a1ac-e390bed83cb7.png)

3.NAMEに対応する仮想マシンをアンインストールする

```powershell
wsl --unregister ubuntu
wsl --unregister docker-desktop
wsl --unregister docker-desktop-data
```

4.再度、wslをインストールし、適当なユーザ名とパスワードを設定する
```powershell
wsl --install
```

5.ubuntuをアップデートをする

以下でubuntuに入る
```powershell:powershell
wsl
```

```powershell:your ubuntu machine
sudo apt-get update
sudo apt-get upgrade
```

6.docker-desktopを再インストールする。

https://www.docker.com/products/docker-desktop/

7.再起動
8.念のためwslのlinux kernelを更新

https://aka.ms/wsl2kernel

9.再起動を行い、docker-desktopを起動する

上記で無事解決した。


# 再インストールに至るまでに行った対処法
## タスクマネージャーでdocker-desktopの終了
1.windows　ロゴ　キーを押下
2.タスクマネージャを検索
3.docker desktopのアイコンを右クリックでタスクの終了を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261812/6c462c1f-1bfd-b892-60b5-9c4ff8f6c360.png)

参考: [Docker Desktop Appがいつまでたっても起動しないときに確認すべきこと](https://maasaablog.com/development/docker/3020/)

## docker desktopのダウングレード
docker desktopのアンインストール後、以下でバージョンを下げたものをインストールした

https://docs.docker.com/desktop/windows/wsl/

## windowsの機能有効化または無効化

そもそもVMが許可されていない可能性がある。

1.windows　ロゴ　キー押下
2.windowsの機能有効化または無効化(Turn windows feature on or off)を検索
3.以下にチェックがついていることを確認する
- Virtual Machine Platform
- Windows subsystem for linux

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261812/fd4b3dc9-37b2-4ed9-869c-ce1d062a863a.png)


## システム環境変数の変更
システム環境変数の変更の詳細な方法は[こちら](https://qiita.com/HarutoWatahiki/items/d49642aa069792e0ae79)

1.windows ロゴ　キー押下
2.システム環境変数の変更を検索し、パスを設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261812/440f1155-9ac2-2277-28cd-80833f4569ed.png)

3.User variables for [your-acount-name]から、以下のパスを追加する。

|Variable|Value|
|--|--|
|Path|C:\WINDOWS\system32;C:\WINDOWS;|
|%SystemRoot%|%SystemRoot%|


参考

https://stackoverflow.com/questions/71644746/docker-wsl-2-integration-with-distro-ubuntu-20-04-unexpectedly-stopped-with-exi

https://onoredekaiketsu.com/windows10-environment-variables/
[AWS学習]監視と通知

## CloudWatchとは？
様々なAWSリソースを監視する仕組み。

CloudWatchを使うことで、
・監視結果に応じて、運用者にメール配信する
・監視結果に応じて、EC2インスタンスの増減アクションを発火させる
などが出来る。

CloudWatchを使うことで、
AWSの特徴である、「伸縮自在」「柔軟性（アジリティ）」を最大限使いこなせるようになる。

### 仕組み
・各AWSリソースから送られてきたモニタリングデータを保存する
・メトリックスごとにグラフ化して表示する
・モニタリングデータの保持期間は2週間。それ以降は破棄される
・月次のモニタリングレポートが必要な場合は、保持期間内にデータをダウンロードしておく必要がある

### メトリックス
CloudWatchを使いこなす上で必須の用語。
「監視項目」という意味。

#### デフォルトで設定されているメトリックス
・EC2インスタンスのCPU利用率
・EBSのディスクI/O
・S3の格納オブジェクト総数
・RDSインスタンスのCPU利用率
・RDSインスタンスのメモリ空き容量
・RDSインスタンスのストレージ空き容量
・DynamoDBに書き込まれるユニット数
など

### CloudWatchに送る仕組み/機能を各AWSリソース側で用意する
CloudWatchは「送られてきたデータ」を保存するので、
各AWSリソース側で、「送る」設定をしてあげる必要がある。

ただ、マネージドサービスであるRDSなどはデフォルトで様々なモニタリングデータを送信しる仕組みが最初から導入されている。
逆にマネージドサービスではないEC2などは、最低限のデータ（標準メトリックス）のみしか送信していない。

例）EC2の場合
#### 標準（デフォルト）メトリックス
ハイパーバイザーが取得してClousWatchに送信する
・CPUCreditUsage：CPUクレジット利用数
・CPUCreditBalance：クレジット累積数
・CPUUtilization：CPU利用率
・DiskReadOps：1秒あたりのDisk読み込み回数
など

#### カスタムメトリックス
OSにインストールしたエージェントが取得してCloudWatcに送信する
標準メトリックス以外に取得したい場合は、カスタムを使う

### モニタリングの種類
#### 基本モニタリング
３種類のステータスチェックは1分間隔、その他は5分間隔
#### 詳細モニタリング
標準メトリックスを全て1分間隔。追加料金が必要！！

## アラームとは？
事前に設定しておいた閾値を超えたときに、
所定のアクションを呼び出す状態遷移のこと。

### アクションの種類
・メードなどの通知
・EC2インスタンス数の増減（Auto Scalingポリシー）
・EC2の停止・削除・再起動・復旧（EC2アクション）

### アラームの状態
3つの状態がある
・OK
・アラーム（Alarm）
・不足（Insufficient_data）

## SNS（Amazon Simple Notification Service）
通知のサービス

### 用語
#### メッセージ
通知するメッセージ
#### サブスクライバ
受信者
#### トピック
単一/複数のサブスクライバをまとめたもの

## CloudWatchのアラームのアクションでSNSを使って通知を送信する流れ
1. 「TestTopic」というトピックを作成する
1. 運用者のメールアドレスをサブスクライバとして「TestTopic」に登録
1. CloudWatchでシステムのEC2インスタンスを監視。一分間の平均CPU利用率が80%を1回でも超えたというアラームが発生するよう設定
1. アラームが発生すると「TestTopic」にメッセージを通知するアクションを設定

→　CPU利用率が80%を超えて、アラームが発生。
1. 「CPU利用率が80%を超えた」旨のメッセージを「TestTopic」に送信
1. SNSは、「TestTopic」 に登録されているメーリングリスト（サブスクライバ）にメッセージを送信する
SecretsManagerのパスワードをローテーションするLambda作成ポイント

## はじめに
SecretsManagerの「その他のタイプのシークレット」を自動ローテーションしたい際には、AWSが提供するlambdaアプリケーションを利用することができます。

https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/reference_available-rotation-templates.html

Labda関数およびアプリケーションの作成方法やネットワーク構成手順を、つい見落としてよくハマりがちなこと、またAWS公式資料に記載はあるもの点在しているため、まとめとして本記事を執筆しました。


## Lambdaアプリケーション・関数作成
Lambdaから、アプリケーションを作成します。
「サーバレスアプリケーション」タブを選択します。
「カスタム IAM ロールまたはリソースポリシーを作成するアプリを表示する」にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191704/6aa41190-6fea-b3c9-3fbe-af44ddbe3dee.png)

「SecretsManagerRotationTemplate」で検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191704/7be30871-19cb-71c3-ea65-c46674d60c84.png)

必須項目である「functionName」、「endpoint」を入力します。
東京であれば、endpointは「secretsmanager.us-east-1.amazonaws.com」です。
※ランタイムは適宜変更してください。

最後に、「このアプリがカスタム IAM ロールとリソースポリシーを作成することを承認します。」にチェックを入れて、デプロイします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191704/9fe45c14-00e0-8148-4628-42cb9186f4af.png)

Lambdaが作成されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191704/7c60a44b-2846-3a62-e067-397adaedce1a.png)

## ネットワーク設定
LambdaがVPC内リソースにアクセスするには、以下の設定が必要です。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-vpc.html
VPC アクセスの設定 (コンソール) を参照

SecretsManagerはエンドポイントを通じて、Lamda接続する必要があります。
https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/vpc-endpoint-overview.html

Lambdaに付与したSGは、SecretsManagerエンドポイントから疎通できるようにインバウンド/アウトバウンドを設定する必要があります。

※その他にも、Lambdaは、SecretsManagerに保管した認証情報を用いてログインするアプリケーションに対しても、疎通できる必要があります。適宜、Lambdaに付与したSGのインバウンド/アウトバウンド設定を追加してください。
AWS初心者がwebアプリケーションのインフラを構築する part2 DB編

## 概要
AWS全然触ったこと無い初心者が一般的なwebアプリケーションのインフラを構築する手順をメモしながら思ったことなどを記載していく記事

## 対象
AWS初心者
これからインフラの構築をする人

## 作るもの
AuroraのMySQLサーバー

## 手順
### Aurora MySQLを配置するサブネットグループの設定
作成画面に遷移し
![スクリーンショット 2023-03-21 16.19.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/df5d7aa4-ba3f-808c-924a-e22e768cb740.png)

まず名前を決めて、VPCを選択する
![スクリーンショット 2023-03-21 16.20.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/bc1cc5dd-2ea7-7fba-a242-9351ea0506b7.png)

その後、AZとサブネットを指定する
![スクリーンショット 2023-03-21 16.20.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/d582d45a-d841-f093-2a03-29fb80dd8acd.png)


### Aurora MySQLの設定
作成画面に遷移し
![スクリーンショット 2023-03-21 16.21.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/ceb10b6f-a0f4-cb90-d0be-a3b938b5c5cb.png)

開発/テストを選択し
![スクリーンショット 2023-03-21 16.22.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/fbb80a23-86c2-aa8f-e001-abce0289aed8.png)

作成したサブネットグループとVPCを選択
![スクリーンショット 2023-03-21 16.24.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/29d0cb11-4ebd-6644-b452-aefdfa0ebb68.png)

追加設定で名前を決める
　![スクリーンショット 2023-03-21 16.25.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/b05b4db2-27b1-d28b-6028-843cbd0ba29c.png)

作成を押して終了
手紙～拝啓新卒エンジニアの君へ～

## はじめに

そろそろ新卒入社の時期なので、新卒だった数十年前の自分に宛てて手紙を書いておこうと思います。
これからITエンジニアとしての人生を歩んでいく新卒エンジニアやメンターの方々に何かのお役に立てれば嬉しいです。

## 拝啓新卒エンジニアの君へ

ゲームを創る仕事がしたかったけれども、普通のそれなりに大きなIT企業に就職した君へ。
就活でゲーム屋は全部落ちちゃったけど、今ではその方がよかったと思うよ。世間で名前が通っているゲーム屋はいわゆる「パブリッシャー」と呼ばれる会社なので自社で開発していないことも多いし、実際それらの会社の仕事は転職後に下請けとして後でやることになるから安心していいよ。


### つよいという誤解とつよさを維持することの難しさ

それなりに大きなIT企業での仕事では、はっきりとは自覚できていないと思うけれども、エンジニアとしてキャリアを築く上で大事なことを学んでるからね。

大学生の頃、先輩が作った場末のソフトハウスでバイトしてて終電を逃してたよね。先輩が２つのキーボードを使い分けてタバコをガンガンふかしながらプログラムを書いているのを見て、漠然とそんなエンジニアになるのかなカッケーと思ったかもしれないけれども、そんな風にはならなかったね。

そんなキャリアを引っ提げて入社した君は、新人研修チョロいと思ってなめてたけど、現場に入っていきなり苦労してたね。当時最先端だった VC6 が全く分からなくて悔しい思いをしながら夜遅くまで勉強していたね。C++ は最高でこれさえ覚えればずっと食ってけるかなって思ったらそんなことはなかったね。

Java が登場したけど、設定が大変だったりパフォーマンスがとても悪くて C++ の敵じゃないと思ったけど、PCの性能が向上してパフォーマンスの問題を解決してしまい Java 全盛の未来がきたからね。その未来がいつまで続くかは分からないけれども。

アセンブラから C や C++ に移行できないエンジニアというのは結構たくさんいたよね。同様に C++ から Java に移行できないエンジニアもたくさん現れたんだよ。メモリを自分で解放できないのが気持ち悪いとかね。幸いにも君の先輩はとても素晴らしい方で時間を見つけては案件で使わないJavaを楽しそうに書いてたんだよね。知的好奇心はなくさないようにしてね。


### 何が役に立つか分からない

ゲームを作りたかった君は、大学で OpenGL（3Dグラフィックス） を学んだね。普通のIT企業に入ってしまったので全く使わないだろうと思っていたら、ショボいPCでそれなり描画性能を要求されるプロジェクトに配属されて割りと好きに色々書かせてもらったね。自分が所属する社会集団において、他人ができないことをできるということは、それだけチャンスが回ってくる可能性が高くなるということだから、好きなことを色々やっておくのがいいんだろうね。

試験の点数を取るためだけにやっていた行列計算が3Dグラフィックスをやるのに役に立ったりして、高校生の時に使っていた教科書を会社に持っていくようになるんだから面白いよね。


### 不毛な空中戦と仕様書

学生の頃、趣味やバイトでプログラムを書いてた君は、ワードでの仕様書作成を新鮮な業務とは思いながらも少々無駄に感じていたよね。ソフトウェアはプログラムさえ書けば動くのだから。

君にとってラッキーだったことは、この仕様書作成業務を新卒の時に『普通の仕事ではやるべきこと』として経験できたことだと思うよ。

プロジェクトは様々な立場や職務や価値観の人が携わって運営されているという事実を理解するのにはずいぶん時間がかかるんだ。その後の人生で空中戦（口頭のみのやり取り）からの不毛な言った言わない論争を大量に見ることになるんだけれども、それを回避するためのヒントを手に入れてたんだよ。アウトプットされたドキュメントからは読み取れないかもしれないけれども、いろいろな人と合意を取ったり指示を出したりするのに有効な手段なんだよ。


### アンガーマネジメント？

初めてのお客様との打ち合わせで、内容が分からなすぎて寝そうになっていたよね。その時先輩に「資料整理残ってたから、そっちやっておいてよ。」と声をかけられたのを覚えている？打ち合わせ終わった後で「眠かった？（笑）」なんて聞かれて。普通だったら説教されているところだよね。

今では当たり前の様に言われている「アンガーマネジメント」にこんな早い時期に触れることができたのだから、君は相当ラッキーだよ。書籍ではなかなか理解できない兄貴の覚悟が！「言葉」でなく「心」で理解できた！んだよ。


### メンターとサーヴァントリーダーシップ

そんな優しい先輩が一度だけ怖い顔をしたことがあったね。

改修案件でスパゲティ気味のソースを引き継いでいた時に、先輩が忙しそうな時にどうしても分からないところを聞いちゃったんだよねぇ。文句一つ言わずに怖い顔してソース読んでくれてたね。お手を煩わせて申し訳ないなとかいろいろなことを思ったよね。

元ソースを書いていたプロジェクトを離れてしまった人に電凸するのは全く申し訳ないと思わなかったけれども。後から分かることだけど、プロジェクトを離れてもなお前のプロジェクトのソースのことを覚えているってとても凄いことだから敬意を持つようにしようね。

これも当時は言語化されてなかったんだけど「サーヴァントリーダーシップ」みたいなことができる「メンター」が先輩だったんだなあと後で分かるからね。


## おわりに

新卒エンジニアとメンターの方に向けての実体験混じりの手紙でした。
インターネットの発達で情報が飛び交っていたり、ChatGPTの登場で世間は浮足立ってる気がしますが、自分のペースでひとつひとつ学んだりアウトプットしたりしていくのがよいのかなあと思っています。


## 追伸

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


## おまけ1 : 新卒向け記事

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

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

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

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


## おまけ2 : 新卒・メンター向け記事

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

https://qiita.com/kaku3/items/9ef5ad3a4df0d7be9c32


## おまけ3 : 営業A短編シリーズ

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

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


## おまけ4

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

[エンジニアのためのお仕事問題集](https://github.com/kaku3/workbooks)
【Storybook】typescript_1.default.createIdentifier is not a function エラーの解決方法

# typescript_1.default.createIdentifier is not a function エラーの解決方法

現在ReactのStorybook 6.5.16を使用!
Typescriptをバージョン5.0.2にアップグレードした後、storybookを起動すると、以下のエラーが発生しました。
```bash
typescript_1.default.createIdentifier is not a function
```

# 解決策
## package.jsonの変更
package.jsonに以下の2点を書き加えることでエラーの解消ができる。
```json
  "scripts": {
    "build-storybook": "cross-env NODE_OPTIONS=--openssl-legacy-provider build-storybook"
  }

  "resolutions": {
    "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.cd77847.0"
  }

```
package.jsonに書き加えることでエラーの解消ができる。
私は、上の2点を書き加えnode_moduleを削除後、yarn installを行い、runすると治りました。
VBAソースを VBACコマンドでインポート・エクスポートする方法 

https://webbibouroku.com/Blog/Article/vbac

準備

VBACのダウンロード
Releases · vbaidiot/Ariawase · GitHub
https://github.com/vbaidiot/Ariawase/releases


以下のディレクトリ構造を作成し、binフォルダに対象のマクロファイルを設置する
```
workディレクトリ
  ├── bin
  │   └── 対象.xlsm
  ├── src
  │   └── ...
  ├── vbac.wsf
  └── .gitignore
```

CMD
・カレントディレクトリの変更
cd workディレクトリ

・ソースのエクスポート
cscript //nologo vbac.wsf decombine

・ソースのインポート
cscript //nologo vbac.wsf combine
【Rails】ローカル環境でmysql.sockがないと言われた

解決に割と時間がかかったので備忘録として残します。

## 状況
Docker環境でRailsを起動した後、ブラウザからocalhost:3000にアクセスすると
`Can't connect to local MySQL server through socket '~/mysqld/mysqld.sock' (2)`
というエラーが出る。

## 確認したこと・試したこと
- コンテナは起動しているか→`docker-compose ps`で確認。動いていた
- MySQLが動いているか→`mysql -u root -p`で入れたので正常に動いていそう
- イメージやボリュームを全削除してコンテナを再度作る→変わらず

いっぱいググってみたがそれっぽい解決方法がなかなか見つからず苦戦。
てかmysql.sockってなんだってのが全然わからず困った。

## 解決方法
探しに行っている場所にmysql.sockがないようなので、
とりあえずそのファイルが今どこにあるか探そうという方針で調べるキーワードを変えてみた。

結果、１つの記事に出会って解決しました。

1. `mysql_config --socket` コマンドを使いmysql.sockの場所を特定する
2. database.ymlにmysql.sockのある場所を指定する
```yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  port: <%= ENV.fetch("DATABASE_PORT") {3306} %>
  username: <%= ENV.fetch("MYSQL_USERNAME", "root") %>
  password: <%= ENV["MYSQL_ROOT_PASSWORD"] %>
  host: db
  socket: /tmp/mysql.sock
```

エラー文をしっかり読むことに加えて、何が問われているかを冷静になって考えなきゃなぁと反省です。


## 参考
https://totutotu.hatenablog.com/entry/2015/04/06/%E3%80%90Rails%E3%80%91%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%9B%E3%82%B9%E3%83%88%E3%81%A7mysql.sock%E3%81%8C%E3%81%AA%E3%81%84%E3%81%A3%E3%81%A6%E3%82%A8%E3%83%A9%E3%83%BC
Lambda 関数 URLの使い道について考えてみる

Lambda関数URLの使い道について考えてみます。

と言っても2つしか思いつきませんでしたが...

* WebAPIとしての利用
    * API GateWayを使用せずに直接Lambdaを呼び出す
        * Lambda関数URLの認証タイプでAWS_IAMを使い、CloudFront経由にアクセスを絞る
            * CloudFrontではWAFを使えるので、Lambda関数URLを安全に使うことができる
            * 実装方法は以下の記事参照

https://it.kensan.net/lambda-function-url-safety.html

* 非同期処理としての利用
    * Lambdaに非同期処理を実装しておく
        * ECS/EC2などのWEBサーバで発生した非同期処理はLambdaで実行するようにしておく
            * Lambda関数URLの認証タイプでAWS_IAMにしておき、WEBサーバ以外のリクエストは受ける気ないようにしておく
AWS初心者がwebアプリケーションのインフラを構築する part1 VPC編~セキュリティグループ作成

## 概要
AWS全然触ったこと無い初心者が一般的なwebアプリケーションのインフラを構築する手順をメモしながら思ったことなどを記載していく記事

## 対象
AWS初心者
これからインフラの構築をする人

## 作るもの
2つのAZにパブリック/プライベートのサブネットを1こずつ作る
ALB/WEB/DBのセキュリティポリシーを作成

## 手順
### VPCの作成
VPCの作成ページに遷移し、
![スクリーンショット 2023-03-21 15.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/70eb8c10-77f7-78fe-f298-ecaba2acbaf6.png)


下記の部分の設定を変更
- NATゲートウェイ: AZごとに1つ
- VPCエンドポイント: なし

![スクリーンショット 2023-03-21 15.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/cb9771d0-2312-0fd7-9c4b-c662353bf24b.png)
「作成」
以上！！

### セキュリティグループの作成
作成するのは下記の3つ
- ALB用のセキュリティグループ
- Web用のセキュリティグループ
- DB用のセキュリティグループ

#### ALB用のセキュリティグループ
HTTPを選択し、IP4すべてのものを選択する。
![スクリーンショット 2023-03-21 16.11.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/d74cef87-1d40-2f27-489f-bd428d9f9ea5.png)

#### Web用のセキュリティグループ
HTTPを選択し、カスタムの右から先程のALB用のセキュリティグループを選択する。
![スクリーンショット 2023-03-21 16.13.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/da561c70-d446-6b59-1a8a-8bfd759ae265.png)

#### DB用のセキュリティグループ
MySQL/Auroraを選択し、カスタムの右から先程のWeb用のセキュリティグループを選択する。

![スクリーンショット 2023-03-21 16.15.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/35572027-a40d-fabd-468a-a8a2a7c3f247.png)



次回、DB作成編
Amazon Linux 2023のEC2にrubyをインストールすると/tmpディレクトリの容量不足でエラー

タイトルの通り。自分用メモです。
みんな大好き無料枠有りのt2.micro等のインスタンスだと発生するのかなと。


https://github.com/rbenv/ruby-build/wiki#fedora
こちらのfedoraの項目を参考に追加のパッケージを入れておく
```
$ sudo dnf install -y gcc rust patch make bzip2 openssl-devel libyaml-devel libffi-devel readline-devel zlib-devel gdbm-devel ncurses-devel
```


次に、この辺りの記事を参考にrbenvでrubyをインストールしようとする。
https://qiita.com/rubytomato@github/items/44eb173c0111283a418c
https://zenn.dev/mizko/scraps/af319aac43bbe7

```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source .bash_profile

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install 3.1.2
```

すると以下のようなエラーがでる。

```
...
make[2]: ディレクトリ '/tmp/ruby-build.20230321153853.110799.qIoBYR/ruby-3.1.2/ext/pathname' に入ります
compiling pathname.c
/tmp/ccs7E0Gt.s: Assembler messages:
/tmp/ccs7E0Gt.s: Fatal error: can't write 3887 bytes to section .debug_str of pathname.o: 'デバイスに空き領域がありません'
/tmp/ccs7E0Gt.s: Fatal error: pathname.o: デバイスに空き領域がありません
```

ディスク容量を確認してみる。

```
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         4.0M     0  4.0M    0% /dev
tmpfs            482M     0  482M    0% /dev/shm
tmpfs            193M  2.8M  190M    2% /run
/dev/xvda1        30G  4.3G   26G   15% /
tmpfs            482M  480M  2.6M  100% /tmp
tmpfs             97M     0   97M    0% /run/user/1000
```

はい、`/tmp`が100%。
この時点で軽く舌打ちしときます。

ちなみにruby-buildは/tmp配下にログ出力するみたいです。

https://qiita.com/kanna/items/0851e136e12f1d52ff08

神様、ありがとうございます！

```
$ TMPDIR="${PWD}/tmp" rbenv install 3.1.2
```

これで通りました。

```
$ rbenv rehash
$ rbenv global 3.1.2
$ ruby -v
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-linux]
```

# まとめ

これで行きましょう。

```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source .bash_profile
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ TMPDIR="${PWD}/tmp" rbenv install 3.1.2
$ rbenv rehash
$ rbenv global 3.1.2
$ ruby -v
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-linux]
```
VSCode で Markdown ドキュメントを書くための拡張

- PDF/紙出力の技術同人誌を作る
- GitHub のドキュメント作成

の用途のために、VSCode を使って Markdown 文書を作っています。

 「VSCode で数式や図の入った小冊子をつくる」
https://qiita.com/nanbuwks/items/56dad2c4d6a640f550e2

などで紹介したようにVSCode に拡張をインストールしていますが、

この記事では Markdown ドキュメントを書くためにインストールした拡張をリストアップします。

# インストールしたもの


以下のものをインストールしています。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/391c9eca-8241-8daf-15ea-d268eeedad7d.png)

# それぞれの用途

## Excel to Markdown table

Markdown で表を使いやすく扱うため

## Markdown Image

画像ファイルをドラッグ&ドロップで貼り付けるために

## Markdown All in One

目次作成のためにインストールしています。

## Markdown PDF

PDFで小冊子を作るため


# Up to date

適宜、改訂していきます。
NCMBの会員情報に後からメールアドレスを紐付ける

NCMBには様々な認証方法が用意されています。

- ID/パスワード認証
- メールアドレス/パスワード認証
- ソーシャル認証（Twitter、Facebook、Google、Apple）
- 匿名認証

それぞれの認証は独立して利用することもできますが、組み合わせもできます。特にID/パスワード認証は、パスワードを忘れた場合の復旧方法がそのままでは存在しないので、注意が必要です。

そこで、ID認証や匿名認証向けに後からメールアドレスを紐付ける方法を紹介します。

## ユーザー登録

ユーザー登録処理は以下のようになります。これはJavaScript SDKですが、その他のSDKでもおおむね同じようなコードです。

```jsx
//　userインスタンスの生成
var user = new ncmb.User();
// ユーザー名・パスワードを設定
user.set("userName", "Yamada Tarou") /* ユーザー名 */
    .set("password", "password") /* パスワード */
    .set("phone_number", "090-1234-5678"); /* 任意フィールドも追加可能 */
// ユーザーの新規登録処理
try 
  await user.signUpByAccount();
} catch (e) {
  // ユーザー登録失敗
}
```

そして、さらにログインを行います。

```jsx
try {
  await ncmb.User.login("Yamada Tarou", "password");
} catch (e) {
  // ログイン失敗
}
```

匿名認証は次の1行で完了します。

```jsx
try {
	await ncmb.User.loginAsAnonymous();
} catch (e) {
  // 匿名認証失敗
}
```

## ログインユーザー情報

ログインしているユーザーの情報は、以下にて取得できます。ログインしていない場合は `null` になります。これはID認証、匿名認証どちらも同じです。

```jsx
const user = ncmb.User.getCurrentUser();
```

## メールアドレスの紐付け

ではここからメールアドレスを紐付けます。設定するのは `mailAddress` カラムになります。

```jsx
try {
  await user
    .set('mailAddress', 'user@ncmb.jp')
    .update();
} catch (e) {
  // 更新失敗
}
```

こうすると、指定したメールアドレス宛に確認メールが送られます。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/18446821-0c46-5c18-b363-3e1478809323.png)


そしてURLをクリックすると、メールアドレスが確定します。

![Untitled.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/ef1f1853-d89c-ec06-0595-02d520a77843.jpeg)


## メールテンプレートについて

メールの文面は管理画面で自由に変更できます。 `アプリ設定 > 会員認証設定 > メールアドレスの確認文面` を変更してください。

![Untitled 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/3f4a8d88-ad07-ee6a-207e-465b98edc38c.png)


## メール送信設定について

デフォルトではメールを送信する設定になっていないので、 `アプリ設定 > 会員認証設定 > メール設定` にて確認メールの送信を **送信する** に設定してください。

![Untitled 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/ea961e60-cdd7-25ed-ce35-517a5b0f6b27.png)


## まとめ

メールアドレスを紐付けておけば、万一パスワードが分からなくなっても再度設定できます。ID認証を使っている場合には忘れずに設定しましょう。もちろんソーシャル認証を使っている場合でも、メールアドレスは紐付けられます。必要に応じて利用してください。

[mBaaSでサーバー開発不要！ | ニフクラ mobile backend](https://mbaas.nifcloud.com/)
terraformでRDSを作成する

# 作成するRDSの構造
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280858/bd45abf0-a09c-d979-6f23-d350b270e179.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280858/aef9bf46-8d44-ff76-d072-99856c85f585.png)


# パラメータグループ
```rds.tf
# ---------------------------------------------
# RDS parameter group
# ---------------------------------------------
resource "aws_db_parameter_group" "mysql_standalone_parametergroup" {
  name   = "${var.project}-${var.environment}-mysql-standalone-parametergroup"
  family = "mysql8.0"

  parameter {
    name  = "character_set_database"
    value = "utf8mb4"
  }

  parameter {
    name  = "character_set_server"
    value = "utf8mb4"
  }
}


```
terraform apply -autoapprove
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280858/86ed96f3-7fee-1613-b21e-0ae385730435.png)

# オプショングループ
※今回は空のオプショングループを作成
```rds.tf
# ---------------------------------------------
# RDS option group
# ---------------------------------------------
resource "aws_db_option_group" "mysql_standalone_optiongroup" {
  name   = "${var.project}-${var.environment}-mysql-standalone-optiongroup"
  engine_name = "mysql"
  major_engine_version = "8.0"
}


```
terraform apply -autoapprove
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280858/736d63c0-694c-13ac-23c1-840b59ad0bd3.png)

#  サブネットグループ
RDSを展開する先を設定する
```rds.tf
# ---------------------------------------------
# RDS subnet group
# ---------------------------------------------
resource "aws_db_subnet_group" "mysql_standalone_subnetgroup" {
  name       = "${var.project}-${var.environment}-mysql-standalone-subnetgroup"
  subnet_ids = [aws_subnet.private_subnet_1a.id, aws_subnet.private_subnet_1c.id]
  tags = {
    Name    = "${var.project}-${var.environment}-mysql-standalone-subnetgroup"
    Project = var.project
    Env     = var.environment
  }
}


```
terraform apply -autoapprove
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280858/058de885-0595-cd5f-7d49-70b075be441d.png)

# RDS作成

## 基本設定
|項目  |型  |説明  |
|---|---|---|
|engine  |string  | データベースエンジン |
|engine_version  |string  |データベースエンジンのバージョン  |
|identifier  |string  |RDSインスタンスリソース名  |
|instance_class  |string  |インスタンスタイプ  |
|username  |string  |マスターDBのユーザー名  |
|password  |string  |マスターDBのパスワード  |
|tags  |object  |タグ  |

## ストレージ
|項目  |型  |説明  |
|---|---|---|
|allocated_storage  |string  | 割り当てるストレージサイズ（ギガバイト） |
|max_allcated_storage  |string  |オートスケールさせる最大ストレージサイズ  |
|storage_type  |enum  |"standard","gp2","io1"  |
|storage_encrypted  |string  |DBを暗号化するKMS鍵IDまたはfalse  |

他にも設定は膨大にある。疲れたので割愛（ネットワーク、DB設定、etc...）

resourceクラスを作って同じように対応
ちなみにRDSインスタンス立ち上げはめちゃくちゃ時間かかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280858/a92a3770-ca7f-1f75-40c6-d84c221d4366.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2280858/780070c0-1c6b-f4b6-9f33-9ef916cbeeaa.png)
EC2にIAM roleの付与なしでSysmtemManagerを使ってみた

<h2>背景</h2>
AWSでSSMを用いてEC2にSSH接続したり、パッチ適用する際によく利用されるSytesm Managerに関連する機能が更新されました。<br>
更新により、EC2 roleへの設定が不要になりました。<br>
<font color=green>System Managerの設定用に共通の一つ作成は必須です。</font><br>
どんな記事にしようか考えている間にClassmethod様が続々と記事投稿されてしまいましたので。。。<br>
自身の備忘録として投稿します。<br>

<h2>参考</h2>

+ [AWS Systems Manager をアカウント内すべての EC2 インスタンスにおいてデフォルトで有効にする新機能が登場](https://aws.amazon.com/jp/about-aws/whats-new/2023/02/enable-aws-systems-manager-default-all-ec2-instances-account/ "AWS Systems Manager をアカウント内すべての EC2 インスタンスにおいてデフォルトで有効にする新機能が登場")
+ [[アップデート] EC2インスタンスに対しデフォルトでSSMを有効にするDefault Host Management Configurationが追加されました](https://dev.classmethod.jp/articles/aws-systems-manager-supports-default-host-management-configuration/ "[アップデート] EC2インスタンスに対しデフォルトでSSMを有効にするDefault Host Management Configurationが追加されました")


<h2>大まかな流れ</h2>

+ IAM role作成
+ DHMC設定変更
+ EC2の起動
+ System ManagerでSSH接続をできることを確認 

<h2>手順の流れ</h2>

<h3>IAM role作成</<h3>

新規にIAM role作成します。
IAM→IAMロールを作成　と遷移します。
AWSが提供する<i>AmazonSSMManagedEC2InstanceDefaultPolicy</i>を利用します。<br>
プリンシパルタイプとして<i>ssm.amazonaws.com</i>を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3280715/d70f1fde-69d9-fcaf-af49-7793ab6ba301.png)
DHMC設定を変更します。
<font color=green>変更が反映されるのに30分程度時間を要するとありますが、私の環境も大体30分ぐらいかかりました。</font><br>

System Manager→フリートマネージャー→設定→アカウント管理
チェックボックスにチェックを入れ、設定の変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3280715/3ccaa1e9-9c7b-befc-2307-703ff4ad12ba.png)

前手順で作成したIAMロールを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3280715/0d5708b5-f73a-281f-1669-608d1c47eb1b.png)

EC2の起動
SSM AgentはVer.3.2.582.0以上という要件を満たす必要があります。
この記事執筆時点では、Amazon Linux2のAMI版は最新化されていない為、
EC2起動時にメタデータで最新化をさせます。

System ManagerでSSH接続をできることを確認
ここまでで、EC2にSSMのロールを設定せずにSSMの各操作ができるようになります。
一般的なSSMを用いたSSH接続から確認します。
EC2→対象のインスタンスにチェック→接続→セッションマネージャー→接続

見慣れた画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3280715/759c03f8-126c-dc8a-906f-cb13be918f3b.png)
Fortigate Client VPNで安価にSMS 2FAを実装する

## [初めに]
FortigateでClient VPN接続やってますか？
今時ですと、2FA(2要素認証)ないと心配・・ということもあり、なるべくお安く実装してみようと思います。

FortigateでVPN 2FAを実現する場合、一般的には以下のような方法があると思います。

・Fortitokenを購入する(初期費用+年間サブスク)
・メールでのトークン受け取り
・SMSでのトークン受け取り

そこそこの規模の企業ですと、Fortitokenも難なく予算が付きそうですが、そうでもない規模の場合はなかなか2FAに手が付けられないことがあります。
個人的には、Authenticatorとかでやりたくもありますが、大掛かりになるのとコストが見合うのかよくわららなかったので、SMS受け取りを実現したいです。

で、調べたのですが正攻法でSMS飛ばすためにはFortinetにサブスク払わなくちゃいかんらしく、やだな。。と。

その後、twillioで行けんぢゃね？と思ったのですが、どうもAPI中継するサーバ作らなくてはいけなそうなので、EC2とか立てる必要がありそうな・・。とかいうことで、これも没となりました。

極めて面倒くさがり屋なので、メールからSMSをhookしてくれりゃ良いんだよ・・と探して見つけたサービスがcm.comとかのwebsmsサービスです。探せばあるものですね。


## [実装方法]
結論から言えば、E-MAILでのトークン受け取りとwebsmsを組み合わせて実現します。

※前提※
・2FAではない状態でクライアントVPN接続設定が完了していること。
・FortigateにSMTPサーバを登録済みで、ログ・アラートなどの送信ができる状態であること。
・クライアントからの接続はSSL-VPN、IPsecVPNどちらでも大丈夫です。
・今回使用している機材は、Fortigate 50E(FortiOS 6.2)です。



## 1.websmsサービスにアカウント作成

今回はcm.comというところを選びました。
フリーメールのドメインはダメとありましたが、個人的にドメイン持っていましたのでそちらで
アカウント作成しました。お試し用に1$分デポジットされています。

SMS送信元になるメールアカウントを登録しておいてください。
また、メール経由でSMSが飛ぶことを事前に確認してください。

**<例>**
![cm-usersetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680315/28efcf1c-c83b-0d41-1227-7b49e4ff1e5f.png)



・cm.comのリンクはこちら
https://www.cm.com/ja-jp/

## 2.Fortigateにメール2FA設定を行います。
コンソールから以下のように設定してください。
※Fortigateのメール2FAはデフォルトではGUIで選べません。
　メールアドレスは適当でよいです。（後でGUIから修正できるので）
```
config user local
    edit "ユーザー名"
        set two-factor email
        set email-to "メールアドレス"
    next
end
```

## 3.ユーザのE-MAILアカウントアドレスをwebsmsの形式にして登録します。
cm.comの形式は以下。

**XXX(国コード)-電話番号(ハイフンなし)@mail-sms.com**

**<例>**
![usersetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680315/915bdf18-5e44-b2d4-4b75-f90cd649b331.png)

## 4.FortigateクライアントからVPN接続してみます。
### ①Forticlientから接続
![forti2FA-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680315/fe53f4da-c631-4d9b-fabd-c9845e0c7d34.png)

### ②SMSにトークンが届く
画像ではアメリカのSMS番号に来てますが、81(日本)にも届きます。

![Screenshot_20230321_143713_Messages.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680315/b0aa40b1-6429-b7c0-8ffc-1b9d0a586446.jpeg)


### ③Forticlientにトークン入力テキストボックスが表示されるので入力
![forti2FA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680315/d3096f89-e753-b5bb-f2c2-c4118d7d29e2.png)


### ④接続完了
![forti2FA-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680315/b6159e32-4bf9-9746-32d4-ec617e2a36a4.png)

### ⑤Enjoy!

## [まとめ]
・自宅のFortigateにVPNしたい！という要件を格安で実現できました。
・小規模な事業所なら、これで簡単にVPN-2FAできます。
・お財布にも優しい。

一回につき$0.0089(1.2円 2023/3/12時点)です。
お試しアカウントでも80回は使用できますw
企業でも20名くらいであれば、まあまあ安いのではないでしょうか。
※1日3回接続として、20名x3回x20日=1200回/月
  1200回x1.2円=1,440円/月
  年間の場合は、1,440円x12か月=17,280円

Fortitokenは今だと、初期＋ランニング（年間）でン十万円ですので。。

内容におかしなところがあれば、直しますのでお知らせくださいませ。
Canon MF642C/644C使用時に用紙サイズの変更がマニュアルである件について

# 環境 
- Mac mini(2023)
- Apple M2 Pro
- macOS 13.2.1 (22D68)


# 起こっている問題 
タイトルの通り、現在のドライバでは用紙サイズが「Others」となってしまい、印刷を行うごとに、マニュアルで選択をする必要があり、面倒臭い...。

# 解決策
1. 一度、プリンタを削除し、再度プリンタの追加を行う。
2. その際に、ドライバを以下のように選択する。
- ×：Canon MF642/643C/644C
- ○：Canon MF642/644C JP

これまでは、上のものを使用していたため、用紙サイズがうまく設定できなかったが、ドライバを変更してからうまく行くようになった。
【Git】mergeのやり方

# mergeとは

現在使用しているブランチに指定したブランチを取り込むこと。

# mergeのやり方

mainのブランチに切り替え
```
git checkout main
```

merge(取り込みたいブランチ名)
```
git merge (取り込みたいブランチ名)
```
Rails Heroku デプロイ エラー ①

<h1>Rails Heroku デプロイ エラー</h1>
デプロイ時、修正してはエラーを３回したので、その解決策をまとめます。

<h3>①インストールしようとしているRubyのバージョンは、このスタックに存在しません。とエラー内容は下記</h3>

    ! The Ruby version you are trying to install does not exist on this stack.
    !
    ! You are trying to install ruby-2.6.5 on heroku-22.
    !
    ! Ruby ruby-2.6.5 is present on the following stacks:
    !
    ! - heroku-18

○解決策
herokuのstackを18に変更
そうしたことで、このエラーを対処することができました。

https://qiita.com/WakameSun/items/fadd77eae7d9a4642a7d
この記事を参考にエラー解消

<h3>②続いて、第二のエラー　下記のエラーメッセージ😭</h3>

     Running: BUNDLE_WITHOUT='development:test' BUNDLE_PATH=vendor/bundle BUNDLE_BIN=vendor/bundle/bin BUNDLE_DEPLOYMENT=1 bundle install -j4
           Your bundle only supports platforms ["x86_64-darwin-22"] but your local platform
           is x86_64-linux. Add the current platform to the lockfile with
           `bundle lock --add-platform x86_64-linux` and try again.

○解決策
エラー分の中に、これを→bundle lock --add-platform x86_64-linux
実行してと書いてある！

下記を参考にしながら解決
https://zenn.dev/bon_saurus/articles/18de5c75a7bf85

<h3>③最後に難関だったエラー</h3>


    warning " > webpack-dev-server@3.11.0" has unmet peer dependency
    "webpack@^4.0.0 || ^5.0.0".
    warning "webpack-dev-server > webpack-dev-middleware@3.7.2" has unmet peer dependency "webpack@^4.0.0".
    [4/4] Building fresh packages...
    error /tmp/build_4354b829/node_modules/node-sass: Command failed.

長いログの中から、原因を探すのに一苦労💦

assetsのprecompileがfailしたからエラーが出ていますが、その前にnode-sassの記述があるので、node-sassが原因の可能性がある（断定はできないが）、と考えます。
それを前提に前のログの中に、node-sass: Commad Failedになっていてnode-sassのコマンド実行に失敗していることがエラーの原因
なので、仮説は妥当と考え、検証に進みました。

○解決策
node-sassのバージョンがnodeのバージョンと合っていないのが原因

下記サイトを参考に解決
https://zenn.dev/kantafukazawa/articles/f61f2f714c43a3

初めてのデプロイするのに一苦労でした💦

○結論
エラーの原因は、ログの中に書かれている！！
Dockerで遊んで、Docker構築を身近なものにする!

## 経緯
Dockerは、様々な開発現場で使われるが
初期メンバーが設定後、ほとんど触ることがない。

環境構築という大きな障害を取り払えてるのでいいことだと思う。

ただ、Dockerの学習コストや、開発言語の学習が優先されることが多いので
Dockerの学習が後回しになりがちになっていると思う。

なので、Docker学習の第一歩として簡単に環境構築が出来る成功体験を積むことができれば
Dockerへの学習への意欲が沸くのではと思い記載します。

## Dockerで作成するもの
![134461368-b513322c-e470-42fe-a281-fca4242a4aa5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701305/65398cb7-66d9-9d08-584d-f1e1a416a68a.png)

「Reichat」というおえかきチャット。
ワコムのペンタブレットに対応しているらしい
複数人で同じ画面に絵を描くことが可能



## 環境構築手順
dockerのコマンドなどは後回しでコピペでOKです。
興味出たらぜひ、Dockerの学習してみてください

mac環境で作成してます。
Docker Desktopはインストール前提です

(1) 適当なディレクトリを作成。私の場合は、「Docker_test」

(2) Dockerfileを作成する。
cdコマンドで、 「Docker_test」ディレクトリに移動
touchコマンドで「Dockerfile」作成
vimで記述

```
FROM node
RUN npm install -g reichat
EXPOSE 10133
CMD reichat
```

(3)docker-composeを作成する
touchコマンドで「Dockerfile」作成
vimで記述

```
# docker-composeのバージョン
version: "3" 

services:
  # コンテナの作成
  reichat:
    container_name: 'reichat'
    # このコンテナで使用するDockerイメージの指定
    build:
      context: . 
      dockerfile: "./Dockerfile"
    # ホスト側のポート:コンテナ側のポートを指定
    ports:
      - "10133:10133"
```

ここまでのディレクトリの状態

![スクリーンショット 2023-03-21 15.26.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701305/55659a20-652f-d5f1-5f80-bb06d3b1ce6b.png)


(4)dockerのコマンドを叩く

```
docker-compose up -d 
```

（5） ブラウザを開いて
　http://localhost:10133/
　にアクセス

これが出てくればOK！
名前を入れて入室してください。
![スクリーンショット 2023-03-21 15.14.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701305/6cd8a3cc-f77f-51bf-0e76-15a5f99d1d26.png)


完成！！
（ゲンガー描いてみました。....いや、フリーハンドだし？タッチパッドだし？）

![スクリーンショット 2023-03-21 15.17.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701305/02ba8750-9013-6cdc-d747-b87b7a5d1948.png)

(6) dockerを止める

```
docker-compose down
```

## はまりポイント
### アクセスできない

```
docker-compose ps
```

でstateを確認してみてください。
stateが「Exit」になっていたら、環境構築に失敗してます。
![スクリーンショット 2023-03-21 15.30.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701305/5dea25dc-f076-368d-1a30-41752fb14c8e.png)

```
docker-compose logs
```
でエラー内容を確認して、google先生に聞いてみましょう！


### nodeのバージョンが古い
Dockerfileのこの部分で、nodeをインストールしているのですが、
```
FROM node:1.1.1
```
みたいにバージョンを指定している場合、古い可能性があります。

自分の場合は、古かったのでバージョン指定を消しました。

Dockerfileのバージョンを変えた場合は、imagesファイルというものを一回消してから再度構築した方がいいです。
なので、

```
docker-compose down --rmi local -v 
```
[参考URL]
https://blog.ryou103.com/post/docker-compose-down/

で綺麗にして、

```
docker-compose up -d 
```
で再構築！

### docker-compose.ymlファイルの書き方が間違っている
インデントがずれていないかよく確認すること！

あと、context: .の記述が漏れているとbuildが通らないこともあるので注意
```
    build:
      context: . 
```
[参考]
https://itenblog.com/docker-compose-up%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC/


## まとめ
コピペだけで簡単に環境構築できた！！！....と思ってます。

これを機会にdockerに興味を持っていただければ幸いです。
これでお絵描きクイズとかしてください。

## 参考URL
本記事を書くきっかけ
https://qiita.com/y_hokkey/items/406b5a8c4bc15354d069#reichat

公式サイト
https://github.com/kanreisa/reichat

dockerの基礎の基礎
https://zenn.dev/naoyuki42/articles/ae215286ba92b2
[備忘録] windows11 システム環境変数の設定に複数のPathを追加する

環境: win11
複数Pathの追加で詰まったので備忘録

## 結論
セミコロン(;)で区切ると複数追加できる

```:example
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261812/877a6027-e923-5da6-949d-c657cc428883.png)


## （詳細）システム環境変数の設定に複数のPathを追加する方法

1.Windows ロゴ キーを押下
2.システム環境変数の変更を検索、以下の画面が出てくる

:::note warn
私のOS言語設定が英語なので、英語になっています
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261812/c49e3f71-0bf4-ce2e-9298-116e2745bfda.png)

3.環境変数(Environment Variables)を押下
4.変更したいpath名を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261812/aaa90efb-62a6-ed71-35a8-29c0c75d9f31.png)


5.編集したいパス名を選択し、edit押下。新たに作成したい場合はNew押下
6.**セミコロン(;)で区切り、値を追加する**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261812/a0acfd46-518b-733c-b7d6-7566bdbf970c.png)
Android studio 画像の入れ方

### 画像ファイルをインポートする

1.左側のサイドバー　リソースマネージャータブ　を選択
2.Drawableタブ　を選択
3.＋　から　Drawableのインポート　　ファイルを選択
参考サイト：https://zenn.dev/chiii/articles/43863a6fa21aa3
### xmlに画像を挿入する
```
<ImageView
        android:layout_width="１００dp"
        android:layout_height="150dp"
        android:src="@drawable/{drawableに表示されている画像名をここに入力}"
 />
```
python maya cleanup scene

```python
import maya.mel as mel
mel.eval('deleteInvalidNurbs(0)')
mel.eval('deleteUnusedCommon_Multi({"stitchSrf","rebuildSurface","insertKnotSurface","avgNurbsSurfacePoints"}, 0, (uiRes("m_cleanUpScene.kDeletingUnusedPointConstraints")))')
mel.eval('deleteUnusedInUnusedHierarchy("nurbsCurve", 0, (uiRes("m_cleanUpScene.kDeletingUnusedNurbsCurves2")))')
mel.eval('deleteUnusedLocators()')
mel.eval('deleteUnusedConstraints()')
mel.eval('deleteUnusedPairBlends()')
mel.eval('deleteUnusedDeformers()')
mel.eval('removeAllUnusedSkinInfs()')
mel.eval('deleteUnusedCommon_Multi({"stitchSrf","rebuildSurface","insertKnotSurface","avgNurbsSurfacePoints"}, 0, (uiRes("m_cleanUpScene.kRemovingInvalid")))')
mel.eval('deleteUnusedCommon( "groupId", 0, '
         '(uiRes("m_cleanUpScene.kDeletingUnusedGroupIDNodes2")) )')
mel.eval('deleteUnusedCommon("animCurve", 0, '
         '(uiRes("m_cleanUpScene.kDeletingUnusedAnimationCurves2")))')
mel.eval('deleteUnusedCommon("snapshot", 1, '
         '(uiRes("m_cleanUpScene.kDeletingUnusedSnapshotNodes2")))')
mel.eval('deleteUnusedCommon_Multi({"unitConversion","timeToUnitConversion","unitToTimeConversion"}, '
         '1, (uiRes("m_cleanUpScene.kDeletingUnusedUnitConversionNodes2")))')
mel.eval('MLdeleteUnused()')
mel.eval('clearCache -allNodes')
mel.eval('deleteEmptyGroups()')
mel.eval('deleteEmptyLayers("Display")')
mel.eval('deleteEmptyLayers("Render")')
mel.eval('deleteUnusedSets()')
mel.eval('deleteUnusedCommon("partition", 0, (uiRes("m_cleanUpScene.kDeletingEmptyPartitions2")))')
mel.eval('RNdeleteUnused()')
mel.eval('deleteUnusedBrushes()')
mel.eval('deleteUnknownNodes()')
mel.eval('removeDuplicateShadingNetworks(0)')
```
プログラミング言語Javaの日本における登録商標はJAVAみたいの件で改めて考察する

# はじめに

普段なにげなく実装に使っているプログラミング言語Java。実装としてソースコードを書いている分にはあまり問題になりませんが、Qiitaのようなところやテクニカルブログとかで、プログラミング言語名としてJavaを表記するとき、JAVAと書くのはクールじゃないらしいというお話です。すみません、はじめに謝っておきます。Javaが大好きな方はJAVAと書かれるのはいやなのかもしれません。私にはこだわりがないので、よくわかりません。

# クールじゃない理由

推定ですが、Yahoo知恵袋の「『JAVA』の表記について」というQに対して、
>Javaが正しい。JAVAはJavaが出来ない人が求人するときに使う誤表記です。

というAがベストアンサーになっているせい？

まっとうなアンサーとして
>商標は「JAVA」として登録されています。従いまして「JAVA」とは、「Java」や「java」のスーパークラスだと考えられます。

というのがありますが、Yahoo知恵袋のベストアンサーはYahooユーザーの多数決なので、こちらはそのようには評価されなかったようです。

# 登録商標の再確認結果

特許情報プラットフォームJ-PlatPatでの検索結果です。
商標登録4136807
商標登録4108642

商標(検索用)：ＪＡＶＡ
(561)称呼（参考情報）：ジャワ，ジャバ
(732)権利者 氏名又は名称：オラクル　アメリカ，インコーポレーテッド
住所又は居所：アメリカ合衆国

右側の文字イメージは商標によっては大文字小文字混在の場合がありますが、商標登録4136807、4108642の場合は大文字からなるJAVAでした。

参考に某飲料メーカさんのおちゃは
商標(検索用)：ｊＡＶＡ＼ＴＥＡ
で、右側の文字イメージはAの横棒なしでJは小文字でした。

# この調査をしていたときのBingさんの割り込み

>Java言語の表記は、一般的には「Java」（最初だけ大文字）とします。これは、Javaの命名規則に従っています。ただし、「java」（全て小文字）は、ファイル名やコマンド名として使われることがあります。また、「JAVA」（全て大文字）は、正式な表記ではありませんが、強調したいときや見やすくしたいときに使われることがあります。

登録商標がJAVAなのに「『JAVA』（全て大文字）は、正式な表記ではありません」とはどういうことなのだろう。
「これは、Javaの命名規則に従っています。」これはアッパーキャメルのことを言っているのだろうか？C#はけっこう関数名にアッパーキャメルを勧告してきますが、javaはローワーキャメルの関数名・変数名も許容している気がします。


Yahoo知恵袋の質問者のベストアンサーへのお礼コメントに
>公式ドキュメントではほとんど「Java」表記です。（リンク引用）以上から、私は「Java」が正しい表記だと考えます。

と結論づけられているようです。

同じく、商標は「JAVA」ですよのアンサーへのお礼コメントに、以前は日本語WikipediaのJavaの記事にJAVA表記は誤りという記述があり、英語記事にはそのようなことはないと書かれて、「JAVA」が正しくないという認識も取り下げられていらっしゃるようです。


# おわりに

「正しい表記」の定義によると思われますが、たしかに公式ドキュメントでは確認できる範囲では「Java」表記のようです。サン・マイクロシステムズ時代の日本語もそうだったのかどうかはわかりませんが、英語で書くと文の先頭は大文字または固有名詞は先頭大文字ルールからするとプログラミング言語名「Java」が出現すると必然的に「Java」となるような気がします。全部大文字の英文というのはあまりないので、テキスト上はそのまま英字を使うと「Java」となっているような気もします。

また、現在のOracleのロゴ入りのJavaのロゴは「Java」なので、ロゴとしては「Java」が正解ということを退けるものではないですが、登録商標として「Java」と「JAVA」が別物となってしまうと同じ産業分野で「JAVA」の商標が通ってしまうので、「Java」と「JAVA」は併記可能なくらいが妥当な気がします。
アロー関数でコンストラクタを書いたら「TypeError: HogeClass is not a constructor」と言われてしまった件

#### 現象
- これは、問題なくインスタンスすることができる。
```javascript
const TestClass = function (className) {
  this.className = className;
};
new TestClass('hogehoge');
```
- コンストラクタをアロー関数に変更するとエラーとなる。
```javascript
const TestClass = className => {
  this.className = className;
};
new TestClass('hogehoge'); // TypeError: TestClass is not a constructor
```

### 理由
- コンストラクタは、アロー関数で書くことができない。
    - そもそも、アロー関数の`this`は宣言された時点での`this`になる。
【Rails】クリックごとに昇順・降順を切り替えるソート機能

タスク一覧表示の画面に、クリックごとに昇順・降順を切り替えるソート機能を実装したので備忘録。

![ソート機能.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208065/3b2b2c10-9836-4773-c0bb-2c7746074d78.gif)


## 元のソースコード
ソート機能を実装する前のソースコードは下記の通り。

### ビュー

```erb:app/views/tasks/index.html.erb
<%# ソート機能を付けるテーブルのヘッダーのみ抜粋 %>
  <thead>
    <tr>
      <th></th>
      <th>タスク名</th>
      <th>済/未済</th>
      <th></th>
      <th>作成日時</th>
    </tr>
  </thead>
```

### コントローラー

```ruby:app/controllers/tasks_controller.rb
  # 一覧画面（ログイン中のユーザーのタスクのみ表示する）
  def index
    @tasks = Task.where(user_id: current_user.id)
  end
```

## ソート機能を追加したソースコード

### ビュー

```erb:app/views/tasks/index.html.erb
<%# ソート機能を付けるテーブルのヘッダーのみ抜粋 %>
  <thead>
    <tr>
      <th></th>
      <th>
        <%= link_to "タスク名", tasks_path(sort_column: 'title', sort_direction: @sort_column == 'title' && @sort_direction == 'desc' ? 'asc' : 'desc') %>
        <%= sort_icon('title') %>
      </th>
      <th>
        <%= link_to "済/未済 ", tasks_path(sort_column: 'finished', sort_direction: @sort_column == 'finished' && @sort_direction == 'desc' ? 'asc' : 'desc') %>
        <%= sort_icon('finished') %>
      </th>
      <th></th>
      <th>
        <%= link_to "作成日時", tasks_path(sort_column: 'created_at', sort_direction: @sort_column == 'created_at' && @sort_direction == 'desc' ? 'asc' : 'desc') %>
        <%= sort_icon('created_at') %>
      </th>
    </tr>
  </thead>
```

### ヘルパー

ヘルパーメソッドを定義して、アイコンの表示を共通化する。

```ruby:app/helpers/application_helper.rb
module ApplicationHelper
  def sort_icon(column)
    if @sort_column == column.to_s
      if @sort_direction == 'asc'
        content_tag(:i, '', class: 'fas fa-sort-up')
      else
        content_tag(:i, '', class: 'fas fa-sort-down')
      end
    end
  end
end
```

### コントローラー

privateメソッドの`sort_column`により、無効な値をクエリパラメータに指定された場合はデフォルトの並び替えを行うように制御する。

画面表示に引き継ぐ為、`@sort_column`と@`sort_direction`を定義する。

```ruby:app/controllers/tasks_controller.rb
  SORT_COLUMNS = %w[title finished created_at]
  DEFAULT_SORT_COLUMN = 'created_at'
  SORT_DIRECTIONS = %w[asc desc]
  DEFAULT_SORT_DIRECTION = 'desc'


  # 一覧画面（ログイン中のユーザーのタスクのみ表示する）
  def index
    @tasks = Task.where(user_id: @current_user.id).order("#{sort_column}")

    @sort_column = params[:sort_column]
    @sort_direction = params[:sort_direction]
  end


  private

  # ソートするカラムと順序の指定（無効な値の場合はデフォルト値を返す）
  def sort_column
    if SORT_COLUMNS.include?(params[:sort_column]) && SORT_DIRECTIONS.include?(params[:sort_direction])
      "#{params[:sort_column]} #{params[:sort_direction]}"
    else
      "#{DEFAULT_SORT_COLUMN} #{DEFAULT_SORT_DIRECTION}"
    end
  end
```
vue.jsで@clickのあとに勝手にでてくる$eventを消す

$eventを消すのが手こずった（日本語記事がみつからなかった)のでめも。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699982/44f0bcc9-c98b-5538-9930-1cf18f43b50c.png)

どうやら、拡張機能のvolarが原因のよう（volarの拡張機能をdisableにすると消えたため）

### 解決方法


/home/username/.config/Code/User/settings.json(拡張機能の設定などはここにかく）(linux, macの場合。）

  "volar.inlayHints.eventArgumentInInlineHandlers": false
この行を追加することで$eventを削除できる。

どなたかの役に立てれば幸いです。
「Next.js(React)で再生したい動画がMac(pcなど)では再生されるがiphone(スマホ)では再生されない場合の解決方法：ビデオ自動再生の実装と対処法」

# Next.jsで作成したビデオがMacでは再生されるがiOSでは再生されない場合の解決方法

Next.jsで作成したビデオがMacでは再生されるがiOSでは再生されない場合があります。この問題には、以下の解決策があります。

## autoPlayとplaysInline属性
videoタグにautoPlayとplaysInline属性を設定することで、iOSでも動画が再生されるようになります。ただし、SafariやChromeなど、iOSのブラウザは自動再生を許可していない場合があります。それでも動画が再生されない場合は、ユーザーアクション後に再生するようにする方法が最適な解決策となります。

```typescript

import { Box, Flex, Image, Text } from "@chakra-ui/react";//普通のreactでいい
import { useEffect, useRef } from "react";

const HeroImage = () => {
  const videoRef = useRef<HTMLVideoElement>(null);

  useEffect(() => {
    if (videoRef.current) {
      videoRef.current.play();
    }
  }, [videoRef]);

  return (
    <Box h="600px" bg="black">
      <video
        ref={videoRef}
        src="動画のurl"
        muted
        style={{ height: "100%", width: "100%" }}
        autoPlay
        playsInline
      />
    </Box>
  );
};

export default HeroImage;


```


## useEffect
useEffectフックを使って、ビデオが読み込まれてから自動再生を行うようにすることで、ビデオが正常に再生される確率が高くなります。これは、ビデオがまだ読み込まれていない状態で再生しようとすると、再生が失敗したり、再生中に中断したりする可能性があるためです。

また、ビデオが読み込まれた後に自動再生を行うことで、ビデオ再生のためのリソースを最適化することができます。ビデオを自動再生する前に、ブラウザがビデオファイルをダウンロードして、メモリに読み込むことができます。これにより、ビデオ再生中にブラウザがファイルをダウンロードする必要がなくなり、スムーズな再生が実現できます。

そのため、useEffectフックを使ってビデオの自動再生を行うことを推奨します。
以上の解決策を試して、iOSでビデオが再生されるようにしてください。
Hackerrankの英文レジュメ作成機能をご紹介します

Hackerrankで英文レジュメが作成できます。基本情報と職歴などを入力すればできるようです。以下の「Create a job winning resume」のタイトルの次にある「Create a resume」をクリックするとレジュメ作成の手順がはじまります。リンク先に必要事項を入力します。するとテンプレートに沿ったレジュメが作れるようです。![スクリーンショット (190).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291948/94cd5228-4970-0e8d-71c5-29d1a45d8cc6.png)