OmniAICreator/Qiita-1.07M huggingface dataset:
WordPressプラグイン「フロントエンドユーザー管理」でのreCAPTCHAエラー「サイト所有者の確認が必要なエラー: キータイプが無効です」解決方法

# はじめに
[@kat_log](https://twitter.com/kat__log "Twitter")と申します。

Wordpressサイトの「フロントエンドユーザー管理」（fua）というプラグインにてreCAPTCHAを導入しようとしたところ、
`サイト所有者の確認が必要なエラー: キータイプが無効です`というエラーが出たのですが解決したため共有です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/ae1203a4-a9e1-fad5-8272-b90df0bb3ec3.png)

# 結論
reCAPTCHAの最新**v3**を使っていたのですが、**v2**を使うと解消しました
（フロントエンドユーザー管理プラグインがv3に対応していないのかな）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/4d698c12-7de0-d1aa-2ea1-b43848b4f0de.png)

# 参考

https://blog.nekoteam.com/archives/2967#%E3%82%B5%E3%82%A4%E3%83%88%E6%89%80%E6%9C%89%E8%80%85%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%A8%E3%83%A9%E3%83%BC%EF%BC%9A%E3%82%AD%E3%83%BC%E3%82%BF%E3%82%A4%E3%83%97%E3%81%8C%E7%84%A1%E5%8A%B9%E3%81%A7%E3%81%99%E3%80%82
Django CSSを変更しているのに反映されない

## 問題の発生
Djangoを使用して、簡単なアプリを作成しているのだが、CSSを変更しても反映されない。もちろん、VSCodeを再起動しても、反映されなかった。

## 解決策
ブラウザのキャッシュを削除したところ解決した。

## キャッシュ削除方法
クロームの検証画面を開いて、「Disable cache」にチェックを入れてリロードするだけ

:::note
検証画面は右クリックして「検証」を選択
:::

①赤枠で囲まれた「Disable cache」を
![スクリーンショット 2024-10-03 7.53.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3893783/35333738-847b-4c1f-7415-3f6c892c7a99.png)
②チェック入れて
![スクリーンショット 2024-10-03 7.53.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3893783/000f0b5d-ffa3-a8c8-ed1e-da64e457a3dd.png)

③ページを再度読み込み

これでCSSが反映されるようになります

## 学んだこと
・ブラウザを再起動するだけではキャッシュは削除されない
・キャッシュとは、一度アクセスしたデータ等をメモリに保存しておく機能である。
・同じデータにアクセスした際、キャッシュからデータを読み込むため動作が早くなる
・キャッシュが溜まりすぎると動作が遅くなる
・開発中は、Chromeの「Disable cache」機能を使ってキャッシュを無効にするのが便利
【Index記事】IBM iのソース(RPGⅢ)をVSCode上で編集・コンパイル出来るようになるまで～

当アカウントはIBM i RiSING若手技術者研修にてIBM関連の技術を習得しながらアウトプットをする目的として作られました。研修で参加したメンバーそれぞれ全員が1つの記事を作成しており、記事によって雰囲気が異なっていると思うのでどんな人が書いたんだろうという視点でも楽しんでもらえればと思います！

# 記事一覧
当アカウントはRPGⅢプログラマーが、コンバージョンを経て、RPGⅣやFFRPGでプログラミング出来るようになるまでを7つの記事に分けて投稿しています。IBMユーザーの更なる成長を願って頑張りましたので説明が足りない部分や参考になったよ！と言ったコメントを沢山いただけますと今後も記事が更新されるとかされないとか…

<table>
  <thead>
    <tr>
      <th>No</th> <th>記事名</th> <th>著者</th>
    </tr>
  </thead>
  <tr>
    <th>1</th> <td><a href="https://qiita.com/RiSING_alpha-team/items/9556c1219040d1b4eb20">RPGⅢ→RPGⅣへのコンバートをやってみた。～CVTRPGSRCの仕様紹介～</td> <td></td>
  </tr>
  <tr>
    <th>2</th> <td><a href="https://qiita.com/RiSING_alpha-team/items/9c247feb995a3b7c36d8">5250ユーザーが「VSCode」を使ってみた　～VSCodeの基本知識編～</td> <td></td>
  </tr>
  <tr>
    <th>3</th> <td><a href="https://qiita.com/RiSING_alpha-team/items/1254437673699179580c">IBM iのSSH接続をイチから設定してみた</td> <td>R.M</td>
  </tr>
  <tr>
    <th>4</th> <td><a href="https://qiita.com/RiSING_alpha-team/items/7b5c910c6df111a53ace">VS CodeとIBM iの連携をイチから設定してみた</td> <td>R.M</td>
  </tr>
  <tr>
    <th>5</th> <td><a href="https://qiita.com/RiSING_alpha-team/items/3ad4e5e7f01998b5c5d0">VSCode上で「RPGのソースをIFSへPush」と「IFSのソースをコンパイル」をしてみた</td> <td></td>
    </tr>
  <tr>
    <th>6</th> <td><a href="https://qiita.com/RiSING_alpha-team/items/7d67690775b6273ac545">【VS Code】ILERPGからFFRPGにConvertしてみた！</td> <td></td>
  </tr>
  <tr>
    <th>7</th> <td><a href="https://qiita.com/RiSING_alpha-team/items/a532bfe6100e841fcf50">Db2を使用する際に便利なのは、IBMi？VSCode？比較してみた</td> <td></td>
  </tr>
</table>


各記事について、分からない点や間違っている点があればコメントにてお知らせください。
Google Colaboratory の cuDNN を指定バージョンに更新する

# はじめに

Google Colaboratory (以下、 Colab) は Google が提供する機械学習実行環境です

https://colab.research.google.com/

Colab には予め機械学習用ライブラリ等がインストールされていて、 GPU を使った機械学習もすぐに無料から始められます

ただし、インストールされているソフトウェアのバージョンによって、やろうとしていることができない場合があります

