OmniAICreator/Qiita-1.07M huggingface dataset:
AI（人工知能）に関する備忘録

# 模倣と生成AI

https://twitter.com/Jin__Sugimoto/status/1652067914231734273?s=20

# デザイン外注

https://twitter.com/DeepRecommendJP/status/1654327794397224960?s=20

# 脳波と人工ニューラルネットワークによる双安定画像の知覚的解釈の分類

https://twitter.com/DeepRecommendJP/status/1655275062654812161?s=20

# タレントの知名度 vs AIの生産性

https://twitter.com/Jin__Sugimoto/status/1658618012642181120?s=20

# AIはうさぎとアヒルに見える「双安定図形」を判別できるのか？

https://twitter.com/DeepRecommendJP/status/1659006086165434368?s=20

# 2027年までに最も成長する仕事トップ10…1位はAI・機械学習スペシャリスト

https://twitter.com/Jin__Sugimoto/status/1662095181867520000?s=20

# AI動画生成

https://twitter.com/DeepRecommendJP/status/1669229380827226112?s=20

# AI音楽生成

https://twitter.com/DeepRecommendJP/status/1669488257271468032?s=20

# レコメンドエンジンとバイアス

https://twitter.com/Jin__Sugimoto/status/1671110656622493698?s=20

# 量子ニューラルネット

https://twitter.com/Jin__Sugimoto/status/1673680620629684229?s=20

# AI CEO

https://twitter.com/Jin__Sugimoto/status/1674204428835115008?s=20

https://twitter.com/Jin__Sugimoto/status/1674211538557886465?s=20

# Emma

https://twitter.com/DeepRecommend/status/1675034770718470144?s=20

# 王政

https://twitter.com/Jin__Sugimoto/status/1675305311928979457?s=20

# 王政2

https://twitter.com/Jin__Sugimoto/status/1675311868498550784?s=20

# 社会を良くする

https://twitter.com/Jin__Sugimoto/status/1676732804464521218?s=20


# 勾配降下とそのバリエーションに関する実践的な内容

https://twitter.com/DeepRecommendJP/status/1677878544599494657?s=20

# 自殺願望は「推論」である ー なぜ自ら命を絶つという選択をしてしまうのか

https://twitter.com/Jin__Sugimoto/status/1679307453450842113?s=20

# 勾配上昇

https://twitter.com/Jin__Sugimoto/status/1683817536473931778?s=20

# 弦と粒子

https://twitter.com/Jin__Sugimoto/status/1683816537835335681?s=20

# 2次元への関心

https://twitter.com/Jin__Sugimoto/status/1683815601721180161?s=20

# BRA V6で赤い美女を生成

https://twitter.com/DeepRecommend/status/1686306631448215552?s=20

# 画像生成AIは岡本太郎を学習していない

https://twitter.com/Jin__Sugimoto/status/1683408312807854080?s=20

# LAIV

https://twitter.com/Jin__Sugimoto/status/1683075620211945472?s=20

# 建築

https://twitter.com/Jin__Sugimoto/status/1648225776544944128?s=20

# シンギュラリティ

https://twitter.com/Jin__Sugimoto/status/1659770578830761984?s=20
物理に関する備忘録

# ファインマン・ダイアグラム

https://twitter.com/Jin__Sugimoto/status/1643413843589345282?s=20

# 古典物理と量子力学

https://twitter.com/Jin__Sugimoto/status/1666971876244197376?s=20

# 虚構と創造

https://twitter.com/Jin__Sugimoto/status/1668503479126724608?s=20

# 量子情報幾何のメタバース分野への応用

https://twitter.com/DeepRecommendJP/status/1684444938703081473?s=20

# 相対性

https://twitter.com/Jin__Sugimoto/status/1684812122461708288?s=20

# 勾配上昇

https://twitter.com/Jin__Sugimoto/status/1683817536473931778?s=20

# 弦と粒子

https://twitter.com/Jin__Sugimoto/status/1683816537835335681?s=20

# 2次元への関心

https://twitter.com/Jin__Sugimoto/status/1683815601721180161?s=20

# 情報量

https://twitter.com/Jin__Sugimoto/status/1685876443107266562?s=20

# 影響力

https://twitter.com/Jin__Sugimoto/status/1683818706378588164?s=20

# デュアリティ

https://twitter.com/Jin__Sugimoto/status/1682147676945809408?s=20
創作に関する備忘録

# 量か質か、1

https://twitter.com/Jin__Sugimoto/status/1653966192565170178?s=20

# 左利き

https://twitter.com/Jin__Sugimoto/status/1661753094739480579?s=20

# 快楽優先

https://twitter.com/Jin__Sugimoto/status/1672403642476036097?s=20

# 量か質か、2

https://twitter.com/Jin__Sugimoto/status/1673518381251829760?s=20

# 創作と排泄

https://twitter.com/Jin__Sugimoto/status/1678298910476111873?s=20

# 情熱の燃やし方

https://twitter.com/Jin__Sugimoto/status/1685663510263746560?s=20

# 影響力

https://twitter.com/Jin__Sugimoto/status/1683818706378588164?s=20

# 破壊と創造

https://twitter.com/Jin__Sugimoto/status/1682147676945809408?s=20

# サイクル

https://twitter.com/Jin__Sugimoto/status/1649346212687122439?s=20

# n回目の飛躍

https://twitter.com/Jin__Sugimoto/status/1645302376692334592?s=20

# リリースについて

https://twitter.com/Jin__Sugimoto/status/1631117807038636033?s=20

# アイデア価値なし

https://twitter.com/Jin__Sugimoto/status/1643894101950201857?s=20

# 成果を捨てる

https://twitter.com/Jin__Sugimoto/status/1674716273891217408?s=20

# アウトプットが9割

https://twitter.com/Jin__Sugimoto/status/1686598527571636224?s=20
神経科学に関する備忘録

# Brain-to-Text

https://twitter.com/Jin__Sugimoto/status/1642479097929666562?s=20

# ニューロモルフィックコンピューティング

https://twitter.com/DeepRecommendJP/status/1651717571845189632?s=20

# 脳波と人工ニューラルネットワークによる双安定画像の知覚的解釈の分類

https://twitter.com/DeepRecommendJP/status/1655275062654812161?s=20

# BCI操作得意な人、苦手な人

https://twitter.com/Jin__Sugimoto/status/1668763678223781888?s=20

# 量子ニューラルネット

https://twitter.com/Jin__Sugimoto/status/1673680620629684229?s=20

# ニューロテクノロジー

https://twitter.com/Jin__Sugimoto/status/1679450414092263424?s=20

# 感覚の語彙の広げ方

https://twitter.com/Jin__Sugimoto/status/1685795706270048256?s=20

# 神経オーケストラ

https://twitter.com/Jin__Sugimoto/status/1684145725528240128?s=20

# 意識について

https://twitter.com/Jin__Sugimoto/status/1683814344575049728?s=20

# イベント

https://twitter.com/Jin__Sugimoto/status/1683077678897987586?s=20
SQLを学習したのでまとめてみた

SQLについて学んだことをまとめていきます。

# MySQL起動
- バージョン確認
```
$ mysql --version
```
- 起動
```
$ net start mysql80
```
- MySQLログイン
以下のどれかでログインする
```
$ mysql --user=root --password
```
```
$ mysql -u user_name -p
```
（例）mysql -u root -p
```
$ mysql -u test_user -h 127.0.0.1 -p
```
※　-hはホスト名を指定するオプション。localhostの時は省略可)
- ログアウト
```
exit
```
- 停止
```
$ net stop mysql80
```

# DDL
（Data Definition Language | データ定義言語）
テーブルを作成・更新・削除したり、テーブルごとのルールや制約を決めたりすることのできる言語

DDL には以下のような種類が存在する。

- CREATE : 新しいテーブルやビューなどのデータベースオブジェクトを作成する
- DROP : 既存のデータベースオブジェクトを削除する
- ALTER : 既存のテーブルベースオブジェクトを変更する
- TRUNCATE : テーブルを再作成する（テーブル内のデータを全削除する）

## ユーザー

#### ユーザー一覧を見る
```
SELECT user, host FROM mysql.user;
```
#### ユーザー作成
```
CREATE USER user_name@host_name IDENTIFIED BY 'password';
```
（例）CREATE USER test_user@localhost IDENTIFIED BY 'password';

#### パスワード変更
```
SET PASSWORD FOR user_name@host_name = 'new_password';
```
#### ユーザー名、ホスト名変更
```
RENAME USER 'user_name'@'host_name' TO 'new_user_name'@'new_host_name';
```
#### ユーザー削除
```
DROP USER user_name@host_name;
```

## データベース
#### データベース作成
```
CREATE DATABASE db_name;
```
#### データベース一覧照会
```
SHOW DATABASES;
```
#### データベース選択
(操作するデータベースを選択する。)
```
USE db_name;
```
#### データベース削除
```
DROP DATABASE db_name;
```

## テーブル

