OmniAICreator/Qiita-1.07M huggingface dataset:
FleetでC++を実行してみる

# JetbrainsのFleetを使ってC++プログラムを実行する方法

JetbrainsのFleetは、VSCodeに対抗して開発されたIDEです。Jetbrainsの他のツールと異なり、プログラム実行にはrun.jsonを作成しなければならず、私のような初心者には設定がやや難解かなと感じています。
そこで今回は、Fleetを使って簡単なC++プログラムを実行する手順を紹介します。

## 手順
1. 下記のC++プログラムを作成します。ファイル名は`hello_world.cpp`とします。
2. Fleet画面右上の三角の`Run`ボタンをクリックすると、`Edit run configurations`という項目が出るので、それを選択。
3. 表示された`run.json`ファイル内に下記項目を入力。
4. hello_world.cppに戻り、再度`Run`ボタンをクリックして、`Build`->`Run`の順に実行。

## ファイル
### C++ プログラム

```cpp
// Name : hello_world.cpp

#include <iostream>
using namespace std;

int main()
{
    cout << "Hello world." << endl;
    return 0;
}
```

### run.json
hello_worldの部分を適宜実行するファイル名に変更してください。
`"program": "$PROJECT_DIR$/hello_world"`の部分に`Path doesn't exist`エラーが表示がされますが、Buildすると解消します。