[TensorFlow](https://www.tensorflow.org/) や [PyTorch](https://pytorch.org/) 、[Nx](https://github.com/elixir-nx/nx) などの機械学習フレームワークから GPU を使う場合、 [CUDA](https://developer.nvidia.com/cuda-toolkit) や [cuDNN](https://developer.nvidia.com/cudnn) のバージョンとフレームワークのバージョンで整合性が取れていないと動きません

:::note info
CUDA Toolkit = NVIDIA の GPU を使って高速演算処理するための開発・実行環境

cuDNN = CUDA で Deep Neural Network を開発・実行するためのライブラリ
:::

本記事では Colab 上で cuDNN のバージョンを指定バージョンに更新する方法を紹介します

:::note warn
CUDA と cuDNN のバージョンも整合性が取れていないといけないので、どんなバージョンでも良いわけではありません
:::

## インストール済バージョンの更新

まずは Colab の初期状態を確認してみましょう

ランタイムタイプに T4 や L4 の GPU を選択してランタイムに接続します

OS の情報は以下のコマンドで確認可能です

```bash
!cat /etc/os-release
```

実行結果(2024年10月4日現在)

```
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
```

追加で色々なソフトウェアをインストールしたい場合、 OS の情報を元に検索してみましょう

CUDA のバージョンは以下のコマンドで確認できます

```bash
!nvcc --version
```

実行結果(2024年10月4日現在)

```
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Aug_15_22:02:13_PDT_2023
Cuda compilation tools, release 12.2, V12.2.140
Build cuda_12.2.r12.2/compiler.33191640_0
```

`release 12.2` とあるので、 CUDA のバージョンは 12.2 です

cuDNN のバージョン確認は以下のコマンドです

```bash
!cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
```

実行結果(2024年10月4日現在)

```
#define CUDNN_MAJOR 8
#define CUDNN_MINOR 9
#define CUDNN_PATCHLEVEL 6
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)

/* cannot use constexpr here since this is a C-only file */
```

上から3行がメジャーバージョン、マイナーバージョン、パッチバージョンを示します

つまり、上記の記載はバージョン 8.9.6 を示しています

## cuDNN のバージョン更新

以下のコマンドで CUDA 12 用の cuDNN 9 をインストールできます

```bash
!apt-get -y install cudnn9-cuda-12
```

実行後、 cuDNN のバージョンを確認すると、実行結果が以下のように変わります

```
#define CUDNN_MAJOR 9
#define CUDNN_MINOR 4
#define CUDNN_PATCHLEVEL 0
--
#define CUDNN_VERSION (CUDNN_MAJOR * 10000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)

/* cannot use constexpr here since this is a C-only file */
```

9.4.0 になりました

## まとめ

これで、 cuDNN のバージョンが合わずに困る、ということが少なくなりますね
チュートリアルStep11

![スクリーンショット 2024-10-09 22.05.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900427/0473fd50-282c-844b-ec47-6780e585aa11.png)


![puyopuyo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900427/1fdf8221-96c5-fcfa-3a52-383422a6fdc3.gif)
　ぷよぷよプログラミングAI学習システムは、中高生の自己調整学習に向けて開発されました。
　どうやって、Chromebookで、１０分で、素敵な人工知能を作れるのでしょうか？
　秘密は、３つ。
　１　jupyter liteで、webクライアントがpythonコードを実行
　２　超軽量な機械学習フレームワークdezeroを採用
　３　ぷよぷよのstageとactionがコンパクト

### Github&X

https://github.com/Lunanaedu/jupyterlite-puyopuyo

https://github.com/Lunanaedu/puyopuyo-kai

https://x.com/educationai_ai

### ぷよぷよプログラミングAI学習用まとめ

https://qiita.com/educational-ai/items/50c0fa689c01794d145e

### チュートリアルまとめ

https://qiita.com/educational-ai/items/88feaf91bdda0b5e0d25

# Step11 Train

# 11 trainは、ランダムから深堀をコントロール

 trainでは、epsilonを使って、緩やかにランダムの要素を減らしていきます。

## 11.1 コードを見ていきます。


```python
np.random.seed(seed=123)
env = EnvPuyopuyo()
agent = DQNAgent()


for epochs in range(CFG_ML.num_epochs):
  epsilon = CFG_ML.final_epsilon + (max(CFG_ML.num_decay_epochs - epochs, 0) * (
            CFG_ML.initial_epsilon - CFG_ML.final_epsilon) / CFG_ML.num_decay_epochs)

  board, puyo = env.reset()
  done = False
  final_score = 0
  final_pieces = 0

  while not done:
    u = random.random()
    random_action = u <= epsilon

    action = agent(board, puyo)

    if random_action:
      action_list = utils.create_action_list(board)
      if len(action_list):
        index = random.randint(0, len(action_list) - 1)
        action = action_list[index]

    next_board, puyo, reward, done = env.step(action)
    agent.update(board, action, reward, next_board, done)
    board = next_board
    final_score += reward
    final_pieces += 2
  
  if epochs % CFG_ML.sync_interval == 0:
    agent.sync_qnet()

  print("Epoch: {}/{}, Score: {}, pieces {}".format(
    epochs,
    CFG_ML.num_epochs,
    final_score,
    final_pieces))

  if epochs > 0 and epochs % CFG_ML.save_interval == 0:
    agent.save_model("{}/puyopuyo_{}".format(CFG_ML.saved_path, epochs))

agent.save_model("{}/puyopuyo".format(CFG_ML.saved_path))

```

## 11.2 解説するまでもなく、読んでそのままですが

* epsilon : ランダムにする比率です。0から1までの数値をランダムに出して、epsilonより小さければランダムに選択します。4000でランダム0になります。

25分くらいで終了します。
チュートリアルStep9

![スクリーンショット 2024-10-09 22.05.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900427/8d439d71-dc26-41e2-5e0f-923debea27ae.png)


![puyopuyo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900427/1fdf8221-96c5-fcfa-3a52-383422a6fdc3.gif)
　ぷよぷよプログラミングAI学習システムは、中高生の自己調整学習に向けて開発されました。
　どうやって、Chromebookで、１０分で、素敵な人工知能を作れるのでしょうか？
　秘密は、３つ。
　１　jupyter liteで、webクライアントがpythonコードを実行
　２　超軽量な機械学習フレームワークdezeroを採用
　３　ぷよぷよのstageとactionがコンパクト

### Github&X

https://github.com/Lunanaedu/jupyterlite-puyopuyo

https://github.com/Lunanaedu/puyopuyo-kai

https://x.com/educationai_ai

### ぷよぷよプログラミングAI学習用まとめ

https://qiita.com/educational-ai/items/50c0fa689c01794d145e

### チュートリアルまとめ

https://qiita.com/educational-ai/items/88feaf91bdda0b5e0d25


# Step9 Replay Buffer

# 9 DQNには、replay　bufferが必要です。

　DQNという機械学習の特徴というか、方法のど真ん中を理解して、replay　bufferを準備します。

## 9.1 Q学習

Deep Q Network　の　Q　は何でしょうか？

どんな状態stateのときに、どんな行動actionをとるべきか？　これを方策といいます。ある行動を取ったら、報酬rewardが生じて、次の状態になります。この時に潜在価値のようなものをQとするならば、state0の時のQ(state0)と、行動をとった後の状態state1の時のQ(state1)は下のような関係になります。

Q(state0) = reward + Q(state1)

このQを行動価値関数とよびます。

この関係は、actionの種類だけ存在します。actionが変われば、その結果も報酬も変わるのは当たり前ですね。

このように、行動により次の結果が変わることをマルコフ過程と言います。　とるべき行動で次なる状態が多種多様になるときに、どのようにQは決まっていくのでしょうか？

## 9.2 だいたいで考えてみる。

　先のQの定義は、あるactionをした場合の価値なので、Qは多くのactionの集合体であると考えることができます。すると、actionが行われるであろう確率が分かれば、期待できる未来の潜在価値も予測できそうです。

　ところで、厳密な確率などわかるのでしょうか？　現実社会でも、ダメだと分かっていることには手を出さないように、確率などを算出することは無意味に見えます。でも、いつも同じ方法を選んでばかりいては、違うもっといい方法を知ることもできません。ランダムにやり方を変えるべきことと、潜在価値の高い方法を選ぶことのバランスが必要です。

　この「だいたい正しい答え」を探るのが、潜在価値を推測するコツになります。大切な部分です。

だいたい正しい答え　＝　（　ランダムな方法　：　潜在価値の高い方法　）　比率を調整

比率を調整する部分は、2つに分けられます。行動を起こす部分での調整と、学習する過程での調整です。行動を起こす部分はランダムに選択することをモンテカルロ法とも呼んでいます。そして、比率をイプシロンepsilonで表します。学習する過程では、replay_bufferを使います。

## 9.3 replay buffer
buffer_sizeの大きさの容器dequeにデータを蓄積していきます。超えると古い順になくなります。そして、batch_sizeをランダムに取り出します。


```python
import numpy as np
import random
from collections import deque

class ReplayBuffer:
  def __init__(self, buffer_size, batch_size):
    self.buffer = deque(maxlen=buffer_size)
    self.batch_size = batch_size

  def add(self, state, action, reward, next_state, done):
    data = (state, action, reward, next_state, done)
    self.buffer.append(data)

  def __len__(self):
    return len(self.buffer)

  def get_batch(self):
    data = random.sample(self.buffer, self.batch_size)

    state = np.stack([x[0] for x in data])
    action = np.array([x[1] for x in data])
    reward = np.array([x[2] for x in data])
    next_state = np.stack([x[3] for x in data])
    done = np.array([x[4] for x in data]).astype(np.int32)
    return state, action, reward, next_state, done

```

## 9.4 replay bufferの役割
ランダムな方法とと潜在価値の高い方法の比率を、どのように変えていくかです。最初は、ほとんどランダムに行動します。推測値に価値がないからです。

学習が進むと、潜在価値が出てくるので、潜在価値に従って行動選択する比率を増やします。価値の高そうな方向に深堀していくイメージです。

潜在価値の高い行動が増えると、その学習をした方が効率がよくなります。ランダムに動いたムダな行動結果を学習する意味はほとんどありません。そこで、ある程度のデータが蓄積されてオーバーフローすると自動的に古いものから捨てると便利です。

この学習が進んで、深堀した時のデータを有効に使う仕組みこそが、replay bufferの役割です。

## 9.5 replay bufferのようなものは、他にはあるの？
　画像データの学習などでは、画像データを取り出すときに、ブロックに分割する、k分割交差検証があります。dataloaderと呼ばれるランダムにバッチファイルを取り出す方法もあります。この２つを組み合わせるのが王道です。
Arch Linuxの初期設定（日本語化、日本語入力）【KDE Plasma】

前回の記事でArch Linuxをインストールし、KDE Plasmaを起動できるとこまで進めました。

https://qiita.com/poyotanp/items/cc1ea62f4c61e15f03a4

今回は日本語化、日本語入力について解説していきます。

# 環境
Arch Linux 2024.10.01
KDE Plasma 6.1.5 (Wayland)

# 日本語化

## 日本語のロケールを追加
Ctrl+Alt+Tを押し、ターミナルエミュレータの[Konsole](https://konsole.kde.org/)を開きます
ターミナルが出てきたら、以下のコマンドで`/etc/locale.gen`を編集します。
```bash
$ sudo vim /etc/locale.gen
```
パスワードの入力を求められるので、ユーザーのパスワードを入力します。
ファイルが開けたら、以下の行のコメント(#)を外します。
```diff_shell
#ja_JP.EUC_JP EUC_JP
-#ja_JP.UTF-8 UTF-8
+ja_JP.UTF-8 UTF-8
#ka_GE.UTF-8 UTF-8
```
(`/ja`と入力すれば検索できます。)
Insertキーを押して挿入モードに入り、
`#`を削除します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901368/cd6aff8d-3f32-6187-8504-20cd7fd03f49.png)

Escapeキーを押し、`:wq`と入力して保存します。

その後、以下のコマンドでローケルを再生成します。
```bash
$ sudo locale-gen
```

## 日本語フォントをインストール
Arch Linuxをインストールしてからそのまま日本語にしてしまうと、
すべてが文字化けしてしまいます。
ですので、まずは日本語のフォントをインストールする必要があります。

いくつかの有名なフォントはこちらで紹介されています。

https://wiki.archlinux.jp/index.php/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AA%E3%82%BC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3

今回はGoogleの`noto-fonts-cjk`をインストールします。
```bash
$ sudo pacman -S noto-fonts-cjk
```
`Proceed with installation [Y/n]`と聞かれるので、
`y`と入力してEnterを押してください。
あとはインストールが終了するまで待てば完了です。

## 言語を変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901368/70737b82-a97e-4374-4ffb-489eb0cab142.png)
タスクバーにあるこのアイコンをクリックし、System Settingsを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901368/eeb1489b-bfdf-154a-30cb-4cc304f959cc.png)
左上の検索バーに`lang`と入力し、`Region & Language`を開きます。

`Language`の右にある`Modify...`をクリックし、
`American English`の右にある`Change Language`をクリックします。

言語選択画面が出てくるので、`日本語`を選択してください。

その後、右下にあるApplyボタンをクリックし、
再起動すれば日本語化は完了です。

<details><summary>KDE以外の場合</summary>

`/etc/locale.conf`を編集します。
```bash
$ sudo vim /etc/locale.conf
```
Insertキーで挿入モードに入り、
内容を`LANG=ja_JP.UTF-8`に書き換えます。
その後Escapeキーを押し、`:wq`と入力して保存します。

あとは再起動すれば日本語化は完了です。
```bash
$ reboot
```
</details>

# 日本語入力
今回はIMF[^1]にfitx5、IMEにmozcを使用します。

### インストール
以下のコマンドでインストールします。
```bash
$ sudo pacman -S fcitx5-im fcitx5-mozc
```
パッケージの選択では、デフォルトの`all`を選択してください。(そのままEnter)

### 環境変数の設定
インストールが終わったら、環境変数を設定します。
以下のコマンドで`/etc/environment`を編集します。
```bash
$ sudo vim /etc/environment
```
以下の行を新しく追加します。
```
XMODIFIERS=@im=fcitx
```
その後保存します。

### Fcitx5の設定
KDEシステム設定を開き、
「キーボード」→「仮想キーボード」を開き、
「Fcitx5 Wayland ランチャー」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901368/5d469729-6fb9-a4ba-d0ef-6fb2354722ef.png)