|データ型  |説明  |
|---|---|
|INT  |4 バイトの数値  |
|BIGINT  |8 バイトの数値  |
|FROAT  |浮動小数点ありの数値 |
|DATE  |日付  |
|DATETIME  |日時  |
|CHAR(n)  |固定長文字列（足りない分は空白で埋められる）  |
|VARCHAR(n)  |変長文字列  |
|TEXT  |変長文字列  |

※
TEXT型：65535文字まで格納できる。データは別領域に格納され、ポインタでアクセスするため、CRUDの効率はVARCHARに劣る。
VARCHAR型：格納できるデータ量は小さい。データを直接格納するため、CRUDの効率が良い。

#### テーブルを作成
カラムの型をそれぞれ指定する
```
CREATE TABLE db_name.table_name (column_name data_type, column_name data_type, ...);
```
USE で、使用するデータベースを選択している場合、db_name は不要
```
CREATE TABLE table_name (column_name data_type, column_name data_type, ...);
```
（例）CREATE TABLE departments (id INT, name VARCHAR(255), start_date DATE);

#### テーブルのスキーマを表示
```
SHOW CREATE TABLE table_name;
```
#### テーブル一覧を見る
```
SHOW TABLES;
```
### カラム
#### テーブルのカラムを確認
```
SHOW COLUMNS FROM table_name;
```

## インデックス
特定のカラム値のある行をすばやく見つけるために使用される。
インデックスがないと、MySQL は該当する行を見つけるために、先頭行から始めてテーブル全体を走査する必要がある。
特定のカラムにインデックスが設定されており、そのカラムでレコードを走査する場合、 B ツリーと呼ばれるデータ走査に強い木構造を用いることで、データの特定を素早く実行できる。

#### インデックスの設定
どちらでも可
```
ALTER TABLE table_name ADD INDEX index_name (column_name);
CREATE INDEX index_name ON table_name(column_name);
```
（例）departments テーブルの id カラムにインデックスを追加
```
ALTER TABLE departments ADD INDEX id_index (id);
```

#### テーブルのインデックス情報を見る
```
SHOW INDEX FROM table_name;
```
（例）
```
SHOW INDEX FROM departments;
```
認知に関する備忘録

# 自己認識

https://twitter.com/Jin__Sugimoto/status/1641220552043159552?s=20

https://twitter.com/Jin__Sugimoto/status/1641243503316602880?s=20

# 習得

https://twitter.com/Jin__Sugimoto/status/1641536746197487616?s=20

# 嘘

https://twitter.com/Jin__Sugimoto/status/1641997019207340033?s=20

# ベリーは認知機能に良い

https://twitter.com/Jin__Sugimoto/status/1643021122424930305?s=20

# 平行線のコミュニケーション

https://twitter.com/Jin__Sugimoto/status/1643067812548870150?s=20

# 営業

https://twitter.com/Jin__Sugimoto/status/1643083298803941380?s=20

# 主観シミュレーション

https://twitter.com/Jin__Sugimoto/status/1641233705233694720?s=20

# 明晰夢と他者記憶

https://twitter.com/Jin__Sugimoto/status/1642308949901996032?s=20

# 脳波と人工ニューラルネットワークによる双安定画像の知覚的解釈の分類

https://twitter.com/DeepRecommendJP/status/1655275062654812161?s=20

# AIはうさぎとアヒルに見える「双安定図形」を判別できるのか？

https://twitter.com/DeepRecommendJP/status/1659006086165434368?s=20

# 意思決定と認知

https://twitter.com/Jin__Sugimoto/status/1665187172561960966?s=20

# 事実と幻想

https://twitter.com/Jin__Sugimoto/status/1666338761096167424?s=20

# デザイン

https://twitter.com/Jin__Sugimoto/status/1668786882686382080?s=20

# インプットアウトプット

https://twitter.com/Jin__Sugimoto/status/1669872688213663744?s=20

# 相手の視点に立つ

https://twitter.com/Jin__Sugimoto/status/1671311374415466497?s=20

# 現象

https://twitter.com/Jin__Sugimoto/status/1673855966092353536?s=20

# アイソレーションタンク

https://twitter.com/Jin__Sugimoto/status/1676377692722327553?s=20

# 視覚的に伝える

https://twitter.com/Jin__Sugimoto/status/1678700639461965826?s=20

# 知覚の材料

https://twitter.com/Jin__Sugimoto/status/1678726851894874114?s=20

# 自殺願望は「推論」である ー なぜ自ら命を絶つという選択をしてしまうのか

https://twitter.com/Jin__Sugimoto/status/1679307453450842113?s=20

# 夢

https://twitter.com/Jin__Sugimoto/status/1685665643377680385?s=20

# 正論を振りかざす人

https://twitter.com/Jin__Sugimoto/status/1686194219386609664?s=20

https://twitter.com/Jin__Sugimoto/status/1686202912589189121?s=20

# 数学的認知

https://twitter.com/Jin__Sugimoto/status/1683480308560154628?s=20
Tmux：よく使うコマンドまとめ

### 起動
| コマンド | 説明 |
| ---- | ---- |
| tmux | セッションを起動 |
| tmux new -s 名前 | 名前付きセッションを起動 |

### 中断状態の再使用
| コマンド | 説明 |
| ---- | ---- |
|tmux a | 中断していたセッションに戻る (Attach)|
|tmux a -t 名前 | 中断していた名前付きセッションに戻る|

### 終了
| コマンド | 説明 |
| ---- | ---- |
| exit | セッションを終了 |
| Ctrl-b d | セッションを一時的に中断してメインに戻る (Detach) |



### session関連
| コマンド | 説明 |
| ---- | ---- |
|tmux list-sessions | セッションの一覧を表示|
|tmux kill-session -t 名前 | 指定したセッションを終了|
pdftk使い方備忘録

## Windowsの場合
1. scoopをinstallする
    ```
    Set-ExecutionPolicy RemoteSigned -scope CurrentUser
    invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
    ```
1. pdftkをinstallする
    ```
    scoop install pdftk
    ```
1. マージする
    ```
    pdftk *.pdf cat output out.pdf
    ```
Java:インスタンスの考え方

インスタンス生成って何よってお話


新卒SE一年目
Java未経験
→業務で2ヶ月弱使用
→Oracle Java bronzeに挑戦予定


Javaを勉強していく中で今まで全く聞き覚えがないインスタンスやらメソッドやらフィールドやら継承、ポリモフィズムなどの言葉がずらずらと…
未経験者の自分としては勉強中の自分に共感してくれる人が多いのではないかと思う。

今回はインスタンス生成、メソッド、フィールドについて取り上げたいと思う。

コメントで//インスタンス生成〜
とか書いてあることがちらほらと

正直インスタンスって何？何を生成するの？
疑問が次々に湧き出てきてもやもやが止まらなかった。

しかし！
そんななかわかりやすい例えをしている人が！

その例えとは
遊戯王やポケモンカードなどを例えにしていた。
今回は遊戯王例にしていく。


どういうことかというと…

モンスターカードを召喚
→インスタンス生成

カードの効果
→メソッド

モンスターのステータス
→フィールド

正直これが自分にとって1番しっくり来た。

ただしカードゲームを知っている人しか共感していただけないと思うがいかがであろうか。

ほかにいい例えがあったら是非ご教示願いたいところ。

Java勉強中の皆さんと一緒に頑張っていきたい。
コマンド一行でpythonのrequirements.txtを生成する

本記事はpipreqsによるpythonプロジェクトのrequirements.txtの生成方法についてご紹介します。

### pipreqsについて
pipreqsは、Pythonプロジェクトの依存関係を自動的に検出し、requirements.txtファイルを生成するツールです。
プロジェクト内のimport文を解析し、外部パッケージを見つけ出し、それらのパッケージとそのバージョンをrequirements.txtに出力してくれて非常に便利なツールです。

### メリット
手動でrequirements.txtを作成する手間を省くことができます。これにより、プロジェクトを他の環境に移動させる際や、仮想環境を再作成する際などに非常に便利です。

### pipreqsのインストール方法

```bash
pip install pipreqs
```

### 利用方法
インストールが完了したら、Pythonプロジェクトのディレクトリに移動して以下のコマンドを実行します：

```bash
pipreqs /path/to/your/project
```

これにより、指定したプロジェクト内のPythonファイルを解析し、requirements.txtファイルを生成します。

### 注意点
pipreqsは必ずしも完璧なリストを提供するわけではありません。人的要素で不要なパッケージが含まれたり、必要なパッケージが漏れていることがあります。
ですので、生成されたrequirements.txtを確認し、必要なら手動で修正することがおすすめです。
SwiftでAdapterパターン