```json
{
    "configurations": [
        {
            "type": "command",
            "name": "Build",
            "program": "g++",
            "args": [
                "$PROJECT_DIR$/hello_world.cpp",
                "-o",
                "$PROJECT_DIR$/hello_world"
            ]
        },
        {
            "type": "command",
            "name": "Run",
            "program": "$PROJECT_DIR$/hello_world"
        }
    ]
}
AWS認定セキュリティ専門知識の勉強メモ

#　はじめに
SCS-02の勉強をした際のメモを書いておきます。

# メモ

・Cognitoのサインアップ前のLambdaトリガー
サインアップ前に、Lambdaカスタム検証を挟むことが可能

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html

・CloudFormationからSecrtesManagerの参照
```
{{resolve:secretsmanager:secret-id:SecretString:json-key:version-stage:version-id}}
```

https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/cfn-example_reference-secret.html

・S3オブジェクトロックのモード
ガバナンスモード：ルートユーザ等による一部のユーザからの編集削除が可能
コンプライアンスモード：例外なしに編集削除NG

・AuditManager
AWSの使用状況を監査、リスク管理、規制、業界標準とのコンプライアンスの評価方法を簡素化できる。収集の自動化など
オンプレや他クラウドからの収集も可能

https://aws.amazon.com/jp/audit-manager/

・ConfigのS3バケットへの書き込み
IAM、S3バケットポリシー双方に権限付与が必要

https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/s3-bucket-policy.html

・SCPでのルートユーザの指定方法
```
”StringLike”:{
“aws:PricipalArn”[
“arn:aws:iam::*:root””
]
}
```

・ServiceCatalogの起動成約
ポートフォリオ内において、SerciveCatalogがIAMロールを引き受けるように指定できる

.EC2ImageBuilderを利用する際の権限
EC2に以下権限を割り当てる
* EC2InstanceProfileForImageBuilder
* EC2InstanceProfileForImageBuilderECRContainerBuilds
* AmazonSSMManagedInstanceCore

https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazonec2imagebuilder.html

・バケット所有者が自分の所有していないオブジェクトに対するアクセス許可を付与する
 バケットポリシーで別アカウントへのアップロードを許可する
 自分のアカウントへのアクセスを許可する
 オブジェクトACLでオブジェクトの許可をバケット所有者に付与する

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example3.html

・KMSCreateGrantにおけるグラントトークンの利用
グラントは結果整合性のため、5分程度の遅延が発生することがある
グラントのグラントトークンを利用し、CrateGrantオペレーションで返却されるトークンを保存する

https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/grant-manage.html#using-grant-token

・IMDSv2から認証情報を取得することを強制するポリシー

```
{
    "Version": "2012-10-17",
    "Statement": [
               {
            "Sid": "RequireAllEc2RolesToUseV2",
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "NumericLessThan": {
                    "ec2:RoleDelivery": "2.0"
                }
            }
        }
    ]
}
```

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ExamplePolicies_EC2.html#iam-example-instance-metadata-require-roles-to-use-IMDSv2-credentials

・IMDSv2の使用を必須とする方法
ec2:runinstances API アクションを使用する場合は、「--metadata-options HttpTokens」オプションを「required」に設定
AWS CLI から「HttpTokens required」オプションを指定して「ec2modify-instance-metadata-options」コマンドを使用して既存のインスタンスを更新する

・SCPでのプリンシパルは指定できないのでConditionで指定

・KMSキーポリシー
kms:CallerAccountでキーポリシーでアカウント指定が可能
かつ、kms:ViaServiceで呼び出し元サービスの指定が可能

・Configマネージドルールに準拠していない旨が認証情報レポートに表示される場合
[MaximumExecutionFrequency] パラメータを 4 時間超に変更する。

https://repost.aws/ja/knowledge-center/config-credential-report

・AWSConfigのKMSキーローテーション確認ルール
デフォルト９０日指定になっている

https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/access-keys-rotated.html
ent. の使い方についてかんたんにまとめてみた

# はじめに

APIサーバを作成するにあたって、「`ent.`がモダンで使いやすそうだな」と思い学習した内容を書いていきます。

[Quick Introduction](https://entgo.io/ja/docs/getting-started/)から、極力コードを省いた、`ent.`の使用フローについて、`Atlas`によるマイグレーションついてわからなかったことを書きました。

# 使い方の流れ

1. Goモジュールの作成
2. スキーマの作成・定義
3. アセットの生成
4. スキーマのマイグレーション

## Goモジュールの作成

```bash
go mod init example
```

## スキーマの作成・定義

以下のコマンドで、Userスキーマを自動生成できる。

複数生成する場合も、引数を追加することで可能。

```bash
go run -mod=mod entgo.io/ent/cmd/ent new User
```

`entdemo/ent/schema/` 配下に `user.go` ファイルが作成される。

内部の`User.Fields` および、`User.Edges` メソッドの戻り値を変更することで、スキーマの定義をする。

## アセットの生成

スキーマの追加・変更を行った際は、以下のコマンドでスキーマ用のアセットを生成する。

```bash
go generate ./ent
```

### 生成されるアセット

- グラフとのやり取りに使用される、`Client`オブジェクトと`Tx`オブジェクト
- 各スキーマのCRUDビルダー
- ビルダーとの対話に使用される定数と述語を含むパッケージ。
- SQL用の`migrate`パッケージ
- 変異型ミドルウェアを追加するための`hook`パッケージ

## スキーマのマイグレーション

上記で設定したスキーマを、データベースにマイグレーションする。

マイグレーションには、2つの種類がある。

1. オートマティックマイグレーション
2. バージョン管理マイグレーション

### オートマティックマイグレーション

以下のコードで、データベーススキーマを、生成されたスキーマオブジェクトと一致させることができる。ただし、どのような変更が適用されるかが事前にわからないため、本番環境での使用は推奨されない。

```go
if err := client.Schema.Create(ctx); err != nil {
    log.Fatalf("failed creating schema resources: %v", err)
}
```

### バージョン管理マイグレーション

いくつかの方法があるが、公式で説明されているAtlasを使用した方法は次の通り。

1. [Atlas](https://atlasgo.io/)のインストール
2. マイグレーションファイルの生成
3. マイグレーションの適用

Atlasのインストール

OSによって異なるため、公式サイトを参考にインストール。

https://atlasgo.io/getting-started#installation

マイグレーションファイルの生成

```bash
atlas migrate diff migration_name --dir "file://ent/migrate/migrations" --to "ent://ent/schema" --dev-url "docker://mysql/8/ent"
```

`atlas migrate diff` によって、マイグレーションディレクトリと任意の状態(ORM, SQLスキーマなど)との差分を計算し、新しいマイグレーションファイルを作成する。

- `--dir` URL形式でマイグレーションディレクトリを指定
- `--to` URL形式で希望の状態を選択
- `--dev-url` 差分を計算するために使用される[開発データベース](https://atlasgo.io/concepts/dev-database)へのURL
    
    Atlasが、ユーザーのスキーマやマイグレーションなどを処理し、検証するために使う。
    
    一回限りなため、通常はdockerを指定する。
    

マイグレーションの適用

```bash
atlas migrate apply --dir "file://ent/migrate/migrations" --url "mysql://root:pass@localhost:3306/example"
```

マイグレーションファイルの内容を`--url`で指定したデータベースに適用できる。

また、マイグレーションファイルの生成をプログラムでする場合は、このリンクを参考にしてほしい。

https://entgo.io/ja/docs/versioned/programmatically/

# 感想

まだ`ent.`の触り部分ですが、とても使いやすそうで、型安全なためさらに勉強して使っていきたいと思いました。
また、Atlasを利用したCI/CDについても勉強していきたいです。


# 関連ワード

- エンティティ
    データベースにおいて、管理すべき情報のこと。
- スキーマ
    データベースの構造を定義するための設計図
- フィールド
    テーブル内のカラム（列）に相当する、データの型の値を格納する場所
- エッジ
    GraphQLにおける、ノード（エンティティ）間の関係性を表すもの
【2024年　目標について】

2024年の目標を書いていく
現在のスキル
・ExcelVBA
・AccessVBA
・SQL
・PHP（Laravel）
・GitHUB
・DBAシルバーの合格（5月までに）
・機械学習（ニューラルネットワーク）の勉強
＊地震のデータ分析
・Python（django）で1つwebアプリケーション作る
理祖は、デプロイまでする。
・dockerを使う

1年後に結果報告していく。

終わればここに報告していく
AWS SAA(Solution Architect associate)に合格したので学習方法についてまとめてみた。

# はじめに
AWS学習者にとって最初の目標となるSAA。
「試験を受けようと思っているけどどう勉強したらいいかわからない」「色々覚えることがあってどれから手を付ければいいかわからない」。
 これから受検する人はそんな不安を持つことでしょう。
 そんな人達のためにSAA合格後1.5か月かけてSAPを取った筆者の学習方法、試験を受ける際の注意店を描いていこうと思います。

## SAAとは？
SAA試験とはAWS（amazon web service)の設計者向けの中級レベルの資格です。
試験の内容としては。ベストプラクティス（どうしたら安全性とコスパと耐久性が最大になるか）と言うことが多く問われます。
受験料は16,500円となっています。受験料が高いと感じる人もいると思いますが、先にクラウドプラクティショナーなどのAWSにおける他資格を受験した方は半額になるバウチャー（クーポン）がもらえるのでそれを使うことをお勧めします。

試験時間は130分と若干長くなっていますが、しっかり対策していれば３０分ほどの余裕をもって問題を解き終わることが出来ます。

合格するのに必要な点数は試験ガイドを確認すると「試験の結果は、100~1,000の換算スコア」「合格スコアは720点」とあります。 ここで大切なのは1000点の中の100点分はAWSが今後のために実験的に出している問題なので始めから100点分は与えられているという点です。つまり100点はすでに与えられているので合格に必要な点数は720-100=620点です。 さらに全問65問中、スコアに影響しない問題は15問。 スコアに影響する問題が50問となっています。

### SAAの学習方法
まず何よりも大切な事は「とにかく試験を申し込む」と言うことです
試験日を１，２か月後に設定してしまえば否が応でも勉強するはずです。
また、AWS試験は試験の日を2回まで変更できるので期日が近くて受かりそうにない場合でも最悪延期できます（24時間前まで）
インターネットで勉強方法を調べると「参考書を買う」だとか「AWS公式のblackbeltを使用する」だとかいろいろな話が出ていて自分も受験するときにどの話を信用すればいいのか悩んでしまいました。おそらく同じような状況の人は多いことでしょう。そんな中自分はSAAを取得する理由別にお勧め学習方法を書いていこうと思います。
①実際に業務や私生活で今後AWSを使用していきたいケース
　この場合のゴールはSAAを取ることではなく「実際に使えるスキルにつながるかどうか」という点なのでしっかりとハンズオン（手を動かして実際にAWSを構築していくこと）を行うことをお勧めします。
 その際の学習方法としておすすめなのが
 『Udemyと言う学習サイトのハンズオン動画を購入すること』です
 Udemyとは様々なオンライン教材を販売しているサイトです。
 筆者は業務でAWSを使う必要があったので以下のURLのハンズオン教材を使いました。
 https://www.udemy.com/course/aws-associate/?couponCode=JPLETSLEARNNOW

ハンズオンで実際のAWSサービスの使い方を覚えたら次に
問題集を解いていくのがいいと思います。
教材として筆者が使用したのは主に
・ping-T
・Udemy問題集
以上の二点です。Ping－Tは利用料が無料で問題数も多いのですが、
若干日本語がおかしかったり、同じ問題が出たりしていました。
問題の捕捉に関しても少し物足りない感じがありました。
Udemyの問題集について筆者は4つ分のテストが入った問題集をやりました。
この問題集に関しては実際テストに出る問題よりも難しくなっているので
この問題集で7割とれるようになれば問題なく合格できると思います。
個人的に一番おすすめな問題集は
『クラウドライセンスのSAA問題集』です。
こちらは90日約4000円で1000問以上の問題を解くことが出来ます。
補足も難易度も良いものとなっているのでお勧めです。（筆者はこのサイトでSAP試験を合格しました。

②とにかく最短でSAAに合格したい人
理解とかよりも早くSAAに合格したい！と言う人は①の中で説明した
Udemyの問題集かクラウドライセンスの問題を理解したうえで全部70点以上取れるようにしていくのが
最短な方法だと考えます。上記の二つとも実際の試験に出る問題と同じようなものになっているのでこれらを完璧にしておけば合格することが出来ると思います。

#### さいごに
SAAを合格することはAWS技術者としての大きな自信になると思います（筆者も実際そうでした。）
皆さんが合格できることを心から願っています！
それではまた別の記事で会いましょう！ありがとうございました！
Salesforce認定アドミニストレーター過去問+時々解説　Q21 ~ Q30

## Q21. AppEchangeの利用目的に該当するものを2つ選択せよ. 

A salesforce.comの機能についての質問があるとき
B 標準のSalesforce機能を拡張したいとき
C カスタムアプリケーションやツールを探しているとき
D Salesforceの標準機能の拡張アイデアを申請するとき

解答: B, C

解説: AppExchangeには様々なカスタムアプリケーションが販売されており, それらをインストールすることによって機能の拡張をすることが可能になる.

## Q22. ダッシュボードの更新スケジュール画面でできるものを選択せよ. 

A 更新スケジュールを解除できる
B コンポーネントごとに更新スケジュールを設定できる
C 実行時刻のタイムゾーンを設定できる
D 四半期ごとにメールで通知できる

解答: A

解説: 画像の「登録解除」で更新スケジュールを解除できる.

![スクリーンショット 2024-03-20 12.41.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674514/b5731d3a-f924-dab9-d600-9ca6410e0e21.png)

## Q23. ページレイアウトの割り当て設定がどこから実行可能ですか？次から2つ選べ.

A ユーザレコード
B レコード
C レコードタイプ
D プロファイル

解答: C, D

解説: オブジェクトマネージャからオブジェクトを選び, レコードタイプを選択すると右上に「ページレイアウトの割り当て」ボタンがある. また, プロファイルの「ページレイアウト」のところに「割り当ての参照」リンクがあり, そこからもページの割り当てが可能.

## Q24. 承認プロセスにおいて承認者がレコードの承認/却下をするために必要なことは何？

A 承認プロセスが実装されたオブジェクトに対する「参照」以上の権限があること
B ロール階層内の申請者より上位のロールに属していること
C 代理承認者に指定されていること
D 承認プロセスの設定内容を参照する権限があること

解答: A

解説: 申請者は承認者を手動で選択できるから, 承認者がロール階層内の申請者より上位のロールに属している必要はない. また, 代理承認者の指定項目も必須ではない. 承認プロセスが実装されたオブジェクトに対して参照権限がない場合は, 承認申請を見ようとしてもそのオブジェクトを見ることができないので, 設問の解答としてはAを選ぶ.

## Q25. Chatter Freeユーザーを増やすために管理者ができることを2つ選択せよ.

A 新規ユーザ登録時にChatter Freeライセンスを割り当てる
B Chatterの招待機能を有効化してメールアドレスのドメインを指定する
C 外部のパートナーや顧客にChatter Freeライセンスを割り当てる
D Salesforceライセンスを持つユーザのライセンスをChatter Freeに変更する

解答: A, B

解説: 外部のパートナーや顧客にはコミュニティライセンスが割り当てられており, 既存のSalesforceユーザーにはSales Cloudライセンスが割り当てられているので, どちらもChatterが使える. Chatter Freeユーザーを増やすためには既存ユーザーではなく新規ユーザーを対象に考える必要がある. また, Chatterの招待機能を利用してChatter Freeユーザーを増やすことも可能.

## Q26. 取引先レコードをCSVファイルから一括で取り込む際に重複を防ぐために利用するツールはどれ？

A インポートウィザード
B 入力規則
C 取引先のマージ機能
D データローダのインサートコマンド

解答: A

解説: データインポートウィザードを起動してから, 一致条件を設定するところがある. そこを設定すると重複チェック後に一括登録が可能になる.

## Q27. ユーザーを完全に削除することは可能か？

A 可能
B 不可能

解答: B

解説: ユーザーを完全に削除することはできないが, ログインさせないように無効化することは可能. 

## Q28. ダッシュボードの共有方法に関して正しい説明を2つ選択せよ.

A 実行ユーザを指定して共有する
B データカテゴリを作成して共有する
C 公開グループへフォルダを共有する
D 指定ロールへフォルダを共有する

解答: C, D

解説: ダッシュボードを共有するには, ダッシュボードの格納フォルダを共有する必要がある. 共有先選択リストから[ユーザー][ロール][公開グループ]を選択でき, そこで対応(指定)したところへフォルダを共有することで, ダッシュボードを共有することができる.

## Q29. レコードの共有をしたいのですが共有ボタンが表示されない. このオブジェクトに対する組織の共有設定はどうなっている？

A 公開/参照・更新可能
B 公開/参照のみ
C 非公開

解答: A

解説: 共有ボタンはページレイアウトから配置することができるが, 「共有設定」のデフォルトの内部アクセス権で, 「公開/参照・更新可能」以外が設定されている場合に表示が可能. 
設問では, 「公開/参照・更新可能」の設定になっていることで表示がされなかった.

## Q30. 組織のデフォルトのロケール設定を変更すると, 何が影響を受けますか？

A タイムゾーン
B 通貨
C 言語
D 日付項目

解答: D

解説: タイムゾーンのデフォルト値で, 例えば日本なら「GMT+09:00」の日時が採用されるのだが, タイムゾーンや国のロケール情報を変更するとそれに時差が生じてしまい日付項目が別日付になる可能性がある. 

## Q31~Q40
https://qiita.com/taiga-shiokawa/items/e32379e20ed94e44e3f0
Aiven for Dragonfly - 超高速キャッシュを解き放つ

<font color="Grey">*[Aiven for Dragonfly – Unleash Super-Fast Caching](https://aiven.io/blog/aiven-for-dragonfly-unleash-super-fast-caching)の翻訳です。*</font>

2024年3月20日

# Aiven for Dragonfly - 超高速キャッシュを解き放つ

Aiven for Dragonflyは、エンタープライズニーズに合わせて700%のパフォーマンス向上を実現します。

最新のエンタープライズ・アプリケーションにとって、スケーラビリティとパフォーマンスは大きな課題です。[Aiven for Dragonfly](https://aiven.io/dragonfly)は、ベンチマーク調査[1]によると、同様のハードウェア上でオープンソースのRedis®と比較して、スループット(1秒あたりのリクエスト数)を約700%向上させ、メモリ使用量を約25%削減しました。企業にとって、これは電光石火のページロードとシームレスなインタラクションでユーザーを魅了し続けることによるコンバージョンの向上につながります。


Aiven for Dragonflyは、膨大なインメモリデータワークロードを簡単かつ高速に処理し、オープンソースのRedisと完全な互換性があります。最新のハードウェアを利用し、最大限の計算能力を発揮すると同時に、インフラコストを大幅に削減します。キャッシング、ゲームリーダーボード、メッセージング、AIアプリケーション、その他のリアルタイムアプリケーションに最適です。


Aiven for Dragonflyは以下を実現します：


* 優れたスケーラビリティ - 大容量のデータを処理し、毎秒数十万のリクエストを処理するため、ソーシャルメディアやオンラインゲームなどのキャッシュやリアルタイムアプリケーションに最適です。
* 効率性 - 他のRedis互換ソリューションの数分の一のリソースしか使用しないため、パフォーマンスを犠牲にすることなく、高いスループットとコスト削減を求める組織にとって理想的な選択肢です。
* 高度な機能 - JSONドキュメントやベクトル検索をサポートすることで、基本的なキャッシングにとどまらず、ウェブやソーシャル、レコメンデーションエンジン、自然言語処理など、データ集約型のアプリケーションの新たな可能性を引き出します。
* シームレスな管理 - Aiven for Dragonflyは、バックアップやセキュリティからアップグレード、クラウド移行に至るまで、インフラストラクチャの複雑さを解消し、99.99%のアップタイムを実現します。
* 互換性 - Aiven for RedisからAiven for Dragonflyへの移行は、コードを変更することなく、1つのプラットフォーム上で簡単に行えます。


コンラッド・エレクトロニックは、世界中の2,100万人の顧客に技術供給用の高度なソーシング・プラットフォームを提供しています。SRE責任者のJanek Wonner氏は次のように述べています。Aiven for Dragonflyは、スムーズな移行、驚異的なパフォーマンス、シームレスなスケーリングで、ゲームチェンジャーです。私たちとともに成長するデータインフラを手に入れたようなものです。


トンボの共同設立者兼CEOであるオデッド・ポンチ氏は次のように述べています。



> ![](/build/_assets/shape-quote-WGSAHX4E.svg)
> Aivenをドラゴンフライのコミュニティに迎えることができ、大変嬉しく思っています。Aivenは、高性能でスケーラブルなデータサービスを顧客に提供することにコミットしており、Redisでは対応できなかった大規模で複雑なワークロードを満たすサービスを提供するためにDragonflyを利用できることを非常に喜ばしく思っています。" > AivenをDragonflyコミュニティに迎えることを嬉しく思います。
>
>
>


Aiven for Dragonflyの詳細については、[こちら](https://aiven.io/dragonfly)をご覧ください。Aiven ConsoleまたはAiven CLIを使用してサービスを作成することで、Aiven for Dragonflyを[始める](https://aiven.io/docs/products/dragonfly/get-started)ことができます。すでにRedisをお持ちで、Aiven for Dragonflyに移行したい場合は、[ガイド](https://aiven.io/docs/products/dragonfly/howto/migrate-aiven-redis-df-console)をご覧ください。価格については、[価格ページ](https://aiven.io/pricing)をご覧ください。Aivenを初めてご利用になる場合は、[無料トライアル版](https://console.aiven.io/signup) もサインアップ時に30日間、300ドルのクレジットでご利用いただけます。


[1] ベンチマークはAWS環境で実施。インスタンスタイプは8CPU、64GB RAM、16CPU、256GB RAM、32CPU、512GB RAMと異なる。
メモ：バルミューダフォンのデフォアプリ無効化

24/4/17
blmdがblmbになってた(´・ω・｀)ｼｮﾎﾞｰﾝ申し訳ない

アプリ(ただのショートカットっぽいのでおそらく不要)
パッケージ名：
com.balmuda.phone.blmd.shortcut
com.balmuda.phone.blmdrecipe.shortcut
com.balmuda.phone.blmdtech.shortcut
標準ではできないので、パソコンとつなぎadbコマンドを有効にして(要ググる)無効化する。

追記
adb shell pm disable-user --user 0 <パッケージ名>
adb shell pm disable-user --user 0 com.balmuda.phone.blmd.shortcut
adb shell pm disable-user --user 0 com.balmuda.phone.blmdrecipe.shortcut
adb shell pm disable-user --user 0 com.balmuda.phone.blmdtech.shortcut
機械学習における学習率とミニバッチサイズ

# 概要

Google が提供する A I機械学習講座「Machine Learning in the Enterprise」を学習しました。
講座の中で、学習率とバッチサイズについて実践的な内容が説明されていたので、本記事にてご紹介します。


講座: [Machine Learning in the Enterprise](https://partner.cloudskillsboost.google/paths/84/course_templates/9?locale=en)

![Screenshot 2024-03-20 at 16.01.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/c673d59b-241a-beeb-f31a-19c063d51fbc.png)


# 対象者

- 機械学習に関心があり、実践的な知識やスキルを習得したい
- 学習率やバッチサイズをどのように設定すればよいか知りたい


# 機械学習における学習率とミニバッチサイズ

機械学習において、モデルの性能に大きく影響するパラメータとして、学習率とバッチサイズが挙げられます。学習率とミニバッチサイズについて、概要、重要性、適正値の考え方について説明します。


## 学習率とは
機械学習の最適化において、重みパラメータを一度にどの程度変化させるかを表すハイパーパラメータであり、言い換えると、重み空間におけるステップの大きさを制御するパラメータとなります。

たとえば、学習率が"0.001"の場合、重み空間の"1000分の1"に等しいステップサイズであることを意味します。


## 学習率の重要性
学習率の値が高いほど、一度に変更する重みパラメータの大きさが大きくなり学習のスピードは上がります。逆に低い場合は学習のスピードが下がります。


## 学習率の適正値の考え方
現段階では、まだ適正値を選ぶための厳密なルールはないものの、
"特徴数の平方根の逆数" と "0.2" の小さい方を選択する考え方があります。

特徴数が "100個"であれば、1 / 10 = 0.1 (< 0.2) のため、0.1となります。

なお、TensorFlowのLinear regressor estimator では、学習率のデフォルト値は "0.2" となっています。


## ミニバッチサイズとは
データセットを幾つかのサブセットに分けて学習に使うデータの数を指します。
言い換えると、勾配を計算する際に使用するサンプル数を制御するパラメータとなります。

具体的には、全データを使って関数の最小値を探す「勾配降下法」において、学習データをいくつかのグループ（バッチ）に分けて処理する際に、それぞれのグループのサイズを指します。

## ミニバッチサイズの重要性
ミニバッチサイズが小さい場合は、損失曲線において跳ね返りが見られるなど、学習が不安定になることがあります。一方で、バッチサイズが大きい場合は、モデルの学習能力が高まりますが、同時にコストやトレーニング時間も増える傾向があります。

## ミニバッチサイズの適正値の考え方
現段階では、まだ適正値を選ぶための厳密なルールはないものの、
経験則では、"40から100"くらいで、より小さなバッチサイズから始めた方が良いとのこと。
最近の研究によれば、ミニバッチサイズを小さくすることで、より最新の勾配計算が可能となり、より安定した信頼性の高い学習ができるとのことで、具体的には、最良のパフォーマンスは一貫してミニバッチサイズが "m=2" から "m=32" の範囲で得られたとのことです。

# まとめ
学習率とミニバッチサイズについて、講座"[Machine Learning in the Enterprise](https://partner.cloudskillsboost.google/paths/84/course_templates/9?locale=en)"から得られた情報をまとめました。
本講座は、わかりやすいだけでなく、実践的な知識も得られるため、非常に有用でした。
また、生成AIにつながる話題も含まれており、機械学習や生成AIに興味がある方にとって今後何を学べばよいかを考える際の参考になると思いますので、ご興味のある方はぜひ学習してみていただければと思います。

以上
動的に追加された要素も静的要素もまとめてイベントの面倒をみるJS

動的に追加された要素もイベントを埋め込むニーズがあったのでそのメモ。

解釈としては「個別に要素にaddEventListenerしなくてもどの要素をクリックされたかがわかる」ということが実現できればいい。

最初から存在するdocumentオブジェクトにイベントリスナーを張っておけば、documentの上に乗っかってくる要素のイベントも拾ってくれますよ、というのが答え。

以下サンプルソース。

```html
<html>
<button id="id1">id:1</button>
<button id="id2">id:2</button>
<a href="#">anchor1</a>
<script>
document.addEventListener('click', (e) => {
  console.log(e.target);
})
</script>
</html>
```

実行結果

要素を左から順にクリックして最後に白い部分をクリックしたのが以下の実行結果。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/d73ecb43-8261-db73-07d9-b914bf85b996.png)

こんな感じで、手前の要素がクリックされてることがわかる。あとは、idやクラス別に分岐を入れてもよし、独自の属性で分岐を作ってもよし。

### ここから余談

別解としては、ドキュメントの要素を全部舐めて属性に応じたイベントリスナーを入れるという方法もあるけど、画面をロードするたびにそれが流れるのがヤダなぁと思って、ドキュメントだけにイベントリスナーを埋め込む方が軽いんじゃないかと思った。

昔の話。スマホのclickイベントは300ms遅くなるので「すべての要素を舐めてclickイベントがあったらタッチイベントに変えて反応を早くする」というJSライブラリがあったんだけど、むしろ最初のロードが遅くなってしまうという副作用があった。できるだけ初期化で流れる処理は軽くしておきたい。

ちなみにスマホのクリックイベントに遅延があるのはダブルタップのイベントがあるから一発目のタップではすぐに動かないようになってる。ダブルタップはスマホのズーム機能なのでダブルタップによるズーム機能を殺せばこの遅延はなくなる。

以下のメタタグでビューポートの幅がデバイスの幅と同じになるので、ダブルタップでは拡大されない。

```html
<meta name="viewport" content="width=device-width">
```
MUIv5 x-date-pickersの曜日見出しに色をつける

# はじめに
[こちら](https://itc-engineering-blog.netlify.app/blogs/x-date-pickers#h2-titile-11)のサイトを参考にしてDatePickerをカスタマイズしていましたが、私の環境では曜日の見出しの「土」「日」の色が変わりませんでした。
そこでクラス名が違うと予想し、自力で適用したい要素のクラス名を探した結果、無事に適用することができました。
## 検証環境
* @mui/x-date-pickers: `5.0.20`
* @mui/x-date-pickers-pro: `5.0.20`
* @mui/material: `5.11.4`

# 変更後のコード
参考にさせていただいたサイトのスタイルの適用部分を以下のように変更することで、曜日見出しの「土」「日」にそれぞれ色をつけることができました！

```tsx
const styles = {
	mobiledialogprops: {
		'.MuiDatePickerToolbar-title': {
			fontSize: '1.5rem',
		},
		'.MuiDayPicker-header span:nth-of-type(1)': {
			color: 'rgba(255, 0, 0, 0.6)',
		},
		'.MuiDayPicker-header span:nth-of-type(7)': {
			color: 'rgba(0, 0, 255, 0.6)',
		},
	},
	paperprops: {
		'.MuiDayPicker-header span:nth-of-type(1)': {
			color: 'rgba(255, 0, 0, 0.6)',
		},
		'.MuiDayPicker-header span:nth-of-type(7)': {
			color: 'rgba(0, 0, 255, 0.6)',
		},
	},
}
```
[論文読み] Training data-efficient image transformers & distillation through attention

# 概要
Vision Transformeer(ViT)の問題点としてハイパーパラメータの影響を受けやすく学習が難しいことやCNNを超える精度を発揮するためには3億枚を超える大規模なデータセットでの事前学習が必要であることなどがあげられる．

この問題点に対して，Data-efficient image Transformers(DeiT)は知識蒸留を導入することで小さなデータセットでの事前学習でも高精度化を達成している．また，DeiTはData Augmentationや正則化，ハイパーパラメータなどの設定方法に関しても言及している．

# アプローチ
DeiTは小さなデータセットでの事前学習でViTを高精度化するために学習済みのCNNを教師(Teacher)，未学習のViTを生徒(Student)としてStudentの予測確率をTeacherの予測確率に近づけるように学習する．

![deit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744226/9f48a811-bb5b-c94c-9fb2-510c12888ca7.png)

## モデル構造
DeiTではViTに対してDistillation Tokenを追加している．TeacherとStudentには同じ画像を入力し，Class TokenとDistillation Tokenに抽出した特徴を集約する．

Distillation Tokenに集約された特徴量をMLP Headに入力し予測確率を出力する．
Distillation Tokenに集約された特徴量から得られた予測確率とCNNの予測確率の損失を計算する．これにより，Teacherの知識をStudentに伝達している．
Class Tokenに集約された特徴量は，MLP Headに入力し予測確率を出力する．出力されたStudentの予測確率と教師ラベルとの損失を計算する．

# 実験
いくつかの実験を抜粋して結果を記載する．

## ImageNet-1kに対する画像分類精度の比較
TeacherにDeiTを用いた時よりもCNN(RegNet)を用いた時の方が高精度．

![result10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744226/e3f87d44-14ad-b249-5d76-48ec4d14edb1.png)

## ImageNet-1kで事前学習した各モデルを転移学習した際の画像分類精度の比較
DeiTはImageNet-1kのみでCNNと同等の画像分類精度を発揮している．

![result11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744226/e9970cfa-d26b-f529-1f4e-fca08f5e3689.png)

## Ablation
Ablation StudyとしてData Augmentationや正則化，ハイパーパラメータなどの違いによって小規模なデータセットでの高精度を図っている．

### ハイパーパラメータ
学習率のスケーリングやWarmUp Epochs，Weight decayはViTから継続して採用している．

### Data Augmentation
Data Augmentationとしては，データセットに応じてData Augmentationを探索するRand Augment，2枚の画像を混合するMixup，画像の一部を切り取りその部分を別の画像を置き換えるCutMix，画像の一部を削除するRandom Erasing，同じData Augmentationを繰り返すRepeated Augmentを採用している．

### 正則化
正則化としては，正解クラス以外にも微小な値を与えるLabel Smoothing，与えた確率に応じて残差ブロックをスキップするStochastic Depthを採用している．

各設定は下記のようになっている．

![result12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744226/1c576a4c-5395-332e-3ff7-7a99e4e805e1.png)


# まとめ
小規模なデータセットでの学習でViTを高精度化する手法であるDeiTを紹介した．
モデルの持つ知識を小さなモデルに伝達し小規模化する知識蒸留を用いることで小さなデータセットでの学習でViTを高精度化している．
また，Data Augmentationや正則化，ハイパーパラメータなどの設定方法にも言及しており，ViTベースの研究における基本となっており，以降の研究においてもDeiTで提示されたパラメータが踏襲されている．

# 参考文献
論文：Training data-efficient image transformers & distillation through attention
LINK：https://arxiv.org/abs/2012.12877

# 備考
・公式実装
https://github.com/facebookresearch/deit
[WSL vs Mac] WSL 上でのみ、docker compose build の所要時間が膨大になる場合の対策

# 概要

WSL だと、 Mac の **10 ~ 100 倍**の時間がかかっていることが発覚した。

# 環境

当然ですが、**同じ通信回線**を利用して計測しています。 
マシンごとの差分は以下の通り。


-|Windows|Mac
--|--|--
OS Version|Windows11|Ventura13.6
チップ|AMD Ryzen 7 4700U with Radeon Graphics 2.00GHz|Apple M2
コア数|8|8
memory|24GB|24GB




# 所要時間比較

**全く同じ Dockerfile 、 docker-compose.yml ファイル**を使って build を行った。

## 1. WSL で実行時

```bash
$ docker compose build