### Mozcの設定
KDEシステム設定の「入力メソッド」を開きます。
すでにある入力メソッドをすべて右の✗で削除し、
右下の「入力メソッドを追加」から、
以下の画像のように「キーボード - 日本語」「Mozc」の順番で追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3901368/3f4d743f-ff08-3666-03cc-288ef251e15e.png)

その後右下の「適用」をクリックし、再起動すれば日本語入力の設定は完了です。

# アプリごとの設定
### Electron系
起動する際の引数に以下の引数を追加します。
``--enable-features=UseOzonePlatform --ozone-platform=wayland --enable-wayland-ime``

### その他
アプリでIMEが動作しない場合、
**非推奨ですが**環境変数に以下の行を追加すると動作するかもしれません
```
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
```

[^1]: https://wiki.archlinux.jp/index.php/%E3%82%A4%E3%83%B3%E3%83%97%E3%83%83%E3%83%88%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89
GitHub の Conversation で hidden を開いて未解決のコメントをカウントする。

[ここ](https://qiita.com/the_red/items/f7d2d498b2e15e82aad5)を参考に作成しました。

```javascript
javascript:(function() {
  function countNoResolve() {
    let buttons = document.querySelectorAll('button');
    let count = 0;
    buttons.forEach(function(button) {
      if (button.textContent.includes('Resolve conversation')) {
        count++;
      }
    });
    alert("未解決: " + count);
  }

  let openCount = 0;
  function clickButtons() {
    const buttons = [
      /* hidden [items|conversations] を開く(ref: https://qiita.com/the_red/items/f7d2d498b2e15e82aad5) */
      'ajax-pagination-btn',
    ].flatMap((className) => {
      const arr = Array.from(document.getElementsByClassName(className));
      console.log(`${className}: ${arr.length}`);
      return arr;
    });

    openCount += buttons.length;
    if (buttons.length === 0) {
      if ( openCount === 0 ) {
        /* alert("該当するボタンがありません。"); */
      } else {
        /* alert(`オープン完了しました。${openCount}`); */
      }
      countNoResolve();
      return;
    }
    buttons.forEach(function(button) {
      button.click();
    });
    setTimeout(function() {
      clickButtons();
    }, 2000);
  }
  clickButtons();
})();
```
Portainer Community EditionでもEntraID OAuthで使うための設定

Portainerの有料版ではOAuthプロバイダとして
- Microsoft
- Google
- Github
- Custom

が選択できます。
ですが、Community Editionの場合はCustomしか選べません。
EntraIDで認証させたいけどイマイチ設定がよく分からない人の為に設定サンプルを用意しましたのでご活用ください。

# Portainer側設定

実際の設定内容は下記の画像の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/9a49b618-ceed-b858-4ac9-6f73e3003ecf.png)

| 設定項目 | 内容 |
|:-:|:-:|
| Client ID | EntraIDに登録したアプリケーション(クライアント)ID |
| Client secret | 設定したクライアントシークレット |
| Authorization URL | `https://login.microsoftonline.com/#ディレクトリ(テナント)ID#/oauth2/v2.0/authorize` |
| Access token URL | `https://login.microsoftonline.com/#ディレクトリ(テナント)ID#/oauth2/v2.0/token` |
| Resource URL | `https://graph.microsoft.com/v1.0/me` |
| Redirect URL | PortainerのURL(例:`https://portainer.example.com`)<br>必ずEntraIDのアプリケーション設定と一致させる |
| Logout URL | 空白 |
| User identifier | `mail`または`preferred_username`<br>基本的には`preferred_username`の方が良さそう |
| Scopes | `openid email profile` |
| Auth Style | Auto Detect |

# EntraID側設定

## アプリケーション情報のサンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/20485c16-e251-ac48-f7c3-11e525eddbe0.png)

## 認証のサンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/b27707cf-d8e8-9d9f-8e23-e639805a7166.png)


## クライアントシークレットのサンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/b4eb4d6c-8953-1ed7-a75b-3ca2c9ff5923.png)

## APIアクセス許可の設定

:::note info
事前に管理者の同意を与えると便利です
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/499fc1b9-1ced-a125-a9d2-727e861001dd.png)


# おわり
テナント内ユーザーおよび招待したB2B外部コラボレーションユーザーでも認証できることを確認済みです。
Github Actionsにおけるartifact upload/downloadに纏わる問題について

# はじめに

Github Actionsにはartifactをupload/downloadするために利用するActionsが予め用意されている。
https://github.com/actions/upload-artifact
https://github.com/actions/download-artifact

当然のことだが、GithubActionsでは滅茶苦茶使われている。AWS S3にUploadしたりとかCICDの常套手段だからであんまり考えずに簡便に利用できるActionだからである。

```
- uses: actions/upload-artifact@v4
  with:
    name: my-artifact
    path: path/to/artifact/ # or path/to/artifact
```
昨今幾つか問題になりそうな事例があるため、本項にまとめている。

# Upload-Artifactに関する破壊的な変更

9/2にこのような隠しファイルのUploadをやめるという変更を既存Verに入れるという話があり、それを8/19のBlogにて通知していた。

> ### GitHub Actions のアーティファクトのアップロードでデフォルトで隠しファイルを除外
> 2024 年 9 月 2 日より、v3 および v4upload-artifactアクションのデフォルトのアップロードの一部として隠しファイルとフォルダーが含まれなくなります。これにより、資格情報が誤ってアーティファクトにアップロードされるリスクが軽減されます。これらのファイルを引き続きアップロードする必要があるお客様は、新しいオプション「include-hidden-files」を使用して、引き続きアップロードできます。
https://github.blog/changelog/2024-08-19-notice-of-upcoming-deprecations-and-breaking-changes-in-github-actions-runners/

ところが、当然と言えば当然だがblogを常に読んでいる保証などなく、しかもこれは今まで動いていたものが急に動かなくなる破壊的変更であることから、世界中の数々のSystemで急にDeployが失敗するようになり、しかも自分たちの箇所ではないことから調査に恐ろしく時間がかかる場合もあり、当該PRには世界中から怨嗟の声が殺到。

>新しい v5 バージョンを作成するのではなく、v3 と v4 に重大な変更を導入するのはなぜですか?
>この意見に同調すると、新しいメジャー バージョンがなければ、重大な変更は発生すべきではありませんでした。この変更により、当社の本番システムで文字通りダウンタイムが発生し、デバッグに何時間もかかりました (もちろん、その時点で本番環境はロールバックされていました)。
>(中略)
>また、祝日で多くの人が仕事をしていない日にこれをリリースするのは、完全に不快で失礼です。まるで、人々が注意を払っていないかもしれないときに、それを滑り込ませたかったかのようです.....🙄

> @nebuk89パイプラインは壊れませんでしたが、実行に必要なファイルがない状態でアプリケーションがデプロイされたため、ダウンタイムと費やされた時間の請求書をお送りしてもよろしいでしょうか。
> 自分の間違いを認め、悪意ある隠しファイルのアップロードから私たちを守ってくれて何とかその日を救ってくれたという盾の後ろに隠れないでください... 真面目な話、草に触れてください... これはあなたがパッチを当てているゼロデイではありません。そのような愚かな理由で、semver を無視して破壊的な変更をプッシュしないでください。

https://github.com/actions/upload-artifact/issues/602

隠しファイルをUploadしないという意向は理解するものの結局`include-hidden-files: true`というOptionsを付ければクリアされるというなんとも悩ましい対応であり、結果的にこの対応で終わらせた人も多かったであろう。であれば、既存Verにこの破壊的変更を入れる意味って何？っていう疑問はご尤もだと思われる。

# v3Actionsの廃止

次に問題になりそうなのはこれである。
EOLですらなく、使えなくなるというものであり、これもまた怨嗟の声が殺到しそうな感じである。下方互換性を考慮しないというのはこれだけ使われているActionsにおいては割と珍しいことのようにも思うが、それは日本の感覚であんまり考えてないのかな、とはいえ、きっとまた世界中でDeploy失敗問題が起きそうではある。

> ### 廃止のお知らせ: アーティファクトアクションの v3
> 2024 年 11 月 30 日以降、GitHub Actions のお客様はactions/upload-artifactまたはactions/download-artifactの v3 を使用できなくなります。お客様は、できるだけ早くワークフローを更新して、アーティファクト アクションの v4 を使い始める必要があります。

