OmniAICreator/Qiita-1.07M huggingface dataset:
deviseを用いたRailsアプリケーションでsecret_keyの無効化と再生成方法

## 概要
秘密情報が公開されると、セキュリティ上大きなリスクとなります。今回は、公開した情報がdeviseの`secret_key`であった場合、以下にその無効化と新しいsecret_keyの生成方法を記述します。

## secret_keyとは
`secret_key`は、deviseが提供する設定の一つで、ランダムなトークンを生成する際に使用されます。具体的には、以下のような場面で使われます:

- ユーザー確認メールを送信する際の確認トークン生成
- パスワードリセットメールを送信する際のパスワードリセットトークン生成
- アカウントロック解除のためのトークン生成

これらの機能はすべて一定のセキュリティトークンを使用し、そのトークンの生成にはsecret_keyが使われます。したがって、もしsecret_keyが変わると、すでにデータベースに保存されているそれらのトークンはすべて無効になり、それに関連する機能（メール確認リンク、パスワードリセットリンクなど）は使えなくなります。

## secret_keyの重要性
secret_keyは非常に重要な情報であり、外部に公開すべきではありません。なぜなら、公開されたsecret_keyは悪意のある者によって不正に使われる可能性があるからです。具体的には、そのsecret_keyを使って偽のトークンを生成し、システムを欺く可能性があります。

## secret_keyの管理方法
セキュリティ上の理由から、secret_keyは一般的にソースコードから切り離して管理されます。ソースコードと一緒にsecret_keyを公開すると、セキュリティの問題が生じる可能性があるからです。

secret_keyの管理には通常、環境変数が使用されます。Railsアプリケーションの設定である`config/initializers/devise.rb`ファイル内で、以下のように設定します。

```ruby
config.secret_key = ENV['DEVISE_SECRET_KEY']
```
この設定により、secret_keyは環境変数DEVISE_SECRET_KEYから読み込まれます。この環境変数は、Railsアプリケーションが動作する環境（開発環境、テスト環境、本番環境など）で設定します。

## 具体的な無効化と再生成手順
### 手順1. 既存のsecret_keyを無効化する
まず、`config/initializers/devise.rb`内のsecret_key（`config.secret_key`）を無効化します。これは公開されてしまったsecret_keyが悪用されるリスクを最小限にするためです。

```Ruby
# config/initializers/devise.rb
Devise.setup do |config|
  # ...
  config.secret_key = nil
  # ...
end

```
上記コードではsecret_keyをnilに設定しています。これにより、現在のsecret_keyを無効化します。

### 手順2. 新しいsecret_keyを生成する
Railsアプリケーションで新しいsecret_keyを生成するためには、`rails secret`コマンドを使用します。ターミナルで以下のコマンドを実行します。
```zsh
$ rails secret
```
これによりランダムな長い文字列が生成されます。これが新しいsecret_keyです。

### 手順3. 新しいsecret_keyを安全に設定する
新しいsecret_keyは、直接コードに書くのではなく環境変数経由で設定します。これによりsecret_keyを安全に管理し、公開のリスクを避けることができます。

まず、環境変数に新しく生成したsecret_keyを設定します。環境によって設定方法は異なりますが、一例として.envファイルを使用する場合は次のようになります。
```zsh
# .env
DEVISE_SECRET_KEY=your_new_secret_key
```
次に、`config/initializers/devise.rb`を以下のように編集します。

```ruby
# config/initializers/devise.rb
Devise.setup do |config|
  # ...
  config.secret_key = ENV['DEVISE_SECRET_KEY']
  # ...
end
```
これにより新しいsecret_keyが安全に設定され、誤って公開するリスクが大幅に減少します。
Google ColaboratoryでCirq + cuStateVecの環境構築