[こちら](https://www.techscore.com/tech/DesignPattern/Adapter/Adapter1)の記事で記載されている演習内容をSwiftで写経させていただきました。

ざっくりまとめ
- Adapterパターンの使い道は、インタフェースに互換性のないクラス同士を組み合わせることを目的に使用される
- 継承や移譲を用いて、Adapteeのメソッドを呼び出す

## クラス図
### 継承パターン
![IMG_7EA8B343B4DA-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179037/5c4ac129-2d23-701e-6320-d29c18cbe15d.jpeg)

### 移譲パターン
![IMG_E58587A2CE87-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179037/55ec3688-c5be-f3c8-2130-6e2ea414c1ba.jpeg)

```swift
// Adaptee
class Taro {
    func enjoyWithAllClassmate() {
        print("みんなで楽しむ")
    }
}
// Target interface
protocol Charperson {
    func organizeClass()
}
// 演習1
//class Teacher {
//    func main() {
//        let chairperson: Charperson = NewTaro()
//        chairperson.organizeClass()
//    }
//}

//  継承パターン, Adapter
class NewTaro: Taro, Charperson {
    func organizeClass() {
        enjoyWithAllClassmate()
    }
}

// 移譲パターン, Adapter
class Hanako: Charperson {
    private let taro: Taro
    
    init() {
        self.taro = Taro()
    }
    
    func organizeClass() {
        taro.enjoyWithAllClassmate()
    }
}

// 演習2
class Teacher {
    func main() {
        let chairperson: Charperson = Hanako()
        chairperson.organizeClass()
    }
}


```
# 参考文献
- [TECHSCORE(テックスコア)](https://www.techscore.com/)
Oracle Analytics Cloud：ピボットのラベルを非表示にする

はじめに
---
ピボットのラベルを非表示にしてみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/d956fddc-344b-d6d7-4f11-0255fef635d5.png)

記事記載時のOAC ver：May 2023 Update

ラベルの非表示
---
ピボットのビジュアライゼーションを用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/f302286e-60b5-ee6f-dfb9-573c4f7de402.png)

ピボットのビジュアライゼーションをクリックし選択した状態で、「プロパティ」タブをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/d19357e1-5409-ddf6-1ec4-3edb490377a3.png)

プロパティの「エッジ・ラベル」タブをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/b0e6dddb-d60c-3c11-2c45-079fade5c728.png)

ヘッダーで、ラベルのオン/オフを設定します。「値.行」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/a9620339-4857-1430-fbcc-9ca15b0bebb8.png)

チェックを外します。「値」のチェックをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/7550c6c3-f869-15e1-ba87-2852139ea722.png)

値のラベルが非表示になります。行のラベル　商品大分類も消してみます。ヘッダーの「行」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/32e65709-7240-9802-c69f-bbd77e1416e8.png)

「行」のチェックをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/ba3e57dd-4e3e-e0c5-473d-546650f849a6.png)

行のラベルが非表示になります。行、列、値のラベルが非表示になった状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/878b01ce-3b6f-2bd4-171b-550ab85401ed.png)


すべてをオンにした状態はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/3db623db-8158-966c-cf78-3e1984f570bd.png)

以上
さくっとSvelteインストール

さくっとSvelteをインストールして、デモページを表示することを目標にします。

# 特徴
仮想DOMを使用しないため、パフォーマンス良く、バンドルサイズを少なくできます。

# 準備するもの
- MacOS
- Nodeの最新バージョン
- VSCode