...

 => [2/6] RUN export DEBIAN_FRONTEND=noninteractive     && apt -y update && apt   291.3s
 => [3/6] RUN apt-get install -y --no-install-recommends     curl     gcc     g  3720.6s
 => [4/6] WORKDIR /workspace                                                        0.0s 
 => [5/6] COPY ./requirements.txt requirements.txt                                  0.0s
...
```

- apt update に 291 秒
- apt-get install に 3720 秒

かかっている。

ちなみに、WSL での build は、最終的に pip install 実行中にタイムアウトした。


## 2. Mac で実行時

```bash
% docker compose build
[+] Building 60.4s (10/10) FINISHED

...

 => [2/6] RUN export DEBIAN_FRONTEND=noninteractive     && apt -y update && apt -y upgrade                                     11.3s
 => [3/6] RUN apt-get install -y --no-install-recommends     curl     gcc     g++     git     net-tools     vim     libopencv  37.3s 
 => [4/6] WORKDIR /workspace                                                                                                    0.0s 
 => [5/6] COPY ./requirements.txt requirements.txt
...
```

Mac の場合、

- apt update に 11 秒
- apt-get install に 37 秒

で済んだ。当然、**全く同じパッケージ**をインストールさせている。その前提の下で、これだけの時間差が生じている。

端的に言って、WSL は通信が遅すぎてマズイ。


# 対策

~~どうやら対策は存在するらしいが、windows の設定を変更して元に戻せないリスクを考えると実行に踏み切れない。~~

手を出してみた。(2024/08/24)

https://qiita.com/bioflowy/items/02c9e945439a2d032cd2

~~Linuxと違って全く経験がないので、どうしても必要になるまでは手を出したくない。~~

この記事の方法で、**docker イメージの build 速度が圧倒的に改善した**ので、是非試してほしい。

この記事単独だと、一見して実行コマンドが分かりにくいので、[記事の末尾にあるコメント欄](https://qiita.com/bioflowy/items/02c9e945439a2d032cd2#comment-a604786c052de8354e9b)に、実行したコマンドを記載させていただいています（o_ _)ｏ））
AWS WAF は使い込みすぎてはいけない

# 背景

2024/03現在の話。

2024に入って、botから急激なHTTPアクセスがあり、サービスが３分間程度死んでしまった。
ネットにあまり情報がなかったので残す。

サービスを設計する上での注意点をシェアすることが目的です。

細かいことを調べるのちょっとめんどくさくなったのでざっくり概算で記載します。

# 想定読者

AWS使っている
WAFを使っている
そこそこのリクエストがあるサービス

# 起こった事象

DDosAttackによる急激なアクセスがあり、サービスが３分間程度リクエストが5xx系になって、リクエストが捌けなくなった。
LBのログにはerror理由がWAFConnectionTimeoutとなっていた。
LBのログでロストしているものもある模様（WAFの処理ログとLBのアクセスログが一致しない）

# 対象のサービス特徴

どのようなサービスで事象が発生したかを共有したいので、サービスの主要なメトリクスを例示します。

当該の時刻の平均的なTotalReqCountは10M req/minくらいです。
事象が発生した時は、40M req/min くらいまでスパイクしました（10min程度）。 

当該サービスのWAFにはAWSのマネージドルールも利用しており、
事象が発生した際の30M req ほどはマネージドルールによってBlockされたログがありました。

# ベンダーからの回答

もちろん、AWSに事象を問い合わせ、何が起こったのか説明を求めました。

どうやら、WAFはELBのキャパシティに依存するものらしく、
１ノードで捌ける量には限界がある模様。

対策としては、事前にLBの暖気申請を行う必要があるらしい。

# 対策案

DDosを行ってくるエンドポイントには特徴がある気がします。（ちょっと分析した）
なので、DDosのLB対策案としては
- 当該のエンドポイントだけ分けてしまって、他のエンドポイントやサービスに影響が出にくいようにする
- 当該のエンドポイントだけ、 CDNでキャッシュして返せないか検討する

がアリかもなと思ってます。


雑な質疑応答にも真摯に対応してくださったAWSに感謝。
ABC問題と解説の検索サイト

# はじめに

AtcoderProblemsを眺めて 
　**「あの問題はどこだったかな」** 
となったことはありませんか？

今までは問題のタイトルから探し物の断片を紐づけてしらみつぶしに探していました．
不便が過ぎるのでさすがに解法の類題をまとめたサイトくらいあるだろうと思い調べたところ，投票でタグをつけて問題を分類するサイトや特定解法の問題を集めたQiita記事はありましたが，キーワード検索して参照するツールは調べた限りなさそうでした．

ないものは自分で作りましょう．
タイトル，問題文，公式解説の語句を検索するWebアプリです．

アプリのベースはtamocoさんのアプリを使わせていただきました．
引用元：[index.htmlだけでCSVを検索するシステムを改善する](https://qiita.com/tamoco/items/7a0c1c63e262709f0cdc)

>## コードと公開先
>
>- ソースコード
>  - https://gitlab.com/tamoco-mocomoco/csv-search-2 
>- 公開先
>  - https://tamoco-mocomoco.gitlab.io/csv-search-2

# Webアプリ

https://andoryoto.github.io/WebApplication/searchapp/index.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3716392/62d7376f-3fba-331a-054a-020b6d491921.png)


#### ソースコード

https://github.com/AndoRyoto/WebApplication/tree/main/searchapp

# 機能
#### 主機能
・文字を入力しその文字がタイトル，問題，解説のいずれかに存在すれば，
　該当する問題リンクをカード形式で表示する

#### その他機能
・コンテスト番号で絞り込み
・A~G問で絞り込み
・左上ボタンもしくは直接数字を入力してページ遷移
・Reverseボタンでカードを逆順表示

### 検索ワード例
セグ，二分探索，dfs，DFS，ダイクストラ，キュー，dp，Mex，Tree，
グリッド，文字列，クエリ，確率，文字列 S，高橋，青木，

# 使い道
・解法から問題への逆検索が容易
・類題をまとめて表示できる，苦手分野などの練習に便利
・うろ覚えな問題を探しやすい（時期をざっくり絞り，登場人物，題材，解法などから調べられる）
・コンテスト中，類題を探して自分のコードを参照できる

# 注意
・ABC200~344までしか対応していない
・**完全一致させる必要がある．** スペースや全角半角，大文字小文字などのブレには対応していない（例えば，bitDP, bit DPで検索結果が変わる）
・andやor検索には対応していない

# 制作過程



始めはキーワードを指定してスクレイピングしていました．

https://qiita.com/do_an/private/8228b44e44c829ac9b1d

アクセスに間隔を設ける必要があるため時間がかかるのがネック，，
予め問題情報をcsvファイルにまとめておいて，ローカルにアクセスすればいいのでは？
とりあえず，スクレイピングして得られたデータをcsvに放り込むコードを作成．

https://github.com/AndoRyoto/WebApplication/blob/main/searchapp/makecsv.py


生成したcsvファイル![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3716392/702433af-6165-d93b-ca13-22172027e3f0.png)

git上でcsvが文字化けしていたので修正

https://qiita.com/umuy/items/1e0de791137e01ef97b3

csvファイルを検索するツールってないのか？と思い調べたらこちらの記事を発見
Web制作の知識は皆無なのですごく助かりました．tamocoさんありがとうございます．

https://qiita.com/tamoco/items/7a0c1c63e262709f0cdc

こちらをベースにちょこちょこ改変して完成！

# まとめ
とりあえずある程度のものはできたと思います．
時間があればもっとよくしていきたいけど，結構満足しちゃったので
誰か自分の代わりにもっといいの作ってください

追加したい機能
・スペース，大文字小文字を許容する
・ARCまで収集先を広げる．
・コンテスト毎に自動更新
・[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/)みたいにユーザ参照ができるようにする
・加えて自分が解いた問題に色を付けるもしくは検索結果から弾く
日本語プログラミング言語MindをAndroidに移植した時の記録(ステップ4/9)

# はじめに

　この記事はだいぶ前（2012年）にココログの「[キリーの日本語プログラミング](http://uemon3511.cocolog-nifty.com/nihongoprogram/)」に掲載したコラムですが、再編集してこちらにも投稿します。今となっては古い話ではありますが、OSによってプログラム言語（AndroidではJava）が決め打ちされている環境で規定と異なるもの（Mind）を走らせたことの記録としてお読みください。

# イベントリスナー

　レイアウトの場合と似た話だが、Java側のオブジェクトをMind側に伝えても意味が無いので簡単な仕組みで両者間で連絡が取れるようにする。

![20130603eventlistnersample_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118036/7de8b7d5-38e3-e618-f178-1e78d619672e.png)

## クリックイベントリスナーの登録

　まずクリックリスナーの登録は以下のように行う。

[Mindのソースコード]
```mind:
　　メインとは
　　　　　　～略～
　　　　ボタン１を　クリックリスナーを登録し
```

　レイアウトの時もそうだったが、オブジェクトのクラス（ボタンなど）別にそれぞれ登録処理を使い分けるのはMindのソースが煩雑になるため、Mindの処理単語は「クリックリスナーを登録」１つとし、Mind→C→Javaと遷移した後、Java内部で処理を分岐するようにした。以下のようになる。

[Javaでの登録処理] (Mind側から呼び出される)

```java:
public int j_setOnClickListener( int id, int type, int seqno )
{
    int retcode;

    retcode = 1;
    switch ( type )
    {
    case typeTextView:
    break;//　（未実装）
    case typeEditText:
    break;//　（未実装）
    case typeButton:
        buttonsMind[seqno] = id;
        buttons[seqno].setOnClickListener( new onClickListenerForButton() );
        break;
        default:    /*該当無し*/
            retcode = 0;
            break;
        }
    return retcode;
}
```

　上記のうち buttonsMind[seqno] = id という処理だが、これはMindで管理しているボタン情報をJava側でも記憶しておき、イベント発生時、Mind側に処理が移った際に押されたボタンの識別がMindでもできるようにするためである。（Mindの側にビューオブジェクトを渡されても困るため）

## イベント発生時の処理

　次にイベント発生時の処理だが、まずJavaに入って来るので以下のようにイベント受け取る。

[Javaのイベントリスナー] (Android OS から呼び出される)

```java:
    //↓注：これはボタン用。クラス毎に用意する
