OmniAICreator/Qiita-1.07M huggingface dataset:
複数行のコマンドをsudo suに渡して実行する方法

@ko1nksm さんのご指摘により記事を大幅に変更しました。教えてくださりありがとうございます！
（もはや自分の記事ではない・・・）

```
<< EOF sudo sh
# ここにコマンドを書く
EOF
```

```:実行例
<< EOF sudo sh
whoami
whoami
whoami
EOF
```

```:実行結果
root
root
root
```
SerDeとは

## SerDeとは
「SerDe」とは、**シリアライズ（serialize）およびデシリアライズ（deserialize）** を行うためのライブラリです。これにより、データを特定の形式に変換して保存したり、保存されたデータを元の形式に戻したりすることができます。

## AthenaでSerDeを使う
Athenaで利用できるSerDeは以下。

#### Amazon Ion Hive SerDe
ライブラリ名: com.amazonaws.athena.serde.IonHiveSerDe
説明: Amazon IonはJSONのスーパーセットで、リッチタイプの自己記述データ形式です。

#### Avro SerDe
ライブラリ名: org.apache.hadoop.hive.serde2.avro.AvroSerDe
説明: Apache AvroはJSONベースのスキーマを使用するデータ形式で、Hadoopにデータを保存するために使用されます。

#### Parquet SerDe
ライブラリ名: org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe
説明: Apache Parquetは列指向のストレージ形式で、Hadoopのデータを効率的に保存します。

#### Grok SerDe
ライブラリ名: com.amazonaws.glue.serde.GrokSerDe
説明: Grokパターンを使用して、LogstashログやApache WebServerログなどのデータを解析します。

#### Regex SerDe
ライブラリ名: org.apache.hadoop.hive.serde2.RegexSerDe
説明: 正規表現を使用してデータを解析します。

#### Hive JSON SerDe
ライブラリ名: org.apache.hive.hcatalog.data.JsonSerDe
説明: JSON形式のデータを処理します。

#### OpenCSVSerDe
ライブラリ名: org.apache.hadoop.hive.serde2.OpenCSVSerde
説明: CSVデータを処理します。

#### LazySimpleSerDe
ライブラリ名: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
説明: CSV、TSV、カスタム区切りファイルのデータを処理します。

#### ORC SerDe
ライブラリ名: org.apache.hadoop.hive.ql.io.orc.OrcSerde
説明: ORC（Optimized Row Columnar）形式のデータを処理します。


https://docs.aws.amazon.com/ja_jp/athena/latest/ug/supported-serdes.html
文系開発未経験がエンジニア就活を振り返る

おはようございます！
駆け出しエンジニアのさわまりんです。

今回は、文系大学生かつ開発未経験の私が
どのようにしてエンジニア就活を行ったのか振り返ります。

# 大学当時の私について
大学：経営・経済と英語がメインの学部へ
部活：コロナ直撃世代でなにもしていなかった
バイト：イタリアンのホールスタッフ、コンサル会社の業務サポート
ボランティア：日本に住む外国の方に日本語を教えていた

こんな感じで開発に縁もゆかりもない大学生活を送ってきました。
なぜ私がエンジニアを目指したのかはさておき、
どのようにして就活を進めていたのか振り返っていきます。

# 私の就活の進め方
ここからは私の就活の方向性や、それを踏まえたうえでの企業選びの方法、
面接の練習方法、ちゃんとやっておいたほうがいいことをご紹介します。

## 就活の方向性
ざっと以下のことは必須で企業選びをしていました。
- ぜったいにエンジニア
- 研修が充実している
- リモートワークができる
- 成果主義

## 企業選び
実は私は就活を初めてばかりのころから弊社(WHI)を志望していました。
というのも、自分が求めている条件に合致しすぎていたからです。
しかし1社に絞って落ちてしまっては仕方がないので、複数の企業を見ていました。

企業を探す際のキーワードとしては、
「人材×IT」「Saas」「自社開発」「HR Tech」をメインにしてました。

現在、就活をしている人なら
あんな企業やこんな企業と、いろいろ思い浮かぶのではないでしょうか。


## 面接の練習方法
誰しも本命の企業はあるはずです。
本命企業の面接に向けて、面接の練習をするのであれば、
そこに似た企業を探し出し、それらの企業の面接を受け、
面接に慣れることが必要だと思います。

似た企業であれば、志望動機や自分の強み弱み、
成長した出来事などを大きく変えることなく、面接に挑むことができます。

面接官に自分のことを的確に伝えられるようになることを目標に数をこなします。

## これからエンジニア就活する人がやっておくべきこと
これからエンジニア就活する人がやっておくべきことは2つあります。

### 1. OB訪問をたくさんすること
OB訪問ができるアプリがあることをご存じでしょうか。
実際に内定を得た人、働いている人から情報を得たほうが、
簡単に知りたい情報にたどり着けます。
情報は多いほうがいいので、
自分のもやもやが晴れるまで何度でもOB訪問をしてみましょう。
中には面接の練習や、GWのコツを教えてくれる方もいます。

### 2. IT企業にどんな種類があるのか調べること
わけもわからずSIerを志望していませんか？
どんな種類があって、それぞれどのような特徴があるのか調べておきましょう。
実際に働き始めてから、思っていたよりハードだな、、、とか思いたくないですよね。

# さいごに
私の就活の振り返りを読んでくださり、ありがとうございました。

次回の記事では、OB訪問をしていると出会うことになる
『メンター』について言及していきます。

就活においてメンターとは、いい人に出会えれば最高の味方に、
そうでなければ自分の貴重な時間を奪う存在になり果てます。

うまく付き合っていくにはどうすればいいのか、次回の記事で解説していきます。
スマートフォンのセットアップ手順

1. wifiのid, password、　google もしくはappleのアカウント id, passwordを新しいスマホで写真を撮る
1. wifiに接続する
1. google もしくは appleのアカウントにログインする
1. 1passwordをダウンロードする
1. 古いスマホの1passwordを起動してログイン用のQRを表示する
1. 新しいスマホで1passwordを起動して古いスマホのQRを読み取る
1. 各種サービスへログインする
【AWSの学習を始める方へ】AWSのハンズオン

## 趣旨
AWSの学習を始めたけれど、何から手を付けて良いのか迷っている方々に向けて、効率的な学習の進め方を整理しました。私自身もAWSを学び始めたときには多くの時間を費やしましたので、同じような悩みを持つ方の参考になれば幸いです。

## 対象者
- AWSの勉強を始めたが、何から始めれば良いかわからない方
- AWSを業務で使用する予定がある方
- 転職活動中で、AWSの基礎を学びたい方

## ハンズオン学習サイトの紹介
AWSの基礎を効率的に学べる、便利な学習サイトを3つご紹介します。これらを活用して、AWSの理解を深めていきましょう。

