OmniAICreator/Qiita-1.07M huggingface dataset:
リファクタリングと複雑度の優先順位

コードを共通化・抽象化するときは以下のような順番で取り掛かると良いんだろうな、という話

1. 分かりきっている複雑性が低いコンポーネント
2. ドメイン固有の複雑性が高いコンポーネント
3. 1と2のコンポーネントを束ねる役割の複雑性が中程度のコンポーネント

自分が今Flutterを書いているのでフロントエンドだけの話かもしれないが、思っていることを書いてみる

# 背景
仕事でのコードに対するコミットメントがメンバーのPRレビュー中心になってきた。全体のアーキテクチャは自分がある程度整理していて、個々の機能開発の方針は任せている。

レビューは、局所的な設計指針に細かく指摘するよりもある程度本人の方針に任せ、テストコードや一貫性で全体の品質を担保すれば良いというスタンス。

結果的に、無難なコードで多くの機能が素早く追加されてきた。プロダクトのフェーズ的にも十分満足していて、今後のリファクタリングにも耐えられる必要十分なコード品質だと考えている。

ただ最近自分でコミットメントしたほうが良い開発案件があり、久しぶりに自分で実装することになった。やってみると、自分が考える設計とは違う部分たくさんあることに多少ストレスを感じてしまった。で、必要な部分はリファクタリングしつつ案件を進めている。その過程でごちゃごちゃ考えていたことを言語化した。

# 分かりきっている複雑性が低いコンポーネント
例えばThemeだったり、よく使うTextStyleやElevatedButtonとか。共通で扱うことを想定してコンポーネント化されているものはカスタマイズ性が高く柔軟なことが多いので、それをプロダクト用に固めてしまうと収まりが良くなる。

機械的に進めていけるタスクなので取り掛かりやすい。コストに対するリターンのコスパもよく、終わったときの満足感もそれなり。ごく当たり前にほとんどの人がやっていることだと思う。

# ドメイン固有の複雑性が高いコンポーネント

最小単位のコンポーネントをまとめた後はもう少し大きいコンポーネントのリファクタリングをしたくなるが、これは止めたほうが良い。自分は今まで何回もそれで失敗してきた。

中程度のコンポーネントは複雑性が高いコンポーネント依存することが多い。複雑性が高いコンポーネントがそのままの状態でそれ微妙な仕様差異を吸収しようとすると、結果的に変なパラメータが増えたよくわからないコンポーネントに化ける可能性が高い。巷で言われる神クラスのようなものは総じて、良く使われる中程度のコンポーネントだったものが化け、名前とかけ離れていたり凝集度が低いように見えるようなものだったりする。

しかも、時間がかかる割にインパクトが大きくないので、生産性が上がった・見通しが良くなったというような成果の実感が得にくい。

ドメイン固有で複雑で抽象化しきれていない処理は、変更するには取り掛かるハードルが高くて深い理解が必要。しかし、コードリーディングに一番時間がかかる処理だからこそインパクトがあるし、影響を与えている中程度の処理の設計の改善アイディアにも繋がりやすい。

確かに難易度が高いが、小さいコンポーネントのリファクタリングしているときの 「やって意味あるのかコレ?」感が無いのも個人的にはグッドポイント

# 1と2のコンポーネントを束ねる役割の複雑性が中程度のコンポーネント
小さいものと大きいものが終わったら、それらを繋ぐ中程度のコンポーネントに着手する。この頃には全体構造への理解が進んでいるので、変な共通化(Common~、~Utilを多用するとか)をしない限り目的が明確なコンポーネントとなって、IFも想像しやすいものになっていくと思う。

直接何かをするというよりも、`Builder`や`Mediator`のような性質の薄めのコンポーネントのほうが収まりが良いかも知れない。大きいものと小さいものを繋ぐだけのイメージ。中くらいのコンポーネントも具体的な処理を始めると抽象化のレイヤーが3段階になって、自分は難しく感じる。これは人それぞれかも。

正直このコンポーネントは人によっては不必要に見えたり価値を感じなかったりすると思うので、無理して作らず他の仕事を優先しても良いかも知れない。

# まとめ
自分がリファクタリングするときの指針をまとめてみた。見る人によってはナンジャコレ感があるかも知れないが、あくまで自分の方針ってことで許してほしい。

最近はアーキテクチャよりもコンポーネントの凝集性のほうが重要だと感じていて、それを実現するためのリファクタリングの観点に意識を向けている。

現実世界のプログラムは小規模・大規模のようなラベル付がされているわけではないので何となく難易度が簡単な順で着手しがちだが、一旦立ち止まって全体に対しての相対的な複雑性を眺めてから仕事に取り掛かるようにしたい。
Impala で、S3 の特定のフォルダを外部テーブルとして定義する方法（Cloudera Data Platform）

# この記事について

Impala でテーブル作成する方法をいつも忘れそうになるのでメモ。

# 前提

## S3

S3 の特定フォルダに、スキーマの揃ったデータが入っていること
（CSV, AVRO, PARQUET の場合を掲載）
データ形式によって若干定義が異なる

# Impala

Cloudera Data Platform (Public Cloud) の CDW Hue を利用

# CSVの場合

```SQL:CSVの場合
-- Hive外部テーブルの作成
CREATE EXTERNAL TABLE test_table
(
-- ここのスキーマは、S3で保持するデータのスキーマに合わせる
actor_id int,
first_name string,
last_name string,
last_update string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',' -- 項目の区切り文字は','(カンマ)
LINES TERMINATED BY '\n' -- 行の区切り文字は改行コード
STORED AS TEXTFILE -- ファイルフォーマットはテキストファイル
LOCATION -- ファイルの保存場所
's3a://test-bucket/test/path'
tblproperties(
"skip.header.line.count"="1" -- 先頭1行をヘッダとして読み飛ばす
)
;
```

# AVRO, PARQUET, ORC の場合

```SQL:AVROの場合
-- Hive外部テーブルの作成
CREATE EXTERNAL TABLE test_table
(
-- このスキーマ定義は、LOCATION句で指定したファイルのスキーマの名称と合わせる
-- スキーマの中から一部の項目だけをテーブルに切り出したい場合は、その切り出したい項目だけを定義する
actor_id int,
first_name string,
last_name string,
last_update string
)
STORED AS AVRO
LOCATION -- ファイルの保存場所
's3a://test-bucket/test/path'
;
```

ORC や Parquet の場合は、AVRO の 場合の STORED AS を ORCや PARQUET に変えるだけでいける。

# PARQUET で、スキーマを手で定義しない場合

上記のように、スキーマをいちいち手で定義したくない場合、かつPARQUET が持っている全項目をとりあえずテーブルに入れられればいいよ！ という場合は、以下の方法あり。

```SQL:PARQUETの場合
-- Hive外部テーブルの作成
CREATE EXTERNAL TABLE test_table
-- このファイルに定義しているスキーマを使ってテーブルを作ってね！ という指定
-- LOCATION句とは別のパスでも問題ない
LIKE PARQUET 's3a://test-bucket/test/path/ファイル名'
STORED AS PARQUET
LOCATION -- ファイルの保存場所（テーブルの中身として入れるファイル）
's3a://test-bucket/test/path'
;
```
PowerShellで文字列出力（コマンドプロンプトのechoみたいなこと）

# やり方（固定の文字列）

```powershell
Write-Output "えこーみたいなことしたい";
```

実行結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8d495100-f83f-c0de-6d19-d58aa75e3213.png)

# やり方（変数の中身確認）

```powershell
$date_ = Get-Date -Format "yyyyMMdd_HHmmss";
Write-Output $date_;
```

実行結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d144c7ba-b380-d03a-e94f-2af42dae1bea.png)

# 参考サイトさん

https://www.ipentec.com/document/powershell-text-out

# バージョン

Microsoft Windows [Version 10.0.19045.3570]
PSVersion 5.1.19041.3570
find_or_initialize_byメソッドとfind_or_create_byメソッドについて

# 実行環境は以下の通り
ruby:3.0.1
rails:6.1.6

# find_or_initialize_byメソッドとfind_or_create_byメソッドとは？
##### 結論、find_or_initialize_byメソッドとfind_or_create_byメソッドは、ともに「<font color="Red">条件を指定してそれが存在したら取得し、なかったら作る</font>」というメソッドです。例えば、メルカリなどでいいねを押さずに直接商品に対して問い合わせた時に自動でお気に入りに登録しましたとメッセージがでて、お気に入りに追加され、その情報が保存されるイメージです。

# find_or_initialize_byメソッドとfind_or_create_byメソッドの違いとは？
#### 結論、<font color="red">新規生成後に保存するかしないか</font>の違いです。
|  メソッド名  |役割|
|--------------------|----|
|find_or_create_by|保存する|
|find_or_initialize_by|保存しない|

#### find_or_create_byメソッドは<font color="Red">保存までやってくれる</font>のですが、find_or_initialize_byメソッドは生成するだけで<font color="Red">保存はしません</font>。なので保存したい時には<font color="Red">save</font>を一緒に使ってあげると保存できます。