https://github.blog/changelog/2024-04-16-deprecation-notice-v3-of-the-artifact-actions/

v3がリリースされたのが2022年3月だから2年半かー。まあそんなもんかなあ。
https://github.com/actions/upload-artifact/releases/tag/v3.0.0

当然のことながらメジャーバージョンアップなので細かい挙動は全く違うため、検証せずにUpdateはできないであろう。
Pythonで時計アプリを作る

# 時計アプリを作ってみた
TkinterはPythonに同梱されているGUIライブラリです。同梱されているため基本的には新たにインストールする必要はありません。ボタンやラベルのような一般的なウィジェットをシンプルな関数呼び出しで作成できます。
下記コード内のLabel（ラベル）は、テキストや画像を表示するために使用されます。文字色の指定にはforegroundまたはfgオプションを、背景色の指定にはbackgroundまたはbgオプションを使用します。
色の指定は16進数6桁のカラーコードを書くか、下記コードのシアンのように有名な色であれば英単語で書いても動作します。
ウィジェットの配置はpack()を使えば適切？に配置してくれるので今回の時計アプリではそれで充分なのですが、私自身の練習のためにplace()を使いました。

~~~Python:clockapp1.py
import tkinter as tk
import time

# ウィンドウの土台作成
root = tk.Tk()
# ウィンドウのタイトルを設定
root.title(u"Clock")
# ウィンドウのサイズを設定
root.geometry("250x150")

clock = tk.Label(root, font = ('MS Gothic', 20), foreground = '#FF00FF', background = 'cyan')
# pack()は自動的に上から配置してくれるので、簡単な配置には最適、place()は座標を指定して配置
clock.place(x = 10, y = 10, width = 230, height = 50)

# 時計を更新する関数
def tick():
    # 現在の日時を取得
    now = time.strftime("%H:%M:%S")
    # ラベルのテキストを更新
    clock.config(text=now)
    # 1000msごとに再度tick関数を呼び出す
    clock.after(1000, tick)

# 時計をスタート
tick()
# メインループの実行
root.mainloop()
~~~
こんな感じで表示されます。
![表示された時計アプリ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3893136/ceabae81-6daf-6567-173e-0e4600c6aa5a.png)
GASでClickupのリストから条件を満たすタスクを取得する

ClickupのタスクをGASでごにょごにょしたいなと思い立って、調べ出したら思わぬ苦戦をしたという記録です。

GASはほとんどjavaScriptだから、だいたいそのつもりでいれば良い感じにやれるのですが、何かこう……ときどきしょっちゅう、違うんですよね。

下記ドキュメントに、GASのコード例も入れておいてほしい。javaScriptとは別に。
https://clickup.com/api/clickupreference/operation/GetTasks/

# URLパラメータを作る関数がない
javaScriptにある URLSearchParams がGASで使えないらしいです。
しょうがないので、自分でパラメータを繋げてURLを作ります。

もっとかっこいい書き方で自作している例はたくさんあるのですが、かっこいい書き方は私が読めないため、こちらを作りました。
```
// ?foo=1&bar=2 を作成する
function makeParam(arr){
 var param = "?"; // ?
 for(var key in arr){
   param += key + "=" + arr[key]; // ?key1=val1
   param += "&"; // ?key1=val1&
 }
 param = param.replace(/&$/,""); // ?key1=val1&key2=val2& 最後の&だけいらないので消す
 return param;
}
```

# GETを投げてみる
話を短くするために、カスタムフィールドIDは既に何らかの方法で分かっているものとします。（実際には、これを取るにも1回APIをたたく必要があるかも）

やりたかったことは、タスクのカスタムフィールド（自分で追加した「案件番号」などの追加情報欄）が一定の条件を満たすタスクだけを一括取得する、というものです。
公式ドキュメントの通りに field_id, operator, value の組み合わせをパラメータで送ってやれば、特に問題はない、はずなのですが。

```
function get_task(){
 var listId = "リストID（リストのURL末尾とかにある）";
 
 // カスタムフィールドの値でフィルタリングができる
 var customFieldsSettings = [
   {
     "field_id":"ここにカスタムフィールドID",
     "operator":"IS NULL"
   },
   {
     "field_id":"ここにカスタムフィールドID",
     "operator":"=",
     "value":"0"     
   }
 ];
 
 const query = {
   include_closed: 'true',
   custom_fields: encodeURI(JSON.stringify(customFieldsSettings))
 };


 // 自作の makeParam()でクエリパラメータを作ってくっつける
 var url = "https://api.clickup.com/api/v2/list/" + listId +"/task" + makeParam(query);

 // UrlFetchAppのオプション
 const options = {
    "method" : "GET",
   headers: {
     "Content-Type": 'application/json',
     "Authorization": 'ここにAPIキー'
   }
 };
 const response = UrlFetchApp.fetch(url,options);
 const jsonResponse = JSON.parse(response);
 return jsonResponse;
}
```
不慣れなもので、エンコードで詰まって苦戦しました。
先に、 encodeURI(JSON.stringify(customFieldsSettings)) で、
値をきれいにしてから、自作関数でパラメータの体裁（?key=値)にする必要があります。

値を綺麗にするのも、JSONへの変換とURIエンコードの両方です。
この順番を間違ったり足りなかったりすると、URLやパラメータが何か違うってことでエラーを返され続けました。
エラーの原因をGeminiとかにも聞いてみたけど、 **別に間違ってないんじゃない？** みたいな回答をされて悲しかったです。AIはもっと人間の心に寄り添ってください。
[System Audit] システム監査技法

# 一覧
|技法|詳細|
|:--|:--|
|インタビュー法|監査人が、関係者に直接口頭で問い合わせる|
|現地調査法|監査人が、監査対象部門に直接赴いて、観察・調査する|
|ウォークスルー法|データの生成・入力・処理・出力・活用までのプロセス、及び組み込まれているコントロールを書面上または実際に追跡して調査する|
|テストデータ法|監査人が準備したテストデータを、監査対象プログラムで処理し、期待された結果が出力されるか調査する|