| 学習サイト | 学習内容 | 学習目安時間 | 料金 |
|------------|----------|--------------|------|
| **AWS Skill Builder Cloud Quest** | [AWS Cloud Quest Cloud Practitioner](https://aws.amazon.com/jp/training/digital/aws-cloud-quest/)では、AWSアカウントを作成しなくても、自動で環境が構築され、ハンズオンでAWSを試すことができます。途中から有料になりますが、「Cloud Practitioner」は約10ステージほど無料で提供されており、ゲーム感覚で着実にAWSを学べるので非常におすすめです。 | 10-20時間 | 無料 |
| **AWS公式** | [AWS Hands-on for Beginners 〜 スケーラブルウェブサイト構築編 ](https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Scalable-2022-reg-event.html)。こちらもAWS公式サイトですが、非常に勉強になります。Amazon EC2、Amazon RDS、Application Load Balancerの構成が学習できます。ただし、Cloud Questと異なり、自分でAWSアカウントを作成する必要がありますので、無料枠および最低金額で構築できるよう、構築した構成は削除することが望ましいです。 | 1～3時間 | 無料 |
| **Udemy** | [【AWS初心者向け】手を動かして身につける！ 実戦で役立つAWSサービスの基礎とアーキテクチャ(SAAレベル)](https://www.udemy.com/course/aws-beginner-lecture-and-handson/)。AWS以外の知識（ドメイン取得等）も必要になるため、初心者には少し難しい部分があるかもしれませんが、動画を見ながら進め、どうしても分からない部分は調べながら学習すれば、構築できるようになります。全ての内容を構築する必要はなく、気になる部分だけを学習するのでも十分です。 | 10-30時間 | 1,600-2,000円 |

※下2つの学習サイトを使用する際は、AWSアカウントを自分で作成する必要があります。また、無料枠を超えて利用しないように注意が必要です。

## AWS資格学習のすすめ
ハンズオンでの学習が終わったら、AWS資格の取得に向けた学習を始めることをおすすめします。AWS試験では、実務で使用しないサービスも含まれる場合があると思いますが、ハンズオンで得た知識が試験にどう役立つかを理解しておくのは非常に有用です。

既に資格学習を始めている方でも、ハンズオンを通じて実際のクラウドサービスに触れることで、試験の内容をより深く理解できるでしょう。

:::note info
特に、初学者向けのクラウドプラクティショナー（CLF）試験では、以下の項目はハンズオン経験があると理解が進みやすくなります。
:::

- VPC（Virtual Private Cloud）
- NACL（Network Access Control List）
- セキュリティグループ
- EC2（Elastic Compute Cloud）
- S3（Simple Storage Service）

私自身も、最初は資格の勉強において暗記に頼っていましたが、ハンズオンでこれらの項目に触れたことで、試験問題をよりスムーズに解けるようになりました。以下は私のCLFとSAAの記事ですので、よろしかったら読んでみてください。

https://qiita.com/hanzo77/items/cf10705b67d7aa6e809e

https://qiita.com/hanzo77/items/b76f5bb48e644a5c8e3e

## 最後に
AWSを学ぶ際には、実際に手を動かして触れてみることが大切です。ハンズオンを通じて理解が深まり、資格学習もより効率的に進められるようになるでしょう。特に、AWS Skill BuilderのCloud QuestはAWSアカウントを作成せずに無料でAWS環境を試せるので、ぜひ活用してみてください。
metaの統合認証ダウンに際して思ったこと

昨夜、Facebookの（おそらくmetaの）統合認証がダウンしたようですね。(☆記事作成よりだいぶ前のことです）

それで、自分だけではなく他の人もそうなのか確認しようと思ってXにログインしました。
そこで多く見かけたものが、ログインパスワードが通らなかったために、パスワード変更をかけてしまったというもの。
気持ちはわからんでもないのですが、その際にパスワード変更画面が正規のURLであることを確認したひとが何人いたのか気になりました。
世に多く蔓延しているパスワード奪取方法の一つに、正規ではないパスワード設定画面へ誘導し、そこでパスワード変更をかけさせるという手法があります。

これによって
・ログインID
・旧（だと思っている生きたままの）パスワード
が手に入ります。
システムはひとが作ったものなのでダウンすることはしばしばあります。
こういうときこそ、落ち着いて行動したいものですね。

パスワードの変更を促されたら、まずは疑ってかかるのが良いと思いますよ。
(ベンチマーク)STM32C011J4M7で素数を求める3...100まで(PA14ハードウェアシリアル)


x 理系フリマ831にあるよ

目的
素数を求めて時間を測って遊ぶ
2から開始しする
割るのは、2からn-1まで割る
ちゃんと割ってあまりを求める
z = x / y
a = x - ( z * y )

いろいろ
Arduino UNOより速い

結果


![o_coq316.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ef534699-35c3-4239-a0b7-39705b8add1e.jpeg)


![o_coq317.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/155704f4-7340-5902-cfc0-35228a5a9eeb.jpeg)



```c++



//sosuu_C011_1


void setup() {

  //00:PB7
  //01:PC14
  //1x:Reserved
  SYSCFG->CFGR3 = SYSCFG->CFGR3 | 0b01;

  Serial.setTx(PC14);
  Serial.setHalfDuplex();
  Serial.begin(9600);

}//setup

void loop() {

  int s[100];
  for (int ii = 0; ii < 100; ii++) {
    s[ii] = 0;
  }//for

  unsigned long time;

  int a=1;//work

  int pp = 0;
  //s[pp++] = 1;//debug
  //s[pp++] = 2;//debug
  Serial.println("START>>");
  time = millis();

  for (int ii = 2; ii < (100 + 1); ii++) {

    //Serial.print('(');  //debug
    //Serial.print(ii);   //debug
    //Serial.print(')');  //debug
    //Serial.println();   //debug

    for (int jj = 2; jj < (ii); jj++) {

      //Serial.print('['); //debug
      //Serial.print(jj);  //debug
      //Serial.print(']'); //debug

      a = ii / jj;
      a = ii - (a * jj);
      if ( a == 0) {
        //Serial.print('*');//debug
        break;
      }//if

    }//for
    if (a != 0) {
      //Serial.print('@');
      s[pp++] = ii;
    }
    //Serial.println();//debug
  }//for

  time = millis() - time;
  Serial.print("millis=");
  Serial.println((int)time);

  int yy = 0;
  while (s[yy] != 0) {
    Serial.print(s[yy]);
    Serial.print(',');
    yy++;
  }//while
  Serial.println();

  Serial.println("<<END");
  delay(3000);
  //while (1) {} //debug
}//loop



```
scpコマンドによるS3ファイル転送時にLambdaが実行されない問題を解決する方法

# 目次
1. [はじめに](#introduction)
2. [登場するサービス、OS](#services-os)
3. [用語解説](#terms)
4. [作業の目的](#objective)
5. [誤った作業](#wrong-steps)
6. [エラー発生](#error)
7. [解決方法](#solution)
8. [参考文献](#reference)

<a id="introduction"></a>
# はじめに
S3バケットにファイルをアップロードした際に、自動的にLambdaを実行する仕組みを作ろうと考え、S3バケットをEC2にマウントして毎晩ローカルサーバからEC2経由でファイルを転送するプロセスを構築しました。
しかし、scpコマンドでファイルをコピーした際にはS3イベント通知が実行されず、Lambdaが動作しないという問題に直面しました。
この記事では、この問題を解決するために行った方法について説明します。

<a id="services-os"></a>
# 登場するサービス、OS
- **ローカルサーバ**: Windows Server
- **EC2インスタンス**: Amazon Linux
- **S3**: オブジェクトストレージサービス
- **Lambda**: サーバーレスコンピューティングサービス

<a id="terms"></a>
# 用語解説
- **scpコマンド**: ファイルを安全にコピーするためのコマンド。特にリモートサーバー間で使用されます。
- **S3イベント通知**: S3バケット内で指定されたイベント（ファイルのアップロードなど）が発生した際に、通知やトリガーを発行する機能。
- **Lambda**: AWSが提供するサーバーレスコンピューティングサービス。イベント駆動型でコードを実行します。

<a id="objective"></a>
# 作業の目的
毎晩、ローカルサーバからEC2経由でS3にファイルを自動的に転送し、その際にS3イベント通知を使ってLambdaを実行することで、ファイルのバックアップ状況を確認するシステムを構築することを目指しました。

<a id="wrong-steps"></a>
# 誤った作業
最初に試みたのは、scpコマンドを使ってファイルをS3バケットにコピーする方法です。
しかし、この方法では、S3イベント通知が実行されず、Lambdaが起動しないという問題が発生しました。

<a id="error"></a>
# エラー発生
S3バケットがEC2にマウントされている環境で、scpコマンドによるファイル転送ではS3イベント通知が実行されないことが判明しました。
これにより、S3にファイルを配置しても、Lambdaが自動的に実行されないというエラーが発生しました。

イメージ図
![S3夜間バックアップ_qiira用_lambda起動前.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3845301/a200f544-e310-f791-9961-0a5e692f24a5.png)


<a id="solution"></a>
# 解決方法
この問題を解決するために、以下の手順を取りました。

1. **scpコマンドでファイル転送を実行**: まずは、必要なファイルをscpコマンドでS3バケットにコピーします。
2. **AWS CLIコマンドでトリガーファイルを作成**: ファイル転送が完了したら、AWS CLIを使って特定のテキストファイル（例: `done.txt`）をS3バケットに作成します。
3. **AWS CLIコマンドでトリガーファイルを削除**: `done.txt`が作成された後、一定時間内にこのファイルを削除します。

これらのステップをbatファイルに組み込み、タスクスケジューラーを使用して毎晩定期的に実行するように設定しました。
これにより、ファイル転送後にS3イベント通知が実行され、Lambdaが正しく実行されることを確認しました。

イメージ図
![S3夜間バックアップ_qiira用_lambda起動後.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3845301/4b17d13b-56fb-9b5e-f8e3-c5d57b6d2614.png)


## 重要なポイント
- **scpコマンドではS3イベント通知が実行されない**ことが最大のポイントです。
これにより、Lambdaの自動実行が行われないため、AWS CLIを補完的に使用しました。
- **AWS CLIで作成したファイルが大量のイベントを実行しないように**するため、必要最小限のファイル操作のみを行い、不要なLambdaの実行を防止しました。

<a id="reference"></a>
# 参考文献
- [AWS CLI Documentation](https://aws.amazon.com/documentation/cli/)
- [Lambdaのイベント通知設定](https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html)
- [S3バケットのマウント方法](https://docs.aws.amazon.com/ja_jp/efs/latest/ug/mount-fs.html)
読書記録 2024/8/5週

## 本の情報
**タイトル**
本質をつかむ思考力
**著者**
小宮 一慶

## 本の内容
思考力は、「論理的思考力」と「ひらめき」からなる。
この2つは一見関連がないように見えるが、どちらも頭の「引き出し」を整理することで向上する能力である。

頭の中には「引き出し」がたくさんあり、その中に情報やツールが入っている。
下記のように、「引き出し」は4つの段階を経て整備されていく。
1. 数や中身の量・質を高める
→現象を正確に捉え、引き出しの数を増やす
1. 中身を整理・整頓する
→引き出しの中身を基に仮説を検証する
1. 中身を使って分析する
→仮説検証を繰り返し、物事の本質を見つけ出す
1. 中身同士を関連付ける
→異なった分野や対極的な要素から情報を取得する
1~3が「論理的思考力」を構成し、4は「ひらめき」を構成する。

日々の中で気になったことや違和感を覚えたことに対し、関心を持ってより深いことを考えようとすることで、「引き出し」を整備していくことができる。

## ためになったところ
* 「思考力」のイメージ
本の中で、繰り返し「物事に対して考える癖をつけることが重要」といった旨の記載が出てくる。
(「不思議なものを見たときに理由を考える」「曖昧な言葉をそのままにせず、裏付けを取る」など)
この記載と「引き出し」というイメージから、思考力は唐突に大きな結果が出るものではなく、小さなことの積み重ねの上に生まれるものだという実感を持つことができた。
## まとめ
「思考力」がどのような要素から構成されるのか、どのように高められていくのか といった思考力の在り様を具体的にイメージすることができました。
一朝一夕で身につくものではないと改めて意識させられたので、日々の中に思考力を磨く時間を少しずつ含めていきたいと思います。
ありがとうございました。
【初心者】Microsoft 365 F1とF3(Teams なし)ってなあに


# 結論
- フロントラインワーカー（店舗や工場など現場の人向け）のライセンス
- 月額\262円からEntra ID P1やIntune Plan1がふくまれるので個別契約より安い
- これらの用途に限った形であれば最もオトクっぽい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/cd5a3401-9a0b-abe3-2e1a-5aaaf41aed53.png)

# ID/端末管理の統合
- これが最大のメリットでしょうね。Entra P1/Intune Plan1のフル機能が使えるようです。
- 個別契約や、EMSを契約するよりかなり安い。
- ただし後述しますがフロントラインワーカー用のみです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/ef4a03ae-7889-161d-8588-aa43bc2917e8.png)


# メールとTeamsについて
- Exchange Online（メール）も2GBまで使えるので最低限のコミュニケーションはOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/1db4ab3a-b319-a25e-6148-0b51efcbf8b9.png)

- 必要ならTeamsありにしてもいいと思うがファイルのやりとりやらで制約が出そう。
- Teamsを入れるということはSharepointを本格運用すると同義であり、情シスとしてそれなりの覚悟が必要。
- Teamsを入れずに現場とのやり取りはメールだけの運用で割り切ってもらうのもあり。
- それ以外は電話で解決してもらう。現場はちまちまチャットするの嫌いな人もいるので。

# F1とF3のちがい
- Office Onlineが使えるかの違いのようです。
- Web版のパワポやExcelが使える。
- F3は5台のタブレットとスマホまでアプリ版がインストールできる模様？
- Entra ID P1 + Intune Plan1 + Exchange Onlineに割り切るならF3は要らなさそう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/b82c3834-3936-0174-a887-f503e539b701.png)

### ほか
- F3は他にも使えるアプリが増えるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/e3e3091b-7e0b-b859-e770-364be485b826.png)



# 注意点
- オフィスワークがメインの社員にこのライセンスを割り当てるのはバイオレーションになると思います
- 一般的にはそれらの社員にはBusiness Premiumか、365 Apps + EMS or Intune or Defenderを入れているところが多いんじゃないでしょうか。
### フロントラインワーカーの定義
https://learn.microsoft.com/ja-jp/microsoft-365/frontline/flw-licensing-options?view=o365-worldwide


# Office Online VS フル版Office
- こちらのページの解説が分かりやすかったです。
#### 
https://www.e-sales.jp/eigyo-labo/excel-online-14342

- [以前のエントリ](https://qiita.com/minoden_works/items/d0fac6e5471b64409811#%E3%81%9D%E3%81%AE6ipad%E3%81%A8vdi)でも書きましたが、Web版のExcelやWordはマクロとか使えないので、中途半端にWebインターフェースで編集してもらうよりは、Windows ServerにRDPしてもらうほうがいいと思います。
- サーバーのお守りは必要になりますが、可用性との天秤をかけた場合、RDPでフル版のExcelを使ってもらうほうが結局UXも向上するような。
- もちろん簡単な台帳更新とかならExcel Onlineでもいいのでしょうけどね。 
- これは自分がインフラよりの情シスだからかもしれません。趣味が入っててすいません。


# まとめ
- Entra P1/Intune Plan1が使え、かつメールも2GBまでだが提供できる。
- かなりの低価格で現場社員のID/端末管理が一元化できるのが良い。
- 割り切った使い方ができて、情シス的にも負担が減り、運用の断捨離ができる。
- 現場社員が過半数を占める企業に大いにオススメ。

# 有用リンク
https://qiita.com/yoshi_engin/items/c47e1566fba3337f0d3c

https://learn.microsoft.com/en-us/answers/questions/1292023/microsoft-365-and-microsoft-intune-subscription-fe

https://m365maps.com/matrix.htm

https://www.reddit.com/r/Intune/comments/qndop7/m365_f1_includes_intune/
大規模データ収集におけるIPブロック防止のためのプロキシ活用戦略

## 1. はじめに
大規模データ収集作業、特にウェブスクレイピングを実行する際に直面する最大の課題の一つは、IPブロックです。ウェブサイトやデータ提供者は、不正なトラフィックパターンを検出すると、該当するIPアドレスをブロックし、それ以上のリクエストを阻止するメカニズムを持っています。このようなIPブロックを効果的に回避するために、プロキシを活用する戦略は不可欠です。

## 2. プロキシの基本原理

プロキシは、ユーザーの実際のIPアドレスを隠し、リクエストを別のIPアドレスを介してルーティングする中継サーバーとして機能します。このプロセスを通じて、データ収集リクエストを複数のIPアドレスに分散させ、大量のトラフィックが特定のIPに集中することを防ぎ、ブロックのリスクを最小限に抑えることができます。

## 3. プロキシタイプの詳細分析

プロキシのタイプによって、パフォーマンス、匿名性、コストが異なります。各タイプは特定の状況に最適化されており、その特性を理解することが重要です。

**データセンタープロキシ (Datacenter Proxy):**
- 利点: 高速で、コストが安く、大量のデータを迅速に収集できます。
- 欠点: 特定のデータセンターIPレンジは検出されやすく、ブロックされるリスクがあります。
- 適した状況: ブロックのリスクが低い、またはデータ収集の速度が優先される場合。

**レジデンシャルプロキシ (Residential Proxy):**
- 利点: ISPによって提供される実際の居住地のIPを使用するため、トラフィックが実際のユーザーのものと見なされ、ブロックされる可能性が低いです。
- 欠点: コストが相対的に高く、データ収集の速度が遅くなることがあります。
- 適した状況: ブロックリスクが高いウェブサイトで、安定的かつ長期的なデータ収集が必要な場合。

**モバイルプロキシ (Mobile Proxy):**
- 利点: モバイルネットワークを介したIPを使用し、最も高いレベルの匿名性を提供します。非常に敏感なサイトでも安定してデータを収集できます。
- 欠点: コストが非常に高く、データ転送速度が遅いです。
- 適した状況: 非常に敏感なウェブサイトで、極めて慎重なデータ収集が必要な場合。

## 4. プロキシ回転 (Proxy Rotation) 戦略

IPブロックを効果的に防ぐためには、プロキシ回転戦略が必須です。プロキシ回転とは、複数のIPアドレスを定期的に変更しながら使用する方法であり、単一のIPに大量のトラフィックが集中しないようにすることを目的としています。

- プロキシプールの構築: 複数のプロキシIPアドレスを確保し、プール(Pool)として構成し、各リクエストごとに異なるIPを使用してリクエストを分散させます。
- 自動回転設定: 一定のリクエスト数や時間間隔に従って自動的にプロキシを変更するスクリプトを設定します。
- 多段階回転: プロキシ提供者の様々なIPプールを活用し、定期的にIPを変更することで検出の可能性を最小限に抑える戦略です。これにより、プロキシ使用パターンが一貫しないようにして、ブロックのリスクを減らす効果があります。

## 5. プロキシ利用時の考慮事項

プロキシを使用する際には、以下の要素を必ず考慮する必要があります:

- コスト効率: レジデンシャルおよびモバイルプロキシはコストが高いため、予算に合わせたプロキシ戦略を策定することが重要です。プロジェクトの予想データ収集量に基づいてコストを計算し、予算を管理する必要があります。
- 速度とパフォーマンス: プロキシを使用するとネットワーク速度が遅くなる可能性があります。特にレジデンシャルやモバイルプロキシはデータセンタープロキシよりも速度が遅いため、収集速度を考慮して使用する必要があります。必要に応じてリクエストを最適化し、パフォーマンスの低下を最小限に抑えることができます。
- 信頼性と安定性: 品質の低いプロキシは、簡単にブロックされたり、不安定な接続を提供する可能性があります。信頼できるプロキシプロバイダーを通じて信頼性のあるプロキシを使用することが重要です。

## 6. プロキシを活用したIPブロック防止の具体的な戦略

- 並列リクエストの管理: 一度に多くのリクエストを同じIPから送信しないように管理し、トラフィックが分散されるようにします。これにより、データ提供者が異常なトラフィックパターンを検出できなくなります。
- ランダム化された遅延時間の導入: 各リクエストの間にランダムな遅延時間を追加し、人間の活動パターンを模倣して、リクエストが自動化されたスクリプトから発生したものと見なされないようにします。
- セッションの持続性の維持: プロキシを介して維持されたセッションを活用し、繰り返しログインを求められることを減らし、それによって異常な活動と見なされる可能性を最小限に抑えます。これには、クッキーの管理やセッションの維持機能を活用できます。

## 7. 結論

プロキシは、大規模なデータ収集においてIPブロックの問題を解決するために重要な役割を果たします。適切なプロキシタイプを選択し、効果的な回転戦略を適用することで、IPブロックのリスクを低減し、安定的にデータを収集することができます。プロキシの使用には、コストとパフォーマンスのバランスを取ることが重要であり、これによってデータ収集プロジェクトの成功可能性を高めることができます。最適なプロキシ戦略を設計し、必要に応じてそれを調整することで、データ収集プロセスにおける障害を最小限に抑えることができます。
EKS 初期化関連コマンド諸々

```shell
EKS_CLUSTER=eks-cluster
AWS_REGION=ap-northeast-1
AWS_ACCOUNT_ID=123456789012

# kube config の設定更新
aws eks update-kubeconfig --name $EKS_CLUSTER --region $AWS_REGION

# クラスターのコンソールアクセス権限付与
eksctl create iamidentitymapping --cluster $EKS_CLUSTER --region=$AWS_REGION \
    --account $AWS_ACCOUNT_ID --no-duplicate-arns

# eks fargate 使う時、coredns の設定更新＆再起動
kubectl patch deployment coredns -n kube-system --type json \
    -p='[{"op": "remove", "path": "/spec/template/metadata/annotations/eks.amazonaws.com~1compute-type"}]'

kubectl rollout restart -n kube-system deployment coredns

# aws-auth configmap の確認
eksctl get iamidentitymapping --cluster $EKS_CLUSTER --region=$AWS_REGION

# aws-auth の編集
kubectl edit -n kube-system configmap/aws-auth
```
C#のソケット通信を誤解していた話

# サーバー側ではlistenよりもlistener

先週で及第点までは理解できた気でいた非同期ですが学び直すと抜けが多いこと。
それ以上に根本的に勘違いがあったので正解をペタリします。

サーバー側
```
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

public class TcpServer
{
    private TcpListener listener;

    public TcpServer(string ipAddress, int port)
    {
        IPAddress localAddr = IPAddress.Parse(ipAddress);
        listener = new TcpListener(localAddr, port);
    }

    public async Task StartListeningAsync()
    {
        listener.Start();
        Console.WriteLine("Server started. Waiting for a connection...");

        while (true)
        {
            TcpClient client = await listener.AcceptTcpClientAsync();  // クライアントの接続を待機
            Console.WriteLine("Client connected!");

            // 各クライアントを個別のタスクで処理
            Task.Run(() => HandleClientAsync(client));
        }
    }

    private async Task HandleClientAsync(TcpClient client)
    {
        NetworkStream stream = client.GetStream();
        byte[] buffer = new byte[1024];
        int bytesRead;

        try
        {
            while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) != 0)
            {
                string receivedData = Encoding.ASCII.GetString(buffer, 0, bytesRead);
                Console.WriteLine($"Received: {receivedData}");

                // クライアントにレスポンスを送信
                string responseData = "Message received";
                byte[] responseBytes = Encoding.ASCII.GetBytes(responseData);
                await stream.WriteAsync(responseBytes, 0, responseBytes.Length);
                Console.WriteLine("Sent: Message received");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Exception: {ex.Message}");
        }
        finally
        {
            client.Close();
            Console.WriteLine("Client disconnected.");
        }
    }

    public void Stop()
    {
        listener.Stop();
        Console.WriteLine("Server stopped.");
    }
}


```
【自分用メモ】Hacker NewsからRubyに関するニュースだけを取得するスクリプト

## はじめに

Hacker Newsというサイトにときどき目を通しています。

https://news.ycombinator.com/

閲覧するときはいつも、`Ruby`や`Ruby on Rails`といった単語で検索しているのですが、いちいち面倒です。

そこでAPIを用いて簡単に取得できるスクリプトをRubyで書きました。

## Hacker Newsから特定の単語で検索するスクリプト

下記が実際のスクリプトです。

過去24時間に投稿された、`Ruby`という単語を含むニュースを取得しています。


```ruby:sample.rb
require 'net/http'
require 'json'
require 'uri'
require 'time'

# Hacker News APIのURLを作成
def search_hacker_news(query)
  # クエリに前後のダブルクオートを追加して完全一致を狙う
  exact_query = "\"#{query}\""
  
  # 実行時点から過去24時間のタイムスタンプを計算
  current_time = Time.now
  past_24_hours_time = current_time - 24 * 60 * 60
  past_24_hours_unix = past_24_hours_time.to_i

  # クエリパラメータをエンコード
  params = {
    query: exact_query,
    tags: "story",
    numericFilters: "created_at_i>#{past_24_hours_unix}"
  }
  encoded_query = URI.encode_www_form(params)
  uri = URI("https://hn.algolia.com/api/v1/search_by_date?#{encoded_query}")

  # HTTPリクエストを送信
  response = Net::HTTP.get(uri)

  # JSON形式のレスポンスをパース
  data = JSON.parse(response)

  # 結果を表示
  data['hits'].each do |item|
    post_time = Time.at(item['created_at_i']).strftime('%Y-%m-%d %H:%M:%S')
    puts "Title: #{item['title']}"
    puts "URL: #{item['url']}"
    puts "Posted at: #{post_time}"
    puts "-----------------------------"
  end
end

# 検索クエリとして 'Ruby' を指定して検索
search_hacker_news('Ruby')
```

URLをベタ書きしていたり例外処理がなかったりなど問題は多数ありますが、まずは疎通確認ができればいいやの精神でいったん雑に書き切りました。

このスクリプトを実行してみます。

```bash
$ ruby sample.rb
Title: Alpine.js for Ruby on Rails Developers: Simplifying Front End Development
URL: https://alexsinelnikov.blog/alpinejs-for-ruby-on-rails-developers-simplifying-frontend-development
Posted at: 2024-08-15 18:45:29
-----------------------------
Title: Simple Benchmark of Ruby HTTP Clients – Faraday,Http.rb,Httpx,HTTParty,Typhoeus
URL: https://gist.github.com/kalicki/f7bd15efedd1067c351248fd2f49634e
Posted at: 2024-08-15 02:36:22
-----------------------------
Title: An Introduction to HTTP Caching in Ruby on Rails
URL: https://blog.appsignal.com/2024/08/14/an-introduction-to-http-caching-in-ruby-on-rails.html
Posted at: 2024-08-14 22:51:56
-----------------------------
```

無事に取得することができました！

## おわりに

このスクリプトを自動で毎日1回実行して、取得結果をメールなどに送信する仕組みが構築できれば、作ること自体が勉強にもなるし情報収集も効率化できるので一石二鳥ですね。

OpenAIのAPIなどを使い記事の内容を日本語で要約したものを配信しても良さそうです。

そのためにまずはベースURLの定数化や例外処理を追加といったリファクタリングをする必要がありますね。

アイデアが膨らんできたので、コツコツ進めてみようかなと思います。

## 参考資料
https://hn.algolia.com/api
ChromebookにAWS CLIをインストールする

# AWS CLIをインストールする
以下の公式ページのガイドを参照し、インストールしてください、
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

# IAMユーザーのアクセスキーを作成する
IAMのユーザーをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/71ac8a15-aa32-93dd-1db4-dcdef1b2b66b.png)
　
IAMユーザーの一覧が表示されます。
アクセスキーを作成するIAMユーザーをクリックしてください。
　
IAMユーザーのページが表示されます。
セキュリティ認証情報タブを表示してください。
アクセスキーの[アクセスキーを作成]をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/222eb452-84e2-cb86-749b-79965e58cd38.png)
　
アクセキーを作成ページが表示されます。
[コマンドラインインターフェース(CLI)]を選択し、[次へ]をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/1094fe32-3ef3-f862-5b0a-bea7a794ae5f.png)
　
 説明タグを設定-オプションページが表示されます。
 [アクセスキーを作成]をクリックしてください。

 アクセスキーを取得ページが表示されます。
 [.csvファイルをダウンロード]をクリックしてください。

ダウンロードが終わりましたら、[完了]をクリックしてください。　

# AWS CLIの初期設定を行う
以下のコマンドを入力してください。
```
aws configure
```

Access Key IDとSecret access keyを入力してください。
Access Key IDとSecret access keyは、前述でダウンロードしたCSVファイルに書かれています。
Default region nameは、[ap-northeast-1]と入力してください。(東京リージョンになります。)
Default output formatは、[json]と入力してください。必ず小文字で入力してください。

以上です。
pythonのwebdriverを使っていたところOSErrorが出た件

# エラー内容
毎日のようにbatファイルからpythonをタスクスケジューラ実行しているのですが、先日いきなりこのようなログが返ってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480692/f368ee41-e555-5b28-7520-bc6df85853ed.png)

OSError:[WinError 193] %1　は有効なWin32アプリケーションではありません。

# 対処方法
Webdriverで困ったときはだいたいツイッターで検索して対処法を探すのですが、
今回もツイッターで既に対応方法を書いている方がいらっしゃいました。

https://x.com/alt_ego_project/status/1817923781748535785

最新版のアップデート
pip install webdriver_manager --upgrade

よく分かりませんが、こちらを実行すると問題なくpythonがまた実行できるようになりました。

私ももっとwebdriverへの知識を深めないといけないですね。。
【React】たにぐちまことさんのReact入門備忘録

# はじめに
たにぐちまことさんのReact入門を拝見させていただきましたので、自分なりの備忘録としてまとめました。とてもためになる動画を配信していただき、ありがとうございます。

https://t.co/CCaqMGQRH3

# 基本事項
- sampleという名のReactのプロジェクトを作成
`$ npx create-react-app sample`

- サーバを起動
`$ npm run start`
（`$ npm start`でも良い。これは上記のエイリアス。）

- babelがないとJSXが使えないが、`create-react-app`すればJSXが使えるようになる

- JSXでは、class属性は、`className` と書かなければならない

- JSXの中でJavaScript部分の変数や関数を使う場合は、`{}`で囲えば良い

- JSXで属性値にJavaScript部分の変数や関数を設定する時は、""は不要。{}で囲むだけで良い

- Bootstrap などを使いたい時は、プロジェクトディレクトリ -> public -> index.html にCDNをおけば良い。これがテンプレートだから。ゆえに、これの body -> divタグ の中にJSXで書いたものが入れ込まれる

- src -> Apps.js の内容が実行される

- Apps.js に次のインポート文を追加する
`import React from 'react’;`

# コンポーネント
- `React.Component`を継承したクラスが、コンポーネントとなる

- コンポーネントを使う時は、`<Hoge />` のようにする

- コンポーネント中で次のメソッドが返す値が画面に出力される
`render() { return 出力する内容をJSXで書いたもの }`

- 出力内容にタグの入れ子がある場合は、()で内容全体を囲う必要がある

- タグを並列して出力はできない。一番外側を一つのタグで囲む(例えば`<div>`)

# ステート
- Reactがステートを監視してくれて、`setState()`を呼び出すと、Reactが自動的に画面を書き換えてくれる

- ステートは、コンポーネントのコンストラクタ内で次のように定義する
`this.state = {fuga : foo};`

- コンストラクタの引数に、例えば`props`を渡す

- コンストラクタでは、最初に`super(props);`を記述する

- コンポーネントのメソッドで`setState()`を使うなら、コンストラクタの中でメソッドをバインドする。
`this.bar = this.bar.bind(this);`

# ルーティング
- URLを変更した時にどういう動きをするかを決める機能をルーターなどと呼ぶ

- ルーターの機能をインストール
    -`% npm i -S react-router-dom`
        - `npm` -> Node Package Manager（Node.jsのパッケージ管理）
        - `i` -> install
        - `-S` -> --saveのショートハンド

- ルーティングのAppの中、記述方法が変わっている模様
    - `$ npm list --depth=0`でreact-router-domのバージョン確認
    - `react-router-dom@6.26.0` v6だった
    - 記述を変更
        - `<Route>`を`<Routes></Routes>`で囲む
        - `exact` を削除
        - `component`部分 を `element={<Home />}` に変更

https://t.co/bWT4DKDRIB

- Link
    - Reactでは、`<a>`タグの代わりに`Link`の機能を使った方がいい
    - `<Link to="URL">hoge</Link>`
    - URLが複雑になったときにスムーズに作れる機能を利用できる

- Routeのパラメータ
    - Routeのpathにパラメータを埋め込むことができる
    - 例えば、blogの各記事のページをid（数字）で管理している時などに利用する。ページの数が増えて複雑になったとき、ひとつひとつ`<Route>`を記述するのは現実的でないから
    - `path="/blog/:id"` のようにパラメータ名の前に`:`をつける
    - パラメータは文字列として渡される
    - コンポーネント内でパラメータを利用する方法

```js
const { id } = useParams(); //URL中にidというパラメータがあれば受け取る
return <p>{id}番目の記事</p>; //{id}の部分がパラメータの値となる
```

https://t.co/QZFObbBxf2

# Reduxを用いたステート管理
- ページ遷移する際に、何らか値を保持し、次のページへ渡すための処理
- Redux がよく使われる
- React-Reduxという版がある
- 素のReduxではなく@reduxjs/toolkit を使うことが推奨されている

https://t.co/U1I1yqu4hK

:::note info
以下は素のReduxでの内容
:::

- Reduxで行いたい処理を関数で書く際は、状態を表すパラメータ(名例:`state`)と`action`を引数に渡す。その関数の中でswitch文を使い、`action.type`の値によってやりたい処理を分ける
- 関数を`createStore()`の引数に渡し、返り値を変数(名前は`store`など)に格納しておく
- `store`の`dispatch()` メソッドに、オブジェクトとして`{type : type名}`を渡して実行すると、上記の行いたい処理を呼び出すことができる
- Storeという場所に値が保持されており、その値は、`store`の`getState()`メソッドで得ることができる

# Reducerの処理が２回実行される
## 原因の調査
- １ずつインクリメントしたい値が２ずつインクリメントされていたため、原因を調査
- 正しい仕様だった。Reactは、Reducerを意図的に２回実行する模様
- バグを減らすためにReducerを純粋関数とすることが推奨されており、純粋関数でなければ、引数が同じ場合でも違う結果が返されるため、バグを早期に発見することができる
- 本番環境では、実行は１度。２度実行されるのは開発環境のときだけ

https://t.co/LYwfYjx1Zp

https://t.co/iv8DxOpB9Y

## 純粋関数
- 引数が同じ場合、常に同じ返り値となる。（参照透過性）
- 副作用（関数の外への影響）が発生しない
- 上記を満たす関数のこと。意図しない挙動をさせないための技術

https://t.co/bNLlbvRhsD
Javaで「CASE_INSENSITIVEフラグ(大文字と小文字を区別しない)」の動作を確認してみた

# 概要

Javaで「CASE_INSENSITIVEフラグ(大文字と小文字を区別しない)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/regex/index17.html

# 実装

以下のファイルを作成しました。
```JSample17_1.java
import java.util.regex.*;

class JSample17_1{
  public static void main(String[] args){
    String[] target = {"apple", "Apple", "APPLE"};

    String regex = "apple";
    Pattern p1 = Pattern.compile(regex);

    for (int i = 0; i < target.length ; i++){
      Matcher m = p1.matcher(target[i]);
      System.out.println(target[i] + ":" + m.find());
    }

    System.out.println("---- ----");

    Pattern p2 = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);

    for (int i = 0; i < target.length ; i++){
      Matcher m = p2.matcher(target[i]);
      System.out.println(target[i] + ":" + m.find());
    }
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample17_1.java 
$ java JSample17_1 
apple:true
Apple:false
APPLE:false
---- ----
apple:true
Apple:true
APPLE:true
```

# まとめ

何かの役に立てばと。
AtCoder 勉強記録[C++] その50

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## B - Sandwich Number
[B - Sandwich Number](https://atcoder.jp/contests/abc281/tasks/abc281_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<int>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  string s;
  cin >> s;
  bool jud = true;
  if(!isupper(s[0])) jud = false;
  string S = s.substr(1, 6);
  if(s[1] == '0') jud = false;
  for(int i = 1; i <= 6;i++){
    ll tmp = s[i] - '0';
    if(tmp<0||9<tmp) jud = false;
  }
  if(!isupper(s[7])) jud = false;
  if(jud) cout << "Yes" << endl;
  else cout << "No" << endl;
}
```
### 解法
1文字目と8文字目が大文字、その間の文字列が数字であり、2文字目が0以外であるかを判定することで結果が求まる。
## B - Let's Get a Perfect Score
[B - Let's Get a Perfect Score](https://atcoder.jp/contests/abc282/tasks/abc282_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<int>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n, m;
  cin >> n >> m;
  vector<string> s(n);
  rep(i, n) cin >> s[i];
  ll res = 0;
  for(int i = 0; i < n; i++){
    for(int j = i+1; j < n; j++){
      vector<bool> jud(m, false);
      bool ok = true;
      if(i == j) continue;
      for(int k = 0; k < m; k++){
        if(s[i][k]=='o') jud[k] = true;
        if(s[j][k]=='o') jud[k] = true;
      }
      for(int k = 0; k < m; k++){
        if(!jud[k]) ok = false;
      }
      if(ok) res++;
    }
  }
  cout << res << endl;
}
```
### 解法
2人が解ける問題を判定する`bool`型配列を用意しておき、2人がすべての問題を解ける場合をカウントすることで結果が求まる。
【AWS】aws cli実行時にYou must specify a region. You can also configure your region by running "aws configure".となる

## やったこと

こちらの記事にあるEC2の一覧を取得するaws cliコマンドを実行した

https://qiita.com/Raccoon-san/items/497fb3ba49bcf870e4e6

## エラー内容

> You must specify a region. You can also configure your region by running "aws configure".

すでに `aws configure` コマンドでクレデンシャルは設定していたため、原因がよくわからなかった

```
# ルートディレクトリで実行
: ~ $ cat .aws/credentials 
aws_access_key_id = xxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxx

: ~ $ cat .aws/config
[profile xxxx]
region = ap-northeast-1
output = json
```

一度.awsフォルダを削除して再度 `aws configure`　コマンドを実行しても結果は変わらなかった

## 原因

profileオプションを指定していなかったこと

aws configureコマンドを実行するときに--profile <プロファイル名> でプロファイルを指定しないとprofile名が「default」になる
また、aws cliコマンド実行時にprofile名を指定しないと、defaultプロファイルでコマンドを実行する

```
$ aws configure
AWS Access Key ID [None]: xxxx
AWS Secret Access Key [None]: xxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json

$ cat .aws/credentials 
[default]　👈 profile名がdefaultになる
aws_access_key_id = xxxx
aws_secret_access_key = xxxx

$ cat .aws/config
[default]　👈　profile名がdefaultになる
region = ap-northeast-1
output = json
```

この状態でaws cliコマンドを実行すると問題なく実行できる
自分の場合、defaultを使用せず、profile名を指定してクレデンシャルを設定していた
しかし、profile名をcli実行時に指定していなかったため、コマンド実行に失敗していた

## 対応
aws cli実行時にprofile名も指定する

```
$ aws ec2 describe-instances --output=table ... --profile xxxx
```
PixAIを使用する時のメモ

忘れないように書いてるだけです。
随時更新

# Prompt

## 品質を上げる

```
high resolution, extremely detailed CG, cinematic lighting, dynamic lighting, 
High quality, Ultra detailed, best quality, insanely detailed, beautiful, masterpiece, absurdres, highres
```

どれが効果あるかはわからないので、いつか調べる。

## 猫耳

- 基本
   単に猫耳を生やしたかったら `cat ears` または `nekomimi`
   <img width="128" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475132/27bccca3-cb7b-b8c5-42ac-f1bcdaa250a8.png">


- 猫耳カチューシャ
   `nekomimi headband`。上手くいけば画像のようなやつが生成されるが、しばしば猫耳とカチューシャが分離してしまう。
   <img width="128" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475132/a7ae90ee-837c-bda5-e43a-55d1fa51b366.png">

    `fake cat ears`
- 猫耳ヘッドセット
   `nekomimi headphone`とすると生成されるようだが、あまりうまくいかない(下図)
   <img width="128" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475132/74d4a1bf-d7df-69ab-ccfb-e17c9e7d1830.png">

- 猫耳フード
   `nekomimi hood`。かわいい。
   <img width="128" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475132/8f1ff67f-a774-3aaa-1ea0-622e7ba72ce1.png">


## 文字を書く

簡単なアルファベットだけなら、何度かトライすると結構書ける。日本語はできなかった。

```
1girl, solo
(white T-shirt with the word ‘HOGE’ printed in black font on the chest)
```

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475132/635293c4-c46c-4d89-7870-eae05b74bc3d.png" />


# LoRA

## 手の指を上手く書きたい

Hand Perfect使ってる。

https://pixai.art/model/1617770267665551590

- Prompt
    ```
    nice hands, perfect hands
    ```

- Negative prompt
    ```
    (extra fingers, deformed hands, polydactyl:1.5)
    ```

## ピストルを構える

「こちら(viewer)に向かって撃つ」ために以下のLoRAを追加している

https://pixai.art/model/1629973045912686383

- Prompt
    ```
    aiming at viewer, handgun, holding pistol
    ```

前述の`Hand Perfect`と併用するとよい。
foobar2000のSearchで全曲表示に戻らなくなった時の対応

# 現象

『Library』の『Search』で…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/bb0623ff-3d71-79d7-fa2d-b050749c3cd5.png)

『Media Library Search』を表示して検索したところ、身に覚えの無い3曲だけになってしまった…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/16901b65-6c5d-215c-eaec-f2fea448b74d.png)

# 対応

『File』の『Preferences』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6b734b61-aa6b-7c65-2042-197fdbf29221.png)

『Media Library』の『Music folders』がおかしかったです。

まず、身に覚えの無い3曲が格納されている不要なフォルダーパスは『Remove』。
（この『不要なフォルダーパス』はインストール or コンポーネント追加時に設定された初期値のままだったのかな？）

そして、自分が音楽ファイルを格納している正式なフォルダーパスを『Add』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0648ebc0-b2d7-5b6b-e62c-00c7a5cacbb8.png)

「とにかく全曲表示したい」時は『Media Library Search』で ```ALL``` で検索。
検索の文字列は大文字小文字を区別するので注意。（ ```all``` や ```All``` ではなく ```ALL``` ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/04b796d0-db0b-3afb-c5aa-9dd3640f416b.png)

