OmniAICreator/Qiita-1.07M huggingface dataset:
Windowsバッチファイルで株価を分析する方法（日経平均版）

# 1. はじめに
今回は、自分自身への備忘録を兼ねて、Windowsバッチファイルで株価を分析する方法を、お伝えしたいと思います

- 参考文献：[WEBから自動的にダウロードするバッチを作成する](https://qiita.com/uratatsu/items/d77152ca121d0b779464)
- 参考文献：[ダウンロードセンター](https://indexes.nikkei.co.jp/nkave/index?type=download)
- 参考文献：[bitsadminでファイルをダウンロードする](https://qiita.com/tera1707/items/78c2a4d1fb175a8f8b8d)
- 参考文献：[ファイルから文字列を読み込む](https://jj-blues.com/cms/wantto-readstringfromfile/)
- 参考文献：[引数のダブルクォーテーションを削除するサンプル | Windows バッチファイル](https://tooljp.com/bat_qa/Sample-to-remove-double-quotes-in-argument-3326.html)
- 参考文献：[テキストファイルの内容を区切り文字でトークンに分解し繰り返し処理を使う(FOR)](https://www.javadrive.jp/command/bat/index10.html)
- 参考文献：[バッチ作成における比較演算子の紹介](https://www.miraclejob.com/recommend/detail?cd=681)
- 参考文献：[echoで改行する](https://jj-blues.com/cms/wantto-echonewline/)

# 2. この記事を読んでできること
- Windowsバッチファイルで株価を分析することができるようになる

# 3. 注意事項
- ダウンロードURLに、日経平均プロファイルのオープンデータ CSVファイルを利用させていただいております。（感謝）

# 4. 必要なもの
- Windows OS PC（Windows11を想定）
- テキストエディタ（サクラエディタを利用）

# 5. インターネットショートカットを作成しファイルをダウンロードするバッチファイル
- .batファイルを作成し、実行する

```bat:nikkei_download.bat
@echo off
cd /d %~dp0
setlocal enabledelayedexpansion

rem ファイル名をフルパスで設定
rem set FILENAMEFULLPATH="%~dp0\nikkei_stock_average_daily_jp.csv"
set FILENAME=nikkei_stock_average_daily_jp.csv
set FILENAMEFULLPATH="%~dp0\%FILENAME%"

rem 日経平均csvをダウンロード
bitsadmin /transfer "nikkei" https://indexes.nikkei.co.jp/nkave/historical/nikkei_stock_average_daily_jp.csv "%FILENAMEFULLPATH%"

rem ファイル内容を画面出力
rem type "%FILENAMEFULLPATH%"

echo;
echo;
echo △▼
echo nikkei checking ...
echo △▼

rem 行読み込み
for /f "tokens=1-10 delims=,." %%a in (%FILENAME%) do (
rem    echo %%~a %%~b %%~d %%~f %%~h %%~j
    
rem    set verDate=%%a
rem    if "!verDate:~1,10!" == "2020/03/19" (
rem        rem echo !verDate!
rem        echo ！hit the shock
rem        echo %%~a %%~b %%~d %%~f %%~h %%~j
rem    )
    
    set verBigLong=%%~b
    if "!verBigLong:~0,5!" leq "17000" (
        rem echo !verBigLong!
        echo △hit the big long
        echo %%~a %%~b %%~d %%~f %%~h %%~j
        echo;
    )
    
    set verBigShort=%%~b
    if "!verBigShort:~0,5!" geq "30500" (
        rem echo !verBigShort!
        echo ▼hit the big short
        echo %%~a %%~b %%~d %%~f %%~h %%~j
        echo;
    )
    
)

rem 続行するには何かキーを押してください . . .
pause

rem 終了
endlocal
exit /b

```

---

# 6. おわりに
いかがでしたでしょうか？Windowsバッチファイルで株価を分析することができたのではないかと思います
今回の記事が、みなさまの学習の参考になれば幸いです

2022/12/10 TAKAHIRO NISHIZONO

---

- 参考：[Investing.com](https://jp.investing.com/charts/live-charts)
![JP225 2022-12-10 200616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240522/a247286d-dedd-b2ba-09c4-1a1466f7f4b4.png)
Hash index build performance tweak from sorting, part II

# はじめに
にゃーん。趣味でポスグレをやっている者だ。

この記事は[PostgreSQL 16 全部ぬこ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/pg16-all-nuko) 17日目の記事です。
今回はハッシュインデックス作成時の性能改善について書いてみます。

# 概要

|項目|内容|
|:--|:--|
|タイトル|[Hash index build performance tweak from sorting, part II](https://commitfest.postgresql.org/41/3791/)|
|Topic|Performance|
|ステータス|commited|
|Last Modified|2022-11-24|
|概要|ハッシュインデックス作成時の性能改善|

# 変更内容
MLを見ると、
> Adding this patch makes a CREATE INDEX about 8-9% faster, on an unlogged table.

と書いてあった。
ということで手元の環境で比較してみました。

## 測定方法
* 手元の環境でUNLOGGED TABLEを作成し、以下のような100万件のデータを挿入。

```sql
CREATE UNLOGGED TABLE test (id int primary key, i_data int, n_data numeric, t_data text);

INSERT INTO test VALUES
  (generate_series(1, 1000000), (random() * 10000)::int, random() * 10000, generate_random_text(72));
```

* i_dataはinteger型、値域を0～10000の範囲にして、ある程度同じ値のハッシュが生成されるようにする、
* n_dataはnumeric型にして、ほとんど同じ値のハッシュが生成されないことを想定。
* t_dataはtextにしてランダムな72バイト文字を挿入。[^1]
* i_data列, n_data列, t_data列を対象とするハッシュインデックスを``CREATE INDEX ... USING hash``で5回作成し、その作成時間（``\timing``で取得）の平均を取得。

```sql
\timing
CREATE INDEX hash_ind ON test USING hash (i_data);
DROP INDEX hash_ind;
CREATE INDEX hash_ind ON test USING hash (n_data);
DROP INDEX hash_ind;
CREATE INDEX hash_ind ON test USING hash (t_data);
DROP INDEX hash_ind;
```

* これを、PostgreSQL 15 beta1, PostgreSQL 15.0とPostgreSQL 16で比較した。

## 比較結果

* **えぇ・・・PostgreSQL 15 beta1よりも、PostgreSQL 15/PostgreSQL 16が有意に遅く見えるんですが・・・。**
* MLだと8～9%程度の向上が見込めるって書いてあったのですが。
* どのデータ型のケースでも傾向は同じ。

![HASHインデックス構築性能改善-測定結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32626/931c6f5c-3727-d65a-5259-f886d5052e2f.png)


うーん、何か測定環境や、測定方式（ハッシュインデックス対象の列、``CREATE INDEX``のやり方）に問題があるのだろうか・・・。
それとも、開発コミュニティに報告すべきなんだろうか。

# おわりに
うーん。今回の調査では、今ひとつ納得できる結果がとれませんでした。
beta版がでたあたりで測定方法の見直しも含めてリトライするか・・・にゃーん。

[^1]: ランダムな文字列の生成は以下のpl/pgsql関数を使いました。<br>https://github.com/nuko-yokohama/pg_scripts/blob/master/generate_random_text.sql
ICONIXプロセスの理念を理解する（基礎知識編）

## 前書き

ソフトウェア開発には、いくつかの手法が存在します。
ウォーターフォール開発、アジャイル開発が著名なところで、今や当たり前のようにプロジェクトに取り入れられているかと思います。
また、最近ではドメイン駆動設計など、より良い手法を積極的に模索している印象を受けます。

この記事では、個人的にオススメだと思う「 **ICONIXプロセス** 」を紹介したいと思います。

## ICONIXプロセスとは

ICONIXプロセスとは、ソフトウェア開発を進めていく手法の一つです。
ウォーターフォール開発の反省点を元に、特徴的な工夫が組み込まれています。

ICONIXプロセスでは、 **前フェーズへの手戻りを許容** しています。

**前フェーズを完全に完成させなくても次のフェーズに進めることができ、次のフェーズで判明した内容を前フェーズにフィードバックする** ことができます。

いわば、「 **ウォーターフォール開発のやり方を、思い切ってアジャイル開発的にやる** 」イメージです。
「 **ハイブリッド型** 」と言えると思います。

アジャイル開発的にやりますが、要件分析フェーズはしっかり行います。
ウォーターフォール開発ほど **硬直的ではなく** 、アジャイル開発のように **要件分析フェーズを省略したりはしません** 。

また、ICONIXプロセスには「 **ロバストネス分析** 」と言う予備設計フェーズがあり、このフェーズが **重要な意味** を持っています。

### 利点

ICONIXプロセスの利点として、以下の要素があげられます。

> ・ **実践的なプロセスなので手順が明確**
> ・ **ウォーターフォール的な現場であっても、フェーズ毎の目的を説明すると理解されやすい**
> ・ **不確定な要素があっても開発を進めていくことができる**

**どのような現場であっても取り入れやすく、アジャイル的に進めていける** ことが利点だと思います。

## ロバストネス分析

では、ICONIXプロセスで最も重要な「 **ロバストネス分析** 」とは何なのか、を説明します。

ロバストネス分析は、ICONIXの「 **予備設計フェーズ** 」として行います。
予備設計は要件分析の次に行うフェーズで、以下の特徴があります。

> ■ **簡単な図で**
> 　・ 4つの簡単な図を、簡単なルールで書くだけで良い
> 　・ 「可能な限り簡単」でも「完璧な分析」でもなく、必要な図を必要なだけ書く
> 　・ 手書きでも可能なレベルの簡単さなので、素早く書ける
> 　・ 前後の工程から発生するフィードバックを、簡単に反映できるように書く
> 
> ■ **他人がトレースできる形で**
> 　・ 予備設計までは、プログラムを知らなくてもレビュー可能である
> 
> ■ **抜け漏れがないように**
> 　・ 要求を実装するために必要なインターフェース、振る舞い、データを、図を描く過程で見つけ出すことができる

ロバストネス分析では、以下の3つの要素で構成された図を書きます。

![no_1051_table-1-e1611210678268-1536x1406.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91620/36702b6a-07ce-530a-0ddd-9cc77d6174cb.png)

特徴にあるように、 **要件と実装を簡単な図で紐付ける** イメージです。
簡単な図なので、 **内容を理解することも、変更すること** も容易になります。
個人的には、この点に **重要な価値** を見出します。

アジャイル開発のような「 **素早さ、柔軟さ** 」に加え、 **フィードバック可能な図** を書くことにより、「 **要件と実装が乖離することを防ぐ** 」ことができます。
[Lightning] 新規レコード画面へ遷移するURLの指定方法

# 参照
https://sfdevcode.com/lightning_how_to_transition_to_new_record_page_with_url/
https://sfdevcode.com/lightning_how_to_transition_to_new_record_page_with_url2/

# 補足
新規レコードが作成されるまたキャンセルされるあとの動き
　指定しないと、作成された画面へまたホームへ
　親画面（XXX__c）への指定：navigationLocation=RELATED_LIST
例　/lightning/o/XXX__c/new?defaultFieldValues=...,...&navigationLocation=RELATED_LIST
associated values抜きでのenumの比較をスマートにしたい

## 概要

associated valuesを持つenumを扱う際、caseのみの同値比較をしたいことがあります。

```swift
enum UIState<T> {
    case idle
    case loading
    case success(T)
    case failure(Error)
}

let state: UIState<Int> = .success(1)

// associated valuesの値は興味ない、stateがsuccessかどうかだけを確かめたい
```

おさらいですが、associated values抜きで比較したい場合は2種類の方法があります。
`switch` 文と `if case` 文です。
```swift
// switch
switch state {
case idle: ...
case loading: ...
case success: ...
case failure: ...
}

// if case
if case .success = state { ... }
```

これらの方法で解決する場合も多いのですが、switchまたはifを書かなくては比較できないので、単純にBoolの値として比較結果が欲しい場合に不便です。

```swift
// SwiftUIで表示状態を指定する場合とか...
public extension View {
    func overlay<Content: View>(if condition: Bool, content: @escaping () -> Content) -> some View {
        overlay(Group {
            if condition {
                content()
            } else {
                EmptyView()
            }
        })
    }
}

List(...) { 
    ... 
}
.overlay(if: state == .loading) { //　これはできない
    ProgressView()
}
```

これを解決したい

## 解決案1

enum側で各caseの比較値を提供するアプローチです

```swift
extension UIState {
    var isIdle: Bool {
        if case .idle = self {
            return true
        }

        return false
    }

    var isLoading: Bool {
        if case .loading = self {
            return true
        }

        return false
    }

    ...
}

List(...) { 
    ... 
}
.overlay(if: state.isLoading) {
    ProgressView()
}
```

一番シンプルで無難ですが、caseが多いと少しenum側の記述が冗長に見えます。

## 解決案2

enum内部に、associated valuesを取り除いたenumを定義し、比較に利用します。

```swift
extension UIState {
     enum Case {
        case idle
        case loading
        case success
        case failure
    }

    func `is`(_ caseEnum: Case) -> Bool {
        switch self {
        case .idle: return caseEnum == .idle
        case .loading: return caseEnum == .loading
        case .success: return caseEnum == .success
        case .failure: return caseEnum == .failure
        }
    }
}

List(...) { 
    ... 
}
.overlay(if: state.is(.loading)) {
    ProgressView()
}
```

こちらはcaseが多くても、enum側の記述が冗長になりにくいですが、enum内部に比較用のenumを定義すること自体が冗長で微妙な気もします。

## コメントお待ちしております

自分は渋々解決策1で記述していますが、正直もっと良い方法がないかとモヤモヤしています。
みなさんはどう書いていますでしょうか？もっと良い書き方があったらコメントで教えてください！！
EC2(RHEL)でSELinuxを無効化するハンズオン

## はじめに
EC2(RHEL)でlogrotateを設定した際、ハマった部分もあったので忘備録として記事にしていきます。

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

## ハマった部分
SELinuxの影響により、cronによるlogrotateの呼び出しがパーミッションエラーとなってしまい、logrotateが実行されないでログが溜まり続けてしまう事象が発生する

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


## 原因の推測
cronのプロセスよりlogrotateという異なるプロセスが呼び出され、cronのプロセスに権限が付与されていなかったため、アクセス制限に抵触してパーミッションエラーが発生し、logrotateが実行されなかった。

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


## 用語理解
### logrotateとは(githubより抜粋意訳)
logrotateは、ログファイルの管理を簡素化するために設計されました。
ログファイルを自動的に、ローテーション、圧縮、削除、メール転送を可能にし、ログファイルを1時間ごと、毎日、毎週、毎月、またはログファイルが一定のサイズになったときに処理するように設定することが可能です。

参考URL:[githubによるlogrotateの説明](https://github.com/logrotate/logrotate)


### SELinuxとは(wikiより抜粋意訳)
Security-Enhanced Linux (SELinux) とは、アメリカ国家安全保障局 (NSA) がGPL下で提供している、Linuxのカーネルに強制アクセス制御 (MAC) 機能を付加するモジュールの名称。

Linuxではファイルやディレクトリにはパーミッションに基づいてアクセス制限が決められています。
パーミッションとは、「オーナー」「グループ」「その他」に対して、「r（読み込み）」「w（書き込み）」「x（実行）」を設定しているもので、このパーミッションに関係なくアクセス可能なのがrootユーザの特権です。ただし全ての権限が集中してしまうため、rootユーザのパスワードが漏洩してしまうとサーバの全てが乗っ取られてしまう危険があります。

SELinux　は上記の可能性を考慮し、プロセスごとにアクセス制限をかける Type Enforcement (TE)と、rootも含む全てのユーザに関して制限をかけるロールベースアクセス(RBAC)などで制御を行うことで、rootによる権限の集中を防いでいる。

参考URL:[wikipediaによるSELinuxの説明](https://ja.wikipedia.org/wiki/Security-Enhanced_Linux)

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


## 解決方法
### SELinuxを無効化する
用語理解の箇所では利点をお伝えしましたが現状では、意図的にプログラムが動かなくなったり、インストールできなくなったりすることがある。


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

## SELinuxの設定確認方法/恒久的な無効化/一時的な無効化・有効化
### 1.設定確認方法
#### SELinuxのステータスをチェックするには`getenforce`コマンドを利用します。
##### (例)有効化されている場合
```json
$ getenforce
Enforcing
```
##### レスポンス内容について

|ステータス|状態の詳細|
|---|---|
|Enforcing|SELinux　有効|
|Permissive|動作しないが、ログは残る|
|Disabled|SELinux 無効|

### 2.恒久的な無効化
#### 2.1.設定ファイル修正
SELinuxの設定パス
```json
$ vi /etc/SELinux/config
```
【SELinuxの詳細内容】
```json
# This file controls the state of SELinux on the system.
# SELinux= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELinux=enforcing
# SELinuxTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELinuxTYPE=targeted
```
上記SELinuxの詳細内容の`enforcing`を`disabled`に修正をする
```json
SELinux=enforcing

↓↓↓↓↓↓↓↓↓↓↓↓↓↓

SELinux=disabled

```
#### 2.2.修正後設定の反映
`reboot`コマンドを打ち込み、OSの再起動をして設定を反映させる
```json
$ reboot
```
再度ターミナルで設定の反映がされているかを確認する
```json
$ getenforce
Disabled
```
上記画面が表示されていれば、SELinuxは無効化されている

###　2.3.一時的な無効化・有効化
OSの再起動ができない場合など、下記コマンドで一時的な無効化することが可能です
#### 無効化する場合
```json
$ setenforce 0
```
#### 有効化する場合
```json
$ setenforce 1
```
※ただし【SELinuxの詳細内容】で`disabled`にしている場合は、上記の設定を反映させることは出来ません


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

## さいごに
前回記事の[EC2(RHEL)でlogrotate設定のハンズオン](https://cloud5.jp/logrotate-setting-at-ec2rhel/)で、cronからlogrotateを呼び出した際に発生した問題でしたが、無事に解決することができました。
cronのプロセスに権限を与えることでも解決するかとも思いましたが、実際に適用させようとしていた環境を確認したところ、SELinuxをOFFにしているようだったので、こちらのような解決方法となりました。
CloudFormation作成を効率化するValidate Template機能について

## はじめに
DevOpsの試験問題を解いてるなか、CFn作成を効率化するためのValidate Template機能なるものを初めて知りました。
自身のCFnテンプレートが正しい文法に則っているかをターミナルで確認できるので、CFnゼンゼンワカラナイ自分にとっては大変便利な機能でした。
毎回テンプレートを更新後、マネージメントコンソールを開いて→CFn画面→スタックのアップロード→失敗、、、、の流れから解放されそうです。

## まとめ
早速まとめですが、今回利用するコマンドを記述します。

ただしAWS CLIから実施しますので、CLIの事前設定はお願いします。
AWSドキュメント：[AWS CLI の最新バージョンをインストールまたは更新します](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)

コマンドをターミナルに入力し、【調べたいCFnテンプレート】のファイル名を入力して下さい。
正しければパラメータの値が返ってくる（例では何も設定していないので空が返る）
誤りがあればエラーメッセージが返ってくる
```
aws cloudformation validate-template --template-body file://【調べたいCFnテンプレート】.yml
```

## 挙動の確認
### 用意したテンプレート: `cfn-vpc-sample.yml`
```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  FirstVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
```
### コマンド実行結果：正しい場合（用意したテンプレでは何も設定していないため、パラメータは空）
```
aws cloudformation validate-template --template-body file://cfn-vpc-sample.yml
{
    "Parameters": []
}

```
### 誤っているテンプレートを作成
先ほどのテンプレート: `cfn-vpc-sample.yml`に、誤りになる部分(7行目)を追記
```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  FirstVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
samplesamplesamplesamplesamplesample
```
### コマンド実行結果：誤っている場合
テンプレートフォーマットエラーが返され、間違っている部分付近の情報が返ってくる
```
aws cloudformation validate-template --template-body file://cfn-vpc-sample.yml

An error occurred (ValidationError) when calling the ValidateTemplate operation: Template format error: YAML not well-formed. (line 8, column 1)

```

## ファイル保存時に自動的にコマンドを実行するシェルスクリプト作成
毎回コマンドを入力するのも面倒なので、自動的に更新された場合コマンドを実行するシェルスクリプトの例を記載します。

下記ファイルを 、`check-cfn.sh`で保存する
```
#!/bin/bash
# CFn ValidateTemplate機能を利用した文法チェック

# INTERVALでチェックする間隔を秒数指定
INTERVAL=1
CMD='aws cloudformation validate-template --template-body file://'

#引数でファイルが渡されているかの確認
if [ $# -ne 1 ]; then
  echo '実行するに引数:ファイル名.ymlまでの入力が必要です'
  exit 1
fi

# タイムスタンプが更新されていればValidateTemplateを実行
echo "$1 の文法をチェックします"
last=`ls -l -T $1 | awk '{print $8}'`
while true; do
        sleep $INTERVAL
        current=`ls -l -T $1 | awk '{print $8}'`
        if [ $last != $current ] ; then
                echo ""
                echo "updated: $current"
                last=$current
                eval "$CMD$1"
        fi
done
```
作成しただけでは実行権限がないため、実行権限を付与することも忘れずに
```
chmod +x check-cfn.sh
```
__※実行されると、実行された時点"から"の変更をチェックするので、対象のファイルが変更されるまで画面上では待機待ちのような状態となります。__

### シェルスクリプト実行結果： ターミナル画面
1・2行目：シェルスクリプトに`cfn-vpc-sample.yml`を引数として実行
4・6行目：対象ファイル`cfn-vpc-sample.yml`にCFn文法に誤りがある状態
8-11行目：対象ファイル`cfn-vpc-sample.yml`のCFn文法は正しい状態
```
bash check-cfn.sh cfn-vpc-sample.yml                                          
cfn-vpc-sample.yml の文法をチェックします

updated: 10:16:59

An error occurred (ValidationError) when calling the ValidateTemplate operation: Template format error: YAML not well-formed. (line 8, column 1)

updated: 10:17:08
{
    "Parameters": []
}

```

## おわりに
全然知りませんでした。かなりの時間短縮になったのもですが、なによりCFnを記述するハードルが下がったことが1番の収穫でした。
そして資格勉強するもんですね、自分の知らないことが増えていくのは単純に楽しいことです。
[interactions.py] Discord Botの作り方 #05 - Slash Command ②

# はじめに
この記事ではinteractions.pyというモジュールを使用してDiscord Botを作りたい人向けです。

#05ではSlashCommandの応用について解説していきたいと思います。

# SlashCommandを登録する
これが基礎のプログラムです。
```python
@bot.command(
  name="main",
  description="メインコマンド",
)
```
では今からこのプログラムにサブコマンドなどを追加していきたいと思います。

## サブコマンドを登録する
```python
@bot.command(
  name="main",
  description="テストコマンド",
  options=[
    interactions.Option(
      type=interactions.OptionType.STRING,
      name="sub",
      description="サブコマンド",
      required=True,
    ),
  ],
)
```
こうすることでサブコマンドを追加できます。
f5で実行した時にこの様になれば成功です。
![CF4E0FC7-76E5-45A1-845E-24F70EBA182C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3039218/0827fc00-cf44-c261-e0ea-9d445b634c52.jpeg)

## サブコマンドに選択肢を追加する
通常だとサブコマンドには選択肢がないので、追加していきます。
```python
@bot.command(
  name="main",
  description="テストコマンド",
  options=[
    interactions.Option(
      type=interactions.OptionType.STRING,
      name="sub",
      description="サブコマンド",
      required=True,
      choices=[
        interactions.Choice(name="Option1", value="option1"),
        interactions.Choice(name="Option2", value="option2")
      ], 
    ),
  ],
)
```
`options` 内に `choices = ...` という感じで追加することで選択肢を追加することができます。
成功するとこの様になります。
![704CACFC-0518-4E4A-BC05-CD88752DF79E.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3039218/df31a62a-83a9-be8b-57c3-bedb495d9c53.jpeg)
## サブコマンドに書かれたことを取得する
サブコマンドの欄に書かれたことを取得するには、
```python
async def main(ctx: interactions.CommandContext, sub: str):
  #print(sub)
```
という感じで、 `sub: str` をctxの後に追加することでsubコマンド内に書かれたことを取得することができます。

# 最後に
今回はinteractionsに含まれる Slash Commandについてさらに解説しました。

もし分からないところがあれば Azusa#5812 に気軽にDMしてください。

# Discordサーバー

この度、bot開発者が話し合えるようなDiscordサーバーを開設しました！
ぜひ見に来てください！

https://discord.gg/nxBsFDgbFJ
質の良いソースコードは何をもたらすのか

## 前書き

「 **質の良いソースコード** 」と言うキーワードから、どのようなソースコードを思い浮かべますか？

人それぞれ、千差万別かと思います。

コメントは書かれていますか？
ステップ数はどのくらいでしょうか？
そもそも、「そんなものは存在しない」でしょうか？
はたまた、「ちょっと何言ってるかわかんない」となるでしょうか？

私は、明確な定義を持っています。
本記事では、 **質の良いソースコードの定義** を紹介させていただこうと思います。

## 結論

結論を先に記述しますが、「 **質の良いソースコード** 」は

⦿ **実装工数の削減**
⦿ **保守工数の削減**
⦿ **エンジニアの育成、スキル向上**

をもたらします。

ピンと来ないかもしれないので、掘り下げていきます。

## 「質の良いソースコード」とは

私が考える「質の良いソースコード」とは、

⦿ **可読性が高いソースコード**
⦿ **再利用性が高いソースコード**

を示します。

### 可読性とは

可読性とは、
　**処理の目的や、処理の流れに対する理解のしやすさ**
を指します。

可読性が高ければ、

> ☑ **不具合解析が容易になり、保守工数の削減に繋がる**
> 
> ☑ **第三者が理解しやすいことで、プログラムを複数人の共通認識にできる**
> 　⦿ 「その人がいないと困る」と言う事態にならない
> 
> ☑ **要求仕様とプログラムとの乖離を検出しやすい**
> 　⦿ プログラムが間違った方向に組まれてしまうことを防ぐ
> 　⦿ 仕様変更にも強くなる

と言った効果が現れます。

### 再利用性とは

再利用性とは、
　**ある時点で書かれたプログラムの一部または全てを、後に別のプログラムを書く時に利用すること**
を指します。
冗長な作業に費やす時間とエネルギーを節約する、典型的な技法です。

再利用性が高ければ、

> ☑ **開発チームの資源として蓄積していくことで、複数のプロジェクトに流用することができる**
> 
> ☑ **ある時点で動作確認が取れているため、品質が保証されている**
> 　⦿ 実装、および動作確認の工数を削減することができる

と言った効果が現れます。

## 必要な考え方

「 **質の良いソースコード** 」を書くためには、次の考え方が必要になります。

⦿ **ソースコードに明確な意思を込める**
⦿ **コメントをしっかり書く**
⦿ **第三者に見せることを前提する**

### ソースコードに明確な意思を込める

普通の文章のように、「 **書き手の意思が読み手に伝わる** 」ように心がけます。

> ■ **変数名の命名規則**
> ・自分ルールでも、規則化されていることが伝わればよい
> 
> ■ **変数のスコープ（有効範囲）**
> ・変数のスコープはできる限り小さくする
> 
> ■ **関数化基準の明確化**
> ・共通で使用する可能性が高い処理を関数化する
> ・仕様変更によって変更が発生する可能性が高い処理を関数化する
> 
> ■ **クラス作成基準の明確化**
> ・システムを構成する要素を適切にクラス化する
> ・クラスの役割が明確になっている
> 
> ■ **処理をまとめる（ブロック化）**
> ・処理をまとめることで、俗に言うスパゲッティコードになることを防ぐ
> ・後で関数化しやすい
> ・記述位置を変更する場合、ブロック単位で移動できる

意思が伝わることで、ソースコードが格段に読みやすくなります。

### コメントをしっかり書く

コメントは、設計工程とテスト工程を紐付けるものと位置付けます。

「 **設計書に書くべきフローチャート（振る舞い）を、コメント（人が理解できる文章）として書く** 」ことで、 **設計工程と紐付け** ます。

> ☑ **振る舞い＝テスト項目となるので、テスト工程とも紐付く**
> ☑ **JavaDoc、YARD、PHPDocなどのドキュメント生成ツールによって、ドキュメントを生成できる**
> ☑ **ドキュメント生成ツールの規約に沿って、クラスヘッダー、関数ヘッダーを記述する**

実際にドキュメントを生成しないとしても、
**規約に沿って書かれていることで理解しやすくなり、可読性が向上します。**


### 第三者に見せることを前提とする

**ソースコードこそ、プログラマーが最大の力を発揮して作る「 モノ 」です。**
**これに力を入れずして、プログラマーは名乗れません。**
**プログラマーはクリエイターであり、ゼロからイチを生み出していく役割であり、それを生業とするプロフェッショナルです。**

ソースコードは「 **システムの核となる要素** 」であり、だからと言って見えなくて良いものではありません。
見えないところにこそ、細心の気配りが必要です。

また、その場しのぎで作られた使い捨てされるものでもありません。
システムが続く限り、「 **いつでも不具合修正・仕様変更・バージョンアップ対応が発生する** 」可能性があります。
先々に発生するであろうそれらを見越して、「 **いつでも誰でも読みやすく理解しやすいコードを書いておく** 」必要があります。

第三者によって解析・改修され続け、時にはお手本にされることもあります。
そのようなモノが、見づらく汚いものであってはいけません。
インターネットのサイトや印刷物のように、「 **誰が見てもわかりやすく、美しいと感じるもの** 」でなければなりません。
いついかなる時でも、「 **ソースコードを見ながら説明できる（リバースエンジニアリングできる）** 」ようにしておかなければなりません。

それほどの想いを持って、ソースコードを書くべきです。

## まとめ

先に述べた結論のとおり、「 **質の良いソースコード** 」は

> ☑ **実装工数の削減**
> 　⦿ 再利用性の高さにより、流用可能なリソースを蓄積できる
> 
> ☑ **保守工数の削減**
> 　⦿ 可読性の高さにより、不具合解析が容易になる
> 　⦿ そもそも品質が向上するので、不具合の発生頻度が低下する
> 
> ☑ **エンジニアの育成、スキル向上**
> 　⦿ 可読性の高さにより、初心者でもコーディングを学習しやすくなる
> 　⦿ 良いコーディングパターンとして、ひとつの指標（参考例）となる

をもたらします。

プログラマーが書くソースコードこそが、システムの **核** となる、 **最も重要な要素** です。

「 **ソースコードと真摯に向き合う** 」ことが、
「 **プロジェクトを成功に導く最善の方法** 」だと、私は考えます。
エンジニア未経験者がまず何をすべきか？

# 対象読者
* これから未経験でエンジニアになるけど何をしたらいいか分からない人
* 既にエンジニアだけど、どんなことを勉強していけばいいのか分からない人

この文章が皆さまのためになりましたら幸いです。

# 私の経歴について
まず私の経歴についてですが、私立文系大学の経済学部の出身で、
大学生の時はプログラミングに関して何も知りませんでした。

ですので、社会人になってからプログラミングを勉強し始めました。
現在社会人3年目となります。
研修は3ヶ月間のIT基礎研修•Java研修と1ヶ月間のvb.net研修を受け、
現場に着任し現在もその職場で働いてます。

# やってきたこと
現場ではC#を使用していたため、言語自体は学び直す必要がありました。
現場に着任しても、知らない用語が飛び交い、指示待ち人間と化してました（笑）
なので、とりあえず知識を増やす方針で学習を進めました。

### 知らない用語が出てきたらとりあえずメモする習慣をつける

基本的に現場に着任しても最初は何もわからないと思います。
自分はコマンドプロンプトを起動することすらできませんでした（笑）
なので、知らない用語が出てきたらメモしておいて後で調べると良いです。
これを日々続けていると知識がどんどん増えていくのでおススメです！！

【参考】
私はノートアプリとして、Evernoteを使用してます。
こんな感じでWEBの情報をクリップしたり、自分のメモをまとめたりなどして
知識を増やしてました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3013193/7bb1ee63-8dec-3d57-2232-75f6ddaac1c8.png)


### 基本情報技術者試験の勉強をする

https://amzn.asia/d/7gpukhP

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3013193/edb19427-2495-8e01-7d78-ced398c35c05.png)

これはエンジニアの登竜門と巷で言われているやつですね。ITの全体的な知識を浅く広くやる感じです。
基本的にとっておいて損はないので取り組んでみてください。
基本情報技術者試験の内容が入っていれば、業務中に「あ、勉強したあれか！！」
みたいな感じになり、会話が少しずつ通じるようになってきます。

ちなみに私はこの参考書を使用していました。

おすすめポイントとしては
* 【なぜ】がわかるように説明が丁寧にされていること

勉強方法としては
* 本を一周してみる
* 過去問道場を使って過去問実施（午前問題も午後問題も）

https://www.fe-siken.com/fekakomon.php

* 間違えたところとかはEvernoteとかのノートにまとめておく

ある程度課題点がわかってくると思います。
そしたら、ひたすら過去問を解いては復習するのがいいです。

私は午前問題は5年分（春期・秋季）、午後問題は3年分くらいやりました。
午前問題は再利用されて出題されるので、やればやるほど見たことある問題が増えてきます。
午後問題はジャンルが分かれているので、自分の得意なジャンルに絞っていくのもありだと思います。





### リーダブルコードを読んでみる

https://amzn.asia/d/ickAOBr

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3013193/4656c528-9fd5-e0b3-647c-555f7bbf418a.png)

こちらはエンジニアとしてもプログラマーとしても絶対読んでおくべきバイブル本と言えます。
コードを書く上では小さなテクニックが可読性向上に関わるという内容が多いです。
例として以下の項目にチェックがつかない方はこの本を読んでみるといいヒントが得られると思います。
- [ ] 変数名の付け方に明確な意味を持たせていますか？
- [ ] コメントすべきことが何かわかっていますか？
- [ ] if文のネストを深くしないために何をすべきかわかりますか？

正直、私も未だに見返すことがありますが、その度に違った視点でこの本を見ているので、
何度でも読める本だと思います！

### C#の文法を覚える

https://amzn.asia/d/6hHMsK6

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3013193/1a2ea9cf-09c9-bf5c-6a60-98920ad23a88.png)

こちらはC#の文法のリファレンス本として使用しました。
もちろんMicrosoft社から出ているリファレンスを見るのが一番ですが、
個人的に読みづらい印象です。
なので、最初はこの本を使用して書き方を覚えていくといいと思います！

以上、最後まで読んでいただきましてありがとうございました。
攻撃と防御

# Webアプリケーションの脆弱性
Webサイトのソフトウェアにセキュリティ面での欠陥があると、その欠陥を狙った外部からの攻撃より、```セキュリティ事故(インシデント、incdent)```が発生する可能性があります。このようなセキュリティ上の弱点を```ソフトウェアの脆弱性```と呼びます。

# クロスサイトスクリプティング(Cross Site Scripting: XSS)
掲示板のような、ユーザーの入力内容を表示するタイプの```Webサイトの脆弱性を突く攻撃```です。

### 仕組み
攻撃者が```脆弱性を持つWebサイトに対してスクリプトを書き込む```。
脆弱性のあるWebページを介してスクリプトがユーザーのWebブラウザに送り込まれ、クライアントサイド・スクリプトとして実行されてしまう。
### 悪意
送り込まれるスクリプトとしては```セッションハイジャックのためのCookie情報を後悔するものや、ウイルスをダウンロードするもの```などが考えられる。

# IDS、IPS
ファイアーウォールで防ぎきれない攻撃を防ぐ手段の一つに```IDS(Intrusion Detection System)```と```IPS(Intrucsion Prevention System)```があります。

### 2つの種類
```通信を監視するネットワーク型````と```サーバー上のユーザーの動きを監視するホスト型```の２種類があります。

### ネットワーク型のIDS、IPS
ネットワーク上を流れる```通信を監視し、不正アクセスと見られる通信や普段と異なる以上な通信```を検知する装置。

#### IDS
異常があったことを```システム管理者にメールなどで通知する```。

#### IPS
通知だけなく、即座に```該当する通信の遮断```を行う。
##### 問題点
正常な通信を不正な通信と```誤って判断(誤検知)してしまい、```可用性が低下```してしまう。

### 不正アクセスの検知方法
#### シグネチャ型(不正検知型)
シグネチャとは、```通信パターンが登録されたデータベース```のこと。
通信対象の通信とシグネチャを比較し、```シグネチャに登録されたパターンと一致する通信を不正アクセスと判断```します。

### アノマリー型(異常検知型）
普段の通信とは```大きく異なる通信や、通常は発生しないような通信```を不正アクセスと判断する検知方法。
通信内容は不審な点がないものの```アクセスが急増するF5攻撃などを検出できます。

#### 出典
https://www.sbcr.jp/product/4797388817/

# WAF(Web Application Firewall)
IDSやIPSは通信の中身まではチェックしないため、クロスサイトスクリプティングやSQLインジェクションのような一見正常な通信に見えるものの、ユーザーから送信されてくる```データに悪意のあるデータが含まれる攻撃は防ぐことができない```。
そのためWAFは```パケットの中身を見て悪意のあるデータが含まれていないか```をチェックする。

### 問題点
* 機器自体が高価
* 運用にも手間やコストがかかる。

### ブラックリスト型
特定のパターンのデータを持つ通信を遮断します。
```遮断するデータのパターン```は```ブラックリスト```という。
#### 問題点
ブラックリストにそのパターンが追加されるまでは対応できません。

### ホワイトリスト型
正常なデータのパターン(ホワイトリスト)を登録しておき、それに```適合する通信のみを通します```。
```高いセキュリティ性が期待```できる。

#### 問題点
* あらかじめ登録しておく必要があり、正確なホワイトリスト作成には、```専門的な知識が必要```となります。
* WAFの運用にコストがかかりがち

#### 出典
https://www.sbcr.jp/product/4797388817/
プログラミングを始めてみたい方へ

こんにちは、Ftpsです。
最近身近な人とかにプログラミングを教える機会があったりしたので、なんとなく書き綴ってみます。
一応いくつかのプログラミングの大会で優勝させてもらっています(実名でるので何かは言えない)

...高校生のくせにみたいな文章があるかもしれませんが、ご了承ください
()中は心の声です(え？)

:::note warn
警告
途中で雑になっているので、また書き直すかもです...
:::

# 大事なこと

まず最初に自分がプログラミングで何をしたいかできるだけ具体的に考えてみてください！
* Discordの入退出管理botを作ってみたい→(Python, Javascript...)
* タイマーを作ってみたい→(C#-WPF)
* ArduinoとかSpresenseとかを使ってミュージックプレイヤーを作ってみたい→Arduino言語(C/C++)

何か思いつきましたか？
それによって学ぶ言語が変わってきます

# 具体的に何するか

どの言語を学ぼうか決めて、やることは大きく分けて3つだと思います

* 言語の構文を学ぶ
* 標準ライブラリをある程度マスターする
* 調べまくる、質問する

正直、これだけです。

## 言語の構文を学ぶ

ここでの構文とは、代入だったりif文、どのようなものを作るにあたっても使うものです
代入といっても、言語によって方法が違います。
例えば、配列array[1, 2, 3]の中身を順番に出力し、値3の時に文字列"It's 3!"を出力する(なにこれ)コードは

```c:C
#include <stdio.h>

int main(void)
{
  int array[3] = {1, 2, 3};
  int i;
  
  for(i = 0; i<3; i++) {
    
    printf("%d\n", array[i]);
    
    if(array[i] == 3) {
      printf("It's 3!\n");
    }
  }
  return 0;
}


```
```javascript:JavaScript
const array = [1, 2, 3]
array.forEach(( number ) =>{
  console.log(number)
  
  if (number==3) {
    console.log("It's 3!")
  }
});
```
だったり、ちょっとずつ違ってたりします。
両方とも出力結果は
```
1
2
3
It's 3!
```
です。(え、ほんとなにこのコード)

言語によって同じことをするコードでも書き方が変わってきます。
同じように標準ライブラリも違うのでそれをある程度覚えておくことをお勧めします！

私がC言語を学んだときは

- https://9cguide.appspot.com/
- https://learn.microsoft.com/ja-jp/cpp/c-language/c-language-reference?view=msvc-170
この二つのサイトにお世話になりました
### よし、構文の書き方もライブラリの使い方もなんとなくわかったぞ！
ってなったらあなたはもうプログラマーです
あとは自分の腕を磨いていきましょう！

# 調べまくる
ここで先ほど決めてもらった目標を使います。
例えば、Spresenseを使ってミュージックプレイヤーを作りたいと思ったら、どのような動作が必要か
* microSD カードにある WAV 音楽ファイルを再生する
    * DSPを使ってデコードする必要がある
    * WAVファイルをフレームに書き込む
    * 音量調節機能
        * setVolume(volume) 
    * 再生/停止
        * startPlayer()
        * stopPlayer()
        ...


調べてみると、いろんな人のやってみた例や、開発元のリファレンスだったりが出来ると思います。
それらを読み漁って、身に着けた構文などに当てはめていって、それで作りたいものが作れたのではないでしょうか？

# 質問する
勿論、調べてもわからないこともあると思いますし、エラーに悩まされると思います(悩まさられない人はいない)
そんなときは有識者に質問してみるのがいいと思います！
stackoverflowやteratailなど、質問できるコミュニティもありますので、ぜひ使ってみてください

# 最後に
なんとなく書き綴ってみましたが、とりあえずこの
* 言語の構文を学ぶ
* 標準ライブラリをある程度マスターする
* 調べまくる、質問する

が一番大事だと私は思っています。
エラーと格闘して時間をかけて完成させることも大事です。
そうやって自分の技術を磨き上げることがプログラミングの醍醐味でもあると思います！

(途中雑でごめんね)
[メモ]CSSでグリッドにに吸い込まれるカードを実装してみた。

[サンプルコード](https://codepen.io/yuriacats/pen/YzGVeNZ)


皆さんは、方眼紙の中に自由にカードを配置したい…そう思ったことはありませんか？
今回はCSSのグリッドの枠内に収まるカードというコンセプトで実装を行なってみました。
その時に気がついたtipsをメモで書いていきます。


## 対象となるClassに一括でJSを当てる

onMouseUpやonMouseDownなど複数の関数を当てなければいけない時は、設定当てる用の関数を用意してそれを配列に入れてそれぞれにイベントが起きた時という条件式を与えることでも動作させることが可能です。
```js
var track = document.getElementsByClassName('memo-content');
```
この時trackは配列型になるので、それぞれの要素の監視したいイベントに、トリガーとなって動く関数を渡してやればうまく動きます。


Reactなどを用いる際はコンポーネントとしてまとめることで作ることができるので不要です。




## event.terget.style

このjsの要素はイベントハンドラーと組み合わせることでイベントの対象となった要素のCSSの値を直接変えることができます。
基本的にはterget.styleを直接変えるより、CSSのクラスとして渡してあげる方が原則良いと言われています。


今回のようなマウスに追従させる・キャンバスを使わずにイラストを描かせるといった用途でない限りは素直にclassを使いましょう。


## document.addEventLisner

https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener
addEventLisnerを使うことにより、渡したイベントが起こっている時関数を呼び出す動作ができるようになっています。今回の場合は、特定のクリックしたターゲットを対象にしたかったため、removeEventLisnerも併用してクリックしている間だけ明示的にEventLisnerが動くようにしています。
キャンバスのお絵かきアプリといったユースケースの場合にはremoveが不要な場合もあります。


## CSS positionとgrid

`position:absolute` の時、グリッドではなくleft topの方の位置スタイルが採用されます。
一方で`position:absolute` である時は親要素のgridに引っ張られgridの子要素として振る舞うため、topやleftが無視されgrid-colomn-startの値がスタイルの位置に適用されます。このようにpositionの値で一の計算ロジックを変えることで特定の場所に吸い付く実装を簡単に作ることができます。


https://developer.mozilla.org/ja/docs/Web/CSS/grid-column-start
ALB(Application Load Balancer)で、特定のドメインだけスティッキーセッションを有効化する方法

# はじめに
ALB配下のサーバで特定のドメインだけはスティッキーセッションあり、その他はなしにしたいというケースが有ったので、実装方法を記載します。

# 1.そもそもやりたい構成
![スクリーンショット 2022-12-10 15.22.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/54966f0c-a222-34e7-3bdc-5e12ed90b929.png)
かんたんに説明すると、上記のように複数のドメインへのリクエストを前段のALB１つで処理し、Webサーバでリクエストに基づいて、後続のAPサーバに振り分けます。ただし、www2のリクエストに関しては後続のAPサーバのアプリの都合上スティッキーを有効化したいというケースです。


# 2.実装方法
まずターゲットグループを２つ作成します。
１つは、スティッキーセッションあり（www2）、もう１つはスティッキーセッションなし（www1）のターゲットグループです。
次に、リスナールールをALBに作成します。
ホストヘッダーの条件に、www1.xxx(FQDNを記載)を指定し、ターゲットに前段で作成した、スティッキーセッションなしのターゲットグループを指定します。
次にもう一つのリスナールールを作成します。
ホストヘッダーの条件に、www2.xxx(FQDNを記載)を指定し、ターゲットに前段で作成した、スティッキーセッションありのターゲットグループを指定します。
最後にAutoScalingグループにて、上記２つのターゲットグループを指定すれば完了です。
※AutoScalingグループでは２つのターゲットグループへの同時所属が可能です。そのため、同じEC2が２つのターゲットグループに所属することができ、２つのリクエスト（www１、www２）を受理できます。
![スクリーンショット 2022-12-10 15.46.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/a8bc49ce-b7bd-0b70-1ff2-6e4a3f55338f.png)

# ３.そもそもなぜスティッキーセッションを限定したいか？
結論から言うと、ステートレスにしたいからです。ステートを特定のEC2でもってしまうと、その部分が単一障害点となってしまいます。また、セッションの維持期間中は元のリクエストを受け付けたサーバにリクエストが行ってしまうため、負荷分散を均等に行うことができなくなってしまいます。基本的には、スティッキーは原則利用しない、セッションは外部に管理すると言うことを必ずお勧めしています。今回の構成はどうしてもセッションを維持しないとと言うことで苦肉の策で考えた構成です。

# 4.まとめ
今回はスティッキーセッションの特殊な事例をご紹介しました。
原則ステートレストすべきと言う考えから、スティッキーセッションは最小限の利用にとどめたいものですね。
EC2インスタンスの時刻設定のハンズオン

## はじめに
今回はEC2（Windows）インスタンスに、日本時間を設定するためのハンズオンをしていきます。

### 1.NTP（Network Time Protocol：機器の時刻情報を同期するプロトコル）の設定
Windowsインスタンスのシステムが再起動しても、日本時刻が維持されるようにするため（設定しないと再起動のたびにUTC時間が適用される）、AWSが提供しているNTPをEC2（Windows）に設定します
設定方法詳細：[AWSドキュメント：Windows インスタンスの時刻の設定](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/windows-set-time.html)
#### 1.1.コマンドプロンプトで下記コマンドでレジストリキーを追加する
追加された場合"この操作を正しく終了しました。"と表示される
```
reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /d 1 /t REG_DWORD /f
```
![](https://cloud5.jp/wp-content/uploads/2022/09/スクリーンショット-2022-09-04-11.18.07-640x43.png)

#### 1.2.RealTimeIsUniversal キーが正しく保存されていることを確認する
```
reg query "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /s
```
保存されている場合は上記コマンドのレスポンスとして、一番下の欄に``RealTimeIsUniversal``の表示がされる
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-18-8.46.49-640x161.png)

#### 1.3.``w32tm``コマンドで手動で時刻を同期する
```
w32tm /resync
```
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-18-8.50.20.png)

### 2.日本時刻に設定する
##### 2.1.Windowsの設定画面から『日付と時刻』を選択
![](https://cloud5.jp/wp-content/uploads/2022/09/スクリーンショット-2022-09-04-11.21.37-640x507.png)

##### 2.2.タイムゾーンを日本時刻に設定する
![](https://cloud5.jp/wp-content/uploads/2022/09/スクリーンショット-2022-09-04-11.23.41-1-549x640.png)

##### 2.3.タイムゾーンが変更されたことを確認する
時刻が日本時間になっているか比較する
![](https://cloud5.jp/wp-content/uploads/2022/09/スクリーンショット-2022-09-04-11.32.46-640x518.png)


## おわりに
インスタンス自体はプライベートサブネットにあるので、時刻を取得できるのか不明だったためハンズオンしてみました。
SGもNACLも穴あけしてないなと思いながら、再度ドキュメントを読み直したら、``インスタンスはインターネットにアクセスする必要はなく、アクセスを許可するためにセキュリティグループルールまたはネットワーク ACL ルールを設定する必要はありません。``とありました（笑）
ちゃんとドキュメントは読むようにします。
CloudFrontでOrigin Access Control (OAC)を利用したアクセス制御のハンズオン

## はじめに
今年8月26日のアップデートで`CloudFrontからS3へOrigin Access Control (OAC)を利用したアクセス制御`についての発表がされました。

[Amazon CloudFront introduces Origin Access Control (OAC)](https://aws.amazon.com/jp/blogs/networking-and-content-delivery/amazon-cloudfront-introduces-origin-access-control-oac/)

## Origin Access Control (OAC)の利点
下記のような利点が挙げられ、新たにCloudFrontからS3アクセス制限をする場合にはOrigin Access Control (OAC）を積極的に使用していく

・セキュリティの強化
・HTTPメソッドのサポート（GET, PUT, POST, PATCH, DELETE, OPTIONS, HEAD)
・SSE-KMSを使用したS3バケットのダウンロードとアップロードのサポート
・全ての（2022年12月までに開始される）リージョンでOAIをサポート
・SigV4のみで対応しているリージョンへのHTTP/HTTPSを利用したPOSTメソッドのリクエスト

## ハンズオン
・既にS3は作成してある（暗号化なし）状態でスタートします
### Cloudfrontの設定
#### ディストリビューションの作成
項目『オリジンドメイン』に対象とするS3バケットを入力する
項目『S3バケットアクセス』にある`Origin access control settings`を選択する
![](https://cloud5.jp/wp-content/uploads/2022/08/スクリーンショット-2022-08-27-9.44.32-604x640.png)

#### コントロール設定を作成
特に変更なしで『作成』を押下、他の項目も変更なしで画面下にある『ディストリビューションを作成』を押下する
![](https://cloud5.jp/wp-content/uploads/2022/08/スクリーンショット-2022-08-27-9.44.53.png)

#### ポリシーをコピーする
ディストリビューション完成後、画面上部の赤枠部分『ポリシーをコピー』を押下してポリシーのコピーを行う。
![](https://cloud5.jp/wp-content/uploads/2022/08/スクリーンショット-2022-08-27-9.53.42-640x171.png)

### S3の設定
#### バケットポリシーの編集
対象のS3へ移動後、項目『バケットポリシー』の『編集』を押下する
![](https://cloud5.jp/wp-content/uploads/2022/08/スクリーンショット-2022-08-27-10.07.09-640x239.png)

編集後の画面
![](https://cloud5.jp/wp-content/uploads/2022/08/スクリーンショット-2022-08-27-10.24.48-640x236.png)

#### Origin Access Control (OAC)ポリシーの内容(今回コピーしたポリシーの内容)
```
{
        "Version": "2008-10-17",
        "Id": "PolicyForCloudFrontPrivateContent",
        "Statement": [
            {
                "Sid": "AllowCloudFrontServicePrincipal",
                "Effect": "Allow",
                "Principal": {
                    "Service": "cloudfront.amazonaws.com"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::tetutetu-test/*",
                "Condition": {
                    "StringEquals": {
                      "AWS:SourceArn": "arn:aws:cloudfront::012345678912:distribution/E1XXXXXXXXXXXX"
                    }
                }
            }
        ]
      }
```
#### ※参考：従来の Origin Access Control (OAI)でのポリシー
"Principal"の部分に多少の違いが見られます
```
{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E3XXXXXXXXXXXX"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::tetutetu-test/*"
         }
    ]
}
```
### 挙動の確認
#### CloudFront経由でアクセスした際の画面
![](https://cloud5.jp/wp-content/uploads/2022/08/スクリーンショット-2022-08-27-10.22.28-640x173.png)

## さいごに
今回は基本的な設定の仕方のみでしたが、実際恩恵を受けるにあたってはSSE-KMS暗号化しているS3にアクセスするパターンの場合とかですかね。とりあえずセキュリティの強化だけを今回のハンズオンできた感じです。
もう少し時間をとって、SSE-KMS暗号化しているS3へのアクセスする場合など切り分けして学習してきます。
SaxonJSでXPath3.1のクックブック

# 始めに
XPathを使う場合、いまだに1.0で行われることが多い状況ですが、2017年には3.1が発表され、数多くの機能が追加されました。
[XML Path Language (XPath) 3.1: 日本語訳](https://www.amris.jp/xp/xpath31.html)

またXPath3.1に対応した実装としてJavaScriptで動作するSaxonJSがあります。
https://www.saxonica.com/saxon-js/index.xml

このようにXPath3.1は十分に身近な存在としてなるはずですが、実際に試そうとなると難しい面があるのは否めません。
そこで私が気軽に何度もXPathを試せる環境を用意しました。
https://inomoto-hironobu.github.io/app/xpath3/xhtml.xhtml

これで環境は整いましたが、では実際にどのように試していけばいいかの道しるべが、今はあまりない状況です。
そこで、本記事ではXPath3.1のクックブックとしてスムーズに学習を進める手伝いになるような書き方にしています。

以下の書き方でトピックを作っていきます。
* やりたいこと（何をするか）
* コード
* text（コンテキストに入れるオブジェクトのテキスト）
* xpath
* result（コンソールに表示される結果）
* 解説

今後ともトピックの追加をしていくつもりですが、一人では限界がありますので、お手伝いいただければと思います。

また以下のサイトが役に立ちます。
[SaxonJSのドキュメント](https://www.saxonica.com/saxon-js/documentation2/index.html)
[Altovaのドキュメント](https://www.altova.com/training/xpath3)


# クックブック
## 文字列の長さを測る
### やりたいこと
ある文字列の長さを測りたい。
### コード
```javascript:text:string
本日は晴天なり
```
```xpath:xpath
string-length(.)
```
```console:result
7
```
### 解説
XPath3.1では処理対象とする型はXMLにとどまりません。
文字列、JSONなどにも対象を広げ、より汎用的な処理言語となっています。
ここでは単純な文字列の長さを測っています。
ドット(.)はコンテキスト、つまり入力の文字列を表しています。
あとは関数を使って長さを計算しています。

## 入力なしにXPathを試す
### やりたいこと
入力値を用意するのが面倒なので入力なしでもXPathを試したい。
### コード
```javascript:text:null
```
```xpath:xpath
(1,3,5)[2]
```
```console:result
3
```
### 解説
XPath3.1では式によって様々なオブジェクトを生成できます。
シーケンス、マップ、関数など多彩です。
例の式では数字3つを持つシーケンスを生成し、2番目の要素を取り出しています。
例えばちょっとしたビルトイン関数を試すだけならリテラルを生成する書き方で試す方が楽でしょう。

## JSONの経路をたどりたい
### やりたいこと
JSONのあるプロパティの値を経路をたどって得たい
### コード
```json:text:json
{
  "hoge":{
    "foo":"test",
    "bar":"test2"
  }
}
```
```xpath:xpath
?hoge?bar
```
```console:result
test2
```
### 解説
JSONのマップ構造の延長にある値を得ようとするときは、非常に簡潔に値を得ることが可能です。
ルートとなるコンテキストから?で名前を連ねていくだけです。

## 直接配列を処理する
### やりたいこと
XPathに直接配列を渡し、特定の位置の要素を取り出したい。

```javascript:text
[[1,3,5]]
```
```xpath:xpath
.[1]=>array:get(1)
```
```console:result
3
```
### 解説
XPathではシーケンスと配列という、似て非なる概念が混在しています。
シーケンスは多次元にできませんが、配列は多次元にできます。
一方、JSONからXPathへの転換は少し複雑です。
まずJSONの配列は、まずはシーケンスに変換されます。
しかしもし、配列の要素としての配列であれば配列に転換する、という仕様です。
さらにXPathの入力においては要素が1つを超えるシーケンスを渡すことができません。
例えばこのJSONを渡すとエラーになります。
```javascript:text
[1,3,5]
```
```console:result
Context item is a sequence of more than one item
```
そこで例では、配列に一つの配列が含まれるJSONを入力として渡し、1つの配列を持つシーケンスに転換されるようにして実質的に配列が渡されたかのような処理を行っているわけです。
LambdaによるEC2のステータスチェックの構築

## はじめに
EC2が停止した場合にチェックをするLambdaを構築してみました。
本当はDirectConnectのStatusチェックをしてみようと考えてたのですが、会社の環境にDirectConnectの構築がなかったもので、まず手始めにEC2のStatusチェックをするLambdaを構築しました。

## 構築概要図
![](https://cloud5.jp/wp-content/uploads/2022/08/スクリーンショット-2022-08-21-21.20.33-640x492.png)

## リソース構築
"state"を取得しようとしているEC2の構築はスコープ外にします

### Lambdaの構築(デフォルトからの変更部分のみ記述)
#### IAMロール
既存のCloudWatchのロールに追加して、AWS管理の`AmazonEC2ReadOnlyAccess`を付与（下記画像あり）
![](https://cloud5.jp/wp-content/uploads/2022/08/スクリーンショット-2022-08-21-20.35.08.png)

####  コード部分
```
import boto3

def lambda_handler(event, context):
    ec2 = boto3.client('ec2')

#取得したいEC2のインスタンスの情報を入力(i-XXXXXXXXXX)部分は自分のEC2リソースを確認して入力
    mystatus= ec2.describe_instances(
        Filters=[{'Name':'instance-id', 'Values':['i-XXXXXXXXXX']}] 
    )["Reservations"][0]["Instances"][0]['State']['Name'] 
    print(mystatus)
```
### CloudWatchLogs
#### Lambdaの出力ログについての画面(EC2が停止中の状態での画面)
停止しているのでLambdaでStateを取得していると、赤枠のような”stopped”が出力される
![](https://cloud5.jp/wp-content/uploads/2022/08/スクリーンショット-2022-08-21-20.40.54-640x131.png)

#### メトリクスフィルターの設定
ログの"stopped"をメトリクスフィルターに設定して、CloudWatchアラームに紐づけます
![](https://cloud5.jp/wp-content/uploads/2022/08/スクリーンショット-2022-08-21-20.41.19-640x392.png)

#### CloudWatchの設定内容
"stopped"をトリガーにしてアラームへ通知がなされ、1度以上の場合にアラームを鳴らすように設定しました。
他にもSNSを利用してメールを通知するなども設定が可能です(スクショ撮り忘れ)。
![](https://cloud5.jp/wp-content/uploads/2022/08/スクリーンショット-2022-08-21-20.52.47-411x640.png)

#### CloudWatchアラームでの見え方
上記設定後にLambdaを動かしてみると、アラーム状態に表示が変更されることが確認できました。
![](https://cloud5.jp/wp-content/uploads/2022/08/スクリーンショット-2022-08-21-20.38.40-2-640x191.png)

#### SNSを利用した通知メール
こちらにもアラームが鳴っていることが通知されています。
![](https://cloud5.jp/wp-content/uploads/2022/08/スクリーンショット-2022-08-21-21.04.43-640x82.png)

## さいごに
定期的に動作させるためにEventBridgeのCronを利用すれば良さそうです。
DirectConnectの場合なら`client = boto3.client('directconnect')`にLambdaを変更すれば、ステータスを確認することも問題なさそうです。
SessionManagerで利用するエンドポイントのCFn構築

## はじめに
最近リソースの消し忘れが多いてつてつです。
消すのは一瞬ですが、再度スクラッチで作ることを考えると手が止まってしまうんですよね。
そんな月曜日の自分に向けてCFnの構築メモを作成していきます。

## サービス概要図(一部抜粋)
今回自分のケースでは、[Session Manager のセットアップ](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started.html)を利用して、EC2へアクセスを行なっています。
その際にエンドポイントを3つ構築する必要があり、今回はこの3つのエンドポイントをCFnで構築するものです。

![](https://cloud5.jp/wp-content/uploads/2022/08/スクリーンショット-2022-08-20-17.25.17-565x640.png)

## AWS CloudFormationテンプレート
```
AWSTemplateFormatVersion: '2010-09-09'
# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
Parameters:
#VPCID
  VpcId:
    Description : "VPC ID"
    Type: AWS::EC2::VPC::Id

#InterfaceSubnet
  InterfaceSubnetId:
    Description : "Interface Subnet"
    Type : AWS::EC2::Subnet::Id

#Interface Security Group
  InterfaceSecurityGroupId:
    Description : "SecurityGroup"
    Type: AWS::EC2::SecurityGroup::Id

Resources:
# ------------------------------------------------------------#
# Create ssm End Point
# ------------------------------------------------------------#
  ssmEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ssm"
      SubnetIds:
        - !Ref InterfaceSubnetId
      VpcId: !Ref 'VpcId'
      VpcEndpointType: Interface
      SecurityGroupIds:
        - !Ref InterfaceSecurityGroupId
      PrivateDnsEnabled: true

  # ------------------------------------------------------------#
  # Create EC2Message End Point
  # ------------------------------------------------------------#
  EC2MessageEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ec2messages"
      SubnetIds:
        - !Ref InterfaceSubnetId
      VpcId: !Ref 'VpcId'
      VpcEndpointType: Interface
      SecurityGroupIds:
        - !Ref InterfaceSecurityGroupId
      PrivateDnsEnabled: true

  # ------------------------------------------------------------#
  # Create ssmmessages End Point
  # ------------------------------------------------------------#
  ssmmessagesEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ssmmessages"
      SubnetIds:
        - !Ref InterfaceSubnetId
      VpcId: !Ref 'VpcId'
      VpcEndpointType: Interface
      SecurityGroupIds:
        - !Ref InterfaceSecurityGroupId
      PrivateDnsEnabled: true
```

## さいごに
これで少しはスクラッチの憂鬱から逃れられそうです。
サブネットを選択ミスして待てど暮らせどEC2へ繋がらないなど、今週は合計して1時間くらいかかっているかと思ったので、塵つものようなことでも自動化していくことが必要かなと。
もっと身の回りのことを自動化していこうと思います。
JavaScriptの便利な構文 -分割代入とスプレット構文

# はじめに

JavaScriptには便利な記法が多く、
使いこなすことでシンプルなコードを書くことが可能になりますが、
フロントエンド開発をしているなかで、あまり意識できずにたらたらと長いコードを書きがちです。

便利な構文をピックアップしました。

## 分割代入

```javascript
const [a, b] = ['hoge', 'fuga'];
console.log(a, b); // hoge fuga
```

```javascript
const profile = { id: 1, name: '田中', age: 28 };
const { id, name } = profile;
console.log(id, name); // 1 '田中'
```

```javascript
const [, , a, , b] = [1, 2, 3, 4];
console.log(a, b); // 3 undefined
```

活用してみると、

```typescript
const data = {
  users: [
    {
      id: 1,
      name: '田中',
      email: 'tanaka@example.com',
    },
    {
      id: 2,
      name: '鈴木',
      email: 'suzuki@example.com',
    },
    {
      id: 3,
      name: '佐藤',
      email: 'sato@example.com',
    },
  ],
  url: 'https://hogehoge.com',
  params: {
    hoge: 'hoge',
    fuga: 'fuga'
  }
}

const { users, params: parameters, status = 200 } = data

console.log(users)
// [
//   { id: 1, name: '田中', email: 'tanaka@example.com' },
//   { id: 2, name: '鈴木', email: 'suzuki@example.com' },
//   { id: 3, name: '佐藤', email: 'sato@example.com' }
// ]

console.log(parameters)
// { hoge: 'hoge', fuga: 'fuga' }

console.log(status)
// 200
```

のように書ける。


## スプレット構文

```javascript
const hoge = ['a', 'b', 'c'];
const fuga = [...hoge, 'd', 'e'];
const hogehoge = ['Y', 'Z', ...fuga]
console.log(fuga) // ['a', 'b', 'c', 'd', 'e'];
console.log(hogehoge) // ['Y', 'Z', 'a', 'b', 'c', 'd', 'e'];
```

先ほどの分割代入と組み合わせて↓のようにも書ける

```typescript
const users = {
  id: 1,
  name: '田中',
  email: 'tanaka@example.com',
}

const { id, ...ExceptId } = users

console.log(id)
// 1

console.log(ExceptId)
// { name: '田中', email: 'tanaka@example.com' }
```

うまく使ってシンプルなコーディングを心がけましょう！
S3 バケットポリシー設定時のエラーへの対処方法

### 問題
S3のバケットポリシーで GetObject を定義した際、``『Action does not apply to any resource(s) in statement』``というエラーが表示されて失敗する。
【エラー画面】
![](https://cloud5.jp/wp-content/uploads/2022/05/スクリーンショット-2022-05-28-16.30.58-640x66.png)

__【バケットポリシー 修正前】__
```yaml
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "PublicRead",
			"Effect": "Allow",
			"Principal": "*",
			"Action": [
				"s3:GetObject",
				"s3:GetObjectVersion"
			],
			"Resource": "arn:aws:s3:::【バケット名】"
		}
	]
}
```

### 解決方法
Resource部分のバケットの指定方法が間違っていました。
バケット配下のオブジェクトに対応するように部分修正をします
``"Resource": "arn:aws:s3:::{mybucket}/*"``


__【バケットポリシー 修正後】__
```yaml
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "PublicRead",
			"Effect": "Allow",
			"Principal": "*",
			"Action": [
				"s3:GetObject",
				"s3:GetObjectVersion"
			],
			"Resource": "arn:aws:s3:::【バケット名】/*"
		}
	]
}
```

### さいごに
根本的な問題は書き慣れていないことですが、こういったことを踏まえながら手を動かしていきたいと思います。
Make(formerly Integromat)についての初歩的な知識

　だめだよー。Makeなんて名前つけちゃ。以前は、Integromatという名前だったらしいです。makeにしちゃったら検索しづらいでしょーがよ。Integromatで検索するといいかもしれません。ということで、Makeのサイトはこちらです。

https://www.make.com/en

https://www.youtube.com/@itsmake

# ジャンル
　ワークフローの自動化

# プラットホーム
1. ウエブ

# 料金

1. Free
    - 1000Ops/月
    - 二要素認証
1. Core ($9/月)
    - 10,000Ops/月
    - 無制限のアクティブなシナリオ
    - スケジュールされたシナリオの実行間隔が最低1分
    - 300以上のMake APIエンドポイントへのアクセス
1. Pro ($16/月)
    - 10,000Ops/月
    - 実行ログ全文検索
    - カスタム変数
    - 優先シナリオの実行
    - シナリオの入力
1. Teams ($29/月)
    - 10,000Ops/月
    - チームの作成とチームロールの作成
    - シナリオテンプレートの作成
1. Enterprise (問い合わせ)
    - エンタープライズアプリケーションへのアクセス
    - 情報セキュリティコンプライアンス対応
    - SSO
1. Academic (無料)
    - プレミアムライセンスと授業用コンテンツに無料でアクセス可

　Opsはアプリの実行数。有料版は、料金を追加して実行数を増やすことが可能。

# 概要
　Makeの前身のIntegromatは、共同創業者のOndřej Gazda、Patrik Šimek、Michal Toman、Pavel Duras、Tomáš Schel、Roman Bršlicaによりチェコ共和国のプラハで2016年に立ち上げられました。Integromatは名前をMakeに変更し、2020年10月に、セロニス(Celonis)に買収されました。

　セロニスは、2011年にドイツのミュンヘンに設立されました。プロセスマイニング技術を使って、業務プロセスの分析、自動化を支援する会社です。日本法人もあります。

　あまりめぼしい情報は見つかりませんでした。

# 機能
　フローを作成するには、コードを書く必要はありません。まずは、テンプレートを使って見ましょう。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/4b2a8729-4ef7-9a1f-d4d7-557bb764aab8.png"/>
　検索でで2つのアプリ名を入れると、すぐにテンプレートを表示してくれますので、望みのものを選択すると作業の説明が表示されます。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/50bece05-b8a0-8362-8422-11f6af3e1757.png"/>
　シナリオは、横に伸びていく感じです。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/5146aac2-c1b0-fae2-eb9f-9b755dc07012.png"/>


　下図は、新たにシナリオを作成している画面ですが、参考になるチュートリアル動画が表示されたり、インターフェースは非常に親しみやすくできています。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/76e60dde-7c16-c54f-99a0-9b6990473d6e.png"/>

　履歴は、実行履歴だけでなく、以下のように操作の履歴も表示されます。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/50c6e7a6-0259-dfac-aa6e-b3cf18cbf798.png"/>

# 感想
　日本語化されていないので、少々とっつきにくいかもしれませんが、ヘルプ機能が非常に使いやすいです。UIも親しみやすく、楽しくフロー作成ができそうです。ただ、情報が少ないです。
　制限もきつくないみたいなので、無料枠でも実用的なフローが作成できそうです。
AWS API GatewayのIAM認証をSigV4署名(Python)で作成

## はじめに
API Gatewayを利用していましたが、あまりにインターネットに対して無防備だったのでIAM認証を実装することにしました。
検証では[Postman](https://www.postman.com/)を利用して確認していましたが、対象とするインターネット経由でのユーザに導入してもらえるわけでもないので、PythonでSigV4署名を作成してみたいと思います。

参考：[API GatewayでAPIにIAM認証をかけて、Node.jsでSigV4署名ヘッダを作成してリクエストしてみる](https://dev.classmethod.jp/articles/api-gateway-iam-authentication-sigv4/)

### IAM認証とは?
AWS Identity and Access Management (IAM) は、AWS リソースへのアクセスを管理するためのサービスです。管理する中には、認証（サインイン）の制御も含まれます。

その認証（サインイン）の一つに、*『IAMのアクセスキー(**アクセスキーID**+**シークレットアクセスキー**)とハッシュ関数を使い、AWSへHTTPリクエストに認証情報を追加するという技術（SigV4署名）』*を利用した制御の**IAM認証**というものがあります。

参考：[IAM 認証の使用](https://docs.aws.amazon.com/ja_jp/ja_jp/apigateway/latest/developerguide/http-api-access-control-iam.html)
参考：[署名バージョン 4 の署名プロセス](https://docs.aws.amazon.com/ja_jp/general/latest/gr/signature-version-4.html)

## 構成イメージ
・前提条件：APIGateway＋Lambdaを実装している
参照：[AWS Lambdaを利用したLINEbotハンズオン　-3・4の構築部分参照-](https://cloud5.jp/aws-lambda_line-api/)

・API GatewayにIAM認証を付与し、CLIからAPI Gatewayのエンドポイントを叩いて、後続のLambdaが動くという流れ

## ハンズオン
### 0.前提としてのAWS環境の確認
#### 0.1 APIGatewayにIAM認証が設定されている
「API Gateway」の「リソース」で「認可」が「AWS IAM」と設定している
![](https://cloud5.jp/wp-content/uploads/2022/05/スクリーンショット-2022-05-14-16.28.02-640x311.png)
#### 0.2 APIGatewayとLambdaが紐づいている
![](https://cloud5.jp/wp-content/uploads/2022/05/スクリーンショット-2022-05-14-16.28.25-640x234.png)
#### 0.3 Lambdaでの画面の状態
Lambdaの「トリガー」に「API Gateway」が設定されている
![](https://cloud5.jp/wp-content/uploads/2022/05/スクリーンショット-2022-05-14-16.28.51-640x330.png)

### 1.SigV4署名（Python）のコード
**SigV4署名コード詳細**
```python
import os
from botocore.awsrequest import AWSRequest
from botocore.auth import SigV4Auth
from botocore.endpoint import URLLib3Session
from botocore.credentials import Credentials
import requests

### 1.APIエンドポイントURL
url_ = "https://{restapi_id }.execute-api.{region}.amazonaws.com/{stage_name}/test-lambda-inamura"

### 2. Credential生成
credentials = Credentials(os.getenv['AWS_ACCESS_KEY_ID'], os.getenv['AWS_SECRET_ACCESS_KEY'])

### 3. AWSRequest生成
request = AWSRequest(method="GET", url=url_)

### 4. AWSリクエスト署名
SigV4Auth(credentials, 'execute-api', "ap-northeast-1").add_auth(request)

### 5. API発行
headers = {
    'Authorization': request.headers['Authorization'],
    'Host':'kzetkt1i30.execute-api.ap-northeast-1.amazonaws.com',
    'X-Amz-Date':request.context['timestamp']
}

### 6.リクエスト・レスポンスの内容
response = requests.get(url_,headers=headers)

print(response.text)
```
## 挙動の確認
#### ターミナル画面で実行した画面
```
tetutetu214@mbp hanson % python check_iam.py

"Hello from Lambda!"
```
#### IAM認証なしで、直接REST APIエンドポイントにアクセスしてみた画面
トークンがないことでアクセスを拒否されています
```
tetutetu214@mbp hanson % curl https://{restapi_id }.execute-api.{region}.amazonaws.com/{stage_name}/test-lambda-inamura

{"message":"Missing Authentication Token"}%
```

## まとめ
意外とさっくりできましたが、なおさら[Postman](https://www.postman.com/)の便利さに気がついたような気もします。
結果的には、Amazon API GatewayのAPIクライアントSDKを生成してからの呼び出しを利用するので、とりあえず確認程度の構築となりました。

## 参考資料
[IAM認証のAWS API GatewayにPythonからSigV4署名してアクセスするには](https://qiita.com/suzuki-navi/items/1ea284c97075f3a34b30)
[完全な署名バージョン 4 署名プロセスの例 (Python)](https://docs.aws.amazon.com/ja_jp/general/latest/gr/sigv4-signed-request-examples.html)