# 実際のコード
#### では、実際のコードを見ていきます。今回は犬猫取引アプリを作成しましたのでそこから持ってきました
#### 例えば、お気に入り登録をせずにその動物に対して問い合わせた時にお気に入り登録をしたい時には以下のように書くことができます。
#### find_or_intialize_byでかいた場合は以下の通り
```
favorite = Favorite.find_or_initialize_by(user_id: current_user.id, animal_id: @animal.id)
unless favorite.persisted? 
    favorite.save
    flash[:favorite] = "お気に入りに登録しました"
end
````
#### 流れとしては、かっこの中に条件と引数を指定しており、favoritesテーブルの中から現在ログインしているuser_idと問い合わせしたい動物のidが一致しているレコードがあるか調べてあったらunnless文を実行しないでなかったらunless文の中身を実行します。
#### もちろん、find_or_create_byでも以下のように書くことができます
```` 
Favorite.find_or_created_by((user_id: current_user.id, animal_id: @animal.id)
flash[:favorite] =  "お気に入りに登録しました"
`````
#### でも今回は、find_or_initialize_byメソッドを使用しました。理由は、flashメッセージにあります。もし、find_or_create_byメソッドで書いてしまった場合、お気に入り登録してなければflashメッセージが出てもいいのですが、もし、お気に入り登録をしていたらfind_or_create_byではflashメッセージは単体で書いているので、問い合わせをするたびに「お気に入りに登録しました」と出てきてうるさいから、find_or_initialize_byメソッドで最初に存在するか調べて、もしあったらunless favorite.persisted? のところがfalseになって中を実行しないのでメッセージは最初の1回のみしか出ないのでこちらを採用しました。
【Git初心者向け】git fetch、git merge、git pull の違い

# はじめに

Gitを使い始めて間もない方、もしくは使い始めて結構経つけど `git fetch`、`git merge`、`git pull` の違いがあまりわからないという方向けのお話です。

# 概要

- git fetch
- git merge
- git pull
- よくある勘違い

# git fetch

git fetchは、

**リモートリポジトリの情報** を 

**ローカルリポジトリのリモート追跡ブランチ** にコピーします。

![git_fetch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/7b6ef122-b6a6-8537-a292-faf1d37ce9da.png)


少し分かりにくいですが、ローカルリポジトリの中には

- ローカルのブランチ情報（自分が作業している or チェックアウト等で作成済みのブランチ情報）
- リモートリポジトリのコピー情報（画像のリモート追跡ブランチ）

の２つの情報を持っています。

他者が修正して git push した情報はリモートリポジトリに保存されますが、それをローカル上のリモート追跡ブランチにコピーします。


# git merge 

git merge は、あるブランチの情報を別のブランチに取り込むコマンドです。

例えば 現在「branchA」にチェックアウトしている状態で`git merge main`をすると、

ローカルリポジトリのローカルブランチからマージされます。

![git_merge01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/e49d8617-e79c-18a2-8211-222214f58e31.png)



また、同じ状況で`git merge origin/main`を実行すると、

リモート追跡ブランチのmainブランチ（origin/main）がマージされます。

![git_merge02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/57d9f8dc-2541-b7ac-4a59-48994d2f582d.png)

# git pull

git pull は git fetch + git merge を組み合わせたようなイメージを持つと理解しやすいです。

リモートリポジトリからローカルのリモート追跡ブランチにコピーした後、差分をローカルブランチにもマージします。

![git_pull.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/be28d43e-ae44-78b1-89b4-bc29f3b7b789.png)

# よくある勘違い

現場で作業をしていて、

- `git merge origin/branchA` でリモートリポジトリにある branchA の情報をマージできる

と思っている方が割と多かったです。

これではローカルリポジトリのリモート追跡ブランチからマージするだけなので、リモートリポジトリにある他者の修正分がマージされなくなってしまいます。

こういう時は git pull もしくは git fetch した後に git merge をするようにしましょう。

# 最後に

筆者は基本的には `git fetch + git merge` の組み合わせで使用しています。

理由は、fetchで差分を目視で確認した後にマージすることができるからです。
差分に気になる箇所があればマージする前にエスカレーションできます。

（修正量が少ない時は git pull することもありますが）

本記事がどなたかの手助けになれば幸いです。
ここまで読んでいただきありがとうございました。
Kotlin: data class の使い方

## プログラム

```kt
// import com.google.gson.annotations.SerializedName

data class UrlDTO(
    val data: Data,
    val success: Boolean,  
    val message: String,
    val error_code: Int
)

data class Data(
    val url: String
)

fun main() {
    println("*** start ***")
    
var ddx = Data("https://example.com")
println(ddx)

var uux = UrlDTO(ddx,true,"Hello",200)
println(uux)
println(uux.data)
println(uux.success)
}
```

## 実行結果

```text
*** start ***
Data(url=https://example.com)
UrlDTO(data=Data(url=https://example.com), success=true, message=Hello, error_code=200)
Data(url=https://example.com)
true
```
https://play.kotlinlang.org/ で実行した結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/2a4f1cc6-8ab5-9071-62dd-aae4b47b0c90.png)
Microsoft365管理センターのユーザ情報からのメールアドレス取得

## はじめに
なんか毎回関数書いていて面倒くさくなったのでコピペでできるようにメモ。

## 手順
1.アクティブユーザからユーザ一覧EXPORT
https://admin.microsoft.com/#/users

2.EXCELでCSVを開く or 読み込み

3.関数記述
AG列
```
=FIND("SMTP:",W2,1)
```
AH列
```
=IFERROR(FIND("+smtp:",W2,AG2+1),LEN(W2)+5)
```
AI列
```
=MID(W2,AG2+5,AH2-AG2-5)
```

4.あとはダブルクリックで下までコピー

## 終わりに
大文字の「SMTP:」部分がプライマリメールアドレスになる。
EXCHANGEのメールボックスから一覧出力すると情報が足りないんだよね。
Databricks CLI （Windows）にて Azure CLI 認証により Databricks Repos 上にコードを配置する方法

## 概要

Databricks CLI にて、Azure CLI 認証によりローカルから Databricks Repos 上にコードを配置する方法を共有します。次の記事にて Databricks トークンにて実施する方法を紹介しているため変更箇所のみ本記事にて紹介します。

- [Databricks CLI （Windows）にてローカルから Databricks Repos 上にコードを配置する方法 #Databricks - Qiita](https://qiita.com/manabian/items/f42259a90f5c53a5e191#3-3-databricks-cli-にて-repos-を参照できることを確認)

### 1. Azure CLI をインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/728dd150-5adc-2a9c-fe31-4ce57534852b.png)

引用元：[Windows 用 Azure CLI をインストールする | Microsoft Learn](https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?tabs=azure-cli#install-or-update)

### 2. 動作確認

```powershell
az --version
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1916abf3-dc21-7e0b-4a15-c59187d64823.png)

### 3. コマンド実行後に表示される Web ページにて Azure にログイン

```powershell
az login
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f907bbfd-213d-3a4a-e62c-8bf8b3920490.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/12543008-c269-e1fb-b31c-b65ede6f7c8b.png)


## `Databricks CLI （Windows）にてローカルから Databricks Repos 上にコードを配置する方法`の変更箇所

### 3-1. Databricks CLI の認証情報の設定

`Personal Access Token`に何も入力せずに`Enter`を押す。

```powershell
./databricks.exe configure --host {host}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/75325566-a4c2-0d1e-c597-ee348ce207c1.png)

### 3-2. Databricks CLI の認証情報の確認

`Token`という項目がなく、`host`のみであることを確認する。

```powershell
$UserName = $env:UserName
$Path = "C:\Users\$UserName\"
explorer $Path
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c6aa9d88-cf9d-e6e8-f676-2c8cd320682b.png)
AWS Amplify CLI チートシート

# Amplify CLI チートシート 
## 設定
| 用途 | コマンド | 備考 |
|:-|:-|:-|
| CLIで利用するAWS IAMユーザの設定  | `amplify configure`  | プロファイルの設定等が可能  |
| amplify プロジェクトの作成、初期化  | `amplify init`  |   |

## 確認
| 用途 | コマンド | 備考 |
|:-|:-|:-|
| Amplify API/Hosting/Auth等のリソースの<br>作成状況（展開ステータス）の確認 | `amplify status`  |  
|ブラウザでAWS Amplify コンソールを開く|`amplify console`|   |
|環境の一覧表示|`amplify env list`|"*"付表示が現在の環境|
|プラグインの確認|`amplify plugin list`||

## 作成リソースのpush, pull等
| 用途 | コマンド | 備考 |
|:-|:-|:-|
|ローカルのバックエンドリソースを<br>クラウド上にプロビジョニング|`amplify push`|
|ローカル バックエンドおよびフロントエンド リソース (ホスティング カテゴリが追加されている場合) を構築し、クラウドでプロビジョニング|`amplify publish`|ローカルでホスティングリソース、コンテンツを作成した後、クラウド上にホスティングさせる際に使用|
| クラウド上のAmplify リソースをローカルに反映  | `amplify pull`  |--envName <環境名>で環境指定。強制上書きの為注意。<br>差分を残したい場合は`amplify env pull`コマンドを使用   |

## 環境操作
| 用途 | コマンド | 備考 |
|:-|:-|:-|
|環境の追加| `amplify env add`  |   |
|環境の切り替え|`amplify env checkout <環境名>`||
|環境の詳細情報表示|`amplify env get`|--name <環境名>で環境指定|
|ローカルにある既存のAmplify プロジェクトの環境をインポート|`amplify env import`|--name <環境名>で環境指定|
|環境指定して、クラウド上からリソースを取得|`amplify env pull`|--name <環境名>で環境指定<br>--restoreで既存環境の上書き|
|環境の削除|`amplify env remove <環境名>`||
|環境設定のアップデート|`amplify env update`||



