OmniAICreator/Qiita-1.07M huggingface dataset:
ECサイトへのサイバー攻撃による国内クレジットカード情報漏えいインシデントまとめ/2024年11月公表分

# 概要

- 2024年11月に公表されたクレジットカード情報漏えいインシデントのまとめです

# notes
- この月間に公表したものなので、各インシデントごとの被害発生期間は別です
- どの程度のインシデントと被害が月ごとに発生しているかの備忘録であり報道記事ではないので、原則として当事者法人等の個別具体的名称は書きません
- 被害に遭った可能性のある人には事業者等より個別に連絡があると思われます


# 当月の被害の概要

- 11月は、3件のクレジットカード情報漏えいインシデントが国内で公表されました
- 合計で、22,709件ほどのクレジットカード情報について漏えいの可能性があるそうです

# 当月のインシデント

## 1. 仏具等販売サイト

### 被害について
- 18,394件のセキュリティコードを含むクレジットカード情報漏えいの可能性があります
- クレジットカード情報の漏えい期間は、2021年4月7日～2024年5月29日とのことです
- 50,338件の個人情報の漏えいの可能性があります

### 経緯・原因等

- 2024年5月29日に、警察より漏えいの可能性の連絡を受けてインシデントが発覚したそうです
- 2024年6月3日に、不正アクセス被害によるクレジットカード情報含む個人情報漏えいの可能性があることについて公表しています
- 割賦販売法における、クレジットカード情報非保持化タイプと推測されます
- 原因は、当該サイトの脆弱性の放置と推測されます
- また、当該サイトの管理運用においてセキュリティ侵害を検知する仕組みが不足していたか存在していなかったため、被害発生期間が長期化した原因につながったものと思われます


## 2. 健康食品販売サイト

### 被害について
- 2,153件のセキュリティコードを含むクレジットカード情報漏えいの可能性があります
- クレジットカード情報の漏えい期間は、2021年3月5日～2024年5月21日とのことです
- 5,637件の個人情報の漏えいの可能性があります

### 経緯・原因等

- 日付非公表ですが、遅くとも2024年5月31日までに、警察より漏えいの可能性の連絡を受けてインシデントが発覚したそうです
- 2024年6月14日に、不正アクセス被害によるクレジットカード情報含む個人情報漏えいの可能性があることについて公表しています
- 割賦販売法における、クレジットカード情報非保持化タイプと推測されます
- 原因は、当該サイトの脆弱性の放置と推測されます
- また、当該サイトの管理運用においてセキュリティ侵害を検知する仕組みが不足していたか存在していなかったため、被害発生期間が長期化した原因につながったものと思われます


## 3. 宝飾品販売サイト

### 被害について
- 2,162件のセキュリティコードを含むクレジットカード情報漏えいの可能性があります
- クレジットカード情報の漏えい期間は、2021年6月28日～2024年5月30日とのことです
- 17,171件の個人情報の漏えいの可能性があります

### 経緯・原因等

- 2024年5月28日に、警察より漏えいの可能性の連絡を受けてインシデントが発覚したそうです
- 割賦販売法における、クレジットカード情報非保持化タイプと推測されます
- 原因は、当該サイトの脆弱性の放置と推測されます
- また、当該サイトの管理運用においてセキュリティ侵害を検知する仕組みが不足していたか存在していなかったため、被害発生期間が長期化した原因につながったものと思われます


# 感想

- 当月のインシデント件数・被害規模は、最近の傾向としては平均的だったと思います


# おまけ

## 「クレジットカード・セキュリティガイドライン」

