OmniAICreator/Qiita-1.07M huggingface dataset:
openAIのレスポンスを翻訳

## 概要
- OpenAIのAPIを使ってレスポンスを英語で返してもらい、トークン量の節約をします。
- レスポンスをDeepLのAPIを使って日本語翻訳して出力します。

## 前提条件
- OpenAIの各種IDやAPIキーを取得している事。
- DeepLのAPIキーを取得する事。

## 開発環境
- python
- VScode

## 使用するモジュール
```python:インポート
import os
from openai import OpenAI
import markdown
import requests
```

## OpenAIのモデルについて
- OpenAIについては下記を参照
- [OpenAIモデルについて](https://platform.openai.com/docs/models)

## OpenAIにアクセスし、英語のレスポンスを受ける

```python:OpenAI_API
## Markdownファイルを読込み、txt形式で返す関数
def markdown_txt(input_file_path):
    with open(input_file_path, 'r', encoding='utf-8') as markdown_file:
        markdown_content = markdown_file.read()
    return markdown_content

## マークダウンファイル形式に保存する関数
def save_to_markdown(filename, content):
    with open(filename, 'w') as file:
        file.write(content)

jp_txt_input = markdown_txt([マークダウンのファイルパス])

set_en="すべての回答を英語でお願いします。"

## OpenAIにアクセス
client = OpenAI(api_key=[OpenAiのAPIキー],organization=[組織id],project=[プロジェクトid])
stream = client.chat.completions.create(
    model="gpt-4o-mini", ##モデルを設定
    messages=[
      {"role": "system", "content": set_en},
      {"role": "user", "content": jp_txt_input}],
    stream=False,
)

## OpenAIから返ってきた内容（英語）をマークダウン形式で保存
en_post_txt = stream.choices[0].message.content
save_to_markdown(f'[保存先のファイルパス].md', en_post_txt)
```

## 返ってきた英語の内容をDeepLで翻訳し、日本語で出力
```python:DeepL_API
input_text = en_post_txt
input_lang = 'EN'
target_lang = 'JA'

# パラメータの指定
params = {
  'auth_key': [DeepLのAPIキー],
  'text': input_text,
  'source_lang': input_lang,
  'target_lang': target_lang
}

# リクエストを投げる
jp_request = requests.post("https://api-free.deepl.com/v2/translate", data=params)
jp_result_json = jp_request.json()

jp_post_content=jp_result_json['translations'][0]['text']

## MDとして出力
save_to_markdown(f'[出力先ファイルパス].md',jp_post_content)
```

## 最後に
- モデル：gpt-4o-miniの場合、日本語出力に比べ英語出力の方が約2割ほどのトークン量削減ができました。
- OpenAiのモデルによってトークン量や値段が異なります。

|モデル|max output tokens|入力(単位：ドル/1M tokens)|出力入力(単位：ドル/1M tokens)|
|:----|:----|:----|:----|
|gpt-4-mini|16,384|0.15|0.6|
|gpt-4o|4,096|5|15|
|gpt-4-turbo|4,096|10|30|
|gpt-4|8,192|30|60|
|gpt-3.5-turbo|16,385|0.5|1.5|

:::note warn
上記の表は2024/08時点でまとめた表です。
詳細は公式で確認してください。
:::
ubuntu 24.04 LTSで自宅サーバー構築（CGI スクリプトを利用）

<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
taisuke@ubuntuserver:~$ sudo a2enmod cgid
Enabling module cgid.
To activate the new configuration, you need to run:
  systemctl restart apache2
taisuke@ubuntuserver:~$ sudo systemctl restart apache2
#テストスクリプト作成
taisuke@ubuntuserver:~$ sudo cat > /usr/lib/cgi-bin/test_script <<'EOF'
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello CGI\n";
EOF
taisuke@ubuntuserver:~$ sudo chmod 705 /usr/lib/cgi-bin/test_script
#動作確認
taisuke@ubuntuserver:~$ sudo curl localhost/cgi-bin/test_script
Hello CGI
taisuke@ubuntuserver:~$ sudo vi /etc/apache2/conf-available/cgi-enabled.conf
#新規作成
#[AddHandler cgi-script] に CGI として扱うファイルの拡張子を指定
<Directory "/var/www/html/cgi-enabled">
    Options +ExecCGI
    AddHandler cgi-script .cgi .pl .py .rb
</Directory>
taisuke@ubuntuserver:~$ sudo mkdir /var/www/html/cgi-enabled
taisuke@ubuntuserver:~$ sudo a2enconf cgi-enabled
Enabling conf cgi-enabled.
To activate the new configuration, you need to run:
  systemctl reload apache2
taisuke@ubuntuserver:~$ sudo systemctl reload apache2
CGI を許可したディレクトリ配下に CGI テストページを作成して動作確認をします。
任意のクライアントコンピューターから Web ブラウザーでテストページにアクセスして、正常にページが表示されれば OK です。
taisuke@ubuntuserver:~$ sudo vi /var/www/html/cgi-enabled/index.cgi
#!/usr/bin/python3
print("Content-type: text/html\n")
print("<html>\n<body>")
print("<p style=\"width: 100%; font-size: 40px; font-weight: bold; text-align: center;\">")
print("CGI Script Test Page")
print("</p>")
print("</body>\n</html>")
taisuke@ubuntuserver:~$ sudo chmod 755 /var/www/html/cgi-enabled/index.cgi
![cgi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858002/79b218a6-d0f7-d72c-698d-ffb2cd33ba97.jpeg)
<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
ubuntu 24.04 LTSで自宅サーバー構築（メールクライアントの設定）

<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
Thunderbird を起動し、[アカウントのセットアップ] - [メール] をクリックします。
![mailclient.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858002/d572fff5-3cc6-2ebb-daa1-4cca165e7728.jpeg)
メール送信者として表示する名前、メールアドレス、パスワードを入力して [続ける] をクリックします。
![mailclient2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858002/57c79100-b395-8df0-14db-c03bcb18a3c4.jpeg)
[手動設定] をクリックします。
![mailclient3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858002/1bce72ad-83db-6600-1630-0f8b3e666e26.jpeg)
これまでの入力内容 および 認証方式のフィールドが [通常のパスワード認証] になっていることを確認して [完了] をクリックします。
![mailclient4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858002/cc7d32ab-810a-afce-abdf-4a9b18219fea.jpeg)
通信内容が暗号化されてない旨の警告です。良ければ完了します。
![mailclient5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858002/999746e7-69b2-e915-24c0-3b4fd1cc64d9.jpeg)
メールアカウントの設定が正常に完了すると、メールの送受信が利用できるようになります。
![mailclient6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858002/caffab42-22af-485d-e797-efd52f4310db.jpeg)
<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
[Delphi][小ネタ]しかのこのこのここしたんたん

# はじめに

> paiza×Qiita記事投稿キャンペーン「プログラミング問題をやってみて書いたコードを投稿しよう！」

というキャンペーンをやっていたものの paiza の問題限定だったので参加はできない…でも、そういえばツイッターで次の問題を

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【応用問題】しかのこのこのここしたんたん≪改行≫✕10を、&quot;しかのこたん&quot;という文字配列一つから生成せよ</p>&mdash; あうぇっど (@Awed_Urshy) <a href="https://twitter.com/Awed_Urshy/status/1821112609799913615?ref_src=twsrc%5Etfw">August 7, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

DEKO さんが Delphi で書いてたので、それを真似て回答してみる！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Delphi で書いてみた。<a href="https://t.co/01hHar9qP3">https://t.co/01hHar9qP3</a> <a href="https://t.co/c7q9ZjO1nb">pic.twitter.com/c7q9ZjO1nb</a></p>&mdash; DEKO (@ht_deko) <a href="https://twitter.com/ht_deko/status/1821716011957268567?ref_src=twsrc%5Etfw">August 9, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 回答

勝手にコードゴルフにした！

```delphi:110文字
begin const S='しかのこたん';for var i:=0to 79do Write(Copy(S[4]+S+#10#13,Ord('24441668'[7and i+1])-48,2))end.
```

```delphi:清書
begin
  const S = 'しかのこたん';
  for var i:= 0 to 79 do
    Write(Copy(S[4] + S + #10#13, Ord('24441668'[7 and i + 1]) - 48, 2))
end.
```

これ以上短くできなかった…
```24441668``` を出せる短い数式があれば…（長い数式はある）

# おわりに

もっと短いコード見たい！
Ubuntuのユーザーを最初に作成する

# Ubuntuを使い慣れていないがUbuntu24.04を使ってみた。
試しにgitをインストールして再起動してみるとgitはなくなっている。
再起動するたびになくなっている。

# 解決
ubuntuのユーザーを登録したらgitが残ってた。
# 出典
https://pc.watch.impress.co.jp/docs/column/ubuntu/1590461.html

# 感想
ユーザーを作らなくても操作できていたので意識していなかった。

もっと勉強しなくてはならない。

https://www.virtualbox.org/wiki/Linux_Downloads
Podman よく使うコマンド

# はじめに
よく使うPodmanのコマンドを以下にまとめました。
忘れた時に見返せるようにとメモした程度のため、詳しい解説はありませんのでご了承ください。

# コマンド一覧目次
- [イメージ](#イメージ)
    - [イメージ取得](#イメージ取得)
    - [イメージ一覧表示](#イメージ一覧表示)
    - [イメージ削除](#イメージ削除)
    - [イメージ削除(全て)](#イメージ削除全て)
<br>

- [コンテナ](#コンテナ)
    - [コンテナの作成(コンテナ名付与)](#コンテナの作成コンテナ名付与)
    - [コンテナ作成&起動（バックグラウンド実行）](#コンテナ作成起動バックグラウンド実行)
    - [コンテナ一覧表示（起動中のコンテナ）](#コンテナ一覧表示起動中のコンテナ)
    - [コンテナ一覧表示（全て）](#コンテナ一覧表示全て)
    - [コンテナ削除](#コンテナ削除)
    - [コンテナ削除(全て)](#コンテナ削除全て)
    - [停止中のコンテナ起動](#停止中のコンテナ起動)
    - [起動中のコンテナ停止](#起動中のコンテナ停止)
    - [起動中のコンテナにログイン](#起動中のコンテナにログイン)
<br>

- [pod](#pod)
    - [pod作成(pod名付与)](#pod作成pod名付与)
    - [podの一覧表示](#podの一覧表示)
    - [停止中のpodを起動](#停止中のpodを起動)
    - [pod停止](#pod停止)
    - [pod削除](#pod削除)
    - [コンテナを作成&起動してpodの中に追加](#コンテナを作成起動してpodの中に追加)
    - [podのYAMLファイル生成(ファイル名指定)](#podのyamlファイル生成ファイル名指定)
    - [生成したYAMLファイルを元にpodを生成](#生成したyamlファイルを元にpodを生成)

## <font color="gray">イメージ</font>

### イメージ取得
```shell
podman pull nginx
```

### イメージ一覧表示
```shell
podman images
```

### イメージ削除
```shell
podman rmi nginx:latest
```

### イメージ削除（全て）
```shell
podman rmi --all
```
<br>

[目次に戻る](#コマンド一覧目次)

## <font color="gray">コンテナ</font>

### コンテナの作成(コンテナ名付与)
```shell
podman create --name container-name-nginx nginx:latest
```

### コンテナ作成&起動（バックグラウンド実行）
```shell
podman run -it -d nginx:latest /bin/sh
```

### コンテナ一覧表示（起動中のコンテナ）
```shell
podman ps
```

### コンテナ一覧表示（全て）
```shell
podman ps -a
```

### コンテナ削除
```shell
podman rm container-name-nginx
```

### コンテナ削除（全て）
```shell
podman rm --all
```

### 停止中のコンテナ起動
```shell
podman start container-name-nginx
```

### 起動中のコンテナ停止
```shell
podman stop container-name-nginx
```

### 起動中のコンテナにログイン
```shell
podman exec -it container-name-nginx /bin/sh
```
<br>

[目次に戻る](#コマンド一覧目次)

## <font color="gray">pod</font>

### pod作成(pod名付与)
```shell
podman pod create --name nginx-ubuntu-pod 
```

### podの一覧表示
```shell
podman pod ps
```

### 停止中のpodを起動
```shell
podman pod start nginx-ubuntu-pod
```

### pod停止
```shell
podman pod stop nginx-ubuntu-pod 
```

### pod削除
```shell
podman pod rm nginx-ubuntu-pod
```

### コンテナを作成&起動してpodの中に追加
```shell
podman run -dt --pod nginx-ubuntu-pod --name container-name-nginx nginx:latest
```
```shell
podman run -dt --pod nginx-ubuntu-pod --name container-name-ubuntu ubuntu:latest
```

### podのYAMLファイル生成(ファイル名指定)
```shell
podman generate kube -f ./nginx-ubuntu-pod.yaml nginx-ubuntu-pod
```
:::note
上記のようにファイル名と配置先（./）を指定すると、後にyamlファイルを管理（や編集）しやすくなるのでおすすめ
:::

### 生成したYAMLファイルを元にpodを生成
```shell
podman kube play nginx-ubuntu-pod.yaml
```
<br>

[目次に戻る](#コマンド一覧目次)

# おわりに
よく使うコマンドが増えてきたら追加していく予定
[next.js]ダイナミックルーティングのパラメータの取得


以下のディレクトリ構造の場合を想定

```
app/
  └── sample/
        └── [id]/
              └── page.tsx
```

```
import { useParams } from 'next/navigation';

export default function SamplePage() {
  const params = useParams();
  const { id } = params; // idを取得

  return <p>Sample ID: {id}</p>;
}
```

※ver13以降、useRouterはApp Router用ではなく、next/navigationからインポートする必要がある
TensorFlow Liteを使ってみる

## はじめに
せっかくRaspberry Piをもっているので、最近のトレンドであるディープラーニングを試してみようかなと思い始めました。ディープラーニングの進化は早いので情報に乗り遅れないようにするため、まずはRaspberry Piを使ってディープラーニングを体験してみたいと思います。

手順は以下を参考にしました。
[Pythonクイックスタート](https://www.tensorflow.org/lite/guide/python?hl=ja)

## 動作環境
デバイス：Raspberry Pi 4
OS：Raspberry Pi OS（64ビット版）

## 手順通りに試してみるが。。。
Raspberry PiにWindowsからSSHで接続して上記リンクの手順を試しています。

```
$ python3 -m pip install tflite-runtime
```
いきなり躓きました。上記コマンドを入力すると以下のようなエラーになります。
![tflite-runtime_install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/2e6c48ec-9c9a-8012-d0f1-6cea15b1dd69.png)
aptのようなOSのパッケージ管理ツールとPython特有のパッケージ管理ツール（pip）の間にコンフリクト（両方のツール間でPython APIの不適合が発生すること）があるので、pipは仮想環境内の閉じた空間でのみインストールできるようにした模様。この仮想環境内であればPython3のフルパッケージのインストールが可能とのこと。
なるほど。納得。ということで以下のような手順で、TensorFlow Liteをインストールするために仮想環境を作成します。
```
$ python -m venv virttest
$ source virttest/bin/activate
```
virttestは仮想環境の名前（これは任意の名前でOK）。
これで仮想環境を作成できたので、この空間内でTensorFlow Liteをインストール。
```
(virttest) $ pip3 install tflite-runtime
```
![tflite-runtime_install2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/ed2960c2-0537-42ac-4b9c-085580cf1a61.png)
無事、インストールできました！
さて、次にサンプルを取得します。サンプルは以下のステップ2から取得できます。
[TensorFlow Liteチュートリアル](https://www.tensorflow.org/lite/guide/build_rpi?hl=ja)
[Download sample model and image](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/examples/python/)
サンプルを取得できたので、さっそくTensorFlow Liteを動かしてみます。
![label_image_err.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/8aea80f0-e2dc-5ce1-7ef5-50e4282caa1e.png)
TensorFlow Liteはインストールしましたが、TensorFlowはインストールしていないのでエラーになりましたね。
[Pythonクイックスタート](https://www.tensorflow.org/lite/guide/python?hl=ja)
を参考にソースコードを修正して再チャレンジしてみます。
![tflite_sample_err2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/fe1657a9-93e3-a214-3646-f21ab17a4e81.png)
また、エラーになってしまいました。。。今度はNumPyのバージョンが合っていない模様。NumPyのバージョンを戻してみます。
```
(virttest) $ pip3 uninstall numpy
(virttest) $ pip3 install numpy==1.22.3
```
NumPy 1.22.3はインストールできたのですが、なにやらエラーが。。。
![numpy_install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/1de0b2dd-1540-b485-07eb-9cc5d6d3a799.png)
tflite-runtime 2.14.0は、NumPyの1.23.2以上のバージョンが必要のようです。。
うーむ、互換性があるんですね。NumPyの1.23.2をインストールしなおします。
```
(virttest) $ pip3 uninstall numpy
(virttest) $ pip3 install numpy==1.23.2
```
いろいろと試行錯誤しましたが、無事、TensorFlow Liteを実行できたようです。
![tflite_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/df410b04-a2c5-e2c3-0bbd-4cc4d8b564b2.png)

## 補足
上記以外にlabel_image.pyを実行すると以下のエラーも発生しました。
![PIL_err.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/85c52ff9-ec61-3f9d-ed08-4c5e163acf77.png)
Pillowという画像処理ライブラリが必要な模様。以下のコマンドでインストールしました（PILは現在開発がStopしており、Pillowがその代替として使われているとのこと）。
```
(virttest) $ pip3 install pillow
```
PhpStormとMAMPのMySQL接続ではまったのでメモ

# PhpStormでMAMPのMySQLに繋げたい
困った人のお役に立てばと思い、めっちゃ簡単ですがメモしておきます。
## MAMP PROのバージョンは6.9。環境はmac
macでMAMP利用しています。
こんな画面のバーチャルホストが簡単にできるMAMP6.9です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94283/fe1fa645-cbfb-47f6-793d-41cee4acdfc4.png)

# エラー発生：Case sensitivity: plain=mixed, delimited=exact Connection refused.
下記のエラーで全然接続できません。
```
DBMS: MySQL (ver. 5.7.39)
Case sensitivity: plain=mixed, delimited=exact
Connection refused.
```
## 原因：MySQLのポートが閉じている
おそらく仮想ホストにしているせいだと思うのですが。
下記でポート番号を変えても、全然うまくいきませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94283/9fed11e0-ae32-54d8-49b6-5932690d906a.png)

ちゃんとポートをリッスンしているのか？と調べてみても、していません。
```
(base) iMac:~ $ nc -vz localhost 8889
nc: connectx to localhost port 8889 (tcp) failed: Connection refused
nc: connectx to localhost port 8889 (tcp) failed: Connection refused
(base) iMac:~ $ nc -vz localhost 3306
nc: connectx to localhost port 3306 (tcp) failed: Connection refused
nc: connectx to localhost port 3306 (tcp) failed: Connection refused
(base) iMac:~ $ lsof -i :3306
(base) iMac:~ $ lsof -i :8889
(base) iMac:~ $ netstat -an | grep LISTEN | grep 8889
(base) iMac:~ $ netstat -an | grep LISTEN | grep 3306
```
じゃあ、どうやってMAMPはMySQLに接続しているのか？と調べてみると、Socket接続していたのですよね。
```
(base) iMac:~ $ netstat -an | grep -i mamp
f3b1bfa5bff21e1f stream      0      0 f3b1bfa0f63a6017                0                0                0 /Applications/MAMP/tmp/mysql/mysql.sock
f3b1bfa5bff21717 stream      0      0 f3b1bfa0f9b36647                0                0                0 /Applications/MAMP/Library/logs/cgisock.18504
f3b1bfa5bff21d57 stream      0      0 f3b1bfa0f7190d7f                0                0                0 /Applications/MAMP/Library/logs/wsgi.18504.2.2.sock
f3b1bfa5bff20907 stream      0      0 f3b1bfa0f71b97d7                0                0                0 /Applications/MAMP/Library/logs/wsgi.18504.2.1.sock
```
## PhpStormをSocket接続にして解決
左下のConnection type:で「Unix Socket」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94283/83bb4752-0818-8406-28ad-04f1ee603db0.png)

ただ下記エラーが発生しました。
```
DBMS: MySQL (ver. 5.7)
Case sensitivity: plain=mixed, delimited=exact
'java.net.Socket com.mysql.cj.protocol.ExportControlled.performTlsHandshake(java.net.Socket, com.mysql.cj.protocol.SocketConnection, com.mysql.cj.ServerVersion)'.
```
SSLを使うと駄目っぽいので、userSSL=falseのパラメーターを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94283/df0cb65b-45e5-e604-a0f3-90aeadf435c8.png)

上記でうまくいきました！
### 補足
SocketでもCase sensitivityエラーが出たことから、ひょっとするとPort接続の時もSSL経由をやめて接続するなどの設定次第でうまくいった可能性がありますが、Socketで接続できたので、そこまで検証していません。
もしこのあたりご存知の方はコメント頂けると嬉しいです。
超初心者向け！DynamoDBのストレージクラスを簡単解説

### はじめに
DynamoDBのストレージクラス「スタンダード」と「スタンダードIA」について、それぞれの特徴や使い方を超初心者向けにわかりやすく解説します。

### DynamoDBのストレージクラスとは？

DynamoDBには、2種類のストレージクラスが用意されています。

- **スタンダード**: 通常のストレージクラスで、データが頻繁にアクセスされる場合に適しています

- **スタンダードIA（Infrequent Access）**: 保存コストが約60%低く、アクセス頻度が少ないデータの保存に適しています。ただし、データ操作コストが若干高くなります
![(2) [Japanese] Hot and Cold Data in DynamoDB - Amazon DynamoDB Nuggets _ Amazon Web Services (2).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102361/fe1d7074-1d6a-6949-71c9-8660313fab95.jpeg)

### ストレージクラスの選び方

- **スタンダードの特徴**:
  - アクセスが頻繁なデータ向け
  - 通常の保存コスト

- **スタンダードIAの特徴**:
  - 長期保存向けでコストを抑えたい場合に
  - アクセス頻度が低いデータにベスト

### 具体例と判断基準

例えば、アプリケーションのログや監査用データなど、保存が主目的でアクセスが少ないデータの場合、スタンダードIAが適しています。
ストレージコストがスループットコストよりも大きい場合も、このクラスが最適です。
![(2) [Japanese] Hot and Cold Data in DynamoDB - Amazon DynamoDB Nuggets _ Amazon Web Services (3).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102361/f10126f4-48b1-1149-c0da-70b48de8d7f6.jpeg)

![(2) [Japanese] Hot and Cold Data in DynamoDB - Amazon DynamoDB Nuggets _ Amazon Web Services (6).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102361/2e1a7b55-c24c-ac60-288d-afb81f2c9620.jpeg)

### おわりに

DynamoDBのストレージクラスをうまく使い分けることで、コストの最適化ができます。このブログが、皆様のDynamoDBの理解と活用に役立つことを願っています。

以上が今回の内容です。ありがとうございました。

**関連情報**
* [ Hot and Cold Data in DynamoDB - Amazon DynamoDB Nuggets | Amazon Web Services](https://youtu.be/JY_GA_rfp4c?si=bjhkkNeI88DQzp6L)

* [AWS DynamoDB ドキュメント](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.html)
* [DynamoDB ストレージクラス](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.StorageClasses.html)
「ハッキングラボのつくりかた 完全版」でnetdiscoverが通用しなかった件

## 問題

netdiscoverコマンドを実行してもPotato（やられサーバー）を検出できない。
構築環境は「ハッキングラボのつくりかた　完全版」を参考に次の通りとした。
アタックPCのParrotOSはMac（M3）にUTMをインストールし準備、やられサーバーのPotatpは普段使用していない古いPCにインストールしたVirtualBoxで立ち上げた。
それぞれネットワーク設定をブリッジとし、同じWi-fi環境に接続。

## 解決方法

nmapコマンドを使用する。
netdiscoverコマンドではPotatoを発見することができないのでnmapコマンドで調査して見つける必要がある。
nmapで見つけた後はnetdiscoverコマンドでも表示されるようになる。
ちなみに同一PC内でParrotOSとPotatoを起動し共有ネットワーク（ホストオンリーアダプタ）とするとnetdiscoverで普通に検出できる。

## 終わりに

netdiscoverでPotatoが表示されないことでかなりの時間を潰してしまった。後で振り返ってみるとやりたいことを実現する手段は色々あるのだから本に書いてあることに拘らずできることを試すべきだった。

netdiscoverはARPリクエストによって検出を行なっているようなのでwi-fi接続では仮想環境内にはうまく届かないのか？（当然ホスト側OSは検出できていた。仮にPotatoがARPリクエストに応答しない仕様なら共有ネットワークでも検出できないはずなので通信路に依存する問題と予想）nmapで一度疎通してしまえばその後は検出できるみたい。これは疎通ができたことでARPテーブルに登録されたからか？
ARPリクエストを受け取る側でWiresharkを使って調べてみれば新たな発見がありそう！
OCI コスト管理サービス: FinOps Hub

OCI(Oracle Cloud Infrastructure)にはお客様がコスト管理をするために無料で利用できる標準サービスが提供されており、順次紹介していきます。今回はこれらのPortalサイトとなるOCI FinOps Hubです。

第１回　OCI FinOps Hub(本稿)
第２回　OCI Cloud Advisor https://qiita.com/nsaka0315/items/73906772854b675e11d5
第３回　OCI Bugedts　https://qiita.com/nsaka0315/items/460dd316defabdc0fc2b
第４回　OCI Cost&Usage Report
https://qiita.com/nsaka0315/items/d1faba63218596d8982b
第５回　OCI Cost Analysys https://qiita.com/nsaka0315/items/61b65a1bc3ae7805a32f

# FinOpsについて
まずFinOpsについて簡単に触れます。FinOpsは業界標準のCloudコスト管理のフレームワークであり、下記図のようにInform、Optimize、Operateの３フェーズのサイクルからなり、OCIでは各フェーズで上記のコスト管理サービスが提供されています。
![スクリーンショット 2024-08-20 16.43.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849840/926c0147-4e6f-5541-4ae6-cb8dd7051f90.png)
FinOpsについて関心のある方は下記を参考ください。
[FinOpsとOCIコスト管理サービスについて](https://blogs.oracle.com/oracle4engineer/post/finopsoci)
# FinOps Hubについて
さてOCI管理コンソールにOCI FinOpsハブのPortalサイトが新しくリリースされました(2024/06)
OCI管理コンソールの左上のハンバーガーメニューより[請求とコスト管理]-[コスト管理]で下記の画面が現れます。
![スクリーンショット 2024-07-31 11.03.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849840/265ba23f-2dcb-7860-1ab6-35da4ba66a45.png)

これはOCI標準提供の様々なコスト管理サービスのPortalサイトであるだけでなく、このページを見ることでお客様のコスト観点からのOCI利用状況が一目で把握できます。現在のサブスクリプションの利用状況やコスト分類のグラフ、予測支出や予算管理、またCloudコストの最適化を図るための推奨事項の一覧(Cloud Advisor)を参照することができます。

本画面をスクロールするとFinOpsの3フェーズである情報提供,最適化,運用のパートが順番に現れます。

## 情報提供(Inform)
### アクティブなサブスクリプション
まず、情報提供のすぐ下にあるのが、アクティブなサブスクリプションの表示です。過去1年間のサブスクリプションの使用量(月ごと)が、超過分を含めて表示されます。特定の月の使用量や超過量などの詳細を表示するには、棒グラフの縦棒にマウス・ポインタを重ねます。

### コスト　
画面をスクロールすると、下記のようにコストの情報が表示されます。リージョン、コンパートメントおよび製品説明別にコストをビジュアル化できます。各ドーナツ・チャートが使用可能で、円グラフの上にマウスを置くと、地域、コンパートメントまたは製品説明のコスト詳細が現地通貨で表示されます。
「時間枠」から、過去1か月(デフォルト)~6か月までの日付範囲の選択が可能です。「コストの分析」をクリックすればコスト分析の画面に直接移動します。

![スクリーンショット 2024-07-31 11.04.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849840/49bbfae3-a6e4-2887-f648-6039449a7149.png)

### 予算と予測
コストの下が、予算と予測の画面です。アクティブな予算を表示し、予算を作成して予算に対する支出をモニターし、予測支出を管理できます。ここでは過去に作成された予算の一覧が表示されています。リストの予算名をクリックすると、予算の詳細ページに移ります。またこの画面から予算の作成ボタンを押すと予算を作成できます。

## 最適化(Optimize) 
最適化ではクラウド・アドバイザが搭載されています。クラウド・アドバイザは
十分に利用されていないリソースを特定し、最適なサイズに変更することでコスト削減可能な推奨事項を生成してクラウド利用費用の適正化に貢献できます。画面の左では、月毎の潜在的な(推定)節約額と月次請求割合が右側には推奨事項タイプの一覧が表示されています。
「全ての推奨事項」ボタンを押すことで、クラウド・アドバイザの推奨事項一覧の画面に移動します。「推奨タイプ」で、名前をクリックして、特定の推奨事項のクラウド・アドバイザの詳細ページに移動することもできます。

![スクリーンショット 2024-07-31 11.04.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849840/a6f3d951-35cd-9078-d7f2-93f2840ca1b3.png)

## 運用(Operate)
### FinOps FOCUS準拠データのエクスポート
エクスポートのリンクを押すことで、コストおよび使用状況レポートの画面に移ります。上の情報提供で紹介した「コスト分析」の画面より詳細なコストおよび使用状況レポートを参照することが可能です。

ここではFOCUS以下に、業界標準のFinOpsFOCUS(Open Cost and Usage Specification:コストと使用状況のデータセットの共通フォーマットを定義するオープンソース仕様)に対応したレポートを見ることもできます。

## 参考情報
*1 [FinOps Foundation](
https://www.finops.org/)
*2 [OCI FinOps Hubの使用](
https://docs.oracle.com/ja-jp/iaas/Content/Billing/Concepts/FinOps.htm)
*3 [クラウド・アドバイザ](
https://docs.oracle.com/ja-jp/iaas/Content/CloudAdvisor/Concepts/cloudadvisoroverview.htm)
AWS クラウドプラクティショナー　勉強法

<h1>はじめに</h1>
AWS クラウドプラクティショナーの資格を取得したため、勉強方法やオンライン試験についてをまとめておきます。<br>
スコアは764点でぎりぎりの合格だったため、高得点での合格を目指したい場合はお勧めしません。
<h1>試験概要</h1>
<table border="1">
    <tr>
      <th>受験料</th>
      <td>16,500円　※2024年6月時点</td>
    </tr>
    <tr>
      <th>受験時間</th>
      <td>90分</td>
    </tr>
     <tr>
      <th>受験方法</th>
      <td>会場、オンライン</td>
    </tr>
     <tr>
      <th>問題数</th>
      <td>65問</td>
    </tr>
      <tr>
      <th>回答形式</th>
      <td>多肢選択式　4つの選択肢から1つ選択<br>
        複数回答式　5つ以上の選択肢から2つ以上選択
    　</td>
    </tr>
    <tr>
      <th>合格点</th>
      <td>700点</td>
    </tr>
  </table>
<h1>勉強方法</h1>
勉強期間は約2週間で1日3時間～4時間ほどです。<br>
<h3>1.概要を理解する<br></h3>
以下の参考書を使用して、AWSの全体像を理解する。<br>
機能の詳細は模擬試験を解きながら確認していたので、ここでは機能名と機能の概要を簡単に確認しておきます。<br>
練習問題にしか記載されていない機能があるため練習問題は解いておきます。<br>
また、youtubeに各機能について簡単に説明している動画もあるため見ておくと理解しやすいです。


<a href="https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403">AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー 単行本</a>



<h3>2.模擬試験を解く<br></h3>
udemyの以下の練習問題を合格率が90％を超えるまで解きます。<br>
間違えた問題は解説、AWSの公式サイト、参考書で確認します。<br>
模擬試験の本番レベル③、④は応用問題なのでそれ以外の問題を優先的に行いました。<br>
AWSの公式サイトにも問模擬試験がありますが、問題数がすくないため試験前に1回だけ解きました。

<a href="https://www.udemy.com/course/aws-4260/?couponCode=JUST4U02223">【CLF-C02版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（6回分390問）</a>

<h1>オンライン試験について</h1>
試験の申し込みは、AWSの公式サイトにて行います。<br>
オンライン試験は、事前にピアソンOnVUEのインストールおよびシステムテストが必要です。<br>
<h3>試験当日の流れ</h3>
1.ピアソンOnVUEを起動して、チェックインする。<br>
2.作業環境の確認。(チャットまたは音声で案内されます。)<br>
4.試験実施<br>
5.アンケート回答<br>
6.合格発表
<h3>注意点</h3>
<ul>
<li>試験当日は作業環境の確認に時間がかかることがあるため、早めにチェックインする。<br>
<li>受験場所の周りには必要最低限のものしか置かない。<br>
※椅子に掛けているカバンやPCの周辺機器についても指摘されました。
<li>カメラで部屋全体を写すためカメラを動かせるようにしておく。
<li>腕をカメラに写すよう指示されるため、腕時計等は外しておく。
<li>音声案内となった場合もヘッドホン等の使用はできないため、PCのマイクとスピーカーを使用する。</li>
<li>物を移動するよう指示された場合は、移動後の場所もカメラに移すよう指示される。
<li>合格結果は受験後すぐに表示されるが、点数等を記載した試験結果メールは数日後に届く。
</ul>
【C#5】デリゲート処理の実装

# はじめに
.Net Coreに搭載されている**デリゲート処理**について勉強し、実装しました。

## デリゲート処理とは?
>日本語で、「移譲する」という意味で、他のクラスのメソッドを参照するオブジェクトのことを指し、主にイベント処理などに用いられる重要な概念です。

## 実装したソースコード
実装したソースコードは下記になります。

```C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Nogizaka1
{
    //  デリゲート
    delegate void Operation(string str1,string str2);
    //  Msgクラス
    class Msg
    {
        public void concat1(string a, string b)
        {
            Console.WriteLine("{0}は{1}なのでかわいい", a, b);
        }
        public void concat2(string a, string b)
        {
            Console.WriteLine("{0}は{1}なのであざとい", a, b);
        }
    }
    //  Programクラス
    class Program
    {
        static void normal(string a, string b)
        {
            Console.WriteLine("{0}は{1}です。", a, b);
        }
        static void Main(string[] args)
        {
            Msg m = new Msg();
            //  デリゲートの設定
            Operation o1 = new Operation(normal);
            Operation o2 = new Operation(m.concat1);
            Operation o3 = new Operation(m.concat2);
            //  デリゲートで設定したメソッドの呼び出し
            o1("奥田いろは","乃木坂5期生");
            o2("井上和","センター");
            o3("一ノ瀬美空","必殺技を持ち");
        }
    }
}
```

## 実行結果

![nogizaka.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/05e08042-9e9b-7e0e-6c9a-232d0512969a.jpeg)


# 最後に
デリゲート処理について勉強したので、実装しました。
flaskで作成したwebアプリをCloud Runにデプロイする手順

## はじめに
Flaskを用いてAPIで取得してきた商品データを一覧表示するだけの簡単なアプリケーションを一旦Cloud Runにデプロイしてみた際の手順を備忘録として徒然なるままにまとめてみた。

追記
アプリケーションの詳細まったく書いてなかったので別記事にでも書こうかなあと思ったり思わなかったり。

## アプリケーションのディレクトリ構成
ディレクトリ構成は以下
今後機能を追加していくことを考慮してblueprintを利用

```
root/
　├ apps/
　│  ├ list/ 
　│  │   ├ __init__.py
　│  │   ├ models.py　
　│  │   └ views.py
　│  ├ app.py
　│  └ config.py
　├ migrations/
　├ venv/
　├ local.sqlite
　└ requirements.txt
```

## 1. requirements.txtの作成
毎回これのやり方を忘れるからいい加減覚えたい。
```
pip freeze > requirements.txt
```

## 2.Dockerfileの作成
rootディレクトリに以下のコマンドでDockerfileを作成
(Windows環境なのでコマンドプロンプトで以下を実行し、空のDockerfileを作成)
```
type nul > Dockerfile
```

作成したDockerfileに以下の内容を記述

```
# ベースイメージを指定
FROM python:3.11

# apt-getのversionを更新してSQLite3をインストール
RUN apt-get update && apt-get install -y sqlite3 && apt-get install -y libsqlite3-dev

# コンテナ上のワーキングディレクトリを指定
WORKDIR /usr/src/

# ディレクトリとファイルのコピー
COPY ./apps /usr/src/apps
COPY ./local.sqlite /usr/src/local.sqlite
COPY ./requirements.txt /usr/src/requirements.txt

# pipのversionの更新
RUN pip install --upgrade pip

# 必要なライブラリをコンテナ内の環境にインストール
RUN pip install -r requirements.txt

# "building..."を表示させる処理
RUN echo "building..."

# 必要な環境変数の設定
ENV FLASK_APP="apps.app:create_app"

EXPOSE 5000

# "docker run"実行時に実行される処理
CMD ["flask", "run", "-h", "0.0.0.0", "--port", "8080"]

```

環境変数の指定の仕方にお叱りをうけたので修正
 ```- LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format (line 25)```

 cloud run はport番号8080を指定しないとエラー起きるためflask runコマンド実行時に--port 8080を指定する必要がある
 
## Dockerイメージの作成
毎回Docker Desktopの起動を忘れてエラー生成する自分をどうにかしたい。
```
docker build . --tag LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
```

## Artigact Registryにコンテナイメージをプッシュ
1. Artigact Registry に新しい Docker リポジトリを作成
今回はdockerイメージを使うのでrepository-formatにはdockerを指定

```
gcloud artifacts repositories create REPOSITORY --repository-format=docker \
    --location=asia-northeast1 --description="Docker repository" \
    --project=PROJECT
```
レポジトリが作成されたかどうかを一応確認
```
gcloud artifacts repositories list \
    --project=PROJECT
```

イメージを push または pull する前に、Google Cloud CLI を使用して Artifact Registry に対するリクエストの認証
```
gcloud auth configure-docker asia-northeast1-docker.pkg.dev
```

作成したDockerイメージをプッシュ
```
docker push asia-northeast1-docker.pkg.dev/PROJECT/REPOSITORY/productlist:latest
```

## cloud runにデプロイ
ちょっとめんどかったからコンソール上からデプロイ

## 無事デプロイ完了
一旦デプロイできたけど、いまいちコンテナイメージとか理解できてないので、少しずつ理解していきたい


### 参考
https://cloud.google.com/artifact-registry/docs/docker/store-docker-container-images?hl=ja#gcloud

https://cloud.google.com/run/docs/building/containers

https://qiita.com/hnw/items/1e8ba8b6f64214205d89
Lambda内でファイルダウンロードができない？そんなときはtmpを疑え

# はじめに
昔ハマったところの記事書き直し。

#### 【対象読者】
- Lambda初心者
- Lambda内でファイル作成・s3からのダウンロードなど行いたい人

#### 【使用環境】
- AWS S3
- AWS Lambda
- Python=3.10
- boto3


# 本題
lambda上でPython boto3ライブラリを使用しS3からファイルをダウンロードしていたときのこと。

以下のようなエラーが発生し、ダウンロードができませんでした。

```
[Errno 2] No such file or directory: '/item/6534.pbf.C92d54EC'
```

No such file or directoryなので「そんなファイルないよ！」って状態。

（よく見ると以下の「ないよ！」と言われているファイル名、なんか変な拡張子がついてますね。）

```
'/item/6534.pbf.C92d54EC'
```

ちなみにこの状況、lambda上の同じ/item/階層で、**新しいファイル作成** もできません。


# 解決策

実はこれ、lambda上では```/tmp/```ディレクトリ配下でしかファイルを変更できないんです。

ダウンロード先pathやファイル作成時のpathに``` /tmp/ ```のpathも追加して記載すると解決します。

※ちなみに```/tmp/```pathも追加しても同じエラーが発生する場合、/tmp/配下のディレクトリ（この場合/item/）を作成してないのが原因です。

ディレクトリを作成するコマンドも追記しましょう。

#### 以下エラーを発生させないboto3ダウンロードサンプルコード

```
import boto3
import os 

# S3クライアントの初期化 
s3 = boto3.client('s3') 

# S3バケット名とオブジェクトキーを指定
bucket_name = 'your-bucket-name' 
object_key = 'your/object/key' 

# ダウンロード先ディレクトリを設定
download_path = '/tmp/item/' 

# ダウンロード先ディレクトリが存在しない場合にディレクトリを作成 
try:
    if not os.path.exists(download_path):
        os.makedirs(download_path)
        print(f"ダウンロードディレクトリ {download_path} を作成しました。")
    
    # ファイルのダウンロード
    s3.download_file(bucket_name, object_key, os.path.join(download_path, os.path.basename(object_key)))
    print(f"ファイル {object_key} をダウンロードしました。")
except Exception as e:
    print(f"ファイルのダウンロード中にエラーが発生しました: {str(e)}")

```
【マインクラフト（統合版）】Websocketサーバーを使ってブラウザ入力によるコマンド実行を実装してみました

# はじめに

以下のチャット画面の最下部にコマンド入力フォームを設置して、Webブラウザで入力したコマンドをマインクラフト側で実行できるようにしました。

<img src="https://socket-manager.github.io/document/minecraft-contents/img/command/form.png" height="600px" width="728px" />

:::note info
上の画面はReact版のものですが、jQuery版にも同じように実装しています。
:::


# 動作環境

<dl>
    <dt>プラットフォーム</dt>
    <dd>Windows10</dd>
    <dt>マインクラフト（統合版）</dt>
    <dd>Windows Edition v1.21.2</dd>
    <dt>ブラウザ</dt>
    <dd>Chrome v127.0.6533.120</dd>
    <dt>socket-manager</dt>
    <dd>v1.14.0</dd>
    <dt>言語</dt>
    <dd>PHP v8.2.4（v8.1.0以降）</dd>
</dl>


# 使い方
折角なのでWebsocketサーバーでのみ使える以下の隠しコマンドを使ってみます。

<dl>
    <dt>agent create</dt>
    <dd>プレイヤー専用のエージェントを呼び出します。</dd>
    <dt>agent tp &lt;coordinates&gt;</dt>
    <dd>エージェントを指定した座標へテレポートします。</dd>
</dl>

まずは以下のようにコマンド実行先にあたるマインクラフトユーザーの名前を入力します。
<img src="https://socket-manager.github.io/document/minecraft-contents/img/command/input_user.png" height="600px" width="728px" />

:::note info
今回の場合「マイクラー」という名前がマインクラフト側から接続しているユーザー名です。
:::

そして以下のようにエージェントの作成コマンドを実行してみます。
![エージェントの作成](https://socket-manager.github.io/document/minecraft-contents/img/command/agent_generate.gif "エージェントの作成")

次にエージェントを移動させてみます。
![エージェントの移動](https://socket-manager.github.io/document/minecraft-contents/img/command/agent_teleport.gif "エージェントの移動")

マインクラフトの画面でリアルタイムに連携されている事がわかると思います。

マインクラフトからのレスポンスも反映していますので、例えばsummonコマンドをsammonと打ち間違えていたとしても以下のようにエラーの内容が赤字で表示されるようにしています。
![エラー箇所の表示](https://socket-manager.github.io/document/minecraft-contents/img/command/error_log.gif "エラー箇所の表示")


# おわりに

動作確認をするためにはWebsocketサーバーをあらかじめ起動した状態で、Webブラウザとマインクラフトからの接続を完了しておく必要があります。
接続手順や画面の起動方法については以下のページでご紹介しています。

https://qiita.com/glasses_seven/items/433ac9d9fcbdb72c6d18/

ここで入力されたコマンドはそのままマインクラフト上で実行されますが、実行者がエンティティである事を前提としている一部のコマンド（例えばexecuteコマンド）では使えないものがあるので注意が必要です。

そんなわけでWebsocketサーバー側の実装では全てのコマンドが使えるわけではありませんが、独自の隠しコマンドも存在するため、どのコマンドが利用可能で隠しコマンドがどのように利用できるのかを、この機能を使って調査していく事ができます。

:::note info
以下の実装を確認する際にも利用しています。
:::

https://qiita.com/glasses_seven/items/53e07b2e71eee588203f/
新卒研修でAWSJAMに参加してきた話

# はじめに
24新卒のあおです！
会社の新卒研修にてAWSJAMを経験してきたので、今回はその体験記を書いていこうと思います。

# AWSJAMとは
AWSJAMとは、AWSを学ぶために提供されている『実践型の課題解決トレーニング』的なものです。

>セキュリティ、移行、開発運用、AI/ML などに関する AWS のベストプラクティスを学ぶために設計された課題を解決することで、クラウド導入の取り組みを推進します。
>
>AWS は初めてですか？ それとも、以前は特定の AWS サービスを使ったことはありませんか？ 必要に応じて、課題をナビゲートするための手がかりを利用できます。 AWS の専門家も進行役を務めていますが、このイベントは自習型の発見と学習を促進します。
>
>引用：https://jam.awsevents.com/

## ※わかりやすいと感じた記事も貼っておきます。

https://qiita.com/sasadai10/items/5e51d291315e74296400

https://qiita.com/yuzinet/items/a6db5a26af26449024c5


# 体験した感想
体験の結果、主に感じたことは以下になります。

- 短い時間で与えられた課題を沢山こなしていくのは、AWSの競プロみたいな感覚
    - 競プロやハッカソン経験者はとっつきやすそう
    - かなり楽しかった
- JAM専用のサイトの完成度が結構高く、結構ワクワクした
    - ほか競走チームのランキングも表示、結構見やすかった
- 先に研修内でAWS Builder Labsを利用した学習機会があったため、事前知識の復習もできスムーズに進められた

https://aws.amazon.com/jp/training/digital/aws-builder-labs/

- 実践的な課題をモチーフとした内容であり、AWS Builder Labsの後にやると学習効果が高そう

また、健闘の結果、私達のチームは新卒内で2位になることができたので嬉しかったです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605168/6498d35b-42a3-d1a7-d41e-6dd635128ace.png)

# 新卒研修での効果
### 本番でやらかす前に過ちを経験できる

- S3のバケットポリシーゾンビ化やセキュリティグループの設定ミスなど、AWSを実際に触っていると最初の方にやらかしがちな経験を周囲の新卒の方々がAWSJAMを通し経験していました。
- 本番でやらかす前に『過ちを経験できる』ことは大きな意義があり、研修の間に実践的な内容で失敗できるのはいいことだと感じました。

https://qiita.com/handy-dd18/items/7d698c5b18016b735ce4

### コミュニケーション促進
- AWSJAMは同じチームメンバーと議論し協力しながら進める必要があります。
- JAMを進めるにあたり、新卒同士の親睦を深められ、相談しながら業務をこなしていくためのコミュニケーションスキルを培うのにも適していたと感じました。



# ※注意ポイント
やっていく中での注意ポイントもあったので以下に記載しておきます。

- たまに自動での日本語翻訳がすごいところもあり、英語に戻して解読した方が早い場合もありました。
- 問題を開いたのち、AWS環境が構築されるまでに時間がかかります。あらかじめ次の問題に取り掛かる前に開いておくのがおすすめかも。
- AWS未経験者だと完全に手放しではスムーズに進めるのは難しい部分もあるかも..
    - AWS Builder Labsをやった上でも難しくきつそうな同期もおりました..。
        - (私の場合は入社前から実務で使用していたためスムーズに進められましたが...それでも苦戦しながら進めていた所もありました。）
        - 初心者のみのチーム構成にはせず、チーム内で教え合える状態を作るなど、研修でやる場合はあらかじめのチームビルディングが重要になりそうです。

<hr>

正直、インプット的な学習のみ進めるより何倍も有意義であり、めちゃくちゃおすすめだと感じました。

社内でAWSJAMを行うことは実践的なAWS学習にも、社内の交流促進にも非常に効果的であり、新卒にAWS含むcloudを担当させる予定の会社さんは研修に取り入れると良さそうですね。

※また、先にJAMで慣れておくことで、新卒によるAWS高額請求事件も減らしていけるんじゃないかなあと思いました💦

参考：

https://zenn.dev/eiji_k/articles/5802689a5cd990

https://qiita.com/KNR109/items/01614b62eaf33f33bd78
ubuntu 24.04 LTSで自宅サーバー構築（FTP クライアント (Windows)の設定）

<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
クライアントコンピューターから FTP サーバーにファイル転送します。Windows クライアントを例にします。
例として、FileZilla をインストールして利用します。 FileZilla は以下のリンク先よりダウンロードできます。
⇒ https://filezilla-project.org/download.php?type=client
FileZilla をインストールし、起動すると下記のような画面になります。
上段のメニュー下の [ホスト], [ユーザー名], [パスワード], [ポート] に情報を入力して [クイック接続] をクリックします。
![filezilla.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858002/7d437042-eb94-eba1-963e-a28829d7bfe4.jpeg)
接続できました。あとは転送したいファイルを選んで右クリックメニューの [アップロード] 等からファイルを転送できます。
![filezilla2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858002/9a125713-feb9-ed5a-ed5b-43a8b7189a61.jpeg)
<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
AWS Amplify

# はじめに

この記事はAWS SAA試験勉強のための、 AWS Amplifyに関する知識のまとめです。

# AWS Amplifyとは

Amplifyは、Webアプリケーションのフロントエンドやモバイルアプリケーションの開発を効率的に行うために作られたプラットフォームです。
Webのフロントエンド用アプリケーションやモバイルアプリケーションと、サーバー側で処理されるバックエンドのアプリケーションを素早くシームレスに接続するために、さまざまなフレームワークやサービス、開発ツールを提供しています。

# 参照サイト

- [公式の漫画](https://aws.amazon.com/jp/campaigns/manga/vol3-1/)
Auth0ってなんなのさ？

## はじめに
この記事は
Auth0の**基本概念**と**メリット**を自分用にまとめたものです！
(導入方法については[こちら](https://qiita.com/hisashiyamaguchi/items/2d0bcae052077f6ae4a4)をご参照ください！)

![eyecatch-auth0-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552881/2cb353d3-21d6-5118-11a7-f134b777783d.png)

### Auth0とは？
Auth0は、IDaaS（Identity as a Service）を提供するサーバーレス認証クラウドサービスです。
導入することで自社で認証基盤を簡単に構築できます。

> #### Oktaとの違い
> **Auth0**：開発者中心のアプリケーションや小規模企業向け
> **Okta**：大規模エンタープライズや複雑なアクセス管理ニーズ向け

![Auth0とは？_page-0001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552881/7e85f3e3-5fe2-5e51-4463-63f31ff06876.jpeg)

### Auth0の3つの特徴
1. 開発者中心のアプローチ：シンプルで使いやすいAPIとドキュメント
2. 柔軟なカスタマイズ性：SSO、MFA、ソーシャルメディア認証のカスタマイズが可能
3. スケーラビリティ：大規模アプリケーションにも対応し、成長に合わせて拡張が可能

![Auth0とは？_page-0002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552881/8e611ce2-a5ee-21ff-076e-cbc719e31c49.jpeg)

### Auth0の5つのメリット

1. 統合が簡単
SDKとAPIが提供され、多言語対応で豊富なドキュメントがある
2. 柔軟な認証オプション
多様なログイン方法とマルチファクタ認証を提供している
3. 高度なセキュリティ
自動セキュリティアップデート、詳細な監視とログがある
4. ユーザー体験の向上
カスタマイズ可能なUI、シングルサインオン(SSO)を提供している
5. スケーラビリティと信頼性
クラウドベースで高い可用性がある

![Auth0とは？_page-0003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552881/a653221f-54df-eaec-c8d1-4ffa866d0e58.jpeg)

### Auth0の主な機能

1. シングルサインオン(SSO)：一度の認証で複数サービスにログイン可能
2. ユニバーサルログイン：中央認証サーバーを使用し、ユーザーエクスペリエンスの向上
3. アダプティブ多要素認証：SMS、指紋認証、顔認証などでセキュリティを強化

![Auth0とは？_page-0004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552881/2f140082-9f01-2b45-c7d3-22bdc624c158.jpeg)

### Auth0の仕組み

* 認証プロセス
ユーザーがログインを試みる際、認証情報をAuth0のサーバーに送信し、検証後セキュリティトークンを発行、トークンは返送され、セッションが確立される
* 認可プロセス
アクセスリクエストに対するトークンの検証を行い、トークンに基づいて認可を判断し、アクセスを許可または拒否する

> #### 認証と認可について
> 
> * 認証 (Authentication)は
> ユーザーのアイデンティティを確認するプロセス
> * 認可 (Authorization)は
> ユーザーが特定のリソースにアクセスすることを許可するプロセス

![Auth0とは？_page-0005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552881/aba67f17-b8df-28e9-8c7d-aa90e45adbd8.jpeg)

### Auth0の使用例
* ウェブアプリケーション、モバイルアプリケーション、IoTデバイスの認証
* API保護：API認証やアクセス制御を実装し、セキュリティ強化
* 企業内システムへのセキュアなアクセス管理

![Auth0とは？_page-0006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552881/dc5a0e65-ed0c-06ad-a7ad-b215908eb5bd.jpeg)

## まとめ
Auth0は、**シンプルで使いやすく、カスタマイズが可能で、拡張性の高い認証・認可プラットフォーム**です！
この記事を通じて、Auth0の基本的な知識と導入をするメリットを理解していただけたら幸いです！
(導入方法については[こちら](https://qiita.com/hisashiyamaguchi/items/2d0bcae052077f6ae4a4)をご参照ください！)

## 参考リンク
[Auth0の概要と始め方](https://auth0.com/docs)
[Auth0 概要](https://qiita.com/KWS_0901/items/e86563abfa40390b4df5)
[【備忘】Auth0とは何か](https://qiita.com/MaSi1031/items/dda557c119bed391805b)
[Auth0入門 – ざっくり理解する認証/認可の基礎](https://zenn.dev/kibe/articles/57797c4e82b577)

## さいごに
弊社のご紹介もさせてください！！！

「日本で一番エンジニアが成長できる会社を創る」
[株式会社PRUM](https://prum.jp/)

Wantedly募集
[いつから挑戦しても遅くない！Webアプリ開発エンジニアを目指しませんか？](https://www.wantedly.com/projects/1771548)
[人事と営業のいいとこどり！従業員の成長を本気で考えたいスタッフ募集！](https://www.wantedly.com/projects/1785093)
[育ち盛りのエンジニアたちを支えてくれる労務経験者を大募集！](https://www.wantedly.com/projects/1752874)

弊社メンバーは日々学習した内容をアウトプットしております！
ちょこっとでもご興味を持たれた方は求人を見てみてください！
（ご応募もお待ちしております！）

### 最後までご覧いただき、ありがとうございました！
ImageコンポーネントにてSVG画像はunoptimized属性をつける

## 結論

- `Next.js`で`Image`コンポーネントを使用する際は`unoptimized`属性を付与しよう。

## 実装

```tsx
       <Image
         src={}
         alt={''}
         width={24}
         height={24}
         loading="lazy"
         decoding="async"
         unoptimized
        />
```

## 特徴

- `Image`コンポーネントは画像自動的にリサイズしたりしてくれます。unoptimized属性を付与することでキャンセルすることができます。

## 背景

- SVGの画像はベクター画像でありピクセルベースの画像とは異なり、解像度に依存しません。そのため、自動リサイズによる最適化の恩恵を受けにくいです。
- そもそもSVG画像はファイルサイズが小さいのでファイルサイズの削減効果がほとんどありません。

## 参考記事

https://zenn.dev/catnose99/articles/883f7dbbe21632a5254e

https://qiita.com/manabuyasuda/items/01a76204f97cd73ffc4e

https://www.adobe.com/jp/creativecloud/file-types/image/comparison/raster-vs-vector.html
【Git】変更したステップ数を見る

GitHubでPRを出した時、右上に下記のような変更量を示すマークが出てきます。

![スクリーンショット 2024-08-13 11.45.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1274260/6def38a5-1265-c961-0ba0-3a523f695d3a.png)

これをPR提出前に確認したいなと思ったため、コマンド上で変更量を確認する方法を調べてみました。

## コマンド
`$ git diff --stat 作業中のブランチ名 比較したいブランチ名`

例：
`$ git diff --stat feature/working develop`

こうすると
```
 4 files changed, 8 insertions(+), 125 deletions(-)
```
のような形で変更量を確認することができます。
Windows 11 のメモ帳にお化けを召喚

召喚する呪文は、`1F47B → [Alt] + x` です。

![1F47B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/66c56748-0e3e-0ce0-537d-ac6fd1415b86.png)
1F47Bを入力した状態で、[Alt] + x を入力すると...
![ghost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/48d17010-a468-a11b-ad36-0163c2ef757f.png)
お化け出現！？
## まじめな話
Windows 11 にプリインストールされているメモ帳は UWP版に変わり、従来のメモ帳（C:\WINDOWS\system32\notepad.exe）に比べて様々な追加機能が実装されています。

[Alt] + x は、文字と Unicode Character Code の相互変換することができます。そのため、お化け（ghost）の絵文字に対応している Unicode `1F47B` を入力後、[Alt] + x を入力するとお化けが表示される結果になります。

なお、[Alt] + x による文字と Unicode Character Code の相互変換は、非推奨となったワードパッド（C:\Program Files\Windows NT\Accessories\wordpad.exe）でもできます。

Unicode Character Code は以下の Web サイトで確認できるので時間がある人はいろいろ試してみて、メモ帳で暇つぶしをしてみてはいかがでしょうか。

https://www.unicode.org/charts/

https://www.unicode.org/charts/PDF/U1F300.pdf

愉快な集団
![monsters.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/452b0909-688a-7c37-ae9e-7a1840f6b765.png)
paiza×Qiita コラボキャンペーン 「Dランク問題：文字の一致」をC言語で解いてみました

paiza×Qiita コラボキャンペーンが開催されているとのことで、遅ればせながら参加してみました。
今回（というよりスキルチェック全て）C言語で回答しています。

というのも初めて学んだプログラミング言語がC言語だったので、ほぼ何も考えなくても書けるというのが理由です。

同じ問題をPythonなどで解いてみようと挑戦はするのですが、英語とかと同じようになかなか新しい言葉が身につかず困っています。

なんとか他の言語を習得して、Web系のフロントエンド〜バックエンドまでこなせる技術を身に付けたいものです。

さて、本題ですが今回は以下のDランク問題を解いています。
https://paiza.jp/works/mondai/d_rank_skillcheck_sample/diff_str

以下が文字列の比較をC言語で行った場合のコードとなります。
```C:文字の一致.rb
#include <stdio.h>
#include <string.h>
int main(void){

    char a[100],b[100];
    
    scanf("%s", a);
    scanf("%s", b);
    
    if(strcmp(a,b)==0){
        printf("OK");
    }
    else{
        printf("NG");
    }
    return 0;
}
```
あまり需要はないと思いますが、せっかくなので一応解説してみます。

```
#include <stdio.h>
#include <string.h>
```
この2行はC言語のライブラリファイルを宣言している構文となります。
通常は「stdio.h」のみですが、今回は文字列比較のためにstrcmp関数を使用したので「string.h」も宣言しています。

```C:main関数.rb
int main(void){

    char a[100],b[100];
    
    scanf("%s", a);
    scanf("%s", b);
    
    if(strcmp(a,b)==0){
        printf("OK");
    }
    else{
        printf("NG");
    }
    return 0;
}
```
こちらが実際に動作するmain関数になります。
それぞれ解説していきます。

```
    char a[100],b[100];
```
この部分は使用する変数を宣言しています。
今回は2つの文字列a、bを比較するので、char型の変数を2つ宣言しています。
Pythonとか宣言しなくても変数を使える言語もありますが、C言語は宣言していない変数は使用できないので、プログラム内で変数を使う場合は必須となります。

```
    scanf("%s", a);
    scanf("%s", b);
```
こちらは外部入力された文字列を変数に代入しています。
「%s」は文字列の代入時に使用します。
（他にも「%d」や「%c」など、代入する型によって%の後ろが異なる文字になります）

```
    if(strcmp(a,b)==0){
        printf("OK");
    }
    else{
        printf("NG");
    }
```
この部分で文字列の比較をしています。

strcmp関数はaとbの文字列が一致している場合「0」を返すので、「0」が返ってきた場合は一致なので「OK」、それ以外が返ってきた場合は「NG」を出力するようにしています。

一応解説（っぽいもの）を記載してみましたが、C言語は今となっては古い言語なので知りたい方も少ないかな、と思っています。

同じ問題を他の言語で解いてみたものも今後解説してみようと思っていますので、もしよかったらご覧ください。
DockerfileのCMDコマンドを書き換えるとCloud Buildでdeploy失敗するようになった人へ

# 以前まで成功していたのに...

BuildとPushは成功するが、Cloud Buildのdeployのタイミングで以下のログメッセージが表示された。

```log
"Deploy": ERROR: (gcloud.run.services.update) Revision 'サービス名' is not ready and cannot serve traffic. The user-provided container failed to start and listen on the port defined provided by the PORT=3000 environment variable. Logs for this revision might contain more information.
```

コンテナが指定したポートをリッスンできなかったらしい...
が、調査していると、ポートをリッスンできていないからこのログが表示されるとは限らないことがわかった。

# 前提

- Githubのmainブランチにプッシュ/マージすると、Cloud Buildが実行されるように設定している
- Cloud BuildにはDockerfileを使用している

# 原因

Dockerfileの書き方に原因があることがわかった。

```Dockerfile
# 失敗するパターン
CMD ["HOSTNAME='0.0.0.0'", "node", "server.js"]

# うまくいくパターン
CMD HOSTNAME='0.0.0.0' node server.js
```

そもそも、うまくいくパターンでDockerfileを書いていたが、Dockerのバージョンアップがあったのだろうかローカルで警告が出るようになったので編集を行った。
(ローカルマシンのDockerバージョンは27.1.1)

```bash
1 warning found (use docker --debug to expand):
 - JSONArgsRecommended: JSON arguments recommended for CMD to prevent unintended behavior related to OS signals (line 54)
```
この警告については参考の項にあるページを参照すると、ENTRYPOINTコマンドとCMDコマンドで起こる警告であることがわかった。

ということで、Dockerfileを前の状態に戻しておくことにする。
```Dockerfile
# ローカルでは警告が出るが、deployできていないほうがマズいので...
CMD HOSTNAME='0.0.0.0' node server.js
```

# 最後に

とりあえずdeployできる状態に戻しましたが、マズい書き方をしているようであれば指摘していただけるとありがたいです。

# 参考
https://docs.docker.com/reference/build-checks/json-args-recommended/
UbuntuのTerminalのCopy & Pasteのショートカットは「Ctrl + Shift + C / Ctrl + Shift + P」

## 概要

表題が全てです。
Ubuntu OSを開発用として使用する際に、CopyPasteコマンドが聞かず、ストレスと感じたことはないでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/bd04fa12-eb62-aed3-6c32-ab05aa5a8fd6.png)

取り急ぎの対応作としては、右クリックしてCopyを押すことですが、これはあまりにもスマートではなくストレスフルです。


## 解決策 🔧
Terminalでは、Ubuntuのデフォルト設定により、一般的なコピー＆ペーストのショートカットキーが異なります。これに慣れることで、作業のストレスを軽減できます。

「Copy」のショートカットキーは、**Ctrl + Shift + C**
「Paste」のショートカットキーは、**Ctrl + Shift + V**

これらのショートカットは、Terminal内でのみ機能します。他のアプリケーション（例えば、テキストエディタやブラウザ）では、従来のCtrl + CおよびCtrl + Vが引き続き有効です。

この違いに慣れるために、最初は少し練習が必要かもしれません。しかし、手が自然にこれらのショートカットに反応するようになれば、作業の効率が大幅に向上するでしょう。

## 理由 🧠
なぜTerminal内ではこれらのショートカットキーが異なるのでしょうか？

**その理由は、Ctrl + Cという組み合わせが、Terminalでは伝統的に「プロセスを停止する」ために予約使用されているからです。**

Ctrl + Vも同様に、文字列を表示する際に特殊な意味を持ちます。このように、Terminal内での操作と他のアプリケーションでの操作には根本的な違いがあるため、ショートカットキーも異なる設定が必要なのです。

このデフォルト設定は、開発者が誤ってプロセスを停止したり、意図しない結果を生むことを防ぐための設計です。Ubuntuが特に開発者向けのOSであることを考慮すれば、このような配慮が組み込まれているのは納得できるでしょう。
リアクティブシステム

# Vue のリアクティブシステム

以下を参考にしています。

https://qiita.com/hareku/items/41c42554e7718aa17483

##

```js:effect.js

let activeEffect = null;

exports.effect = function (fn) {
  activeEffect = fn;
}

// #############################################

// key  : ref
// value: effectのリスト
const targetMap = new WeakMap();

exports.regist = function (target) {
  let deps = targetMap.get(target);
  if (deps === undefined) {
    deps = new Set();
    targetMap.set(target, deps);
  }

  if (activeEffect && deps.has(activeEffect) === false) {
    deps.add(activeEffect);
  }
}

exports.track = function (target, value = null) {
  console.log(`track: ${value}`);
}

// #############################################

exports.trigger = function (target, newVal = null, value = null) {

  const deps = targetMap.get(target);
  if (deps === undefined) {
    return;
  }

  deps.forEach(effect => {
    effect(newVal, value);
  });
}
```

```js:ref.js
const { regist, track, trigger } = require('./effect');

exports.ref = function(value) {

  const target = {
    get value() {
      // track(値が使用されていることを通知する処理)
      track(target, value);
      return value;
    },

    set value(newVal) {
      // trigger(値が変更されたことを通知する処理)
      trigger(target, newVal, value);

      value = newVal;
    },
  };

  regist(target);
  return target;
}
```

```js:main.js
const { ref } = require('./ref');
const { effect } = require('./effect');

effect((newVal, value) => {
  console.log(`value changed: ${value} => ${newVal}`);
});

const str = ref("あいうえお");

console.log(str.value);
str.value = "hoge";
console.log(str.value);
```
AWS X-Ray

# はじめに

この記事はAWS SAA試験勉強のための、 AWS X-Rayに関する知識のまとめです。

# AWS X-Rayとは

X-Rayは、本番環境やマイクロサービスアーキテクチャ基盤で実行されているアプリケーションの実行状況を把握し、**エラーの原因やパフォーマンスのボトルネックを特定して**デバッグを行える分散トレーシングサービスです。
AWSサービスやアプリケーション間で転送されている**リクエストを追跡**することが可能です。
React × Typescript の環境構築 (create-react-app)

# React × Typescript の環境構築
構築環境
```
node v20.14.0
npm 10.7.0

"react": "^18.3.1",
"react-dom": "^18.3.1",
"sass": "^1.77.8",
"typescript": "^4.9.5",
```

## Typescriptの雛形でプロジェクト作成

```:ターミナル
npx create-react-app myApp --template typescript
```

## Sassを使えるようにする
```:ターミナル
npm i node sass
```



https://create-react-app.dev/docs/adding-typescript/
AWS RedshiftでCronの書き方で躓いたのでメモ

# はじめに
Redshiftを同じスペックでずっと起動しておくのももったいないなと思い、スケジューラーでスペックを調整しようとしていた。

その時つまずいたので、メモ書きを残しておく。

# 初めに設定したCron
以下のような形式でCronを記載。
特に疑問も持たず設定。

```
0 9 * * 1-5 * # 月から金曜の9時
```
因みにAWS上の説明はこんな感じ。


>Cron 形式: 分 時間 日 月 曜日 年  追加の値を含めるには、, (カンマ)、範囲を指定するには - (ハイフン)、すべての値を含めるには * (アスタリスク)、増分を指定するには / (スラッシュ) を使用します。


すると以下のエラーが発生した。

```
Invalid cron schedule expression:
```

なぜ？？？と思いながら色々試行錯誤していく..

# 修正後のCron

結論から言うと以下の記載で解決した。

```
0 9 ? * 1-5 * # 月から金曜の9時
```

以下のドキュメントに記載があった。

[Amazon でスケジュールに従って実行されるルールの作成 EventBridge](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-create-rule-schedule.html)

日フィールドと曜日フィールドを同時に指定することはできないっぽい。
AWSの形式以外だと当てはまらないのでご注意を。