## リソースの操作
| 用途 | コマンド | 備考 |
|:-|:-|:-|
|リソースの追加|`amplify add <category>`| category: API/Function/Hosting/Auth|
|個々のリソースの削除|`amplify remove <category>`|
|Amplify プロジェクト全体の削除|`amplify delete`|
|APIリソースの操作|`amplify api`|サブコマンド：`add` `push` `stasus` `remove` `gql-compile`など|
|ストレージリソースの操作|`amplify strage`||
|認証リソース操作|`amplify auth`|サブコマンド：`add` `push` `remove`など|
|ホスティングリソースの操作|`amplify hosting`|サブコマンド：`serve` `configure` `remove` `publish` など|
|関数リソースの操作|`amplify function`|サブコマンド：`add` `push` `build` `remove`など|


### ホスティングリソースの操作
| 用途 | コマンド | 備考 |
|:-|:-|:-|
|デプロイされたサイトを開く|`amplify hosting serve`||
|デプロイされたアプリの変更を公開|`amplify hosting publish`||
|コンソールを開き、リソースの設定を行う|`amplify hosting configure`||
|アプリからホスティングを削除|`amplify hosting remove`||
|ローカルのホスティングリソースの変更をクラウド上にプロビジョニング|`amplify hosting push`||

## テスト
| 用途 | コマンド | 備考 |
|:-|:-|:-|
|モックサーバのローカル実行|`amplify mock`|サブコマンド：`api` `storage` `function` `function <function name>`|

# Appendix

## プラグイン
| 用途 | コマンド | 備考 |
|:-|:-|:-|
|Amplify CLIプラグインを初期化|`amplify plugin init`||
|Amplify CLIプラグインを追加|`amplify plugin add`||
|Amplify CLIプラグインを削除|`amplify plugin remove`||

# 参照
[Amplify CLI 公式ドキュメント](https://docs.amplify.aws/cli/command)
ノイズ除去にはガウシアンフィルタを使おう！　ほんと？

# はじめに
OpenCVをはじめ、様々な画像処理の中で、思うように画像が処理されない場合、ノイズ除去やフィルタをかけることがあると思います。フィルタには様々な種類がありますが、ノイズを除去したい場合、とりあえずガウシアンフィルタをかけましょう！は間違いです。
もちろんガウシアンフィルタは、ノイズに対して有効な手段の１つではありますし、様々な処理で利用されている有名なノイズ除去法です。しかし、一言でノイズ除去といっても、ノイズ以外の要素がどのように変化するかによって、その後の処理の精度も変わってきます。各フィルタの特徴を押さえておくことで、より高精度な画像処理が出来ます。

# ガウシアンフィルタって何者？
ガウシアンフィルタは、画像処理において用いられるフィルタの一つで、画像を滑らかにするために使用されます。このフィルタは、画像内の細かいノイズやテクスチャを平滑化し、全体的になめらかな画像を生成します。
細かい仕組みは割愛しますが、一言で言うと、「ある画素に着目し、その画素からの距離に応じて重みの異なる平滑化処理を行う」というものです。着目した画素と距離が近ければ強いフィルタがかかり、遠ざかるにつれて緩いフィルタがかかるということです。
これを画像内のすべての画素に対して行うため、ノイズの部分に着目した場合、周囲と画素値が大きく異なるため、周りの正常な画素の画素値に近づくように補正(平滑化)されます。ノイズの周辺すべてのフィルタリングが完了したとき、ノイズが低減されている、という仕組みです。
このフィルタは、ガウス分布関数（正規分布関数）を基にしているため、ガウシアンフィルタと呼ばれています。

# なぜ、ガウシアンフィルタだけではダメなのか？
結論から言うと、エッジがボケてしまうことです。
エッジは、隣合う画素との輝度値の差が大きい領域のことを指します。
ガウス分布関数で考えると、中心からの距離しか考慮されてません。
輝度値の差はまったく考慮されていないので、輝度値の差が大きいエッジの部分も同じように平滑化されてしまい、ボケてしまいます。
白い紙に左右を両断する黒い線があったとき、線の部分と線でない部分は画素値が大きく異なり、これにガウシアンフィルタをかけると、黒い線は背景の白に、背景の白は黒い線に、緩やかに寄ってくため、線がぼやけてしまいます。

# ほかのノイズ除去のフィルタについて
## メディアンフィルタ
このフィルタは平均化ではなく中央値を取るというものです。平均化せずに、着目した画素の周囲の画素の中央値を取るので、エッジがぼやけることがありません。エッジを残したい場合はこちらのフィルタを使うとより鮮明になります。
メディアンフィルタを使うデメリットとしては、エッジ以外の部分(特に細かい柄や薄い模様など)が全体的にぼやーっとしてしまうことで、元画像の情報が失われる可能性があります。

## バイラテラルフィルタ
バイラテラルフィルタは、ガウシアンフィルタに輝度値の差を考慮に入れたフィルタです。
先程のガウシアンフィルタの説明で、輝度値の差を考慮していないため、エッジがぼやける、という話がありましたが、そのデメリットを解消するとても優秀なフィルタです。
と、言いたいところですが、このフィルタはとても処理に時間がかかります。
仕組みとしてはガウシアンフィルタのガウス分布関数の次元を１つ増やして、元軸にカーネル中心からの距離を横軸にしたときの正規分布（ガウシアンフィルタ）を、新規の軸に輝度値の差の正規分布を配置します。新規の軸は元軸とは対称的に、輝度値の差が大きいほど重みを小さくします。これにより、エッジを残したままノイズを除去することが出来ます。単純計算で1乗分増えるわけなので、処理時間がかなり遅いです。
高精度ですが、リアルタイム処理や、速度重視のシステムには使えない、といったところです。

# ノイズ除去手法のメリットデメリットを一覧化してみる
| フィルタ | メリット | デメリット |
|:-----------:|:-----------:|:-----------:|
| ガウシアンフィルタ | 処理速度が若干速い | エッジがぼやける |
| メディアンフィルタ | エッジをくっきり残せる | エッジ以外がぼやける |
| バイラテラルフィルタ | エッジも残せて全体的にも綺麗 | 処理時間が長すぎる |

以上のことから、ガウシアンフィルタは、処理が早い分、リアルタイム処理に使えますが、フィルタリングした画像を出力するのであれば、ぼやぼやの画像になってしまいます。なので使いどころとしては、比較処理の前処理として用いるのは有効だと思います。
とにかくエッジをくっきり残しながら手早くノイズを除去したい場合は、メディアンフィルタを、
時間がかかってもよいのでとにかく元画像の情報を損なわないようにするのであればバイラテラルフィルタが有効です。


# おわり
ノイズ除去をする際は、どのような処理に取り入れるのかをよく考えてフィルタを選択することで、より高精度なフィルタリングが出来ます。
Case フィード


# ナレッジの記事を表示する

+ [ケースページレイアウトに記事関連リストを追加しようとしていますが、表示されず、クラシックビューに切り替えた場合にのみ表示されます。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Wdszl)

:::note
ケースページレイアウトのケースフィードに「添付記事」を追加できることがわかり、この状況はほぼ解決されました。私は、「記事」関連リストもライトニングで表示できるかどうか疑問に思っていました。これは、事件に添付された記事の関連リストです。
:::

# Case フィードに対するカスタムボタンの追加(VF Page)

[活動タブにVFページで作成したボタンを配置しても初期表示されない。](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Je3DSSAZ)

画面の絵を見ていると何か違和感あるよなぁって思っていましたがケースオブジェクトですよね。ケースと作業指示オブジェクトはどうもクイックアクションのボタン追加の結果が他のオブジェクトとは違うみたいです。
 
以下を読むとやはり動的アクションで普通のオブジェクトと同じ場所にボタンを配置すればいいようなことが言及されています。 

Allow Custom Actions to display as Buttons on Cases (Feed-Based Layout)
Good news! This already has been implemented in Winter '21 release!

As you know, in Summer '20 release Salesforce introduced Dynamic Actions to Lightning App Builder. These type of actions allows the user to add Quick Actions, Custom Actions and Standard Actions (the ones you create when you go to Buttons, Links and Actions menu inside an object), and add them directly to Highlights Panel (with possibility to apply visibility restrictions).

Originally this was working only with custom objects, but now with Winter '21 release was introduced support (beta) for some standard objects, including Cases!

# その他

+ [メール返信時に、お客様からのメール引用文のすぐ下に表示される管理番号の位置調整](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007NDM1k)

:::note
ケースフィードの中で内部のメールを外部の人には見えないようにするためにApexトリガーを使った例があります。同じようなことを行えば自動化できるのではないかと思います。

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A90ytSAB
:::
Raspberry Pi Zero WへのOpenCVのインストール

## スワップ領域の拡張
そのままではスワップ領域が足りない可能性があるので、スワップ領域を拡張する。
「/etc/dphys-swapfile」の「CONF_SWAPSIZE=100」を「CONF_SWAPSIZE=2048」に変更して保存。
```terminal:ターミナル
sudo nano /etc/dphys-swapfile
```

## pipの更新
```terminal:ターミナル
sudo python -m pip install --upgrade pip
```

## OpenCVのインストール
最新版だとエラーが出るらしい(未確認)。
もっと新しいバージョンでも良いはず。
```terminal:ターミナル
sudo pip3 install opencv-python==4.5.1.48
```

## その他必要なパッケージのインストール
importの際にエラーが出たが、以下をインストールしたら解決した。
```terminal:ターミナル
sudo apt-get update
sudo apt-get install libatlas3-base libopenblas-base
export LD_LIBRARY_PATH=/usr/lib/openblas-base/
```

## 動作確認
python3を起動し、cv2をインポートする。

## 参考記事
[ラズベリーパイにOpenCVを最速でインストールする方法](https://sozorablog.com/opencv_install/ "ラズベリーパイにOpenCVを最速でインストールする方法")
[MXNet 1.8.0 をインストールする方法](https://touch-sp.hatenablog.com/entry/2021/03/22/125645)
Windows11のエクスプローラーが重いのを解決する方法

# はじめに
Windows11にしてからエクスプローラーを開くたびに１０秒以上待たされて苦痛だったので、解決方法を探すことにしました

# 目次

1. [なぜ重いのか](#なぜ重いのか)
2. [解決方法](#解決方法)

# なぜ重いのか
エクスプローラーを表示した際にデフォルトで表示されるホーム画面で、最近表示したファイルや頻繁にアクセスするファイル、エクスプローラーの閲覧履歴等を読み込んで表示するため時間がかかっている様子

# 解決方法
### 【方法１】表示内容を絞る
エクスプローラー -> もっと見る -> オプションをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/91569ba9-b3cd-438c-6ad4-67bb9f416899.png)

最近使用したファイルを表示する、使用頻度の高いフォルダーを表示するのチェックを外し、エクスプローラーの履歴書を消去するをクリックした後に適用 -> OKをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/d4082cc2-d02e-e7cf-f31f-de827738538f.png)

これでファイルの読み込み等にかかる時間が短縮されるはずです（筆者の環境ではあまり効果がありませんでした）

### 【方法２】最初に開かれる画面を変える
方法１と同じ設定画面から、エクスプローラーを開いて、次の手順を実行しますでPCを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/ec2c1e43-2d64-a844-3ba5-a28c555f7238.png)

この設定によりエクスプローラーを開く際にホーム画面が表示され無くなり動作が早くなります
Xcode15とXcode14で同じプロジェクトを運用する時の問題

Xcode15 で古いライブラリをビルドする場合は-ld64 flag が必要な場合があります。
しかし、Xcode14で該当プロジェクトを開くと該当flagが無いと怒られます。

現在Xcode15が最新ビルドツールですが、一部ライブラリ問題があり、両方のIDEで動かすことがあります。
その場合Xcode14は -ld64 flagなし、一方でXcode15でビルドする時は -ld64 flagを設定しないといけないです。
スタティックライブラリの結合

# 背景
組み込み機器を扱っているとしばしば発生するのが「メーカー提供のライブラリを使用してください」というシチュエーション。そのライブラリはコンパイル済のものでARMだと.aの拡張子で提供されていたりします。
# Zephyrベースのサンプルはある
nRF Connect SDKのセットにも含まれていますが、external_libというプロジェクト名で用意されています。

https://github.com/zephyrproject-rtos/zephyr/tree/main/samples/application_development/external_lib

ただし、このサンプルプロジェクトはmain.c以外にmylib.cとmylib.hがあり、同時にコンパイルをして生成されたlibmylib.aを最後にリンクするというものになっています。つまり、最初のシチュエーションで説明した「メーカー提供のコンパイル済ライブラリ」を結合するのとは微妙に異なります。

::: note
メーカーもソースコードレベルで提供してくれればどんなに楽なことか…。
今はGithubで公開する時代だと思っていたんだけど…。
:::

# libmylib.aを使う
とりあえずSDKにあるexternal_libを動かしてみましょう。ビルドするとbuildフォルダの下にlibというフォルダがあり、そこにlibmylib.aというライブラリファイルが生成されているのでそれを流用します。

::: note
たったこれだけのものでも自分で作るのはめんどくさいので…。
:::

続いてhello_worldのサンプルを作ります。別に何のプロジェクトでも構わないのですが、目的からはhello_worldが一番よいでしょう。
まずは先ほどの.aファイルと.hをコピーします。どこに置いてもよいのですが分かりやすくsrcフォルダと同階層にlibフォルダを作って置くことにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/b4c9557e-dc2e-a9a7-05d7-8c5ab7ffb33c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/1c501c4f-f5b0-c5b9-fc8d-051af1ae9043.png)
## CMakeLists.txtを編集する
ライブラリを取り込むためにはCmakeLists.txtに追記が必要になります。元々参考にしたサンプルのexternal_libのCMakeLists.txtは非常に複雑な記述がされていますが、今回追加した形に対応するには以下のような形で大丈夫です。

```CmakeLists.txt
# SPDX-License-Identifier: Apache-2.0

cmake_minimum_required(VERSION 3.20.0)

find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(hello_world_lib)

target_sources(app PRIVATE src/main.c)
include_directories(${APPLICATION_SOURCE_DIR}/lib)
add_library(libmylib.a STATIC IMPORTED)
target_link_libraries(app PUBLIC ${APPLICATION_SOURCE_DIR}/lib/libmylib.a)
```

追加されたのはtarget_sources以下の部分で、上から順に
・インクルードパスの追加
・結合するライブラリの指定
・ライブラリの絶対パス
になります。

::: note
実はこのあたりの記述は完全には理解できておりません…。
:::

# main.cからライブラリ内の関数を呼び出す
元々引用したexternal_libのソースコードを見てみると、それぞれ以下のようになっています。

``` main.c
/*
 * Copyright (c) 2012-2014 Wind River Systems, Inc.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <stdio.h>
#include <mylib.h>

int main(void)
{
	printf("Hello World! %s\n", CONFIG_BOARD);
	mylib_hello_world();
	return 0;
}
```

``` mylib.c
/*
 * Copyright (c) 2017 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include "mylib.h"
#include <stdio.h>

int mylib_hello_world(void)
{
	printf("mylib says: Hello World!\n");
	return 0;
}
```

hello_worldプロジェクト内のmain.cからmylib_hello_world()でライブラリ内の関数を呼び出す手続きが必要になります。
# 実行結果
これをビルドして実行してみると…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/08c583a8-ba0c-abb2-92e2-9fe38680b30e.png)
ちゃんとmain.cからライブラリ内の関数を呼び出して実行しています。
# 余談
メーカー提供のライブラリを組み込むと動かないのでこんなものを作って動作検証していたりします…。誰か助けて！(笑)
コンテンツプロバイダ