# 参考サイトさん

https://foobar2000.xrea.jp/?Query+syntax#l48e7bf6

# バージョン

Microsoft Windows [Version 10.0.22631.4037]
foobar2000 v2.1.5 [×64]
GodotをVisualStudioでデバッグする為のメモ

# GodotのC#で実装する時にどうやってデバッグすればよいのか？

C#で開発している人が少ないのか情報が余りないので結構悩みました。
不幸な人が少しでも減るようにメモを残しておきたいと思います。

## 手順が多めでお腹いっぱいになります

1. GodotのIDEでエディタをVisualStudioを使用するように設定する
    ![m01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322199/546e90f6-a517-69a1-83e9-c861c69165f0.png)
    ![m02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322199/c5ff8fb6-6c8d-5e4a-15fa-1d5b08913a66.png)

1. VisualStudioのプロジェクトを作成する(.sln + .csprojの作成)
    ![m03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322199/72363cb6-ff6d-108c-c161-897170cbae45.png)

1. VisualStudio側にGodot用のプラグインをインストールする
[https://github.com/godotengine/godot-csharp-visualstudio/releases](https://github.com/godotengine/godot-csharp-visualstudio/releases)
[記事作成時の最新版のvsix](https://github.com/godotengine/godot-csharp-visualstudio/releases/download/v2.0.0/GodotAddinVS.vsix)
インストールの詳しい仕方は割愛(大抵はの人はダウンロードしたファイルをダブルクリックでインストールできると思います)

1. サンプルのC#のコードを作成
    ![m04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322199/9b200668-8601-5241-ca4e-4654820e21ef.png)
    ![m05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322199/db74f78d-7332-d7da-4525-2a43305d22a5.png)

1. アタッチされたソースの項目を選ぶとVisualStudioが起動し、デバッグプロパティを開く
    ![m06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322199/06a011bb-a4c8-2f96-cabb-a75edb12f95e.png)


1. 新しく実行可能なプロファイルを作成する
    ![m07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322199/9131a279-2a23-621b-c19a-6ee89c0087f1.png)


1. 作成したプロファイルの名前を分かりやすいものに変更し、以下の設定を入力する
    ![m08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322199/0ab3cbae-f734-0d59-eb35-c65593f87769.png)
- 実行可能ファイル
godotの実行ファイルのファイルパス
:::note warn
.net対応のgodotかどうかは必ず確認してください
ファイル名にxxx_mono_xxx.exeとあるものが.net対応版です
:::
- コマンドライン引数
    ```
    --path . --verbose
    ```
- 作業ディレクトリ
    ```
    .
    ```
:::note warn
何故か、カレント(.)を指定しないと上手くいかないようなので記述してください
:::

８. 実行するプロファイルを先ほど作成したプロファイルに変更し、ブレイクポイントを設定しデバッグ実行する

![m09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322199/dfc36287-e0ec-a1f3-114a-a3ab4fb5bac3.png)

９. アプリが起動し、デバッグできるようになる！
![m10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322199/d25e12ab-f09a-624a-467c-5fee36a76476.png)

準備は大変ですが、結構快適に動作する感じなので結構捗ります。
というか、Godot側のエラーはコンパイル後の名前で表示されるのでどこで問題になっているか
いまいち分かり難く作業が進みません。
設定自体は、大変ですが一度設定すれば良いだけなので一度お試しください。
CaImAn(Ca イメージングの解析ツール)の使い方その１

今回はCaImAn(Python版)のインストールからdemo用のnotebookを実行するところまでの手順を説明していきます。(github: https://github.com/flatironinstitute/CaImAn)

## 実行環境
- ubuntu 22.04 LTS
- pyenv　(python version管理用)
- mambaforge 　(新しくインストールする場合はminiforgeを推奨)
- CaImAn v1.11.3
- Visual Studio Code

(ubuntu 24.04でも動くとは思いますが、動作確認はしておりません。)

## 環境構築
ubuntuとVisual Studio Code(VScode)がinstallされていることを前提に進めさせていただきます。windowsユーザーはwsl2でubuntuをinstallしてください。

### pyenvのinstall
pyenvの依存関係のパッケージのinstall
```
sudo apt update
sudo apt install build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl git \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
```
pyenvをgithubからclone
```
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```
パスを追加
```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
```
pyenvの動作確認(version情報が出れば良し)
```
pyenv --version
```

### miniforgeのinstall
pyenvでinstallできるminiforgeのバージョンを検索
```
pyenv install --list |grep miniforge
```
一番下に表示されたバージョンをinstallする(バージョンは適宜変更)
```
pyenv install miniforge3-23.11.0-0
```

### CaImAnのinstall
開発用のディレクトリに移る
ディレクトリがない場合は以下のコマンドで作成・移動
```
mkdir dev && cd dev
```
CaImAnのcloneと環境構築
```
git clone git@github.com:flatironinstitute/CaImAn.git
cd CaImAn/
pyenv local miniforge3-23.11.0-0
mamba env create -f environment.yml -n caiman
source activate caiman
pip install -e .
```
caiman managerのinstall
```
caimanmanager install --inplace
```
homeディレクトリ下にcaiman_dataディレクトリが追加されます
次はcaiman_dataディレクトリにあるdemo用のnotebookを実行してみます

## caiman_dataディレクトリ内のdemoを実行
VSCodeでnotebookを開く
```
cd ~/caiman_data/demos/notebooks
code .
```
VSCode上でdemo_pipeline.ipynbを開く
RUN all をクリック、python環境(CaImAn)を選択するとnotebookは実行される

## 次回
次回はCaImAnのパラメータ設定や実践的な運用方法などについて説明していこうと思っております。なにかご質問や間違いがありましたらコメントよろしくおねがいします。(時間があるときにもう少しわかり易いように修正したいと思っています)
Nginx で TCP と UDP のプロキシサーバーを作る

# はじめに
自宅サーバー (Minecraft) を公開するときに、自宅 IP を秘匿するためにプロキシサーバーをクラウドに組んでみました。そのとき、TCP と UDP の両方とも必要だったので、両方に対応した形のサーバーを建てた時の手順です。


# nginx をインストールする
https://doudonn.com/saba/2479/
```sh
apt update
vi /etc/apt/sources.list.d/nginx.list
```
nginx のソースを記載する
```/etc/apt/sources.list.d/nginx.list
deb https://nginx.org/packages/ubuntu/ jammy nginx
deb-src https://nginx.org/packages/ubuntu/ jammy nginx
```

キーを追加してパッケージを更新し、nginx をインストールする
```sh
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ABF5BD827BD9BF62 
apt update
apt install nginx
```

# nginx の設定を変更する
```
vi /etc/nginx/nginx.conf
```
```/etc/nginx/nginx.conf
# 省略

http {
# 省略
}

# 以下追記
stream {
    log_format proxy '$remote_addr [$time_local] '
                     '$protocol $status $bytes_sent $bytes_received '
                     '$session_time "$upstream_addr" '
                     '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

     upstream server_tcp { # 名前は自由
        server YOUR_SERVER_IP:PORT; # プロキシ先の IP と PORT
    }

    upstream server_udp { # 名前は自由
        server YOUR_SERVER_IP:PORT; # プロキシ先の IP と PORT
    }

    server { # TCP
        error_log /var/log/nginx/error_PORT.log debug; # ログファイル名は自由
        access_log /var/log/nginx/access_PORT.log proxy buffer=32k; # ログファイル名は自由
        listen PORT; # 開放するポート
        proxy_pass server_tcp; # upstream 名にプロキシする
        proxy_timeout 60s;
    }

    server { # UDP
        error_log /var/log/nginx/error_PORT.log debug; # ログファイル名は自由
        access_log /var/log/nginx/access_PORT.log proxy buffer=32k; # ログファイル名は自由
        listen PORT udp; # 開放するポート
        proxy_pass server_udp; # upstream 名にプロキシする
        proxy_timeout 60s;
    }
}
```

## nginx.conf の syntax を確認する
```sh
nginx -t
```

## nginx の再起動
```sh
systemctl restart nginx
```

# iptables のポート開放を行う
```sh
vi /etc/sysconfig/iptables
```
```conf
# 開放したいポートを指定して追記する
# PORT 部分を書き換える
-A INPUT -p tcp -m tcp --dport PORT -j ACCEPT
-A INPUT -p udp -m udp --dport PORT -j ACCEPT
```
```
iptables-restore < /etc/sysconfig/iptables
```

# ルーター等のファイヤーウォールを設定する
後は各々の環境で、ルーターのファイヤーウォールなどに穴を開ける

# 以上！
お疲れ様でした！

# 参考
https://blog.yuki0311.com/minecraft-nginx-tcp-proxy/

https://qiita.com/yt0f1/items/3dc562a8e51ab90c5de2
クラウド版Confluenceを試す


## 始める方法

https://www.atlassian.com/ja/software/confluence

ここから２，３ぽちぽちするとすぐ始められる
## 最初に料金のページにいってfreeプランにしましょう。無料になります
→コンフルの画面に行く→右上の歯車→左メニューの請求→管理ボタン
この画面にたどり着く方法いくつかありそうです

最初はpremiumプランで始まり、7日間が無料期間ぽいです。ただし支払いの設定はしてないので、7日過ぎても利用停止になるだけだとは思う。

## UIの表記が英語なので日本語にしましょう。
※日本語で書いてますが、最初は英語です
→コンフルの画面に行く→右上の歯車→左メニューの請求→一般設定→下の方にいくと言語変える箇所が２か所あるので変えて保存
この設定では表示は変わりません。

→自分のプロフィールをクリック→上段メニューのアカウント環境設定→言語を直す
この設定で表示が変わります。

## h1などの見出しが他の見出しと識別しずらい


カスタマイズできないらしく。chromeのプラグインでやってみる

https://qiita.com/zrn-ns/items/2b3faf49be0de586b3bd

ここを参考にした。ただしこれは個人に適用される設定である

1. 適当なページを作る。見出しをh1-h5を使う
1. Chromeの拡張機能「Stylebot」をインストールします
1. CSSは以下を張り付ける。h1-h5の設定をした。CSSはAIに作らせます

```css
h1, h2, h3, h4, h5 {
  font-style: normal;
  font-weight: 600;
  color: #333333; /* デフォルトのテキストカラー以外の見出しに適用 */
  padding-top: 8px;
  padding-bottom: 8px;
  padding-left: 10px; /* テキストとボーダーの間にスペースを追加 */
  margin-left: 5px; /* 左側のマージンを追加して、文書のレイアウトを整える */
}

h1 {
  font-size: 1.8em;
  line-height: 36px;
  font-weight: 700;
  color: #FFFFFF; /* 文字色を白に */
  background-color: #000000; /* 背景色を黒に */
  border-left: none; /* h1の左のボーダーラインを削除 */
  border-bottom: none; /* h1の下線を削除 */
}

h2 {
  font-size: 1.6em;
  line-height: 32px;
  border-left: 4px solid #FFD700; /* 左のボーダーラインをゴールドに */
  border-bottom: 2px solid #FFD700; /* 下線もゴールド */
}

h3 {
  font-size: 1.4em;
  line-height: 28px;
  border-left: 4px solid #32CD32; /* 左のボーダーラインをライムグリーンに */
  border-bottom: 2px solid #32CD32; /* 下線もライムグリーン */
}

h4 {
  font-size: 1.2em;
  line-height: 24px;
  border-left: 4px solid #00BFFF; /* 左のボーダーラインをディープスカイブルーに */
  border-bottom: 2px solid #00BFFF; /* 下線もディープスカイブルー */
}

h5 {
  font-size: 1.0em;
  line-height: 20px;
  border-left: 4px solid #FF69B4; /* 左のボーダーラインをホットピンクに */
  border-bottom: 2px solid #FF69B4; /* 下線もホットピンク */
}

```


## 注意
confluence以外のJiraも適用されて困った。
→stylebot スタイルでURLを少し直すとconfluenceに限定できた。具体的には`wiki/spaces/*`を付け足した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131136/5a7deef4-91e6-3c9d-c53d-9f023a2e9897.png)
【Java】recordでCustom Constructorを実装する際に「Non-canonical record constructor must delegate to another constructor」のエラーが発生

## 概要
JavaのrecordでCustom Constructorを実装する際、[【Java】コンストラクタ](https://zenn.dev/miya_akari/articles/bdcf90b497ee69)の記事にあるように、classと同様の形式で以下のように実装したとします。

```java
public record LatLonResponse(double lat, double lon) {
    // Custom Constructorの実装
    public LatLonResponse(Double[] lonLat) {
        this.lat = lonLat[1];
        this.lon = lonLat[0];
    }
}
```

ただ、この実装だと`Non-canonical record constructor must delegate to another constructor`というエラーになります。ではどう実装すればよいかのメモ書きです。


## 前提
* 今回使用したJDKは`Corretto-21.0.3.9.1`になります。

## 対応
[Using record](https://davidvlijmincx.com/posts/using_record/)の記事で解説されている通り、Custom Constructorにおいてもcanonical（標準）なコンストラクタを呼んであげる必要があります。canonicalなコンストラクタは以下のように`this`で呼びます。

```java
public record LatLonResponse(double lat, double lon) {
    // Custom Constructorの実装
    public LatLonResponse(Double[] lonLat) {
        this(lonLat[1], lonLat[0]);
    }
}
```
id == とだけ書いてあるメソッド

## 初めに

疑問に思ったことや上手くいかなかったことのアウトプットをしています。
自分なりの理解でアウトプットしていきます。初学者なので誤りもあると思います。
その際はご指摘いただけると幸いです。

## 疑問に思ったコード
```
def own?(ob)
    id == ob&.user_id
end
```
idとだけ書いてあって、どのidかわからなかった。
このメソッドを例えば
```
current_user.own?(object)
```
と使った場合、current_user.id == object&.user_idで比較することになる。
id == object&.user_idとなるわけではない。

## 調べた結果
idとだけ書かれている場合、使うインスタンスのidがid ==のところに入る。
ローカルでfirecrawlを動かしてDifyに接続して遊んだ

## はじめに
Difyの機能としてfirecrawlというクローラーと接続してナレッジを構築できるようなのでやってみた。クローリングが出来ればデータ収集が楽ちんになりそうなので期待。

## firecrawlとは

所謂クローラー。指定したURLからWebサイトをクロールして、LLMが扱いやすいようなクリーンなmarkdown形式、または構造化データに変換してくれる。SaaS版とOSS版がある。今回は両方使ってみた。

## 構築手順

### Dify
前回の記事で作ったものを使用。省略。

https://qiita.com/yasu691/items/976ac89da27a24b3ad54

### SaaS版 firecrawlを使う方法
下記のページにサインアップする

https://www.firecrawl.dev/

API KeysページからKeyを発行する

https://www.firecrawl.dev/app/api-keys

Difyのナレッジを作成する際に「ウェブサイトから同期」を選択して発行したアプリキーを入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/15413b9d-a14a-9c06-34d0-c4421bd01d74.png)

Base URLには何も入れなくてOK
これで準備完了。

SaaS版は最大500回までクローリング出来る

https://www.firecrawl.dev/pricing

### firecrawlをセルフホストする方法

ここを参考にセットアップした。

https://zenn.dev/satto_sann/articles/d177f4cdc02755

OSS版のfirecrawlリポジトリ

https://github.com/mendableai/firecrawl

リポジトリからクローン
```
git clone https://github.com/mendableai/firecrawl.git
```

ディレクトリに移動して、`.env`ファイルをコピー
```
cd firecrawl
cp ./apps/api/.env.example ./.env
```

`.env`ファイルを編集。編集した環境半数は以下の2つ
- `TEST_API_KEY`: 任意のAPIキーを設定
    - `fc-XXXXXX`という形式であれば問題ない
- `USE_DB_AUTHENTICATION`: `false`に設定
    - データベース認証の有無だが、supabaseをセットアップして使用する必要があるみたいなので今回は不要

`.env`ファイルの編集が終わったらコンテナを起動
```
docker compose up -d
```

以下のコマンドで動作確認が出来る。`Hello, world!`と返ってきたらOK。
```
curl -X GET http://localhost:3002/test
```

firecrawlが起動出来たらローカルで起動しているDifyと接続する。

SaaS版と同様にナレッジの「ウェブサイトから同期」を選択して、firecrawlのセットアップをする。
そして先ほど`.env`に書き込んだAPIキーを入力。
Base URLには`http://host.docker.internal:3002`を入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/3247b873-652b-d471-f700-592d0df3f850.png)

`http://host.docker.internal`を指定すると、ホストマシン上で動作しているサービスにアクセスすることが出来る。Docker desktopの機能らしい。

### ナレッジの構築

firecrawlが接続出来たら実際にクローリングしてナレッジを構築してみる。
今回は`https://www.firecrawl.dev/`をクローリングして、サポートbotに使えそうなナレッジを作る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/0681b88d-ea8a-28c7-6db1-7590a2ac4433.png)

OPTIONSで、サブページのクロールや、最大クロールページ数制限、クロールするページの階層の深さなどが設定できる。SaaS版を使用している場合は特にページ数制限をしておいた方が良いが、今回はOSS版で回しているので好き放題クロールしてもらう。

するとこんな感じでクロールの結果が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/11b5fb01-0ece-0c4c-7650-d77cf7852af2.png)