Google Colaboratoryで量子コンピューティングのシミュレーションを行うため、[Accelerating Quantum Circuit Simulation with NVIDIA cuStateVec](https://developer.nvidia.com/blog/accelerating-quantum-circuit-simulation-with-nvidia-custatevec/)を参考にCirq + cuStateVecの環境構築をしてみました。  
手順通りだと動かなかったのでメモ。
## インストール
上記のブログの通り`cuquantum-linux-x86_64-0.1.0.30`を選んでダウンロードし展開。
最新のバージョンを使っても動かないので注意。
``` bash
! wget https://developer.download.nvidia.com/compute/cuquantum/redist/cuquantum/linux-x86_64/cuquantum-linux-x86_64-0.1.0.30-archive.tar.xz
! tar -xf cuquantum-linux-x86_64-0.1.0.30-archive.tar.xz
! export CUQUANTUM_ROOT=`pwd`/cuquantum-linux-x86_64-0.1.0.30-archive && ln -sf $CUQUANTUM_ROOT/lib $CUQUANTUM_ROOT/lib64
```
qsimをcheckoutしてソースからインストール。
同時にcirqもバージョン指定でインストール。
ビルドには数分程度かかりました。
cirqはこのバージョンでないと互換性がないためエラーになります。
pipに古いバージョンの依存関係を解決をさせるため、qsimとcirqは同時にインストールする必要があります。
``` bash
! git clone https://github.com/quantumlib/qsim.git
! cd qsim && git checkout v0.11.1
! export CUQUANTUM_ROOT=`pwd`/cuquantum-linux-x86_64-0.1.0.30-archive && cd qsim && pip install . cirq==0.13.1
```
## 動作検証
GPUが使えることを確認。  
`detect_gpu()`が`0`、`detect_custatevec()`が`1`を返せば成功。それ以外を返した場合はGPUが使えていません。([enum](https://github.com/quantumlib/qsim/blob/v0.11.1/pybind_interface/decide/decide.cpp#L62-L63))
``` python
import qsimcirq

print("detect_gpu:", qsimcirq.qsim_decide.detect_gpu())
print("detect_custatevec:", qsimcirq.qsim_decide.detect_custatevec())

## 以下実行結果
# detect_gpu: 0
# detect_custatevec: 1
```
[このissue](https://github.com/NVIDIA/cuQuantum/discussions/26)を参考に実行時間を計測してみます。  
リソースモニターでシステム RAMはほとんど変化せず、GPU RAMは上昇することを確認。  
ここではGPUはT4を選択しています。
``` python
import cirq
import qsimcirq
import timeit

def load_test_with_gpu(num_gpus = 1, depth = 2, num_qubits = 30):
	circuit = cirq.testing.random_circuit(
		qubits = num_qubits,
		n_moments = depth,
		op_density = 1.0,
		random_state = 1)
	num_gates = len(list(circuit.all_operations()))
	options = qsimcirq.QSimOptions(use_gpu=True, gpu_mode=num_gpus)
	qsim_simulator = qsimcirq.QSimSimulator(options)
	result = qsim_simulator.simulate(circuit)
	print (f"DONE with qubits: {num_qubits} \t gates: {num_gates} \t depth: {depth} \t")

timeit.timeit('load_test_with_gpu()', globals=globals(), number=1)

## 以下実行結果
# DONE with qubits: 30 	 gates: 40 	 depth: 2 	
# 8.473605410000118
```

CPUでも実行してみます。
リソースモニターでシステム RAMが上昇してもGPU RAMはほとんど変化しないことを確認します。
GPUに比べて実行時間が約3.2倍になっています。

``` python
def load_test_with_cpu(depth = 2, num_qubits = 30):
	circuit = cirq.testing.random_circuit(
		qubits = num_qubits,
		n_moments = depth,
		op_density = 1.0,
		random_state = 1)
	num_gates = len(list(circuit.all_operations()))
	options = qsimcirq.QSimOptions(use_gpu=False)
	qsim_simulator = qsimcirq.QSimSimulator(options)
	result = qsim_simulator.simulate(circuit)
	print (f"DONE with qubits: {num_qubits} \t gates: {num_gates} \t depth: {depth} \t")

timeit.timeit('load_test_with_cpu()', globals=globals(), number=1)

## 以下実行結果
# DONE with qubits: 30 	 gates: 40 	 depth: 2 	
# 26.70925836099991
```
【Paiza問題集】配列メニュー/【次元配列の入出力】i番目の出力Boss

# Paiza問題集
Pythonで回答

## 配列メニュー/【次元配列の入出力】i番目の出力Boss

### Step01 要素数の出力
```Python
"""
要素数の出力
https://paiza.jp/works/mondai/array_primer/array_primer__1dmatrix_output_step1

問題
数列の要素数を出力してください
"""

num_list = [5, 1, 3, 4, 5, 12, 6, 8, 1, 3]

print(len(num_list))
```

### Step02 全要素の出力
```Python
"""
全要素の出力
https://paiza.jp/works/mondai/array_primer/array_primer__1dmatrix_output_step2

問題
数列の全要素を改行区切りで出力してください
"""

num_list = [5, 1, 3, 4, 5, 12, 6, 8, 1, 3]

print(*num_list[0:], sep="\n")
```

### Step03 i番目の出力
```Python
"""
i番目の出力
https://paiza.jp/works/mondai/array_primer/array_primer__1dmatrix_output_step3

問題
数列の4番目の要素を出力してください
"""

num_list = [5, 1, 3, 4, 5, 12, 6, 8, 1, 3]

print(num_list[3])
```

### Step04 配列の入力1
```Python
"""
配列の入力1
https://paiza.jp/works/mondai/array_primer/array_primer__1dmatrix_input_step1

問題
数列の全要素を改行区切りで出力してください
"""

num_list = [8, 1, 3, 3, 8, 1, 1, 3, 8, 8]

print(*num_list[:], sep="\n")
```

### Step05 配列の入力2
```Python
"""
配列の入力2
https://paiza.jp/works/mondai/array_primer/array_primer__1dmatrix_input_step2

問題
10個の整数a_iが半角スペース区切りで与えられます
以下の形式で標準入力によって与えられます
"""

num_list = list(input().split())

print(*num_list[:], sep="\n")
```

### Step06 配列の入力3
```Python
"""
配列の入力3
https://paiza.jp/works/mondai/array_primer/array_primer__1dmatrix_input_step3

問題
1行目に整数Nが与えられます
2行目に、N個の整数 a_i (1 ≤ i ≤ N) が半角スペース区切りで与えられます
この数列の全要素を改行区切りで出力してください
"""

N = int(input())
num_list = list(input().split())

print(*num_list[:], sep="\n")
```

### Step07 i番目の出力1
```Python
"""
i番目の出力1
https://paiza.jp/works/mondai/array_primer/array_primer__1dmatrix_i-thoutput_step1

問題
与えられた数列aのK番目の要素を出力してください
"""

a = [1, 3, 5, 4, 6, 2, 1, 7, 1, 5]

K = int(input())
print(a[K-1])
```

### Step08 i番目の出力2
```Python
"""
i番目の出力2
https://paiza.jp/works/mondai/array_primer/array_primer__1dmatrix_i-thoutput_step2

問題
1行目に整数Kが与えられます
2行目に10個の整数a_i (1 ≤ i ≤ 10) が半角スペース区切りで与えられます
K番目の要素a_Kを出力してください
"""

K = int(input())
a = list(input().split())

print(a[K-1])
```

### Final問題 【次元配列の入出力】i番目の出力Boss
```Python
"""
【次元配列の入出力】i番目の出力Boss
https://paiza.jp/works/mondai/array_primer/array_primer__1dmatrix_i-thoutput_boss

問題
1行目に整数Nと整数Kが与えられます
2行目にN個の整数a_i (1 ≤ i ≤ N) が半角スペース区切りで与えられます
K番目の整数a_Kを出力してください
"""

N, K = map(int, input().split())
a = list(input().split())

print(a[K-1])
```
ポリシーコード：新しいトレンドにおけるセキュリティとコンプライアンスの強化

![Untitled](https://superblog.supercdn.cloud/site_cuid_cldhcpt7a1506291jkdhe6vl2sc/images/untitled-1686542214405-compressed.png)

## 導入：

セキュリティおよび規制の遵守において、組織は常に革新的なアプローチを求めており、セキュリティポジションを強化し、業界の規制に準拠するための方法を模索しています。そのような新興トレンドの一つが、ポリシーコード（Policy-as-Code）の実装です。ポリシーコードは、ポリシーの強制力をコードの柔軟性とスケーラビリティと組み合わせたパワフルな手法です。ポリシーコードを取り入れることにより、組織はセキュリティとコンプライアンスの手段を強化しながら、現代のデジタル環境のダイナミックな性質に適応することができます。

## 以下に2つのシナリオを示します：

- シナリオ1 - ポリシーコード（Policy-as-Code）：

```yaml
rules:
	name: bucket_acl_publicly_readable
	query: |-
	SELECT
	DISTINCT(a1.*)
	FROM
	aws_s3_buckets a1,
	aws_s3_bucket_grants a2
	WHERE
	a1.selefra_id = a2.aws_s3_buckets_selefra_id
	AND a2.grantee :: jsonb ->> 'URI' = '**http://acs.amazonaws.com/groups/global/AllUsers**'
	AND a2.permission IN ('READ_ACP', 'FULL_CONTROL');
	output: "S3バケットのACLが公開読み取り可能です。ARN: { {.arn} }"
```

ポリシーコードツールとその提供する基本的な構成ドキュメントの支援を受けることで、必要なクエリ条件を定義することができます。ポリシーコードツールはリソースを自動的に取得し、分析を実行し、問題のあるクラウドアセットを迅速に特定し、改善策の提案を受けることができます。

- シナリオ2 - 伝統的なアプローチ

従来のアプローチでは、同じ問題に対処するために、AWSの複数のクラウドアセットにわたってS3の設定を手動で検査する必要があります。このプロセスでは、異なるAWSアカウントにログインし、繰り返しの手動作業を行う必要があり、手間がかかり時間がかかります。

## セキュリティの強化：

ポリシーコードは、組織のソフトウェアシステム全体でセキュリティポリシーを強制するための堅牢なフレームワークとして機能します。ポリシーを実行可能なコードに変換することで、自動化された強制が可能になり、ヒューマンエラーのリスクを減らし、セキュリティ対策の一貫した適用を保証します。ポリシーコードを使用することで、組織はアクセス制御、認証メカニズム、暗号化基準などのセキュリティポリシーをインフラ全体で定義し、強制することができます。これにより、包括的で能動的なセキュリティアプローチが提供されます。

## コンプライアンスの効率化：

業界の規制要件と基準の遵守は、ビジネス運営の重要な側面です。ポリシーコードは規制要件を実行可能なポリシーにコード化することで、コンプライアンスプロセスを簡素化します。これにより、コンプライアンスチェックが自動化され、一貫して適用されるようになり、マニュアルによる監査の負担が軽減され、非コンプライアンスのリスクが最小限に抑えられます。ポリシーコードを使用することで、組織はGDPR、HIPAA、PCI-DSSなどの規制に対するコンプライアンスを簡単に追跡し、証明することができます。これにより、スムーズな監査が可能になり、罰金が軽減され、堅牢なコンプライアンスフレームワークが確保されます。

![Untitled](https://superblog.supercdn.cloud/site_cuid_cldhcpt7a1506291jkdhe6vl2sc/images/untitled-3-1686544345282-compressed.png)

## アジリティとスケーラビリティ：

今日の迅速なデジタル環境では、組織は進化する脅威と変化するコンプライアンス要件に対応するために、アジャイルかつスケーラブルなソリューションが必要です。ポリシーコードは、ポリシーを迅速かつ効率的に適応する柔軟性を提供します。コードベースのポリシーはバージョン管理され、テストされ、簡単に変更できるため、組織は新たなセキュリティリスクやコンプライアンスの更新に迅速に対応することができます。このアジリティとスケーラビリティにより、組織はダイナミックな環境で堅牢なセキュリティとコンプライアンス対策を維持することができます。

## 協力と透明性：

ポリシーコードは、セキュリティとコンプライアンスに責任を持つチーム間の協力を促進します。ポリシーをコードとして表現することで、透明性を促進し、共同開発とレビュープロセスを可能にします。異なる利害関係者がポリシーの開発に貢献し、セキュリティとコンプライアンス要件の共同理解と所有権を確保します。この協力的なアプローチは知識共有を促進し、ベストプラクティスを推進し、チームにセキュリティとコンプライアンス対策を持続的に改善する力を与えます。

## 結論：

セキュリティの脅威と規制の複雑さが進化し続ける中で、組織はセキュリティとコンプライアンスのポジションを強化するために革新的なアプローチを取る必要があります。ポリシーコードは、自動化されたポリシーの強制、コンプライアンスプロセスの効率化、変化する環境に対するアジリティを可能にする強力なツールとして浮上しています。ポリシーコードを取り入れることで、組織はセキュリティ対策を強化し、規制の遵守を確保し、新たなセキュリティの課題に立ち向かうことができます。セキュリティとコンプライアンスの未来は、ポリシーの強制とコードの融合にあり、ポリシーコードは現代の組織のセキュリティ戦略の重要な要素となります。

**お読みいただきありがとうございました！**

**Selefra: https://github.com/selefra/selefra**
bootstrap Carousel(カルーセル)の矢印の色の付け方

まず、Carousel(カルーセル)とは画像やスライドを横にスライドさせて複数表示させるコンポーネントです。

そして、このCarouselのデフォルトでは白色になっています。そのため、背景が白の写真などを表示させると矢印が見えなくなってしまいます。そこで、矢印の色の変更の仕方を紹介します。

![スクリーンショット 2023-06-12 13.42.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466698/11f84c47-c13c-8369-8a36-e23b6ff6969a.png)


結論としては、cssファイルを用意して、そこに以下のようにプロパティを設定して、colorを指定するだけです。

```css
.carousel-control-prev-icon, .carousel-control-next-icon {
    height: 100px;
    width: 100px;
    outline: black;
    background-color: rgba(0, 0, 0, 0.3);
    background-size: 100%, 100%;
    border-radius: 50%;
    border: 1px solid black;
}

```

ちなみにこれが変更する前
![スクリーンショット 2023-06-12 13.43.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466698/e767980a-e6e1-b98b-3fb4-aeba442de5e4.png)


変更した後
![スクリーンショット 2023-06-12 13.44.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466698/28348ed5-b467-b35a-3d42-3b70ca73d1ae.png)

このように背景が白色でも、左右の矢印が表示させるようになっています。
コミット⇒プルリクエスト後にコミット前に戻す方法

プルリクエスト後に修正誤りに気付いたときに調べたことを備忘録としてまとめました。

# プルリクエストを元に戻す

プルリクエスト一覧から、削除したいプルリクエストのページに進み、ページ下部にある「Close pull request」または「プルリクエストを閉じる」ボタンをクリックすることで、プルリクエストを閉じることができます。

# プッシュしたコミットを取り消す

①ローカルの作業ディレクトリで、リモートリポジトリから最新の状態を取得します。(\<branch-name\>は、コミットを元に戻したいブランチの名前)
```
git pull origin <branch-name>
```
②取り消したいコミットのハッシュ値（コミットID）を確認します。
コミットIDは、'git log'コマンドで履歴を表示することで取得できます。
```
git log
```
③指定したコミットを取り消す新しいコミットを作成します。
'git revert'コマンドは、指定したコミットによって加えられた変更を取り消す新しいコミットを作成します。
```
git revert <commit-id>
```
以上手順でコミット前の状態に戻すことができます。
[API Gateway]マッピングテンプレートでjsonがkey=value形式に変換される問題

API Gatewayを使用した際に詰まったポイントがあったのでメモ

## 事象

Data Kinesis FirehoseのPutRecordをAPI Gatewayで実行する際、
以下のマッピングテンプレートを使ってリクエストしようとしました。

```
#set($data = {"hoge": "$input.params('huga')", "hoge2": $input.json('$')})
{
    "DeliveryStreamName": "hogehuga",
    "Record": { 
         "Data": "$util.base64Encode($data)"
    }
}
```

しかしデコードした値を確認したところ、jsonではなく`{hoge=huga, hoge2={"hello":"world"}}`のような`key=value`形式（移行KV形式）に変換されており、jsonが正しく送られていませんでした。


## 解決方法

jsonと認識されるとKV形式に変換されるため、文字列とすることでKV形式への変換を防げます。
後述するVTLでは、 文字列中に`""`と記述することでダブルコーテーションをエスケープすることができるようです。（これを知らず`\`や`'`でエスケープしようとし時間を使ってしまった...）

```
#set($data = "{""hoge"": ""$input.params('huga')"", ""hoge2"": $input.json('$')}")

{
    "DeliveryStreamName": "hogehuga",
    "Record": { 
         "Data": "$util.base64Encode($data)"
    }
}
```


## そもそもなぜ変換されるのか?

:::note warn
警告
ここから先は推論を含んでいるため、完全な情報ではありません。
もし補足や訂正の情報をお持ちであれば、コメントいただけると幸いです🙏
:::

API Gatewayのマッピングテンプレートは公式ドキュメントの通り、 VTL（Velocity Template Language）とJsonPath式で記述します。

> マッピングテンプレートは、Velocity Template Language (VTL) で表現されるスクリプトであり、JSONPath 式を使用してペイロードに適用されます。

VTLについて調べたところ、これはjavaをベースとしたテンプレートエンジンでありjavaのデータ構造を使用しているようです。

https://velocity.apache.org/

このためjsonを変数に代入した場合、VTLはjsonをjavaのMap型に内部的に保持すると考えました。

つまり、マッピングテンプレートはリクエスト・レスポンスのjsonを生成する際、以下の処理を実施してます。
1. マッピングテンプレート内のjsonを評価
1. 変数展開・jsonをmap型で格納
1. jsonにシリアライズ

しかし、マッピングテンプレート内で変数として定義されたJSONが参照される場合、その変数はシリアライズされず内部表現形式としてJavaのMap型が直接出力されます。
これが、KV形式に変換されてしまっているように見える原因だと推測しています。

## 参考文献

- [API Gateway マッピングテンプレートとアクセスのログ記録の変数リファレンス](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html)
- [Velocityで文字列リテラル中にダブルクォーテーションを書きたい](https://idesaku.hatenablog.com/entry/20090204/1233728141)
- [API Gateway mapping template converts JSON string to comma-separated key=value pairs](https://stackoverflow.com/questions/72585583/api-gateway-mapping-template-converts-json-string-to-comma-separated-key-value-p)
Localstackを構築してみる

# 目的
クラウドを触るのは学生にとっては少し抵抗があるものである。

昔、AWSを触った時は無料枠の中で遊ぼうと思っていたが、調子に乗って1日で2000円ほど取られてしまった。焦って止めようとしたのだが、どこで課金されているのかよく分からず、格闘した経験がある。

今回は、localstackを構築して無料でAWS互換環境で遊び倒そう。

## 環境
- docker
- docker-compose
- python (pip)


## awscliのインストール
### awscli
```
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
```
### version確認
```
$ aws --version
aws-cli/2.11.27 Python/3.11.3 Linux/5.15.0-25-generic exe/x86_64.ubuntu.22 prompt/off
```

### awscli-local
awscliを用いてlocalstackを操作する事も出来るが、エンドポイントの指定をやってくれるawscli-localをインストールしよう。
```
$ pip3 install awscli-local
```
### version指定
```
root@shoma:/home/shoma/aws/dist# awslocal --version
aws-cli/2.11.27 Python/3.11.3 Linux/5.15.0-25-generic exe/x86_64.ubuntu.22 prompt/off
```

## localstackの構築
```
git clone https://github.com/localstack/localstack.git
docker-compose -f ./localstack/docker-compose.yml up
```

## 動作検証
### aws-cliの設定
```
$ mkdir ~/.aws/
$ nano ~/.aws/config
```

configの内容
```
[default]
region = ap-northeast-1
output = json
```

クレデンシャルを設定
```
[default]
aws_access_key_id = dummy
aws_secret_access_key = dummy
```


### aws-cliコマンド実行
```
# aws s3 ls s3:// --endpoint-url=http://localhost:4566
2023-06-12 03:18:18 test-bucket
```

### awscli-local
いちいちエンドポイントを指定するのも大変なので、今後はawslocalで

```
# awslocal s3 ls s3://
2023-06-12 03:18:18 test-bucket
```

## localstack管理ツールのインストール
```
$ pip3 install localstack
```

確認
```
# localstack status services
```
```
lqqqqqqqqqqqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqk
x Service                  x Status      x
tqqqqqqqqqqqqqqqqqqqqqqqqqqnqqqqqqqqqqqqqu
x acm                      x ? available x
x apigateway               x ? available x
x cloudformation           x ? available x
x cloudwatch               x ? available x
x config                   x ? available x
x dynamodb                 x ? available x
x dynamodbstreams          x ? available x
x ec2                      x ? available x
x es                       x ? available x
x events                   x ? available x
x firehose                 x ? available x
x iam                      x ? available x
x kinesis                  x ? available x
x kms                      x ? available x
x lambda                   x ? available x
x logs                     x ? available x
x opensearch               x ? available x
x redshift                 x ? available x
x resource-groups          x ? available x
x resourcegroupstaggingapi x ? available x
x route53                  x ? available x
x route53resolver          x ? available x
x s3                       x ? running   x
x s3control                x ? available x
x secretsmanager           x ? available x
x ses                      x ? available x
x sns                      x ? available x
x sqs                      x ? available x
x ssm                      x ? available x
x stepfunctions            x ? available x
x sts                      x ? available x
x support                  x ? available x
x swf                      x ? available x
x transcribe               x ? available x
mqqqqqqqqqqqqqqqqqqqqqqqqqqvqqqqqqqqqqqqqj
```
【GAS】GASからCloud SQLにSSLで接続する

# はじめに
過去に[GASでCloud SQL(MySQL)を利用する記事](https://qiita.com/shobota/items/7655540f5a440addbe49)を書いたのですが、今回はその接続をSSLにする方法を書いていこうと思います。
（記載されているキーはダミーです）

# 準備
GASからCloud SQLにSSL接続するためには、各種証明書が必要になります。
証明書を発行する手順については[Googleのサイト](https://cloud.google.com/sql/docs/mysql/configure-ssl-instance?hl=ja)に記載があるのですが、
* サーバー証明書
* クライアントの公開鍵証明書
* クライアント秘密鍵

の3つのデータが必要になります。
[GCPのダッシュボード](https://console.cloud.google.com/home/dashboard)にログインしてCloud Shellを立ち上げ、上記Googleのサイトの「クライアント証明書」という項目を実施することで、これらの証明書データを発行することができます。
発行した後は、Cloud Shellのエディタを開くと簡単にコピーできます（下記は一部切り取った画面）
![editor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311544/f34d4487-c75c-2c00-9f15-07e778200bde.png)


# GAS側での設定
GASで3種の証明書をどう保存しておくかについては、
* 変数として直接記載する
* スクリプトプロパティに保存
の2つが考えられます。

### 変数として直接記載する
変数として直接保存する方法は、単純に文字列として記入していくやり方です。
``` javascript:ca.gs
var SERVER_CA = "-----BEGIN CERTIFICATE-----\n"
 + "MIIDfzCCAmegAwIBAgIBADANBgkqhkiG9w0BAQsFADB3MS0wKwYDVQQuEyQ\n"
 + "VQQuEyQwMTcyOTRhZC01NmRlLTQwY2UtOGIxNy03Mjk5YTQwZmNiMjAxIzA\n"
(中略)
 + "-----END CERTIFICATE-----"
```
この際の注意点としては、改行を\nとして入れておくことです。

### スクリプトプロパティに保存
もう１つはスクリプトプロパティに保存する方法ですが、そのままコピー＆ペーストすると改行が半角スペースに変換されてしまうので、事前に改行をTABやカンマなどに変換し、後でreplaceするといった方法になります。
下記の画像では改行をTABに変換した後にペーストしています。
![key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311544/30f72665-9e3d-5561-9f95-900a79776935.png)
この場合の接続方法としては下記のようになります。
スクリプトプロパティのdb_user、db_passwdには接続するユーザ名とパスワードが、
server_ca、client_cert、client_keyにはそれぞれの証明書が保存されている状態です。
``` javascript:mysql.gs
var con = null;
var DATABASE_NAME = "test_db"

function dbConnect(){

  var url = 'jdbc:mysql://xxx.xxx.xxx.xxx/' + DATABASE_NAME + '?useSSL=true';

  var connectInfo = {
    user: properties.getProperty("db_user"),
    password: properties.getProperty("db_passwd"),
    _serverSslCertificate: properties.getProperty("server_ca").replace(/\t/g,"\n"),
    _clientSslCertificate: properties.getProperty("client_cert").replace(/\t/g,"\n"),
    _clientSslKey: properties.getProperty("client_key").replace(/\t/g,"\n")
  }

  if(!con){
    con = Jdbc.getConnection(url,connectInfo);
  }
  return con;
}

```

これでSSLでCloudSQLに接続できるようになりました。
IBM i でサポートされるWASバージョンを調べたい：WebSphere Application ServerやIBM S/Wの前提OS, S/W, H/Wの調べ方

IBM i でサポートされるWAS(WebSphere Application Server）バージョンを調べたい、というご質問があり。

## 方法①　Software Product Compatibility Reports (SPCR)
https://www.ibm.com/software/reports/compatibility/clarity/index.html

IBM S/Wの前提H/W,S/Wなどコンパチビリティリストは下記から検索できます。

やや分かりにくいかもですが上記ページで Create Report というリンクから前提条件リストを調べることが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/28c1b24f-9328-98cb-4200-0eaf4c60656c.png)

今回は①か②で調べることが出来ます。前提javaバージョン等も調べたいので②をクリックします。
②をクリックすると下記の画面が表示されます。
一番上のFull or partial product name 欄に検索するS/W名称を入力します。今回はwebsphere application server と入力しました。ここでは省略しますが、WebSphere Application Server xxxx という名称のS/Wが全て引っかかるので 2つめのSearch results 欄から目的のS/Wを選択します。
※逆に 1つめでwebsphere application server v9 などバージョンを入力すると v9 は正式名称ではないので検索結果がゼロになってしまいます・・

画面のように検索結果から目的のバージョンを選択します。ここでは9.0.5として、submit をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e22f6f14-6cca-6019-4c29-fdcea29b5faf.png)

下記のように検索条件を指定できます。ここではIBM i OSだけを検索対象とします。複数OSの選択や検索項目の絞り込みもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/c61a1923-6bab-a085-d745-d600e1af79af.png)

Submitボタンを押すと結果がリストされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/09caaea0-1d69-1fcc-8052-e0529b0acd43.png)
各IBM i OSバージョンごとのサマリーのサポート情報が表示されます。WAS V9.0.5はIBM i 7.2, 7.3, 7.4でサポートのあることがわかります。
さらにDetailsのviewを押すと詳細情報が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/cd4f546e-07a3-8d50-a5a1-9d1ae5a1c6e0.png)

Note欄を転記すると下記の通り。IBM i 7.2が保守サポート終了済みであることなども記載され親切かなと思います。

----------------------------------
Note 2

Power 9 support:

(a) Minimum supported OS level is 7.2 TR8

(b) Supported in Power7 compatibility mode.

(c) Supported in Power8 in compatibility mode.

(d) Supported in Power9 in Power9 mode.

(e) Minimum required Java level is Java 8 SR5 FP15

Note 3

This operating system is no longer in service. Please refer to IBM's policy on unsupported operating systems: https://www.ibm.com/support/customercare/sas/f/handbook/policies.html#unsupported

----------------------


ところで、あれ？最新のIBM i 7.5はサポートが無い、なんですが、
一番左上の　Available Reportsの下の欄がWAS 9.0.5のイニシャルバージョンで表示されるからなんですね。これを9.0.5.15にしてみると、レポートが切り替わり、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/21154286-c684-b03a-e721-0db911631e5f.png)

IBM i 7.5もWAS V9.0.5.12以降でサポートあることが分かります。（※バージョン変えると他のOS等も含めたフルセットの検索結果に戻ってしまうのはご愛敬・・W）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/853483fb-2c2c-f5b4-7bea-4c3b775f7458.png)

本当のお題はIBM i のサポートWASバージョンなのですが、長くなってしまったので[こちら](https://qiita.com/gomAnomalocaris/items/b714e79383500a051513)に作成しました。

追加の情報が見つかったので下記に追記しました。

## IBM i の情報サイト(IBM Docs)から

下記のリンクに情報がありました。
Official Support Statement for the IBM WebSphere Application Server Product on the IBM i OS

https://www.ibm.com/support/pages/official-support-statement-ibm-websphere-application-server-product-ibm-i-os
【ChatGPT無】セラピストプロンプトを実行した感想

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　どうも、カーブミラーです。
　今回から、
　　上記のメッセージを
　　　記述することにしました。

　今回は、
　　思い付いて、
　　　作成してしまいました、
　　　　セラピストプロンプトw。

　まぁ、
　　セラピストのプロンプトなんて、
　　　あちこちあるんでしょうけど、
　　　　とりあえず。

　作成したプロンプトです。
```Text:セラピストプロンプト
#指示
あなたは、プロのセラピストとして、振る舞ってください。

#内容
相談者である私との会話を通じて、私の精神的健康について、カルテを作成してください。
最後にそのカルテを見せてください。
また、アドバイスが必要と判断したならば、アドバイスをお願いします。

#対話
必要な情報を得るために、質問や促しをしてください。
質問は、ひとつずつでお願いします。

以上を理解しましたら、「はい」と答えて、最初の質問をしてください。
その後は、待機してください。
```

　質問は、およそ10個前後。
　　ひとつひとつを質問して、
　　　答えてくれるのを待ちます。
　　　　つまり、10回質疑応答します。
　　　　　一度に聞いてきませんよ。

　名前、年齢、性別という
　　誰でも簡単に答えられることを
　　　ひとつずつ質問してきます。

　次第に、
　　突っ込んだ内容を
　　　聞いてきます。

　最後に
　　カルテと
　　　アドバイスを
　　　　記述してくれます。
***
　正直に言えば、
　　カルテに記載されたのは、
　　　質問に回答した内容。

　アドバイスは、
　　まぁ、それなりです。

　結果は、
　　ちょっと肩透かし気味。

　これが、
　　GPT4ならば、
　　　もっといいアドバイスを
　　　　もらえる、のかも。

　ではでは。
デジタル庁のサイトはいつからやばかったか

# デジタル庁のサイトがやばすぎるようだ

こちらの記事が話題になっています。

https://qiita.com/mu_tomoya/items/f78f1fad3a8b57ac7dc3

省庁のサイトといえば枯れ果てた技術とデザインという印象ですが、デジタル庁はさすが新しい技術をキャッチアップしていて、しかも動作も軽快で素晴らしい！と **「いい意味でやばい」** という内容でした。

こちらは、サイトスピードの観点から考察してみたアンサー的な記事となります。

# デジタル庁サイトは2022年4月に刷新された模様

GoogleはChromeユーザーから世界中のWebサイトのスピードに関する情報を収集しており(Chrome UX Report)、パブリックに公開されています。

https://developer.chrome.com/docs/crux/

これによると、デジタル庁サイトのスピードは2022年4月に急激に改善されています。

例えば`LCP`の75パーセンタイルはこのように推移しており、2022年4月に半分以下の時間に改善されています。

![monthly-p75-lcp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/f8cb481b-8b7e-936f-e73d-1d546682d7c2.png)

この間に何があったのかな？ということで、Internet Archiveで見比べてみます。

こちらが2022年3月1日

https://web.archive.org/web/20220301110214/https://www.digital.go.jp/

次が2022年5月1日

https://web.archive.org/web/20220501104426/https://www.digital.go.jp/

見た目は大きく変わっていませんが、ソースをざっくり見比べてみると次の違いがありました。

1. リニューアル前はNuxtだが、リニューアル後はNextを使っている。
1. リニューアル前はCSR(Client Side Readering)、リニューアル後はSSG(Server Side Generation)またはSSR(Server Side Rendering)を使っている。

`LCP`改善の理由はNuxtとNextというより、CSRとSSG(またはSSR)の違いではないかと思います。

:::note info
おそらくSSGの方ですね。少し修正しました。
:::

やはりSPAは、インタラクティブなWebアプリケーションには向いてるものの、**読み物的なWebサイトはサーバー側でHTMLを書き出し、キャッシュを効かせるのが定石**と強く思わせる変化がありました。

# デジタル庁は他の省庁サイトと比べても速いか

いやいや、他の省庁も速いですよ。

`LCP`が良好なレベルである(と思われる)割合で比較すると、デジタル庁は37サイト中21位と実は特別上位というわけではありません(それでも一般的な企業サイトに比べるとめちゃくちゃ軽快ですが)。

![compare-density-lcp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/cd8cbf45-cc34-8476-0829-9a7a2e9e691d.png)

# なぜ省庁のサイトは軽いのか

見た目がシンプル、シンプルを通り越して枯れてるからでしょ？

と思うかもしれませんが、**見た目がシンプルなら即、軽いというのは誤解**です。

**マーケティング系を始めとするサードパーティタグをほとんど使っていないから**というのが真実に近いです。

**いちばんLCPが良好なのがカジノ管理委員会**、このリストの中でちょっと異色な感じがしますね。

目立たないようにしている姿を想像してしまいますが、その結果、省庁サイトの中で最速を誇るという可笑しみを感じました。

# インフラが強いのは

ここまで題材に見てきた`LCP`はフロントエンド技術に関する指標ですが、バックエンド(サーバーやネットワーク)についてはどうでしょうか。

Chrome UX Reportでは`TTFB`(Time To First Byte)がその参考になるのですが、トップ3は防衛庁、金融庁、財務省。

おお、さすが！と唸る結果でした。

![compare-density-ttfb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/3d8edcfb-da7b-9326-9b0e-c36bcbd2d7b8.png)

# 霞が関サイトスピード番付

各所で引用した「霞ケ関サイトスピード番付レポート」はこちらで詳しくご覧いただけます。

https://chrome-ux-rumble.web.app/reports/V6FGcFU3I2rlkXsT3oVt

みなさんもいろいろぜひ考察してみてください！
Laravel collectionクラスのvalueで比較する（完全一致）

## 前提
二つのコレクションクラスのvalueを比較し完全一致するかを確認する

## 実装
```.php
$Acollection = collect([1,2,3]);
$Bcollection = collect([1,2,3]);

//ソートで順番を合わせ、ユニークにする。
//valuesメソッドはキーをリセット後、連続した整数にした新しいコレクションを返します。

$Acollection = $Acollection->unique()->sort()->values();
$Bcollection = $Bcollection->unique()->sort()->values();

if ($Acollection == $Bcollection)
{
  //一致
}
else
{
  //不一致
}
```

## 実装例1(同じvalueで順番が異なる)

```.php
$Acollection = collect([1,2,3]);
$Bcollection = collect([3,2,1]);

$Acollection = $Acollection->unique()->sort()->values();
$Bcollection = $Bcollection->unique()->sort()->values();

//$Acollectionと$Bcollection 
Illuminate\Support\Collection {#2483 ▼
  #items: array:3 [▼
    0 => 1
    1 => 2
    2 => 3
  ]

```

## 実装例2(重複がある)

```.php
$Acollection = collect([1,2,3,3,2]);
$Bcollection = collect([3,2,1]);

$Acollection = $Acollection->unique()->sort()->values();
$Bcollection = $Bcollection->unique()->sort()->values();

//$Acollectionと$Bcollection 
Illuminate\Support\Collection {#2483 ▼
  #items: array:3 [▼
    0 => 1
    1 => 2
    2 => 3
  ]
```

## 実装例3(異なる値)

```.php
$Acollection = collect([1,2,3,4]);
$Bcollection = collect([3,2,1]);

$Acollection = $Acollection->unique()->sort()->values();
$Bcollection = $Bcollection->unique()->sort()->values();

//$Acollection
Illuminate\Support\Collection {#2483 ▼
  #items: array:4 [▼
    0 => 1
    1 => 2
    2 => 3
    3 => 4
  ]

//$Bcollection 
Illuminate\Support\Collection {#2551 ▼
  #items: array:3 [▼
    0 => 1
    1 => 2
    2 => 3
  ]

//上記はfalseになる
if ($Acollection == $Bcollection)
{
  //一致
   dump(true)
}
else
{
  //不一致
  dump(false)
}

//false
```


## 参照
https://readouble.com/laravel/8.x/ja/collections.html#method-values
GitHub Projects上でのタスク管理　流れまとめ

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852310/57015b5a-59dd-8fac-d2b2-5954532c9e66.png" width="800px">

# はじめに

現在行っているインターン先でTrelloからGitHubへのタスク管理ツールを移行するにあたってGitHub　Projectsを利用することになった。
インターン先でタスクの作成/進行の流れの共有をするためこの記事を書く。


## バージョン
- Git 　version 2.37.1
- Github  確認中


## GitHub Projectsとは

- プロジェクトは、作業の計画と追跡を効果的に行えるように GitHub 上の issue および pull request と統合できる、適応性のあるスプレッドシートです。

-  issue と pull request をフィルター処理、並べ替え、グループ化することで複数のビューを作成してカスタマイズしたり、team 固有のメタデータを追跡するためのカスタムフィールドを追加したりすることができます。 


>GitHub Projects 公式ドキュメント参照

https://docs.github.com/ja/issues/planning-and-tracking-with-projects/learning-about-projects/about-projects

## 使用の流れ

ここからはGitHub Projectsの具体的な使用法について解説をしていきます。
### タスクの確認
1.Profile部分にある対象のOrganizationsを選択![スクリーンショット 2023-06-12 12.37.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852310/cea646d5-0658-4666-98e1-7d8fd98f40bc.png)

2.Organizationsページ内のProjectsを選択
![スクリーンショット 2023-06-12 12.38.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852310/2c078f24-358b-e546-7b6d-40b4977bb839.png)

3.画面中央の対象のProjectsを選択
![スクリーンショット 2023-06-12 12.38.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852310/5337350e-0ec7-1324-a23c-92b5314ff084.png)

4.各自のタスクが表示される
![スクリーンショット 2023-06-12 12.38.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852310/511d6930-e221-6fad-9d75-188f144368d9.png)

#### タスクビューの変更
1.タスクビューはProjectsの上部から変更します。![スクリーンショット 2023-06-14 11.38.22（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852310/180d3bf2-acd4-e39b-60d5-06abe7445a8a.png)




### タスクの追加
#### 追加の流れ
追加方法が２パターンに分かれています。
- GitHub Projects上からタスクを追加する方法
- 各リポジトリー内のIssueからGitHub　Projectsへ紐付けをする方法

ここでは両方のやり方を解説します。

#### 1.GitHub Projects上からタスクを追加する方法
1.GitHub Projectsから追加したい状態のエリアの下部にある「＋Add item」ボタンをクリックします。
2.ボタンを押すと画面下部にタイトルを入力する部分が出てくるのでタスクのタイトルを入力します。
3.選択していたタスクの一番下にタスクが追加されます。



#### 2.IssueからGitHub　Projectsへ紐付けをする方法


#### タスクの詳細設定

### タスクの削除

1.Profile部分にある対象のOrganizationsを選択
2.Organizationsページ内のProjectsを選択
3.画面中央の対象のProjectsを選択
4.各自のタスクが表示される
対処法 - Paragraph ended before \align was complete.

以下のようなコードをコンパイルしようとすると↓
```tex:Before.tex
\documentclass{jlreq}
\usepackage{amsmath}

\begin{document}
\begin{align}
    a=0\\

    b=1
\end{align}
\end{document}
```
こういうエラーが出る↓
```
Runaway argument?
 a=0\\ 
! Paragraph ended before \align was complete.
<to be read again> 
                   \par 
l.7 
    
? ^D
! Emergency stop.
<to be read again> 
                   \par 
l.7 
    
No pages of output.
```

解決法は，**align環境内に空白の行を入れないこと**である↓
```tex:After.tex
\documentclass{jlreq}
\usepackage{amsmath}

\begin{document}
\begin{align}
    a=0\\
    b=1
\end{align}
\end{document}
```
こうするとコンパイルが上手くいく．

コードの見通しのためにちょくちょく空白の行を入れる癖がある私としては，ちょっと理不尽な仕様だな．
Docker入門

コンテナのライフサイクル

イメージ
・取得：docker image pull
・ビルド：docker image build

コンテナ
・生成：docker container create
・起動：docker container start
（生成＆起動：docker container run）
・停止：docker container stop
（停止＆起動：docker container restart）
・削除：docker container rm


Docker Compose
コマンド一つで複数のコンテナを操作できる
※一つのコンテナには一つの役割にする

・ビルド：docker-compose build
・生成・起動：docker-compose up
・停止：docker-compose stop
（停止＆起動：docker-compose restart）
・削除：docker-compose rm
（停止＆削除：docker-compose down）

よく使うコマンド
●exec：起動中のコンテナでコマンドを実行
docker-compose exec

●コンテナの一覧を表示
docker-compose ps

●ログを表示
docker-compose logs

●使用していないコンテナ、イメージを削除
docker-system prune
※使用していないものが残っているとPCの容量を食う


インストール手順
１．WSL2を有効にする
　Windows上にLinuxの仮想環境を構築する
https://learn.microsoft.com/en-us/windows/wsl/install
PowerShellを管理者として開く
PowerShell上で書きコマンドを実行
Start-Process powershell.exe -Verb runas
管理者用の青い画面が表示される
wsl --install
を実行
→WSL2とUbuntuがインストールされる
UbuntuでLinuxのユーザー名とパスワードを新規設定するよう求められるので、入力する。

２．Docker Desktop for Windowsをインストールする
Install Docker Desktop on Windows

Dockerの操作はUbuntuで行う

# hello-world イメージからコンテナを生成・起動する
docker run hello-world

# イメージの一覧を表示する
docker image ls

# コンテナ（プロセス）の一覧を表示する
docker ps --all

# コンテナを削除する
docker container rm <コンテナID>

# イメージを削除する
docker image rm hello-world
【Java】整数の各桁の値とその合計を求める方法

# はじめに

整数の各桁の値の合計を求める方法について学習しましたので、その内容を共有いたします。Java言語を使用して、与えられた整数の各桁の値を取得し合計を求める方法を紹介します。

## 各桁の値の合計を求める方法の実装

以下に、Java言語を使用して整数の各桁の値の合計を求める方法の実装例を示します。

```java


public class Task {

    public static void main(String[] args) {

        int number = 12304;
        int tenpNumber = number;
        int sum = 0;

        while (tenpNumber != 0) {
            int digit = tenpNumber % 10; //最下位桁を取得する
            sum += digit; //　最下位桁を合計値に加算
            tenpNumber /= 10;

        }

        System.out.println("整数値: " + number);
        System.out.println("各桁の合計値: " + sum);
    }

}

```
ご覧の通り`% 10`で計算することで最下位桁の値を取得することができます
上記のコードでは、与えられた整数の各桁の値の合計を求めるために、一時的な変数 tempNumber を使用して最下位桁から順に値を取得し、合計値に加算しています。

## 実行結果
上記のコードを実行すると、以下のような出力結果が得られます。
```java
整数値: 12304
各桁の合計値: 10
```
与えられた整数の各桁の値が正しく取得されていることが確認できます。

## まとめ
Javaを使用して整数の各桁の値の合計を求める方法について学びました。charAt() メソッドで指定の文字列を1文字ずつ取得したり toCharArray()メソッドで、与えられた各文字を配列の要素として取得する方法などもありますこの記事が皆さんのお役に立てれば幸いです
HTMLでWordファイル送信後、自然言語処理を行えるようにするまで

# HTMLでWordファイル送信後、自然言語処理を行えるようにするまで

初回の投稿となりますが、HTML上で送信したWordファイルから、中身の文章を受け取って自然言語処理を行う手前までのフローを解説していこうと思います。

現役のエンジニアの方々からすると、何て事のない内容になっているかと思いますが、何もわからなかった過去の自分に向けて書いていこうと思います。

※前提として、Flaskを使用して、HTMLのページを開けるぐらいの知識はあると仮定して進めていきます。

## HTML上でのファイルの受け取り
こちらは、HTML上で、ファイルの受け取る方法です。

```
<form action="/result" method="POST" enctype="multipart/form-data">
    <div class="file_select">
        <label for="file">wordファイルを選んでね:</label>
        <input type="file" name="file" accept=".docx">
    </div>
    <div class="result_btn">
        <input type="submit" value="送信" class="send">
    </div>
</form>

```

まず、<form>の中のaction="/"で　送信先のページを指定(Flask側で指定したもの)、その後、methodをPOSTに設定し、情報を送れるようにします。

enctypeで行っているのはファイルのアップロードを行う際に全ての種類のファイルを受け取れるようにしています。

この時、acceptという属性を使用することで、送信するファイルを指定できます。

ここまで行うと

![スクリーンショット 2023-06-02 13.00.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3315313/ab69fcfa-9364-ebbb-baa1-836e93bfa891.png)

こんな感じになります。

## Flask側での処理
```
from flask import Flask, render_template, request

app = Flask(__name__)

@app.route("/result", methods=["GET", "POST"])
def upload():
    if request.method == "GET":
        return render_template('result.html')
    elif request.method == "POST":
        file = request.files['file']
        sum_result = summarize_docx(file)
        return render_template('result.html', sum_result=sum_result)

if __name__ == "__main__":
    app.run(debug=True)
```

ここでは色々な処理がされいますが、重要なのは
```
elif request.method == "POST":
    file = request.files['file']
    sum_result = summarize_docx(file)
```
という部分です！

fileという変数にrequest.filesで先ほどHTMLで送信してもらったdocxファイルを受け取ってますね。
そしてその後、別のpythonファイルでdocxの中身を要約する関数を作って、その関数に引数としてfileを与えて、使っています。

それが
```
    sum_result = summarize_docx(file)
```
という部分ですね。

今回は以上です！

次回は実際にdocxファイルの中身を開けて自然言語処理をしていこうと思います。
とてつもなく遅いペースですが、また時間があるときに投稿していきたいです。

## [今回の私の場合]
受け取ったwordファイルを要約したり、それを図に起こして可視化したりするWebアプリを作りました。
これらはまた別の記事で書いていこうと思います。

## 最後に

初め私は何もわからずここまで辿り着くのにも苦労しました！
HTML側でどのようにファイルを受け取るかも忘れていました^^;

そして、私はまだまだ駆け出しで、わからないことや拙い部分も多々あるので、
「そこ間違ってるよ！」、「もっとこうしたほうがいいよ！」ということがありましたらご教授いただけますと幸いです。

最後に、過去の自分に向けて書いているつもりではありますが、
もしどこかの誰かがこの記事を読んで少しでも参考になったと思って頂ければ幸いです。

ではまた！


### 追記
先日までacceptでファイルを指定できたのでそこだけ編集しました。
バックエンド側で色々条件分岐しましたが無意味でした。笑
dockerの不要ファイルはこまめに削除しましょうという話

# 記事を書くきっかけ

dockerfileを変更したので、いつも通り下記コマンドを実行。
```
docker-compose build
```

するとエラーが表示され、ビルドに失敗する。
```
No space left on device
```

# 原因
ビルドを何度も繰り返していると、どんどん不要なデータがたまっていき、結果としてdockerのリソース不足になった可能性がある。

# 解決策
下記のコマンドで不要なデータを削除すると、ビルドが通るようになる。

* イメージを削除
```
docker image prune
```
[公式ドキュメント](https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/image_prune/)


* ビルドキャッシュを削除
```
docker builder prune
```
[公式ドキュメント](https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/builder_prune/)

* ボリュームを削除
```
docker volume prune
```
[公式ドキュメント](https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/volume_prune/)

* ネットワークを削除
```
docker network prune
```
[公式ドキュメント](https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/network_prune/)

# 参考
https://amateur-engineer.com/docker-prune/
pythonanywhereでdjangoのwebアプリを更新したとき、cssが反映されない件を解決

# 結論
cssファイルをdjangoプロジェクトのstaticディレクトリに配置してテンプレートhtmlから読み込んでいた場合、static内のファイルを読み込める場所に配置しなおす必要があります。以下の手順で解決しました。
1. `config/settings.py`に以下の記述があることを確認します。[^1]
    ```settings.py
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    ```
1. djangoプロジェクトの仮想環境内のbashで以下のコマンドを実行します。
    ```
    python manage.py collectstatic
    ```
1. pythonanywhereのwebのメニューにある「Reload」をクリックします。

[^1]: ローカル環境に記述が無かったとしてもanywhere側が自動で記述していることもあります。

# 実際に起きた不具合
pythonanywhereでdjangoを使用したwebアプリを作成をしました。gitを通じてローカルからcssファイルgithubにプッシュ。pythonanywhere側でcssをプルしてweb画面を確認しました。ところが、cssが反映されていないという不具合が発生しました。

# 調査
以下の記事を参考にしました。

https://help.pythonanywhere.com/pages/DjangoStaticFiles/

staticファイルはgitからpullしてきたディレクトリを参照しているわけではなく、configで設定したディレクトリを参照しているようです。その設定したディレクトリにstaticのファイル群を配置するため`python manage.py collectstatic`が必要なのだと理解しました。

# 終わりに
staticファイルに入れているファイルが該当するため、jsファイルで同様の現象が起こった場合も参考になるのではないかと思います。

以上です。

# 参考

https://help.pythonanywhere.com/pages/DjangoStaticFiles/
【Vim】実践Vimの実践 【まとめ】


# まとめ

`実践Vim`をまとめるシリーズが増えてきたため、リンクのまとめ記事を投稿します。

シリーズを投稿する度に随時まとめにもリンクを追加していきます。

## 第 1 部　モード

第 1 章:`ドットコマンド`

https://qiita.com/kagami_t/items/623a56f52d10660f72ec

第 2 章:`ノーマルモード`

https://qiita.com/kagami_t/items/6914e0afc27cb9c995af

第 3 章:`挿入モード`

https://qiita.com/kagami_t/items/6c693f4e10450c8e9947

第 4 章:`ビジュアルモード`

https://qiita.com/kagami_t/items/7b21948935b4da83b2b0

第 5 章:`コマンドラインモード`

https://qiita.com/kagami_t/items/4f9ae55aeabb9cec24a0

## 第 2 部　ファイル

第 6 章:`複数ファイルの管理`

[]

第 7 章:`ファイルのオープンとディスクへの保存`

[]

## 第 3 部　スピードアップ！

第 8 章:`モーションによるファイル内の移動`

[]

第 9 章:`ジャンプによるファイル間の移動`

[]

## 第 4 部　レジスタ

第 10 章:`コピー&ペースト`

[]

第 11 章:`マクロ`

[]

## 第 5 部　パターン

第 12 章:`パターンとリテラルのマッチ`

[]

第 13 章:`検索`

[]

第 14 章:`置換`

[]

第 15 章:`グローバルコマンド`

[]

## 第 6 部　ツール

第 16 章:`ctagsを使ってソースコードのインデックスを作成し、ナビゲーションを行う`

[]

第 17 章:`quickfixリストを使って、コードのコンパイルとエラー発生箇所への移動を行う`

[]

第 18 章:`grep/vimgrepなどを使ってプロジェクト全体を検索する`

[]

第 19 章:`ダイヤルXを廻せ！　自動補完だ`

[]

第 20 章:`Vimのスペルチェッカを使ってタイプミスを発見、修正する`

[]

第 21 章:`それからどうする`

[]

**本記事やリンク先の各記事に「いいね」「ストック」をしていただけると今後の励みになるので、是非お願いします！**

### 参考書籍

https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Vim-%E6%80%9D%E8%80%83%E3%81%AE%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%81%A7%E7%B7%A8%E9%9B%86%E3%81%97%E3%82%88%E3%81%86-Drew-Neil/dp/4048916599

### 参考 URL

https://github.com/vim-jp/vimdoc-ja

https://github.com/yochiyochirb/practical-vim/tree/master
【Flutter】Containerを途中まで塗りつぶす

## 環境
* Android Studio： Flamingo　2022.2.1
* Flutter: 3.7.12

## Containerを途中まで塗りつぶす方法
グラデーションを利用すれば、途中まで塗ったように表現することができる。

ポイントは、colorsで最初の2色までを同じ色、あとの1色を別の色にする。
stopsで最初は0にして、残りは、任意の同じ値を設定する

```dart
// begin, endでグラデーションの方向を決める。今回は上から下へ
Container(
  width: 100,
  height: 100,
  margin: const EdgeInsets.all(8),
  decoration: const BoxDecoration(
    gradient: LinearGradient(
      begin: Alignment.topCenter,
      end: Alignment.bottomCenter,
      colors: [
        Colors.white,
        Colors.white,
        Colors.blue,
      ],
      stops: [0, 0.3, 0.3],
    ),
  ),
);
```

![Screenshot_20230612-101932.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/827233/50275893-1736-16b7-ffac-7c47be1e9988.png)

## 応用？
塗りつぶす割合をいい感じに計算すれば、
進捗率を表現することができるのでは？

0%と100%はグラデーションしなくてもいいが… :sweat_smile:

例：
```
100% -> stops: [0, 0, 0]
70%  -> stops: [0, 0.3, 0.3]
50%  -> stops: [0, 0.5, 0.5]
30%  -> stops: [0, 0.7, 0.7]
0%   -> stops: [0, 1.0, 1.0]
```

![Screenshot_20230612-102637.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/827233/0bea0fe3-2743-e596-5d11-e6c2fb68ec65.png)



## 参考サイト
https://note.com/hatchoutschool/n/n8664d276737e
QRadarのISOインストール

## ALL-In-OneのQradarインストール
※インストールに2時間ほどかかります。
Appliance Installを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/3512d167-edbe-e56f-26d6-56010323ae0b.png)
オプション説明
Appliance Install（VM等にQRadarをインストールする場合）
Software Install(RHELを個別にインストールしてその後でQRadarをインストールする場合）
HighAvailability Appliance(QRadarを冗長構成にする場合）
Data Gateway Appliance(QRadar on Cloudにつなぐ中継ログ収集装置構築する場合）

1. "All-In-One" COnsole 3199を選びNextを押します。
![１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/61e42987-b626-9c9b-8c10-4ed353935a60.png)
1. "normal"を選びNextを押します。
![２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/c4e12845-8369-99bd-e3e3-1d9eea9aff59.png)
1. Date/Time Setupで時間の入力。接続できるNTPサーバの情報を入力してNextを押します。
![３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/558866ff-a25c-0df1-70e2-e047864c78a9.png)
1. Select Continent/Areaで"Asia"を選びNextを押します。
![４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/aa9586c0-e74e-bda5-3dc9-d5b538a67cbd.png)
1. Time Zone Selectionで "Tokyo"を選びNextを押します。
![５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/09a0b942-8b92-c1c1-a93f-1888702a9a3c.png)
1. Internet Protocol SetupでIPv4を選びNextを押します。
![６.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/9e240c23-af91-e69c-eb79-815e5af80040.png)
1. Management Interface Setupにて管理インターフェイスにするNICを選択してNextを押します。
　コンソールにSSH/HTTPS接続するインターフェイスとログを受けるインターフェイスを分ける場合、インターフェイスをBonding冗長する場合等に複数のインターフェイスが必要となります。
![７.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/3f290f70-e0f1-c421-394b-4fc7d9809efe.png)
1. Hostnameの入力（FQDNでないとエラーになります。）その前項で選択したインターフェイスのプロパティ情報を登録します。
![８.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/e3d7c6eb-f60c-36c2-7d34-363f06c7c7b7.png)
1. Admin passwordを設定します。httpsでコンソールに最初ログインする際に使用されます。ログインした際に再度パスワード変更するようになります。
![９.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/559a326d-7b10-ae20-6b07-2dfa816770cc.png)
1.Root Password Setup。SSHでログインしたときに使用するパスワードをセットします。
![１０.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307206/e1b6be31-67b4-12e7-3717-5183d932d724.png)
僕の最強のデスクトップセッテング💪！！（2023年6月現在）

仕事では、Windows💻と拡張ディスプレイを利用しています。
プライベートや副業では、メインにMac Book Air🍎を利用しています。

Windows💻/Mac🍎の切替にType-Cのケーブルを抜き挿して切り替えていたのですがすごく面倒だったのでスイッチを利用して切り替えられるようにしました！
合わせてキーボードとマウスを共通化＆出来るだけ操作感を合わせてイライラ💢を解消したので設定を共有します。

# Windows💻/Mac🍎切り替えでのイライラ💢
ケーブル抜き挿しが地味に面倒。

## 切り替えスイッチを導入して解消🤩

スイッチを導入したことで切り替えがボタン一つで一瞬で切り替えられます！
仕事(Windows💻)/プライベート・副業モード(Mac🍎)以下のように切り替えて利用してます。

### 仕事モード(Windows💻)

![MyDesktopEnv(ForWork).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1985649/60b0ba6d-493d-42c9-0915-6b49d0da08fd.png)


### プライベート・副業モード(Mac🍎)

![MyDesktopEnv(ForPrivate).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1985649/ae9d2326-ab3e-d3b7-f39d-6dd0c243eedf.png)


# Windows💻/Mac🍎キーボードでのイライラ💢
キーボードのアサインが違う。配置が違う。ショートカットキーを使うときの指が違う。

例）めちゃめちゃ使うコピー＆ペースト

|OS|キーボード|使う指|
|--|--|--|
Win💻|Ctrl ＋　C|小指＋人差し指|
Mac🍎|Command + C|親指+人差し指|

## キーボードのイライラ解消🤩
・キーボードの購入：[Keychron V4](https://keychron.jp/products/keychron-v4-qmk-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%A1%E3%82%AB%E3%83%8B%E3%82%AB%E3%83%AB%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89?variant=42114678194347)（茶軸）
・キーアサインの変更：[VIA](https://keychron.jp/blogs/news/how-to-use-via-to-program-your-keyboard)を利用したキーアサインの変更

キーアサインのレイヤーを物理スイッチで変更できるので、Windows💻/Mac🍎を切り替えが可能！！
基本方針は、Windows💻/Mac🍎で　ショートカットキーを利用する指が同じになること。

### Windowsでの設定💻
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1985649/2936dcc9-ac82-024a-ba19-008d42256b2d.png)

### Macでの設定🍎
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1985649/d5c1fbc0-38e3-fdfb-175c-63dcf0b489fe.png)

### 使う指が統一されました🤩
|OS|キーボード|使う指|
|--|--|--|
Win💻|Ctrl ＋　C|小指＋人差し指|
Mac🍎|Command + C|小指＋人差し指|


### その他のポイント
Keychron V4には購入時に気づけばよかったんですが矢印キー(←↑↓→)がないので右のShift周りを矢印キーへアサイン。


# 最後に
キーボードは利用して約2カ月ほどですが初めの2週間くらいは、キーアサインをかなり試行錯誤しました。
自分の癖に合わせてキーアサインが変更できるKeychronでVIAが利用できるシリーズは個人的におすすめです。

これは現状のセッティングなので、今後もアップデートしていこうと思います。

また、MacはRaycastでショートカットキーを変更したり、Magnetでウィンドウの操作をしたりを組み合わせて操作感を統一しています。（この辺りは機会があれば共有します）
【Java】バブルソートによる配列のソート処理の実装


# はじめに
バブルソートというシンプルなソートアルゴリズムを使用して、整数配列を昇順にソートする方法を学習したのでアウトプットします。この記事では、Java言語を使用してソート処理を実装します。

## バブルソートとは
バブルソートは、隣接する要素を比較して順序が逆であれば交換する操作を繰り返すことで、配列をソートするアルゴリズムです。比較と交換を繰り返すことで、大きい要素が徐々に右端に移動し、最終的には整列された配列が得られます。

## ソート処理の実装
以下に、Java言語を使用して配列をバブルソートでソートするコードを示します。

```java:バブルソート
public class Task {


        public static void main(String[] args) {
            int[] nums = {40, 84, 10, 37, 24, 3, 58, 29, 76, 55};

            // バブルソートでソートする

            // forで要素の数分繰り返し
            for (int i = 0; i < nums.length; i++) {
                // 比較のため要素の数分繰り返し
                // 比較範囲を徐々に狭めていくため nums.length -i　が必要
                // 内側の処理で要素数 +1 が実行されるため、配列の範囲外にアクセスしないように -1 が必要
                for (int j = 0; j < nums.length - i - 1; j++) {
                    // 元の要素と次の要素と比較
                    if (nums[j] > nums[j + 1]) {
                        // 元の要素より次の要素が小さい場合は一時変数に元の要素の値を代入
                        int temp = nums[j];
                        // 元の要素を次の要素で上書き
                        nums[j] = nums[j + 1];
                        // 一時変数に代入していた元の要素で次の要素を上書き
                        nums[j + 1] = temp;
                        // 繰り返し
                    }

                }

            }
                // ソート結果の表示
            System.out.println("ソート結果:");
            for (int num : nums) {
                System.out.print(num + " ");
            }
        }

}

```
このコードでは、バブルソートアルゴリズムを使用して配列 nums を昇順にソートしています。内側のループで隣接する要素を比較し、必要に応じて交換を行います。外側のループは、ソート済みの要素が右端に確定するまで繰り返します。

## 実行結果
上記のコードを実行すると、以下のような出力結果が得られます。
```java:ソート結果の表示
ソート結果:
3 10 24 29 37 40 55 58 76 84
```


ソートされた配列が表示されます。

## まとめ
バブルソートは、シンプルで理解しやすいソートアルゴリズムとされています。この記事では、Javaを使用してバブルソートの実装方法を紹介しました。この記事が何かのお役に立てれば幸いです。
[メモ] PostgreSQLで全テーブルのレコード件数を表示する

DBにログイン後、以下のコマンドを実行する。

```sql
select relname, n_live_tup from pg_stat_user_tables where schemaname='public';
```

上記コマンドはPosgreSQL内にあるテーブル内容の統計情報を表示させているが、タイミングによっては正しい情報が表示されていないことがある。  
例えばテーブル内のレコード件数がリストア前と後で同じかどうかテストする際に、リストア後は統計情報がリセットされている。  
そういう場合はVACUUM ANALYZEコマンドで統計情報を更新する。

```sql
VACUUM ANALYZE テーブル名;
```

テーブル名を省略するとすべてのテーブルを対象とする。

```sql
VACUUM ANALYZE;
```
RubyでAtCoder ABC245(A, B, C)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC245のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。

# A - Good morning
https://atcoder.jp/contests/abc245/tasks/abc245_a
```ruby:a-245.rb
a, b, c, d = gets.split.map(&:to_i)
puts a < c || (a == c && b <= d) ? "Takahashi" : "Aoki"
```

# B - Mex
https://atcoder.jp/contests/abc245/tasks/abc245_b
```ruby:b-245.rb
gets.to_i
a = gets.split.map(&:to_i).uniq.sort

ans = 0
a.each do |number|
  if ans != number
    puts ans
    exit
  end
  ans += 1
end
puts ans
```

# C - Choose Elements
https://atcoder.jp/contests/abc245/tasks/abc245_c
```ruby:c-245.rb
n, k = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
b = gets.split.map(&:to_i)
dp = Array.new(2) { Array.new(n, false) }
dp[0][0] = true
dp[1][0] = true

1.upto(n - 1) do |i|
  if dp[0][i - 1]
    dp[0][i] = true if (a[i] - a[i - 1]).abs <= k
    dp[1][i] = true if (b[i] - a[i - 1]).abs <= k
  end
  if dp[1][i - 1]
    dp[0][i] = true if (a[i] - b[i - 1]).abs <= k
    dp[1][i] = true if (b[i] - b[i - 1]).abs <= k
  end
end
puts dp[0][n - 1] || dp[1][n - 1] ? "Yes" : "No"
```
## 解説
dp[i][j] := i=0のときAj=Xiが成り立つか、i=1のときBj=Xiが成り立つかとした動的計画法を考えることで解くことができます。なお、A(j-1), B(j-1)それぞれについて考える必要があることに注意して下さい。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
AWS サーバー複製手順(EC2)

テストをする際にステージング環境テスト用のEC2インスタンスにデプロイして、そこで確認を行なっているのですが、そのサーバーが1台しか用意されていない為各チームで待ちの状態が発生したり、都度slackでサーバーを使用する宣言を行う必要がありました。そういった状態を回避する為、自分が所属するチーム用にサーバーを用意することになりました。以下にサーバーを複製する手順について要点をまとめて記載しましたので、そういった機会があれば参考にして頂ければと思います。

### 前提
サーバーを複製するにあたり、以下は全て既存のサーバーで使用されているものを使用します。特別な理由があって新規で作成する必要がある場合はご注意ください。
・VPC
・サブネット
・セキュリティーグループ
・ドメイン(Aレコードを追加し、サブドメインを分ける運用)
・ロードバランサー
・RDS

また本記事では手順を伝えることを目的としている為、ある程度AWSへの知見がある方を対象としています。

## 既存インスタンスからイメージを作成
インスタンスの表示ページから、既存のインスタンスを選択します。画面右上のアクション→イメージとテンプレート→同様のものを起動をクリックすると、既存インスタンスを元にイメージの作成ができます。この手順を行うことでwebサーバー・mysqlなど、通常は作成したインスタンスに接続してからインストールしなければいけないものを保持したままイメージの作成を行うことができるので、1からインスタンスを作成するよりも大変楽に行えます。

## AMIからインスタンスを起動
AMIのページから、上記で作成されたイメージを選択しインスタンスを起動をクリック。設定内容として、VPC・サブネット・セキュリティーグループは既存のサーバーで使用されているものと同じものを選択します。インスタンスタイプやEBSボリュームも理由がない限りは既存のインスタンスと同じサイズで良いかと思います。キーペアは既存インスタンスと同じものを使用することを推奨します。キーペアを分けてしまうと例えばデプロイ時に新たにキー情報を記載しなければならなかったりするので、同じものを使用する方が楽です。

## ElasticIPの作成とインスタンスへの紐付け
作成したインスタンスにはパブリックIPが振られていない為、ここでIPを新規に作成してインスタンスに紐づけましょう。プライベートIPは新しく作成したインスタンスを使用します。

## ターゲットグループの作成
target typeはinstancesを選択し、VPCは既存のサーバーで使用されているものを選択します。Register targetsでは新たに作成したインスタンスを選択します。その他Health checksの設定など細々したものは既存のターゲットグループと同じ設定にしました。

## ロードバランサーとターゲットグループの紐付け
ロードバランサーのページに移動し、既存のロードバランサーからListenersのrulesをクリックして、作成したターゲットグループの紐付けを行います。

## Route53周りの設定
ホストゾーンからAレコードを作成します。エイリアスから上記で作成したロードバランサーとの紐付けを行います。このようにすることでロードバランサー経由でアクセスを処理できます。

## RDSとの接続確認
最後にRDSとの接続確認を行います。RDSはVPCに対して紐づいており、今回は既存のサーバーで使用されているVPCとセキュリティグループを選択している為、今の状態でRDSとの接続を行えるはずです。sshでサーバーに接続して、mysqlコマンドでRDSに接続確認を行いましょう。

## 終わりに
以上、簡単にAWS側でサーバーを複製する手順をまとめてみました。この他にも使用するwebサーバーによってconfigの設定を変える必要があったりするので、その点はご自身で調べて必要があるかと思います。
この他にもセキュリティグループ周りの記事を執筆しているので、良ければ覗いてみてください。
https://qiita.com/takatakaryoryo/items/b0a75adbbb6b3c65cdb7
カスタムカーネルでNVIDIAドライバを使用する

カスタムカーネルのNVIDIAドライバのインストール方法について解説します。詳しくはドキュメントを見て下さい。

環境
Nvidia GeForce GTX 980Ti
ArchLinux linux-zen

## パッケージのインストール
カスタムカーネルでは`nvidia-dkms`パッケージを利用します。
dkmsの使用にはlinuxのheadersが必要です。カスタムカーネルのheadersをインストールしてください。
今回はzenカーネルを使用しているので`linux-zen-headers`をインストールします。

```sh:shell
sudo pacman -S linux-zen-headers nvidia-dkms
```
あとは、`etc/X11/nvidia.conf`など編集し、ドライバを再ロードしてください。

以上です。

## 参考文献
https://wiki.archlinux.jp/index.php/NVIDIA