**コンテンツプロバイダ（Content Provider）** は、Androidアプリケーションのデータを他のアプリケーションと共有し、アプリケーション内でデータのアクセスと管理を提供するためのコンポーネントです。以下に、コンテンツプロバイダの特徴、目的、使用例、およびコードの例を示します：

**特徴**:
1. **データの共有**: コンテンツプロバイダは、アプリケーション間でデータの共有を容易にします。他のアプリケーションが特定のデータにアクセスできるようにします。
2. **データベースアクセス**: コンテンツプロバイダは、データベース内のデータにアクセスするのに便利で、SQLクエリを使用してデータを操作できます。
3. **URIを使用**: コンテンツプロバイダへのアクセスは、URI（Uniform Resource Identifier）を使用して行います。URIはデータの位置と操作を指定します。

**目的**:
- **データの共有**: コンテンツプロバイダは、アプリケーション間で共有するデータ（例: 連絡先、写真、ビデオ、音楽、設定など）にアクセスするために使用されます。例えば、連絡先データを他のアプリケーションと共有するためにコンテンツプロバイダが使用されます。
- **データベースの操作**: コンテンツプロバイダは、アプリケーション内のデータベースの操作を提供し、他のアプリケーションにデータへのアクセスを許可します。

**使用例**:
1. **連絡先データの取得**: 他のアプリケーションはコンテンツプロバイダを使用してデバイス上の連絡先データにアクセスし、情報を表示または変更できます。
2. **メディアファイルの取得**: ギャラリーアプリケーションは、コンテンツプロバイダを介してデバイス上の写真やビデオファイルにアクセスし、ユーザーに表示します。
3. **設定データの変更**: システム設定を変更するアプリケーションは、コンテンツプロバイダを使用して設定データにアクセスし、設定を変更できます。

**コードの例**:
以下は、Androidアプリケーション内でコンテンツプロバイダからデータを取得する基本的なコードの例です。この例では、連絡先データへのアクセスを示しています。

```kotlin
// コンテンツプロバイダへのクエリ
val uri = ContactsContract.Contacts.CONTENT_URI
val projection = arrayOf(ContactsContract.Contacts.DISPLAY_NAME)

val cursor = contentResolver.query(uri, projection, null, null, null)

if (cursor != null) {
    while (cursor.moveToNext()) {
        val name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
        // 連絡先の名前を取得
    }
    cursor.close()
}
```

このコードでは、`ContactsContract`クラスを使用して連絡先データにアクセスし、データを取得しています。コンテンツプロバイダのURIを指定し、必要な情報を指定したプロジェクションとともにクエリを実行します。取得したデータはカーソルを介してアクセスできます。
Ruby on Rails：フォルダ概要

生成したRailsアプリの中身をざっとまとめました。