private class onClickListenerForButton implements OnClickListener {
    @Override
    public void onClick( View v )
    {
            int    found;
            int    viewno;
        found = -1;
        for ( viewno=0; viewno<buttonsCount; viewno++ )
        {
            if ( v == buttons[viewno] )
            {
                found = viewno;
                break;
                
        }
        if ( found == -1 )
        {
            return;
        }
        /* ----------------------------------------- */
        /* --------- Mindカーネルを呼ぶここから ----- */
        String retcode = calltellButtonClick( ButtonsMind[found] );
        /* -------- Mindカーネルを呼ぶここまで ----- */
        /* ---------------------------------------- */
    }
}
```

　上記ではMindに通知する情報として buttonsMind[] という配列を参照しているが、前記したようにMind側でボタンを識別できるようにするためである。
　一方、Mindでは次のようなソースコードでイベント処理を記述する。

[Mindのイベント処理のソースコード]
```mind:
色の状態は　２個の　変数。

ボタンクリック処理は    本定義　　（ボタン情報　→　・）
　　　　　　　　＿ボタンは　ビュー
　　　　＿番号は　　変数
　　　　＿ボタンに　入れ
　　　　＿ボタンの　ＩＤからビュー番号を得て　＿番号に　入れ
　　　　色の状態（＿番号）を　一つ増加し
　　　　色の状態（＿番号）と　１を　ＡＮＤし　真？
　　　　　　　　ならば　赤色を
　　　　　　　　さもなければ
　　　　　　　　　　　　黒色を
　　　　　　　　つぎに
　　　　＿ボタンに　文字の色を設定する
　　　　。
```

　上記のようにMindでは「本定義」を使ってイベント処理を実現する。（ランタイム内部で既に仮定義してある）。
 　ほかにも、恐らく TextView については「テキストクリック処理」というような名称にするのだと思う。

# つづく

　最近、Mindユーザーの@mylifewithviolinさんがMindコンパイラの内部に興味を持たれているようなので参考情報として投稿してみました。本記事はしばらくつづきます。次は(ステップ5/9)。
github actionsとjenkins比較

# 経緯
オンプレでアプリの開発をすることになりました。

その際、自動デプロイで本番環境とステージング環境ができればみんな楽に動作確認ができる！

そんな思いから、前回はgithub actionとは何かについてまとめました。
もし興味があれば見てくださると嬉しいです!!

https://qiita.com/ponponnsan/items/faca1092576bc48c1bd2

今回は、CICDでデプロイするといったら有名なjenkinsとgithub actionsとはどんな違いがあるの？といった疑問を解消すべく記事にしています。


# jenkinsとは
CICDを実現するためのツール。オープンソースのため汎用性とドキュメント豊富なのが特徴。

Javaが動く環境であれば、LinuxでもWindowsでも動作させることができる。

また、dockerやKubernetes上の動作もサポートされている。

## Jenkinsの役割
Jenkinsの役割は、適切なツールを適切なタイミングで実行させ、結果を即座に通知すること。

Jenkinsを軸として、複数台のサーバーを接続してそれぞれで処理を行うことで、分散処理を可能にしている。

例えば、複数同時にテストを走らせたい時やそれぞれのテストが同じポートを使ったり、同じブラウザを使ったりする場合に複数のビルドを同時に走らせることができる。

異なるOSでの環境動作確認や、セキュリティ強化のために、dockerやクラウド上で実行しビルドが終了するとdockerやクラウドを破棄するといったことも可能。


# github actionsとjenkins
perplexityとChatGPTでgithub actionsとJenkinsの比較表を作成してもらいました。
AIで作成してもらうのが便利とはいえ、その参照先まで行って確認することの重要性を感じました。


| 機能/特性          | GitHub Actions                            | Jenkins                                |
|--------------------|-------------------------------------------|----------------------------------------|
| ホスティング       | GitHub上で提供、もしくはローカルまたはクラウド上で自己ホスト  | ローカルまたはクラウド上で自己ホスト  |
| 構成管理       | コード内でのYAMLファイルでの定義    | Web UIやGroovyスクリプトを使用      |
| インテグレーション | GitHubのリポジトリと直接統合       | プラグインを使用した統合             |
| パイプライン定義  | コードリポジトリ内のYAMLファイルで定義  | ウェブUIまたはJenkinsfile内で定義    |
| イベントトリガー   | プッシュ、プルリクエスト、スケジュールなど| プッシュ、プルリクエスト、スケジュールなど　|
| サポート       | GitHubのドキュメントやコミュニティ   | Jenkinsコミュニティやプラグインのドキュメント|
| 拡張性| GitHubとのシームレスな統合、カスタマイズ性が限定的 | 豊富なプラグインエコシステム、高いカスタマイズ性 |
| セキュリティ | GitHubの認証と権限管理に依存、セキュアな環境提供 | セキュリティ設定やプラグインの脆弱性に注意が必要 |
| サポートOS         | Linux/Windows/MacOS    | Linux/Windows/MacOS            |
| 利用の容易さとセットアップ |    簡単            |   中程度                    |
| スケーラビリティ     | GitHubのインフラによって制限される             |     高い          |
| コスト             | GitHubサブスクリプションに含まれる、もしくは自分で設定することで無料で使える | 無料で使用可能だが専任管理者が必要 |


## github actionsの選定理由
あくまでもプロジェクトのニーズや運用状況に応じて選択するツールは異なります。

私がgithub actionsでデプロイしようと思ったきっかけは、以下の通りです。

- 私自身が一回github actionsを使用したことがあり、少しは馴染みがある
- Jenkinsと比べ、簡単にセットアップできそう
- githubでの動作をイベントトリガーとして、指定の環境に自動デプロイしたい

# 最後に
この記事で少しでもgithub actionsとJenkinsの違いわかれば幸いです！
それでは、よき開発ライフを！！

# 参考文献
https://cloudbees.techmatrix.jp/jenkins/

https://cloudbees.techmatrix.jp/blog/struggle-story-about-ci-6/

https://docs.github.com/ja/actions/migrating-to-github-actions/manually-migrating-to-github-actions/migrating-from-jenkins-to-github-actions#key-differences

https://zenn.dev/dits/articles/12241a13f886d4

https://testomat.io/blog/jenkins-vs-github-actions-which-cicd-tool-is-right/

https://ichi.pro/github-actions-mataha-jenkins-anata-no-tameni-tadashii-sentaku-o-suru-10636340135112
OauthとSAMLの違いについての備忘録

## 明確な違いと思ったこと

OAuthは、ユーザーが別々のサービスやアプリケーションにアクセスする際に、毎回そのアクセスに対する許可を与える必要があります。ユーザーは各アプリケーションに対して個別に認可を行う必要があります。

SAMLは、ユーザーが1つのサービスにログインすると、その認証情報が他の関連するサービスに自動的に伝播され、再認証なしで他のサービスにアクセスできるようになります。これにより、ユーザーは1回のログインで複数のサービスにアクセスでき、スムーズな体験が可能となります。

OAuth = 毎回許可必要
SAML  = 一度の設定でスムーズにアクセス可



### プロトコルの違い

OAuthは、異なるアプリケーションやサービス間でのアクセス制御に使用されます。例えば、ソーシャルメディアのアプリがユーザーのプロフィール情報にアクセスする際にOAuthが使われます。また、主に使用されているOAuth 2.0の仕様では、データ形式としてJSONが標準的に使用されています。


SAMLは、企業内の複数のサービスやアプリケーション間でのシングルサインオンを実現するために使用されます。ユーザーは1回の認証で複数のサービスにアクセスできます。
XMLベースのプロトコルであり、XML文書がユーザーの認証情報や属性情報を含むため、主にWebブラウザ間の通信に使用されます。

### トークンの種類について

OAuthでは、アクセストークンやリフレッシュトークンなどのトークンが使用され、これらのトークンによってアクセス権が制御されます。

SAMLでは、セキュリティトークン（SAMLトークン）が使用され、ユーザーの認証情報や属性が含まれています。


間違っている、ここはこの方がいいかも？等々ございましたらご指摘いただけますと幸いです。
パッケージ管理（RedHat系・Debian系・openSUSE）

## はじめに
LPIC取得に向けて学習中であり、パッケージ管理の設定ファイルやサブコマンドを中心に記事を作成中。

## 目次
* 基本設定ファイル
* リポジトリ設定ファイル
* インストール
* アップデート
* アンインストール

## 基本設定ファイル
|          |          | ディレクトリ           |
|----------|----------|----------------------|
| RedHat系 | rpm      | /etc/rpm             |
|          | yum     | /etc/yum.conf         |
| Debian系 | dpkg    | /etc/dpkg/dpkg.cfg    |
|          | apt-get | /etc/apt/apt.conf     |
| openSUSE | zypper  | /etc/zypp/zypper.conf |


## リポジトリ設定ファイル
|          |          | ディレクトリ           |
|----------|----------|----------------------|
| RedHat系 | rpm      | -                    |
|          | yum     | /etc/yum.repos.d      |
| Debian系 | dpkg    | -                     |
|          | apt-get | /etc/apt/sources.list |
| openSUSE | zypper  | /etc/zypp/repos.d/    |

## インストール
|          |          | サブコマンド       |
|----------|----------|------------------|
| RedHat系 | rpm      | -i ( --install ) |
|          | yum     | install           |
| Debian系 | dpkg    | -i ( --install )  |
|          | apt-get | install           |
| openSUSE | zypper  | in ( install )    |

## アップデート
|          |          | サブコマンド                             |
|----------|----------|----------------------------------------|
| RedHat系 | rpm      | -U ( --upgrade ) <br> -F ( --freshen ) |
|          | yum     | update<br>upgrade<br>check-update       |
| Debian系 | dpkg    | -E<br>-G                                       |
|          | apt-get | upgrade<br>dist-upgrade<br>update       |
| openSUSE | zypper  | up ( update )<br>list-updates ( lu )    |

## アンインストール
|          |          | サブコマンド                       |
|----------|----------|----------------------------------|
| RedHat系 | rpm      | -e ( --erase )<br>--nodeps       |
|          | yum     | remove                            |
| Debian系 | dpkg    | -r ( --remove )<br>-P ( --purge ) |
|          | apt-get | remove                            |
| openSUSE | zypper  | rm ( remove )                     |
ThymeleafでJavaScriptを埋め込む（インライン処理）

## 本記事の内容
Thymeleaf(HTML)の中で、Modelに格納したDtoのプロパティなどの値を元にJSの処理を呼び出したい場面があった。その場合の記載方法に関して以下に記す。

## 記載方法
HTML内のscriptタグ内にて以下のように記載をすると実現可能。
（参考資料によるとインライン処理というらしい。。）


```html:hoge.html
<script th:inline="javascript">
    function showText(){
      document.getElementById("memotext").style.display = "block";
      document.getElementById("memotextarea").style.display = "none";
    }

