OmniAICreator/Qiita-1.07M huggingface dataset:
slackbot 3秒ルール対策

**概要**
ChatGPT用にslackbot(lambda)作成のお手伝いをする機会があり、その時出た問題点となります。（slackbot作成についてはコチラ：https://www.beex-inc.com/blog/slackbot-aws-lambda）
```
[slackbotの流れ]
slack画面 ⇔ slackAPI(サーバ) ⇔ APIGateway ⇔ lambda ⇔ ChatGPT
```

**問題**
ChatGPTの返答にはそれなりに時間がかかる(3秒以上)のですが、slackAPIは3秒以内に応答が返ってこなければ再リクエストを数回送り直す仕様となっているため、結果１つの質問メンションに対して複数同じ回答がslackに表示されてしまうといった現象が起こりました…

[slackbotイメージ]
![１１１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114591/9ce407cc-e68a-aa41-cf4f-a090466e362a.png)

**解決策**
以下のようにヘッダーにリトライ情報`X-Slack-Retry-Num`がある場合は以降の処理を行わないようにすると解決できました🎉

[サンプルコード]
```python
import os
import re
from slack_bolt import App
from slack_bolt.adapter.aws_lambda import SlackRequestHandler
from slackbot_backend import get_message

app = App(
  token=os.environ.get("SLACK_BOT_TOKEN"),
  signing_secret=os.environ.get("SLACK_SIGNING_SECRET"),
  process_before_response=True,
)
receiver = SlackRequestHandler(app)

# slackメンション時実行
@app.event("app_mention")
def onAppMention(event, say):
    textWithoutMention = re.sub(r"^<@(.+?)>", "", event["text"]).strip()
    # ChatGPTへの質問
    text = get_message(textWithoutMention)
    say(
        channel=event["channel"],
        thread_ts=event["event_ts"],  # 返信先スレッドを識別するための文字列
        text=text,
    )


def lambda_handler(event, context):
    # X-Slack-Retry-Numキーが存在する=リトライなので以降処理せずリターン
    headers = [v for k, v in event.items() if k == 'headers']
    if len(headers) > 0:
        slack_retry_num = [v for k, v in headers[0].items() if k == 'X-Slack-Retry-Num']
        if len(slack_retry_num) > 0:
            print(f'this event is slack retry. retry num is {slack_retry_num[0]}.No further processing.')
            return

    return receiver.handle(event, context)

```

[slackbotイメージ]
![２２２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114591/4dffa335-4f20-2089-66f7-67e3f428ad1b.png)
独学エンジニア、初日で詰む詰む

　　初めまして、ZERO0000です！？
アウトプットに最適なのでQiitaに投稿
することにしました。初投稿のため緊張　　
したりしなかったり…　　
ここでは、未経験エンジニアの僕が勉強した　
ことを中心に投稿致します。　


　　現時点でのZERO0000のスキルセット　
・プログラマカレッジ終了のみ笑笑
   今取り組んでいるコト
・Javaシルバーの勉強　
・独学エンジニア←603講座あり初日から
挫
折　
し
そ
う
（まぁ、一講座10〜15分なんですけど）　


　　最初は、プログラマカレッジの体験談を　
載せるつもりでしたが、すでにあったので辞め、代わりに独学エンジニアの体験談にする　
ことにしました。まぁ、チョコチョコJavaシルバーの勉強も載せるつもりでーす。　
　　
  プログラマカレッジについて聞きたいって
方は、Twitter @2hfqUNWyMhZSTtCでDM 
下さい。知ってる限り教えますので…
ついでに彼女も募集しているので　
DMくれたら嬉しいです。

　まぁQiitaは99.98per男性
しかやってないので期待してはいませんがww 
これからよろしくお願いするます。
【ちょっと便利な小技_part 4】Visual Studio Codeでflutter開発(Extract Method編)

## Extract Methodでメソッド化＆切り出し
今回はExtract Methodについて
下記画像のMore Extract...にある『**Extract Method**』は
Widgetをメソッド化して切り出してくれます。
方法はとても簡単なのでぜひやってみてください。

# 方法
メソッド化したいWidgetにカーソルを合わせて
『cmd』＋『.』(Mac)
を選択します。
すると下記の画像のようになります。
![スクリーンショット 2023-08-17 17.06.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524075/dc13b656-919d-0c67-8bca-992ddbf30701.png)

次にExtract Methodを選択するとメソッド名の入力欄が出てきます。
そこに任意のメソッド名を入力してEnterを押します。
これで完了
![スクリーンショット 2023-08-17 17.07.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524075/569d593e-f865-b1ef-4592-6d57c4cb83e1.png)

## 結果
このようにメソッドとして切り出してくれます。
![スクリーンショット 2023-08-17 17.31.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524075/3ac48bac-1907-15b9-d4c5-e0484e092ffe.png)
Laravel設計

# はじめに
Udemyで「リバーシで学ぶアプリケーション設計入門〜仕様の整理からTypeScriptでの実装まで〜」を学びました。
この講座では主にアプリケーション設計の概念などについて色々と学ぶことができたのですが、
個人的にずっとモヤっとしていた、laravelを使用した際の設計についての解説がとても学びになりました。そこで自分なりに色々調べて得た知識とも重ね合わせて、今のところ一番いいなと思ったlaravelの設計アプローチについてoutputしておきます。

### 1.まずはファットコントローラーにならないように、laravelの機能を使ってコードを分割する。

・認可処理はポリシーに切り出す
・バリデーション処理はFormRequestに切り出す
・レスポンス整形処理はResourceに切り出す

### 2.ドメインロジックをモデルに集約する。

コントローラからドメインロジックが移植される先として挙げられやすいのがモデルです。
ただしドメインロジックをモデルで持つことでメソッド名が衝突したり、結局モデルが太ってしまうことになります。
しかしlaravelやrailsのようなMVC+ActiveRecord系O/Rマッパーでは、無理に厳格なクリーンアーキテクチャなどを持ち込まずに、アクティブレコードパターンの特性を活かすことが大事です。

*ActiveRecord系O/Rマッパーとは、
Modelというクラスが、データの入れ物兼データベースとやりとりするメソッドを持てるような設計のこと。(laravelではEloquent)

つまり、アクティブレコードのモデルの役割は以下の3つ
１.データベースのレコードと対応するデータを持つ
2.データアクセスのメソッドを持つ
3.ドメインロジックを持つ

アクティブレコード系のO/Rマッパーを使うと、このような役割をModelが持つので、
データベースとドメインロジックがくっつきます。

そのためドメインロジックがデータベースに強く依存してしまいますが、
実装量が少なくなり、早く開発できるところがアクティブレコードパターンの魅力としてあります。

以上の理由から、ドメインロジックはモデルに集約することにします。

### 3.ユースケースをServiceやUseCaseクラスみたいなものを使って分離する。

![スクリーンショット 2023-08-17 17.31.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287606/2b61be8d-d959-33a5-3d90-4b00b0862cb2.png)

# 参考
https://www.udemy.com/course/learning-application-architecture-with-reversi
https://logmi.jp/events/3690
https://zenn.dev/mpyw/articles/ce7d09eb6d8117
Ubuntu 22.04 に node v18 をインストールする

とある ubuntuベースのコンテナで nodejs とか npm とかを使おうとして単純に `apt install nodejs` したらその後 npm パッケージのインストールで deprecate 警告が出まくって何事かと思った。

デフォルトのリポジトリでは node v12 とかやたら古いものが入ってるのでv18 を使えるようにリポジトリを更新してからインストールしなければならない。

```sh
curl -fsSL https://deb.nodesource.com/setup_18.x | bash - 
# バージョンとか確認する
sudo apt show nodejs 
apt-get install -y nodejs
```

yarn もデフォルトだと古すぎて最近の symfony 開発だとはまってしまうし、なんだかなあって感じ。
Visual Studio 2022 で References 配下のパッケージに黄色三角アイコンが付く場合は obj/project.assets.json を削除してみる

ある日突然 Visual Studio 2022 でソリューションを開いた際に References 配下のパッケージに黄色三角アイコンが付く場合は `obj/project.assets.json` を削除すると改善する場合がある… 理由はわかりません。

削除前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/3f8f878e-1c11-f211-0c82-5ad8ee25f5e6.png)

削除後
![2023-08-17_16h55_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/3c3abcad-8347-26bc-4a6b-de5e8fa07805.png)
【ちょっと便利な小技_part 3】Visual Studio Codeでflutter開発(More Actions編)

## More Actionsを使って開発時間を短縮
今回はMore Actions...について
下記画像のMore Actions...にある『**Wrap with 〇〇**』は
WidgetをWrapしてくれます。
方法はとても簡単なのでぜひやってみてください。
![スクリーンショット 2023-08-17 16.19.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524075/25276b54-92a0-582c-0272-adc2d8c4b1cb.png)
| Widget | 効果 |
|:-----------|------------|
| widget       | widgetでWrapしてくれる(基本的にWrapした後に任意のWidget書き換える) |
| Builder      | BuilderでWrapしてくれる       |
| Center       | CenterでWrapしてくれる        |
| Column       | ColumnでWrapしてくれる        |
| Container    | ContainerでWrapしてくれる     |
| Padding      | PaddingでWrapしてくれる       |
| Row          | RowでWrapしてくれる           |
| StreamBuilder| StreamBuilderでWrapしてくれる |