### Railsアプリの中身

| ファイル名 | 概要 |
|:-:|:--|
| .gitignore | Git用のファイル |
| config.ru | Rack(webサーバの仕組みを提供)用<br>Railsアプリをその場で実行するときに必要 |
| Gemfile | Gem(Rubyのパッケージマネージャ)用<br>Gemのパッケージ情報とかが書いてある |
| Gemfile.lock | Gemfileでパッケージ等が<br>インストールされたときに自動生成される |
| Rakefile | Rake(Rubyのビルドツール)で使用 |
| README.md | 使用上の注意等を記述 |


| フォルダ名 | 概要 |
|:-:|:--|
| app | アプリ本体 |
| bin | Railsで使うプログラム |
| config | 設定ファイルをまとめてある |
| db | DB関係 |
| lib | ライブラリ |
| log | ログファイル |
| public | 外部からアクセス可能な公開フォルダ |
| test | 動作確認等テストプログラム |
| temp | 一時的に作成されるファイル等 |
| vender | ソフトウェアベンダー等が作成するプログラムを設置<br>（プラグイン等機能を拡張するときとか） |

### Railsアプリ/appの中身

| appの中身 | 概要 |
|:-:|:--|
| asset | リソースをまとめて置くところ<br>image、css、jsファイル等 |
| chaannels | サーバと維持された接続を利用する時に使用 |
| controllers | プログラム制御（コントローラー） |
| helpers | ヘルパプログラム設置 |
| jobs | Active job（バックグラウンドで処理を実行）で利用 |
| mailers | Active Mail（メール送信）が利用 |
| models | Model（DBアクセス）設置 |
| views | View（画面表示）ファイル設置<br>views/layoutsフォルダの中にテンプレートファイルがある|
docker command list


1. **docker run**: このコマンドはDockerイメージから新しいコンテナを作成して起動するために使用されます。たとえば、`docker run -it ubuntu`は新しいUbuntuコンテナを作成します。

2. **docker pull**: Docker HubなどのレジストリからDockerイメージをダウンロードするために使用されます。例えば、`docker pull nginx`はNginxイメージをダウンロードします。

3. **docker build**: このコマンドはDockerfileからDockerイメージをビルドするために使用されます。Dockerfileはイメージのビルド手順を含むスクリプトです。

4. **docker ps**: 実行中のすべてのコンテナを一覧表示します。`-a`フラグを追加して、停止したコンテナを含むすべてのコンテナを表示できます。

5. **docker stop**: 実行中のコンテナを停止します。コンテナの名前またはIDを指定する必要があります。

6. **docker start**: 停止したコンテナを再起動するために使用されます。再び、コンテナの名前またはIDを指定します。

7. **docker restart**: コンテナを停止してから再起動します。実行中のコンテナを迅速に再起動したい場合に便利です。

8. **docker rm**: 1つまたは複数のコンテナを削除します。強制的に削除するには`-f`フラグを使用できます。

9. **docker rmi**: 1つまたは複数のイメージを削除します。強制的に削除するには`-f`フラグを使用します。

10. **docker logs**: 特定のコンテナのログを表示します。例えば、`docker logs my_container`。

11. **docker exec**: 実行中のコンテナ内でコマンドを実行するために使用します。たとえば、`docker exec -it my_container bash`はコンテナ内でbashシェルを起動します。

12. **docker cp**: コンテナとローカルファイルシステム間でファイルまたはフォルダをコピーします。例：`docker cp my_container:/path/to/container/file /local/path`。

13. **docker network**: Dockerネットワークを管理します。カスタムネットワークを作成してコンテナ間の通信を設定できます。

14. **docker volume**: Dockerボリュームを扱います。ボリュームはコンテナの実行間でデータを永続化するために使用されます。

15. **docker-compose**: 複数のコンテナから成るDockerアプリケーションを定義し実行するためのツールです。アプリケーションのサービス、ネットワーク、ボリュームを1つのYAMLファイルで定義できます。

16. **docker inspect**: コンテナ、イメージ、ボリューム、ネットワークに関する詳細情報を提供します。デバッグやDockerオブジェクトの理解に役立ちます。

17. **docker stats**: コンテナのリソース使用統計情報のライブストリームを表示します。

18. **docker-compose up/down**: これらのコマンドは`docker-compose.yml`ファイルで定義されたサービスを開始および停止するために使用されます。
react-to-printを使った非表示部分の印刷方法