後はいつも通り、チャンキングやembeddingの設定をして終わり。

## おわりに
思ったより簡単に出来た。とても嬉しい。
これをDifyと合わせてAzure上で動かしたりしたいが、まだ完全にセルフホストが出来る訳ではないような文章がfirecrawlのREADMEに書いてあったので、出来なさそう。今後に期待。
AWS上の商業用WEBアプリケーションでONにしておくべきセキュリティ機能7選

## 概要

AWSにはセキュリティを高める為の機能で、ほとんど設定不要、ボタンポチだけでセキュリティを向上出来る機能が複数存在します。一応値段が無料だったり、そこまでお金がかからない(月々行って数千円程度)ものをピックアップしています。今回はそのプラクティス含め紹介します。

## AWS WAF

:::note
AWS WAF はお客様が定義する条件に基づきウェブリクエストを許可、ブロック、または監視 (カウント) するルールを設定し、ウェブアプリケーションを攻撃から保護するのを助ける Web アプリケーションファイアウォールです。
:::

とりあえず、ボタンポチだけでもそこそこ機能してくれます。一般的なWEBアプリケーションであれば、追加でSQLやLinuxコマンドを含むようなトラフィックも監視しておくことをおすすめします。

詳しくはコチラの記事に色々まとまっています。

https://qiita.com/satofujino/items/6920ca45aa1341056db0