    function showTextarea(){
      document.getElementById("memotext").style.display = "none";
      document.getElementById("memotextarea").style.display = "block";
    }

    [#th:block th:if="${#strings.isEmpty(mypageViewDto.displayEntryMemo) || errorMessage != null}"]
      showTextarea();
    [/th:block]
    [#th:block th:unless="${#strings.isEmpty(mypageViewDto.displayEntryMemo) || errorMessage != null}"]
      showText();
    [/th:block]
</script>
```

## 参考資料

https://miruraku.com/java/thymeleaf/javascript/inline/
【Docker Compose】DooDを使って、PHPファイルからPythonコンテナ内のPythonファイルを呼び出す方法

## はじめに
備忘録
タイトルの通りです。
どなたかのお役に立てれば幸いです。

## ディレクトリ/ファイル構造

以下のような構造であるとします。

```
sample/
  ├─ web/
  │   ├─ src/
  │   │   └─test.php
  │   └─ Dockerfile
  │
  ├─ python/
  │   ├─ src/
  │   │   └─test.py
  │   └─ Dockerfile
  │
  └─ docker-compose.yml
```

## `python/test.py`

今回は以下のようなプログラムとします。

```python:python/test.py
list = [
    'Apple',
    'Banana',
    'Orange',
    'Kiwi',
    'Strawberry',
    'Mango'
]

for data in list:
    print(data)
```

## `web/`について

`exec`関数を使って、`$command`で指定したコマンドを実行する`test.php`を作ります。

```php:test.php
<?php

$command = "docker exec -it sample-python3-1 python3 test.py";
exec($command, $response);

foreach ($response as $data) {
    echo $data . "\n";
};
```

:::note
今回は、`DooD`という仕組みを使って、Dockerコンテナの中で`docker`コマンドが使えるようにします。

この仕組みを使うためには、`/var/run/docker.sock`のマウントに加え、Dockerをコンテナ内でインストールする必要があります。
:::

まず、`/var/run/docker.sock`をマウントします。

`docker-compose.yml`の`php`サービスのところに、以下を追加します。

```docker:docker-compose.yml
php:
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
```

つぎに、`Docker`をインストールします。（ついでに`Docker Compose`もインストールします。）

`web/Dockerfile`に以下を追加します。

```Dockerfile:web/Dockerfile
RUN apt update
RUN apt install -y docker.io docker-compose
```

以下を実行することで、`docker`コマンドが使える状態のコンテナを立ち上げられます。

```shell
$ docker compose up -d --build
```

以上で`DooD`の準備が整いました。

次に、Dockerコンテナの中に入り、PHPファイルを実行します。

```bash
# Dockerコンテナ一覧を表示
$ docker ps
CONTAINER ID   IMAGE            COMMAND                   CREATED          STATUS          PORTS                                      NAMES
86023c6740d6   sample-web       "docker-web-entrypoi…"    15 minutes ago   Up 15 minutes   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   sample-web-1
91e6cb4dcf2c   sample-python3   "python3"                 15 minutes ago   Up 15 minutes                                              sample-python3-1

# コンテナに入る（コンテナ名には`docker ps`で確認したコンテナの名前）
$ docker container exec -it コンテナ名 bash
# 上記の場合
$ docker container exec -it sample-web-1 bash
root@0ac512c09b48:/var/www/html#   # ← こんな感じに表示されればOK

# phpファイルを実行する
root@0ac512c09b48:/var/www/html# ls
test.php
root@0ac512c09b48:/var/www/html# php test.php
Apple
Banana
Orange
Kiwi
Strawberry
Mango
```
Github private リポジトリを composer installするときの注意点

## 記事対象者
(一般ユーザとしてcomposer installしており、)後述のエラー事象が発生してる方。

## 前提

organization/repos-name というプライベートリポジトリをcomposer installしようとする。

## エラー事象

composer install 時に以下のエラーが発生。

``
Failed to download laravel/framework from dist: The "https://api.github.com/repos/organization/repos-name/zipball/xxxxxxx" file could not be downloaded (HTTP/2 404 ): {"message":"Not Found","documentation_url":"https://docs.github.com/rest/repos/contents#download-a-repository-archive-zip"} Now trying to download from source
``

メッセージ内の、

```
https://api.github.com/repos/organization/repos-name/zipball/xxxxxxx
```

はプライベートリポジトリなのでそのままアクセスしても not foundになる。

エラーメッセージに記載されている以下のURL、


https://docs.github.com/ja/rest/repos/contents?apiVersion=2022-11-28#download-a-repository-archive-zip


に記載の通り、

```
curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer xxxxxxxx" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/organization/repos-name/zipball/xxxxxxx --output laravel-framework.zip
```

のようにすればダウンロード可能ではある。
しかし、今回はこのような形でDLしたい訳ではない。


## 対処方法

rootユーザの場合は

```
composer config -g github-oauth.github.com ${GITHUB_ACCESS_TOKEN}
```

のようにアクセストークンを設定すればOK。


これが一般ユーザ(仮に「appuser」というユーザとする)で composer install する場合は、

appuser でアクセストークンを設定する必要があるので

```
su - appuser -c "composer config -g github-oauth.github.com ${GITHUB_ACCESS_TOKEN}"
```

のように設定する必要がある。

Dockerfile 上であれば

```
RUN su - appuser -c "composer config -g github-oauth.github.com ${GITHUB_ACCESS_TOKEN}"
```

のように記述する。
Wi-Fiって2種類あんねん

Wi-Fiって便利ですよね。家でも外でもネットできるこの時代にはなくてならないものです。
ところで、Wi-Fiを設定されたことある人ならわかると思うんですけど、

##### Wi-Fiって2種類ありません？？？

これはネットワークの知識ある人が聞いたら「お前は何を言っているんだ」と言われることでしょう。
何故このような突拍子のない言葉が出たのかご説明していきましょう。

### Wi-Fiルータにある「2.4 GHz」と「5 GHz」
私の持っているルータには「2.4 GHz」、「5 GHz」といった記載と、それぞれのネットワーク名が書かれています。このネットワーク名とそれぞれのパスワードをPCやスマホ、switchに入力してあげれば、それぞれのWi-Fiが使えるようになります。
「2種類ありません？？？」はここからきています。さて、この2つの数字と単位と違いは何なのか書いていきます。

#### ・GHz
GHzは「ギガヘルツ」と読み、周波数のことを表しています。
周波数とは１秒間に含まれる波の数で、周波数が高くなると単位時間当たりの波の数が多くなるため、１秒間に送ることができるデータ量が多くなります。

「2.4 GHz」と「5 GHz」なら、「5 GHz」の方がデータ通信が多く早くなるということ？
じゃあ、「5 GHz」だけ使えばいいか！と思うかもしれませんが、何事にも一長一短があります。

#### ・5 GHz
「5 GHz」は上述した通り、通信速度が早く安定していますが、遮蔽物に弱いという特徴があります。同じ家の中でもルータが置いていない部屋に移ると電波が届きにくくなったり、家の外に出たら完全に通信が切れます。
対応機器も少なく、人工衛星や航空無線で使われる周波数なので屋外利用も制限されています。

https://www.tele.soumu.go.jp/j/sys/others/wlan_outdoor/

#### ・2.4 GHz
対して「2.4 GHz」は、多くの家電・ゲームなどが使用できる周波数で、通信速度と安定性は「5 GHz」に劣りますが、遮蔽物があっても通信が行えるメリットがあります。マンションなどで通信状態が影響を受けるのはこれも原因なんでしょうね。


### まとめ
:::note info
・Wi-Fiには周波数が違うものがある
・通常時は「2.4 GHz」を使おう
・「5 GHz」は屋内で通信を安定させたいときに使おう
:::

### 参考記事
https://flets-w.com/chienetta/pc_mobile/cb_other59.html

https://www.ntt-bp.net/column/blog/2023/04/post-119.html#:~:text=%E5%AE%9F%E3%81%AF5GHz%E5%B8%AF%E3%81%AE%E9%9B%BB%E6%B3%A2,%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%BE%E3%81%97%E3%82%87%E3%81%86%E3%80%82
Merging multiple VectorStoreIndex

```
llama-index==0.10.19
```

Occasionally you may want to use multiple indices for query, such as making a custom chatbot that talks on selected topics. And you would like to avoid recalculating embeddings.

Note that for large dataset, it is more efficient to filter indexed Nodes by metadata keywords instead of such merging.

```python
nodes = []
for path in ['doc1_persist', 'doc2_persist', 'doc3_persist']:
    # read stored index from file 
    storage_context = StorageContext.from_defaults(persist_dir=path)
    index = load_index_from_storage(storage_context)

    vector_store_dict = index.storage_context.vector_store.to_dict()
    embedding_dict = vector_store_dict['embedding_dict']
    for doc_id, node in index.storage_context.docstore.docs.items():
        # necessary to avoid re-calc of embeddings
        node.embedding = embedding_dict[doc_id]
        nodes.append(node)

merged_index = VectorStoreIndex(nodes=nodes)

# now make queries using the merged index
```
【Kotlin*JUNIT】LocalDateTime.now( )をモック化

## 本記事の内容
JUNITでLocalDateTimeクラスをモック化したい場合の記載方法を以下に記します。
※LocalDateクラスも同様の記載でモック可能！！

```kotlin:
class HogeServiceTest {
    companion object {
        /** LocalDateTime.now()で返す値 */
        private val mockNowDateTime = LocalDateTime.of(2024, 1, 1, 0, 0, 0, 0)

        @BeforeAll
        @JvmStatic // static関数であることを明示
        fun beforeClass() {
            // LocalDateTime.nowをモック化
            mockkStatic(LocalDateTime::class)
            every { LocalDateTime.now() } returns mockNowDateTime
        }
    }

    // ～以下省略～
}
```
Rails7.0.8でsqliteに対してchange_columnするときは必要な全ての要素を指定しよう

# 最初にざっくりまとめ
- `Rails7.0.8`で`sqlite`の`change_column`に対して変更が入った
- その影響で以前とは振る舞いが変わっている
  - `change_column`で指定した要素以外の設定がデフォルトに戻ってしまう
- `mysql`では起きない(検証してないけど多分`sqlite`以外は大丈夫)

つまり、 **`Rails7.0.8`で`sqlite`に対して`change_column`するときは必要な全ての要素を指定しよう**

# 調べたこと

## `Rails7.0.8`のリリースノート
https://github.com/rails/rails/releases/tag/v7.0.8

色々と機能がリリースされていますが、今回の事象に関わるのは以下。この修正で`sqlite`の`change_column`に対して実装が追加されています。

>Fix change_column not setting precision: 6 on datetime columns when using 7.0+ Migrations and SQLite.
>
>Hartley McGuire

https://github.com/rails/rails/pull/49121

## `Rails7.0.7.2`と`Rails7.0.8`で挙動比較

検証バージョン
- Ruby: 3.2.2
- sqlite3: 3.39.2

マイグレーションファイルを2つ用意します。一つはテーブル作成で、その際に`default`と`null`を指定しておきます。もう一つはカラム変更で、属性としてコメントだけを指定します。命名が適当なのは許して🙏

```ruby:テーブル作成マイグレーション
class CreateTestTable < ActiveRecord::Migration[7.0]
  def change
    create_table :test_tables do |t|
      t.string :name, null: false, default: 'name'

      t.timestamps
    end
  end
end
```

```ruby:カラム変更マイグレーション
class ChangeTestTableColumn < ActiveRecord::Migration[7.0]
  def change
    change_column :test_tables, :name, :string, comment: 'changed'
  end
end
```

この二つのマイグレーションを実行すると、`sqlite`のテーブル定義は以下のようになりました。

```sql:Rails7.0.7.2の場合
CREATE TABLE IF NOT EXISTS "test_tables" (
  "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
  "name" varchar DEFAULT 'name' NOT NULL,
  "created_at" datetime(6) NOT NULL,
  "updated_at" datetime(6) NOT NULL
);
```

```sql:Rails7.0.8の場合
CREATE TABLE IF NOT EXISTS "test_tables" (
  "id" integer NOT NULL PRIMARY KEY,
  "name" varchar, -- DEFAULT 'name' NOT NULL が消えてしまった！
  "created_at" datetime(6) NOT NULL,
  "updated_at" datetime(6) NOT NULL
);
```

`Rails7.0.7.2`以前は、`change_column`で指定した要素以外は、それまでの設定を引き継いでくれていました。
`Rails7.0.8`では、`change_column`で指定した要素以外の設定はデフォルトに戻るようになりました。

ちなみに、`mysql`を使った場合はどちらのバージョンでも`Rails7.0.7.2`x`sqlite`の挙動と同じでした。

## 解決策
`change_column`を使うときは、サボらず必要な要素を全部書きましょう。

```ruby:カラム変更マイグレーション修正版
class ChangeTestTableColumn < ActiveRecord::Migration[7.0]
  def change
    change_column :test_tables, :name, :string, null: false, default: 'name', comment: 'changed'
  end
end
```

# 終わりに
今回はテストが通らなくなったことでこの事象に気づくことができました。テストって大事👏
本番環境で`sqlite`を使っているプロダクトは少ないと思うので、そこまで影響はないと思いますが、振る舞いが変わるのは怖いですね。バージョンアップする際は動作確認しっかりやりましょう💪
S3 バケットポリシーについてメモ

S3のバケットポリシーについて理解を深めるためにメモ

# バケットポリシーとは
S3のバケットにアップロードしたオブジェクトのアクセス制御を行う。

こういうやつ
```json-doc
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::vue-todo-list-pwe/*"
        }
    ]
}
```

バケットの「アクセス許可」タブから設定可能

#### 初期設定
バケット作成時は、バケットポリシーは何も設定されていない。
自分で作成する時は、１からJSONを書く必要はなく、編集から項目を選択することで自動挿入してくれる。

#### 新しいステートメントを追加

![スクリーンショット 2024-03-20 12.16.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440409/ff35c0c0-f13b-f8e6-19a0-f38145f881a3.png)

#### ステートメントとは
聞き慣れない言葉かもしれない。
ステートメントとは、IAMポリシーのひとつ。
各ステートメントは、**アクション（実行される操作）、リソース（対象となるAWSリソース）、効果（許可または拒否）、および条件（アクセスを制限するためのオプション）などの要素**から構成される。

ステートメントは配列で、**複数指定することができる。**

初期値
```json
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "Statement1",
			"Principal": {},
			"Effect": "Allow",
			"Action": []
		}
	]
}
```



# Sid: 識別子（省略可能）
Sidは、ステートメントに付与される識別子。
これにより、ポリシー内の各ステートメントをユニークに識別することができる。

Sidは**省略可能**であり、主に可読性や管理のために使用される。

同じIAMポリシー内でのみユニークであればOK

# Principal: 対象ユーザー
誰に対して、アクセス制御するのか、対象ユーザーを設定する。

AWSアカウントに許可を与える
```json
"Principal":{"AWS":"arn:aws:iam::AccountIDWithoutHyphens:root"}
```

複数指定
```json
"Principal":{
    "AWS": [
        "arn:aws:iam::AccountID1WithoutHyphens:root",
        "arn:aws:iam::AccountID2WithoutHyphens:root"
    ]
}
```

全員許可
```
"Principal":"*"
//または
"Principal":{"AWS":"*"}
```

# Effect: 許可 or 拒否の設定
#### 許可
```json
 "Effect": "Allow",
```

#### 拒否
 ```json
"Effect": "Deny",
```

# Action: アクション
右サイドメニュー「アクションを追加」から、使用したいアクションを選択すると自動で追加される。

![スクリーンショット 2024-03-20 12.53.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440409/6eb6b45f-60bf-50ed-303a-43eda3d35b89.png)


https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazons3.html

# Resource: リソース
設定したポリシーをどのオブジェクトに適用させるか、範囲を指定することができる。

example-bucket という名前のバケット配下の全てのオブジェクトに対して適用させる。
```json
"Resource": "arn:aws:s3:::example-bucket/*",
```

# Condition: 条件（省略可能）
アクセス許可を付与するときの条件を指定することができる。

#### AWS全体の条件（グローバル条件キー）
`aws:` prefix をつける

```json
"Condition" : {
                "IpAddress" : {
                    "aws:SourceIp": "192.0.2.0/24" 
                },
                "NotIpAddress" : {
                    "aws:SourceIp": "192.0.2.188/32" 
                } 
            } 
```

#### S3固有の条件
`s3:` prefix をつける

```json
"Condition": {
                "StringEquals": {
                    "s3:x-amz-acl":["public-read"]
                }
            }
```