# Nodeの最新バージョン
※以前の[記事](https://qiita.com/penta-design-system/items/4139dd63ae54ab0d1c35#node%E3%81%AE%E6%9C%80%E6%96%B0%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3)でNodeのバージョン管理ツールからインストールする方法を記載しています！


# SvelteKitをインストール
Svelteのコンパイラを使用するUIフレームで、SvelteとViteで構成されています。
VueでいうところのNuxtになります。

```
npm create svelte@latest svelte-samlple
```
オプション選択

```
◇  Which Svelte app template?
◇  Add type checking with TypeScript?
◇  Select additional options (use arrow keys/space bar)
```

Which Svelte app template -> SvelteKit demo app
Add type checking with TypeScript? -> TypeScript
Select additional options (use arrow keys/space bar) -> ESLint, Prettier

必要なオプションを指定します。
lint系だけあれば良いと思います。


# Svelteを動かす
ここからはVSCode上で作業します。

ターミナルで、svelte-samlpleフォルダに移動し、codeコマンドでVSCodeを開きます。
※codeコマンドを使用するためには、VSCode上で`shift + command + p`から、「シェルコマンド：PATH内に'code'コマンドをインストールします」でインストールしておいてください

```
code .
```

# Node.js 関連のパッケージをインストール
```
npm install
```

# 開発サーバーを起動
```
npm run dev -- --open
```

Webブラウザ(Chromeなど)が開かれるので、VSCodeに許可をして、デモページが表示されたら完了です。
JavaFXでScrollPaneのスクロールバーの速さを調整する


javafx.scene.controlのクラスであるScrollPaneのスクロールバーの速さ(１スクロールで進む量)の変更方法が地味に見つからなかったのでメモ。

## 環境
エディタ：eclips
JavaFXバージョン：javafx-sdk-18.0.1

## javax.swingの場合
ちなみにjavax.swingのクラスであるJScrollPaneならば、
```
JScrollPane scroll = new JScrollPane();
scroll.getVerticalScrollBar().setUnitIncrement(hoge);
```
でhogeの値を変更するだけでよい。

https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JScrollPane.html

https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JScrollBar.html

## JavaFXの場合
ScrollPaneのドキュメントは以下の通り。

https://docs.oracle.com/javase/jp/8/javafx/api/javafx/scene/control/ScrollPane.html

見ればわかるように、Incrementの値を変更するメソッドどころか、ScrollBarを取り出すメソッドもない。

そのため、addListenerで元の位置と現在の位置を取得し、その進んでいる方向を検知して、新たな位置からその方向にさらに進めてあげる必要がある。

ScrollPaneのvvalueというプロパティは、垂直方向のスクロール位置を0.0~1.0のdouble型で表している。

https://docs.oracle.com/javase/jp/8/javafx/user-interface-tutorial/scrollpane.htm
【AWS】特定のURLに対してアクセスされた回数を確認する【ALB】

大したことじゃないのですが、ALBの内側にあるアプリケーションに対して特定のpathでアクセスしてる件数を調べてほしいといわれたのでその時の手順をメモ代わりに残します。

# 【概要】
インスタンスが１台ならそいつのWEBサーバが吐いてるアクセスログを見ればいいんですが、複数台インスタンスを置いてALBでロードバランシングしているケースではすべてのインスタンスを見に行くのは手間です。

そのため、起点となるALBのアクセスログから必要な情報を読み取ります。


# 【前提】
[Application Load Balancer のアクセスログを有効にする][0]を設定済みとします。

# 【手順】
```
//5分ごとにログが出ているので、必要な範囲のファイルをローカルにDL
aws s3 cp s3://test-logs/alb/AWSLogs/111222333444/elasticloadbalancing/ap-northeast-1/2023/08/02/ . --recursive

//grepのhit数確認　zgrepだとgzを解凍せずにgrepできる。
zgrep -c "/the/string/you/want/to/find" ./*
　./~.log.gz:10 ←ファイル別にHIT数を出力できる。（ex:10件）
　./~.log.gz:27　（ex:27件）
　...
 ```

 # 【特定のIPからアクセスがあったか確認】
 
```
find ./ -type f -name "*.gz" -print0 | xargs -0 zgrep -nHc "00.000.000.00"
./03/23/50/942949530732_waflogs_ap-northeast-1_xxx-xxx-webacl_20240303T2350Z_d9966045.log.gz:113
./04/09/50/942949530732_waflogs_ap-northeast-1_xxx-xxx-webacl_20240304T0950Z_8f440fad.log.gz:2
```

# 【あとがき】
コンソールの機能で～とか監視システムで～とか難しく考えてはいけない。

最近記事書いてなかったからリハビリ的な。
毎回重い記事ばっか書いてるからそういうことになる。

[0]:https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/enable-access-logging.html
【ChatGPT無】と新人研修後の話をしてみた

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　どうも、カーブミラーです。

　今回は、
　　ふと、新人研修後のことを
　　　思い出しましたことから、
　　　　それを書きます。
　　　　　もちろん、
　　　　　　ChatGPTさんにも
　　　　　　　参加してもらって。

　もう新人が来なくなって、
　　ウン年ですから、
　　　そんなことが
　　　　あったことさえ
　　　　　忘れていましたw

　みなさんのところは
　　どうですか？
***
　さて、
　　ChatGPTさんに
　　　聞いてみましょう。
```Text:新人研修後の話１
User
研修を終えた新人が配属されてきました。
どういった流れで、仕事に馴染ませれば、いいでしょうか？
流れの順で、箇条書き（番号付き、説明不要）でお願いします。


ChatGPT
新人の仕事に馴染ませる流れ（番号付きの箇条書き）：

1. オリエンテーションやイントロダクションを実施し、会社や部署の概要を説明する。
2. 仕事内容や業務プロセスについて、トレーニングや説明を行う。
3. メンターを割り当てて、新人が質問や悩みを相談できるようにする。
4. 新人の能力や興味に合わせて、適切なプロジェクトやタスクを割り当てる。
5. 定期的なフィードバックと評価を行い、成長の機会を提供する。
6. チームメンバーとのコラボレーションを促進し、コミュニケーションを円滑にする。
7. 新人に向けて社内イベントや交流の場を提供し、同僚との親交を深める。
8. 新人が自身のアイデンティティを確立できるようにサポートする。

これらのステップを順番に進めることで、新人の仕事への馴染みがよりスムーズに進むでしょう。
```
　ううむ、
　　そこまでやった
　　　記憶がないなぁ。

　仕事をしながら、
　　新人さんに、あれこれ教えて、
　　　聞かれて答えて……。

　歓迎会で飲んで、
　　たまに、奢って飲んで、
　　　送別会で飲んで……終わった。

```Text:新人研修後の話２
User
以上の流れをどのようなスケジュールで行なえば、いいでしょうか？


ChatGPT
スケジュールは個々の企業や部署の状況によって異なりますが、一般的な目安として以下のようなスケジュールを考えることができます：

1日目：
- オリエンテーションとイントロダクションを実施。
- 会社や部署の概要を説明。
- 必要なシステムやツールの導入を行う。

1週間目：
- 仕事内容や業務プロセスの基本的なトレーニングを実施。
- メンターを紹介し、役割や相談の方法を説明。

2週間目：
- メンターとのミーティングで進捗と悩みを確認。
- 新人に適した小さなプロジェクトやタスクを割り当て。

1ヶ月目：
- メンターとの定期的な進捗確認とフィードバックを実施。
- チームメンバーとのコラボレーションを促進。

3ヶ月目：
- 新人の成長とスキルを評価し、適切なプロジェクトに参加させる。
- 社内イベントや交流の場を提供して同僚との親交を深める。

半年目：
- 新人の能力や適性をより詳細に評価し、適切なキャリアパスを検討。
- キャリア成長のためのトレーニングやセミナーの機会を提供。

以上のスケジュールを参考にしながら、新人の能力や成長に合わせて調整することで、よりスムーズな馴染みとキャリア成長を促進できるでしょう。
```

　そんな手間、掛けられぬ。
　　仕事を少しずつ与えて、
　　　業務の中で、覚えてもらう。

　もちろん、新人さんの
　　様子を観て、うまく誘導します。

　本当は、
　　なんらかの技術を
　　　仕込めれば、
　　　　いいのでしょうけど、
　　　　　自分の裁量で
　　　　　　やってもらうしか
　　　　　　　ありませんでした。

```Text:新人研修後の話３
User
スケジュール途中で、新人がほかの部署へと移動することになりました。
新人に対して、何かするべきでしょうか？
箇条書き（番号付き、説明不要）でお願いします。



ChatGPT
新人が別の部署へ移動する際に考慮すべき点（番号付きの箇条書き）：

1. 移動の理由と希望をよく聞く。
2. 移動先の部署との円滑な連携を確保する。
3. 新しい部署でのオリエンテーションをサポートする。
4. 前の部署での成果やスキルを移動先に共有する。
5. 新しい部署へのスムーズな移行をサポートする。
6. メンターまたはサポート担当者を新しい部署でも割り当てる。
7. 移動後も定期的なフォローアップを行い、適応にサポートを提供する。

これらの点を考慮し、新人の移動が円滑に進むようにサポートしてください。
```

　頑張れ会で、送ったら、
　　たまに様子を観るくらい
　　　でしょうか。

```Text:新人研修後の話４
User
新人が辞めることになりました。
本人に話を聞くと、副業が忙しくなって、そちらを本業にするそうです。
何かすべきでしょうか？


ChatGPT
新人が辞める際に考慮すべき点（番号付きの箇条書き）：

1. 辞職理由を理解し、本人の意向を尊重する。
2. 退職手続きを円滑に進める。
3. 社内でのフィードバックを収集し、組織改善のための参考にする。
4. 社内の他のメンバーに新人の担当業務を引き継ぐよう調整する。
5. 新人のキャリア成長や経験を評価し、将来の戻り道を開いておく。
6. 感謝の気持ちを伝え、スムーズな別れをサポートする。

辞めることになった新人が副業を本業にするとのことなので、その選択を尊重し、円滑な退職と引き継ぎを行いましょう。また、将来の機会を残すために、前向きな姿勢で別れを送ることが大切です。
```
　これは、
　　最近の話題を
　　　入れてみただけですw

　副業を許可する
　　企業が増えていますからね。

　ありそうな話かと。

　本業だけでは、
　　賄いきれなくなっています。
　　　余裕があるならば、
　　　　副業はあり、
　　　　　でしょうね。

　まぁ、自己判断でしょう。

　私もそろそろ、
　　副業しようかなぁ、
　　　と思っている毎日ですw
　　　　転職は、キビシイので(泣)
[Atcoder] K - Stones [DP まとめコンテスト]

問題 : [dp-k Stones](https://atcoder.jp/contests/dp/tasks/dp_k)

# 結論

`dp[x]` := x個の石でゲームして、最初に行動するプレイヤーが勝つことができるか

```python
def getInts():
    return map(int, input().split())

def getIntsArray():
    return [int(x) for x in input().split()]

N, K = getInts()
choices = getIntsArray()
dp = [False] * (K + 1)
for i in range(K):
    for choice in choices:
				if i + choice <= K:
						dp[i + choice] = dp[i + choice] or not dp[i]
if dp[K]:
    print("First")
else:
    print("Second")
```

# 思考順序

何を状態として保持するかを考えました。

まずは

- `dp[x]` := `x`個以上石を取る最短の手順
- `dp[x+a_1], dp[x+a_2]..., dp[x+a_n]`への遷移を考える
- 最終的に`dp[K] (mod2)`を答える

実装例

```python
INF = float("inf")
dp = [INF] * (K + 1)
for i in range(K):
    for choice in choices:
        if i + choice <= K:
            dp[i + choice] = min(dp[i + choice], dp[i] + 1)

turns = dp[K]
if turns % 2 == 0:
    print("Second")
else:
    print("First")
```

しかし、このdpテーブルはこのゲームのルールを正確に反映できていません。

たとえば

K = 4, choices = (2, 3)のとき
石の数は、先手が勝つように4 -> 1 と遷移するべきですが、dp[4] = 2で表現される取り方は 4 -> 2 -> 0です。先手がわざわざ後手が勝つような取り方をしてしまっています。

## 各プレイヤーの最適行動は？

では、プレイヤーにとって最適な行動とは何でしょうか？

具体的な数字で考えるのが本質をとらえる近道です。

具体例で考えてみます。

### K = 20, choices = (1,2,3)

Kが4nなら必ず後手が勝つのがわかります。

相手と合わせて4になるように取り続ければいいです。

相手との取る個数の和で考えるのがよさそうでしょうか？しかし、これはすぐに否定されます。

必ず一定の和に落とすことが難しいです。 ex) (1, 3, 7)

他の例も続けて見ましょう

## choices = (2,3)

### K = 4のとき

4 -> 1 でFirst

### K = 5のとき

5 -> 2 -> 0
5 -> 3 -> 0でSecond

### K = 7のとき

7 -> 4 -> 1 First
7 -> 5 こうすると自分が負けるから選ばない

上記の例を見ると、プレイヤーは自分が詰んでしまうような選び方はできない
ということがわかります。
逆に言うと、相手を詰ませるように選ぶのが最適行動です。当たり前ですが…
しかもこの例における、`K=4`や`K=5`のようにどう選んでもどちらが勝つか決定してしまうゾーンが存在します。

すると、持つべき状態は非常に単純ですが
`dp[x]` := x個の石があるときに先手が勝てるかどうか Boolean
と定義するのがよさそうです。

また、K = 7のときを見てわかるように、このdpテーブルでは、先手が勝つならそれを優先するので、
`dp[i+choice]`への遷移を考えるとき
`dp[i + choice] = dp[i + choice] or not dp[i]`とすべきです

## 計算量
計算量はサイズKのdpテーブルの各状態から、N個の選択肢の数だけ遷移させるので
```math
O(NK)
```
です。今回は10**7で収まっています。
なぜロジスティック回帰は「回帰」がついてるのに線形モデルで使う？

ChatGPTに説明してもらいました


ロジスティック回帰の名前に「回帰」という用語が付いているのに、実際には線形分類のために使用されることが多いのは、少し混乱を招くかもしれません。この背後には、ロジスティック回帰の動作原理と歴史的な名残りが関係しています。

1. **回帰の要素**: ロジスティック回帰は、入力特徴の線形結合から得られる値をシグモイド関数に適用して、0から1の範囲の確率を出力します。この線形結合部分が「回帰」の部分で、出力が連続値であるために、回帰の手法としても考えることができます。

2. **分類の要素**: しかし、ロジスティック回帰の主な用途は2クラスの分類問題です。出力される確率値を閾値（よく0.5が使われる）で切って、2つのクラスに分類します。このため、ロジスティック回帰は線形分類器としても機能します。

3. **歴史的な背景**: また、ロジスティック回帰の名前は、線形回帰との関連から来ており、両者が共有する線形結合の側面を強調しています。

つまり、ロジスティック回帰は名前が示すように回帰の一形態でありますが、出力を確率として解釈し、分類のために使うことが一般的なので、しばしば線形分類器として言及されるのです。
windowsでiverilog その138

# 概要　
windowsでiverilogやってみた。
verilog見つけたので、テストベンチ書いてみた。

# 参考にしたページ。

https://qiita.com/wakuto/items/d54326d9837379698f40


# サンプルコード

```
module test;
	reg CLK;
	wire V_SYNC;
	wire H_SYNC;
	wire DCLK;
	wire [7:0] DR;
	wire [7:0] DG;
	wire [7:0] DB;
	wire DE;
	wire LED;
	LCD u(.CLK(CLK), .V_SYNC(V_SYNC), .H_SYNC(H_SYNC), .DCLK(DCLK), .DR(DR), .DG(DG), .DB(DB), .DE(DE), .LED(LED));
	always
	begin
		#1
			CLK = ~CLK;
	end
	initial
	begin
		$dumpfile("test.vcd");
		$dumpvars(0, test);
		CLK = 0;
	#5000
		$finish;
	end
endmodule

```

# 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/75673ab7-150e-0155-67c1-0df66632fba0.png)


以上。
numpy.sumのaxisは-1を指定した場合はどう言う意味？

`numpy.sum`関数において、`axis`パラメータに`-1`を指定すると、最後の次元に沿った和を計算します。

例えば、もし2次元配列（行列）を持っている場合、`axis=-1`は各行の要素の和を計算します。3次元配列の場合、それぞれの2次元スライスの各行の要素の和を計算します。このように、`axis=-1`は常に最後の次元に沿って和を取ります。

2次元配列の例：

```python
import numpy as np

arr = np.array([[1, 2], [3, 4]])
result = np.sum(arr, axis=-1)
print(result)
#[3, 7]
```

3次元配列の場合：

```python
arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
result = np.sum(arr, axis=-1)
print(result)
# [[3, 7],
#  [11, 15]]
```
この方法で、配列の形状が変わっても同じ次元に対して和を取るコードを書くことができます。


他にも色々比較してみます
```python
#3x2
arr = np.array([[1,2],[3,4],[5,6]])
result = np.sum(arr,axis=-1)
print(result)
#[ 3  7 11]

result = np.sum(arr,axis=1)
print(result)
#[ 3  7 11]

result = np.sum(arr,axis=0)
print(result)
#[ 9 12]
```
Windows PowerShellでssh-copy-idコマンドを使う

- Linuxにある`ssh-copy-id`をWindowsでもやりたくなったので、GPT-4に聞きながら関数を作って登録してみました。
- 参考ページでは関数化まではしていなかったので、本記事では関数化して呼び出せるようにしました。


## コード
```powershell
$dir = Split-Path -Path $PROFILE
if (!(Test-Path -Path $dir)) {
    New-Item -ItemType Directory -Force -Path $dir
}

if (!(Test-Path -Path $PROFILE)) {
    New-Item -Type File -Path $PROFILE -Force
}

Set-ExecutionPolicy Unrestricted -Scope CurrentUser

Add-Content -Path $PROFILE -Value @"
function ssh-copy-id {
    param (
        [Parameter(Mandatory=`$true, ValueFromRemainingArguments=`$true)]
        [string[]]`$HostName
    )

    `$sshCommand = `"mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys`"

    foreach (`$h in `$HostName) {
        cat ~/.ssh/id_rsa.pub | ssh `$h `$sshCommand
    }
}
"@