# 方法
WidgetでWrapしたいWidgetにカーソルを合わせて
『cmd』＋『.』(Mac)
を選択します。
すると先ほどの画像のようになります。
最後にどのWidgetでWrapするか選択すればOK！
![スクリーンショット 2023-08-17 16.19.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524075/2fe8c898-6da9-5601-7fc7-37eb7d700242.png)

# 結果
※例としてWrap with Centerを選択した時の結果を載せます。

SizedBoxをWrapした時↓
![スクリーンショット 2023-08-17 16.49.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524075/29f88cae-b2da-40ae-04fb-0bb6516edc2c.png)

TextをWrapした時↓
![スクリーンショット 2023-08-17 16.51.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524075/c1742998-5911-e460-ddd6-30af64be09a4.png)
ディスク容量逼迫の被疑があるディレクトリを探す

## はじめに
すんごい久しぶりにディスク容量の調査を行ったので備忘録。AL2です。

## まず最初に

`df -h`
まずこれを/とかで実行する。
Permission Deniedが出るのでrootにスイッチするかsu -で。

`du -h -d 1 /`
怪しいところを深掘りする。
ちなみに-d 1の意味は以下の通り。ありがとうBing大先生…！
```
このオプションは’depth’（深さ）を意味します。
'du’に対してディレクトリ構造を1レベルだけ深く探索するよう指示します。
この場合、ルートディレクトリ(/)内のディレクトリのサイズだけを計算します。
```

`du -h -d 1 /var/log`
後はモリモリ深掘りする。/var/logは例です

## 次に
`du -hs *`
これを実行すると、各ファイル＆ディレクトリの容量をバーっと出力してくれる。

以下は怪しいディレクトリで実行した例。
わかんなかったら/で実行→でかすぎるサイズになってるフォルダにcd→また実行、を繰り返すと幸せになれる。
```
[sosat117 怪しいディレクトリ]# du -hs *
8.0K	hogehoge.yml
48.0K	hugahuga.txt
10G	    piyo(dir)
```


以上です！
DynamoDBを利用したアプリケーションの脆弱性診断について

:::note warn
2023/08/17時点の情報です。
更新が入ることが考えられるため、公式ドキュメントの確認をお願いします。
:::

## 背景
DynamoDBを利用したWebアプリケーションにおいて、脆弱性診断を受ける必要があった。

## 疑問
AWSのドキュメントを見ると、複数のサービスでは事前申請無しに脆弱性診断やペネトレーションテストなどが実施可能な様子。
だが、DynamoDBが該当していないように見える。。。事前申請いるかもしれない。。。

https://aws.amazon.com/jp/security/penetration-testing/

## 対応
AWSサポートに聞いてみました。
リストにあるものはやはり申請不要らしいです。
> AWS no longer requires prior approval for penetration and valunearability testing.

じゃあ肝心のDyanmoDBはどうなの？というところの回答は以下の通り。
アプリケーションの脆弱性診断という観点では大丈夫そうです。
> If you are only scanning your application and not directly targeting DynamoDB then there should not be an issue.

ちなみに以下のフォームから問い合わせをしました。
ペネとレーションテストの説明ページにリンクがあります。

https://console.aws.amazon.com/support/contacts#/simulated-events

久しぶりにサポートに問い合わせましたが、サクッと回答貰えて一安心でした(´・ω・｀)
dbt-coreにおけるOSS活動ことはじめその9 ~ テストカバレッジをローカルで確認する話 ~

