OmniAICreator/Qiita-1.07M huggingface dataset:
気軽に使えるScalaのsbt環境をDockerで作ってみた

気軽に使えるScalaのsbt環境をDockerでスクリプト化したので、そのご紹介です。

# 背景

sbtのDockerイメージとして以下のものが多く利用されているように見えます。

[hseeberger/scala-sbt - Docker Image | Docker Hub](https://hub.docker.com/r/hseeberger/scala-sbt)

しかし、sbtのバージョンが少し古くてメンテされていないように見えます。

また、このイメージを使って単純に `docker run -it --rm hseeberger/scala-sbt:... sbt run` などとすると、キャッシュが引き継がれず毎回ダウンロードから始まってしまいます。以下のようなメッセージが毎回出てしまうのです。

```plain
copying runtime jar...
[info] [launcher] getting org.scala-sbt sbt 1.9.0  (this may take some time)...
[info] [launcher] getting Scala 2.12.18 (for sbt)...
```

そこで、Dockerイメージとそのラッパーとなるシェルスクリプトを書いて、キャッシュが引き継がれる、気軽に使えるsbt環境を作ってみました。

ソースコードは以下に置きました。

https://github.com/suzuki-navi/scala-docker


# 各ファイルの説明

## docker-run.sh

ラッパースクリプト本体です。次のように使います。

```bash
$ bash PATH-TO-scala-docker/docker-run.sh sbt run
```

またはパラメータを省略するとsbtが実行され、インタラクティブモードになります。

```bash
$ bash PATH-TO-scala-docker/docker-run.sh
```

以下の部分は、Dockerイメージがまだビルドされていなかったらビルドする処理です。

```bash
if [ -z "$(docker images -q $docker_image_name)" ]; then
    bash $(dirname $0)/docker-build.sh
fi
```

以下の部分は、ホスト環境でのユーザでsbtを実行するために、ホスト環境のユーザ情報をDockerの中に渡すための情報取得です。

```bash
user=$(whoami)
uid=$(id -u $user)
gid=$(id -g $user)
```

Dockerには`docker run`の以下のオプションでユーザ情報を渡しています。そして、この変数は`entrypoint.sh`で参照しています。

```plain
-e HOST_UID=$uid -e HOST_GID=$gid -e HOST_USER=$user
```

以下の部分は、sbtが使うさまざまなキャッシュを置くためのディレクトリを作成します。このスクリプトはプロジェクトのディレクトリで実行することを想定し、キャッシュディレクトリを実行時のカレントディレクトリに作成しています。このスクリプトをそのまま使うのであれば、各プロジェクトの `.gitignore` に `.sbt-docker-cache`を追加する必要があります。

```bash
mkdir -p .sbt-docker-cache/.sbt
mkdir -p .sbt-docker-cache/.cache
```

このディレクトリをsbtから使わせるために`docker run`に以下のオプションを渡しています。

```plain
-v $(pwd)/.sbt-docker-cache/.sbt:$HOME/.sbt -v $(pwd)/.sbt-docker-cache/.cache:$HOME/.cache"
```


## docker-build.sh

このスクリプトはDockerイメージをビルドします。手動で実行しても大丈夫ですが、初回の`docker-run.sh`実行時に自動で呼び出されます。

単に`docker build`しているだけです。


## Dockerfile

この中でJava、Scala、sbtをインストールしています。sbtのほかにScala単独でもインストールしているため、以下のようにすればScalaインタプリタが動きます。

```bash
$ bash PATH-TO-scala-docker/docker-run.sh scala
```


## entrypoint.sh

このファイルは`docker-run.sh`の中の`docker run`起動時のエントリポイントとして指定されています。コンテナの中で最初に実行されるスクリプトです。

以下の部分はホスト側と同じユーザをDockerの中で作成するためのコードです。

```bash
groupadd -g $HOST_GID -o $HOST_USER
useradd  -u $HOST_UID -g $HOST_GID -o $HOST_USER
usermod -aG sudo $HOST_USER
export HOME=/home/$HOST_USER
chown $HOST_USER $HOME
```

そのあとで `su` でrootからこのユーザにスイッチして、sbtコマンドを実行します。

以上。
MockingBird - テキストから音声への変換ツール！最新のインストールと使用方法を添付！


#
1.Python をインストールします。バージョン 3.8 以降を選択してください。
```
https://www.python.org/
```
2.PyTorchをインストールします。公式ウェブサイトから直接ダウンロードします。
```
https://pytorch.org/get-started/locally/
```
GPUがCUDAをサポートしていない場合は、あらかじめ選択してください。グラフィックカードがない場合は、CPUを選択してください。

3.ffmpegをインストールします。
```
http://ffmpeg.org/download.html#build-windows
```
ダウンロード後、binディレクトリのシステム変数に追加します。詳細はビデオチュートリアルをご覧ください。

4.MockingBirdをダウンロードします。
```
https://github.com/babysor/MockingBird
```
5.ダウンロードして解凍したら、ディレクトリでCMDを入力してターミナルを開きます。
#
```
python -m pip install --upgrade pip
```
#
```
pip install -r requirements.txt
```
#
```
pip install webrtcvad-wheels
```
#

6.自分で訓練したモデルを使用します。

7.モデルをダウンロードしたら、xxx.pt形式のファイルをsynthesizer\saved_modelsフォルダに入れてください。saved_modelsが存在しない場合は、新しく作成してください。

8.最後に実行コマンドを実行すれば、プログラムが開始します！

ウェブプログラム（v2）を開始します。


コードをコピーする
```
python web.py
```
成功すると、ブラウザでアドレスを開きます。一応はhttp://localhost:8080です。

トレーニングデータセットのダウンロードはこちら
```
https://drive.google.com/u/0/uc?id=110A11KZoVe7vy6kXlLb6zVPLb_J91I_t&export=download
```
GUI起動コマンド：

php

```
python demo_toolbox.py -vc -d <datasets_root>
```
データセットのパスが C:\data\aidatatang_200zh の場合、<datasets_root> は C:\data になります。
Hexo Theme のインストールと有用なプラグインの導入、そして投稿リンクについてご案内いたします



# Hexo Theme のインストールと有用なプラグインの導入、そして投稿リンクについてご案内いたします

hexo のインストールが完了してブログを開始した後、追加の操作を使用してブログをより美しく、読みやすくすることができます。以下のような操作がいくつかあります。 テーマを変更してサイトをより見やすくする 美しいです。サイトの使用率を上げるためにプラグインを追加してください

<!-- more -->

## デフォルトのテーマを変更すること

### 新しいテーマを選ぶ

以下の手順でお好みのテーマを選び、そのGitHubリポジトリのアドレスをコピーできます。

1. <a href="https://hexo.io/themes/">ここ</a>に好みのテーマを選んでください。

2. テーマのタイトルをクリックしてください。（画像をクリックするとデモサイトに移動してしまいますので、タイトルをクリックしてください。）

3. タイトルをクリックすると、GitHubのリポジトリに移動します。

4. ブラウザのアドレスバーに表示されているリポジトリのURLをコピーしてください。

例えば、僕は使用しているテーマが「`Next`」であり、そのプロジェクトのアドレスが「`git@github.com:next-theme/hexo-theme-next.git`」であることがわかりました。

### テーマのインストール

1. コマンドプロンプトやターミナルを開き、Hexoプロジェクトのディレクトリに移動します。

2. 次のコマンドを実行して、テーマのプロジェクトをローカルにクローンします：

```
git clone git@github.com:next-theme/hexo-theme-next.git
```
3.テーマのファイルを含む`next`という名前のフォルダを作成します。次のコマンドを実行します：

```
mkdir themes/next
```

これにより、`themes`フォルダ内に`next`という名前の新しいフォルダが作成されます。

4.次に、テーマ ファイルをこのフォルダーにコピーします。以下のコマンドを使って、ファイルをコピーすることもできます：

```
cp -r hexo-theme-next/* /themes/next
```

これで、テーマのファイルがHexoプロジェクトの`themes/next`フォルダにコピーされました。テーマのファイルが正しく配置されていることを確認してください。その後、Hexoの設定ファイルである`_config.yml`を編集し、

```
theme: next
```

と設定することで、新しいテーマを使用できます。

## 検索プラグイン

### インストールする方法

Hexoブログにローカル検索を作成する手順をご案内します：

1. コマンドプロンプトやターミナルを開き、Hexoプロジェクトのディレクトリに移動します。

2. 次のコマンドを実行して、Hexoの検索プラグインをインストールします：

```
npm install hexo-generator-searchdb --save
```

### 設定変更

このプラグインは、ルートの `_config.yml` ファイルで簡単に設定できます。すべての引数はオプションです。次のような形式を追加します:

```
search:
  path: search.xml
  field: post
  content: true
  format: html
```

## 永久リンク

Hexoのデフォルトの永久リンクは、`_config.yml`ファイルで設定されており、生成規則は「`permalink: :year/:month/:day/:title/`」です。年、月、日、タイトルの順に生成されます。

このデフォルトの設定には、非常に受け入れがたい欠点があります。ファイル名が外国語の場合、URLリンクにも外国語が表示されてしまいます。コピーした後のリンクはエンコードされ、読みにくく、簡潔ではありません。

最近、各投稿の永久リンクを簡素化したいと思っています。以下のような形式から：

`/2023/06/22/230622`

以下のような形式に変更したいです：

`/migrateopsmanager`

短いURLはより簡潔で読みやすくなります。日付の文字列はユーザーにとって意味がないためです。便利で使いやすい解決策として、`hexo-abbrlink`プラグインを使用することができます。

### インストールする方法

Hexoへのプラグインの追加方法は以下の通りです：

1. コマンドプロンプトやターミナルを開き、Hexoプロジェクトのディレクトリに移動します。

2. 次のコマンドを実行して、Hexoプロジェクトにプラグインを追加します：

```
npm install hexo-abbrlink --save
```

This command will install the "hexo-abbrlink" plugin using the npm package manager and add it to your dependencies using the --save option.

### 設定変更

プラグインのインストールが完了したら、Hexoの設定ファイルである`_config.yml`を開きます。`_config.yml`ファイル内で、`permalink`のセクションを探し、以下のような形式に変更します

```
permalink: posts/:abbrlink/ 
# or
permalink: posts/:abbrlink.html
```

> プラグインの設定が完了した後、古い記事のリンクが "undefined" となってしまう問題が発生しました。しかし、この問題についてよく考えてみると、解決策が見えてきます。まず、古い記事のキャッシュをクリアするために `hexo clean` コマンドを実行し、その後 `hexo g` コマンドを使用して再度レンダリングする必要があります。これにより問題が解消されるはずです。
Salesforceのレポートでユニークを活用しよう～何人のお客様にアプローチしたか確認する方法～

こんにちは。本橋孝昭です

皆さんはSaelsforceでレポートのユニーク集計を使ったことはあるでしょうか

今回はユニークの使用方法を解説します


例）
株式会社Aはリードのアプローチを１日に何人のお客様に行ったか確認したい
（単純に何件ではなく、お客様１人に２回アプローチしても１回としてカウント）
さて、どうやってレポートで集計すればいいでしょうか



今回の内容のように
・単純に何件
ではなく
・何人のお客様にアプローチしたか？
を確認したい場合、ユニークが活用できます


レポートの数式は以下となります

LEAD_ID:UNIQUE

![ユニーク１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/4a510aa9-f08b-f5a8-7f64-41f8b756587a.png)


このユニークの数式を集計すれば

・何人のお客様にアプローチしたか？
の計算がSalesforceのレポートで可能です


（以下の画像であれば、Motohashiさんが２回Todoを受けているが実際は１回とカウントされていることが分かりますね）

![ユニーク2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/14fe27f8-ea26-3e6b-e3e4-534334d1c436.png)
Androidアプリ開発(kotlin)についてのメモ～ディレクトリ構成とxml編～

2年ほど前にAndroidStudioをインストールしたのですが、一度ハッカソンに参加してから使っていませんでした...(そのときも初心者で全く分からず)

最近になってもう一度、一から学び直そうと思い、そのメモとして、誰かの参考になったらと思います。
# 目次
- [主なディレクトリ構成と役割](#主なディレクトリ構成と役割)
    [・manifests/AndroidManifest.xml](#・manifests/AndroidManifest.xml)
    [・res/drawable,layout,values...](#・res/drawable,layout,values...)
    [・java/"ドメイン"."アプリ名"/~.kt](#・java/"ドメイン"."アプリ名"/~.kt)
    [・GradleScripts/~.gradle](#・GradleScripts/~.gradle)
    [](#)


- [xmlについての理解](#xmlについての理解)
   - [大まかな理解](#大まかな理解)
   - [よく書いてある「xmlns:android=~」「xmlns:tools=~」の意味](#よく書いてある<br>「xmlns:android=~」<br>「xmlns:tools=~」の意味)
   - [android:id="@+id/~":](#android:id="@+id/~":)
   - [app:srcCompat="@android:~"](#app:srcCompat="@android:~")
   - [android:layout_height="?~"](#android:layout_height="?~")
   - [vectorとresourcesの違い](#vectorとresourcesの違い)

# 主なディレクトリ構成と役割
以下の4つに分けられる

### ・manifests/AndroidManifest.xml
アプリの設定やパーミッション、アクティビティの宣言

### ・res/drawable, layout, values...
アプリのアイコンや画像、XMLで定義された画面レイアウト、文字列リソースやスタイル、テーマなどのリソース

### ・java/"ドメイン"."アプリ名"/~.kt
Kotlinのソースコード(MainActivity.ktなど)

### ・Gradle Scripts/~.gradle
Kotlinプロジェクトのビルドおよび自動化ツール


build.gradleファイルは、プロジェクトの依存関係の管理などを行う
ルートプロジェクトの build.gradleファイル：
・プロジェクト全体の設定とビルドスクリプトを管理
・グローバルなビルド設定やプラグインの適用、リポジトリの設定
・サブプロジェクト（モジュール）の設定や依存関係の管理
サブプロジェクトの build.gradleファイル：
・個々のモジュール（アプリやライブラリ）のビルド設定とタスクを管理
・サブプロジェクト固有のビルド設定や依存関係の定義、リソースやソースコードの設定

settings.gradleファイルは、Gradleマルチプロジェクト構成におけるプロジェクトの設定を行う

# xmlについての理解
### 大まかな理解
layoutディレクトリ内のxmlが最上流のxmlファイルであり、つまり、実際目にするもの
Kotlinのファイルを参照するファイル<br>→xml上でtools:context=".MainActivity"のようにxml上で書く

あとは、"@~/~"を辿ればファイルの繋がりは理解可能

### よく書いてある<br>「xmlns:android=~」<br>「xmlns:tools=~」の意味

android:プレフィックスを使用するために必要
tools:プレフィックスを使用するために必要

### android:id="@+id/~":
要素に「一意のID"~"を割り当てる」
### app:srcCompat="@android:~"
「Androidフレームワークに組み込まれている」リソース"~"を利用する
### android:layout_height="?~"
要素の高さを"~"の「高さに自動に合わせる」
### vectorとresourcesの違い
Vectorは、数学的な数式や図形データを使用して画像を表現する
画像の拡大や縮小に対して優れた品質を維持し、解像度に依存しないため、「異なる画面サイズや解像度のデバイスでの一貫性のある表示が可能」

Resourcesは、Androidアプリケーションの「静的なリソースデータ」
アプリケーションが使用するさまざまな要素やデータ（画像、文字列、レイアウト、スタイルなど）を格納し、アプリケーションの実行中に参照や利用
(リンクだけです)「ナッシュ均衡(英: Nash equilibrium)」を調べた。

# wikipedia

https://ja.wikipedia.org/wiki/%E3%83%8A%E3%83%83%E3%82%B7%E3%83%A5%E5%9D%87%E8%A1%A1

https://en.wikipedia.org/wiki/Nash_equilibrium

# 内部検索
ナッシュ均衡

https://cse.google.com/cse?cx=a8908fbc24340ebc5&q=%E3%83%8A%E3%83%83%E3%82%B7%E3%83%A5%E5%9D%87%E8%A1%A1&oq=%E3%83%8A%E3%83%83%E3%82%B7%E3%83%A5%E5%9D%87%E8%A1%A1&gs_l=partner-web.12..0i512l10.3410.3410.0.5546.1.1.0.0.0.0.121.121.0j1.1.0.csems%2Cnrl%3D10...0....1.34.partner-web..0.1.121.zYGeiy3VZDM

https://www.google.com/search?q=site%3A%2F%2Fkamelink.com+%E3%83%8A%E3%83%83%E3%82%B7%E3%83%A5%E5%9D%87%E8%A1%A1&rlz=1CAUHAM_enJP1038JP1038&oq=site%3A%2F%2Fkamelink.com%E3%80%80%E3%83%8A%E3%83%83%E3%82%B7%E3%83%A5%E5%9D%87%E8%A1%A1&aqs=chrome..69i57j69i58.12569j0j4&sourceid=chrome&ie=UTF-8

https://www.google.com/search?q=site%3A%2F%2Fmathmathmass.exblog.jp+%E3%83%8A%E3%83%83%E3%82%B7%E3%83%A5%E5%9D%87%E8%A1%A1&rlz=1CAUHAM_enJP1038JP1038&oq=site%3A%2F%2Fmathmathmass.exblog.jp+%E3%83%8A%E3%83%83%E3%82%B7%E3%83%A5%E5%9D%87%E8%A1%A1+&aqs=chrome..69i57j69i58.4015j0j4&sourceid=chrome&ie=UTF-8

# 入試問題



https://mathexamtest.web.fc2.com/2008/200811061/2008110610200mj.html#top-0201


# 参考
「ゴール設定のない会議」ってのは「ゴール設定のないマラソン」じゃね😇？

## はじめに

- キックオフ！
- 振り返り！
- レビュー会！
- etc...！

チームでお仕事をしていると、もちろん色々な会議がありますよね:eyes:
で、その会議が終わった後に
- 「決めなあかんこと決めれたの？」
- 「俺分からなあかんこと全部分かったんかな？」
- 「振り返りでGood Point出んやん」
- 「会議にこんな時間必要やったやろか？」

とかいう状態になっていることはありませんでしょうか？
これは実は「**ゴール設定のない会議**」になっているのでは？と思います:point_up:

## ゴール設定のない会議

会議のゴールが曖昧なままだと、参加者それぞれ「**勝手な思い込みのゴール**」を持ったまま話し合いを進めることになります。

例えば、ある課題について会議の場合。

- 開発者A「（今回の会議は、課題を把握すればいいんやな）」
- 開発者B「（今回の会議は、何かアイデアを出せばいいんやな）」
- 開発者C「（今回の会議は、俺関係ないしとりあえず参加するだけでいいやろ）」
- リーダー「（今回の会議は、対策立てるとこまでいかなあかんな）」

目指すゴールがみんな違うので、話が色々な方向に広がってしまいます:tired_face:
この状態で会議を進めても上手くいく気がしませんね。
もはや「**ゴール設定のないマラソン**」状態だこりゃ。
こんなマラソン（会議）参加しなくない:rage:


## ゴールをちゃんと設定しよう

会議を有効なものにするためには、**ゴールを設定すること**がとても重要となります:muscle: 
ゴールを設定することで、**参加者の意識のベクトルを合わせること**ができます:muscle: 

- リーダー「この会議のゴールは、会議が終わったときに課題の対策方針が決まっている状態になっていることです。ご協力お願いします。」

といった具合ですね。
このような言葉を会議を行う前の決まり文句にしてしまうとよいでしょう。  

リーダー（主催者）任せにするのではなく、参加者もゴール設定を行うことは可能です。  

- 開発者C「会議終了後に、〇〇な状態になっていればよろしいですか？」  

といったことをすることで、ゴールがはっきりすると同時に、意識のベクトル合わせが可能になります。

この記事が少しでも参考になれば幸いです:innocent:
【登壇レポ】大学生に自社開発のIT企業の魅力を伝えてきました！

# はじめに

初めまして。
出張撮影プラットフォームOurPhotoというサービスでプロダクトマネージャーをしているdoueです。

先日、プロダクトマネージャーとして、大学の授業に登壇してきました。
その際の取材レポートは、当社のブログで公開されています。

そんな経験を通じて感じたことなどを、ぜひみなさんにシェアしたいと思い、記事を書きました。
お昼ご飯を食べながらでもご覧いただければ幸いです。

https://blog.uluru.biz/8110/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=%25e6%259d%258f%25e6%259e%2597%25e5%25a4%25a7%25e5%25ad%25a6%25e3%2581%25ab%25e3%2581%25a6%25e3%2580%2581ourphoto%25e3%2583%2597%25e3%2583%25ad%25e3%2583%2580%25e3%2582%25af%25e3%2583%2588%25e3%2583%259e%25e3%2583%258d%25e3%2583%25bc%25e3%2582%25b8%25e3%2583%25a3%25e3%2583%25bc%25e3%2581%25ae%25e5%25a0%2582%25e4%25b8%258a

# この記事の対象者

- 登壇してみたいと思っている人
- 登壇してみたいが、やり方がわからない人
- 大学生に何か一つでも伝えたいと思っている人
- 自分の学生時代の自戒をこめて

# 経緯

「大学に登壇！？すげぇ」とよく言われます。
実は、今年で登壇は4回目にもなります。

実は何もすごいことはなく、プライベート(?)でのつながりがあったので、登壇させてもらえることになりました。

授業の内容は、社会人の方々が日替わりで来てくれたりするような、いわゆるキャリア系の授業ですね。
（僕も大学生の頃にありました）

大学生は、さまざまな専門分野を勉強したり
社会人になる前のさまざまな経験をします。

その中で、実際に働いている人の声を生で聞くのは結構良い刺激だったりすると思います。

僕自身、キャリアについて真剣に考えなかったタイプですが
すごく運のいい出会いが重なり、今の自分のキャリアへつながりました。

そんな経験から、大学生に向けて、何かきっかけづくりをしたいと思っていたので
「ぜひやらせてください！タダでもいいです！」と言ったのが、初めての登壇でした。

# どんなことを話したの？
今回で4回目にもなりますが
前回までは、"新卒oo年目"みたいなテーマで
新卒からどんなことを学んだのか、などの話をしました。

僕は今、新卒7年目になるのですが
そろそろ新卒ブランドは使えないな...
と、今回の講義テーマには悩みました。笑

そこで考えたテーマはこちらです
> 「IT企業の中でも、自社開発をしている会社の、中の話」

今回の受講生は大学二年生でした。
ちょうど就活前の良い時期。

あわよくば、来年、うちに面接受けにきてもらおう、という思惑で登壇しました。

# オフラインの登壇は良い経験になる！

過去の登壇では、一度だけオフライン、コロナ禍はzoomだったので、久々のオフラインでした。
生徒は50人いました。超緊張しました。

時折挟んだ小ボケも全く響かず
「芸人になるという夢だけは、あきらめておいて正解だった」と思いながら、講義をしてました。

けれど、オフラインの登壇は本当にいいです。
話していて、全く響かない時もあれば
あれ？案外ここが響いてそうだぞ、って時もあります。

その時々で、アドリブ力が発揮されていきます。「あ、今の俺、やってやったぜ！」とかね。
そうやって自己肯定感を勝手に高めながら喋ります。

みなさんも日々の生活の中でアドリブ力を磨きましょう。

ちなみに、この日一番笑いをとれたのは
> Tik Tokに没入して一晩中見てて、気づいたら朝日が登ったので二度と使わないって決めました。

と言ったところで
もちろん台本にはない部分でした。笑

# 次回に向けて

オフラインで大人数の受講者がいると、基本的には質問が出ないです。
というか普通に寝ていそうな人もいるので、まあそういうところは気にしないメンタルを持ちます。

でも、なんだか、我々の性分なのか...
「インタラクティブでやりたい！！！」...こう思います。

次回は、匿名の質問ツールとかも使ってみようかなと考えています。

みんな、どれくらい投稿してくれるかはわからないんですけど
成功したら楽しい講義になりそうです。
（何より、90分の資料作るのは超大変です...）

# 最後に
登壇はとても緊張するし、失敗できないプレッシャーも結構あるんですが
でもやりたいと思ったらやってみるのがいいと思います！
(多分)やったら世界が変わります！

エンジニア同士での小規模な勉強会のLTなどからでもいいと思います。

大学というと、出身校とかの教授に頼んでみるとかもいいかもしれないですね。
（僕は単に知り合いだったので、このケースではないですが）

自分の経験にもなり、大学生や後輩に先人の知恵を授けられるなんて素敵です。

みなさんもぜひ一歩踏み出してみてはいかがでしょうか。
開発者のためのプロンプトTips集

# はじめに
バズワード化しているChatGPTですが、使っていくと開発者にとってかなり強力な相棒になります。本稿では、開発者にとって使う場面が多そうなプロンプトエンジニアリングのTipsやツールを紹介していきます。

# モデル

ChatGPT Plus (GPT-4)

# 基本

- コマンドを使用する
    「書く」「要約する」「翻訳する」などの指示を与える。

- 具体的に説明する
    抽象的な言葉や曖昧な表現を使うと、それっぽい回答を最もらしく回答してくるため、明確にタスクを指示する必要があります。

- 不正確さを避ける
    誤った情報や不正確な表現を使用すると、モデルの回答も不正確になる可能性があります。

- 「しないこと」を言わない
    モデルに対して「何をしないでほしいか」ではなく、「何をしてほしいか」を明確に伝える。


# Tips

## 1. 具体的で明確な指示を書く

### 入力を構造化する

- ダブルクォーテーション(`"テキスト"`)で括り、入力テキストを明確に
- Markdownの見出しや箇条書きを使ってプロンプトを構造化

### アウトプットの型や量を指定する

- 生成したいコードの言語やライブラリ名を明示する
- JSONなどで出力させる
- 出力は表形式、箇条書き、○行で などで行うことも可能

ex)
```
以下のサイトから重要な英単語を抽出し、英単語、発音記号、日本語での意味の順になるように表を作ってください。
[URL]
```

### 役割(ロール)を持たせる

GPTにエンジニア、マネージャーなどの立場を与えて、壁打ち相手にする。

ex)
```
あなたはIT企業に勤め、エンジニアをマネジメントしているマネージャーです。これからエンジニアに今年の目標を決めてもらおうと思っていますが、具体的にどのような目標を立てると良いでしょうか？
```



## 2. 考える時間を与える

### 最初はざっくり、徐々に深掘りしていく

質問をより具体的にするためにも、タスクを分割し、タスクのスコープを小さくする

### ステップバイステップで

最後に`ステップバイステップで`と書くと、GPTがタスクを行う途中経過を出力しながら目的のタスクを行なってくれます。

### ステップを踏ませる

ステップをプロンプトで指定することも可能です。
ex) 要約と翻訳を行わせる場合、段階を踏ませる

```
## 以下の指示に従ってください
1. 〇〇の要約してください
2. それを翻訳してください
```

# プラグイン

### WebPilot

プロンプトにURLを貼ると、サイトのコンテンツを読みに行ってくれます。

### Prompt Perfect

先頭に`perfect:`と入れておくと、続く文章をより良いプロンプトに変換してくれます。
※ 間違った補助が入る可能性もあります

### Show Me Diagrams

「図を作成してください」などと入力すると、プラグインが起動してMermaidなどで図を書いてくれます。

ex)
```
ウォーターフォールの開発工程を図で教えてください。
```

### ScholarAI

論文のアブストと全文を検索してくれるプラグイン

ex)
```
生成AIに関する論文を教えてください。
```

# リファレンス
#### OpenAIによるGPT利用のベストプラクティス

https://platform.openai.com/docs/guides/gpt-best-practices

#### Prompt Engineering Guide

https://www.promptingguide.ai/jp

#### Learn Prompting

https://learnprompting.org/ja/docs/intro

#### DeepLearning.AI の開発者のためのプロンプトエンジニアリング講座

https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/
こういう知識があってもいい思ったこと (二進数表現編)

## はじめに

- 発端

https://qiita.com/atm-snag/items/dc7e168ec7e08182ba64#%E7%99%BA%E7%AB%AF

## 数値はbit でできている

- ハードウェアで 0, 1 を表現できるようになった
- それを並べると，数を表現することができる．
    - 010 → 10進数の 2 を表現する

## 負数を表現する / 2の補数表現

- ルールが無いと負の数を表現できない．
- 2の補数表現を使うことにする．
    - 正の数，負の数を含めて加算器で計算できる
    - ex. `0100b` (4d) / `1100b` (-4d)
    - ex. 3d + (-1d) → `0011b` + `1111b` = `0010b` → 2d

```
0100 # 10進数の4
↓    # 反転
1011
↓    # 1を足す
1100
```

## 符号拡張

- bit長の拡張を考える
- 先頭の符号ビットで埋める
    - ex. `0100b` (4d) → `0000 0100b` (4d)
    - ex. `1100b` (-4d) → `1111 1100b` (-4d)

## Refs

https://ja.wikipedia.org/wiki/2%E3%81%AE%E8%A3%9C%E6%95%B0

https://ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E6%8B%A1%E5%BC%B5

https://ja.wikipedia.org/wiki/%E5%8A%A0%E7%AE%97%E5%99%A8

https://qiita.com/atm-snag/items/dc7e168ec7e08182ba64
git入門


### バージョン管理のメリット:

- バックアップの必要性がなくなるため、ファイルの安全性が高まる。
- 過去のバージョンとの比較や差分の確認が容易になる。
- 競合やデータの上書きを心配する必要がなくなる。
- 保存された履歴から、誰が何を変更したかを追跡できる。

### リポジトリ:

ファイルやディレクトリの状態を保存し、変更履歴を管理するための場所。
複数人で共有するためのリモートリポジトリと、個々の開発者が利用するためのローカルリポジトリがある。

### コミット:
ファイルやディレクトリの追加・変更をリポジトリに記録する操作のこと。
過去の履歴と内容を追跡し、変更内容を調査したり、履歴を振り返ったりできる。
コミットメッセージを記述することで、変更内容の要約や変更した理由をわかりやすく記録できる。

### ワークツリーとインデックス:
ワークツリーはGitの管理下にある作業ディレクトリで、開発者が実際にファイルを編集する場所。
インデックスはワークツリーとリポジトリの中間に位置し、コミットする前のステージングエリアとして機能する。
インデックスを介してコミットを行うことで、必要のないファイルを含めずにコミットしたり、一部の変更だけをコミットすることができる。

### コミットメッセージの書き方
コミットメッセージは変更内容の要約や変更した理由を記述するためのものであり、他の人がコミットの変更内容を理解したり、自分自身が後から履歴を確認する際に重要な情報。Gitでは一般的に以下の形式でコミットメッセージを書くことが推奨されている。

### ブランチとは

並行して行われる複数の機能追加やバージョン管理を支援する機能で履歴の流れを分岐して記録していくためもの。
分岐したブランチは他のブランチの影響を受けないため、同じリポジトリ中で複数の変更を同時に進めていくことができる。

```
1行目: コミットでの変更内容の要約
2行目: 空行
3行目以降: 変更した理由や詳細な説明
```

##基本的な流れ
初期化
`git init`


リモートレポジトリを登録
`git remote add <name> <url>` 

ワーキングツリーのファイルをインデックスに追加
`git add <file>`
インデックスの内容をローカルリポジトリに書き込む
`git commit (-m でメッセージ付きで実行可能)`
ローカルリポジトリの内容をリモートリポジトリに追加
`git push origin <remoteのブランチ名>`

### ブランチ

作業するブランチを切り替えるには、チェックアウトという操作を行います。チェックアウトを行うと、チェックアウト後に行ったコミットは、移動後のブランチに対して追加されるようになります。
ブランチの作成
`git branch <作成するブランチ名>`

ブランチの作成とチェックアウト
`git checkout -b <ブランチ名>`

ブランチを削除するには、branchコマンドに -d オプションを指定して実行。
`$ git branch -d <ブランチ名>`

### ブランチの統合
`merge`
mergeを使用すると、複数の履歴の流れを合流させることができる。
両方の変更を取り込んだマージコミットが作成される。

マージの実行時に、non fast-forwardマージというオプションを指定することで、fast-forwardマージではないマージを実行できる。

`rebase`
ブランチの履歴がmasterブランチの後ろに付け替えられます。

merge: 履歴が複雑になる。変更内容の履歴は残る。
rebase: 履歴は単純。元のコミットの内容が変更される。

## 参考にしたサイト
さるわかさん
https://backlog.com/ja/git-tutorial/
Salesforce 認定 Platform デベロッパー 合格体験記

# Salesforce 認定 Platform デベロッパーとは

【試験概要】
* 内容: 多肢選択/複数選択方式の 60 問 
* 試験の所要時間: 105 分 
* 合格点: 68% 
* 受験料: 20,000 円 (税抜)  再受験料は10,000 円
* 受験回数には制限あり(1度落ちると再試験は24時間後、再試験に落ちると14日後以降に再試験可能。さらに落ちると一定の期間内の再受験は不可)

# 私の受験結果
【経歴】
* 開発経験1年程度(Java)
* salesforceの使用経験はMCを２ヶ月触った程度(ほぼ無知)

【勉強期間】
5日間(1日8時間ほど勉強)

【受験結果】
![スクリーンショット 2023-06-24 17.15.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706631/080f5a2c-0abd-3e02-8ca0-f5639b544527.png)

【所感】
* オンサイトでの受験は試験時間が限られていたので、いつでも受験できるオンライン受験を選択
* webカメラが起動せず、バイオメトリック認証ができなくて試験を受けられなかった。
    * エラーの旨をチャットで伝えたところ、試験のリスケジュールをしてもらえた。
* <b>試験で出題される問題はほとんど過去問と同じものが出題されるため、過去問を解きまくることが合格に最も近づく </b>

# 勉強法
1. [Trailheadを一周する](https://trailhead.salesforce.com/ja/users/welcome4/trailmixes/salesforce-platform-dev-1)
2. ひたすら過去問を解く
   1. [salesforceの一番星](https://keneloper.com/exam-preparation-hypothetical-questions/)
   2. [PDI-JPN問題集](https://www.jpnshiken.com/exam/PDI-JPN-platform-developer-i-pdi%25e6%2597%25a5%25e6%259c%25ac%25e8%25aa%259e%25e7%2589%2588-11394.html)
   3. [exam-tests](https://www.exam-tests.com/Salesforce/PDI-exam.html)
3. 過去問は問題や回答が間違っていることもあるので、公式ドキュメントを読んで理解する(私はGPT4に問題を解説してもらってました)


過去問を解きまくることが一番点数をとりやすいですが、日本語の過去問は問題や回答が間違っていることが多く、解説が載っているものも少ないです。

そこで、私は大量に試験問題が無料で学習できるexam-testsの問題をGPT4に解説してもらいました。
gpt3.5だと間違った回答をしますが、GPT4だとかなり正確に回答してくれます。

選択肢の正解不正解の根拠を出力してもらうことで、GPT4がたまに間違った回答をしても、ドキュメントからどう違うのかを知ることができます。

試験ではガバナ制限やクラスやメソッドの細かい仕様などが聞かれるため、公式リファレンスの内容をすべて覚えることは不可能です。

問題集に出てくる範囲に絞って学習し、それぞれの選択肢がなぜ間違っているのか、なぜ正しいのかを深掘りしていくという学習がおすすめです。

# 注意
* 試験に合格した後はすぐにTrailheadのアカウントとWebassessorのアカウントを連携させることをおすすめします
* 資格の更新Trailheadが追加されるので、これも忘れないうちにすぐやってしまう方が良いかと思います

よかったらTwitterもフォローしてくれると嬉しいです。
日々開発の知見を発信しています。

[Twitter](https://twitter.com/js_manabitai)


# 参考
https://qiita.com/piepie1231/items/8da91897192dc44584be

https://quip.com/OiLaAWous0Yt
（解決?）バッチで良くわからないエラーに悩まされてます。

## 分かる方いたら、教えてください。->解決?しました。

元々は、ipconfig /allのコマンド出力結果から、単に
set contents1=%contents1:(優先)=%
で、(優先)を取ろうとしてます。

なぜか、if文の中で文字置き換えすると、エラーになるんです。
if文の外なら、問題ないのです。
もちろん、gotoで飛ばしてif文から出せば、エラー回避は出来ますが、何が起きてるのか、不思議です。

以下のバッチはremが３つありますが、どのremをとってもエラーになります。

原因わかる方いませんか？

→@gehahaさんに、教えていただきました。if文の中に、()の文字が存在すると誤動作するそうです。
()の文字が存在する場合は、if文の外に書かないとだめらしいです。
多分、バグなんだろうけど、しょうがないですね。


```bat:test.bat

@echo off
setlocal enabledelayedexpansion

set contents1=「テスト(優先)」
set contents2=%contents1%
set contents3=%contents1%
set contents4=%contents1%

set contents1=%contents1:(優先)=%
echo contents1=%contents1%

set contents2=!contents2:(優先)=!
echo contents2=%contents2%

if 1==1 (
  set contents3=%contents3:(優先)=%
  echo 3
rem  echo contents3='%contents3%'
)
echo contents3=%contents3%

if 1==1 (
rem  set contents4=!contents4:(優先)=!
  echo 4
rem  echo contents4=%contents4%
)
echo contents4=%contents4%

endlocal
ChatGPT-4の無料利用方法５つ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997148/a9659a40-de72-ec01-a896-96a3d62e7034.png)
1.ForeFront AI 
https://chat.forefront.ai

2.Microsoft 
https://www.bing.com/search?form=MY02AA&OCID=MY02AA&pl=launch&q=Bing+AI&showconv=1

3.Microsoft SwiftKey Beta 
https://play.google.com/store/apps/details?id=com.touchtype.swiftkey.beta&hl=en_US&pli=1

4.Ora.ai
https://ora.ai/signin

5.HuggingFace ChatGPT-4
https://huggingface.co/spaces/ysharma/ChatGPT4
5^x-3^x=16「【面白い解法】1分で解ける裏技」をChatGPTとWolframAlphaとsympyでやってみたい。

計算によって,グラフがでます。
ChatGPT     で計算できませんでした。
WolframAlphaで計算できました。
sympy       で計算できませんでした。
WolframAlphaとsympyでグラフがでます。

オリジナル　(youtube)　PASSLABO様

https://youtu.be/U81jxvQ_zp4

(2023/07/21)
# xxxx ChatGPT で(できませんでした。) xxx
```
実数ｘをすべて求めるよ.5^x-3^x=16
```

# Mathematicaで(できませんでした。)
```
In
Solve[{5^x - 3^x == 16}, {x}]

Out
この系はSolveで使用できるメソッドでは解けません．
```


# WolframAlphaで
グラフがでます。

https://www.wolframalpha.com/input?i=5**x-3**x%3D16&lang=ja

解　x = 2
# sympyで計算だけ(PASSLABO様のやり方)
勉強中

# sympyで計算できませんでした。
計算エラーがでます。
グラフはでます。

https://www.google.com/search?q=No+algorithms+are+implemented+to+solve+equation+sympy&rlz=1CAUHAM_enJP1038JP1038&oq=No+algorithms+are+implemented+to+solve+equation+sympy&aqs=chrome..69i57.9246j0j7&sourceid=chrome&ie=UTF-8

```python
from  sympy import *
x=symbols('x',real=True)
myEq=Eq(5**x-3**x,16)
plot(myEq.lhs,myEq.rhs,(x,-3,3))
print("#",solve(myEq,x))
```
①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
???　タブレット環境で、コピー貼り付けが実行できませんでした。???

https://live.sympy.org/

plotは、縦横比が異なります。

![0png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/d47e2cc8-e8af-87f5-d4b5-74aec7747e2e.png)


# 参考

私のおすすめです。

https://qiita.com/mrrclb48z/items/75904cdc6e84ecef4d03
[Laravel10 + Vite +Tailwind]で本番環境を作る

### やること
Laravelで開発したアプリをEC2を使ってデプロイした際に、本番環境でTailwindが反映させる。
Laravel9からLaravel MixがViteに置き換わり、今回初めて使用したのでその備忘録として記録します。

### Tailwindをインストール
公式の手順に従いTailwindをインストールする

https://tailwindcss.com/docs/guides/laravel#vite

手順い従い、各ファイルに必要なコードを追記する。

### コンパイル設定を追記する
`vite.config.js`ファイルに以下を追記し、コンパイルされるように設定する。

``` vite.config.js
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
    plugins: [
        laravel({
            input: [
                'resources/css/app.css', //ここを追記
                'resources/sass/app.scss',
                'resources/js/app.js',
            ],
            refresh: true,
        }),
```


レイアウトファイルに`@vite('resources/css/app.css')`を追記し、コンパイルされたTailwindが読み込まれるように設定する。

```app.blade.php
<head>
	<title>@yield('title')</title>

	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">

	@vite('resources/css/app.css')
</head>
```

### 本番環境用にbuildする
Viteを使用して、Tailwindをインストールした際に、自動的に`dev`と`build`のスクリプトが設定されているので、buildを使用して、本番環境にbuildする。

```
npm run build
```

```package.json
{
    "private": true,
    "type": "module",
    "scripts": {
        "dev": "vite",
        "build": "vite build"
    },
 
}
```
AgentGPT の最新のデプロイ手順をご希望です。VPS 上で Docker を使用してAgentGPT をインストールする方法を以下に示します。



まず最初に、VPSを用意する必要があります。もし持っていない場合は、自分で手に入れる必要があります。VPSは比較的安価で、強力な性能を持ち、非常に使いやすいです。(https://www.vultr.com/)
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997148/a0523328-b9aa-66fd-157e-36abab67b089.png)
まず、SSH接続ツール（Puttyなど）を使用してVPSに接続します。接続後、以下のコマンドを順番に実行してください。(https://www.putty.org/)
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997148/37cba8bb-090a-6b3b-46d7-7fe4e9775672.png)

Curlがインストールされていない場合は、事前にインストールする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997148/6abd0d76-9f66-d7d0-4f62-1bdb806b7218.png)
または
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997148/026106e8-ba0f-2740-b117-edf0a3a16d4c.png)

次に、Docker のワンクリックインストールスクリプトを使用してデプロイします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997148/32ae0318-63da-6737-44a8-8b4f744292d4.png)
bash <(curl -sSL https://cdn.jsdelivr.net/gh/SuperManito/LinuxMirrors@main/DockerInstallation.sh)

このスクリプトでは、Docker CEのソースチャネルを選択できます。選択肢は8つあります。Docker Engine、Composeなどを選択し、自動的にインストールが行われます。
AgentGPT のオープンソースプログラムをダウンロードしてインストールします：【GitHub プロジェクト】

まず、Gitをインストールします。(https://github.com/reworkd/AgentGPT)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997148/b47aaa7e-812e-699d-5477-e4f577b39553.png)
または
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997148/c89b31f8-832f-fa85-ce2b-c0baeb3e6a9d.png)

ダウンロード後、次のインストールコマンドを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997148/4c7dd583-02a4-3dfa-34b3-d3ac729f49e6.png)

自分のOpenAIのAPIキーを取得します(https://platform.openai.com/account/api-keys)
インストールが完了したら、ブラウザでhttp://xxx.xx.xx.xx:3000を開きます。

以上で、最新のAgentGPTのVPS上でのDockerデプロイ手順が完了しました。簡単にVPSを設定し、AgentGPTを使用することができます。必要に応じて設定をカスタマイズしてください。

注意：AgentGPT の使用には有効な OpenAI の API キーが必要です。デプロイプロセス中に適切な認証情報を提供してください。
AutoGPT の詳細なインストール手順を説明します。


この指南は、AutoGPTというプログラムをあなたのコンピュータにインストールし、実行する方法についてです。以下は、それらの手順を日本語に翻訳したものです。

1.AutoGPTをインストールする前に、以下の事前条件を確認してください。

・Python環境がインストールされており、そのバージョンが3.10以上であることを確認しました。
(https://www.python.org/)
・gitツールがインストールされている場合を確認します。(https://gitforwindows.org/)
・利用可能なOpenAIアカウントを持っていることを確認します。


2.プロジェクトコードをダウンロードします。
・ディレクトリでターミナルを開き、次のコマンドを実行してプロジェクトをクローンします。
```
git clone https://github.com/Significant-Gravitas/Auto-GPT.git
```

・ダウンロードがしたら、次のコマンドでプロジェクトディレクトリに移動します。
cd Auto-GPT
・次のコマンドを実行して必要な依存関係をインストールします。
```
pip install -r requirements.txt
```

3.OpenAIのキ​​ーを取得します。
・自分のキーを作成した後、AutoGPTディレクトリ内の設定ファイル.env.templateを見つけ、その中にあるOpenAIキーを自分のものに置き換えます。
```
(https://platform.openai.com/account/api-keys)
```
4.AutoGPTを実行します。
・上の手順が完了しましたら、ターミナルで以下のコマンドを入力すると、AutoGPTを使用できます。
```　
python -m autogpt
```

・途中でAutoGPTの特定的なエラーを確認したい場合は、オプションにdebug追加ください
```　
python -m autogpt --debug
```
Virtualbox 7.0.8＆Ubuntu22.04


Virtualboxのメジャーアップデートがあったので、更新してみた。
VirtualBox Guest Additionsをインストールしようとしたら、なんか上手く行かない…。



```/var/log/vboxadd-setup.log
/bin/sh: 1: gcc-12: not found
```
ログみたら、gcc-12が入ってないと言われてた。

```
apt install gcc-12
```
gcc-12をインストールしたら、サクッとGuest Additionsがインストールできた。
[Flutter] 上下の操作不可部分にWidgetが隠れないようにする

# 結論: SafeArea Widgetを使う
[これはSafeAreaクラスのドキュメント](https://api.flutter.dev/flutter/widgets/SafeArea-class.html)

### 例: 下記はWebViewを用いてYoutubeを表示するコード
```Dart
 Widget build(BuildContext context, WidgetRef ref) {
  final TopProvider provider = ref.watch(topProvider);
  return Scaffold(
    body: Column(
      children: [
        Expanded(
          child: WebViewWidget(controller: provider.controller),
        ),
      ],
    ),
  );
}
```
<img width="300" alt="ノッチ隠蔽前" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415127/d2e89256-06c5-9469-d049-2beb93da4616.png">

表示したいWidgetをSafeArea Widgetで囲む。
今回ならColumn()を囲む。
```Dart
Widget build(BuildContext context, WidgetRef ref) {
    final Provider provider = ref.watch(provider);
    return Scaffold(
      body: SafeArea(
        child: Column(
          children: [
            Expanded(
              child: WebViewWidget(controller: provider.controller),
            ),
          ],
        ),
      ),
    );
  }
```
<img width="300" alt="ノッチ隠蔽後" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415127/af1cc77b-f57a-0319-7e4e-8420df1d50b3.png">

## ノッチとは
スマホ画面に、カメラやセンサー類を搭載するために設けられたディスプレイのくぼみ部分を指す。

ノッチ(notch)は以下の意味がある。
- 切り欠き
- くぼみ
- 切り目
- 刻み目

## SafeAreaクラスとは
詳細は[こちら](https://api.flutter.dev/flutter/widgets/SafeArea-class.html)
オペレーティングシステムインターフェイスを回避するウィジェット。
また端末画面のノッチなどを避けるために必要な量だけPaddingをセットする。

コードはこちら

https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/safe_area.dart

コンストラクタ
```dart
SafeArea({
  Key? key,
  /// 上下左右のpadding反映
  bool left = true, 
  bool top = true,
  bool right = true,
  bool bottom = true,
  /// 最小のpadding値
  EdgeInsets minimum = EdgeInsets.zero,
  /// 下部障害物出現時に下部のpaddingを維持するか
  /// trueにすると、例えばキーボード表示の際にもpaddingが維持される
  bool maintainBottomViewPadding = false,
  required Widget child
})
```
本番にデータ流し込んでもらっていいすか？→「Class Faker\Factory not found」

## 読む前に

本記事のほとんどは茶番です、ご了承ください

## 登場人物

**後輩**
趣味はYoutubeでひろゆきチャンネルを見漁ること
給料の半分をライブ配信のスパチャに使っている

**先輩A**
先輩Bが嫌いなひろゆき

**先輩B**
先輩Aが嫌いなひろゆき


## 本番リリース前日

後輩「本番リリースって明日すか？　「はい」か「いいえ」で答えてください」

先輩A「はいかいいえです」

後輩「関連会社のデータ流し込まなきゃいけないと思うんすけど、なんかそういうスクリプトってあるんすか？」

先輩A「ないと思います、はい」
先輩A「さっさと専用のSeeder作っちゃえばいいと思いまーす」

後輩「なんすかSeederって」

唐突なChatGPT「LaravelのSeederは、データベースに初期データを挿入するためのクラスです。」

後輩「作ったんでレビューお願いしまーす！」

```CompanySeeder.php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Factories\Sequence;
use App\Models\Company;

class CompanySeeder extends Seeder
{
    private const COMPANIES = [
        ['name' => '会社A', 'address' => '東京都A区'],
        ['name' => '会社B', 'address' => '東京都B区'],
        ['name' => '会社C', 'address' => '東京都C区'],
        ['name' => '会社D', 'address' => '東京都E区'],
        ...
    ];
    public function run()
    {
        Company::factory()
            ->count(count(self::COMPANIES))
            ->sequence(fn ($sequence) => self::COMPANIES[$sequence->index])
            ->create();
    }
}
```

```DatabaseSeeder.php
class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call([
            CompanySeeder::class,
        ]);
    }
}
````

先輩A「factory使って効率的に書いてて優秀っすね」
先輩A「いいと思いまーす」

## 本番リリース当日

先輩B「本番サーバー入ってシーダー実行してもらっていいすか？」

後輩「`php artisan db:seed`っと」
後輩「`Class Faker\Factory not found`のエラー出たっすね」

先輩B「`composer.json`の`"require-dev"`に`"fakerphp/faker`ってあると思うんですけどー」

```composer.json
{
    "require-dev": {
        "fakerphp/faker": "^1.19"
    }
}
```

先輩B「本番で`composer install`する時に`--no-dev`のオプション付けているんでこいつ入ってないんすよね」

後輩「はっ」

先輩B「factoryじゃなくてEloquentで書いてもらっていいすか？」

後輩「なんすか？Eloquentって」

先輩B「だめだコレ...」

後輩「あ…すいません、なんか。言葉を知らなくて」
後輩「なんかその…例えば『Eloquent』って言葉の意味を僕は知らないんですけど、一般の人的にも多分そんなに常識的な言葉じゃないですよね？ それを持ち出して『だめだコレ』って言われても…失礼じゃないですか？」

先輩A「なんだろう...後輩いじめるのやめてもらっていいすか？」

先輩B「さーせん」

## 結論

dev用パッケージを本番でもインストールするのが何だか気持ち悪いのでBulkInsertで

```CompanySeeder.php
class CompanySeeder extends Seeder
{
    private const COMPANY_NAMES = [
        ['name' => '会社A', 'address' => '東京都A区'],
        ['name' => '会社B', 'address' => '東京都B区'],
        ['name' => '会社C', 'address' => '東京都C区'],
        ['name' => '会社D', 'address' => '東京都D区'],
    ];
    public function run()
    {
        Company::insert(self::COMPANY_NAMES);
    }
}
```
どのカラムにインデックスを作成するべきか？のお話。

この記事は[Qiita Engineer Festa 2023](https://qiita.com/official-campaigns/engineer-festa/2023) 参加記事です。
　
### この記事で書くこと
DB設計をする際に、インデックスを作成するべきカラムの勘所について書きます。
　
### この記事で書かないこと
本来は、しっかり考えてインデックスを作成するべきですが、得てしてケースバイケースになるので、勘所以外の考え方はこの記事では書きません。

# どのカラムにインデックスを作成するべきか？のお話。

## そもそもインデックスってな〜に？

ChatGPTさんに聞いてみましょう。

> データベース設計におけるインデックスは、データベース内のデータを高速に検索するための仕組みです。データベースに大量のデータが格納されている場合、特定のデータを見つけるためには全体を順番に探索するのではなく、効率的な方法で目的のデータを見つける必要があります。そのために、インデックスが利用されます。
> 
> インデックスは、特定のカラム（列）やフィールドに対して作成されます。例えば、顧客の名前や商品のカテゴリなどです。インデックスは、そのカラムの値と、それが存在するデータの位置情報（物理的なディスク上の場所など）を関連付けるデータ構造です。
> 
> インデックスが作成されると、データベースはそのインデックスを使用してデータを効率的に検索します。インデックスは通常、二分木やBツリーなどのデータ構造を使用して実装されます。これにより、データベースは迅速かつ効率的に目的のデータを見つけることができます。

![インデックス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394384/10b0a60d-d856-34c1-5a48-31a2216a42ea.png)

何となく分かりましたね。

## インデックスを作成すべきカラムの勘所4選

### その１：データのパターンの多いカラム

フラグやステータスのようにパターン数が決まっていたりする項目はインデックスの効果が望みにくいです。
その **カラムに入るであろうデータの中身のパターンが多い** と思われるカラムにインデックスを貼ると効果的です。

例えば、フラグのようにtrue・falseの２パターンしか入らない項目は効果が薄いですが、100パターン・1000パターン入る項目はインデックスの効果が高めです。

### その２：パターンにばらつきがあるカラム

その1の発展形ですが、カラムに入るであろうデータの中身のパターンが多い上に、その **パターンのばらつきがある（=偏りが少ない）** とインデックスの効果が高いです。

例えば、そのカラムには100パターンのデータがはいるが、ほとんどがAというデータが見込まれる場合は効果が薄いですが、バラバラのデータになることが予想されるカラムであれば効果が高いです。

### その3：Keyがついていないカラム　※一部DBによる違いあり

DBにもよりますが、制約としてPrimaryKey、UniqueKey、ForeignKeyを付けている場合、そのカラムには自動的にインデックスが付与されることがあります。
その場合、明示的にインデックスを作成する必要はありません。
**（使用しているDBで別途確認しましょう）**

### その4：SQL文で頻繁に使うカラム

アプリケーションなどからSQL（主にSELECT文）を発行する際に、 **頻繁に使われるカラム** にインデックスを作成すると効果が高いことが多いです。
例えば、

* テーブル結合する際のON句に使われる項目
* 絞り込みをする際のWHERE句の条件に使われる項目
* 並び替えをする際のORDER　BY句で使われる項目

などで頻繁に使われることが予想される場合、インデックスによる効果が高いです。

# まとめ

インフラ担当やDBAなど専門的な役割の場合を除いて、初期開発時やパフォーマンスチューニング時くらいしかDB設計に思いを馳せる機会は少ないと思います。
そのため、初学者はもちろんエンジニア歴の長い方でも意外とインデックスの勘所について経験や知識を持ち合わせていないことが少なくないと思います。

SQLの実行結果は環境やデータの状態によって変わるので、実務ではEXPLAIN（実行計画）を読み解きながら関わっていくことが多いですが、初学者の勘所として参考にしてもらえればよいかと思います。
[AtCoder] Beginners Selection - ABC085B - Kagami Mochi [Elixir Livebook]

## はじめに

AtCoder の Beginners Selection コンテスト ABC085B - Kagami Mochi 問題を Elixir Livebook で回答しました

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/tree/main/livebooks/atcoder/abc085/abc085_b

## 問題

https://atcoder.jp/contests/abs/tasks/abc085_b

## 入出力例

以下のようになれば OK です

```elixir
"""
4
10
8
8
6
"""
|> Main.solve()
|> then(&(&1 == 3))
```

```elixir
"""
3
15
15
15
"""
|> Main.solve()
|> then(&(&1 == 1))
```

```elixir
"""
7
50
30
50
100
50
80
30
"""
|> Main.solve()
|> then(&(&1 == 4))
```

## 回答１

```elixir
defmodule Main do
  def main do
    :stdio
    |> IO.read(:all)
    |> solve()
    |> IO.puts()
  end

  defp split_lines(lines) do
    lines
    |> String.trim()
    |> String.split("\n")
  end

  def solve(input) do
    input
    |> split_lines()
    |> tl()
    |> Enum.uniq()
    |> Enum.count
  end
end
```

先頭以外を重複排除した数です

実行時間は 340 ms でした

## 回答２

```elixir
defmodule Main do
  def main do
    :stdio
    |> IO.read(:all)
    |> solve()
    |> IO.puts()
  end

  defp split_lines(lines) do
    lines
    |> String.trim()
    |> String.split("\n")
  end

  def solve(input) do
    input
    |> split_lines()
    |> tl()
    |> Keyword.new(fn x -> {String.to_atom(x), 0} end)
    |> length()
  end
end
```

キーワードリストで重複削除しました

実行時間は 339 ms でした

## まとめ

選択肢がほぼないですね
DAY1　HTML入門

# DAY1 HTML入門
20230626の記録
病院の待ち時間が長かったので、kindleで「初めてのHTML入門読本 Kindle版」を読みました。
<a href="https://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AEHTML%E5%85%A5%E9%96%80%E8%AA%AD%E6%9C%AC-EguchiYuuki-ebook/dp/B0C3DLG49T?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=200Q9YPXADUKH&keywords=html&qid=1688363119&s=digital-text&sprefix=html+%2Cdigital-text%2C195&sr=1-6&linkCode=li2&tag=sakura010e-22&linkId=a028e1729acc242e32d376e777760b3b&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B0C3DLG49T&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=sakura010e-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=sakura010e-22&language=ja_JP&l=li2&o=9&a=B0C3DLG49T" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

htmlがどうやってできたのか、ということから説明してあったのでわかりやすかったです。
指示通りにVSCで記述してみました。

自分で打った文字が形になっていくのは面白かったです:relaxed:
打ったコードはchatgptに見せて、添削してもらったりしました。
綴りの間違いや、不必要な終了タグを指摘してくれて助かりました。

cssはまだ使ってない状態のシンプルなhtmlから始めました。
次は、cssも勉強したいので
「HTML&CSS コーディング・プラクティスブック 1 実践シリーズ [プリント・レプリカ] Kindle版」をやってみる予定です。
どちらもkindle unlimitedにあるので助かりますね:two_hearts:
アンリミテッドにある期限？が終わらないうちにやりたいな。
パラパラっとみてみたところ、私がやりたいスマホやタブレットに対応した作り方らしくて（レスポンシブWebデザイン？）めっちゃ勉強になりそうです。
その代わりちょっと難しいかもしれないけど、頑張ります。
無理しない程度に、仕事の日は1～2時間、休日は4時間くらい作業出来たらいいな～と思ってます。
（この時間設定についてはchatgptと相談して決めました！）
公開する作品自体もつくらないとね:hugging:
HumanActivityRecognitionSurvey-CaseStudy5

# inertial-based human activity recogniton with transformers

2021年に発表された論文。  

被引用数は18件で、ACCは89.6%と精度は高くはないがTransformerを使用したユースケースとして有用であると判断した。

以下はTransformerのアーキテクチャである。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487085/fed9fed6-1d28-3d4c-12d3-43b9e4aeb0b7.png)

前処理について、
Conv．Backboneでは、4層の畳み込み層（活性化関数はGERU）で埋め込みを行う。  
それにBERTと同じxclsを加え、
位置エンコーディングは学習可能な埋め込みを用いている。

ハイパーパラメータは以下の通りであった。  
ハイパーパラメータ探索方法・探索結果については記述がなかった。

|params|d|L|head|Dropout rate|
|------|-|-|----|------------|
|value |64|6 |8 |     0.1    |

### ソースコード

https://github.com/yolish/har-with-imu-transformer

### 元論文
https://ieeexplore.ieee.org/document/9393889
【Salesforce認定資格】Salesforce Certified Platform Developer Iの受験結果

※本記事は2021年03月に受験した「Salesforce Certified Platform Developer I」の振り返りを記載しています。

## はじめに
[前回の受験](https://qiita.com/HNakazawa/items/68f453bb90174fb1b45a)で落ちたSalesforce Certified Platform Developer Iを受験しました。
前回の受験から1週間ですが、時間を空けてしまうと覚えていたものを忘れていってしまうので早めに受験しました。

## 試験結果
結果は __「合格」__ でした。
試験に関しては時間は余裕があったので、3回程見直しをしました。
前回と同じような問題が出題されていたので、助かりました。

| 受験料 | 試験時間 | 設問数 | 合格ライン | | 受験日 | 正答率 | 所要時間 |
| :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: |
| 20,000円 | 105分 | 60問 | 65% | | 2021/03/27 | 93.12% | 75分 |

内訳を見ると、前回と比較してプロセスの自動化とロジックとユーザインターフェースの点数が向上し、1週間の学習成果が顕著に表れていました。

| 試験内容 | 内訳 | 設問数 | | 正答率 |
| :-- | :-: | :-: | :-: | :-: |
| SALESFORCEの基本 | 7% | 4.2問 | | 100% |
| データモデリングおよび管理 | 13% | 7.8問 | | 87% |
| プロセスの自動化とロジック | 38% | 22.8問 | | 100% |
| ユーザインターフェース | 25% | 15.0問 | | 86% |
| テスト、デバッグ、リリース | 17% | 10.2問 | | 90% |

![Salesforce_Certified_Platform_Developer_I_02_テスト結果詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/f01f6862-6e3b-2043-709f-882f4ca3fb36.png)

## 学習方法
学習期間は全体を通して4ヶ月程度で、[前回の受験](https://qiita.com/HNakazawa/items/68f453bb90174fb1b45a)からの1週間はコーディングばかりしていました。
内容としてはトリガで積み上げ集計を作ったり、関連リスト風の画面を作ったりと、正解がわかっているものの再現を中心に行いました。

## 学習の意識付け
前回の受験の結果を踏まえた問題の復習と、プロセスの自動化とロジックとユーザインターフェースに絞った学習を行いました。
大半が同じような問題だったことから、受験終わりにしっかりと復習することが落ちた時には重要だと思います。
HumanActivityRecognitionSurvey-CaseStudy4

# Inertial-Measurement-Unit-Based Novel Human Activity Recognition Algorithm Using Conformer

2022年に発表されたConformerをHARに適用した論文。  
2023/6月に調査した限りではこのConformerがSoTA（Acc:98.1%）であった。  

ConformerはConvolutuional+Transformerという意味。  
その名の通り、畳み込み演算を従来のTransformerの構造に加えたもの。  

Conformerは音声認識の分野でSoTAを達成したモデルであったがHARでもSoTAを達成した。    

処理としてはSMOTE（後述）によってデータ拡張を行い、データのサンプル数を増やす。  
その後、Conformerにて学習・推論を行う。  

SMOTEについて。  
SMOTEはthe synthetic minority oversampling techniqueの略。  

アルゴリズムは以下の通り。

0. 複数チャネルのデータの場合には下の画像のようにFlattenする。
1. クラスCkについてサンプル一つを選ぶ。（0≦ｋ≦5）  
2. KNN(K=10)によってxkを生成する。
3. xn=x + random(0,1)×|x - xk|によって新サンプルxnを生成しCkに加える。  
4. クラスCkのサイズがN(=12000)になるまで1-2を繰り返す。  

結果、概算ではあるが27454個のデータを12000×6=72000個のデータに拡張することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487085/8e3e7095-0eb9-c9c9-6805-34e16e4a01fd.png)


論文にSMOTEによって拡張したデータと拡張していないデータでそれぞれ学習させた場合のスコアがTable2に記載されていた。  
そこではConformer、Transformer、1D-CNNがモデルとして例示されており、いずれもSMOTEでデータ拡張を行ったデータで学習を行ったほうが精度が高かった。  
つまり、一般に（少なくともHARのWISDMデータセットにおいては）学習をさせる際にこのデータ拡張を行ったほうが良さそうである。


Conformerについて。  

Conformerのアーキテクチャ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487085/3bde2d3a-be21-0f61-107e-260697cbb9d8.png)

アーキテクチャ以上の説明は特にないが、チャネルがdで普段のdがwになっている。  
Transformer的に言い換えるとトークン数がdでトークン長がwである。  

これをViTのハイブリットと同じ要領で特徴量抽出、埋め込みを行い、Conformer層に渡している。
Conformer層のFFNは1/2倍してから残差写像に用いている点は注意が必要かもしれない。
その後、Conformerから出力されたシーケンスをLatent sequence aggregation層でベクトルに変換する。  
最後にFFN（隠れ層活性化関数GERU、出力層Softmax）でクラス分類を行う。

ハイパーパラメータ探索はグリッドサーチを用いている。  
探索結果を以下の表に示す。
| param | dim | head | block | FFN expand factor | Con expand factor |Dropout rate| batch size |
|-------|-----|------|-------|-------------------|-------------------|---|------------|
| num   | 256 | 16   | 8     | 2                 | 2                 |0.1|     8     |


expand factorはdimと比べた隠れ層の相対的な大きさのことなのかと思う。  
（論文には説明見つけられなかった）  

Conformerの場合Blockの数が2個で良いというのは注目すべきポイントだろう。  

また、Con expand factorはチャンネルの拡張率を表しており、6チャンネルに拡張しているということになる。
ViTでは16チャンネル程度を扱っており、Attention is All You NeedでのTransformerでは26チャンネル程度であることからこの論文では、ずいぶんと少ないチャンネル数に拡張していることが分かった。
（Attention is All You Needについては画像のAttention Visualizationsを参考にした。）

結果としてConformerモデルで98.1%（データ拡張後）、Transformerモデルでも97.9%（データ拡張後）のスコアを叩き出し、SoTAを達成した。


## 元論文
https://www.mdpi.com/1424-8220/22/10/3932
高校生が「お名前.com ダイナミックDNSクライアント API」つくってみた。

お名前.comでは、DDNS用のIPアドレス更新ツールが[公式で提供](https://help.onamae.com/answer/7920)されています。しかし、提供されいるのはWindows版のみなので、macOSやLinuxなどでは利用することができません。

少し調べてみると、非公式の方法で実装できることが分かりました。
ということで、(n番煎じですが)APIを叩くだけでIPアドレスが更新される「お名前.com ダイナミックDNSクライアント API」を作成しました！

https://github.com/glyzinieh/onamae-ddns-API

## 使い方

WebAPIなのでPythonが動くサーバーが必要になります。
適当に用意してください。私は[Render.com](https://render.com/)を利用しています。
（準備が整い次第、サーバーを公開する予定です。）

GitHubから[最新版](https://github.com/glyzinieh/onamae-ddns-API/releases)をダウンロードし、以下のコマンドを実行してください。
```sh
$ pip install -r requirements.txt
$ uvicorn api:app --host 0.0.0.0
```

表示されたリンクにアクセスすると、ドキュメントが表示されます。


以下のリンクにアクセスするだけで、対象のAレコードが更新されます。
`http://***.***.***.***/update/?userid=(お名前ID)&password=(パスワード)&hostname=(ホスト名)&domname=(ドメイン名)&ip=(IPアドレス)`

ご不明点や不具合等ありましたら、お気軽にお問い合わせください。

## 参考

参考~~というか丸パクリ~~です。ありがとうございます！

https://github.com/tom-tan/onamae-ddns-client

https://qiita.com/ats124/items/59ec0f444d00bbcea27d

## 開発の経緯

ここからは戯言です。読み飛ばしていただいて構いません。

Synology NASでWEBサイトを作成しています。タスクスケジューラーでコマンドを設定して、更新することもできますが、なんか怖いのであまりしたくありません。
そこで、APIを叩くだけで更新できれば便利なのでは？と思い、開発しました。

### 技術選定

Googleで検索すると、上の方に[tom-tan/onamae-ddns-client](https://github.com/tom-tan/onamae-ddns-client)がヒットしました。Pythonの経験があることもあり、こちらを利用させていただくことにしました。

Webフレームワークは、普段Flaskを使っていますが、FastAPIというAPIに特化したフレームワークがあることを知り、使ってみることにしました。

### 2to3

```sh
$ 2to3 -w client.py
```

バイナリ関連の仕様変更があった模様で、エラーが発生した一部を修正しました。

https://github.com/glyzinieh/onamae-ddns-API/commit/58514b12088869f361bc142b793ea46a2514da7f?diff=split#diff-1ebfaf6cb3592166b73835fa82333cb7109e7c624865c0039a7b22ff34aa27fa

### 実装

- FastAPIが思ったより簡単で楽でした。
- 例外処理に苦戦しました。

### サーバー

自宅サーバーを立てることもかんがえましたが、本末転倒なのでレンタルサーバーを使うことにしました。

これまではHerokuを使うことが多くありましたが無料枠が無くなってしまっため、他のサービスを検索してみたところ[Render.com](https://render.com/)を見つけました。

https://qiita.com/mycndev/items/fc7a8fecd7d0b0d09828

GitHubで連携しただけでデプロイ完了。めちゃくちゃ便利です。
ひらがなとカタカナの相互変換機能

# 初めに
今回はひらがなをカタカナに、カタカナをひらがなに変換する機能を紹介していきます
### 本文
```kotlin
fun String.convertKana(): String {
    val sb = StringBuilder(length)
    this.forEach {
        when (it) {
            in '\u3041'..'\u3093' -> {
                sb.append(it + 0x60)
            }
            in '\u30a1'..'\u30f3' -> {
                sb.append(it - 0x60)
            }
            else -> sb.append(it)
        }
    }
    return sb.toString()
}
```
### 最後に
今回はカナ文字の相互変換機能を備忘録として記事にしました
どなたかのお役に立てれば幸いです
【Python】ひらがな カタカナ ペア

ひらがなとカタカナのペアをlistにしました。

```python
hiragana_katakana_pairs = [('あ', 'ア'),
 ('い', 'イ'),
 ('う', 'ウ'),
 ('え', 'エ'),
 ('お', 'オ'),
 ('か', 'カ'),
 ('き', 'キ'),
 ('く', 'ク'),
 ('け', 'ケ'),
 ('こ', 'コ'),
 ('さ', 'サ'),
 ('し', 'シ'),
 ('す', 'ス'),
 ('せ', 'セ'),
 ('そ', 'ソ'),
 ('た', 'タ'),
 ('ち', 'チ'),
 ('つ', 'ツ'),
 ('て', 'テ'),
 ('と', 'ト'),
 ('な', 'ナ'),
 ('に', 'ニ'),
 ('ぬ', 'ヌ'),
 ('ね', 'ネ'),
 ('の', 'ノ'),
 ('は', 'ハ'),
 ('ひ', 'ヒ'),
 ('ふ', 'フ'),
 ('へ', 'ヘ'),
 ('ほ', 'ホ'),
 ('ま', 'マ'),
 ('み', 'ミ'),
 ('む', 'ム'),
 ('め', 'メ'),
 ('も', 'モ'),
 ('や', 'ヤ'),
 ('ゆ', 'ユ'),
 ('よ', 'ヨ'),
 ('ら', 'ラ'),
 ('り', 'リ'),
 ('る', 'ル'),
 ('れ', 'レ'),
 ('ろ', 'ロ'),
 ('わ', 'ワ'),
 ('ゐ', 'ヰ'),
 ('う', 'ウ'),
 ('ゑ', 'ヱ'),
 ('を', 'ヲ'),
 ('ん', 'ン'),
 ('ゔ', 'ヴ'),
 ('が', 'ガ'),
 ('ぎ', 'ギ'),
 ('ぐ', 'グ'),
 ('げ', 'ゲ'),
 ('ご', 'ゴ'),
 ('ざ', 'ザ'),
 ('じ', 'ジ'),
 ('ず', 'ズ'),
 ('ぜ', 'ゼ'),
 ('ぞ', 'ゾ'),
 ('だ', 'ダ'),
 ('ぢ', 'ヂ'),
 ('づ', 'ヅ'),
 ('で', 'デ'),
 ('ど', 'ド'),
 ('ば', 'バ'),
 ('び', 'ビ'),
 ('ぶ', 'ブ'),
 ('べ', 'ベ'),
 ('ぼ', 'ボ'),
 ('ぱ', 'パ'),
 ('ぴ', 'ピ'),
 ('ぷ', 'プ'),
 ('ぺ', 'ペ'),
 ('ぽ', 'ポ'),
 ('ぁ', 'ァ'),
 ('ぃ', 'ィ'),
 ('ぅ', 'ゥ'),
 ('ぇ', 'ェ'),
 ('ぉ', 'ォ'),
 ('っ', 'ッ'),
 ('ゃ', 'ャ'),
 ('ゅ', 'ュ'),
 ('ょ', 'ョ'),
 ('ゎ', 'ヮ')
]
```
AWSアカウント作成後にやっておきたい初期設定（IAMユーザーの作成）

AWSアカウント作成と多要素認証（MFA）設定後に行うべき作業の一つに、IAMユーザーの作成があります。ルートユーザーは全機能に対する管理者権限を持つため、日々の作業用としてIAMユーザーを作成します。そうすうることで、途中でなんかとち狂っても修正が効くわけです。

## ハンズオンでやってみる

### 1 IAMユーザのパスワードのポリシーから強化していく
まずはIAMダッシュボード画面にて、左側のアカウント設定を押下します。デフォルトの状態だと安全ではにため、パスワードのルーr８をつよくします。パスワードポリシーを変更するのボタンを押下してください。
そして実際のパスワードの最小文字数を変更したり、”1文字以上のアルファベットと大文字を必要とする”などの部分にチュックを入れたりする。
![スクリーンショット 2023-06-27 午後1.39.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/7b31af4b-605a-2d25-4c81-3e3932d6d273.png)
図の状態になったら「変更の保存」を押下する。これでパスワードポリシーが変更されました。

### 2　Security Token Service(STS)の設定を変更する

上記の画面でパスワードポリシーを変更したのち、下にスクロールします。
私は勉強用なので、アジアパシフィック（東京）、米国東部（バージニア北部）、グローバルエンドポイント以外は全て無効化にしました。

### 3　ユーザーグループを作成する
上記の画面から左サイドバーの「ユーザーグループ」を押下します。そして画面右上にあるグループ作成を押下します。あとはグループ名などを入力していきます。

以下では、とりあえず**admin**　としていきます。
![スクリーンショット 2023-06-27 午後1.48.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/91aa8444-1d72-ed56-a9cb-9d6f36910e4e.png)

### 4 権限を付与していく
AdministratorAccessで検索し、左側にあるチェックボックスにチェックを入れて、右下にある「グループを作成」を押下する。以下のような画面が表示されれば成功です。

![スクリーンショット 2023-06-27 午後1.52.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/5f45901a-b753-ed93-3976-2acf5e4339f0.png)

ロード時間が長ければリロードを押下すると、ユーザーが０人と表示されます。

### 5 ユーザーを作成
左サイドバーから「ユーザー」を選択します。次に「ユーザーを追加」ボタンを押下します。適当なユーザー名を入力します。

### 6 このアカウントについてもMFAを設定しよう
新たに作成したユーザーアカウントに対してもMFAを設定することをお勧めします。ルートユーザーのMFA設定と同様の手順で設定を行います。詳細な手順は割愛します。
NVについてことはじめの忘備録(ESP32でがんばります）

 
# ***とりあえずミリタリースペックの夜眼鏡が欲しい***
つまりNV(Night Vision)をESP32で自作しようの会です。会員は自分1名です。

けどアナログ高すぎる上にロシア-ウクライナ戦争で肝心の増倍管の入手も困難となり、
もうこれ作った方が早いだろ！！となって重い腰を上げた次第です。
[実際のNVはこんな感じ]

#### 本記事を悪用しないでください。(マジで）

ほぼ初投稿となるので、Markdown記法については
[Markdown_チートシート]
@tbpgr(てぃー びー)氏のMarkdownサンプルから引用させて頂いています。こういうのめちゃ助かる。

#### 大前提：アナログの夜眼鏡よりも安価・かつ運用が気軽なナイトビジョンを作成する。
★性能は割と落ちてもいいだろという気持ちで割り切っていきます★

___実現したいこと___
1. ESP32-CAMを用いてナイトビジョンのWebCam化
1. I2CもしくはSPIにOV2460のデータストリームの引き出し＆SDストレージ記録でアクションカム
1. 引き出したデータストリームのLCD表示
1. かっこいいNV外筐をモデリング・3Dプリンタで製作
1. 上記のユニットを乾電池・リポバッテリなどでモバイル化
1. 初期設計をきちんとやり、Step by Step での手戻りを最小限に抑える

上記に分けて実施していこうと思います。

__1. ESP32-CAMを用いてナイトビジョンのWebCam化__

これは実はESP32-CAMの基礎機能で実装されています。
[lang-ship]さんの記事を参考にArduinoIDEを使ってサンプルスケッチを描いていきます。
(引用表示不要とのことですが、忘備録ですんで......。感謝ァ!)

とりあえず互換品でいいかぁ...とDiyStudioさんのこちら
https://amzn.asia/d/hR45ah3
購入してみたのですが、ESP32-SのチップがAI thinkerのものではなくて技適的にNG！！！
これはいけない。ということでAmazonの返品を利用してドナドナ。手元のサンドボックスが...泣

今回の記事はここまでとします、変わりのESP32が手元に来るまでに細かい電源仕様などを調査して
記事にしていけたらと思っています。

先が長いですが、どうぞよろしくお願いいたします。

[実際のNVはこんな感じ]:https://www.nv-walker.com/dtnvs
[Markdown_チートシート]:https://qiita.com/tbpgr/items/989c6badefff69377da7
[lang-ship]:https://lang-ship.com/blog/work/esp32-cam-fnk0060/
【Salesforce認定資格】Salesforce Certified Platform Developer Iの受験結果

※本記事は2021年03月に受験した「Salesforce Certified Platform Developer I」の振り返りを記載しています。

## はじめに
SalesforceのPartner要件を満たすために必要だったため、要件の中で一番興味があったSalesforce Certified Platform Developer Iを受験しました。
前回の認定アドミニストレーターの受験から約4ヶ月空きましたが、実務経験（Apexを書く機会はありませんでしたが）も少しは積むことができ、Salesforceのエンジニアとしては着実に成長できているかと思ったタイミングで受験しました。

## 試験結果
結果は __「不合格」__ でした。
試験に関しては時間は余裕があったので、3回程見直しをしました。
ただ、何度見直してもわからない問題があり、学習不足が顕著でした。

| 受験料 | 試験時間 | 設問数 | 合格ライン | | 受験日 | 正答率 | 所要時間 |
| :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: |
| 20,000円 | 105分 | 60問 | 65% | | 2021/03/20 | 63.15% | 73分 |

内訳を見ると、自信のあったプロセスの自動化とロジックとユーザインターフェースが頗る悪く、もう少しプログラムを書いて学習を行う必要があると感じました。

| 試験内容 | 内訳 | 設問数 | | 正答率 |
| :-- | :-: | :-: | :-: | :-: |
| SALESFORCEの基本 | 7% | 4.2問 | | 75% |
| データモデリングおよび管理 | 13% | 7.8問 | | 87% |
| プロセスの自動化とロジック | 38% | 22.8問 | | 56% |
| ユーザインターフェース | 25% | 15.0問 | | 40% |
| テスト、デバッグ、リリース | 17% | 10.2問 | | 90% |

![Salesforce_Certified_Platform_Developer_I_01_テスト結果詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/5077b6cb-d20c-d0c0-7f2c-da273a5e4b08.png)

## 学習方法
学習期間は全体を通して4ヶ月程度で、1ヶ月間は[Trailhead](https://trailhead.salesforce.com/ja/today)を中心に学習を進め、その後の2ヶ月間は[Apex開発者ガイド](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_dev_guide.htm)を流し読みし、最後の1ヶ月間はウェビナー受講やApexプログラムの確認に費やしました。

https://trailhead.salesforce.com/ja/users/welcome4/trailmixes/salesforce-platform-dev-1

実務があったため、平日は1日あたり5時間、休日は1日あたり12時間くらい学習していました。

## 学習の意識付け
マークアップやデザインの経験がなかったので、ユーザインターフェースは最初から捨てていました。
Apexがオブジェクト指向言語なので、標準のクラスを目にしておくことを重視して学習を進めました。

不合格だった原因としては、プロセスの自動化とロジックに振るつもりでユーザインターフェースを捨てたにも関わらず、プロセスの自動化とロジックの点が取りきれなかったことにありました。
また、暗記が苦手ということを理解しておきながら暗記的な学習を進めてしまい、プログラムをもっと書いてイメージを掴ませる必要がありました。