## GuardDuty

:::note
Amazon GuardDuty は、AWS アカウントとワークロードを継続的にモニタリングして悪意のあるアクティビティがないかを確認し、可視化と修復のための詳細なセキュリティ検出結果を提供する脅威検出サービスです。
:::

誰かが勝手にS3のバケットを全体公開にしたり、EC2にトロイの木馬が仕込まれた怪しいトラフィックが検出されたりしたら、アラートを上げてくれます。

Slackなどに通知が届くように設定するのがおすすめです。

https://aws.taf-jp.com/blog/91181

## Inspector

:::note
Amazon Inspector は、ワークロードを自動的に検出し、ソフトウェアの脆弱性や意図しないネットワークへの露出を継続的にスキャンする脆弱性管理サービスです。Amazon Inspector は、Amazon EC2インスタンス 、Amazon のコンテナイメージECR、および Lambda 関数 を検出してスキャンします。Amazon Inspector は、ソフトウェアの脆弱性または意図しないネットワークの露出を検出すると、検出結果 を作成します。
:::

AWSにデプロイした環境のOSや各種アプリケーション(open sslとか)や各種モジュール等が古くなり、セキュリティ上の修正などが追いついていない場合、アラートを上げてくれます。また、ネットワークの設定がガバガバになっていたり、変なネットワークの露出がある場合もアラートを上げてくれます。