# 本記事が目指すこと
- dbt-coreにおけるOSS活動を始めるにあたってやるべきこと、学びになったことを紹介する
    - 複数回に渡り連載する予定
        - これまでの投稿記事
            - [dbt-coreにおけるOSS活動ことはじめ ~投稿記事まとめ~](https://qiita.com/dai_zamurai/items/e48cc3a4f52adc86ccfc)


# 注意
- 本記事は筆者が所属する会社と関係なく、個人の記事であることをご了承ください

# 背景
- 筆者は、ちゅらデータ株式会社に務める会社員であるが、就業時間中に職務としてのdbt-coreのOSS活動を始めた（OSS活動自体が初めての経験）
- CONTRIBUTING.mdには明示的に記載されてない部分があったため、それらの解説を含む

# 本編
## 前提
本記事執筆時点(2023年8月17日)では、dbt-coreに対してPRを作成し、コミットするとGitHubActionsによるCIテストが自動で実施される。
その際に、[Codecov](https://about.codecov.io/)と呼ばれるコードのカバレッジ情報が表示される可視化ツールを用いて、どの部分のコードがテストされており、どの部分がカバーされていないのかを確認することができる。これがCIに組み込まれており、例えば、追加したコードに対するテストを書き忘れた場合は、マージする前に検知することが可能となる。なお、テストカバレッジに何らかの異常が検知された場合は、そのPRはマージされることはない。

## 問題
さて、この便利なツールであるCodecovだが、問題が1つある。
それは、GitHubのブラウザ上からはcommitしたタイミングでCIが走り、そこから生成されるカバレッジレポートを元にカバレッジを確認可能であるが、**ローカルで確認する手段がない**ということである。（[CodeCov CLI](https://docs.codecov.com/docs/the-codecov-cli)というローカルからCodeCovを操作可能なCLIが用意されているが、アップロード用のトークンがdbt-coreのリポジトリから取得できないため利用できない）
ローカルでカバレッジが確認できないと、不要なcommitを増やすことになり、レビュアーの手間が増えたり、CIによるコストが増加したりで、開発に支障が生じる。

## 問題解決の手順
結論から述べると、[coverage](https://coverage.readthedocs.io/en/7.2.3/)というモジュールを用いてローカル端末からテストカバレッジレポートをブラウザ上で確認できる。
具体的な手順を以下に示す。

1.ローカルでテストを実行する
- 例えば、単体テスト`make test`や統合テスト`make integration`などを実行する

2.`coverage html`を実行する
- dbtv1.6の環境を`make dev`で作成した場合、既にcoverageモジュールがインストール済み。インストールしていない場合は、pipを用いてインストール可能。`python3 -m pip install coverage`

3.`htmlcov/index.html`をブラウザで開く
- VSCodeを使って開発する場合は、ファイルを右クリックして「Open In Default Browser」をクリックすると、カバレッジレポートのページがデフォルトのブラウザで立ち上がる

## 解決できる理由
1.では、`.corverage`というテストカバレッジの内容を含むファイルが作成される。
2.では、`.corverage`を元に`htmlcov`というカバレッジレポートを含むディレクトリが作成される。
3.では、`htmlcov`ディレクトリにある`index.html`ファイルをブラウザで開く。
という流れである

うまくいくと以下のようなページが表示されるはずである

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/df2e6489-a9f4-2c24-17d1-c40b5b3e60f7.png)

特定のファイルについてコード単位でカバレッジが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936440/d41aecba-bb13-2dfa-b46f-5e9b7b180616.png)

以上。追加したコードに付随するテストを開発するときに役立てていただきたい。

# 終わりに
ちゅらデータでは、クレイジーな仲間を募集しているでござる
データエンジニア、もしくはSE系からデータエンジニアになりたい方がいればぜひ、御仁の力量に応じたグレード（ジュニア/ミドル/シニア）にて、応募するでござる

https://herp.careers/v1/churadata/T6Oag1FxE34V
ページネーションの実装方法

```
gem 'kaminari'
```
gemfileに上記のコードを書き、`bundle install`を使ってインストールします。

ページネーションを実装したいモデルのコントローラで、データを取得するメソッドを作成します。例えば、indexアクション内でデータを取得する場合は以下のコードにします。

```
def index
  @shops = Kaminari.paginate_array([]).page(params[:page]).per(10)
end
```
これにより、shopモデルからデータを取得し、pageメソッドでページ番号を指定し、perメソッドで1ページあたりのshop数を指定しています。このコードの場合は1ページに10個の店のを表示します。


次に`config/initializers/kaminari_config.rb`ファイルを作成し、以下のように設定します。

```
Kaminari.configure do |config|
  config.default_per_page = 10
end

```



ビューファイルにページネーションリンクを表示する場合は以下のコードを記載したいファイルに書き加えます。

```
<%= paginate @shops %>
```
これにより、@shopsのページネーションリンクが表示されます。

また、ページネーションのスタイルを変える場合は`pplication.css`にコードを書くことで変更が出来ます。

```
/* application.css */
.pagination-container {
  display: flex;
  justify-content: center;
  margin-top: 20px; /* 必要に応じて適切なマージンを指定してください */
}

/* application.scss */
.pagination-container {
  display: flex;
  justify-content: center;
  margin-top: 20px; /* 必要に応じて適切なマージンを指定してください */
}
```
（自分用メモ）共変性と反変性

プログラミングに関わる身でありながら何となくで避けてきた「共変性」と「反変性」。例え話を考えて少しでも理解できるようにしたい！

## 例

とあるステーキレストランでは、ステーキセットとお子様ランチを料理(メニューという言葉は「出てくる料理」か「お品書き」なのかが分からなくなるため避けた)としている。レストランには接客、そしてお客様がいる。今回は簡単のためにコックは省略する。あるいはコックが接客を兼任しているとしよう。即ち：

```mermaid
classDiagram
    料理 <|-- ステーキセット
    料理 <|-- お子様ランチ
    接客 <.. お客様 : 注文の受付
    お客様 <.. 接客 : 料理の提供
    class 料理 {
        価格: yen
        カロリー: kcal
    }
    class ステーキセット {
        価格: 2000円
        カロリー: 1480kcal
    }
    class お子様ランチ {
        価格: 800円
        カロリー: 900kcal
    }
    class 接客 {
        +提供する(): 料理
    }
    class お客様 {
        +注文する(料理)
    }
```

今回の設定はこのような図に起こせる。

### 共変性

「お子様ランチを料理として扱う」ということになると思われるのだが、これはどういう時か。つまりこの図では「提供する」が該当する。味覚オンチのタキシードを着た客が「一番安い料理、それに調味料ありったけ」と注文して、お子様ランチが出てきても別に問題は無い。これは理解がそこまで難しいものではない。

### 反変性

共変性とは逆に「料理をお子様ランチとして扱う」わけだけど、どういうことだろうか。この図には無いので反則気味だが「料理を比較する」が当てはまる。料理を注文するとき、先ほどの銃みたいな剣を持った客みたいに値段はどうかとか、値段がカロリーに見合っているかとか、カロリー取りすぎじゃないかとか、いろいろ考えるわけだ。しかし、例えばステーキセットが「サーロインステーキ」「肩ロースステーキ」という風に分かれていても、（部位選びという新しい要素はあれど）根本的な料理の選び方は変わらないのではないか。

つまり「ステーキ選びも料理選びと要領が一緒だから、料理選びと同様にステーキを選んでも問題無いよね」というのが反変性だといえよう。

## まとめ

反変性について少し分かったような気がした。でも継承は極力使わないけど。

JavaScriptとTypeScriptの関係も変性と言える。

> TypeScript(上位互換)はJavaScript(下位互換)に変換できる。

これは共変性の好例である。

> JavaScript(下位互換)は妥当なTypeScript(上位互換)である。

まさに反変性を表していると言えよう。
CMLを快適に動かすため、PC自作したお話

CML使うには、結構高スペックPCがいるよと言うお話。

CML（Cisco Modeling Labs）は、Ciscoが公式に出しているネットワークシミュレータで
2023年現在、Cisco自身が（たぶん）プッシュしているCat8000Vといったソフトウェアルータも、バンバン使えたりします。
![001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489719/c7e2765c-67e4-1205-cae8-6ef979b11f64.jpeg)
こんなやつ。

で、CMLの実装については、他の色んなサイトが方法を詳しく書いているので、特にここで述べるつもりはないですが
ストレスなく動かすのに必要なスペックについては殆ど書かれていないため、備忘録も兼ねて控えておこうかと。
<dl>
 <dt>● 「普通の」PCじゃまともに動かん。</dt>
 <dd>最初、自分は普段使いしているMacbook Pro 13inch 2019(RAM16GB)に実装したのですが
ノード一つ立ち上げるのに5分以上かかり「こりゃ使えねー」と言う事で取りやめ。<br>
しかも、立ち上げたら立ち上げたで、ノード毎に下手するとGB単位のメモリ占有、そして複数個のvCPU利用。<br>
例えば、Cat8000V1つ立ち上げると、それだけで4GBメモリが占有されます。<br>
XRv9000だと20GBメモリに4vCPUですよ！<br>
ただ、だからと言ってこのまま何もしないと、CMLのサブスク代（日本円で3万弱/年）が無駄になる・・・。
 </dd>
 <br>
 <dt>●と言う訳でCML用PCを自作する。</dt>
 <dd>（金銭的に）一念発起してPCを自作する事にしました。CML用として利用するため<br>
・RDPでリモート操作するため、グラフィックボードは要らない。CPU内蔵で十分。<br>
・メモリとCPUに全振り。<br>
という条件でパーツ選択。その結果、（2023年2月現在）以下の構成で組む事にしました。
<br>
マザーボード：B760M DS3H AX DDR4<br>
グリス：JP-DX1（まあこれは何でもいいでしょ）<br>
CPU：Core i7 13700（K無し）<br>
OS：Windows 11 Professional 64bit（RDPしたいのでPro版）<br>
電源：RM850e（たぶんオーバースペック）<br>
メモリ：crucial DDR4 32GB*2<br>
ストレージ：crucial M.2 500GB<br>
CPUファン：虎徹Mark3<br>
筐体：ASUSのMicro ATX<br>
<br>
締めて16万超え。まさかシミュレータ動かすだけでこんなに掛かるとは思わなかったですわ。<br>
ただし動作は快適。同時に10個ノード立ち上げても殆どストレスは感じなくなりました。<br>
（CML動かしてるVMWare Playerのメモリ割り当てを増やすとか、windowsの　設定→システム→電源とバッテリの「電源モード」を「最適なパフォーマンス」に設定するとか、細かいチューニング入るけど・・・）
</dl>

ゲーミングPC等と比べたら大した事はないんでしょうが
そういうの全くやらない人間にとっては、結構な出費になるので気をつけましょうというお話でした。
（しかもこの前月にMacBook買い替えしてたし・・・）
iOSでFirebaseとGoogle-Mobile-Ads-SDK両方使っているときのアップデート

iOSアプリでFirebaseとGoogleMobileAdsSDK両方使っているときに、CocoaPodsでFirebaseだけバージョンをあげてpod installしようとすると以下のようなエラーがでる場合があります。

```
Updating local specs repositories
Analyzing dependencies
[!] CocoaPods could not find compatible versions for pod "GoogleAppMeasurement":
  In snapshot (Podfile.lock):
    GoogleAppMeasurement (< 11.0, = 10.12.0, >= 7.0)

  In Podfile:
    Firebase/Analytics (~> 10.13.0) was resolved to 10.13.0, which depends on
      Firebase/Core (= 10.13.0) was resolved to 10.13.0, which depends on
        FirebaseAnalytics (~> 10.13.0) was resolved to 10.13.0, which depends on
          FirebaseAnalytics/AdIdSupport (= 10.13.0) was resolved to 10.13.0, which depends on
            GoogleAppMeasurement (= 10.13.0)

    FiveGADAdapter (~> 1.4.1) was resolved to 1.4.1, which depends on
      Google-Mobile-Ads-SDK (>= 9.0.0) was resolved to 9.14.0, which depends on
        GoogleAppMeasurement (< 11.0, >= 7.0)
```

これはFirebaseが使っているGoogleAppMeasurementがアップデートされたときに起こるエラーで、GoogleMobileAdsもGoogleAppMeasurementを利用しているのでこのようなエラーが発生します。

この場合、以下のようにGoogleMobileAdsSDKをアップデートすると解決します。

`pod update Google-Mobile-Ads-SDK`
【Notion】目次を一瞬で作成する

**Notion**をよく使いますが、意外と知らなかった機能があったので記事にします

# はじめに
Notionまとめていて長くなってくると、やっぱり**目次**を作りたくなる

今までは各ブロックへのリンクをコピって一つ一つ作っていましたが
一瞬でできる機能があることを今更知って絶望しました

# 目次は一瞬で作れる

例えばこんなページがあったとして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633746/2a00346a-ef18-d2ba-c25a-220f95e3b4d5.png)

ページ上部で **`/tableof`** と入力すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633746/d966417d-dbe2-115a-7fc6-37aad2078fde.png)

一瞬で目次ができました！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633746/416c93d5-90bd-0a8c-7eff-e51eccf68e2f.png)

**`/tableof`** もしくは **`/目次`** でも大丈夫です

# おわりに

早く知りたかった。
ubuntuでのwifi設定

ubuntuでwifi接続しようとするが、
設定->wifiでSSIDを選んでパスワードを入れようとすると、認証の無限ループで困った。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/104ab140-20fb-de91-254e-2b5dc18de278.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/dc9b12dd-9c9c-095c-8707-17d4e08ece3f.png)


接続性の確認をオフにすると良いらしいが、自分のマシンではオフにしても、なぜか自動的にオンに戻ってしまう。

https://kledgeb.blogspot.com/2022/05/ubuntu-2204-76.html


## コマンドラインによるwifi設定