## 目次
[1.はじめに](#1はじめに)
[2.開発環境](#2開発環境)
[3.実装方法](#3実装方法)
[4.参考](#4参考)
## 1.はじめに

「[react-to-print](https://github.com/gregnb/react-to-print)」を用いて、印刷機能を実装しようとした際、
非表示にしているところを印刷時に表示して印刷しようとしたが、印刷ができませんでした。
実装方法を調べてもでてこなかったため記事にまとめてみました。

## 2.開発環境

- OS : Windows10
- React : v18.3.0
- Electron : v23.0.0
- react-to-print :  v2.14.13

## 3.実装方法

### 印刷時に非表示にする方法

まず、react-to-printを使って印刷する時に非表示にしたいときは`display: none`を設定します。

```css
@media print {
	#id{
		display: none !important;
	}
}
```

### 印刷時に非表示部分を表示させる方法

では、逆に非表示部分を印刷するときに表示させるのはどうしたら良いか？
[参考](https://github.com/gregnb/react-to-print)にさせていただいたところによると、「`overflow: hidden`を設定し、`height: 0`にする。」
と書いてあったので`display: none`で非表示にしている部分を変えてみました。

```css
@media print {
	#id{
		overflow: hidden !important,
		height: 0;
	}
}
```

あたりまえですが、印刷しても何も表示されませんでした。

ちょっと考えたらわかることなのでプログラムを修正した結果

```tsx
<div
	id="id"
	ref={printRef}
	style={{
		overflow: 'hidden',
		hight: 0,
		textAlign: 'center',
	}}
>
	非表示だが印刷したい内容を書く
</div>

```

印刷時に表示状態にする。

```css
@media print{
	#id{
		overflow: visible !important;
	}
}
```

非表示にする場合は`style`に`display: none`を設定していたが、`overflow: hidden`、`height: 0`に設定しても非表示になります。
印刷するときだけ`@media print`に`overflow: visible`に設定すると、非表示部分が印刷できるようになります。

### 印刷時にページを分ける方法

ちなみに印刷ページを強制的に分けたい場合は`section`で囲って、`pageBreakAfter: always`を
設定すればページを分けられます。

```tsx
<div
	id="id"
	ref={printRef}
	style={{
		overflow: 'hidden',
		hight: 0,
		textAlign: 'center',
	}}
>
	<section style{{pageBreakAfter: 'always'}}>
		1ページ目の非表示だが印刷したい内容を書く
	</section>
	<section style{{pageBreakAfter: 'always'}}>
		2ページ目の非表示だが印刷したい内容を書く
	</section>
</div>
```

以上非表示部分を印刷する方法でした。

## 4.参考

https://github.com/gregnb/react-to-print
Electron React Boilerplateで特定のライブラリ使用時にビルド後に起こるエラーの対処法

## 目次
[1.はじめに](#1はじめに)
[2.環境](#2環境)
[3.発生したエラー](#3発生したエラー)
[4.原因](#4原因)
[5.対処方法](#5対処方法)

## 1.はじめに

「[Electron React Boilerplate](https://github.com/electron-react-boilerplate/electron-react-boilerplate)」を使用したプロジェクトにおいて、
一度パッケージ化した後に、「npm start」で実行を開始すると、
エラーが発生して実行できなかったことがあった為、その対処方法をまとめました。

## 2.開発環境

- OS : Windows10
- Node js : v18.17.0
- Electron : v25.0.1
- typescript

## 3.発生したエラー

「[Electron React Boilerplate](https://github.com/electron-react-boilerplate/electron-react-boilerplate)」を使用したプロジェクトにおいて、
「[Fabric.js](http://fabricjs.com/)」をインストールした状態で、
「electron-builder」を用いてプロジェクトのビルドを行った後、
「npm start」コマンドで実行すると、下記のエラーが発生する。

```text
The DLL files are missing. Sit back while we build them for you with "npm run build-dll"
[webpack-cli] Failed to load 'S:\Electron\000.test\rbp\.erb\configs\webpack.config.renderer.dev.ts' config
[webpack-cli] Error: Command failed: npm run postinstall
    at checkExecSyncError (node:child_process:885:11)
    at execSync (node:child_process:957:15)
    at Object.<anonymous> (S:\Electron\000.test\rbp\.erb\configs\webpack.config.renderer.dev.ts:38:11)
    at Module._compile (node:internal/modules/cjs/loader:1256:14)
    at Module.m._compile (S:\Electron\000.test\rbp\node_modules\ts-node\src\index.ts:1618:23)
    at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
    at Object.require.extensions.<computed> [as .ts] (S:\Electron\000.test\rbp\node_modules\ts-node\src\index.ts:1621:12)
    at Module.load (node:internal/modules/cjs/loader:1119:32)
    at Function.Module._load (node:internal/modules/cjs/loader:960:12) {
  status: 1,
  signal: null,
  output: [
    null,
    <Buffer 0a 3e 20 70 6f 73 74 69 6e 73 74 61 6c 6c 0a 3e 20 74 73 2d 6e 6f 64 65 20 2e 65 72 62 2f 73 63 72 69 70 74 73 2f 63 68 65 63 6b 2d 6e 61 74 69 76 65 ... 720 more bytes>,
    <Buffer >
  ],
  pid: 33812,
  stdout: <Buffer 0a 3e 20 70 6f 73 74 69 6e 73 74 61 6c 6c 0a 3e 20 74 73 2d 6e 6f 64 65 20 2e 65 72 62 2f 73 63 72 69 70 74 73 2f 63 68 65 63 6b 2d 6e 61 74 69 76 65 ... 720 more bytes>,
  stderr: <Buffer >
}
```

## 4.原因

**「dll」フォルダ(.erb/dll)が削除されていることが原因。**

本来、一番最初に「npm start」を行った際に「.erb」内に「dll」フォルダが作成されているはずが、これがビルド後に削除されている。

※「.erb」は「electron react boilerplate」の略

通常であれば「dll」フォルダが無い状態で「npm start」を実行すると再度「dll」フォルダが作成される。

しかし、「fabric.js」をインストール状態で「dll」フォルダを作成しようとすると作成に失敗してしまう。

これらにより上記のエラーが発生する。

### dllが削除される理由

ビルド時に「.erb/clean.js」が実行され、そこでdllが削除されるようになっている。

## 5.対処方法

「.erb/scripts/clean.js」の `webpackPaths.dllPath` をコメントアウトする。

```jsx
import { rimrafSync } from 'rimraf';
import fs from 'fs';
import webpackPaths from '../configs/webpack.paths';

const foldersToRemove = [
  webpackPaths.distPath,
  webpackPaths.buildPath,
  //webpackPaths.dllPath, <- ここをコメントアウト
];

foldersToRemove.forEach((folder) => {
  if (fs.existsSync(folder)) rimrafSync(folder);
});
```

これによりビルド時に「dll」フォルダが削除されなくなるため、
ビルド後も「npm start」で実行できるようになる。
AI-102試験対策のまとめ「Azure AI Vision」

## はじめに
Azure AI Engineer Associate(AI-102)取得に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AI-102取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください
※勉強しながら投稿しているため、追加で学んだことがあれば随時投稿内容を更新します。

## 試験対策のまとめ
## Azure AI Vision
画像や動画を処理して視覚的特徴を抽出可能
| サービス | 処理対象 | 抽出対象 | 使用例 |
| --- | --- | --- | --- |
| 光学式文字認識(OCR) | 画像 | テキスト | ・ドキュメント <br> ・請求書 <br> ・写真など |
| 画像分析 | 画像 | ・物や顔 <br> ・成人向けコンテンツ <br> ・自動生成されたテキストの説明など | ・人物の検出 <br> ・画像キャプションの生成 <br> ・物体検出 <br> ・視覚的特徴のタグ付けなど |
| Face | 画像 | 人の顔 | ・本人確認 <br> ・顔認識によるチェックイン <br> ・顔編集など |
| 空間分析 | 動画 | 人の存在と動き | ・空間内の人数カウント <br> ・人と人の間の距離測定 <br> ・マスク着用の有無など |

* 参考
    - https://learn.microsoft.com/ja-jp/azure/ai-services/computer-vision/overview

## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「Azure Cognitive Search①」**

https://qiita.com/fsd-jume/items/7e2d41540b6039706e9d

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d
jqでJSONをビカビカに点滅させる

# 実例

![jq.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/af74574d-c7ed-4faf-9153-f414bdd3aac2.gif)

# しくみ

```bash
JQ_COLORS="0;90:0;35:5;36:5;33:5;32:5;38:5;34:5;31:5" jq -n '{field: 123}'
```

環境変数 `JQ_COLORS` で色を制御できます。フィールドの型ごとに `;` 区切りで色を設定できます。

https://jqlang.github.io/jq/manual/#colors

形式は `{色}:{書式}` で、ANSIエスケープシーケンスに準拠します。

書式の `5` が今回使用した「点滅」です。

一部の型のみ点滅させることで、目視確認等が楽になるかもしれません。
~~...そもそもフィルタを書けば絞り込めますが~~
Flutter 2系からFlutter 3系へ　Android ビルドエラー

#### [ エラー文 ]
abstract and does not implement abstract member public abstract fun error(p0: String, p1: String?, p2: Any?): Unit defined in io.flutter.plugin.common.MethodChannel.Result


#### [ エラーコード ]
```android/app/src/main/kotlin/XXXX/MainActivity.kt

private fun onDataUpdated(type: String) {
        channel.invokeMethod("onDataUpdated", type, object : MethodChannel.Result {
            override fun success(result: Any?) {
                Log.d("Android", "result = $result")
            }
            override fun error(errorCode: String?, errorMessage: String?, errorDetails: Any?) {
                Log.d("Android", "$errorCode, $errorMessage, $errorDetails")
            }
            override fun notImplemented() {
                Log.d("Android", "notImplemented")
            }
        })
    }
```
override fun error()でエラーが発生していました。


#### [ 修正 ]

```FlutterSecureStoragePlugin.java
static class MethodResultWrapper implements Result {

    private final Result methodResult;
    private final Handler handler = new Handler(Looper.getMainLooper());

    MethodResultWrapper(Result methodResult) {
        this.methodResult = methodResult;
    }

    @Override
    public void success(final Object result) {
        handler.post(() -> methodResult.success(result));
    }

    @Override
    public void error(@NonNull final String errorCode, final String errorMessage, final Object errorDetails) {
        handler.post(() -> methodResult.error(errorCode, errorMessage, errorDetails));
    }

    @Override
    public void notImplemented() {
        handler.post(methodResult::notImplemented);
    }
}

```
void errorの第一引数がNonNullになっています。
しかしoverride fun error(errorCode: String?, errorMessage: String?, errorDetails: Any?)の第一引数がerrorCode: String?になっています。



```android/app/src/main/kotlin/XXXX/MainActivity.kt

private fun onDataUpdated(type: String) {
           //省略
            override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {
                Log.d("Android", "$errorCode, $errorMessage, $errorDetails")
            }
            //省略
        })
    }
```

これで無事ビルドが通りました！



#### [ 最後に ]
誰かのお役に立てば幸いです。
[23c SQL新機能] SELECT文のdual表が不要になった！他のDBからの移行が簡略化

## 環境
・Oracle Database 23c
　※DBエディションやOSによって差異はなし

## やれること
23cより前までは、OracleのSELECT文ではFROM句が必須でした。
そのため、たとえば現在日時を確認したいなど、表の必要のないSELECT文ではDUAL表という
ダミー表を使用して、SELECT文を成り立たせていました。

それが23cではDUAL表のためのFROM句が不要となりました。

長年Oracleを使ってきた自分には、なぜそんな改訂が行われたのか不思議に思っていましたが
どうも他のデータベースではFROM句不要でSELECTできるのが普通だったようです。
Oracleと他のデータベースの動きを確認してみました。



**FROM句が必要ないようなシンプルSQLと、現在日時を取得するSQLを
データベースごとに比較**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/91d1e872-a89c-505d-e7d1-f50e94e8388c.png)


## 実行例
#### Oracle Database 23c

FROM句（Dual表指定）が不要になった
```
[oracle@host01 ~]$ sqlplus  / as sysdba

SQL*Plus: Release 23.0.0.0.0 - Developer-Release on 日 10月 22 08:00:31 2023
Version 23.2.0.0.0

Copyright (c) 1982, 2023, Oracle.  All rights reserved.



Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release
Version 23.2.0.0.0
に接続されました。
SQL> select 1 from dual;

         1
----------
         1

SQL> select 1;

         1
----------
         1

SQL> select sysdate;

SYSDATE
--------
23-10-22

SQL>
```


#### Oracle Database 19c
Oracleでは21cまではFROM句必須（例は19c）
```
[oracle@sms-oracle-db-3s ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on 月 10月 16 09:54:30 2023
Version 19.11.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.



Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.11.0.0.0
に接続されました。
SQL> show user
ユーザーは"SYS"です。
SQL> select 1 from dual;

         1
----------
         1

★ 19cではFROM句が必須のため、エラーになる
SQL> select 1
  2  ;

*
行2でエラーが発生しました。:
ORA-00923: FROMキーワードが指定の位置にありません。


SQL> select sysdate from dual;

SYSDATE
--------
23-10-16

★ 19cではFROM句が必須のため、エラーになる
SQL> select sysdate;
select sysdate
             *
行1でエラーが発生しました。:
ORA-00923: FROMキーワードが指定の位置にありません。
```

#### SQL Server
SQL ServerではFROM句不要
```
C:\Users\Administrator>sqlcmd -S localhost -U sa
パスワード:

★SQL Serverでは dual表は存在しない
1> select 1 from dual;
2> go
メッセージ 208、レベル 16、状態 1、サーバー WIN-OGLJPPACQ1N、行 1
オブジェクト名 'dual' が無効です。
1>
2>
3>

★SQL Serverでは もともとdual表は不要で検索できた
4> select 1
5> go

-----------
          1

(1 行処理されました)

★SQL Serverでの現在日時を取得するSQL文
1> select getdate()
2> go

-----------------------
2023-10-16 13:18:12.820

(1 行処理されました)
```

#### PostgreSQL
PostgreSQLではFROM句不要
```
C:\Users\Administrator>psql -U postgres
ユーザ postgres のパスワード:
psql (13.4)
"help"でヘルプを表示します。

★PostgreSQLでは dual表は存在しない
postgres=# select 1 from dual;
ERROR:  リレーション"dual"は存在しません

行 1: select 1 from dual;
                    ^

★PostgreSQLでは もともとdual表は不要で検索できた
postgres=# select 1;
 ?column?
----------
        1
(1 行)

★PostgreSQLでの現在日時を取得するSQL文
postgres=# select now();
              now
-------------------------------
 2023-10-20 19:16:57.636296+09
(1 行)

postgres=# select current_date;
 current_date
--------------
 2023-10-20
(1 行)


```
せんせー、テラヘルツイメージングってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、テラヘルツイメージングってなに？

# テラヘルツイメージングとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## テラヘルツイメージングって何？

テラヘルツイメージングは、テラヘルツ波と呼ばれる特殊な光を使って、物や人の体の中など、普段見ることができない部分を映し出す技術です。テラヘルツ波は、人の目には見えない電磁波で、物質を透過する能力があるんだ。

例えば、壁の中や箱の中身、さらには人の服の下など、隠されたものを見ることができるのです。危険な物質や隠されたものを安全に検出するのに役立ちます。

## どうやって動くの？

このシステムは、テラヘルツ波をオブジェクトに向けて発射し、その波がオブジェクトを通過したり反射したりするのをキャッチすることで画像を作ります。それはちょっと、超能力のように物の中を見ることができるスーパーヒーローのようなものだね。

物質がこの波を異なる方法で吸収したり反射したりするため、異なる種類の物質から構成されるオブジェクトの内部構造を「見る」ことができるのです。

## なぜそれがすごいの？

テラヘルツイメージングのすごいところは、無害で非侵襲的な方法で隠されたものを見つけることができることです。これは、例えば空港でのセキュリティチェックや、建築物の構造調査、さらには医療分野での診断など、多くの場面で非常に役立ちます。

また、テラヘルツ波は、他の種類の放射線（例えばX線）に比べて体に害を与えることが少ないため、人への影響が非常に小さいのです。

# まとめ

テラヘルツイメージングは、見えないものを見るための驚くべき方法で、私たちの安全性を高め、日常生活をより良くするために多くの可能性を持っています。この技術はまだ発展途上で、これからさらに多くの応用が期待されているのです。
せんせー、スマートナノセンサーってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、スマートナノセンサーってなに？

# スマートナノセンサーとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## スマートナノセンサーって何？

「ナノ」とは、物事を非常に小さなスケール、つまり「ナノメーター」という単位で見ることを意味します。1ナノメーターは、1メートルの10億分の1です！スマートナノセンサーは、この「超ミニサイズ」で、我々の周りの世界を感じ取る特別な機器なのです。

これらのセンサーは、空気中の微小な粒子、体内の細胞、はたまた建物の構造の微妙な変化まで、さまざまなものを検知することができます。そして、「スマート」な点は、単に感知するだけでなく、収集した情報を解析し、何らかのアクションを起こす能力があることです。

## どうやって動くの？

スマートナノセンサーは、特定の化学物質や物理的な変化（温度、圧力など）に反応して動作します。例えば、ある種のナノセンサーは、空気中の有害物質をキャッチして警告を発するかもしれませんし、別の種類のものは、建物に微細なひびが入っているのを感知するかもしれません。

これらの情報は、センサーからコンピューターシステムやスマートデバイスに無線で送信され、そこでデータが解析されます。そして、必要に応じてアラートが鳴ったり、システムが自動的に調整されたりします。

## これが重要な理由は？

スマートナノセンサーの力は、その精度と柔軟性にあります。非常に小さな変化でも捉えることができ、それに迅速に対応することが可能なのです。これは、環境の監視、健康管理、産業用途、セキュリティシステムなど、多岐にわたる分野での応用が期待されています。

たとえば、医療分野では、体内の異常を早期に発見し、速やかに対処することができます。環境保護においては、汚染レベルをリアルタイムで監視し、危険が迫っている場合にはすぐに対策を講じることができるのです。

# まとめ

スマートナノセンサーは、我々が住む世界をより安全に、そして効率的にするための鍵となる技術です。その小さなサイズと大きなパワーで、これらのセンサーは私たちの生活を根本的に変える可能性を秘めています。
TypeScriptでJestを使う

# Jestの環境構築を行う。

1. パッケージのインストール.
2. TypeScriptに対応する

雛形を作成
```bash
npx tsc --init
```

パッケージをインストール
```bash
npm i -D jest @types/jest ts-jest
```

tsconfg.jsonの作成
```bash
npx ts-jest config:init
```

------

関数を定義したファイルを配置する。ファイル１枚ならどこでもいい。

自作した関数のsum.ts
```ts
export function sum(a: number, b: number): number {
  return a + b;
}
```

テストコードを書いたsum.test.tsを作成。testとファイル名にはつける。
```ts
import { sum } from './sum';

// itとはテストケースのこと
it("１と２を足すと３になる", () => {
  // expect関数にテストの結果を渡す
  // expect(関数の戻り値).toBe(期待値)
  expect(sum(1, 2)).toBe(3);
})
```

VScode　にJestという拡張機能を入れておくと、RunボタンとDebugボタンが表示されるようになり、毎回コマンドを入力せずに済むようになるので便利です。

![スクリーンショット 2023-10-25 8.09.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/44671da7-ae0f-7266-0256-ab4ce81a9729.png)

テストが成功するとターミナルに結果が表示されます。
![スクリーンショット 2023-10-25 8.11.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2303722/1596cc66-d84d-58e4-d28e-d75cf3ac5a7c.png)

## 最後に
最近携わっている仕事で、TypeScriptのテストコードを書く機会が出てきたので、Jestの勉強始めました。
品質の良いソフトウェアを開発するには、テスト大事ですね。
JavaScriptの非同期処理の変遷③ async/awaitはなぜ同期処理のように書けるのか

前回の記事までで、JavaScriptの非同期処理がどのように変遷してきたのか整理。

https://qiita.com/yusuke2310/items/534a007836089eebb2f4

https://qiita.com/yusuke2310/items/134b8484d3e0cb0b8d14

:::note
Promiseの登場によって非同期処理の記述が容易になったことがわかりました。

それでもthenを用いた非同期処理はコールバック関数が必要なため、コードがネストしてしまい、以下のような同期処理と比べると可読性が下がります。

```javascript
const post = getPost(postId);
const user = getUser(post.userId);
const org = getOrganization(user.orgId);
```

そこで、同期処理のような書き味と非同期処理を両立した書き方が望まれるようになり、asyncとawaitが導入されました。
:::


## await

:::note
awaitとは、非同期処理の完了を待つためのキーワード。
Promiseの値が参照できるようになるまで、awaitより下に書かれた処理に進まないようにする役割を持つ
:::

#### awaitの特徴

* 関数呼び出しにawaitをつけた場合、戻り値に代入される値はPromiseではなく、Promiseが約束した値になる。
* つまり、Promiseが解決するまで次の行に進まない。
* 一見同期処理のように見えるかもしれないが、プログラム全体の進行がブロックされるわけではない。
* await式が影響を及ぼすのは、それ以降に書かれたタスクだけで、別のところに書かれたタスクには影響しない。

## async
:::
asyncは非同期関数を宣言するためのキーワード。

このキーワードがついた関数は必ずPromiseを返すようになる。
:::

#### asyncの特徴

* 例えば、return文などで単に文字列を返す関数の場合、戻り値は単に文字列ではなく、文字列のPromiseになる。
* asyncをつけた非同期関数では、await文が使えるようになる。
* 逆にawait文が使えるのは非同期関数の内部だけ。

:::note
async/awaitを使うことで非同期処理を行なっているにも関わらず、直感的で同期処理のように書くことが可能になる。

この書き方によって理解が容易で、可読性も高まるため、非同期処理が頻繁に行われる現代のJavaScriptプログラミングにおいて極めて有用な構文。
:::

---

今回の記事もSoftware Design 2023年9月号の内容をまとめています。

▼参考文献

https://gihyo.jp/magazine/SD/archive/2023/202309
【Linuc102対策】プロトコルの名称と特徴

# はじめに
Linucレベル1 102試験対策用です。
プロトコルの種類が多く、覚えるのが大変だったのでまとめてみました。

# プロトコルとは
通信を行う上での取り決めのことを指します。主に4つに分類できます。
|  種類 | プロトコル  |
| ---- | ---- |
|  アプリケーション層  |  HTTP ・ SMTP ・ Telnet  |
|  トランスポート層  |  TCP ・ UDP  |
|  ネットワーク層  |  IP ・ ICMP  |
|  データリンク層  |  ネットワークインターフェース層  |

# 各プロトコルについて
主要なプロトコルをまとめます。

### TCP
コネクション型のプロトコルです。
コネクション型とは、相手に通信データが正しく届いていることを確認しながら通信するので、信頼性も高いです。
例えば途中で消失やエラーが発生したパケットを再送するのに使います。

### IP
コネクションレス型のプロトコルです。
コネクションレス型とは、相手に通信データが正しく届いているかを確認せず一方的に送信するもので、信頼性は低くなります。
その分伝達速度は早くなります。例えば、IPアドレスの規定やデータグラム(伝送単位)の規定に使います。

### UDP
コネクションレス型のプロトコルです。例えば、音声や映像のストリーミング配信、DNSの名前解決やNTPでの時刻情報配信に使います。

### ICMP
コネクションレス型のプロトコルです。エラーメッセージや制御メッセージを伝送し、pingコマンドやtracerouteコマンドで利用されます。

★pingコマンド
指定されたホストにICMPパケットを送り、その反応を表示します。停止したサーバーに対してpingコマンドを実行すると応答なしで返ります。

★tracerouteコマンド
指定されたホストまでパケットが伝わる経路を表示します。
 
# おわりに
主要なプロトコルはきちんと押さえた方が良さそうです。
関連するコマンドも一緒に覚えました。

# 参考
Linucレベル1 小豆本
【生成AIパスポート】試験学習 復習の自動化動画 その3 | 「生成AIの全体的な特徴」と「生成AIにおける基盤モデルの特徴」の違いが紛らわしかった話【動画 16分09秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル 【生成AIパスポート】試験学習 復習の自動化動画 その3 _ 「生成AIの全体的な特徴」と「生成AIにおける基盤モデルの特徴」の違いが紛らわしかった話【動画 16分09秒.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/dae49362-79db-fa78-ecf1-bfd22e533d09.png)




* # 動画URL
    * https://youtu.be/AZRPJJkBtZc

<br>

* # 動画タイトル
    * 【生成AIパスポート】試験学習 復習の自動化動画 その3 | 「生成AIの全体的な特徴」と「生成AIにおける基盤モデルの特徴」の違いが紛らわしかった話【動画 16分09秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2023-10-16(月)

ひょんなことから生成AIパスポート試験を受けることになったので、手抜きしながら、学んだことの定着(記憶の定着)をねらっていきます。

・生成AIパスポートとは？
　https://bit.ly/WhatIs-GenerateAIPassport

やり方はこんな感じです。

・初回のインプット( 座学、教材学習、ChatGPT PlusやGoogle Bardへ質問する )

・アウトプット( 学んだことを声に出す → YouTube動画化 )

・2回目以降のインプット( 自分でつくった動画をながら聴きする )
　└朝起きてすぐ( YouTube + Chromecast )

　└ジョギング中( YouTube + スマホ )

などのやり方で繰り返しながら学習します。
技能を上げるには繰り返しが大切です。
初回のインプットではとにかく集中して、2回目以降のインプットでは繰り返し学習のためにとにかく手抜きします。

動画編集をしている時に、繰り返し学習ができる点も、楽ちんだなと感じています。


---


⏳開始時間
　00:00 イントロ
　00:35 本編開始

　01:04 [サンプル問題 PDF]「ITパスポート試験 生成AIに関するサンプル問題」( IPA-独立行政法人情報処理推進機構 )から https://bit.ly/GenerateAI-Sample-IPA
　　└ 簡単だった問2を省略して、問1と問3だけを深掘り学習しました。

　01:24 問1：生成AIの特徴を踏まえて、システム開発に生成AIを活用する事例はどれか。
　　└ 正解はウ：対象業務や出力形式などを自然言語で指示し、その指示に基づいてE-R図やシステムの処理フローなどの図を描画するコードを生成AIに出力させる。
　　└ 正解がウである理由をおしえて。

　　└ 03:31 不正解の選択肢について、それぞれ「どのようにAIが得意ではないかの理由」と、「この選択肢を得意とするのはおもにxxです」のように丁寧に解説して。
　　└ 03:58 選択肢アが不正解の理由
　　└ 05:48 選択肢イが不正解の理由
　　└ 06:28 選択肢エが不正解の理由

　07:25 問3：AIにおける基盤モデルの特徴として、最も適切なものはどれか。
　　└ 正解はウ：「広範囲かつ大量のデータを事前学習しておき、その後の学習を通じて微調整を行うことによって、質問応答や画像識別など、幅広い用途に適応できる。
　　└ 正解がウである理由をおしえて。

　　└ 08:57 不正解の選択肢について、それぞれ「どのようにAIにおける基盤モデルの特徴と合致していないかの理由」と、「この選択肢を得意とするのはおもにxxです」のように丁寧に解説して。
　　└ 09:24 選択肢アが不正解の理由
　　└ 12:38 選択肢イが不正解の理由
　　└ 13:58 選択肢エが不正解の理由

　14:45 ということは「異常検出アルゴリズム」にもAI自体は使われているものの、今回の設問は「AIにおける基盤モデルの特徴」について最適な回答をしなければいけないから、設問に対する回答をする際には「総合的なAIの特徴」ではなく「AIにおける基盤モデルの特徴」について正しい理解をしておかなければいけないということ？


---


✓ 🎥My videos are strongly related to this video. | この動画と関連が強い私の動画 ↙
　・“生成AIパスポート 試験学習(動画公開日で降順)”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMuGz8uBLRl1XyLqeRCIY11


　・“生成AIパスポート 試験学習(動画公開日で昇順)”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOQB8T6uppVO_juFi-4xL3E


　・“山中一司がお金を払って買った情報”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOW4Cnbj6lnltyToJae_Rb5


　・“自己投資”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghP1Gxpymfr6fVF9pRYuGt1P


　・“効果的にマインドマップを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMTIuF-n2Uyaw6cqEMFt0aL


　・“マインドマイスター( クラウド型マインドマップ )を活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMCeUohu19ZbUilmcZnEJ1q


　・“マインドマイスター( クラウド型マインドマップ )でのプレゼンテーションの例”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMXJCYhmWK4bjAUG1uy78li


　・“効果的にChatGPTを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPfo1c-qmO2ERD7ldSgmblR


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/46S40Iy
【生成AIパスポート】試験学習 復習の自動化動画 その2 | 教師なし学習の「次元削減」と、パレートの法則(20対80の法則)が似ていると感じた話【動画 10分38秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル 【生成AIパスポート】試験学習 復習の自動化動画 その2 _ 教師なし学習の「次元削減」と、パレートの法則(20対80の法則)が似ていると感じた話【動画 10分38秒】.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/399613e1-1737-b76a-8c65-ed0105717e74.png)




* # 動画URL
    * https://youtu.be/6gV9fQjHgDM

<br>

* # 動画タイトル
    * 【生成AIパスポート】試験学習 復習の自動化動画 その2 | 教師なし学習の「次元削減」と、パレートの法則(20対80の法則)が似ていると感じた話【動画 10分38秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2023-10-15(日)

ひょんなことから生成AIパスポート試験を受けることになったので、手抜きしながら、学んだことの定着(記憶の定着)をねらっていきます。

・生成AIパスポートとは？
　https://bit.ly/WhatIs-GenerateAIPassport

やり方はこんな感じです。

・初回のインプット( 座学、教材学習、ChatGPT PlusやGoogle Bardへ質問する )

・アウトプット( 学んだことを声に出す → YouTube動画化 )

・2回目以降のインプット( 自分でつくった動画をながら聴きする )
　└朝起きてすぐ( YouTube + Chromecast )

　└ジョギング中( YouTube + スマホ )

などのやり方で繰り返しながら学習します。
技能を上げるには繰り返しが大切です。
初回のインプットではとにかく集中して、2回目以降のインプットでは繰り返し学習のためにとにかく手抜きします。

動画編集をしている時に、繰り返し学習ができる点も、楽ちんだなと感じています。


---


⏳開始時間
　00:00 イントロ
　00:24 本編開始

　00:52 「生成AIパスポート公式テキスト」( Kindle版 )から https://bit.ly/GenAIPass-Text
　　└ 00:56 「次元削減」とは？( 教師なし学習の文脈でつかわれる、次元削減とは？ )
　　└ 基本的なことから順番に説明します。

　　└ 01:58 まず「次元」とは？

　　└ 02:22 つぎに「変数」とは？

　　└ 03:17 教師なし学習の文脈でつかわれる「次元削減」とは？
　　　└ 大事な情報だけを残して、余分な情報を減らすこと

　　└ 03:54 教師なし学習の「次元削減」と、パレートの法則(20対80の法則)が似ていると感じた話

　　└ 05:54 「世界幸福度ランキング」で幸福度を測る6つの指標が、次元削減された結果であると仮定した話

　07:34 DALL·E 3 @ChatGPT Plus につくってもらった次元削減のイメージイラスト
　　└ 07:42 花が咲く丘

　　└ 09:04 本棚( ちょうどよい次元削減の例 )


---


✓ 🎥My videos are strongly related to this video. | この動画と関連が強い私の動画 ↙
　・“生成AIパスポート 試験学習(動画公開日で降順)”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMuGz8uBLRl1XyLqeRCIY11


　・“生成AIパスポート 試験学習(動画公開日で昇順)”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOQB8T6uppVO_juFi-4xL3E


　・“山中一司がお金を払って買った情報”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOW4Cnbj6lnltyToJae_Rb5


　・“自己投資”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghP1Gxpymfr6fVF9pRYuGt1P


　・“効果的にマインドマップを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMTIuF-n2Uyaw6cqEMFt0aL


　・“マインドマイスター( クラウド型マインドマップ )を活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMCeUohu19ZbUilmcZnEJ1q


　・“マインドマイスター( クラウド型マインドマップ )でのプレゼンテーションの例”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMXJCYhmWK4bjAUG1uy78li


　・“効果的にChatGPTを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPfo1c-qmO2ERD7ldSgmblR


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/3FfQNxC