CI/CDツールで自動スキャンすると、割と良い感じになります。

https://docs.aws.amazon.com/ja_jp/inspector/latest/user/scanning-cicd.html

## CloudTrail

:::note
AWS CloudTrailは、AWS上で実行されるアクションやイベントを記録し、証跡を管理するためのサービスです。 証跡を残すことは、ユーザーの不正操作やシステムの異常な動作などが発生した際の原因究明に欠かせません。
:::

AWSのSecretが外部流出したり、社内に悪い人がいてAWS環境上で何かしら悪さをした場合の影響範囲確認や原因究明などに使います。

AthenaでSQLライクに使うと便利です。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/cloudtrail-logs.html

## AWS Config

:::note
AWS Configは、Amazon EC2インスタンスやセキュリティグループといったAWSリソースの設定を、記録、評価、監査できるサービスです。設定を記録しておけば、何らかのトラブルが発生したときに、設定に変更があったか、どう変更されたかを確認すれば、トラブル解決に役立つ場合があります。また任意の設定値をルールという形で保存でき、さらにルールと現在の設定を比較することもできるので、クラウド利用におけるコンプライアンス監査、セキュリティ分析などにも役立ちます。
https://cloudnavi.nhn-techorus.com/archives/3878 より
:::

割と色々でき、ボタンポチで、AWSが推奨するルール等に準拠するかを自動でチェックしてくれたりします。他にも、書いてあるとおりに、設定を記録して、もとに戻したい時などにも使えます。