nmcliコマンドを使って無事解決した。
```
nmcli device wifi list
nmcli device wifi connect <SSID> password <password>
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/31319d3c-e686-09aa-ec0a-08645e859eae.png)
parcelでサクッとペライチページを作る

parcelを使ってサクッとローカルで確認できるペライチページを作ってみたいと思います。

- pugが使える
- sassが使える
- 複雑な設定が必要ない

ということで、実際にparcelを使ってコーディングする手前までの手順メモです。

# parcelプロジェクトを作る

適当な場所にプロジェクトのディレクトリを作ります。今回は`parcelProject`にします。
```
$ mkdir parcelProject
```

package.jsonを作成
```
$ yarn init -y
```

parcelをインストール
```
$ yarn add -D parcel
```

## HTMLを作る

とりあえずページを表示します。`parcelProject`の中に`src`ディレクトリを作り`index.pug`を作成。
parcelではデフォルトでpugファイルが使用できるようになっています。（pugファイルを見つけると自動で必要なプラグインをインストールしてくれる）
普通のhtmlファイルで作成する場合は、`.pug`のかわりに`.html`ファイルを作成すればOK。
```diff
parcelProject
 ├── node_modules
 ├── package.json
+├── src
+│   └── index.pug
 └── yarn.lock
```

```pug:index.pug
doctype html
html
  head
    meta(charset='utf-8')
    title ぺらサイト
  body
    h1 はろーわーるど！
```


### 出力結果

parcelを起動してページを確認します。今回は`index.pug`をエントリーポイントとして指定。
（htmlファイルで作った人は`.html`で起動してください）
```
$ parcel src/index.pug
```
うまく起動したら`http://localhost:1234/`へアクセス
![スクリーンショット 2023-07-22 3.17.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119908/065660b1-2b1a-a8e8-a67d-9cdae5a8a4a5.png)

## CSSを追加
`src`ディレクトリに`index.sass`を作成。
```diff
parcelProject
 ├── dist
 ├── node_modules
 ├── package.json
 ├── src
 │   ├── index.pug
+│   └── index.sass
 └── yarn.lock
```

```sass:index.sass
h1
  color: coral
```

```diff:index.pug
doctype html
html
  head
    meta(charset='utf-8')
    title ぺらサイト
+   link(rel="stylesheet" href="./index.sass")
  body
    h1 はろーわーるど！
```

### 出力結果
![スクリーンショット 2023-07-22 3.40.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119908/273349d5-51d7-de2e-2168-807fc5d0d007.png)

## JSを追加
`src`ディレクトリに`index.js`を作成。
```diff
ParcelProject
 ├── dist
 ├── node_modules
 ├── package.json
 ├── src
+│   ├── index.js
 │   ├── index.pug
 │   └── index.sass
 └── yarn.lock
```

```javascript:index.js
console.log('hello');
```

```diff:index.pug
doctype html
html
  head
    meta(charset='utf-8')
    title ぺらサイト
    link(rel="stylesheet" href="./index.sass")
  body
    h1 はろーわーるど！
+   script(type="module" src="./index.js")
```

### 出力結果
![スクリーンショット 2023-07-23 15.44.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119908/f91e9a1c-6644-f13e-6d1c-56543da73a91.png)