# 参考リンク
- [令和2秋58_ウォークスルー法](https://www.ap-siken.com/kakomon/02_aki/q58.html)
AWS： CodeBuild: WebHookの設定

githubのpull requestがmergeされた際にCodeBuildによるビルドが実行されるようにしたい

udacityのこれをベースにしています
https://learn.udacity.com/paid-courses/cd12355/lessons/96a24139-9edc-4036-99f3-da2b31507ddd/concepts/9f1964c2-d82d-4552-a860-a5d56e91209d?_gl=1*x55mtr*_gcl_au*NjA4MDYwNTQzLjE3MjE4ODk2MTU.*_ga*ODE3ODgyMDYwLjE3MDM1Njc4MjA.*_ga_CF22GKVCFK*MTcyODAzMzQxNS4yMi4xLjE3MjgwMzM0MTkuNTYuMC4w&lesson_tab=lesson


### 必要なこと
- CodeBUildでプロジェクトを作成。「ソース」の設定内にWebHookを設定することができる。
- buildspec.yaml をリポジトリのルートに配置
- buildspec.yaml の中身の修正
  - docker buildを実行する際にDockerfileを置く場所を変更しないとだめ??
- buildspec.yaml内で使う環境変数をAWSのGUI上で設定する
  - ECR(ElasticContainerRegistory)のURLを設定
  - ECRへpushする際のTag名を指定
- ECRにアクセスするための権限をIAMで設定
  - codebuild-test3-service-role という名前のロールをCodeBuildで設定していたが、このロールに「AmazonEC2ContainerRegistryPowerUser 」を付与する必要があった

**buildspec.yaml**

```yaml
version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging into ECR
      - echo AWS_DEFAULT_REGION is $AWS_DEFAULT_REGION
      - echo AWS_ACCOUNT_ID is $AWS_ACCOUNT_ID
      - echo IMAGE_REPO_NAME is $IMAGE_REPO_NAME
      - echo IMAGE_TAG is $IMAGE_TAG
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
  build:
    commands:
      - echo Starting build at `date`
      - echo Building the Docker image...          
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG lesson-3-microservices/exercises/1_codebuild/starter
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG      
  post_build:
    commands:
      - echo Completed build at `date`
      - echo Pushing the Docker image...
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
```
[Go] 構造体のKey/Value を出力する


```go
package main

import (
	"fmt"
	"reflect"
)

type User struct {
	ID  string
	Foo string
	Bar int
	pri string
	Pub int
}

func main() {
	user := User{"id1", "foo", 2, "skip me without panic", 4}
	fmt.Println(user.String())
	//ID: id1
	//Foo: foo
	//Bar: 2
	//Pub: 4
}

func (u User) String() string {
	str := ""
	fa := reflect.ValueOf(u)
	for i := 0; i < fa.NumField(); i++ {
		if !fa.Field(i).CanInterface() { // skip private for avoid panic
			continue
		}
		str += fmt.Sprintf("%v: %v\n", fa.Type().Field(i).Name, fa.Field(i).Interface())
	}
	return str
}
```

- [Play](https://goplay.tools/snippet/pEV3ZV9qBo7)

## REF

- [Stackoverflow - Get name of struct field using reflection](https://stackoverflow.com/questions/24337145/get-name-of-struct-field-using-reflection)

- [Stackoverflow - Iterate through the fields of a struct in Go](https://stackoverflow.com/questions/18926303/iterate-through-the-fields-of-a-struct-in-go#comment72509465_18927729)
UIテスト自動化ツールに求める拡張性

最近のUIテスト自動化ツールは、ノーコードを謳ったテストツールが多くみられますが、ノーコードでありながらもそれなりの拡張性を持ったツールが欲しいところもあります。
ツールに標準搭載された機能だけでは対応が難しいテストに対して、テストスクリプトに独自の拡張を加えたいといった、「痒い所に手が届く」テストツールが欲しいものです。

UIテスト自動化ツールの[**Ranorex**](https://ranorex.techmatrix.jp/ "Ranorexサイト")では、ノーコードでテストスクリプトを作成でき、かつ、コードによる拡張性を持つ、二刀流的なツールと言えます。

##### もくじ
1. ノーコードによるテスト作成
1. テストの拡張
1. まとめ

## 1. ノーコードによるテスト作成
Ranorexでテストスクリプトを作成する場合、通常、ノーコードでの作成になります。
テスト内容に従い、アプリケーションの画面を操作することで、その操作を記録し、テストスクリプトとして出力します。

テストスクリプトのメンテナンスも、RanorexのGUIから各操作やオブジェクト情報を切り貼りして修正することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/34a0d127-7bf1-0507-2238-4c487d6189fa.png"><br><br>

## 2. テストの拡張
Ranorexでは、Ranorexが持つツールの機能だけでは対応が難しい、アプリ独自のテストに対して、コード（※1）を使用して対応することができます。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/923905eb-1253-d6c4-7073-881c306852cf.png"><br><br>


作成したメソッドは、テストスクリプトにて、部品として使用することができます。
そのため、コーディングスキルを持つ開発メンバーがメソッドを用意し、QAチームなどの非エンジニアのメンバーがそのメソッドを利用し、テストを作成することも可能です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/ef64649e-a6c2-303e-4a6b-8e634e4048da.png"><br><br>


※1. 言語は、C#または、VB.NETのどちらかを選択できます。
Ranorex Studioでソリューションを作成する際の画面にある詳細設定から言語を選べます。（初期設定：C#）

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/41cffde1-4675-53b4-7b5a-c4a181ed44b3.png"><br><br>

## 3. まとめ
使用するテストツールでは、テストの拡張性が低い場合、自動化するテスト範囲が狭まるといった可能性がでてきます。使用するテストツールによってテストケースの自動化の有無を決定しないためにも、拡張性があるテストツールを使用することはツールを選定する際の条件として検討してみても良いかもしれません。


## Reference
### 基本操作
* [**ソースコード(C#、VB.NET)を使用したテスト作成**](https://ranorex.techmatrix.jp/blog/2020/05/08/creating-tests-using-source-code/)
* [**ソースコードを使用したテスト作成 / ユーザーコード**](https://ranorex.techmatrix.jp/blog/2020/05/15/creating-tests-using-source-code_user-code/)
* [**ソースコードを使用したテスト作成 / ユーザーコードコレクション**](https://ranorex.techmatrix.jp/blog/2020/06/19/creating-tests-using-source-code_user-code-collection/)
* [**ソースコードを使用したテスト作成 / コードモジュール**](https://ranorex.techmatrix.jp/blog/2020/06/12/creating-tests-using-source-code_code-module/)

### Sample
* [**知っておきたい基本操作**](https://ranorex.techmatrix.jp/blog/2020/07/31/user-code-reference_basic-operation/)
* [**知っておきたいRanorex API**](https://ranorex.techmatrix.jp/blog/2020/08/07/user-code-reference_ranorex-api/)
* [**テーブルの各レコードに対するアクション実行**](https://ranorex.techmatrix.jp/blog/2020/09/04/user-code-reference_run-action-on-table-records/)
* [**バリデーション**](https://ranorex.techmatrix.jp/blog/2020/10/02/user-code-reference_validation/)
* [**クロスプラットフォームにおけるイメージ比較**](https://ranorex.techmatrix.jp/blog/2020/10/16/user-code-reference_image_validation/)
* [**OCRによるUI要素の画像認識**](https://ranorex.techmatrix.jp/blog/2021/01/29/user-code-reference_ocr-image-recognition/)
* [**フルスクリーンショットのイメージ比較**](https://ranorex.techmatrix.jp/blog/2021/04/09/user-code-reference_full-screen-shot_image_validation/)
* [**スクリーンショットの名前や出力場所の変更**](https://ranorex.techmatrix.jp/blog/2023/08/25/user-code-reference_screenshot_name-place_change/)
心に語りかける、Vimバインド

今の会社に入社した直後、半年くらいVimハラスメントを受け続け重い腰を上げてVimバインドを使い始めたらもう元の体には戻れなくなりました。
IdeaVimを使い始めて早2年、Vimを普及するために僕が普段使っているVimバインドを紹介します。
ただコマンドを紹介するだけだと覚えにくいので心に語りかけながら書きます。

**ご自身のIDEにvimを入れて打ちながら読むことをお勧めします。**

# モード
Vimには4つのモードがあります。

## ノーマルモード
起動したらこの状態です。移動しかできません。
iやaを打つと入力モードに入ります。

## 入力モード
文字が打てます。escでノーマルモードに戻ります。

## ビジュアルモード
範囲選択する時に使います。
ノーマルモードでv, V, Ctrl+vを押すと入ります。
- v
    - 文字選択。一文字づつって感じ。
- V
    - 行選択
- Ctrl+v
    - 矩形選択
        - 割と便利なので一回押してみてください

# コマンドモード
これはこの記事では割愛します

# ノーマルモードのコマンド
この記事ではここを説明します
一気に覚えると大変なので、ランク分けしておきます。
まずは基本的なコマンドを覚えましょう
太字は特に便利なコマンドです。

## Lv. 1
### 超基本的な移動とか

|入力|結果|
|:--:|:--:|
|j|下|
|k|上|
|h|左|
|l|右|
|**w**|**次の単語の先頭に移動**|
|b|前の単語の先頭に移動|
|**a**|**カーソルの右から入力モード**|
|i|カーソルの左から入力モード|

使い初めの頃はaだけを使って入力モードに移動してましたが、iも知っておくとたまに気持ちよくなれます


### 移動プラス入力

|入力|結果|
|:--:|:--:|
|o|**カーソルの下の行に1行追加して入力モード**|
|O|カーソルの上の行に1行追加して入力モード|


ここまででかなり使えるようになってると思います


## Lv. 2

組み合わせとか、削除系を紹介します。

|入力|結果|
|:--:|:--:|
|dd, D|カーソルのいる1行削除|
|dw|今いるカーソルから単語の終わりまで削除。<br>dはdelete, wは単語移動なのでその組み合わせです。|
|u|ctrl+zと同じで、操作を取り消す|
|x|カーソルの文字を1つ削除|

大文字系は、ダイナミックな感じになります。
例えばAとかは行末で入力モード、といった具合でとりあえず押してみて、挙動を楽しむのもvimの面白いところです。

## Lv. 3

いかにして最小の手数で入力モードに入れるか、が気になってきませんか？

|入力|結果|
|:--:|:--:|
|cc, C|1行削除して入力モード。<br>dd→Oみたいな動きになります|
|cw|今いるカーソルから単語の終わりまで削除して入力モード。<br>dw→i的な|

cはdeleteの後、入力に移動してくれるやつ、つまりはchangeです。

## Lv. 4

iとaを紹介します。
入力モードに移行するコマンドとは異なり、dとかcとかと組み合わせる時のi,aです。

iはinner、内側。
aはaround、周りも。

という感覚をまず持ってください。

```python
def shinjiro(shinjiro_|a|rg: bool) -> bool:
    if shinjiro_arg is True:
        return True
    return False
```

ノーマルモードで|a|にカーソルがあるとします。
その時、`dw`をすると`shinjiro_|a|rg:` → `shinjiro_|:|`になりますよね。
この時、delete + inner + wordしたくなるので、`diw`と打つと、

```python
def shinjiro(|:| bool) -> bool:
    if shinjiro_arg is True:
        return True
    return False
```
となります。
wordの時は、`daw`でも同じです。

`di`とか、`da`の後ろには、`(`とか`[`とか`{`も入力できます。
もうお分かりですね。

```python
def shinjiro(shinjiro_|a|rg: bool) -> bool:
    if shinjiro_arg is True:
        return True
    return False
```

この時`di(`とするとdelete + inner + ()なので
```python
def shinjiro(shinjiro_|a|rg: bool) -> bool:
```
↓
```python
def shinjiro|(|) -> bool:
```

`da(`とするとdelete + around + ()なので
```python
def shinjiro(shinjiro_|a|rg: bool) -> bool:
```
↓
```python
def shinjiro| |-> bool
```

となるわけです
非常にセクシーですね

# おわり
自分がエディターでよく使うのはこの辺りまでです
たまにtとかfを使いますが、気が向いたら第二弾を書くのでその時にでも

Vimgolfという変態向けのサービスもありますので、もっと最小の手数でやりたい・・・！
という方はぜひvimgolfをやってみてはいかがでしょうか

自分はあまりやっていませんが、こんな感じです
割と楽な問題を選んでいるのでトライしてみてはいかがでしょうか
https://www.vimgolf.com/37639/maruryota


ようこそ、vimの世界へ
よきvimライフを👋🏻
こんなリーダーになりたい！と思わえるようなリーダー

## はじめに
PMやチームリーダーを行っていると、メンバーから見た自分がどのように映っているのかがわからなくなることがあります。
自戒の意味も含めて、リーダーについての勉強をしたのでまとめ上げます。

今回学んだことの中で以下2点について説明します。
* 1人1人と信頼関係を築く
* 話題のモチベーション理論「Will-Can-Must」

### ◆1人1人と信頼関係を築く
信頼関係には以下の5段階があります。
|レベル|名称|心の中|
|---|---|---|
|1|警戒|「大丈夫かな...」|
|2|安心|「この人は安心だ」|
|3|親和|「この人と相性がよい」|
|4|信用|「この人は信用できる」|
|5|信頼|「この人は誰よりも味方になってくれる」|

レベル5の信頼まで引き上げることができれば、とても良好な関係といえます。
信頼とそれ以下のレベルには明確な違いがあり、「このリーダーは心より味方になってくれる」と思ってもらえるかです。
味方なので本音を話しやすく、心理的安全性が担保された状態となります。
レベル5の状態に持っていくために一番重要なことは、話をする際に理解できる／するかどうかではなくて「受け止めること」です。
すなわち「傾聴」が大事です。

傾聴で効果的な6つのテクニックがあるので紹介します。
1. 言葉を反復する
1. 感情に同意する
1. 要約をする
1. 意見を挟まない

#### 1. 言葉を反復する
話しをしているときに、ただ聞くだけではなくて相槌のように話し手の言葉を反復します。

言葉を反復するの会話例です。
```
Aさん：昨日、〇〇社の社長に会ってきました。
リーダー：そうなんだ。社長とあったんだ。どうだった？
Aさん：いやー景気が悪いみたいで、これからの予定はないとおっしゃっていました。
リーダー：そうかー。予定がないとおっしゃっていたんだ。
```
反復しすぎると逆に不快に思われるかもしれないので、私的には使いすぎは良くないと感じました。

#### 2. 感情に同意する
話し相手がどう思っているかを言葉にするだけです。
残念そうにしていれば、残念だねと言葉にします。

感情に同意する会話例です
```
Aさん：とは言うものの 来年には大きな予算を取って頂けるような話を頂いています。
リーダー：そうか！それは嬉しいよな！
```

Aさんが嬉しいと思う気持ちを言葉にしています。自分の気持ちも表してもよいですが、あくまで話相手の気持ちを表現します。
（例が悪くてリーダーが嬉しいようにも見えます。すみません。）

#### 3. 要約をする
今までの話を要約して話をします。
そうすることにより、話をちゃんと聞いていたことを相手に証明ができます。
要約するの会話例です。
```
リーダー：ということは、今は苦しいけど今後はいい話があるってことだよね。
Aさん：そうなんです。
```

上記のように最後に要約をすることにより、Aさんに話を聞いていたことを理解してもらいました。

#### 4. 意見を挟まない
これまでの会話ではリーダーは自分の経験談や意見を発言していません。
まずは、相手の話を聞いて要約するまでは傾聴に徹します。


それでは次のトピックとなる話題のモチベーション理論「Will-Can-Must」について説明します。

### ◆話題のモチベーション理論「Will-Can-Must」
やらされ仕事だとモチベーションが上がりません。
どのような仕事でも、やりたくなる仕事になるように導くのがモチベーション理論の「Will-Can-Must」となります。
仕事が面白いではなく、仕事を面白くするということです。
理論の名前にもある通り3要素で成り立っています。
Will：実現させたい状態／自分がなりたい姿
Can:自分の能力
Must：要望。任せられた仕事

ベン図で表すと以下のようになります。

![will.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870485/b09ac027-0c3e-e683-75e3-bdcad9543931.jpeg)

３つの円が重なっているところ(画像の紫の部分)が、仕事が面白くまだまだやりたくなる領域を表しています。

まずはWillとMustを紐づけます。例をあげていきます。
会話をしてAさんのWillは以下であることがわかりました。
```
Will:将来は自分で事業をしたい。自分で商売をしたい。
```
Aさんに任せたいMustは以下です。
```
Must：新規開拓のため、飛び込み営業をしてほしい。
```

「Will:自営業をしたい」と「Must:飛び込み営業をしてほしい」の紐づけをします。
例えば飛び込み営業を30件行うことができれば、30人の社長と出会う可能性があります。
社長との会話は、様々な経営者の見ることができるます。自分が経営するイメージをするうえで大事な情報を仕入れることができます。
そのため、WiilとMustは紐づいた状態にすることができます。
ここで大事なことは、リーダーはWillを理解することです。理解をすることでMustに関する助言をすることができます。


次はCanの確認です。Aさんが認識している能力は以下です。
```
Can：資料を作るのは得意。話すのは苦手。
```
このCanは自分の得意技を作るうえでとても大事です。
また苦手なことを知ることで伸ばすべきポイントを押さえることができます。

WillとCanとMustが重なっていることを整理する以下となります。
```
営業を行い、自分で作成した営業ツールをお渡しする
```

自分の得意分野が武器に代わり、Willに向かってMustを実行できるため自発的に動くこと出来て楽しめるというセオリーです。

Mustの適切な大きさを考えて設定するのもリーダーの役目です。
Willが多きためMustを大きくしすぎると潰れてしまうので注意が必要です。

以上、学習した内容でした。

### 参考資料
Udemy このリーダーについていきたいと思われる！「リーダーシップセオリー」入門講座
ダニング＝クルーガー効果は存在しないのではないだろうか


## 前書き1

論文は1ミリも読んでないです。

## 前書き2（重要！って書いても忘れられるだろうな…）

この記事にダニング＝クルーガー効果を否定する科学的根拠は何一つありません。
じゃあ何の記事だよって話ですが、
我々が日常で観測する「ダニング＝クルーガー効果」はただの錯覚なのでないだろうか？という問題提起みたいなもんです。

## きっかけ

私はダニング＝クルーガー効果という言葉が嫌いだ。

何故なら、この言葉はイキった奴を安全に殴るための大義名分であり、
また、ダニング＝クルーガー効果を自覚している俺マジ謙虚。かっけぇ…。それに比べてダニング＝クルーガー効果を自覚していないこいつらはマジで馬鹿だな（笑）。と痛い自己陶酔を引き起こしてしまうからだ。

<!--

例：
https://qiita.com/standard-software/items/0b2617062b2e4c7f1abb#comment-46a46394037d699fcf15

-->

そもそも本当にダニング＝クルーガー効果は存在するのだろうか？
少なくとも**我々が実感するダニング＝クルーガー効果は**、「あるように見える」だけ、要するに錯覚なのではないだろうか？

## 本文

とりま、ここで語るダニング＝クルーガー効果は
「能力が低い者は自分の能力を過大評価する傾向があること」
という定義にする。

さらに分かりやすくするために
能力が低い者 → 初心者
能力が高い者 → 上級者
自分を過大評価する → イキる
批判・指摘をする → 殴る
と呼ぶことにする。

### 1: 目にする頻度の違い

さて、初心者と上級者はどちらが多いだろうか？
大抵の場合は、初心者のほうが上級者よりも多いだろう。

ということはつまり
「初心者のイキった言動」は「上級者のイキった言動」よりも目にする機会が多いはずだ。
元の母数が多いのだから、当たり前だろう。

仮に「初心者のイキった言動」と「上級者のイキった言動」の**割合が同じ**だったとしても、
「初心者のイキった言動」のほうが**観測数が多い**ため、
「ダニング＝クルーガー効果が存在する」という認識が補強されるのではないだろうか？

### 2: 殴りやすさの違い

次にイキリ野郎の殴りやすさを考える。
「初心者のイキリ野郎」と「上級者のイキリ野郎」はどちらが殴りやすいだろうか？

それは言うまでもなく「初心者のイキリ野郎」のほうだろう。
「上級者のイキリ野郎」に殴りかかるのは、逆に自分が殴られてしまうというリスクがあるため合理的ではない。

これが何を意味するのかというと、「上級者のイキリ野郎」は見過ごされやすい。ということだ。
これが「ダニング＝クルーガー効果が存在する」という確証バイアスになっている可能性がある。

### 2.5: 上級者のイキリがイキリだと分からない

上級者が自分のことを過大評価したとして、第三者目線で本当に過大評価しているのか、していないのか判断できるのだろうか？
これはかなり難しいと思われる。
後の文章は「2: 殴りやすさの違い」と同じなので省略。

### 3: ダニング＝クルーガー効果を認識することによる優越感

これは「きっかけ」にも書いたが、
**仮にダニング＝クルーガー効果が存在しない**としても
**存在したほうが都合がいい**ため、存在するというバイアスが掛かっている可能性がある。

つまり、「ダニング＝クルーガー効果を自覚していないあいつ」よりも「ダニング＝クルーガー効果を自覚している自分」のほうが優れている。と思いたい願望によって、その存在の認識が補強されているかもしれないということだ。

## まとめ

長々と書いた文章をまとめる。

まず、初心者の方が上級者よりも多いため、たとえ両者が同じ割合でイキっていたとしても、初心者のイキリ行動は圧倒的に目につきやすい。
これによって「ダニング＝クルーガー効果が存在する」と感じやすくなっている。

次に、殴りやすさの違いだ。
初心者のイキリ野郎は殴りやすいが、上級者のイキリ野郎は反撃されるリスクが高い。
ゆえに上級者のイキリ行動は見逃されやすく、それがさらに「ダニング＝クルーガー効果がある」という認識を強めてしまう。（例外が除外されるため。）

そして最後に、ダニング＝クルーガー効果を認識すること自体が、優越感をもたらす考えだということだ。
つまり、効果を知っている自分は謙虚で賢いと感じたいという願望が、無意識に「ダニング＝クルーガー効果が存在する」という信念を強化しているのかもしれない。

よーするに、ダニング＝クルーガー効果は実在するように思えるが、それは確証バイアスや錯覚かもしれないよ。ということだ。

## 自分の考え

勘違いされそうなんで書いときますが、
私は初心者だろうが、上級者だろうが、
同じ割合でイキリ野郎が誕生すると思ってます。

<!--

## レッテル貼りとしてのダニング＝クルーガー効果

赤の他人の誰かが「あいつはダニング＝クルーガー効果に掛かっている馬鹿だ（笑）」と言われているとして、

本当に、その人が「自分の実力を過大評価している」のか分かるのか？

その人が、本当に実力にあっていることを言っている可能性はないのか？

ただ単に、殴るための大義名分として「ダニング＝クルーガー効果」というワードを使っているだけなのでは？

-->

## 関連

https://qiita.com/sugiyamath2/items/6e9e8de7c6cf5343cca1

https://note.com/oh1ta/n/n714d9d7d6fab

## 読んでないけど、なんか面白そう

https://www.psychologytoday.com/us/blog/how-do-you-know/202012/dunning-kruger-isnt-real

https://www.mcgill.ca/oss/article/critical-thinking/dunning-kruger-effect-probably-not-real

https://statmodeling.stat.columbia.edu/2021/10/12/can-the-dunning-kruger-effect-be-explained-as-a-misunderstanding-of-regression-to-the-mean/
Kconfigがオーバーレイできるようになった！

# 拡張機能のアップデート
少し前のアップデート(おそらくnRF Connect SDK 2.7.0に正式対応したバージョン)で、Extra Kconfig fragmentsという項目が追加されました。端的に説明すると、Kconfigのオーバーレイです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3797041/fe6d6797-131d-1f6a-5a7d-57ca9db7de3f.png)
# ビルドパターンを分ける
今までできなかったのかって？ええ、(それっぽい感じには)できなかったんですよ！！！
よくあるのはリリースビルドとデバッグビルドですよね。リリースビルドにはログ出力なんて要らないし、FOTAも有効にしておきたい。でもデバッグビルドではログ出力も必要だし、FOTAはmcubootをビルドする分だけ余分に時間がかかるからデバッグしているときは組み込みたくない。
なんか当たり前のことを言っているようですが、これができなかったんですよ。今までどうやってやっていたかと言うと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3797041/75b8da45-e110-503c-fd2b-683d9df15398.png)
こんな感じにデバッグビルドやエミュレータービルドの.confファイルを作って対応していました。このやり方の欠点はKconfigを変更した場合に全部の.confファイルを忘れずに変更しないといけないという点です。
WinMerge大活躍でした(笑)
何度も何度も全部のプロジェクトファイルをWinMergeで比較して眺めていました。
# これが本来あるべき形でしょ！
prj.confはリリースビルドで使う機能が記載されていて、そこにデバッグ時にのみ使う機能や、デバッグ時には組み込みたくない機能を殺す形でデバッグビルド用のオーバーレイを作れるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3797041/3c2877c6-df8e-bd95-6cd8-f0e7e9de4db3.png)
実際のデバッグビルド用のオーバーレイはこんな感じになるのではないでしょうか。
``` dubug_overlay.conf
CONFIG_BOOTLOADER_MCUBOOT=n
CONFIG_DISABLE_FLASH_PATCH=n
CONFIG_DK_LIBRARY_LOG_LEVEL_OFF=y
CONFIG_USE_SEGGER_RTT=y
CONFIG_FLASH=y
CONFIG_WATCHDOG=n
CONFIG_TASK_WDT=n
CONFIG_LOG=y
CONFIG_LOG_PROCESS_THREAD_SLEEP_MS=100
CONFIG_FLASH_MAP=y
CONFIG_STREAM_FLASH=y
```
これでリリースビルドのみ設定を反映し忘れた！みたいなことはなくなりそうです。うぇーい！
AWSCP(クラウドプラクティショナー)に2週間で合格した話

## 何故受けたのか
+ 授業で教授が資格とったら期末に成績30点くれると発言したため
+ 今学期は~~履修登録をミスり~~授業が少なく暇だった為

## 具体的なスケジュール
### 1~2日目
この方のメモを紙に整理しつつ勉強する。そっちの方が写真記憶もしやすいしね。覚え終わったら日を跨いで復習し定着を目指す。

https://qiita.com/sew_sou19/items/578ce49cf3c0e637403c

### 3~5日目
メモを9割覚えたら問題を解く。

https://www.udemy.com/course/aws-4260/?couponCode=KEEPLEARNING

これの練習①で自信を築き、練習②でその自信を粉々にする。
二つを解いた後、Qiitaで間違った問題や知らなった知識を覚え書きとして残す。（以降備忘録と呼称）

https://qiita.com/meronzo/items/e3668f9b53ee1e3f8b74

### 6~10日目
本番①~③を解き、間違えた問題や欠落している知識を備忘録に残す。
この辺りで練習①、②の二週目をし、全ての問題の解説に目を通す。
もちろん復習も忘れずにねっ

### 11~13日目
本番①~③をの二週目をし、全ての解説に目を通し、欠落している知識を備忘録に残す。

### 14日目
寝る前に本番④をやる。63%。焦る。
急いで知らない知識をメモしてふて寝。

### 当日
なんか合格した
![1000004829.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288129/8d74a015-0804-cc93-4406-09aa765f568a.jpeg)

## 感想
案外Udemyで見た問題もたくさん出たのであれさえできてれば問題ないみたい。
見なかった知識（AWS CDKなど）もあるけど消去法でとけることも結構ある。
また、私の備忘録はいくつか残してないサービス名（Amazon Pinpointなど）あるから気を付けてね。
それではこれを見て勉強を始める方々、頑張ってください～
ノートPCが動かなくなった？もしかして「帯電」かも？その解決方法

<br>

## ■ はじめに
<br>
ノートPCが突然動かなくなった…こんなことってありますよね。

私も以前参画していたプロジェクトでお借りしていたノートPCがある朝急に電源が入らなくなったり、
電源アダプタに接続しているにも関わらずバッテリー残量が減ってしまうといったことが数回発生しました。

電源アダプタの不良と考え慌てて代替品を購入してみましたが解決せず...。
プロジェクトが逼迫していたこともあり、大変焦った記憶があります。

実はこれ、「帯電」が原因である可能性があります。
今回は、帯電とは何か、そしてその解決方法を解説していきます。

<br>

## ■ 目次
<br>

1. [帯電って何？](#1-帯電って何)
2. [帯電が原因で起こるトラブル](#2-帯電が原因で起こるトラブル)
3. [帯電を解消する方法](#3-帯電を解消する方法)
4. [それでも動かないときは？](#4-それでも動かないときは)
5. [まとめ](#5-まとめ)
<br>

## 1. 帯電って何？
<br>
「帯電」というのは、電子機器に不要な静電気が溜まってしまう現象のことです。  
ノートPCやスマホなど、精密機器に静電気が溜まると、動作不良や起動しないトラブルが起こることがあります。

日常的に使用していたり使っていないときでも、部屋の湿度や服の素材などによって静電気が溜まってしまうこともあるんです。

## 2. 帯電が原因で起こるトラブル
<br>
帯電が原因で発生するトラブルとしては、以下のようなものがあります。

- 電源が入らない
- バッテリーが充電されない
- フリーズする、動作が遅くなる

もし、突然PCが動かなくなった場合、まずは帯電が原因かどうかを疑ってみると良いでしょう。

## 3. 帯電を解消する方法
<br>
では、具体的にどうやって帯電を解消するのか？  
以下の手順を試してみてください。
<br>

#### 1. **電源ケーブルとバッテリーを外す**  
   バッテリーを外してから静電気を帯びない場所で5～10分ほど放置して、帯びている電気を放電させます。
   ノートPCでバッテリーが取り外せない場合には電源ケーブルを抜き、同様の処置をとります。
   通電をさせないということがポイントです。
<br>

#### 2. **電源ボタンを30秒ほど押し続ける**  
   こちらは過去に試したことはない手順となりますが、電源ボタンを長押しすることで、内部に残っている静電気を放出できることもあるようです。
<br>

#### 3. **電源ケーブルをつないで起動**
   上記が完了した後再度電源に接続し、電源ボタンを長押しします。
   使用している端末にもよりますが反応までに30秒ほどかかるものもあります。
   
   またバッテリーが取り外せる端末の場合には、バッテリーを戻す前に電源ケーブルをつないでPCを起動してみましょう。
   無事に動けば帯電が原因だったことが分かります。

# 4. それでも動かないときは？
<br>
もし上記の方法で解決しない場合は、帯電以外に原因があるかもしれません。<br>
次のステップとしては、メモリの抜き差しや、最終手段としてカスタマーサポートへの連絡を行い修理センターに持ち込むことを検討しましょう。

# 5. まとめ
<br>
ノートPCが動かなくなったときは、まず「帯電」を疑ってみてください。<br>
有償での修理やサポートを受ける前に簡単に解決できる場合が多いので、上記の方法を試してみましょう。
【TypeScript】プロパティ 'style' は型 'Element' に存在しません。ts(2339) を解決する

~~TypeScriptのエラー解決擦るけど許して！~~ 
# 動作環境
TypeScript: 5.4.5
VSCode: 1.93.1
# 起きている問題
以下のようなコードにて、element.`style`.hogeのstyleがElement型には存在しないと表示されてしまう。
```ts:問題のあるコード
// 一部ボタンの色変更
const bottons = document.getElementsByClassName("e__btn")
for (let i = 0; i < bottons.length; i++) {
    const element = bottons[i] 
    element.style.border = border
    element.style.backgroundColor = backgroundColor
        //    ↑プロパティ 'style' は型 'Element' に存在しません ts(2339) 
}
```
このコードでは"e__btn"というクラスがついているElementを取得し、それらすべてに対して事前に設定したプロパティを代入しスタイルを変更するものになっている。
# 解決方法
解決方法としては、コード内の`element`変数に代入する際`bootons[]`を'HTMLElement'に型アサーションを行うと良い。
上記の解決方法を踏まえ、コードを書き替えたものを以下に示す。
```ts:解決されたコード
const bottons = document.getElementsByClassName("e__btn")
for (let i = 0; i < bottons.length; i++) {
    const element = bottons[i] as HTMLElement  // ←変更箇所
    element.style.border = border
    element.style.backgroundColor = backgroundColor
}
```
TypeScriptでの型アサーションとは、他言語でいうところのキャスト・型変換だ。
型アサーションを行う場合は`変数名 as 上書きする型`または`<上書きする型>変数名`を使用することができる。

## なんで型アサーションだけで解決した？
`getElementsByClassName`メソッドが返していた`HTMLCollectionOf<Element>`特に配列内の`Element`型の説明は、MDN Web Docsで以下のように書かれています。
>Element は Document が継承するオブジェクトの中にあるすべての要素オブジェクト（すなわち、要素を表現するオブジェクト）が継承する、もっとも一般的な基底クラスです。すべての種類の要素の共通するメソッドとプロパティのみを持ちます。もっと具体的なクラスが Element を継承しています。
>*Element - Web API | MDN より引用* 

つまり、`Element`型はHTML以外の要素になりえるため直接HTML要素を使用することはできないようです。そのため、HTML要素を表す具体的なクラスとして`HTMLElement`を指定することによりstyleをはじめとするHTML要素を使用することができるようです。
## 参考

https://typescriptbook.jp/reference/values-types-variables/type-assertion-as

https://developer.mozilla.org/ja/docs/Web/API/Element
AWS初心者のCLF取得までの勉強方法

**まず初めに**
Qiita初投稿なため見にくい記事などお許しを。。。

**経緯**
クラウド？オンプレミス？何それ程度の初心者が、自分のキャリアアップの為に基礎的なAWSCLF試験に受かるまでの勉強方法を記しておく。

**試験日を決める**
だらだらと参考書を眺めるだけでは、ただ時間が流れてしまうためスパッと試験日を決めてそれに向けて取り組んでみる。
（私は短期集中**1カ月後**に受ける予定！）
因みに、試験費用：AWS CLFで16,500円なかなかの値段。。

**まず初めに**
参考書を購入、ネットで評価の高かった[AWS認定資格試験テキスト　AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88-%EF%BC%A1%EF%BC%B7%EF%BC%B3%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E5%B1%B1%E4%B8%8B%E5%85%89%E6%B4%8B/dp/4815625387/ref=sr_1_1_sspa?crid=DW7V790K9N3P&dib=eyJ2IjoiMSJ9.AiFOQ7eQOW4NhsuNRuh8FI61CHhwmZRyWCJntf9Vja75_T_aaXTE8Gt69NW3p8KKQgpTpcGymR3Gfwcsagy-IU2WeI13WpGvJrUt-2HMFv3RWa7NuY3FM0uNA-mjOKFcxf5kOH9Ujav31UBgNEDxOuADGecSj9Kz4OBiDSiCDSY9xEd5LPOU16gqmSX5r1nu_adHOKZmLcsDFP2bK93zaiRvPYHI_NI-NwGaoulzV7F3kSm3iit7c_M47VboAGE__Lg6d6i3uUAASmKBYLDXNXKlUzo9Nsx-YfQ1m0qAZe0.8kY6UmgTeLGkaergJiy92NhfbYzVk4TOlgfZFjAimas&dib_tag=se&keywords=aws+%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC&qid=1728023431&sprefix=AWS%2Caps%2C202&sr=8-1-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1)　の参考書を購入しました。

次に[Udemy](https://www.udemy.com/)のオンライン学習サービスを利用しました。
【CLF-C02版】これだけでOK! AWS認定クラウドプラクティショナー試験突破講座（豊富な試験問題300問付き）
👆定価で購入すると7,600円→セール期間中だと1,500円で購入できます。
（ちょくちょくセールしているのでこまめにチェック推奨！）

**学習方法**
参考書を一通り読み込みが終わったら、次は暇があったらとりあえず【過去問】。通勤で【過去問】。トイレで【過去問】。昼飯食べながら【過去問】。寝る前に【過去問】。

とりあえず【過去問】の試行回数を増やしてAWSの基礎や繋がりが分かるまで解き続ける。

**まとめ**
AWSにどんなサービスがあり、それらにどんな利点があるのか。
ざっくりと理解するためには非常に良い資格であると思う。
無料で使える面白そうなサービスがたくさんあるので是非使ってみようと思う！
AWS公式が出しているハンズオンカリキュラムなどもあるので理解を
深められるよう体験したいと思います！
また途中経過の記事も記載するのでよろしくです。
AWS Organizationsについて

## AWS Organizationsとは
AWS Organizationsは複数のAWSアカウントをグループ化し一元的に行うサービスです。グループにまとめることで管理対象のAWSアカウントに対する権限の設定や、各アカウントの請求情報を集約した一括請求が利用できます。

## 請求の一元管理
AWS Organizationsを利用すると複数のAWSアカウントの利用料を一括で支払うことができます。請求をまとめることにより個々のアカウントの利用量ではなく組織全体の利用量をもとに料金が計算され、利用量に応じた段階的な課金テーブルが設定されているサービスなどは利用量が増えるほど低コストで利用できるため結果的に利用料が安くなります。

## SCP(Service Control Policies)とは
SCPは組織(Root)属しているOU（Organizational Unit）または特定のAWSアカウントに対して、特定の権限や操作の許可/拒否を管理するための機能です。IAMポリシーに似ていますがアカウントレベルで権限を設定します。つまりSCPで制限された機能はそのアカウントのルートユーザーですら制限されます。
AWS SAA備忘録

今後のキャリアを考えるにあたってAWS（というかクラウド）の勉強しようと思い、その理解度チェックとしてSAA試験を受けることにしました。

僕の初期知識としてはEC2とかRDSとかの名称と機能は一応知ってるよ〜、くらいです。
それは0とほぼ同義では？

合格体験記をいくつか読んで良さそうだった書籍として以下を購入しました。
[要点整理から攻略するAWS認定](https://www.amazon.co.jp/%E8%A6%81%E7%82%B9%E6%95%B4%E7%90%86%E3%81%8B%E3%82%89%E6%94%BB%E7%95%A5%E3%81%99%E3%82%8B-%E3%80%8EAWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E3%80%8F-Compass-Infrastructure-%E3%83%88%E3%83%AC%E3%83%8E%E3%82%B1%E3%83%BC%E3%83%88%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/4839979448/ref=asc_df_4839979448/?tag=jpgo-22&linkCode=df0&hvadid=707442918195&hvpos=&hvnetw=g&hvrand=18160344812856902532&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9198439&hvtargid=pla-1946245020120&psc=1&mcid=9cadfa761ca83979addecf4a8953a3fa&th=1&psc=1&gad_source=1)
知識面が体系的に乗っており、役に立ちました。ただ索引が凄く弱いです。
一読した後は過去問を解いていき、イマイチピンと来なかったところをまたこれで調べて...って感じで学習していきました。
なので索引の弱さは結構痛かったです。

過去問は下記サイトを利用しました。
[Cloud License](https://cloud-license.com/)
SAPの方も受験予定だったので、会員レベルはプロフェッショナルを選択しました。
ところで利用者としては助かりますけど、ベーシックとプロフェッショナル500円しか変わらないの、価格設定ミスってる気がしてならない...。
解説と学習履歴については勿論、7問1セットになってるのがボリューム感として丁度良く、隙間時間にちょこちょこ進められたので良かったです。
基本的には問題集を進めながら、まとまった時間が取れた時は本試験モードで模試を受けていく、というスタイルで学習してました。
模試は3回受けて
1回目（9/23 上記書籍読んだ次の日）510
2回目（9/30）690
3回目（10/2）750
本番（10/3）791
ちなみにサイトによると本番は模試より100点ほど低くなる傾向があるそうです。あれ？

学習時間としては始めたのが9/18なので大体2週間ちょいです。
ただ特殊な事情で学習時間がたっぷり取れたので、あんま参考にならないです。

ちなみにこれに限らず、資格名でググるとほぼ100％候補に「意味ない」って出ますが、少なくとも初学者が体系的な知識を得る手段としては結構優れているというのが個人的な考えです。
目的ではなく手段であるという考えですね。

以上です。
これから受ける方の参考になりましたら幸いです。
NeovimのTelescopeプラグインで.gitignoreに指定したフィアルも検索したい

## はじめに
Neovimの[Telescopeプラグイン](https://github.com/nvim-telescope/telescope.nvim)でファイル検索のデフォルト設定は `.gitignore` に記述されたファイルが検索対象になりません。`.gitignore`に記述したファイルも検索対象に含める設定を紹介します。
## 設定方法
telescopeに `no_ignore = true` の設定を追加します。以下はlazy.nvimで設定をする例です。
```lua
require('telescope').setup {
  --省略
  
  pickers = {
    find_files = {
      no_ignore = true,
    },
  },
  
  --省略
}
```
## 動作を確認したバージョン
- neovim 0.10.1
- Telescope 0.1.8