- [経産省：「クレジットカード・セキュリティガイドライン [5.0版]」](https://www.meti.go.jp/press/2023/03/20240315002/20240315002.html)
- [(一社)日本クレジット協会:関連資料](https://www.j-credit.or.jp/security/document/index.html)

## 個人情報保護委員会
- [個人情報保護委員会](https://www.ppc.go.jp)
    - [個人情報保護委員会 - 個人情報保護法関連法令・ガイドライン等](https://www.ppc.go.jp/personalinfo/legal/)
    - [個人情報保護委員会 - 個人情報保護法相談ダイヤル](https://www.ppc.go.jp/personalinfo/pipldial/)
    - [個人情報保護委員会 - 漏えい等の対応とお役立ち資料](https://www.ppc.go.jp/personalinfo/legal/leakAction/)

## 割賦販売法関連
- [割賦販売法](https://laws.e-gov.go.jp/law/336AC0000000159)
- [割賦販売法施行令](https://laws.e-gov.go.jp/law/336CO0000000341)
- [割賦販売法施行規則](https://laws.e-gov.go.jp/law/336M50000400095)
- [経産省サイト - 割賦販売法](https://www.meti.go.jp/policy/economy/consumer/credit/11kappuhanbaihou.html)

## 経産省
- [クレジットカード・セキュリティ官民対策会議](https://www.meti.go.jp/shingikai/mono_info_service/credit_card_security/index.html)
(2024年4月9日〜)
- [クレジットカード決済システムのセキュリティ対策強化検討会](https://www.meti.go.jp/shingikai/mono_info_service/credit_card_payment/index.html)
(2022年8月4日〜2023年1月20日)
    - [クレジットカード決済システムのセキュリティ対策強化検討会 報告書](https://www.meti.go.jp/shingikai/mono_info_service/credit_card_payment/pdf/20230120_1.pdf)
    - [クレジットカード決済システムの更なるセキュリティ対策強化に向けた主な取組のポイント](https://www.meti.go.jp/shingikai/mono_info_service/credit_card_payment/pdf/20230120_2.pdf)
PAY.JPがサポートしてないElixirのライブラリをOSS開発することに

東京にいるfukuokaexのYOSUKEこと中尾瑛佑です。

今回は、PAY.JPについて記事を書くことにしました。早速アカウントを登録してドキュメントを確認したところ、UIの第一印象は「使いやすそう」でした。

ダッシュボードには、課金に関する必要最低限の情報が一目で分かるように整理されています。

この好印象な出だしに油断はできません。一般的に、開発に必要なドキュメントの整備や内容の質が重要だからです。ドキュメントを確認すると、これも読みやすく整理されていました。

ビジネス側の意図として、開発者を主なターゲットに、使いやすさを重視している様子が伺えます。課金周りの開発で有名なStripeやSquareの導入に苦戦している開発者向けに、より直感的な課金の仕組みを提供することを目指しているようです。

気になってホームページ　（ https://pay.co.jp/ ) を見てみると、目に飛び込んできたのは：

**「支払いのすべてをシンプルに」**

素晴らしいキャッチコピーと、それを実現するプロダクト。

開発チームとビジネスチームの連携が上手く機能している印象です。アジャイル教育に携わる身として、アジャイルな組織運営をしているのではと興味をそそられます。

ここまでは順調でしたが、重大な問題を発見しました。curl、Python、Ruby、PHP、Node.js、Java、Goはサポートされているのに、Elixirのライブラリがないのです！

これは作るしかありません。

![スクリーンショット 2024-11-29 17.39.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/7a267fe4-c459-f1ac-4a00-470d2d3f9bf7.png)

## 支払いのすべてをシンプルに
Elixir用の薄いラッパーを作ろうと思い立った際、このキャッチコピー「支払いのすべてをシンプルに」が頭をよぎりました。

Elixirのライブラリも、このコンセプトに沿って作る必要があります。

現在のライブラリの構成を確認してみましたが、すべての機能を実装しようとすると、ややブログが長編になるのでシリーズ化します。

そのため、この記事では完成を目指すのではなく、段階的に実装を進めていくことにします。

Elixirでサービスを作りたい方向けに、GitHubでMITライセンスのオープンソースとして公開します。普段はGitLabを使用していますが、オープンソースのリポジトリはGitHubの方が多くの方に利用していただきやすいと考えました。

## curlで試す

まずは動作確認のため、curlでAPIを呼び出してみます
```
curl https://api.pay.jp/v1/charges \
> -u sk_test_YOUR_API_KEY
Enter host password for user 'sk_test_YOUR_API_KEY': 
{
  "count": 0,
  "data": [],
  "has_more": false,
  "object": "list",
  "url": "/v1/charges"
}% 
```

この秘密鍵を使って取得できるJSONデータを、Elixirで扱いやすい形で取得できるシンプルな実装を目指します。ただし、記事が長くなりすぎるのを避けるため、詳細な実装はElixirのアドベントカレンダーで紹介させていただきます。

### 改善点について
エンジニア教育や教材作成に携わる立場から、いくつか気になる点を見つけました。「支払いのすべてをシンプルに」というコンセプトに沿って、改善案を提案させていただきます。
APIキーの表記について、現在は「テスト秘密鍵」「テスト公開鍵」という表現が使われています。一方、ドキュメントでは「テスト用のキー」や「パブリックキー」「シークレットキー」といった異なる表現が混在しています。

![スクリーンショット 2024-11-30 8.25.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/6d1708f6-fe50-ae3d-bfaf-a3742f2ec5ca.png)

![スクリーンショット 2024-11-30 8.28.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/ce3f5075-7e7b-79c0-b51c-ce3f1c9d94c5.png)

この「表記揺れ」は、特に初心者の方々に混乱を招く可能性があります。また、JSONオブジェクトの項目順序とドキュメントの解説順序に不一致が見られるなど、細かな改善の余地があります。これらの点を統一することで、より「シンプル」なドキュメントになるでしょう。

コンテンツディレクターをチームに加えることで、これらの課題に対応できるかもしれません。課金系サービスとして、StripeやSquareと差別化を図る上で、分かりやすい日本語のドキュメントは重要な競争力になると考えます。

最後までお読みいただき、ありがとうございます。続きはElixirのアドベントカレンダーで紹介していきますので、興味のある方はぜひそちらもご覧ください。

ElixirでPAY.JPのライブラリ作成シリーズ①

https://qiita.com/Yoosuke/private/1e0cd94520bf526c049a
起業するならElixirシリーズSTEP3. 顧客を見つけろ

## 課題を探せ

**課題発見の重要性**
Missionを定めることができたのは、様々な経験を積んできたからこそです。これから起業を目指す方は、自己理解と並行して「課題」の探索に取り組むことをお勧めします。

**価値ある課題とは**
- お金を出してでも解決したい課題であること
- 個人的な問題ではなく、相当数の人々が抱える課題であること
- 社会課題であっても、具体的な人々の問題として捉えられること

**真の課題の見つけ方**
世の中には多様な企業が存在し、それぞれが異なる課題解決に取り組んでいます。しかし、真の課題とは往々にして、人々が明確に言語化できずに抱えている問題です。そのような課題を発見し、適切に言語化できれば、それだけで解決への大きな一歩となります。

**課題発見の具体的方法**
1. 観察すること
2. 傾聴すること
3. 「言語化できない悩み」を見つけ出すこと
4. それを適切に「言語化」すること

## 顧客を見つけろ

**仮説の検証プロセス**
課題を言語化したら、次のステップは潜在的な顧客の探索です。この段階では、特定した「課題」はあくまで仮説です。以下の点を検証する必要があります：
- 特定した課題が実在するものか
- 課題の言語化が適切か

**Elixirと起業の関係**
本連載は「起業するならElixirシリーズ」というタイトルながら、ここまでElixirについての言及が少なかったことをお詫びします。次回からはElixirに関する具体的な話題に移行しますが、まず最も重要な「作る前に売る」という原則を説明させていただきました。

**販売の本質**
- 販売とは課題解決の対価
- システムが完成していなくても、適切な課題解決提案であれば販売は可能です
- 実例：弊社では未完成のサービスに対して、既に購入の約束をいただいている案件があります

**起業における継続性**
これから起業する方が最初に考えるべきは、いかに継続可能な状態を作るかということです。具体的には
1. 仕事とお金が循環するサイクルの構築
2. 事前の十分な準備
3. 活動継続可能な資金の確保

次回からはElixirの具体的な話題に入りますが、改めて強調させていただきます
- まず課題を見つけること
- 顧客を確保してから開発を始めること
- 会社員の方は、十分な準備をしてからスタートすること

起業後の準備を前倒しで行い、活動継続可能な資金を確保しながら進めることが、成功への近道となります。
キャリアブレイクとは

# 初めに
キャリアブレイクという単語はご存じですか？自分もつい最近まで知らなかったのですが、期せずして自分が選んだ選択肢にキャリアブレイクという名前が付いていることを知りました。恐らく耳にしたことある人は少ないと思い、アドベントカレンダー初日はキャリアブレイクの説明から始めます。

# キャリアブレイクとは
キャリアブレイクとは仕事やキャリアの進行を一時的に中断する期間のことを指します。端的に言ってしまうと無職で休憩中です。仕事を辞めてしばらく働かない選択肢を取る人は以前からいたと思いますが、そう言う人が増えているからこそ名前がも付いたのかなと思いました。

# ネガティブな意味ではない
キャリアブレイクを調べる[withworkというサイト](https://media.withwork.com/article/1500)には、「ネガティブなニュアンスというよりは、長期的な休暇を通じて心身のリフレッシュやリスキリング、新しい経験を積むための時間を持つことが目的であり、その後のキャリアパスを見直す機会と捉えられることが多い」とありました。つまりただの無職期間というよりは、自分を見つめなおしたり、学びなおしたりする期間と捉えるのが良いと思います。

# とはいえ実際やる人は少ない
ネガティブな意味ではないとはいえ、基本多くの人にとって積極的に取る選択肢ではないと思います。実際、自分の周りでキャリアブレイクを選択する人間は今までほぼ見たこともないです。恐らく何もなく長めに休みを取るという選択肢は、良さげと思ってもリスクが大きすぎて普通は取らないと思います。自分も四半世紀働いても考えたことすらなかったです。

# 何故やらないか
基本勤勉な人であるほど、何もしないという選択肢を取ることには罪悪感や恐怖感があると思います。勤勉でないにしてもプラスな印象は持てないのが殆どの人の感覚に思えます。また現実問題として働かなければ収入はなくなり、そうなると食べていけない、生きていけないので選べないと思います。

# 収入は減ってもやる
でも、今回自分は敢えてその何もしない期間を作ることにしました。期間は今の所失業保険が出ている間を予定しています。自主都合で退職した場合、20年以上働いていていれば150日は失業保険が出ます。但し出るまでに会社を辞めて2ヶ月後からというルールがあるので、その間は収入ゼロですが、5ヶ月は働いている時よりは少ないけれど収入はあります。自分は一旦この期間を自分のキャリアブレイク期間として設定しました。

# もちろん不安はある
収入がゼロではないとはいえ、減ることに関して、そしてそもそも休むことに関して、もちろん不安はあります。それも小さくない不安です。では何故キャリアブレイクをするかですが、これに関しては何度考えてもロジカルにやろうと思った理由は説明できません（noteに[書いてみた](https://note.com/binnmti/n/na654f92c1643)けれどあまり理由にはなっていない。。）。

# キャリアブレイク中にやっていること
キャリアブレイクをやると決めた理由は説明できませんが、キャリアブレイク中にやっていることは、説明出来ます。やっていることの一つは勉強です。明日以降は自分がキャリアブレイク中にやっている勉強について書いていこうと思います。
import（ES6 Module）で使えるgamepad APIライブラリ「joypad.js」の紹介

この投稿はKDDIテクノロジーアドベントカレンダーの12/02分の記事です。
他の記事はこちらです。
https://qiita.com/advent-calendar/2024/kddi-technology

ゲームコントローラーいいですよね！

![controller.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/e1696ba9-59f3-e408-9e7a-51b34471a062.jpeg)

[Gamepad API](https://www.w3.org/TR/gamepad/)を使えばゲームコントローラーを直接Webアプリに繋げます。

とはいえ、流石に仕様通りにガリガリ書くのはちょっと面倒。
ということで、簡単に使えるようにするライブラリを紹介します。

### `import` で読み込みたいんじゃ。

実は結構前から [こちらの記事](https://qiita.com/youtoy/items/1cf1fe244d992456140f) を参考にして [gamecontroller.js](https://github.com/alvaromontoro/gamecontroller.js) を使っていました。

まー、人によって好みはあると思うんですが、ライブラリからライブラリを読み込む、などのモジュール化を進めようとすると、ES6 Moduleの`import`が使いたくなります。

gamecontroller.js はどうも ES6 Moduleの`import`に対応してなさそうなので、他を探そう。ということで探してみました。

[npm](https://www.npmjs.com)を探せばすぐ見つかりますね！

### [joypad.js](https://www.npmjs.com/package/joypad.js)

見つかったのがコレ。

Usageを見ると、ちゃんと ES6 Moduleでの利用方法が書いてあります。

```.js
import 'joypad.js'; // ES6`
```

よしよし。
ということで、使ってみます。

#### インストール

```
npm i joypad.js
```
で普通に入ります。

アプリケーションの設定がまだの方は、
```
npm init
```
で `package.json` を作っておくのをお忘れなく。

`./node_modules/joypad.js/dist/joypad.min.js`にインストールされます。


#### ロード

jsから、`import`で下記のように読み込みます。

```.js
import "your-install-path/joypad.min.js";
```

すると、`joypad`というオブジェクトが使えるようになります。

#### connect / disconnect の検知

接続検知は下記のように行います。

```.js
joypad.on("connect",(e)=>{
  console.log("name="+e.gamepad.id); // 接続されたゲームパッドのID(と書いてあるけど名前みたいな文字列)が入る
});
```

外され検知は下記のように行います。

```.js
joypad.on("disconnect",(e)=>{
  console.log("name="+e.gamepad.id); // 外されたゲームパッドのID(と書いてあるけど名前みたいな文字列)が入る
});
```
簡単ですね！

#### 注意

USBコントローラーでテストしてるんですが、USBポートにゲームコントローラーを接続した状態でアプリを起動しても、 `connect` イベントはまだ発行されません。
最初にコントローラーの何かのボタンを押した時に発行されるようです。（`connect`イベントと後述の`button_press`が同時に発行されます）

Gamepad API はBluetoothのコントローラーにも対応していると思いますが、そちらの挙動は未確認です。

#### ボタンプッシュ / リリース の検知

ボタンのプッシュ検知は下記のように行います。

```.js
joypad.on("button_press",(e)=>{
  console.log("name="+e.detail.buttonName); // `button_1`などのボタンの名前が入ります。
});
```

リリースも同様です。
```.js
joypad.on("button_release",(e)=>{
  console.log("name="+e.detail.buttonName); // `button_1`などのボタンの名前が入ります。
});
```
めっちゃ普通ですね！

### まとめ

[joypad.js](https://www.npmjs.com/package/joypad.js) を使えばWebアプリに簡単にゲームコントローラーを接続できます。
みんなで楽しいアプリを作りましょう！

私が書いたサンプルコードはこちら。（雑！）
https://github.com/tadfmac/joypad-test

いや、joypad.jsインストールしたら、普通に `/examples`見ればいろいろありますので、そっちも見た方が早いかな。
Security Hubで検知されたECSタスク定義のセキュリティリスクをSecrets Managerで解消する

AWS Security Hubを有効化したところ、ECSタスク定義に関連するセキュリティリスクがいくつか検知されました。

今回は「ECSタスク定義の環境変数にデータベースのパスワードが平文で含まれている」というリスクに対応しました。

## 問題の内容
デプロイワークフローで、データベースパスワード(`DB_PASSWORD`)をGitHub Secretsから読み込んで、`ecspresso`を利用してECSタスク定義の`environment`セクションへ渡していました。

機密情報をコードに直書きしていないので問題ないと思っていたのですが、Security Hubから「機密情報が平文でタスク定義に含まれている」という警告がきました。

### 環境変数に平文で含めていた設定例
GitHub Actionsのデプロイワークフローでは、次のように`DB_PASSWORD`を環境変数として設定し、それを`ecspresso`でデプロイ時にタスク定義へ反映していました。

#### GitHub Actions
```yaml
- name: Setup environment
  run: |
    echo "DB_PASSWORD=${{ secrets.DB_PASSWORD }}" >> $GITHUB_ENV

- name: Deploy to Company ECS service
  run: ecspresso deploy --config ecspresso.yml
  env:
    ENV: ${{ env.DB_PASSWORD }}
```

#### ECSタスク定義
`ecspresso`のテンプレートで以下のように、`DB_PASSWORD`を環境変数にそのまま渡していました。

```json
{
  "containerDefinitions": [
    {
      "environment": [
        {
          "name": "DB_PASSWORD",
          "value": "{{ must_env `DBPASSWORD` }}"
        }
      ]
    }
  ]
}
```

### 問題点
1. 平文の機密情報がタスク定義に含まれる
   - ECSタスク定義はAWS内部で保存されるため、アクセス権が適切に管理されていない場合や、デバッグログでタスク定義を出力してしまった場合などに、機密情報が漏洩するリスクがある

2. セキュリティのベストプラクティス違反
   - AWSの推奨では、Secrets ManagerやSSM Parameter Storeを利用して機密情報を管理し、タスク定義には参照情報のみを含めるべきとされている

## 解決方法
機密情報を平文で直接タスク定義に含めないように、Secrets Managerを利用して安全にパスワードを管理する方法に切り替えました。

### Secrets Managerの設定

#### 1. Secrets Managerにシークレットを登録
Secrets Managerに以下のようなシークレットを登録しました。

- シークレット名: `dev/app/mysql/db`
- 登録するキー/値の形式:
```
"DB_PASSWORD": "secure-password"
```

登録はコンソールかCLIから行えます。

#### CLIでの登録コマンド
```bash
aws secretsmanager create-secret \
  --name dev/app/mysql/db \
  --secret-string '{"DB_PASSWORD":"secure-password"}'
```

### ECSタスク定義の修正

#### 1. `secrets`セクションでSecrets ManagerのARNを参照
Secrets Managerを利用して、`DB_PASSWORD`を動的に取得できるように設定しました。

#### 修正後のタスク定義の例
```json
{
  "containerDefinitions": [
    {
      "name": "app-container",
      "secrets": [
        {
          "name": "DB_PASSWORD",
          "valueFrom": "arn:aws:secretsmanager:<region>:<account-id>:secret:dev/app/mysql/db:DB_PASSWORD::"
        }
      ]
    }
  ]
}
```

### ecspressoを使った場合
`ecspresso`ではテンプレートファイルでSecrets Managerを簡単に参照できます。`secretsmanager_arn`テンプレート関数を利用することで、手動でARNを記載する必要がなくなります。

#### ecspressoのタスク定義テンプレート例
```json
{
  "containerDefinitions": [
    {
      "name": "app-container",
      "secrets": [
        {
          "name": "DB_PASSWORD",
          "valueFrom": "{{ secretsmanager_arn `dev/app/mysql/db` }}:DB_PASSWORD::"
        }
      ]
    }
  ]
}
```

## IAMロール(タスク実行ロール)の設定
Secrets Managerの値を取得するには、ECSタスク定義で指定しているタスク実行ロールに適切な権限を付与する必要があります。

#### IAMポリシーの例
```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret"
      ],
      "Resource": "arn:aws:secretsmanager:<region>:<account-id>:secret:dev/app/mysql/db"
    }
  ]
}
```
【研修資料】AIを使ってCIを作ってみた

:::note warn
実際にノンプログラマー研修で使った資料をQiitaアドカレ用に編集したものである。
本稿はハンズオンがメインであり、座学が少ないのは資料中の解説が多いためである。解説パートは思い出しながら書いているため、漏れ抜けが多く生じている。
:::

:::note
著作権や公開権を含む諸権利は当方に帰属しているため、公開などによる問題はない
:::

## やること
https://qiita.com/nomurasan/items/32a0b3e8a9551b1b2152

## かかった時間
動作確認込み30分
自力で全部やろうとしたら2時間ぐらいはかかっているだろう。
加えて、コーディングのモチベーションがあまり高くないメンタル状態であり、そもそも深夜25時にやってるので能率も悪いはず。そう考えると同じ時間・タイミングで実施していたと仮定すると2時間で終わらなかった可能性は高い。

## やったこと
これはある程度プログラミング経験があったり、コーディングやシステム設計の知見があったのでできたことかな、と思ってる。

- 開発丸投げ
  - 出力されたコードをコピペして実行、エラーを投げ返す
- コードを読んで原因特定
- コピペでどうしても解決できない（エラーにはなっていないが問題が解決できない）場合、異なる方針やアプローチを検討し、AIにコーディングの指示を出す
  - いわゆるプロンプトエンジニアリング部分。文章を考えるだけでなく、問題点や課題を指摘しているため設計＋AIスキルが必要

## やらなかったこと
- コード
  - エラー調査
  - 原因調査
  - デバッグ
- AI
  - 凝ったプロンプトエンジニアリング
    - １プロンプトを書くのに20秒以上考えたり書く時間も使っていない
    - ただし、原因分析や検討し、試行錯誤した回数は8回/1時間
      - 闇雲にやっていたら更に試行回数は増えただろうし、時間もかかっているはず
  - RAGを使う、AIを選定する
    - 困ったらとりあえずperplexity
    - GitHub Copilotを使うべきだったが、有料はなるべく使いたくない気持ち…
- ツール
  - ブラウザのみ、GitHub上で完結
  - コマンド系、ローカル開発環境（Remote-VSCode含む）の使用を禁止（制限をかけたというより、使わずになんとかした）
  - もちろん、github.dev(ワークスペース)も未使用

## 追記・研修実施所感
AIを使うとコーディング能力はあまり大きな違いが出てこないんだろうな、と思った反面、AIをどうやって使うかは活用スキルが必要だし、AIと議論をしながら前に進めるには設計を含めた現場スキルがないとAIの誤りや問題点を指摘し、改善提案は難しい。
スキル０の人が学習目的に使う事はできるが、スキル０の状態で即戦力か？というと微妙だ。
これはIT業界だけでなく、他の業界でAIが使えたとしても即戦力にはならないだろうな、というのが正直な感想だ。
atcoder 計算量を減らすために（自分用問題記録・ruby）

# 計算量を減らすために
本記事は、主にatcoder c問題を解けるようになりたい私が計算量を減らせる工夫を記録していくのみです。忘備録です。
b問題までは、綺麗でなくとも問題文の通りに実装すればACとなるものが多買ったのですが、C問題の制約下では計算量がネックになりTLEとなるものが増えてきました。（2 * 10^5が二つとか、2 * 10^9とかでなんとなく察しはつくようになりましたが、どうやったら少ない計算で済むかは出てこない、みたいな。）

ということで、賢く計算量を減らすことが求められる問題で解けなかったものを、自分で解説できるようにということでこちらに随時記載していきます。

## AtCoder Beginner Contest 382 - C - Kaiten Sushi

N人のお客さんとM個のお寿司があり、お客さんにはそれぞれ美食度、お寿司にはそれぞれ美味しさがあります。
（お客さんは、美食度を上回る美味しさのお寿司がきたら食べる）

与えられるM個のお寿司について、食べるお客さんの番号を出力するというもの

https://atcoder.jp/contests/abc382/tasks/abc382_c

さて、お寿司をループさせ、毎回お客さんを先頭から見ていくことで一応誰が食べるかに辿り着きますが、これでは制約に間に合いません。
そこで、「自分の美食度より大きいおいしさのお寿司は食べてしまう」というお客さんの条件を利用し、計算量を減らした実装をしていきます。

（サンプル）

```ruby
N, M = gets.chomp.split(' ').map(&:to_i)
a_arr = gets.chomp.split(' ').map(&:to_i)
b_arr = gets.chomp.split(' ').map(&:to_i)
max_b = b_arr.max

r = max_b # 現状流れてくる最大値

ids = Array.new(r + 1, -1) # おいしさごと、誰が食べるか記録する配列

for i in 0...N do
  person = i + 1
  if a_arr[i] <= r
    (a_arr[i]..r).each do |j|
      ids[j] = person
    end
    r = a_arr[i] - 1
  end
end

b_arr.each do |b|
  puts ids[b]
end

```

ポイントは以下です。
```ruby
if a_arr[i] <= r
    (a_arr[i]..r).each do |j|
      ids[j] = person
    end
    r = a_arr[i] - 1
```

今回は、一番数字の近い人が食べるわけではなく、自分より数字が大きければその時点で食べてしまう（後ろの人には回ってこない）ということになります。

よって、最初の人から見ていき、自身の数字 ~ 回ってくる最大値まではすべてその人が食べるということになります。　(a_arr[i]..r)の部分ですね。
すると、後ろの人に回ってくるのは前の人の美食度よりもおいしさが少ないものとなるため、rの値を更新していきます。

うーん、賢いですね。。なるほど。
ACDLを提唱します。その23

# 概要
ACDLとは、アプリは、クラウド、大切なデータは、ローカルです。
素晴らしいアプリ見つけたので、plunkerに上げてみた。

# 参考にしたページ

https://www.catch.jp/program/p5.js/

# 機能
p5.jsをeval実行する。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/694c7d34-21c7-706e-98bb-1bcddfd561a5.png)


# 成果物

https://embed.plnkr.co/plunk/wDkxQEkRZrTg6K25

以上。
Clojureの基本構文

![advent_calendar_2024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/f4cd8ce0-6352-a1d8-4cae-f39dd44f4def.png)

[*Advent Calendar 2024 Day 4*](https://qiita.com/advent-calendar/2024/clojure)

## 基本構文

3つの基本についてまとめていきます

1. リテラル
1. 関数の定義と呼び出し
1. 特殊フォーム

今日は **1.リテラル** についてまとめます

## 1. リテラル

#### 数値型

```
42        ; Long
-1.5      ; Double
22/7      ; Ratio
```

:::note info
`;`を書くことでコメントを挿入することができます。
:::


通常、整数は `Long` 型として扱われますが、
`N`サフィックスをつけることで `BigInt` 型として扱うことができます。

```clojure
(+ 9223372036854775807 1)
; Execution error (ArithmeticException) at java.lang.Math/addExact (Math.java:931).
; long overflow

9223372036854775807N
(+ 9223372036854775807N 1)
; 9223372036854775808N
```

同様に、少数は `Double` 型として扱われますが、
`M`サフィックスをつけることで `BigDecimal` 型として扱うことができます。

```clojure
(* 1.1 1.1)
; 1.2100000000000002

(* 1.1M 1.1M)
; 1.21M
```

### 文字型

- 文字列はダブルクォーテーション`"`で囲まれて表現されます
    - "hello"
- 個々の文字はバックスラッシュ`\`を先頭につけて表現されます
    - \e
- 改行やspace、tabなどには特殊な名前がついています
    - \newline
    - \space
    - \tab
- Unicodeを直接指定することもできます
    - \u3042
- 正規表現に関しては文字列の先頭に`#`をつけることで表現できます。この文字列は`Java.util.regex.Pattern`オブジェクトにコンパイルされます

```
"hello"         ; string
\e              ; character
\newline        ; character
\u3042          ; character ; あ
#"[0-9]+"       ; segular expression
```
### シンボル

シンボルは、英字、数字、記号（一部除く）で構成され、
関数や値、名前空間などを参照するために使用されます

シンボルはオプションで名前空間を持つことができ、
スラッシュ `/` で区切られます

```
map             ; symbol
clojure.core/+  ; namespaced symbol
nil             ; null value
true false      ; booleans
:alpha          ; keyword
:release/alpha  ; keyword と namespace
```

### コレクション

Clojureには4つのコレクションタイプがあります。

1. list
    1. `'()`で囲みます
    1. 順序付き
    1. indexではなく、`first`や`rest`で要素を取り出す
1. vector
    1. `[]`で囲みます
    1. 順序付き
    1. indexされされていて、`get`関数を使って、任意の要素を取得できる
1. set
    1. `#{}`で囲みます
    1. 順序がない
    1. ユニークな要素の集合体
1. map
    1. `{}`で囲みます
    1. キーとバリューのペアを格納する
    1. キーはユニークになる


```
'(1 2 3)     ; list
[1 2 3]      ; vector
#{1 2 3}     ; set
{:a 1, :b 2} ; map
```

明日は**2. 関数の定義と呼び出し**についてまとめます


### 参考

https://clojure.org/guides/learn/syntax
[Unity]3D空間で物陰が暗い時

# 概要

スクショのように日が当たらない部分がものすごく暗いことがたまにあると思います。
![スクリーンショット 2024-11-09 072453.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/358b1395-27b2-9746-37e1-1d7718c583f8.png)

# 本文
そんな時はメニューからWindow > Rendering > Lightingで「GenerateLighting」を押すと
![スクリーンショット 2024-11-09 0725422.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/0117c426-6c01-f724-eb35-2461d57d9c0c.png)
直るかもしれないです！
![スクリーンショット 2024-11-09 074112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/083d48c1-f2e8-ff73-0fa3-4042b52fe342.png)



# 補足
参考サイト
[MRが楽しい](https://bluebirdofoz.hatenablog.com/entry/2020/11/15/231555)
【React】ReactからC#で作成したAPIをたたいた際にJSONに変換できない

## はじめに

React＋Asp.net Core Web APIを使用していた際にAPIからデータを取得するのに手間取ったため備忘をかねて記事にします。

## 遭遇した問題

C#のプロジェクト作成では初めからテンプレートとして「React＋ASP.Net Core WebAPI」のプロジェクトが存在します。そのテンプレートと同じようにAPIを作成しReactから参照した際に画面上に表示されずコンソールを確認すると、JSON変換時に以下のようなエラーメッセージが出力されました。

```
SyntaxError: Unexpected token '<', "<!doctype "... is not valid JSON {stack: 'SyntaxError: Unexpected token '<', "<!doctype "... is not valid JSON', message: 'Unexpected token '<', "<!doctype "... is not valid JSON'}
```

作成したWebAPIに問題があるのかと思いSwagger上で確認するとレスポンスは問題なさそうでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783169/633b7075-e3ba-e170-9802-8057de7f14e0.png)

ただしReactからアクセスしているURLを直接ブラウザで開いたところJSONのレスポンスではなく普通に作成中のHTMLのページが開いてしまいました。

出力されているエラーの`Unexpected token '<'`というのはHTMLタグのことのようです。

## 原因

使用するAPIをViteのコンフィグにも設定していなかった。そのためアクセスしていたURLがJSONではなくHTMLページを返却したことが原因でした。

これだとわけがわからないと思うので詳細に説明します。まず初めにReact＋Asp.net Coreプロジェクトのテンプレートで作成できるWeatherForecastのアプリでWebAPIのURLと実際にアクセスしているURLを確認しました。

- WebAPIのURL：`https://localhost:7280/WeatherForecast`
- アクセスしているURL：`https://localhost:5173/weatherforecast`

その結果、アクセスしているポートが異なるということがわかりました。`7280`はAsp.net Coreアプリ、`5173`はReactアプリのポートです。てっきり直接APIをたたいていると思っていたのですがそうではないようでびっくりしました。

上記のポートを中継するような処理が必要であることは明白であるため`WeatherForecast`でプロジェクトを検索したところ`vite.config.js`内で以下のようなコードを発見しました。

```javascript
// https://vitejs.dev/config/
export default defineConfig({
    plugins: [plugin()],
    resolve: {
        alias: {
            '@': fileURLToPath(new URL('./src', import.meta.url))
        }
    },
    server: {
        proxy: {
            '^/weatherforecast': {
                target,
                secure: false
            }
        },
        port: 5173,
        https: {
            key: fs.readFileSync(keyFilePath),
            cert: fs.readFileSync(certFilePath),
        }
    }
})
```

上記のコードでVite側で調整をしていたようです。

## 解決法

`vite.config.js`の`proxy`に作成したAPIを追加することで解決しました。

```diff_javascript
// https://vitejs.dev/config/
export default defineConfig({
    plugins: [plugin()],
    resolve: {
        alias: {
            '@': fileURLToPath(new URL('./src', import.meta.url))
        }
    },
    server: {
        proxy: {
            '^/weatherforecast': {
                target,
                secure: false
-            }
+            },
+            '^/api/todolist/': {
+                target,
+                secure: false
+            },
+            '^/hello': {
+                target,
+                secure: false
+            }
        },
        port: 5173,
        https: {
            key: fs.readFileSync(keyFilePath),
            cert: fs.readFileSync(certFilePath),
        }
    }
})
```

## おわりに

Microsoft様のサンプルコードはたまにこういうことがあるので油断できないです。
【Pyxel】[小技]空の.pyxresファイルを作成する

前日までに作成した記事
[短いプログラムで遊ぶ③](https://qiita.com/sanbunno-ichi/items/08ee27e18f4cc1e55384)
[短いプログラムで遊ぶ④](https://qiita.com/sanbunno-ichi/items/4a2b727b57287fe043be)
[短いプログラムで遊ぶ⑤](https://qiita.com/sanbunno-ichi/items/3ac53994e5dc8dd6cde7)
において、
前準備として、あらかじめ「Pyxel Editorを起動して空のmy_resource.pyxresを作成してください」と書きましたが、以下の方法で空の.pyxresファイルを作成することができます。

やってることは単に空の.pyxresファイルをバイナリダンプしたデータをファイル化してるだけですが、これを使えば前準備がいらなくなります。
なんとなく邪道な方法なのかなとか思うので別記事にしました。

本来ならば.pyxpalのロードコマンドがあるのが理想です。
```
#-----------------------------------------------------------------
#空の.pyxresファイルを作成する
#-----------------------------------------------------------------
resdata = [	0x50,0x4B,0x03,0x04,0x14,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x21,0x00,0x4C,
			0x7D,0xBE,0xCE,0xA1,0x00,0x00,0x00,0x11,0x15,0x00,0x00,0x13,0x00,0x00,0x00,
			0x70,0x79,0x78,0x65,0x6C,0x5F,0x72,0x65,0x73,0x6F,0x75,0x72,0x63,0x65,0x2E,
			0x74,0x6F,0x6D,0x6C,0xED,0xCC,0x4B,0x0E,0x83,0x30,0x0C,0x04,0xD0,0x7D,0x4E,
			0xC1,0x11,0x50,0x7F,0xBB,0x9E,0x24,0x42,0x55,0x44,0x0C,0x58,0x22,0x09,0xC5,
			0x86,0x5E,0xBF,0x41,0x0A,0xDB,0xEE,0x5A,0x55,0x68,0x76,0x1E,0xDB,0xF3,0xBA,
			0x34,0x07,0xA7,0x8F,0x95,0x66,0xE1,0x14,0xAB,0x7B,0x75,0x31,0xC6,0x5A,0x0E,
			0xAE,0x27,0x69,0x1A,0xF3,0x62,0xAF,0x43,0xDE,0x9E,0xAE,0x37,0x33,0x10,0xF7,
			0x83,0x96,0xE0,0x9D,0xBA,0x3C,0x5A,0x5B,0xE7,0xAF,0x1F,0x35,0x94,0x47,0x0A,
			0x6E,0xFA,0xD8,0xE1,0xD0,0xCB,0xDC,0xE6,0x50,0xA3,0x7E,0x94,0xBA,0xA4,0x25,
			0xFA,0xAD,0x1C,0x93,0x92,0x6C,0x97,0xC6,0x68,0x8A,0xFB,0xB8,0xA6,0x71,0x09,
			0x7B,0xA0,0xAE,0xA3,0x56,0x4B,0x90,0x89,0xC8,0xE7,0xF1,0x5C,0x83,0x01,0x03,
			0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x01,0x03,0x06,0x0C,0x18,0x30,0x60,0xC0,
			0x80,0xF9,0x22,0x13,0x16,0xE1,0x76,0x63,0x84,0x9E,0xE5,0xE1,0x7F,0xB7,0x6F,
			0x50,0x4B,0x01,0x02,0x14,0x03,0x14,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x21,
			0x00,0x4C,0x7D,0xBE,0xCE,0xA1,0x00,0x00,0x00,0x11,0x15,0x00,0x00,0x13,0x00,
			0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA4,0x81,0x00,0x00,0x00,
			0x00,0x70,0x79,0x78,0x65,0x6C,0x5F,0x72,0x65,0x73,0x6F,0x75,0x72,0x63,0x65,
			0x2E,0x74,0x6F,0x6D,0x6C,0x50,0x4B,0x05,0x06,0x00,0x00,0x00,0x00,0x01,0x00,
			0x01,0x00,0x41,0x00,0x00,0x00,0xD2,0x00,0x00,0x00,0x00,0x00,0xFFFF]
with open('./my_resource.pyxres', mode='wb') as f:
	_cnt = 0
	while( resdata[_cnt] != 0xFFFF ):
		#16進数の数値をバイナリ書き込みする
		f.write( resdata[_cnt].to_bytes(1,'big') )
		_cnt+=1
```
リアルタイムアップデートな開発環境「MicroBlocks」を使ってみる

お手軽にプログラミングを楽しめるマイコンボード「micro:bit」。

通常は[「MakeCode」](https://makecode.microbit.org/)を利用してプログラムするのが一般的ですが、


今回はリアルタイムアップデートな開発環境「MicroBlocks」を使ってみます。

## 「MicroBlocks」について
基本は「MakeCode」と同様ブロックを組み合わせるスタイルの開発環境です。
もともとScratchを作っていた方が開発メンバーということもありScratchと似た使用感となっています。

「MakeCode」ではプログラムを更新する度にプログラムを転送する必要がありますが、「MicroBlocks」では自動的にmicro:bit上のプログラムが更新されるのでより快適にプログラミングが可能です

「MicroBlocks」サイト
https://microblocks.fun/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/dc633a03-3c3e-827c-283e-70ac56ee6163.png)


## 使い方(事前準備)
#### 1)下記サイトにアクセスしHEXファイルをダウンロード
https://microblocks.fun/run/

歯車アイコン＞ボード上のファームウェアを更新＞ボードタイプを選択＞micro:bitを選択すると　"vm_microb.hex"　のダウンロードがスタートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/be9c8bbd-31c0-4625-127d-c3b4c3871ab2.png)
(地球アイコンで日本語に設定変更可能です)

#### 2)micro:bitをPCに接続し、ダウンロードしたファイル"vm_microb.hex"をmicro:bitにコピーする
micro:bitをPCにつなぐと下記のように表示されるのでドラッグアンドドロップでコピーする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/41ad445b-be51-6636-d81e-58245240a382.png)


#### 3)micro:bitにアルファベット3文字が表示されたら準備完了です。
(このアルファベット3文字はBluetooth接続時のKeyとなります)

## 接続してみる
#### 1）接続方法を選ぶ
画面上部右端のUSBアイコンから　connect※USB接続かconnect(BLE)※Bluetooth接続を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/cf96be6f-dbd4-04d4-57f2-041ce6ae9a90.png)

今回はconnect(BLE)で進めます。

#### 2)手持ちのmicro:bitを選択
下記のダイアログが表示されるので手持ちのmicro:bitに表示されている3つのアルファベットを確認し、選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/6c02a491-8d71-09cd-8a58-324396d63d31.png)

#### 3)ライブラリ自動更新
この時点でmicro:bitの5x5スクリーンのアイコンに関するブロックや
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/57b21c2e-5b21-5b01-408c-2dc49046bddd.png)

各種センサーについてのブロックがライブラリに自動的に追加されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/4f5965b6-bd53-7fa5-788d-77649d30ecb7.png)

## コーディングしてみる
操作から「ボタンが押されたら」ブロック、LED表示さら「表示」ブロック「display image」ブロックを画面右に移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/30db7e24-d033-9b13-17fe-391a3d0e808f.png)

はい、なんとこれでOK！ 転送不要です！自動的にmicro:bit上のプログラムが更新されます！
忘備録： 画像処理ソフトImageMagickの脆弱性(CVE-2016-3714他)

1.テキストに以下のコードを書く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/e5e72d09-107a-d1b2-5649-7c2681050c08.png)

２．拡張子を「.png」に変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/87fea86e-e074-e8c4-ad58-b0d4657ba5ac.png)

３．ファイルをアップロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/d53d6509-8ee9-951c-8892-fad174756549.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/4a8071d8-efe2-43a2-19c9-6cf33af07932.png)

４．脆弱性が検出される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/f75842b3-88a4-0eed-5f6e-f160dec32c69.png)

他の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/4b390e37-c335-80d4-fe52-d68a92c2f2bd.png)
コマンドを変えると他のファイルも見える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/3920bc90-07b4-4f8c-16c2-46a0af52d75f.png)
M5NanoC6で素数の計算し、ベンチマークする。(除算)


参考


https://ichiken-engineering.com/arduino-uno-r4-minima_keisan/


https://qiita.com/caa45040/items/12a1c16a270425db918f


x 過去ログを見よ!!
x ICHIKEN様のホームページの内容を非営利、研究調査目的で引用しました。

結果

![o_coq671.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bf4005eb-591a-1eee-d1f2-8ccfd03f1873.jpeg)



Arduino UNO 3より367倍速い
-------------------------------------

約58140ms(58秒) Arduino UNO 3
約158ms(0.16秒) M5NanoC6

たぶん、前後関係から除算ユニットは、ついている。


プログラム



```c++


//0~99991までの整数値を素数判定するのに要した時間を計測する。
#define DEBUG 0
void setup() {
  Serial.begin(9600);
  Serial.println();
  Serial.print("START");
  for(int i = 0;i < 9;i++){
    Serial.print('.');
    delay(500);
  }
  Serial.println();
}
bool isPrime(unsigned long n) {
    // 2未満の数は素数ではない
    if (n <= 1) {
        return false;
    }
    // 2は素数
    if (n == 2) {
        return true;
    }
    // 偶数は素数ではない
    if (n % 2 == 0) {
        return false;
    }
    // nを2からsqrt(n)までの数で割ってみて、割り切れるかどうかを確認
    // 割り切れる場合、素数ではない
    for (unsigned long i = 3; i * i <= n; i += 2) {
        if (n % i == 0) {
            return false;
        }
    }
    // それ以外の場合、素数である
    return true;
}
void loop() {
  
  unsigned long start_time, end_time;
  unsigned long time;
  bool result;
  unsigned long x;
  unsigned long p=0;
  Serial.println("start");
  start_time = millis();
  for(x=0;x<=99991;x++){
    result=isPrime(x);
    if(result == true){p++;}
#if DEBUG
    Serial.print(x);
    Serial.print("\t");
    Serial.println(result);
#endif
  }
  
  end_time = millis();
  time = end_time - start_time;
  Serial.print("END Value:");
  Serial.print(x-1); //最後の値の出力
  Serial.print('-');
  Serial.println(p); //素数のカウントの出力 最適化対策
  Serial.print("StartTime:"); 
  Serial.print(start_time); 
  Serial.print(" EndTime:"); 
  Serial.print(end_time); 
  Serial.print(" Time:"); 
  Serial.println(time); 
  Serial.println(result);   
  delay(1000);//1秒待機
}


```
継承について

＃＃継承の目的
以前使用したクラスを似たクラスを作成したいときに効率よく新たなクラスを作成する。
＃＃サンプルプログラム
public class Hero {
    String name = "ミナト";
    int hp = 100;
    //戦う
    public void attack(Matango m) {
        System.out.println(this.name + "の攻撃");
        m.hp -= 5;
        System.out.println("5ポイントのダメージを与えた！");
        }
    //逃げる
    public void run() {
        System.out.println(this.name + "は逃げ出した！");
    }
}
＃＃継承を行う
上記のプログラムはヒーローの行動を表すプログラムである。
攻撃と逃げる動作がある。
このヒーローを次の機能を持ったスーパーヒーローに進化させたい。
１，fly()で飛ぶことができ、land()で着地することができる。
２，ヒーローのできることがスーパーヒーローもできる。
ここで活躍するのが継承の考え方である。
＃＃サンプルプログラム
public class SuperHero extends Hero {
    boolean flying;
    public void fly() {
        this.flying = true;
        System.out.println("飛び上がった！");
    }
    public void land() {
        this.flying = false;
        System.out.ptrintln("着地した！");
    }
}
＃＃継承の説明
上記のプログラムのポイントは1行目のpublic class SuperHero extends Heroである。
これにより、Heroのクラスを継承し、Heroと同じメンバの定義を省略することができる。
このSuperHeroクラスがインスタンス化される際には、SuperHeroクラスがHeroクラスに含まれている、name,hp,attack(),run()も持っていると判断してくれる。
＃＃終わり
継承の簡単な使い方はここまで
SQLパズル　p93 22 大家の悩み 解法１の学習メモ

# 概要
SQLパズル　p93 22 大家の悩みの 解法１の学習メモです。
単純な外部結合ですね。

理解度怪しいの再復習の必要あり


# 要件
tenants、rentpayments,unitsテーブルを結合した上で、以下行を取得したい。
・指定した範囲内にpayment_dateがある行
・部屋と借り主の組み合わせの行。payment_dateの値はnull


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/4f55ddd9-10ce-b773-7584-70b4be59f99a.png)


# SQL

## DDL
```sql
drop table if exists Tenents;
CREATE TABLE Tenants
 (tenant_id INTEGER,
  unit_nbr  INTEGER,
  vacated_date DATE,
  PRIMARY KEY (tenant_id, unit_nbr));

drop table if exists Units;
CREATE TABLE Units
 (complex_id INTEGER,
  unit_nbr   INTEGER,
  PRIMARY KEY (complex_id, unit_nbr));

drop table if exists RentPayments;

CREATE TABLE RentPayments
 (tenant_id   INTEGER,
  unit_nbr   INTEGER,
  payment_date   DATE,
  PRIMARY KEY (tenant_id, unit_nbr));

--サンプルデータ
INSERT INTO Tenants VALUES(1, 1, NULL);
INSERT INTO Tenants VALUES(1, 2, NULL);
INSERT INTO Tenants VALUES(1, 3, '2007-01-01');

INSERT INTO Units VALUES(32, 1);
INSERT INTO Units VALUES(32, 2);
INSERT INTO Units VALUES(32, 3);

/* ユニット１は家賃を払っている。２は払っていない */
INSERT INTO RentPayments VALUES(1, 1, '2007-03-01');

```

## 答えのSQL

```sql
--答え
-- WHERE句は要件で取得したい行の情報
SELECT *
FROM (Units AS U1 LEFT OUTER JOIN Tenants AS T1
    ON U1.unit_nbr = T1.unit_nbr
    AND T1.vacated_date IS NULL
    AND U1.complex_id=32)
    LEFT OUTER JOIN RentPayments AS RP1
    ON(T1.tenant_id = RP1.tenant_id
    AND U1.unit_nbr = RP1.unit_nbr )
WHERE RP1.payment_date BETWEEN  '2006-03-01' AND '2009-03-07'
OR RP1.payment_date IS NULL
	;

-- 途中式

--　部屋とテナントテーブル結合
-- 部屋と借り主の組み合わせを求める
-- 今回の場合だと unit_nb=3はvadate
SELECT * 
	FROM  (Units AS U1
	LEFT OUTER JOIN Tenants AS T1
	ON U1.unit_nbr = T1.unit_nbr
    AND T1.vacated_date IS NULL
    AND U1.complex_id=32
	);


-- 家賃テーブルを結合
SELECT *
FROM (Units AS U1 LEFT OUTER JOIN Tenants AS T1
    ON U1.unit_nbr = T1.unit_nbr
    AND T1.vacated_date IS NULL
    AND U1.complex_id=32)
    LEFT OUTER JOIN RentPayments AS RP1
    ON(T1.tenant_id = RP1.tenant_id
    AND U1.unit_nbr = RP1.unit_nbr )
	;

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/83db15f2-dd3a-f1b4-94a9-5bfac9c0dce8.png)


# 参考

SQLパズル　p93

SQLパズル　サポートページ
https://mickindex.sakura.ne.jp/database/db_support_sqlpuzzle.html#LocalLink-p22

達人に学ぶSQL徹底指南書第２版 類似した問題無し

github差分
https://github.com/RYA234/SQL_Puzzle_Learning/commit/a85e00f955a5e2e45aa32bd5cdb6fc2012b8c14e
忘備録： exploit code Apache Struts(CVE-2017-5638)の脆弱性

Apache Strutsの脆弱性(CVE-2017-5638)をテーマとした問題です。
本脆弱性は、ファイルアップロード時に使用するマルチパーサー「jakarta」に起因する脆弱性で、同マルチパーサーはApache Struts 2 にてデフォルトで使用しているものです。
　細工されたOGNL(Object-Graph Navigation Language)式を含んだHTTPリクエストを送信することで、リモートからApache Struts2 が配置された Web アプリケーションサーバーの実行権限で任意のコードを実行されてしまう危険性があります。

１．攻撃コードを使ってフラグを取得します。https://www.exploit-db.com/exploits/41570/
使い方は以下の通りです。
$ python ファイル名 URL コマンド
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/00f9da19-8bf8-39e2-664d-bbb46731934b.png)

２．コマンドを変えてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/e2df3479-68d5-d002-3056-eaafb0795e30.png)
数億ファイルのデータ移行をあまくみてはいけない（当たり前）


この記事は[トラストバンクAdventCalendar](https://qiita.com/advent-calendar/2024/trustbank)の記事になります。

パブリテック事業部の大場です。
今期実施したデータ移行のやらかし記事です。
生温かい目でご覧ください。

## **1. 突然の危機的状況**

2月に大きなリリースを実施し落ち着く間もなく、予定していたNetAppへのデータ移行作業に着手すると、すぐに非情な現実を見せつけられました…。

当初は「事前にrsyncで同期しておいて、当日に差分をコピーすれば問題ないよね」というような、なんとも甘い移行を計画している程度でした。
しかし、数億ファイル、数十TBというデータをそう簡単に移行できるわけがありません。

実際に試算したところ、rsyncに20日以上かかることが判明しました。
そしてさらに悪いことに、既存のストレージの空き容量が危機的状況で、全く時間的猶予がありませんでした。この点については、一時は使用率95%という状況になりましたが、不要なファイルを削除したり、仮想マシンを移動させたり、なんとか移行完了まで80％台をキープすることができました。

この状況から始まったデータ移行プロジェクトの舞台裏をお話しします。

---

## **2. 検証: XCPとmsrsync**

膨大なデータを移行するツールを選定するために、NetApp公式の「XCP」とオープンソースの「msrsync」を検証しました。

---

### **a. XCP**
まず着手したのは、NetApp公式ツール「XCP」の検証です。これは、大規模データ移行のために設計された高性能ツールで、公式のサポートも期待できます。初期同期では驚くべき速度を発揮し、期待を抱きました。

しかし、実際に進めてみると

- **キャッシュ問題:** 小さいデータで検証をしていた際、非常に高速でとても期待しました。しかし、データを増やして検証すると一定のところから急激に速度が落ちることがわかりました。データ量が増えるとデータ移行が進むにつれキャッシュが溢れ、速度が徐々に低下するようでした。

- **小さいファイルのパフォーマンス:** XCPは大きなファイルの移行には非常に優れていますが、小さなファイルが大量にある場合には速度が低下する傾向が見られました。

これにより、XCPは「大容量の一括データ移行」には有効そうですが、「細かいデータのコピー」には適さないという結果になりました。今回のデータは、まさにサイズの小さい大量のファイルのため、「XCP」は採用できませんでした。


---

### **b. msrsync**
次に、rsyncを並列処理することが可能な「msrsync」を試しました。

- **パフォーマンス向上と限界:** 並列処理でコピー可能なため、小さなファイル群の移行速度が劇的に向上しました。サーバリソースをあげ、並列数を増やしましたが一定のところで性能は頭打ちになりました。
- **異常な動作:** ネットワーク負荷が高まりプロセスが停止したり、サーバがハングしたりすることもありました。

msrsyncの並列処理能力は有効でしたが、並列数には限界がありどうやっても移行には2.5日かかる結果となりました。

---

## **3. 移行方法の決定**

検証の結果、msrsyncを利用せざるを得ない状況でしたが、約2.5日間の停止を伴う移行は現実的ではありません。さらに、msrsyncが必ずしも安定動作するとは限らず、一度で成功する保証もありませんでした。

そこで、ユーザ影響を最小限に抑えるため苦肉の策として「データが完全に同期されていない状態でのサービス再開」を選択しました。平日に比べ利用者が少ないゴールデンウィーク（GW）を利用し、以下の計画で実施しました。

1. GW前の平日分までをmsrsyncでコピー
2. 切り替え後、GW中のデータは後から同期

一部のデータが参照できない状態でサービス再開することになってしまいましたが、なんとか運用停止時間を最小限に移行を完了しました。

---

## **4. 結論: 振り返りと教訓**

膨大なデータ量を限られた時間で移行するという課題は非常にチャレンジングでしたが、同様の移行を検討する方には、次の点を強くお勧めします。

**データ移行を甘く見てはいけない、早い段階でちゃんとした計画を!!**

当たり前ですね…。
苦労の連続でしたが、チームも自分自身も多くの教訓を得ました。

---
## 5.さいごに
プロダクト開発・技術的課題解決などやりたいことがたくさんあります。 カジュアル面談歓迎です！少しでも興味を持っていただけたら是非ご連絡ください！
https://www.wantedly.com/companies/trustbank/projects
Orchastrating Network infra using Cisco NSO 1

# Cisco's Network Services Orchestrator (NSO)
キャリアが独自で実装してたジャンプサーバーのすごいようなもの
SDNアーキテクチャーで使われる。
サービスプロバイダーインフラの自動化でCrossworkとともに使われる。
NSOは複数ベンダーの複数機器を管理できる。
LINUXにだけインストールできる。
デバイスのコンフィグ管理をSSHでできる。
デバイス側にエージェントは必要ない。

# NSOアーキテクチャ
以下のアーキテクチャがある
デバイスマネージャー
パッケージマネージャー
サービスマネージャー

# ローカルインストールとシステムインストール
ローカルインストールは、主に開発、テスト、個別の使用向けに便利で、
簡単に設定できるが、本番環境や大規模なネットワークに向かない。
システムインストールは、高可用性やスケーラビリティを重視した本番環境向けで、
複数のサーバーやクラスタ構成をサポートするが、
インストールと設定には時間と専門知識が必要。

# NSOのローカルインストール

```shell-session
###必要パッケージをインストール
$ sudo apt install default-jdk ant python3 xsltproc

###インストーラーのアンパッケージ
$ chmod +x nso-6.0-freetrial.linux.x86_64.signed.bin 
$ ./nso-6.0-freetrial.linux.x86_64.signed.bin 
Unpacking...
Verifying signature...
Retrieving CA certificate from http://www.cisco.com/security/pki/certs/crcam2.cer ...
Successfully retrieved and verified crcam2.cer.
Retrieving SubCA certificate from http://www.cisco.com/security/pki/certs/innerspace.cer ...
Successfully retrieved and verified innerspace.cer.
Successfully verified root, subca and end-entity certificate chain.
Successfully fetched a public key from tailf.cer.
Successfully verified the signature of nso-6.0.linux.x86_64.installer.bin using tailf.cer
student@student-virtual-machine

###NSOを　インストール
$ sh ./nso-6.0.linux.x86_64.installer.bin --local-install /home/username/NSO
INFO  Using temporary directory /tmp/ncs_installer.156544 to stage NCS installation bundle
INFO  Unpacked ncs-6.0 in /home/student/NSO
INFO  Found and unpacked corresponding DOCUMENTATION_PACKAGE
INFO  Found and unpacked corresponding EXAMPLE_PACKAGE
INFO  Found and unpacked corresponding JAVA_PACKAGE
INFO  Generating default SSH hostkey (this may take some time)
INFO  SSH hostkey generated
INFO  Generating self-signed certificates for HTTPS
INFO  Environment set-up generated in /home/student/NSO/ncsrc
INFO  NSO installation script finished
INFO  Found and unpacked corresponding NETSIM_PACKAGE
INFO  NCS installation complete


###なぜか起動に必要なフォルダが無いので作成
$ cd /home/username/NSO/
$ mkdir -p state ncs-cdb logs

###コマンドパスを通す。
$ source /home/username/NSO/ncsrc

###NSOインスタンスの作成
$ cd ../
$ ncs-setup --dest ./NSOins

###NEDをインスタンスにインストール
$ ncs-setup --package /home/username/NSO/packages/neds/cisco-ios-cli-3.8 --dest /home/username/NSOins/

###NSOを起動
ncs

###NSOにアクセス
$ncs_cli -u admin -C

```

GUI:https://localhost:8080
admin:admin

:::note info 
メモ
作業フォルダが違うとパスがうまく通らなかった。後ほど検証
フィルターが適用されているかを判定する

# はじめに
ビューにフィルターが適用されているか否かを判定する計算フィールドの作成方法をご紹介します。
今回ご紹介するのは以下の２パターンです。
A.'すべて'が選択されているか
B.単一の値で絞り込まれているか

# 注意点
・今回ご紹介する方法では、複数のフィルターを設定している場合に特定のフィルターのみについて適用されているか否かを判定することはできません。
・フィルターとして使用するフィールドにNULLが含まれると正しい結果とならないため、その場合はIFNULL関数で空白('')に置換してください。
・フィルターとして使用するフィールドの値が1種類だけの場合は判定できません。

# 使用するデータソース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/8cf516fb-29ff-7401-a5b0-76309327f420.png)

# 目的
画像のビューでフィルターを操作した場合に、パターンAとBを判定して真偽を返す計算フィールドを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/74d37ef1-ea44-ffa2-8a73-7677d426e9e0.png)


# パターンA（'すべて'が選択されているか）
「フィルター判定(すべて)」フィールドを作成
```
TOTAL(COUNTD([名称])) = MAX({FIXED: COUNTD([名称])})
```
左：フィルター適用後の名称の種類をカウント
右：フィルター適用前の名称の種類をカウント
等号が成立する場合はフィルター適用前後で種類数が変わらないため絞り込みはされていない、つまり'すべて'が選択されていると判定します。

 ### 'すべて'を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/0f1cab68-83dc-00ef-4665-447f373261fb.png)

### 'すべて'以外を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/961ee132-d832-15b4-445c-30954e7b4375.png)

# パターンB（単一の値で絞り込まれているか）
「フィルター判定(単一)」フィールドを作成
```
TOTAL(MAX([名称]))=TOTAL(MIN([名称]))
```
ビューの名称が1種類だけの場合MAXとMINが一致するため、単一の値が選択されていると判定します。

### 単一の値を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/63dd1995-cd15-65b6-51e1-fe9c1ea10da3.png)

### 複数の値を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/a4f2b44c-45dc-9db9-f9fa-acf55a486d77.png)


 ※表計算の方向については、すべてのフィールドのチェックボックスにチェックが入っている状態にしてください。
 OK
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/cf026bdc-9039-8177-7c42-0d4b7b4c19ff.png)
 NG
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/aba875ed-763e-121e-fe8e-aa9ae3a85867.png)

 # 終わりに
 このフィールドを使用することで、フィルターで絞り込んだ場合にビューの色を変更するといったことが可能となります。
 ご活用いただければ幸いです。
SadServers #1

# SadServers #1
### Scenario:"Saint John": what is writing to this log file?(このログファイルは何が書かれていますか？)

### Description:A developer created a testing program that is continuously writing to a log file /var/log/bad.log and filling up disk. You can check for example with `tail -f /var/log/bad.log`.This program is no longer needed. Find it and terminate it.(ある開発者が作成したテスト・プログラムが、ログファイル/var/log/bad.logに書き込み続け、ディスクをいっぱいにしている。もう必要ないので終了させてください。)
***
### 答えにたどり着くまで
```
/var/log/bad.log
```
↑そのファイルを開いているプロセスを探す
```
$ lsof /var/log/bad.log 
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
badlog.py 585 admin    3w   REG  259,1    35833 265802 /var/log/bad.log
$ 
```
#### lsofコマンドとは
プロセスが開いているファイルを表示するコマンド
サーバーで特定のポート番号を待ち受けているかどうか、指定ファイルは誰が読み込んでいるのかを調べたいときに役立つコマンド<br>

特定のファイルを開いているプロセスを特定するとPIDが585だった。<br>
```
badlog.py 585 admin    3w   REG  259,1    35833 265802 /var/log/bad.log
```
さっきのPIDからプロセス名と情報を見てみる
```
$ ps aux | grep 585
admin        585  0.0  1.7  12508  8192 ?        S    10:54   0:00 /usr/bin/python3 /home/admin/badlog.py
admin        889  0.0  0.1   5264   640 pts/1    S<+  11:00   0:00 grep 585
$
```
<span style="color: red; ">ps aux | grep <PID></span>は、OS上で動いてるプロセスを確認するときに使用する
### そもそもなんでps aux|grep <process_name>と叩くとプロセスIDとかの出力結果出るか調べる

#### ps aux
ps単体がLinux上で動いてるプロセスを確認するコマンドでもps単体であんまり使わんからps auxで覚えとこ。

#### grep
```hoge.txt
hoge
itigo
hogehoge
oishii
```
みたいなファイルがあってgrep hoge hoge.txt打つと
```
grep hoge hoge.txt
hoge #検索結果1
hogehoge #検索結果2
```
- 第１引数のhogeが検索単語
- 第2引数のhoge.txtが後述する標準入力
- 出力結果が後述する標準出力

#### パイプライン(|)の意味
パイプラインというのは、**前のコマンドの標準出力をそのまま次のコマンドの標準入力として渡す仕組み**のこと

<span style="color: red; ">ps aux|grep hoge</span>コマンドを叩くとすると<br>
1. <span style="color: red; ">ps aux</span>でOS上で実行中のプロセスが一覧として表示され、標準出力される
2. <span style="color: red; ">grep hoge</span>の標準入力として、1.で標準出力されたプロセスの一覧が渡される
3. 結果として、OS上で実行中のプロセスの中で、nodeという文字列を含んだプロセスが標準出力としてコマンドライン上に表示される

###
```
$ ps aux | grep 585
admin        585  0.0  1.7  12508  8192 ?        S    10:54   0:00 /usr/bin/python3 /home/admin/badlog.py
admin        889  0.0  0.1   5264   640 pts/1    S<+  11:00   0:00 grep 585
$
```
左から
- USER：プロセスの所有ユーザー
- PID：プロセス番号
- %CPU：CPUの占有率
- %MEM：実メモリでの占有率
- VSZ：仮想分も含めた使用サイズ(Kバイト)
- RSS：実メモリ上の使用サイズ(Kバイト)
- TT：端末名
- STAT：プロセスの状態
    - R：稼動中
    - S：一時停止中
    - D：停止不可能で一時停止
    - T：終了処理中
    - Z：ゾンビプロセス（すでに実体は無い）
    - W：実メモリ上に無くて，スワップアウトしている
    - N：nice値
- STARTED：プロセスの開始時刻
- TIME：プロセスの総実行時間
- COMMAND：実行コマンド名とパス（シェル表記の場合もあり）
`````
admin        585  0.0  1.7  12508  8192 ?        S    10:54   0:00 /usr/bin/python3 /home/admin/badlog.py 
`````
kill 585してやることでログ・ファイルの書き込みが停止して、ディスクの容量の消費も止まる。

### まとめ
SREは障害対応のスキルもいるのでこれからSadSeversの問題解いて行って勉強していく。
VSCodeでJava開発を始める際にエラーが表示されない問題の解決法【リモート環境編】

リモート環境（例えばEC2）に接続してJava開発を始めた際に、明らかにおかしな構文でもエラーが表示されず、関数ジャンプも使えないという事象に悩まされました。この問題に対して、私が実際に行った解決策を共有します。同じ問題で困っている方の助けになれば幸いです。
## 問題の症状
リモート環境でJava開発を行うためにVSCodeを使用していましたが、次のような症状が発生しました。

#### 1. おかしな構文でもエラーが表示されない
明らかに文法的に間違っているコードでもVSCodeにエラーメッセージが表示されません。

#### 2. 関数ジャンプが動作しない
メソッドやクラスをf12、もしくは右クリックして「定義へ移動」を選択しても、期待通りに動作しません。

#### 3. VSCodeの右下にエラー表示
関数ジャンプを使用しようとすると、VSCodeの右下に以下のようなエラーが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3814611/9a93ed5c-9069-7c14-ee4a-47e6c36cf3a4.png)

## エラーの内容
上記のメッセージは、VSCodeの拡張機能である`Language Support for Java(TM) by Red Hat`において「`java.home` 変数に設定されたパス（例：`C:\Program Files\Java\jdk-22`）が見つからない、もしくはアクセスできない」というエラーを意味します。
ローカル環境であればこの設定で問題ありませんが、リモート環境ではローカルの`java.home`設定が適用されず、結果としてリモートのJava環境にアクセスできなくなります。

## 解決方法
以下の手順で問題を解決しました。
#### 1. `settings.json`を確認する
エラーが発生している状態で「`Open settings`」をクリックし、`settings.json`を確認します。以下は私の設定ファイルの例です。
```Java:setting.json
{
    "redhat.telemetry.enabled": true,
    "remote.SSH.remotePlatform": {
        "ec2": "linux"
    },
    "[json]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    },
    "java.home": "C:\\Program Files\\Java\\jdk-22"
}
```
`"java.home"`がローカル環境用のパスとして設定されています。この設定はリモート環境には適用されず、エラーの原因となります。

#### 2. `java.home`設定を削除する
リモート環境で正しく動作させるために、`settings.json`からローカルの`java.home`設定を削除します。削除後の設定は以下のようになります。
```Java:setting.json
{
    "redhat.telemetry.enabled": true,
    "remote.SSH.remotePlatform": {
        "ec2": "linux"
    },
    "[json]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode"
    }
}
```
#### 3. VSCodeを再起動する
最後にVSCodeを再起動します。これで、エラーの表示や関数ジャンプが正常に動作するようになりました。

## まとめ
リモート環境でJava開発を行う場合、ローカルの`java.home`設定が原因でエラーが発生することがあります。この問題を解決するために、次のポイントを試してみてください。

1. `settings.json`から`java.home`を削除する。
2. 設定後、VSCodeを再起動する。

私はこれで、VSCode上でエラー表示や関数ジャンプが正しく動作するようになりました。リモート環境でJava開発を行う際の参考になれば幸いです！
Putメトリクスを使って監視テストやってみた。

## はじめに
監視を作った際にメトリクスを意図的に発生させてちゃんとリソース監視ができてるかを
テストするためにPUTメトリクスという仕組みを利用して発生させる。
## CloudWatchとは
CloudWatchはAWSが提供するモニタリングのためのマネージドサービス
#### ログ監視機能（CloudWatch Logs）
CloudWatchエージェントをインストールすることで、AWSサービスのログを監視することができる機能
CloudWatch Logs Insightsという拡張機能では、独自の構文を使ってクエリのようにデータを検索したり分析したりすることができる機能
ただ、お金はかかる。
#### アラーム通知機能（CloudWatch Alarms）
メトリクスが特定のしきい値を超えた場合とか下回った場合、データポイントが出てない場合（常に取れているものが）など状況に
合わせてアラートを発報させることができる。アラームは、AWS SNSを活用してメールに飛ばすなど可能。
NewRelicとかDatadogとかを使ってる場合はインテグレーションすることでNewRelic、Datadogなどモニタリングツールに連携することができ
そちらでどういうふうに通知させるかなどの設定をすることができる。

などなど....

CloudWatchだけでもかなりのサービスが存在するのでその時々によって使い分けたりする必要がある。

## Putメトリクス
PutMetricDataというAPIを使用する。
```
$ aws cloudwatch put-metric-data --namespace XXXXXXXXX --metric-name XXXXXXXXX XXXXXXXXX=XXXXXXXXXXXXXXX --value XX
```
【例（Lambdaのエラー）】
```
$ aws cloudwatch put-metric-data --namespace AWS/Lambda --metric-name Errors --dimensions FunctionName=リソース名 --value 1
```
namespace:名前空間
metric-name:発生させたいメトリクス（エラーとかレイテンシーとか）
value:それぞれに設定しているモニターのしきい値を超える値を記載

## dimensionsなどがわからない場合
### GUIでの確認する方法
Cloudwatch -> メトリクス -> 参照から AWS 名前空間から確認することが可能
### CLIから確認する方法
namespaceはGUIから確認する。
```
$ aws cloudwatch list-metrics --namespace AWS/Lamba
```
上記のコマンドを実行するとDimensionsなどの情報を確認することができる。

## 最後に
監視テストで今回はPutメトリクスをやってみたが、結構簡単に擬似的にテストできることがわかった。
他にもAWS Fault Injection Simulator(AWS FIS)使っても確認できると思うけど、ただこのサービスは疑似障害・疑似攻撃を稼働中のシステムに
与えた際にどれだけ耐えるかとか回復力あるかとかを確認する手法「カオスエンジニアリング」が行えるものなので監視テストで使用するには大掛かり
というかそこまでする必要もないのかなと思うのでPutメトリクスは一番手っ取り早くできるのではないかなと思います。
忘備録： exploit code CVE-2014-6271について

１．GNU Bash (Bourne-Again Shell)の脆弱性「Shellshock」（CVE-2014-6271他）をとりあげます。
GNU Bashでは、環境変数にシェル関数定義を設定することができます。
Shellshock脆弱性が存在しているGNU Bashは、シェル関数定義に続いて記述されているシェルコマンドを、アプリケーションの権限で実行してしまいます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/48a745c3-4cbc-cde7-0f70-024eed82f317.png)

２．Shellshock攻撃が可能なGNU Bashが実装されています。
「/etc/secret/flag」を読み出すOSコマンドを埋め込んだ、User-Agentヘッダを含むHTTPリクエスト
をWebサーバーに送信する

User-Agent: () { :; }; echo; echo; /bin/cat /opt/secret/XXX
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/4e91bb25-8645-7e61-6829-22a9a5c6a971.png)



３．curlコマンドを使用した例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/ca629b68-7bfd-5187-721b-d03d22faf8db.png)