あとは各ファイルを編集していけばOK!
他ページへのリンクを張ったり、ファイル分割ができたりもするので詳しくは[公式サイト](https://parceljs.org/docs/)をチェック！
【Vue.js×slim】slimタグの書き方でハマった話

# 簡単な環境説明
- Ruby on Rails(v5)
    - viewファイルはslimを使用
- Vue.js(v3)
- Typescript（vueインスタンス作成・コンポーネントのimport〜slimへの受け渡し用）

上記を使用していて、ファイルの読み込みの構成としては

tsファイルコンパイル後のjsファイル→slimファイルのbodyタグの下で読み込み

という構成で、特にvue-routerなどは使用せずにslim経由で部分的にコンポーネントを使用する形を取っている。

```ts:example.ts
import { createApp } from "vue";

import ExampleComponent  from "../../components/ExampleComponent.vue";

document.addEventListener("DOMContentLoaded", () => {
  const app = createApp({
    components: {
      ExampleComponent
    },
  });
  app.mount("#vue-app");
});
```
```slim:slimファイル（#vue-app定義とタグ読み込み）
doctype html
html
body
    main#vue-app
    //〜中略〜
= javascript_include_tag "example.js"  #example.tsがコンパイルされたもの、正確には独自タグを使用してるが今回の箇所に関わらないため割愛
```

```slim:slimファイル（コンポーネント使用箇所）
example-component[
  name="hoge"
  :example-object=@hoge
]
// タグとして読み込む
```
# 問題
コンポーネントの読み込みなどの初期設定をしていた際、slimファイルにて、コンポーネントの呼び出しを仮置きでこんなふうにしていた。

```slim:slimファイル（コンポーネント使用箇所）
example-component[
  

]
```

すると、いくらビルドの再実行などを行っても画像のようにタグがタグのままになっていてコンポーネントが読み込まれてくれなかった..

![スクリーンショット 2023-08-16 22.39.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955938/ff5ecb60-eadb-48ab-16c0-eaa4af9f6915.png)

# 確認した場所

一旦コンソールを見てみると、こんな警告文が。

```devtool:devtoolのコンソール
runtime-core.esm-bundler.js:179 [Vue warn]: Failed to resolve component: example-component
If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.
```

オプションの設定が原因なのかな？と思い[vueの公式ドキュメント](https://ja.vuejs.org/guide/extras/web-components.html)などを参考に、tsファイルに以下を追記

```ts:example.ts
import { createApp } from "vue";

import ExampleComponent  from "../../components/ExampleComponent.vue";

document.addEventListener("DOMContentLoaded", () => {
  const app = createApp({
    components: {
      ExampleComponent
    },
  });
  app.config.isCustomElement = tag => tag === 'example-component' //こちらを追記
  app.mount("#vue-app");
});
```

すると、先ほどの警告文は消えるもタグが読み込まれず...

# 解決法
色々と既存のうまくいってる箇所と置き換えたりなどして検証している際に、

```slim:slimファイル（コンポーネント使用箇所）
another-component[]　　　//改行を入れていない！
```

こうしている状態でうまくいっている箇所を発見。

なるほど...🥲と思い改行を削除することで、無事コンポーネントが表示された。

# わかったこと、反省点

propsを渡さないとき（滅多にないが、今回のように仮に設置する場合など）は、大カッコ`[]`の中に改行を入れてしまうと今回のようにコンポーネントとして読み込んでもらえないとは思わず、先に他の箇所を疑ってしまった..

（試しにpropsが渡されている状態で改行を入れてみると普通に読み込まれていたので、上記パターンでしか発生しないと理解していますが、理由がわかっていないため何かご存知の方いらっしゃいましたらコメントいただけると幸いです。）

今の構造でvueを利用するときは関連ファイルが多いし、記述しないといけないものも多いので、凡ミスには気をつけたい。

また、調査の際は面倒がらずに思い切ってうまくいっている箇所と置き換えてみるのも大切だと改めて感じた。
VSCode+TypeScript+ESLint+Prettierの環境立ち上げ方法まとめ

# 前提

以下の環境のプロジェクトのセットアップをしたい。

- **VSCode** - 開発環境
- **TypeScript** - 型つきJavaScript
- **ESLint** - JS/TSの静的解析
- **Prettier** - コードフォーマット
- **yarn** - パッケージマネージャー

# 手順

## VSCodeの設定

### 拡張機能インストール

- [ESLint (dbaeumer.vscode-eslint)](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
  - ESLintがVSCodeと連携するために必要
- [Prettier - Code formatter (esbenp.prettier-vscode)](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
  - PrettierがVSCodeと連携するために必要
- [Error Lens (usernamehw.errorlens)](https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens)
  - エラーが見やすくて便利

### `.vscode`以下の設定ファイル作成

#### .vscode/extensions.json

上記で入れた拡張機能を他の入れてないメンバーに促せるようにする

```json
{
  "recommendations": [
    "dbaeumer.vscode-eslint",
    "esbenp.prettier-vscode",
    "usernamehw.errorlens",
  ]
}
```

#### .vscode/settings.json

```javascript
{
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.formatOnSave": true,
  "editor.tabSize": 2
}
```

## .gitignore作成

```
node_modules/
```

## package.json作成

```
yarn init -y
```

## パッケージインストール

```
yarn add --dev typescript eslint prettier eslint-config-prettier
```

## tsconfig.json作成

```json
{
  "compilerOptions": {
    "target": "es2016",
    "module": "commonjs",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true,
  },
  "exclude": ["node_modules"],
  "include": [
    "**/*.ts",
  ],
}

```

## .eslintrc.json作成

```json
{
  "env": {
    "browser": true,
    "es2021": true,
    "node": true
  },
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended",
    "prettier"
  ],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaVersion": "latest",
    "sourceType": "module",
    "project": "./tsconfig.json"
  },
  "plugins": ["@typescript-eslint"],
  "rules": {
  }
}
```

## .prettierrc作成

```json
{
  "printWidth": 80,
  "tabWidth": 2,
  "singleQuote": true,
  "trailingComma": "all",
  "semi": false,
  "endOfLine": "lf"
}
```

## （参考）package.jsonの中身

```json
{
  "name": "langx-firebase-sdk",
  "version": "1.0.0",
  "main": "index.js",
  "author": "My Name <my-name@domain.com>",
  "license": "MIT",
  "devDependencies": {
    "eslint": "^8.47.0",
    "eslint-config-prettier": "^9.0.0",
    "prettier": "^3.0.2",
    "typescript": "^5.1.6"
  }
}
```


# 注意

- `eslint-plugin-prettier`は入れない
  - ESLintの「静的解析」の機能にPrettierのルールを連携させる＝Prettierに従っていないとESLintに怒られるようになる。
  - [この記事](https://knote.dev/post/2020-08-29/duprecated-eslint-plugin-prettier/)によると、Prettierまで怒られるのは煩わしいので非推奨になっているとのこと

# 参考

https://zenn.dev/kohski/articles/eslint-prettier-integration

https://zenn.dev/crsc1206/articles/d92548257fb445

https://knote.dev/post/2020-08-29/duprecated-eslint-plugin-prettier/
【SwiftUI】Previewで表示されているかを判定する

# はじめに
![スクリーンショット 2023-08-17 15.35.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a92c238b-b39c-49f8-4b9a-9edb93b335ed.png)

# 実装
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
            Text("Previewです")
        } else {
            Text("Previewではないです")
        }
    }
}
```

# おわり
こんなことができるんですね

# 参考記事
https://blog.personal-factory.com/2021/06/01/swiftui/
【Spring Data JDBC】VScodeで@Queryの引数に@Paramを使わないと怒られる

# はじめに
EclipseからVScodeに変更して突如、
Springから怒られたので、備忘録として残します。

# 問題
起動すると以下のエラーが出力されました。
```:エラー
For queries with named parameters you need to provide names for method parameters; 
Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters
```

DeepLで翻訳すると以下の通りです。
```:エラー
クエリーのメソッド・パラメーターには@Paramを使うか、
Java 8+の場合はjavacフラグ-parametersを使う。
```

# 解決方法
Repositoryの@Queryの引数に@Paramを使うと動きました。[参考リンク](https://deonggi.tistory.com/121)

# Repositoryを変更してみる

```java:Repository.java(変更前)
public interface Repository extends CrudRepository<Users,Integer>{
	//ユーザ登録
	@Modifying
	@Query("insert into users (name,password) values (:name,:password)")
	void createUser(String name,String password);
```

```java:Repository.java(変更後)
public interface Repository extends CrudRepository<Users,Integer>{
	//ユーザ登録
	@Modifying
	@Query("insert into users (name,password) values (:name,:password)")
	void createUser(@Param("name") String name,@Param("password") String password);
```

# 終わりに
初歩的なことですが、
エラー文で検索して日本語で解説されたページがなかったので残しておきます。
参考になれば幸いです。
OpsRamp ワークフローのメール送信方法について

本記事では、OpsRamp ワークフローのメール送信方法について説明します。

# 概要
OpsRampのワークフローでは、Send Taskを使用してメールを送信することができます。
[Task reference](https://docs.opsramp.com/solutions/remediation-automation/process-automation/process-definitions/processdef-reference/#task-reference)

# 設定の説明
Send Taskを使用するためには、事前にアラートのメールテンプレートを設定しておく必要があります。
Send Taskを配置するには、「Task」のスパナマークからSend Taskをクリックします。
![send-task.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/ca7b184e-d7e0-9511-66ac-943187d16bd3.png)

- メールテンプレート
メールテンプレートは、Setup > Notifications > Templatesから設定することができます。
Input Type: 目的に合ったものを選択します。選択したものによってTokensが異なります。
![alert-template.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/9581e931-147f-1d19-db7d-97c6bd8948fd.png)
- Send Task
Input: メールテンプレートに渡す変数を指定することができます。指定された変数は、メールテンプレートのSubejctまたはEmail Contentで使用することができます。
Message Recipient: メールを受信するユーザを指定します。
Notification Template: 作成したメールテンプレートを指定します。
![send-task-properties.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/e3dab1ad-ec82-7bb7-d697-e97e61779e6a.png)


---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
Combine PublisherをSwift Concurrencyに変換する

# 結論

Publisher→AsyncSequence→Swift Concurrencyの順番に変換してawaitで処理を行えるようにします。

# 概要

CombineのPublisherをSwift Concurrency(await)として扱いたい場合、以下のようなextensionを作成することにより、`value`として値を取得することができます。

それぞれ、エラーを返す場合とエラーを返さないNever向けのextension `value`のプロパティを作成しています。
`values`は元々ある、AsyncSequenceプロトコル適合の `AsyncPublisher` or `AsyncThrowingPublisher` です。
詳しい説明は[こちら](https://qiita.com/hyuga_amazia/items/c25f6b2fbd6db951e4eb)。
最終的にAsyncSequenceの最初の値を返すことでPublisherのSwift Concurrency変換を行います。


```swift
extension Publisher where Failure == Never {
    var value: Output {
        get async {
            await self
                .first()
                .values
                .first { _ in true }!
        }
    }
}

extension Publisher {
    var value: Output {
        get async throws {
            try await self
                .first()
                .values
                .first { _ in true }!
        }
    }
}
```

## 用例
URLSessionに、Publisherを返してくれる`dataTaskPublisher`があるので、Qiita APIからタグを取得する例をあげます。
Publisherに備わっているmapやdecodeを利用しつつ、Swift Concurrencyとして処理が可能です。


```swift
struct Tag: Decodable {
    let followers_count: Int
    let icon_url: String?
    let id: String
    let items_count: Int
}
```


```swift:loadWithError.swift
    func loadWithError() async throws -> [Tag] {
        try await URLSession.shared.dataTaskPublisher(for: URL(string: "https://qiita.com/api/v2/tags?sort=count")!)
            .map(\.data)
            .decode(type: [Tag].self, decoder: JSONDecoder())
            .value
    }
```

```swift:load.swift
    func load() async -> [Tag] {
        await URLSession.shared.dataTaskPublisher(for: URL(string: "https://qiita.com/api/v2/tags?sort=count")!)
            .map(\.data)
            .decode(type: [Tag].self, decoder: JSONDecoder())
            .replaceError(with: [])
            .value
    }
```
AWS認定 SysOps Administrator- Associate(SOA-C02) 合格体験記

# はじめに
将来的にAWSの6冠を達成したいということで、少し前にDVA取得したので、続けてSOAに挑戦しました。

# スコア
**776/1000**

合格できましたが、勝手に目標点としていた800点を超えられず。。。
体感ですがDVAより即答できる問題が少なかったかなという印象です。
また、どうしても運用系で出てくるような問題の状況をハンズオンで再現するのが難しく、、、
イメージに結びつかず、その辺が点数に反映されてしまったと考えています。

# 受験対策

### 書籍
- AWS認定資格試験テキスト AWS認定 SysOpsアドミニストレーター[アソシエイト]

主に問題集実施前に一通り理解するために読み込みしました。
また、わからないところやちょっと理解が怪しいところなどを調べるような辞書的な使い方をしていました。

### Web問題集
https://kws-cloud-tech.com/

- 資格会員コース

10問単位で実施できるので、4～5周くらい実施しました。
DVA受験時と同じく、間違えた問題の解説はよく読んで、それでもわからなければググるなり本で調べるを繰り返しました。解説に画像がある問題もあり、どうしてそれが正解なのかのイメージが比較的湧きやすかったと思います。

### 公式模擬試験
公式にある模擬試験です。
解説もあるので、今回も本番の受験前に実施しています。
20問ほどの模擬試験ですが、本番受験前に7割ほどの得点率でした。
最終的には、何回か繰り返し実施しています。

# 受験方法
テストセンターで受験しました。
試験に集中したいというものあり、テストセンターでの受験を個人的におすすめしています。

# 対策など
どうしても試験でよくわからない問題が出てきます。
そういうところはきっぱりとあきらめ、取れるところで点を取っていくことが大切だと思います。
公式の試験ガイドに具体的に書いてあることは抑えておく必要があると思います。

# Associateレベルの難易度ランキングと所感
あくまで個人的な感想ではありますが、Associateの各資格の難易度については以下のようなイメージです。
**SOA>>SAA>>>>DVA**

SAAも難しかった印象が結構強いのですが、どちらかというと「CLF」→「SAA」の難易度の上がり方に驚いたというのが大きいので、対策のしずらさなどを加味するとSOAの方が難易度は高い印象です。
DVAについては、キャリア的に開発をやっているというのもあり、比較的イメージしやすく簡単な印象でした。

# おわりに
まず、合格できてよかったです。
試験の内容に関係ないですが、やっぱり受験後に合格・不合格が画面に出るようにしてほしいなぁというのが個人的な感想ですかね。
結果でるまでソワソワするんですよね。。。
結果については、午前中に受験したので、夕方くらいに出ていました。
次は初のプロフェッショナル資格であるDOPの受験をしたいと考えてます。
KatalonStudio実行時にユーザーからの入力を受け付けるには

KatalonStudioでテストを作っている人と実行する人が違う場合、スクリプト内の値を変更する必要があると実行者にとって難しい場合があります。
そのためテストケースを実行したときに、実行者に必要な情報を入力させる仕組みにしたいと思い探してみると[コチラ](https://forum.katalon.com/t/prompting-user-input-during-automation/9302)に方法の記載がありました。

## コードサンプル
```
//必要なインポート
import javax.swing.JFrame
import javax.swing.JOptionPane

'Jframeを作成する'
JFrame frame = new JFrame()
'Jfarmeにフォーカス'
frame.requestFocus()
'url入力を受け付ける'
String url = JOptionPane.showInputDialog(frame, '行きたいWebサイトのURLを入力してください')
'ブラウザを開く'
WebUI.openBrowser('')
'入力されたURLへ遷移する'
WebUI.navigateToUrl(url)
'10秒まつ'
WebUI.delay(10)
'ブラウザを閉じて終了'
WebUI.closeBrowser()
```

## 実行
実行するとURL入力を促すポップアップが表示され、入力したURLに遷移します。
![popup_preview.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/0f61061d-dfb8-a56b-a6be-e1c76f6019a7.gif)
配列から列を削除したい時_VBAで

# 配列から不要な列を削除します
エクセルVBAでの内容です。
シートの表を2次元配列に入れて、その後に不要な列を削除したい時にこのコードを使います。

```vb

Function 配列の列を削除(myArray As Variant, arrayDeleteCol As Variant)
'配列から対象の列を削除する

    Dim deleteColCount As Long
    Dim arrayRemove
    Dim col As Long
    Dim row As Long
    Dim delColCnt As Long
    Dim isDelCol As Boolean
    Dim ary

    '削除する列の数
    deleteColCount = UBound(arrayDeleteCol) - LBound(arrayDeleteCol) + 1
    
    '削除する列数分だけ減らした配列をつくる
    ReDim arrayRemove(LBound(myArray, 1) To UBound(myArray, 1), LBound(myArray, 2) To UBound(myArray, 2) - deleteColCount)
    
    For col = LBound(myArray, 2) To UBound(myArray, 2)
        
        '削除対象の列か確認
        isDelCol = False
        For Each ary In arrayDeleteCol
        
            If ary = col Then
                isDelCol = True
                Exit For
            End If
        Next
        
        
'        削除対象の列だったら一つ右の内容をずらして入れる
        If isDelCol Then
            
'            削除するので一列分プラスする
            col = col + 1
            
'            削除した回数だけ調整するので足していく
            delColCnt = delColCnt + 1
            
'            最終列が削除対象の時にarrayRemoveの方が範囲が小さいので
'            何もせずに飛ばして終わる
            If UBound(arrayRemove, 2) < col - delColCnt Then Exit For
            
            For row = LBound(myArray, 1) To UBound(myArray, 1)
                arrayRemove(row, col - delColCnt) = myArray(row, col)
            Next
            
'            削除のため調整した列を戻す
            col = col - 1

        Else
            
            For row = LBound(myArray, 1) To UBound(myArray, 1)
                arrayRemove(row, col - delColCnt) = myArray(row, col)
            Next

        End If
    Next

    配列の列を削除 = arrayRemove
      
End Function

```

# 使う時の例
こんな表があったとして
※個人情報テストデータジェネレーターです
https://testdata.userlocal.jp/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383487/a5ede5ec-d5b8-786a-1a26-7dd219522e0a.png)

```vb

Sub 使う時の例()

    Dim myArray
    Dim deleteArray
    
    myArray = ActiveSheet.Range("A1").CurrentRegion
    deleteArray = Array(3, 4)
    
    myArray = 配列の列を削除(myArray, deleteArray)
    
   ThisWorkbook.Worksheets("Sheet2").Range("A1").Resize(UBound(myArray, 1), UBound(myArray, 2)) = myArray
    
End Sub

```

この場合だと`deleteArray = Array(3, 4)`で「年齢、生年月日」を削除指定しているので、このようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383487/71337979-3427-00bc-bb91-73a4b6aa0508.png)

列はEnumとかにしておけば、削除したい列を指定しやすいかもです。
こういう時は、列名をそのまま日本語で使う派です。
`col.`でインテリセンスきいて日本語出てくれるのが分かりやすいので。
`deleteArray = Array(col.年齢, col.性別)`みたいに。

```vb

Enum col

    氏名 = 1
    ひらがな
    年齢
    生年月日
    性別
    血液型

End Enum

```
【暗号通貨】パスワードを明かすことなく、パスワードを知っていることを証明するには？

このドキュメントは、Zeneca @ZENECA メールマガジン[「Letters from a Zeneca」"Letter 47: ZK-Proofs (Part 1)"](https://zeneca33.substack.com/p/letter-47-zk-proofs-part-1?utm_source=post-email-title&publication_id=375410&post_id=136143472&isFreemail=true&utm_medium=email)の内容を要約したものです。

### イントロダクション
暗号の分野で新しいことを学ぶとき、特に技術的なことを学ぶとき、私のプロセスはたいてい次のようなものです。

➀一度聞いたことは無視する
➁もう一度聞く、無視する
➂何十回も聞けば、ほんの少し注意を払うようになるかもしれない
➃ググる

物事が複雑で専門的であればあるほど、私はググったり深く調べたりする要素を後回しにしてしまいがちです。だから、何年もの間、暗号資産という「暗号の世界」にいたのに、今になって「ゼロ知識性」（zero knowledge）がいったい何なのかを理解しようとしているのです。

要点を述べると、「ゼロ知識性」は私たちのスケールを助ける、空想的な数学/暗号学的なものであり、イーサリアムの開発者ヴィタリック・ブテリン（Vitalik Buterin）は、このことに本当に興奮しているということ。私はしばらくの間、「ゼロ知識性」について極めて素人的な理解をしていました。

「ゼロ知識」「ゼロ知識証明」について、早速見てみましょう。

この話は、おそらく「前編／後編」あるいは、それ以上のシリーズになるように思います。今回の話は、恐らくハイレベルな内容になるでしょう。私はエンジニアではないので、「ゼロ知識証明」の複雑さ、奥深さを理解しているふりはしません。「ゼロ知識証明」とは何か、 どのように暗号の世界で使われているのか、なぜ重要なのかを説明したいだけです。


### ゼロ知識証明（zero-knowledge proof）とは何か？
「ゼロ知識（ZK）」は "Zero Knowledge" 、「ゼロ知識証明（ZK-P）」"Zero Knowledge Proofs" をそれぞれ指しています。これらは、一体どういう意味でしょうか？

極めて簡単に言えば、「情報そのものを明かすことなく、ある情報を知っていることを証明する方法」のことです。

言い換えると？…「相手に秘密を直接伝えず、秘密を知っていることを証明する方法」。

もっと端的に？…「パスワードを教えずに、パスワードを知っていることを証明する方法」。

こう考えると、分かりやすいでしょうか。

「ゼロ知識証明」の典型的な例として、よく挙げられるのが『ウォーリーを探せ』です。「ゼロ知識証明」は、ウォーリーの居場所を指し示したり、居場所に関する追加情報を公開することなく、「私は、ウォーリーの居場所を知っています」と証明することを可能にします。どうでしょう…ちょっとクレイジーですか？

でも事実、可能なんです。

※この「ウォーリーを探せ」の例を分かりやすく説明しているnoteがあります。esさんが書かれたnoteにて詳しく解説がされていますので、ぜひご覧ください。

https://note.com/strictlyes/n/n4566802b2830

![](https://substackcdn.com/image/fetch/w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F410f1d9a-65a6-47a7-95b2-454f46173270_1024x768.gif)

ウォーリーの正確な場所を教えることなく、見つけたことを証明するには…

ウォーリーだけが見えるように、ウォーリーの形に切りぬいた大きな紙を用意すればいいんです。こうすることで、ウォーリーだけを見ることができます。ウォーリーの正確な位置は一切開示していません。この紙を絵に被せるだけでいつでも、ウォーリーを見つけたことを証明できます。

※これは、上記のnoteで示された「証明２」に該当します。

この（やや）単純な概念を数学的に証明するのは難しいものです。このアイデアは、1985年にMITの論文でシャフィ・ゴールドワッサーとシルヴィオ・ミカリによって発表されました。

### ゼロ知識証明は、どのように利用されているのか？
「ゼロ知識証明」は暗号通貨の分野では、新しいものではありません。「ゼロ知識証明」をベースとした、2つの人気のレイヤー１ブロックチェーンとして、MoneroとZcashがあり、それぞれ2014年と2016年にローンチされています。

※「レイヤー１って…？」という方は、ぜひコチラの記事をご覧ください。
https://miuradonuts.com/2023/08/10/from-zeneca007/

これらが、「プライバシー重視」のブロックチェーンとして知られているのは、ビットコインやイーサリアムのように公開台帳へウォレット残高や取引履歴・取引データが含まれているのとは異なり、MoneroやZcashでは「ゼロ知識証明」を使ってその情報さえも暗号化・隠蔽しているからだと言われています。

例えばZcashでは、ブロックチェーンにトランザクションを送る時。パブリックブロックチェーンに、トランザクションを送るとの違って、自分の過去のトランザクションを明かすことなく、二重払いしていないことの証拠を送るようになっています。

この種の、秘匿性の高いブロックチェーンには賛否両論があるのも事実です。例えば、記録を見られるようにしたり、証明や説明責任のために、取引を公開請求されるのはよくあることでしょう。

### ゼロ知識証明は、なぜ重要か？
「ゼロ知識証明」は、人と人との間のプライバシー、セキュリティ、信頼性を大幅に向上させることができます。

例えば…

・個人情報を明かすことなく、あなたが本物の人間であることを証明できる
・口座の残高を明かすことなく、残高が○○円以上であることを証明できる
・パスワードを入力することなく、パスワードを知っていることを証明できる

プライバシー、セキュリティー、そして信頼性を重視する空間において、「ゼロ知識証明」は探求すべき可能性の世界全体を切り開くでしょう。

「ゼロ知識性」がどのようなものなのか、このようなフレーズが飛び交うのを聞いたり見たりしたときに、少しでも理解していただければ幸いです。暗号における「ゼロ知識証明」の実用的な用途の背後にある長所と短所について、さらに深く掘り下げて理解するのが楽しみです。

次回へ続きます。

この記事は、著者が運営するメディア「ぬるぺでぃあ」でも読むことができます（記事は[コチラ](https://miuradonuts.com/2023/08/17/from-zeneca008/)）
![](https://miuradonuts.com/wp-content/uploads/2023/06/ヘッダーエリア画像作成.png)
DynamoDB - スロットリング対応、TransactWrite、BatchWrite使い分けメモ


# 内容

TransactWriteで1000レコードの登録を行ったところ、
ThrottlingExceptionが発生したため、その対応と、
TransactWrite、BatchWrite使い分けメモ

# DynamoDB スロットリング発生原因

以下、一般的な発生原因

https://repost.aws/ja/knowledge-center/on-demand-table-throttling-dynamodb

1. トラフィックが前のピークに比べて 2 倍以上である。
2. トラフィックがパーティションごとの最大値を超えている。
3. トラフィックがテーブルごとのアカウントクォータを超えています。
4. テーブルのグローバルセカンダリインデックスがスロットルされている。

以下、1に関するもう少し詳細な情報
[ピークトラフィックとスケーリングプロパティ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html#HowItWorks.InitialThroughput)

```text
オンデマンドモードの DynamoDB テーブルは、
テーブル上の以前のピーク トラフィックの最大 2 倍に即座に対応します。
1 秒あたり 50,000 読み取りが以前のトラフィックのピークである場合、
1 秒あたり最大 100,000 読み取りの持続的なトラフィックに即座に対応します。
30 分以内に前のピークの 2 倍を超えると、スロットルが発生する可能性があります。
```

以降、2に関して検討、対応事項

## トラフィックがパーティションごとの最大値を超えている

https://repost.aws/ja/knowledge-center/on-demand-table-throttling-dynamodb
上記には、

```text
テーブルの各パーティションは、
最大 3,000 の読み取りリクエスト単位または 1,000 の書き込みリクエスト単位、
またはその両方を線形的に組み合わせることができます。
パーティションへのトラフィックがこの制限値を超えると、
パーティションがスロットルされる可能性があります。
```

とある。可能性があるという表現から絶対にスロットルされるわけではない

リクエスト単位については、
[リードリクエストユニットとライトリクエストユニット](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html)に以下のように記載されている。

- 1読み取りリクエスト単位 = 4KB未満の読み取りリクエスト
- 1書き込みリクエスト単位 = 1KB未満の書き込みリクエスト
- トランザクションリクエストの場合、リクエスト単位は上記の2倍

今回の現象としては、
10回程度TransactWriteで1000レコードの登録を実行した際に、
1回のみThrottlingExceptionが発生した。
そのため、TransactWriteをBatchWriteに変更し、
消費するリクエスト単位を半分にすることで対応。

CloudWatchでCapacityUnitsをTransactWriteとBatchWriteで実際に2倍消費していることが確認できた。

![batchwrite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/342baf2b-d135-1bdd-e7ee-d61fbac8a904.png)


TransactWriteによるトラフィック超過ではない場合、
パーティションのトラフィックを分散するため、[書き込みシャーディング](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-partition-key-sharding.html)を利用し、
PKにサフィックスを付ける等の対策が必要

# TransactWrite

[TransactWriteItems](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/transaction-apis.html#transaction-apis-txwriteitems)

- 複数テーブルに対して一括で操作可能
- 一度のリクエストで最大 100 個の項目の挿入、更新、削除操作可能
- 操作途中でエラーとなった場合、全て操作前の状態に戻る
- リクエストに条件（`Condition`）を指定することができる

エラー発生時に全てロールバックされるため、
複数の操作が同時に完了する必要がある場合、複数項目の整合性が取る必要がある場合に有効

# BatchWrite

[BatchWriteItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html)

- 複数テーブルに対して一括で操作可能
- 一度のリクエストで最大 25 個の項目の挿入または削除操作可能
- 更新操作は不可、ただし、既存項目に対する挿入を実行すると上書きとなる（エラーにならない）
- リクエストに条件（`Condition`）を指定することはできない
- 操作途中でエラーとなった場合、一部は成功し、一部は失敗した状態となり、
    失敗した項目は`UnprocessedItems`として返却される

DBに対するリクエスト（通信）回数削減、つまり処理時間の削減が可能なため、
大量な項目の追加/削除に有効
共有フォルダにある実行ファイルを実行中にそのファイルを更新する手法

<font COLOR="blue" >

### 1.説明</FONT>

- まず、皆で使ってもらうアプリを作ったら拡張子をORG等に変えて共有フォルダに配置。
- 下のソースをメークして出来たEXEを共有フォルダに配置。ファイル名は不問。
- 利用者はこのEXEを実行してもらう。
このEXEは共有フォルダにあるORGに拡張子を変えた実行ファイルをローカルのマイドキュメントにEXEと拡張子を戻してコピー。
(必ずあるC:\\ に書き込みたいが端末によってはC:\\の書き込みが不可の場合があるので仕方なくマイドキュメントに出力)

- その後、そのEXEを起動。
動いているアプリはローカルにコピーしたファイルを実行しているので共有フォルダにあるファイル(ORG)は何時でも更新可能になる。

ShellExecute ()の /e オプションを付けて起動。
アプリの方で /e オプションを付けて起動しているか確認させる。
(やらなくても可)

<font COLOR="blue" >

### 2.C++ (c#など他の言語でも可)
</FONT>

```c++


// (C) inf102 s.h
// 2023.

#include <tchar.h>
#include <iostream>
#include <shlobj.h>

int main() {

	std::wcout << "init app.\r\n";

	// Mydoc PATH
	wchar_t  waFolderPath[MAX_PATH];
	SHGetSpecialFolderPath(NULL, waFolderPath, CSIDL_PERSONAL, 0);
	
	wchar_t EXEFILE[50] = L"\\DAD.EXE";
	wcscat_s(waFolderPath, EXEFILE);
	
	CopyFile ((LPCTSTR)L"\\\\xx.31.1.3\\Users\\nxx\\DAD\\DAD.ORG",waFolderPath, false);
	std::wcout << "exec app.\r\n";
	ShellExecute (NULL, (LPCTSTR)L"open", waFolderPath, (LPCTSTR)L"/e", NULL, SW_SHOWNORMAL);
}

```
VSCodeでテキストマイニング用の環境構築を速攻で作る

## この記事は何？
VSCodeで初めてのテキストマイニングに挑戦、その学習ログです。
「pythonによるテキストマイニング入門」（山内長承）を参考図書に、環境構築してみます。

## 環境
VSCode
※そもそもVSCodeをインストールしていない場合は[▶こちら参照](https://qiita.com/kame_house_0828/items/1b8beccac82b9f8f7cfc)

## 必要なパッケージをインストール
numpy、scipy、matplotlib、pandas、sklearnはインストールされている前提

```python
# まずpipコマンドをアップグレード
python -m pip install --upgrade pip setuptools
```

```python
# 軸のラベル、凡例を日本語文字列にする
pip install japanize-matplotlib
```

```python
# 回帰分析のモジュールに使用
pip install statsmodels
```

```python
# Word2Vec、意味解析を行う用
pip install gensim
```

```python
# 自然言語処理パッケージ
pip install nltk
```

<font color="red">**【注意】ダウンロードにかなり時間かかる**</font>
```python
import nltk
nltk.download()
```
以下の小窓が出てくるので、Downloadをクリック
※この切り抜きはDownloadをクリックした後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179561/2d57ec6a-fe6f-6268-1d3d-2ba944f0e40a.png)

```python
# ここ別にしなくてよし
# ダウンロード完了したら、jeitaをimportしファイル内容を確認
from nltk.corpus import jeita
jeita.readme()
jeita.fileids()
```

MeCabもインストール
```python
# 形態素解析
pip install mecab-python3
```


これでいったん環境は整ったはず
TypeScriptでUnion型とIntersection型の使い分け

# はじめに

TypeScriptでは、型の柔軟性を向上させるために多くの高度な型が導入されています。その中でも、Union型（`|`を使用）とIntersection型（`&`を使用）は、異なる型の組み合わせを表現するための強力なツールです。この記事では、これらの型の基本的な使い方と、それぞれの適切な使用シーンについて解説します。

## Union型: 複数の型の中から一つを選ぶ

Union型は、変数が持つことのできる型を複数指定するためのものです。これにより、ある変数が複数の異なる型の値を取る可能性がある場合に使用します。

```typescript
type StringOrNumber = string | number;

let value: StringOrNumber;
value = "Hello";  // OK
value = 123;      // OK
```

### 使用シーン
- 関数の引数や返り値が複数の型のいずれかである場合。
- APIの応答や外部のライブラリから取得するデータの型が不定である場合。

## Intersection型: 複数の型の特性をすべて持つ

Intersection型は、複数の型がすべて持つ特性を組み合わせるためのものです。オブジェクトの型を合成する場面でよく使用されます。

```typescript
type Name = {
    name: string;
}

type Age = {
    age: number;
}

type Person = Name & Age;

const person: Person = {
    name: "Alice",
    age: 30
};
```

### 使用シーン
- 既存の型を拡張して新しい型を作成する場合。
- 複数のインターフェースや型を組み合わせて、一つのオブジェクトの型を定義する場合。

## まとめ

Union型とIntersection型は、TypeScriptの型システムを最大限に活用するための重要なツールです。Union型は「この中から一つ」という選択を、Intersection型は「これらすべて」という組み合わせを表現します。それぞれの特性を理解し、適切な場面で使用することで、より強固で読みやすいTypeScriptのコードを書くことができます。
【GitHub Copilot】完全自己流コードリーディング

どうもです。IT系の専門学生のあまみやです。

今回は短めですが、自分なりのコードリーディング方法をメモ代わりに書いていきます。

# GitやNextJSの内部構造を理解したい

最近は自作のJavascriptやWebフロントエンド・AI・管理ツールなどいろいろな用途向けのライブラリを自作することにはまってます。そこで既存のオープンソースフレームワークやライブラリを参考にいろいろ開発してみているのですが、ぱっと見だとさすがに何がなんだかわからないので(汗)下記の方法で解読していっています。

 1. GitHubでフレームワークのリポジトリを開く
 2. 気になる部分のコードをコピー
 3. CopilotやChatGPTに投げて"これは何をしているコードですか? ちなみにこの言語は○○です"

これをひたすらくりかえして学習していってます。

ただ個人的にはもう少し効率的に勉強したいですね。💦
Web技術に関する基本用語の解説

インターネット上において、文書等のコンテンツを公開・閲覧をするためのシステムをWebと言います。本記事では、そんなWebを支える技術、その中でも特にHTTPに関する基本用語を中心に簡潔に解説いたします。

## HTTP
ネットワークに接続した機器同士がやり取りをする際に従うあらかじめ決められた共通のルールを「プロトコル」と言います。「HTTP(HyperText Transfer Protocol)」は、クライアント（例：Webブラウザ）とサーバー（例：Webサーバー）間においてWebコンテンツを送受信するためのプロトコルです。例えば、Webページを閲覧する際には、WebブラウザからWebサーバーに対して要求を送り、その要求に対する応答をWebサーバーからWebブラウザに送るというやり取りが行われていますが、HTTPはその手順や内容を定めています。

## リクエストとレスポンス
クライアント（例：Webブラウザ）からサーバー（例：Webサーバー）に対する要求を「リクエスト」、サーバーからクライアントに対する応答を「レスポンス」と呼びます。例えば、WebブラウザでWebサイトを閲覧する際のプロセスは以下のようになります。
 1. Webブラウザ：URLやリンク情報に基づいたデータの要求（リクエストメッセージ）をWebサーバーに送信
 2. Webサーバー：リクエストメッセージの受信及び要求内容の解析
 3. Webサーバー：要求されたデータ（レスポンスメッセージ）をWebブラウザに送信
 4. Webブラウザ：レスポンスメッセージの受信及び応答内容の解析
 5. Webブラウザ：Webページとして表示（目的を達成するために必要な処理を行う）

## ステートレスとステートフル
HTTPの重要な特徴として、「ステートレス」であることが挙げられます。ステートレスとは、「状態を保持しないこと」と言う意味です。そのため、ステートレスなプロトコルであるHTTPにおいては、リクエスト/レスポンスという１往復のやり取りで処理が完結し、他の処理と関連付けられることはありません。対して、「ステートフル」なシステムにおいては、「状態が保持」され、次の処理内容にやり取りが反映されます。一見ステートフルなシステムの方が優れているように見えますが、１つのサーバーに対して多数のクライアントがやり取りをする場合には、状態を保持していてはサーバーの負担が大きくなってしまうというデメリットがあります。

## クッキー
上記の通り、HTTPはステートレスなプロトコルであるため、ショッピングサイトのように状態を保持・管理する必要がある際には、「クッキー」というデータが使用されます。クッキーを使用したやり取りにおいては、接続してきたWebブラウザに対しWebサーバーから、Webブラウザに保持してもらいたい情報をクッキーとして送ります。Webブラウザが送られてきたクッキーを保存し、再度Webサーバーにアクセスした際にそのクッキーをWebサーバーに送信することで、WebサーバーがそのWebブラウザを識別することができます。

## ポート番号
インターネット上のコンピュータを特定する際には、IPアドレスという識別番号が使用されます。そして、そのコンピュータが提供するサービスを指定するために使用されるのが「ポート番号」です。ポート番号は、0~65535の範囲の番号であり、サーバー側でよく使われるサービスに関してはデフォルトで番号が振られています。例えば、HTTPのポート番号は、80となっています。

## 参考文献
小林恭平, 坂本陽. イラスト図解式　この一冊で全部わかるWeb技術の基本. NRIネットコム, 2017.
山本陽平. Webを支える技術. 技術評論社, 2010.
NTPリフレクション攻撃への対策（イメトレ）

■仮説事象
NTPリフレクション攻撃への対策
攻撃概要：ntpdcのsysinfoコマンドを悪用した攻撃が発生し、従来のmonlistより増幅量が少ないが、DDos化することで攻撃されたネットワークは輻輳を起こし、サーバが機能しなくなる恐れあり。

■対策
攻撃の踏み台とされないよう、利用中のルーターのNTPサーバー機能の停止、運用しているサーバーのNTP停止、NTP設定の変更、ntpdのバージョンアップ等を実施する。

◆現状の障害対応（仮説）
vc01は障害発生時、「LANケーブルの差換え対応」にてvc01予備機に切替を行っている。

◆問題点
vc01予備機はサービスLANから切り離されている為、システム時刻が上位NTPサーバーと合っていない。
このままLANの差替えがされると、差異のあるシステム時刻を適用させてしまう可能性がある。


◆メンテ
①～⑦は、スクリプト化してもOK
（例）
cron設定
10,20,30,40,50 * * * * /bin/bash /home/smc/ntp_start.sh > /dev/null 2>&1

①サービスLANの"Link up"確認
②ntpdプロセス稼動確認（$ sudo ps -ef | grep ntp）
③ntpサービス停止（$ sudo /etc/init.d/ntpd stop）
④手動時刻同期　※GUI操作推奨
⑤ntpサービス開始$ sudo /etc/init.d/ntpd start）
⑤ntpdプロセス稼動確認（$ sudo ps -ef | grep ntp）
⑥Link upするまで、何もしない
⑦対応完了連絡　※NOC連絡（運用監視チームとの連携）

<答え合わせ>
NTPリフレクション攻撃 とは、ネットワークを通じて時刻合わせを行うための NTP （Network Time Protocol）を悪用し、攻撃対象に大量のデータを送信して機能を麻痺させる反射型 DoS攻撃 の一つ。 インターネット上には外部からの要求に応じて時刻情報を配信する公開 NTPサーバ が多数存在する。 攻撃者はそのような公開サーバに問い合わせを送信するが、送信元を偽装して応答データが攻撃対象のアドレスに届くよう指定する。 攻撃対象には多数のNTPサーバから身に覚えのない大量の応答データが押し寄せ、通信回線の伝送能力やコンピュータの処理能力を使い切り、正常に稼働を継続できない状態に追い込まれてしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2233790/620d498d-91c5-bd42-0325-c3fb35ef7083.png)
■カジュアル面談受付中
下記からスケジュール設定可能となります。
https://t.co/91lhm0x2JE
～・～・～・～・～・～・～・～・～・～・～
LinkedIn
https://www.linkedin.com/in/akkodis-okada/
Twitter(X)
https://twitter.com/edamamecook
オレオレselectorメモ

基本

    タグ[key=val]

否定

    :not(div)

and

    div[id='hoge']

or

    a,b

子要素(hogeの下の全てのp)

    #hoge p

属性(attribute)の指定

    #hoge[name]

idがhogeに一致

    [id='hoge']

idがhogeで始まる

    [id^='hoge']

idがhogeで終わる

    [id$='hoge']

idがhogeを含む

    [id*='hoge']


disabledではないチェックボックス

    input[type='checkbox']:not([disabled])

チェックされていないチェックボックス

    input[type='checkbox']:not([checked])