## Security Hub

:::note
AWS Security Hub を使用すると、セキュリティのベストプラクティスのチェックを自動化し、セキュリティアラートを単一の場所と形式に集約し、すべての AWS アカウントで全体的なセキュリティの体制を把握することができます。
:::

今まで書いてきた系のアラートを一元管理するのがコチラ。とりあえずココに出てきたセキュリティ上問題がありそうなIssueを片付けていくことで、堅牢なシステムにすることが可能でです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293892/9f5a0c13-9504-7108-29a0-96d43a30391f.png)


## Compute Optimizer

:::note
AWS Compute Optimizer を使用すると、使用状況データに基づいて、Amazon Elastic Compute Cloud (EC2) インスタンスタイプ、Amazon Elastic Block Store (EBS) ボリューム、AWS Fargate の Amazon Elastic Container Service (ECS) サービス、AWS Lambda 関数、Amazonリレーショナルデータベースサービス（RDS）DBインスタンスの 5 種類の AWS リソースのオーバープロビジョニングとアンダープロビジョニングを回避できます。
:::

今までとは少し毛色が違いますが、要するに、必要以上にお金をかけているリソースや、逆に不足しているリソースをアラートして、コレくらいが妥当じゃない？とサジェストしてくれたりします。ボンタンポチっとしておいて、定期的に見直すだけで、不必要な出費が防げ、かなり良い感じです。