. $PROFILE
```

## 使い方
```powershell
ssh-copy-id username@hostname
```

- 同時に複数のホストへも公開キーを渡せます。
```powershell
ssh-copy-id 'username1@hostname1' 'username2@hostname2' 'username3@hostname3'
```

- ポートがデフォルト22番ではない場合、ssh configに記載してから実行してください
```ssh:config
Host HostName1
    HostName hostname1
    Port 3000
    User username1
    IdentityFile ~/.ssh/id_rsa
```

```powershell
ssh-copy-id HostName1
```


## 軽く解説

### PROFILEがない場合は作成する
- PROFILEとは.bash_aliasみたいなもの。
- `$PROFILE` でPROFILEのパスを確認できるが、存在してなくてもパスが出てくるので、表示されたパスをlsで確認してみる。ない場合は以下を実行する。

```powershell
$dir = Split-Path -Path $PROFILE
if (!(Test-Path -Path $dir)) {
    New-Item -ItemType Directory -Force -Path $dir
}

if (!(Test-Path -Path $PROFILE)) {
    New-Item -Type File -Path $PROFILE -Force
}
```

### スクリプト実行ポリシーを `RemoteSigned` または `Unrestricted` に変更する
- `RemoteSigned` は、ローカルコンピュータ上で作成されたスクリプトは実行を許可し、インターネットからダウンロードしたスクリプトはデジタル署名が必要となるポリシー
- `Unrestricted` はすべてのスクリプトを実行するポリシー

- 以下で権限を確認
    - 私の場合、`Restricted`になっていたので、権限を変更しました。
```powershell
Get-ExecutionPolicy
```

- 権限を`Unrestricted` に変更
```powershell
Set-ExecutionPolicy Unrestricted -Scope CurrentUser
```

### `ssh-copy-id`という関数をPROFILEに登録する
```powershell
Add-Content -Path $PROFILE -Value @"
function ssh-copy-id {
    param (
        [Parameter(Mandatory=`$true, ValueFromRemainingArguments=`$true)]
        [string[]]`$HostName
    )

    `$sshCommand = `"mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys`"

    foreach (`$h in `$HostName) {
        cat ~/.ssh/id_rsa.pub | ssh `$h `$sshCommand
    }
}
"@
```

### PROFILEを再読み込みする
```powershell
. $PROFILE
```

## 参考
https://qiita.com/tabu_ichi2/items/446722c15e6b5678ccad
[Gather.town]スペースキーで自身の最短距離にある操作可能なオブジェクトの情報を取得

- リモートコミュニケーションツールとして[Gather](https://www.gather.town/)を利用しています。
- Gatherは基本機能以外の仕掛けが沢山あり、その中の1つがブラウザコンソール等で扱えるSocket APIの存在です。
- 「現在位置の取得」や「参加者情報の取得」など豊富に存在しており、それらを適切に組み合わせることで色々な操作を行うことが可能です。
- 今回は**スペースキーで自身の最短距離にある操作可能なオブジェクトの情報を取得**する方法を記録いたします。
- [過去の実装記事一覧](https://dev.classmethod.jp/search/?q=gather&author=t_o_d&page=1)はこちら

## 結果
- 以下のようにマップ内に操作可能なオブジェクトがいくつかある状態とします。
    - **例として「[テトリス](https://support.gather.town/hc/en-us/articles/15910362002708-Integrated-Games)」「[ホワイトボード](https://support.gather.town/hc/en-us/articles/15910377729044-Collaborate-on-Whiteboards)」オブジェクトを対象とします。**

![image](https://github.com/Kamekure-Maisuke/nogicomma/assets/44114228/36a8fe23-a405-4c37-9860-f7155ea9abfb)

- このマップ内で以下の内容をChromeコンソール画面に入力して実行すると、**スペースキーで自身の最短距離にある操作可能なオブジェクトの情報を取得することができます。**
    - **※実行には権限が必要です。**

```javascript
// スペースキー押下時に発火する処理
game.subscribeToEvent(
  "playerTriggersObject",
  ({ playerTriggersObject }, { map, player, playerId }) => {
    if (!map || !player || !playerId) {
      return;
    }

    // オブジェクト一覧
    const objects = map.objects;
    if (!objects) {
      return;
    }

    // 最短距離にある操作可能なオブジェクトキー
    const closestObjetctKey = playerTriggersObject.key;
    if (!closestObjetctKey) {
      return;
    }

    // 最短距離にある操作可能なオブジェクト情報
    const closestObjetct = objects[closestObjetctKey];

    // 「名前・座標」出力
    const result = {
      name: closestObjetct._name,
      x: closestObjetct.x,
      y: closestObjetct.y,
    };
    console.log(result);
  },
);
```

![image](https://github-production-user-asset-6210df.s3.amazonaws.com/44114228/257674647-d594329d-7a2d-47e7-83ba-b3099b09c084.png)

- 実行後、それぞれ「**テトリス**」「**ホワイドボード**」の近くまで行ってスペースキー押下して、以下のようにコンソールに最短距離のオブジェクト情報が出力されることを確認します。
    - **近くに操作可能なオブジェクトがなければ何も出力されません。**

![image](https://github-production-user-asset-6210df.s3.amazonaws.com/44114228/257675516-ad24f97d-f8bc-4900-9d3f-0b57dc777684.png)

![image](https://github-production-user-asset-6210df.s3.amazonaws.com/44114228/257675527-dd207f8c-5787-4c3e-831c-fc3ecf18b093.png)

## 内容
- 上記のスクリプトは以下のGather.townで用意されているSocket APIを利用しています。
    - **game.subscribeToEvent(イベント,ハンドラ)** : 指定のイベントが起こった時のイベントハンドラ。
- まずマップ内でスペースキー押下時のイベントハンドラを登録します。
    - **その他のイベント一覧はこちらを[参考](http://gather-game-client-docs.s3-website-us-west-2.amazonaws.com/classes/Game.html#subscribeToEvent)。**
- その処理が発火した際にコード内の「**playerTriggersObject**」や「**map**」等の変数にオブジェクトの詳細情報が格納されます。
    - **※近くに操作可能なオブジェクトが無ければundefinedを返すため処理を終了させています。**
- 最後にそのオブジェクト情報から「**名前**」「**座標**」を出力するというスクリプトとなっております。

## 補足
- 他の操作の情報は[こちらのサイト](http://gather-game-client-docs.s3-website-us-west-2.amazonaws.com/classes/Game.html)から確認できます。

## 参考
- [Gather Town](https://www.gather.town/)
- [Gather Socket API](http://gather-game-client-docs.s3-website-us-west-2.amazonaws.com/classes/Game.html)
Amazon MWAA のパブリックアクセスモードでIPアクセス制限をかけられるか？

# 確認したいこと
## 前振り
Amazon MWAAでは、アクセスモードが2種類あります。パブリックアクセスモード、プライベートアクセスモードです。
パブリックアクセスモードは、Airflowのウェブサーバーにインターネット経由でアクセスできるモードです。AWSコンソール上のリンクからウェブサーバーにアクセス可能です。一方、プライベートアクセスモードは、AirflowのウェブサーバーにはVPC内からのアクセスに閉じられます。そのため、VPC外からアクセスするためにはVPCやロードバランサーを利用する必要があります。

https://docs.aws.amazon.com/ja_jp/mwaa/latest/userguide/vpc-vpe-access.html#vpc-vpe-access-endpoints

## 確認したい内容
今回確認したいのは、 **パブリックアクセスモード（インターネット経由でアクセス可能）でアクセスするIPを制御できるか？** です。
インターネット経由でアクセス可能な場合、セキュリティの観点からアクセスできるIPを絞りたいのが常だと思います。プライベートアクセスモードであれば、自分でALBを建ててそのセキュリティグループで制御できますが、パブリックアクセスモードでもセキュリティグループで制御できるかを確認します。

# 結論から
**出来ません。**
MWAAの環境に設定するセキュリティグループでアクセスIPを制限しても、ウェブサーバーにはそれ以外のIPからもアクセスできてしまいます。

## じゃあセキュリティグループはどこを制御している？
MWAAの環境を作成する際に、以下のようにセキュリティグループを選択できますが、「環境とウェブサーバー間のトラフィックを許可するために必要」とあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/ae27fb66-7e3d-de11-0290-2f247d02b5e6.png)
また、以下のドキュメントを見ると、(オプション)としてメタデータベースとのやり取り、ウェブサーバーとのやり取りを許可する例が記載されています。

https://docs.aws.amazon.com/ja_jp/mwaa/latest/userguide/vpc-security.html#vpc-security-sg

これらを総合して考えると、MWAAの環境に設定するセキュリティグループは、以下の図の中の左側のCustomer VPC内のスケジューラーやWorkersに対して付与されるのではないかなと思われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/be2c1678-7dcc-d132-6baa-a4e47badd8fa.png)

画像参照元：

https://docs.aws.amazon.com/ja_jp/mwaa/latest/userguide/what-is-mwaa.html

# 検証

分かりやすいように、MWAAの環境に設定されているセキュリティグループのインバウンドルールに、何も設定しないようにしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/4710b155-2787-6dc8-afa7-0a7e6ecc72e3.png)

その状態で、以下の「Airflow UI を開く」のリンクをクリックして、アクセスしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/cf5b720b-46a4-dd9a-2146-d61896736c46.png)

アクセスできました。
ただ、今までは出ていなかった警告文のようなものが出ています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/c7118085-8f1d-c072-0999-5d5a5e1e209c.png)

>The scheduler does not appear to be running. Last heartbeat was received 45 minutes ago.
The DAGs list may not update, and new tasks will not be scheduled.

翻訳はこちら。
>スケジューラーは実行されていないようです。最後のハートビートは 45 分前に受信されました。
DAG リストは更新されない場合があり、新しいタスクはスケジュールされません。

ウェブサーバーから、スケジューラーにアクセスが出来ていなそうな内容ですね。
やはり、セキュリティグループはウェブサーバーというよりはCustomer VPC内のスケジューラーやWorkersに付与されているのかなと思われます。

# おわりに
MWAAのパブリックアクセスモードだと、少なくともセキュリティグループでのIPアクセス制限は出来なさそうですね。プライベートアクセスモードにして、前にALBなど置いてそこにセキュリティグループを設定するなどするしかなさそうです。
MWAAの公式ドキュメントの翻訳があまりイケてなく、読み解くのが結構大変でした。今後もMWAAの記事は検証し次第上げていきたいなと思います。

# 参考にしたサイト

https://blog.serverworks.co.jp/mwaa-network

↑めっちゃわかりやすいです。

https://repost.aws/ja/knowledge-center/mwaa-connection-timed-out-error
Einstein OCR


残念ながら無料版はなくなったようです。

The Free version of Einstein Language and Vision has been discontinued.

+ [Einstein OCR](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jg28F)
+ [Einstein OCR (Vision & Language)](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007GIbVx)
+ [Einstein Object Detection & Image Classification Retirement - Publish Date: 31 Jan 2023](https://help.salesforce.com/s/articleView?id=000394460&type=1)

日本語でも機能するのかな？

+ [Use Einstein OCR to Detect Text in PDFs (Beta)](https://help.salesforce.com/s/articleView?id=release-notes.rn_einstein_vision_ocr_pdf_support.htm&release=230&type=5)
+ [Detect Text in an Image with Einstein OCR (Generally Available)](https://help.salesforce.com/s/articleView?id=release-notes.rn_einstein_vision_ocr_ga.htm&release=226&type=5)
+ [Einstein OCR: Extract Data from Invoices](https://newstechnologystuff.com/einstein-ocr-extract-data-from-invoices/)
+ [Einstein OCR を試してみよう](https://zenn.dev/takahito0508/articles/einstein-ocr-intro)
+ [CREATE OCR APP USING SALESFORCE EINSTEIN OCR API](https://salesforcecodex.com/salesforce/create-ocr-app-using-salesforce-einstein-ocr-api/)

# 代替案は？

+ [Salesforceに登録されているPDF 内のテキストの検出方法](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epkPF)



O U
Jun 21, 3:03 PM
Cloud Vision APIを見ましたが、実際いくらかかるのか計算出来ないので料金が未知数ですね、、

https://cloud.google.com/vision/pricing?hl=ja

AIにSalesforceでPDFを自動的にテキスト化し、Google Cloud Vision APIを利用するApexコードをトリガーに設定する方法を聞いてみましたが

回答内容の精度を問い詰めてたら結構面倒な手間が見えてきました。


-----

外部サーバー(仮想サーバー)を立てることが可能であれば、Pythonなどを使ってPDFからテキストを抽出して結果を返すようなこともできるかもしれません。

これなら外部サーバーが既にあればライセンス費用は掛からないです。

+ [PythonでPDFをテキストに変換し、テキストを抽出](https://qiita.com/iceblue/items/8ceb5674337f72fe5954)

よく考えたら私自身はこの逆を外部サーバーを使って実施しています。

Salesforceで作ったカスタムオブジェクトの見積り情報を外部サーバーに送ってExcelのひな型にデータを流し込んでPDFとして出力した結果をSalesforce上に添付ファイルとして保存しています。Excelファイルへの差し込みにはPythonを利用したCGIで行っています。
MeCab (mecab-ipadic-NEologd)ダウンロードに時間がかかりすぎる

備忘録としてかきます。同様の問題で困っている方の助けになれば幸いです。
よくわかっていないので問題があればコメントで指摘してください。

## 現象
- MeCab (mecab-ipadic-NEologd)の環境構築時、時間がかかりすぎる。

## 再現手順
公式のインストール手順

```sh
$ git clone --depth 1 git@github.com:neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n
```

## どうやって確認したか

docker だったため、エラーを詳細に出す`--progress=plain`オプションで、エラーを読むと`https://ja.osdn.net`へアクセスしており、このサイトにブラウザからアクセスしてみると、タイムアウトした。そのためこのサイトへのアクセスが問題だったようだ。

```
#7 26.79 [make-mecab-ipadic-NEologd] : Download original mecab-ipadic file
#7 26.79 [make-mecab-ipadic-NEologd] : Try to access to https://ja.osdn.net
#7 37.49 [make-mecab-ipadic-NEologd] : Unable to access https://ja.osdn.net
```

(余談だが、このosdnというサイトは OSS をサポートする会社で、最近中国に買収されたようである。)

同様の issue が上がっていないか、確認するとあった。

https://github.com/neologd/mecab-ipadic-neologd/issues/84

ダウンロード先を Google Drive に変えるマージリクエストが出されていたため、承認されたらこの問題は解決しそうである。

またそのMRのページを辿ってみると ja.osdn.net へのリクエストができないと次に Google Drive から取得するようにみえた。

## 解決策
2つの解決策がある。

1. [`https://ja.osdn.net`をすべて`https://drive.google.com`に書き換えるMR](https://github.com/yokomotod/mecab-ipadic-neologd/commit/72de88eae95465da1f6f27383faa31efd8bd2a19)を真似する。
2. 待つ

解決策2 は、私の場合１５分待つと、勝手に取得先をGoogleDriveに切り替えてダウンロードをしてくれた。

```
#7 26.79 [make-mecab-ipadic-NEologd] : create /tmp/mecab-ipadic-neologd/libexec/../build
#7 26.79 [make-mecab-ipadic-NEologd] : Download original mecab-ipadic file
#7 26.79 [make-mecab-ipadic-NEologd] : Try to access to https://ja.osdn.net
#7 37.49 [make-mecab-ipadic-NEologd] : Unable to access https://ja.osdn.net
#7 37.49 [make-mecab-ipadic-NEologd] :     Status code : 504
#7 37.49 [make-mecab-ipadic-NEologd] : Try to access to https://drive.google.com
#7 38.25 [make-mecab-ipadic-NEologd] : Try to download from https://ja.osdn.net/frs/g_redir.php?m=kent&f=mecab%2Fmecab-ipadic%2F2.7.0-20070801%2Fmecab-ipadic-2.7.0-20070801.tar.gz
#7 38.26   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
#7 38.26                                  Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:19 --:--:--     0
100 11.6M  100 11.6M    0     0  14371      0  0:14:09  0:14:09 --:--:-- 15803
#7 887.8 Hash value of /tmp/mecab-ipadic-neologd/libexec/../build/mecab-ipadic-2.7.0-20070801.tar.gz matched
```

## 参考リンク

- https://github.com/yokomotod/mecab-ipadic-neologd
- https://github.com/yokomotod/mecab-ipadic-neologd/commit/72de88eae95465da1f6f27383faa31efd8bd2a19
【Angular】サバイバルTypeScriptのlikeButtonを実装するよ

## 使用バージョン
-Angular CLI: 16.1.5
-Angular: 16.1.6

## まえがき

<details><summary>筆者について</summary>
-専門卒
-フロントエンドの業務レベルでの開発経験はなし
-React(TypeScript) にて3カ月ほどの業務外開発経験あり

</details>

[やったことはこちら！](https://typescriptbook.jp/tutorials/react-like-button-tutorial)

業務で人生初のフロントエンド開発をAngularで行うことになりAngularのチュートリアルを一通り実施後、TypeScript未経験なこともありそちらの学習も兼ねて、サバイバルTypeScriptを敢えてAngularで実施しました！
[次回](https://qiita.com/SZR/items/2ad769598be88e20a5a3)


### プロジェクトを作る

まずはプロジェクト作成です サバイバルtypescriptの内容なので

`ng new Angular-survive`

作成したプロジェクトディレクトリに移動
`cd ./angular-survive`
like button 用のコンポーネントの作成
`ng g c likeButton`


app.Module.tsで作成した`LikeButtonComponent`をインポート
```TypeScript:app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { LikeButtonComponent } from './like-button/like-button.component'
import { HttpClientModule } from "@angular/common/http";

@NgModule({
  declarations: [
    AppComponent,
    LikeButtonComponent,
  ],
  imports: [
    BrowserModule,
    HttpClientModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

```

`app.moduel.html`でlikeButtonComponentをレンダリング
```TypeScript:app.module.html
<div>
    <app-like-button></app-like-button>
</div>
```
`likeButtonComponent`の実装
`like-button.component.ts`にて`count`変数の定義、初期値の代入

及び`onClick`メソッドの処理を記述

```TypeScript:like-button.component.ts
import { Component,OnInit } from '@angular/core';
import { Models } from '../model/models';

@Component({
  selector: 'app-like-button',
  templateUrl: './like-button.component.html',
  styleUrls: ['./like-button.component.css']
})
export class LikeButtonComponent {

  count = 999;

  onClick(){
    this.count++;
  }
}
```
`like-button.component.html`でlikeButtonの表示
ボタンの上にcount変数の値を出力

```TypeScript:like-button.component.html
    <div class="mainbody">
        <span class="likeButton" (click)="onClick()"> ♡ {{ count }} </span>
    </div>
```

cssを適当に整えます。

```TypeScript:like-button.component.css
 .likeButton {
    background-color: rgb(231,76,60);
    color: white;
    padding: 0.8rem;
    border-radius: 0.4rem;
    cursor: pointer;
}

.likeButton:hover{
    opacity: .7;
}

.likeButton:active{
    background-color: orangered;
}

.mainbody{
    margin-top: 100px;
    margin-left: 100px;
}
```
変数countをnumber型で定義します。

```TypeScript:model.ts
export class Models{

    count!: number;

}
```
`ng serve` し実装確認します <br> likeButtonはこれで完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728856/10e67393-8b20-1099-a231-87874cb9cd36.png)

次回はAngularで猫画像ジェネレータを作成していきます。


# andmore...

他にもこんな記事書いてます。

https://qiita.com/SZR/items/a000cbaa583dcd2a344b

https://qiita.com/SZR/items/1d8edaf95fa2f5bbe821
Databricks on AWSのマニュアルが日本語に対応しました

[Databricks documentation \| Databricks on AWS](https://docs.databricks.com/en/index.html)がようやく日本語に対応しました。私は入社以来3年待ちました。

マニュアルページにアクセスすると言語セレクタが表示されます。

![Screenshot 2023-08-02 at 10.03.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5c79a846-2895-c049-ca3a-666bb9db295d.png)

日本語を選択できるようになっています！
![Screenshot 2023-08-02 at 10.05.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6ef636bc-ad44-1bf3-6df2-b9ff59f83b9b.png)
![Screenshot 2023-08-02 at 10.06.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ac022525-3a9a-64b4-2f57-a12609feff63.png)

翻訳内容にあれな部分はありますが、鋭意改善してまいります！
![Screenshot 2023-08-02 at 10.06.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5c4d46f3-6645-6e29-203f-89096433b554.png)

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
dial tcp [::1]:8080: connect: connection refused

# 問題
pod確認しようとしたら

```
$ kubectl get po
couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
```

軽率に　`minikube delete` したりとか心当たりが色々ある。

# 原因

以下のコマンドで原因判明。

```
$ kubectl config view

- context:
    cluster: docker-desktop
    user: docker-desktop
  name: docker-desktop
current-context: ""

```

`current-context` が空だった。軽率な　`minikube delete` が原因だった模様。

# 対応

Docker　Desktop使ってるのでそこで切り替えた。
https://stackoverflow.com/questions/68730538/docker-desktop-context-select-not-updating-the-kubectl-active-context

コマンドの方はこう。

```
$ kubectl config use-context <context>
```

できた。

```
$ kubectl get po
NAME                                  READY   STATUS      RESTARTS   AGE
```
Salesforce プロセスのパフォーマンスを測定する方法

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)



+ [How to Measure Salesforce Process Performance](https://www.cloudkettle.com/blog/how-to-measure-salesforce-process-performance/)

# 開発者コンソールを使用した Salesforce 組織プロセスのパフォーマンスの測定

Salesforce 組織プロセスのパフォーマンスが大幅に改善されているかどうかを判断するには、作業の開始点が必要です。その出発点がベンチマークになります。幸いなことに、開発者コンソールを使用するとベンチマークが簡単になります。

# Salesforceの「デバッグログ」へのアクセス

レコードの保存やフローの開始など、Salesforce と対話するときは常に、各プロセスの「デバッグログ」にアクセスすることを選択できます。

これらのログには、「保存」ボタンを押したときにバックグラウンドで何が起こっているかに関する多くの情報が含まれています。この情報には、各プロセスにかかる時間など、役立つ洞察が豊富に含まれています。

1. 管理者の皆さん、開発者コンソールを見て怖がらないでください。次の手順に従うと、ナビゲートがいかに簡単であるかがわかります。

2. 画面の右上隅から開発者コンソールを開きます。(注: これを表示するには管理者である必要があります。)
コンソールが開いたら、停止し続けるプロセス、または必要以上に時間がかかっているプロセスを実行してみてください。
3. 開発者コンソールにログが表示されるようになるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5c8382b6-f88a-de07-8a93-2a24768222f0.png)

# 関連するログ データの検索

作業する情報が得られたので、ログを詳しく調べて、Salesforce 組織プロセスのパフォーマンスの向上に役立つ洞察の収集を開始します。具体的には、プロセスの実行にかかった時間と、プロセスの実行中に何が起こったかを確認する必要があります。

その方法は次のとおりです。

1. プロセスの実行を開始したときに最初に表示されたログをクリックします (または、[サイズ] 列で判断できる最大の最新のログをクリックします)。
2. おそらく意味不明な内容に見えるでしょう。これをベンチマークに役立つ情報に変えるには、「デバッグ」をクリックし、「ログパネルの表示」をクリックします。
3. ダイアログ ボックスが表示されるはずです。(注: Ctrl-p を選択してダイアログ ボックスを開くこともできます。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4eae1392-6edc-108d-9d54-2366a6a87910.png)

# プロセスパフォーマンスのベンチマークを設定する

ダイアログ ボックスが開いたので、ベンチマークを開始します。ベンチマークは、基準点を使用して、何かにかかる時間を理解するプロセスです。この基準点がベンチマークになります。プロセスに通常かかる基本時間。処理時間を短縮することが目標の場合、ベンチマーク時間を下回れば成功とみなされます。

ベンチマークを使用すると、Salesforce 組織プロセスのパフォーマンスを測定できるため、適切なメンテナンスを実行できます。

1. 「実行概要」をクリックします。
2. 新しいウィンドウが開いたら、「タイムライン」をクリックします。
3. 次のような画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5590718d-0320-00b8-6315-a95f13bf2830.png)


例の「タイムライン」画面では、選択したプロセスがその期間のほとんどの間「ワークフローフェーズ」にあったことがわかります。左側の「ミリ秒」列のデータは、ワークフロー フェーズに約 8,000 ミリ秒かかったことが示されています。

これが特定のプロセスにとって長すぎると思われる場合は、Salesforce 組織プロセスのパフォーマンスと速度の問題に取り組むための出発点となります。

注: この例では、タイムラインが「Workflow」行と「Apex」行の間で頻繁にバウンスしています。これは、何らかの再帰的な動作が行われている可能性があることを示しているため、さらに調査して削除できる可能性があります。

誤解のないように、タイムラインで生成される数値は必ずしも 100% 正確であるとは限りません。したがって、可能な限り、問題のあるプロセスごとにこのプロセスを約 5 回実行し、その平均値を使用してベンチマークを決定することが合理的です。

測定値とデータを手元に置くことで、Salesforce 組織のプロセスを高速化するターゲットを絞った変更を開始できるようになります。

ある程度進歩したと感じたら、手順をもう一度実行して、新しいタイムラインに注目してください。理想的には、プロセスにかかる時間が大幅に短縮されるはずです。


# Salesforce における技術的負債の例

Salesforce インスタンスでは、技術的負債はさまざまな形で現れる可能性があります。

+ それは、プロセス用に作成され、その後非推奨になった多数の未使用のフィールドである可能性があります。 
+ これらの古いプロセスをかつてサポートしていた古いワークフロー、プロセスビルダー、または Apex コードである可能性があります。 
+ 技術的負債は、かつては必要だったが、その後 Salesforce がパッチを適用したり、直接的な解決策を提供したりした古い回避策の結果である可能性もあります。
Access のクエリで「JOIN式はサポートされていません」が表示される場合の、予想外の原因

# Access のクエリで「JOIN式はサポートされていません」が表示される
原因が分からず、四苦八苦したので、自分のメモとして記載。
## ググってみる
基本ですね、一人で長時間悩むより、詳しい人に聞いてみる。
しかし出てくる情報は **あいまいな外部結合** だから、と言うモノ。
例として、3つ以上のテーブルで外部結合(OUTER JOIN)を含んだ結合を行った際、結合条件(ON句)が適切ではないという事らしい。
しかし・・・
今私が結合しているテーブルは二つ。
結合条件は単純。
でも、内部結合(INNER JOIN)だと、エラーが出ない。
外部結合(RIGHT JOIN や LEFT JOIN)だと、エラーが出る。
だから、原因は「あいまいな外部結合」なんだと思う。
## 前提条件
先に示しておくべきだったのでしょうが、今回の環境は下記の通り。
![説明資料1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2555080/4dfddb5c-5e74-7c66-fe17-85a4515a7b21.png)
オラクルのデータベースとリンクされたリンクテーブル **`A` `B` `C`** が有り、**`A` `B`** は加工の為、クエリ **`A` `B`** が生成されています。
(サブクエリでやろうかと思ったけど、エラーが出た時にサブクエリが原因かと思い、この形にしました)
さてこの状態で、下記の様にクエリ **`A`** の **KEYCODE** と、テーブル **`C`** の **LINKCODE** を結合条件にしたクエリを作成。
![説明資料2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2555080/1bc772df-93ae-6ba1-eda9-f2b8720e70d9.png)
```SQL:エラーになるクエリー
SELECT QUERY_A.NAME TABLE_C.SUBJECT FROM TABLE_C LEFT JOIN QUERY_A ON TABLE_C.LINKCODE = QUERY_A.KEYCODE;
```
このようにして、クエリを作成した所、**「JOIN式はサポートされていません」** のエラーが出たわけです。
こういう時、普通はクエリ **`A`** を疑うのでしょうが、ほぼ同等のデータ加工をしているクエリ **`B`** を利用強いて、下記の様に作成したクエリは、エラー無く動作するのです。
![説明資料4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2555080/2133e0ec-660a-728e-f239-eddc2122cbed.png)
```SQL:エラーにならないクエリー
SELECT QUERY_B.ADDRESS TABLE_C.SUBJECT FROM TABLE_C LEFT JOIN QUERY_B ON TABLE_C.LINKCODE = QUERY_B.KEYCODE;
```
## クエリの結果をテーブルにしてみる(Oracleとのリンクを断つ)
そうなると、怪しいのはリンクテーブル元の、OracleDB のテーブル **`A`**。
そこで、クエリ **`A`** のデータ加工内容はそのままに、テーブル作成クエリ(SELECT INTO)に変更して、テーブル **`A2`** を作成して、それをテーブル **`C`** と外部結合する事にしました。
![説明資料5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2555080/9c36f50b-8f6c-e70c-287d-1be62088344b.png)
![説明資料6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2555080/b81a31b8-ba75-edf5-38d7-fd46d725171d.png)
```SQL:変更したクエリー
SELECT TABLE_A2.NAME TABLE_C.SUBJECT FROM TABLE_C LEFT JOIN TABLE_A2 ON TABLE_C.LINKCODE = TABLE_A2.KEYCODE;
```
こうした所、**「JOIN式はサポートされていません」のエラーが出なくなりました！**
# 結論
単純で「JOIN式はサポートされていません」が出なさそうなクエリでも、リンクテーブルの場合、リンクの環境等によって、「JOIN式はサポートされていません」のエラーが出る事がある。
【Salesforce】【資格】Salesforce 認定上級 Platform デベロッパー 合格までのあれこれ

当記事は受験体験記です。
※2023年7月時点(Summer ’23)の情報です。
※あくまでもぴえさん個人の考えです。

# Salesforce 認定上級 Platform デベロッパー とは　（ざっくり）
・webassessor試験の合格とTrailheadのスーパーバッジの達成で資格が付与される
・スーパーバッジは
　　Apexスペシャリスト
　　データインテグレーションスペシャリスト
　　上級Apexスペシャリスト
　の3つが課される。
・試験はLightning プラットフォームとデータモデリングのプログラミング機能が問われる
　　受験資格：Salesforce 認定 Platform デベロッパー
　　受験料：税込22,000円
　　120分60問（合格基準は70％以上）
　　選択式（ソースコードを書くような出題はない）

# ぴえさんの受験記録
【受験日程とバージョン】
日時：2023/7/9　16:00
受験方法：オンサイト受験（最寄りの会場）
バージョン：Summer ’23

【受験データ】
ウェブアセッサーのスクショ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/9e12ae90-5479-ce29-2f5a-b469e45c8f5d.png)

分かりにくいので表にしました↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/b0e4dada-8fb9-0ccf-82de-7ea17da947da.png)

スーパーバッジは試験後に挑戦しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/ffed4988-86d4-d91c-0d89-e3f5da3dbd1d.png)

【感想】
・おなじみのオンサイト会場で受験しました(\*'ω'*)
　テストセンターの人に「いつもありがとうございます～」と言われるほど利用しています。
・水~金の終業後、土曜日は終日、日曜日は朝~試験直前の時間を勉強に充てました。
・問題集ではあまり出なかったLWCの問題が本番では多く出ました。
　業務でバリバリ開発していたのが功を奏したと思います。
・正直テスト送信時まで自信無かったですが、合格できて良かったです。
　全問解いた後の見直しで3問ほど回答変えていたのがありました、採点したらギリギリで冷や汗かきました。
・スーパーバッジは相変わらず時間がかかりました。
　取得の期限がある方は余裕を持って取り掛かることをお勧めします！

# 勉強方法
１．受験ガイドを読む
　　　いつの間にかQuipになっていた[試験ガイド](https://quip.com/qwIGASoo0WBs)を読みます。※以前までpdfの配布でした。
２．webに出ている練習問題を解く
　　今回はこちらの問題集だけ確実にこなしました。

https://www.jpnshiken.com/shiken/Salesforce.PDII.v2023-06-27.q334.html

　　選定理由はリリース日が最近だったのと問題数が多かったからです。

４．分からない問題はSalesforce公式の開発者ガイドを読む

https://developer.salesforce.com/docs/platform/lwc/guide/get-started-introduction.html

https://developer.salesforce.com/docs/atlas.en-us.apexref.meta/apexref/apex_ref_guide.htm

５．勉強メモを書く

用語の説明や暗記物はメモに書き連ね、試験直前に何回も確認しました。
メモしたのをまとめた投稿です↓　LWCやAuraに関する内容が薄いので注意。

https://qiita.com/piepie1231/items/dad062dadcce17346e88


# その他のSalesforce資格について
他資格についてはこちらの記事にまとめています↓

https://qiita.com/piepie1231/items/78a0dd6bdfa2c64568cd