OmniAICreator/Qiita-1.07M huggingface dataset:
【MATLAB】gplotmatrixで上半分のパネルを消す

# はじめに
MATLABのgplotmatrixはグループ別散布図行列を書くための関数で，大変便利です．

対角線上のパネルをはさんで上と下には全く同じ散布図がプロットされる仕様になっていますが，正直どちらかだけで十分です．

ということで，上半分のパネルを消す方法を，備忘録を兼ねてまとめます．

基本的には，英語版のMATLAB Answersで提案されていた方法をそのまま真似していますが，凡例の表示等を少しだけいじっています．

https://jp.mathworks.com/matlabcentral/answers/350422-only-upper-triangle-part-of-plotmatrix-function

# デフォルトの見た目

例えば，以下のような図が描けます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394277/6278c086-fa71-c281-670d-2b0b5b45ddea.png)

```example.m
load fisheriris

clr = lines(3); % 色
sym = '.'; % シンボル
sz = 10; % マーカーサイズ
doleg = 'on'; % 凡例を表示するかどうか
dispopt = 'stair'; % 対角線のパネルにヒストグラムを表示するか
xnames = ["A","B","C","D"]; % 変数名

[h,ax,bigax] = gplotmatrix(meas,[],species,clr,sym,sz,doleg,dispopt,xnames);
```

# 改良版

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394277/f1b6ef92-947f-61ff-a394-e0262043e9ae.png)


以下のコードで上半分のパネルを消去します．

デフォルトでは凡例は一番右上のパネルに表示されますが，凡例も一緒に消えてしまうので，消去する前に凡例を取得しておき，最後に一番右下のパネルに表示させています．

```
[~,n] = size(meas);
lgd = ax(1,n).Legend.String; % 右上のパネルから凡例を取得する

% 上半分のパネルを消す
for plot_row = 1:n
    for plot_col = plot_row:n
        delete(ax(plot_row,plot_col));
    end
end

% 左下のパネルに凡例をつける
legend(ax(n,1),lgd)
```

あらかじめ`dispopt`を`none`に設定し，対角線上のパネルのヒストグラムを非表示にしておくとより見た目がすっきりします．

```
dispopt = 'none'; % 対角線のパネルにヒストグラムを表示するか
```

欲を言えば凡例を右上の余ったスペースに表示させたかったですが，今回はこれでよしとします．
OpsRamp ワークフローのStartイベントについて

本記事では、OpsRamp ワークフローのStartイベントについて説明します。

# 概要
OpsRampには、ワークフローをトリガする3種類「Start Event」、「Signal Start Event」、「Timer Start Event」のStartイベントがあります。

# 設定の説明
「Start Event」、「Signal Start Event」、「Timer Start Event」には以下のような意味があります。
- Start Event

このイベントは、「actionProcess API」、「First Response」、「Inbound Integration」、「Call Activity Event」からトリガすることが可能です。
![start.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/94e9a3f0-3959-20aa-7ca6-3349111194e3.png)

Add Custom Input: 任意の文字列をワーフクローのインプットとして設定することができます。
![start-properties.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/24923ef4-4471-b378-d29f-a4115cc972d9.png)

- Signal Start Event

このイベントは「Alert」、「Resource」、「Incident」の作成・更新時をトリガにすることができます。
![signal-start.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/70f13197-c67c-3064-9ec7-dda07c932ffb.png)

Filter Criteria: トリガするための条件を設定することができます。「Alert」、「Resource」、「Incident」でそれぞれ使用できる[変数](https://docs.opsramp.com/solutions/remediation-automation/process-automation/process-definitions/variables/#available-variables)があります。
![signal-start-properties.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/173899e8-6a71-91be-d6c2-5a25b2b454b8.png)

- Timer Start Event

このイベントは、時間をトリガにすることができます。
![timer-start.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/fe5e7ee4-29a3-6f8a-0828-b31148abac0f.png)

Start Date: 
Ends: 終了条件を設定します。
    - Never: 終了しない
    - After: 指定回数繰り返したら終了
    - On: 指定した時刻に終了
Recurrence Pattern: 繰り返しパターンを指定、「Minute」、「Hourly」、「Daily」、「Weekly」、「Monthly」から選択します。
Repeats Every: 「Recurrence Pattern」で指定した単位で繰り返し間隔を設定します。
![timer-start-properties.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/d3033492-bb9e-077c-e3f8-515ea35ffe57.png)

---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
Splunkの基本機能である「Forwarder:フォワーダ」を深堀ってみよう

### ▼前提条件
これから頻出する名称は、表記が違うだけで同じなので気にしないでください。
・フォワーダ　＝　Forwarder
・ユニバーサルフォワーダ　＝　Universal Forwarder（UF）
・ヘビーフォワーダ　＝　Heavy Forwarder（HF）
・ライトフォワーダ　＝　Light Forwarder（LF）

### ▼まずフォワーダとは何かおさらい
分析対象データを収集し、Splunkサーバへ転送する機能を持ったエージェントのこと。

※__エージェント__：代理や仲介を表す。ユーザーの代理としてコンピュータ処理を行う機能。ソフトウェアやシステム。

### ▼フォワーダの種類と詳細説明
フォワーダは「__ユニバーサルフォワーダ__」「__ヘビーフォワーダ__」「__ライトフォワーダ__」の３種類あります。

・__Universal Forwarder（UF）__：WindowsOSもしくはUnix系OSで動作するエージェント。
データの収集および転送に特化した機能が提供される小さいサイズのインストーラー。
⇒シンプルにデータ収集・転送を行う場合には、Universal Forwarderの利用がお勧めです。

・__Heavy Forwarder（HF）__：収集したデータで条件一致したデータのみを転送してくれるフォワーダ。
転送以外にインデックスやサーチ、加工が可能。
⇒転送時にデータの一部をマスク化（隠す）したり、高度なフィルタ処理を行う場合におすすめ。

・__Light Forwarder (LF)__：HFより機能減らした旧式フォワーダ。公式では非推奨でほとんど使用されていない。

### ▼Splunk公式で推奨しているフォワーダは？
　ヘビーフォワーダよりも**ユニバーサルフォワーダ**を優先的に使用することを推奨している。
⇒フィルタリングはインデクサーですべて可能なので、ネットワーク帯域幅を大量に消費しなくて済むめ。構成もシンプルにできる。

#### ●なぜヘビーフォワーダを推奨しないのか？
　ヘビーフォワーダでデータをフィルタリングすると、インデクサーが処理する際に**ネットワークIOが増加**してしまう。
⇒HFが解析や処理の済んだデータをネットワークに送信する。
　Rawデータだけでなく、HFが解析処理済みのメタデータ等もネットワークに送ってしまうためCPUやメモリ使用率が上がってしまう。

・__ネットワークIO__：I/Oは、Input/Outputの略で「入出力」。コンピューター情報を入力～出力する処理の総称。

#### ●ヘビーフォワーダの推奨タイミング
　ヘビーフォワーダは以下の場合のみに使用すること。

**①**データの大部分をソース側で破棄する。
**②**複雑なUIやアドオンによる要件がある(DBconnect、Checkpoint、Cisco IPSなど)。
**③**イベントごとにデータを別々のインデクサーやインデクサークラスターへルーティングする複雑な環境である

### ▼最後に
今回は様々な情報を取り入れてなるべく分かりやすいように記載してみました。
規模によっても推奨の変動はあると思うので注意ください。
少しでも参考になれば幸いです。
メーリングリストの伝播配送仕様が変更された？

10/23以降、外部に公開（投稿権限あり）されたMLへのメールがそのML配下のMLに配信されなくなりました（配下のMLは外部に公開されていない設定）
10/23までは上記の構成でも問題なく配信されていたのですが...
API gatewayの各種統合タイプ

# API 統合タイプの選択
バックエンドが誰か・どういうふうにデータを受け渡しするかによって、選択するタイプが変わる

## バックエンドがLambda 関数の場合
Lambda プロキシ統合
Lambda カスタム統合

## バックエンドがLambda 関数以外のAWSサービスの場合
非プロキシタイプの AWS 統合

## バックエンドがHTTP エンドポイントを使う場合
HTTP プロキシ統合
HTTP カスタム統合

## バックエンドはまだ未作成の場合
モック統合

# 各API 統合タイプの詳細
## AWS
・API は AWS のサービスアクションに公開
・統合リクエストと統合レスポンスの両方を設定
（メソッドリクエスト→統合リクエスト、統合レスポンス→メソッドレスポンス、のマッピング）

## AWS_PROXY（Lambda プロキシ統合）
・Lambda 関数呼び出しアクション
（他の AWS のサービスアクションには適用されない）
・統合リクエストまたは統合レスポンスを設定できない
・クライアントから受け取ったリクエストをバックエンドの Lambda 関数への入力として渡す


## HTTP（HTTP カスタム統合）
・API がバックエンドの HTTP エンドポイントに公開
・統合リクエストと統合レスポンスの両方を設定
（メソッドリクエスト→統合リクエスト、統合レスポンス→メソッドレスポンス、のマッピング）

## HTTP_PROXY（HTTP プロキシ統合）
・統合リクエストまたは統合レスポンスを設定できない
・クライアントから受け取ったリクエストを HTTP エンドポイントに渡し、HTTP エンドポイントから送り出されたレスポンスをクライアントに渡す

## MOCK
・リクエストをさらにバックエンドに送信することなく、レスポンスを返す

# 参考サイト
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-api-integration-types.html
Laravelでクエリの実行回数を知る方法

DBファサードをuseする
```
use Illuminate\Support\Facades\DB;
```

確認したいクエリが呼ばれている箇所を`DB::enableQueryLog();`と`dd(DB::getQueryLog());`で囲む
```
DB::enableQueryLog();
$this->buildResult($result);
dd(DB::getQueryLog());
```

こんな感じになる
```
array:5 [▼ // app/XXX/XXXX.php:61
  0 => array:3 [▶
    "query" => "select なんちゃら...
```

`query` が呼ばれている回数がクエリ発行数。
配列の中身の回数分呼ばれるので、arrayの数がクエリ発行数。
この場合は5回呼ばれている。
Pythonで「コメントを記述する」の動作を確認してみた

# 概要

Pythonで「コメントを記述する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/ini/index4.html

# 実装

以下のファイルを作成しました。
```sample4-2.py
price = 500
# price = price * 1.08
print (price)
```

以下のコマンドを実行しました。
```
$ python3 sample4-2.py 
500
```

# まとめ

何かの役に立てばと。
牛乳を1つ買ってきてください。卵があったら6つ買ってきてください。のような仕様書


# こんにちは

### 11/1 続編となる記事を書きました。

https://qiita.com/SZR/items/9050bf731c1f143f7f5b

今回の実例全て、ChatGPTに尋ねてみたのでぜひこちらも読んでみてください!

## 本編

エンジニアの皆さん、そしてエンジニアにタイトルのような依頼をしてしまう皆さん、こんにちは！

~~私はタイトルの内容でお願いされたら某7-11の1個入りの卵を6個買ってしまうかもしれません！~~

GPT3.5では少し惑わされているようでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728856/63eb927a-7014-f129-841d-fe2df3db599f.png)

~~GPT4.0であれば最初から牛乳6つになっていたら面白いですね~~

タイトルの話は牛乳卵問題としてプログラマの自虐ネタのように使われているみたいですが、仕事でも似たようなことって本当にあるんですよね。
しかし仕事では、牛乳を6本買って家に帰ってからの問題発覚では遅いわけですね。

エンジニアの皆さんであれば、仕様書に関してのQAの投げ合いをしたことがあるかと思います。
明らかに曖昧な表現であれば良いのですが、それが

### 曖昧かどうかわからず、実装した結果確信犯となってしまう

ようなこと、ありますよね。

今回は私が今までに実際に経験した「実は曖昧な表現」を5件紹介します。

## 実例

### 事例その1

```
以下の条件に合うデータが存在する場合、○○の処理をおこなう。
・ 「hoge」カラムの値が××であるデータ
・「fuga」カラムの値が△△であるデータ
```

こちらの仕様を読んでどのように解釈したでしょうか？　この表現では二通りの解釈が生まれてしまいます。

一つ目は、
#### 「「hoge」カラムの値が××であるデータ」もしくは「fuga」カラムの値が△△であるデータ の`どちらか`が存在する場合○○の処理をおこなう」
です。

二つ目は
#### 「「hoge」カラムの値が××であるデータ」及び「fuga」カラムの値が△△であるデータ の`両方`が存在する場合○○の処理をおこなう」
ですね。

皆さんはどちらの解釈をしましたか？
仕様書にこの書き方を発見したらQAを投げて必ず確認しましょう！

### 事例その2

```
○○の操作を実行した後に本操作(B操作とします)を実行した場合、××の処理をおこなう。
```

この書き方の曖昧な点は、

### ○○の操作を実行したあと、別の操作を行ってからB操作を行った場合、××の処理が行われるのかどうか不明な点です。

直後なら直後、一度行ったらフラグが立ち続けるのであればそう記載しましょう！

### 事例その3

```
○○の初期値は空白とする
```

#### 空欄にすればよいのかスペースを入れる必要があるのか、スペースだとしても半角なのか全角なのか、「空白」と文字を入れておけば良いのかわかりません。

なんだかんだ結構あります。

#### 似たような話ですが、「初期値:Null」と書いてあったのでNull(何も表示しない)状態にしたら「未入力か空白かパッと見てわかるようにNullと表示してほしかったんです！」と言われたことがあります。

理不尽！

### 事例その4

```
○○には現在日時が入ります。
```

YYYY.MM.DD形式で良い場合もあれば、「2023年10月24日みたいに入れてほしかった！」　という場合もあります。
必ずフォーマットを確認しましょう。
~~馬鹿にしていると思われるかもしれませんが、日本時間かどうかもついでに確認しましょう~~

### 事例その5

```
10桁ある番号のうち、1桁目～6桁目の値に + 9999 した値を表示
```

いいたいことはわかります。 `1234567890`という番号であった場合、`1234569999`と表示してほしいのでしょう。

#### `1234577889`の可能性がありますが

たまに↑のパターンもあるので、どちらかしっかり確認しておきましょう。

- 10月27日追記
##### `下六桁`の解釈もあり得るので上からか下からも要確認!

## まとめ

以上のようなことは他にも存在します。要件定義を行う方、要件定義を依頼した方、そしてそれを実装するプログラマの方、誰かが気づかないと納品された後に不具合として報告されてしまいます。

私たちは一見曖昧に見えない表現でも、複数の受け取り方が存在する可能性のあるものに気づかないといけません。

### もしタイトルのような依頼をパートナーからされたら、牛乳の容量と何個入りの卵を買うのかは絶対に確認しましょう。

# andmore

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

https://qiita.com/SZR/items/9050bf731c1f143f7f5b

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

https://qiita.com/SZR/items/3e3a02e6c316438fe5a3

https://qiita.com/SZR/items/1c8a7be4267071f6c295

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

https://qiita.com/SZR/items/396533c1b1e14489a782

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

https://qiita.com/SZR/items/176586cde17ea0e9828a

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

https://qiita.com/SZR/items/1d8edaf95fa2f5bbe821
AWSでのデータベース

oracle社の開発したMySQLではなく、派生のmariaDBを使用する。
ターミナルで下のコマンドでインストールできる。
```bash
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install  mariadb-server mysql-devel

```

systemctlコマンドは、Amazon LinuxやCentOSに含まれているもので、インストールしたソフトウェアの起動を一括して行えるツールです。
起動できたか確認します。
```bash
#一括でインストールしたソフトウェアを起動
[ec2-user@ip-172-31-25-189 ~]$ sudo systemctl start mariadb
```

そして、データベースのルートパスワードの設定を行う。(忘れないようにメモしておこう)
【備忘録】amazon linux 2023 に docker composeとgithub cliを入れる

# docker
```bash
sudo dnf install -y docker
sudo systemctl enable --now docker
sudo systemctl status docker
sudo usermod -aG docker ec2-user

sudo chmod 666 /var/run/docker.sock
```
# docker compose
```bash
DOCKER_CONFIG=${DOCKER_CONFIG:-/usr/local/lib/docker}
sudo mkdir -p $DOCKER_CONFIG/cli-plugins
sudo curl -SL https://github.com/docker/compose/releases/download/v2.17.0/docker-compose-linux-aarch64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
```
最新バージョンは https://github.com/docker/compose/releases/latest へアクセスすると見れる
# git
```bash
sudo dnf install git
```

# github cli
```bash
sudo dnf config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo
sudo dnf install gh
```

# 最後に
これらが入ってれば後はもういらないでしょ

# 参考

https://oddguy.hatenablog.com/entry/2023/05/16/104117
https://densan-hoshigumi.com/aws/amzn2023-docker-install
https://github.com/cli/cli/blob/trunk/docs/install_linux.md#fedora-centos-red-hat-enterprise-linux-dnf
【PostgreSQL】同じテーブルをアップデートする【備忘録】



業務で詰まったので備忘録としてメモ

## やりたいこと
別のテーブルを参照し、条件作成の上、同じテーブルをアップデートする。

## 例
TABLE_Aの全レコードを対象に
TABLE_A.id = TABLE_B.idが成立する場合
TABLE_B.column_AをTABLE_A.column_AにUPDATEする。

※成立しない場合は任意の値でUPDATE

## クエリ例

```sql:query
UPDATE TABLE_A
SET column_A = coalesce(TABLE_B.column_A,'任意の値')
FROM TABLE_A AS main_table
INNER JOIN TABLE_B AS sub_table
    ON main_table.id = sub_table.id
WHERE
TABLE_A.主キー = main_table.主キー
--(主キーが複数個ある場合はそれらすべてをWHERE句に記載)
```

UPDATE対象とFROM句に記載するテーブルが同じ場合
主キー同士をリンクさせる必要がある。
rsync の送信先・元パス末尾の「/」の有無

rsync するときに指定するパスの末尾のスラッシュが、いるのかいらないのか混乱しないよう備忘録として残しておきます。

フォルダ A には a.txt というファイルがあり、フォルダ B は空という設定で進めます。
```
ls /
A/ B/

ls /A/
a.txt

ls /B/

```

## 送信元の末尾のスラッシュ
送信元の末尾のスラッシュは、有無で挙動が変わるため注意が必要です。

#### なしの場合
A 自体が B の中にコピーされます。
B の中に A が作られることになります。
```
rsync /A /B/

ls /B/
A/
```

#### ありの場合
A の中身が B の中にコピーされます。
（今回のように B が空の場合 A と B の中身が同じになります。）
```
rsync /A/ /B/

ls /B/
a.txt
```

## 送信先の末尾のスラッシュ
送信先の末尾のスラッシュは有無は結果に影響しません。
以下のコマンドは両方で同じ結果になります。
```
rsync /A/ /B/

rsync /A/ /B

ls /B/
a.txt
```

# 参考
https://code.lioon.net/shell/how-to-set-paths-for-rsync.html
「夢想成真的起點：從台灣出國留學」

在這個全球化的時代，越來越多的台灣學生夢想著能夠走出自己的國界，走向世界的舞台。為了實現這些夢想，許多學生選擇參加SAT考試，並申請美國簽證，踏上出國留學的旅程。這個決定對他們的人生將有著深遠的影響，讓我們一起來探討出國留學和就讀國際學校的重要性以及挑戰。

SAT：跨足國際學術的第一步
[SAT](https://www.apexcharity.org/news/3/84)是許多美國大學的入學要求之一。這個標準化考試評估學生的數學、閱讀和寫作能力，為申請者提供了一個展現自己學術能力的機會。對於想要出國留學的台灣學生來說，SAT是跨足國際學術的第一步，也是他們申請美國大學的敲門磚。

美國簽證：實現夢想的關鍵
一旦台灣學生通過了SAT考試，他們需要申請[美國簽證](https://www.apexcharity.org/news/3/94)，這是實現出國留學夢想的關鍵一步。美國簽證程序可能相當繁複，需要提供相關文件並參加面試。然而，一旦簽證獲得批准，這將是他們展開國際學習之旅的門戶。

出國留學：擁抱多元文化的機會
當台灣學生成功地通過SAT考試並獲得簽證後，他們即可踏上[出國留學](https://www.apexcharity.org/news/3/83)的旅程。這個決定將讓他們有機會遠離家鄉，探索不同的文化和生活方式。出國留學不僅是學術的挑戰，還是一個人生的冒險，它將豐富他們的視野，打開新的機會。

國際學校：培養國際化視野
許多台灣學生選擇就讀[國際學校](https://www.apexcharity.org/news/3/82)，這些學校提供了一個國際化的學習環境，讓學生能夠與來自世界各地的同學交流，學習不同的語言和文化。這種多元性有助於培養學生的國際化視野，使他們更具競爭力，不僅在學業上，也在職場上。

總之，從台灣出國留學是一個挑戰，但也是一個充滿機會和成長的旅程。通過參加SAT考試，申請美國簽證，踏上出國留學之路，台灣學生將有機會擁抱不同的文化，拓展自己的視野，為未來的成功打下堅實的基礎。無論他們最終選擇哪所學校，這個決定將成為他們人生中一個重要的里程碑，帶來無限可能。
マーケティングリンク集

マーケティング・SEO・ASO
JMRA マーケティングデータストレージ
デジタルマーケティングの入門書【BtoB編】
デジタルマーケティングの入門書【BtoC編】
フレームワーク20選を完全図解！マーケティング戦略や実行・分析に必要なフレームワーク
目的別38選！マーケティングのフレームワーク一覧
知っておきたい9つのマーケティングフレームワークおさらい
サイトやブログへの検索結果からの流入を0から20万に爆増させた時にやったことまとめ
プロダクトの運営に役立つ「なるほど施策」30個まとめました（2020）アプリの継続率を40％改善、価格変更で客単価が2倍など
SEOまるわかり大全集
GoogleDev　高度な手法と戦略
PPC Ad Editor とは｜競合のリスティング広告収集・分析に便利
SNSアカウントフォロワー動向
https://lifrell.co.jp/
【Swift】関数の引数ラベル

# 目次
[1.関数の引数ラベルとは？](#1-オプショナルバインディングとは？)
[2.実例](#2-シャドーイング)
[3.おわりに](#3-実例)

# 1. 関数の引数ラベルとは？
***引数ラベル***と聞いて皆さんはパッとイメージできますか？
私は、こんな記法Swiftで初めて出会いました。
実は、Swiftの関数の引数にはラベルが付けれるのです。しかも関数の中では使用せず、関数を呼び出すときにのみ使用されます。
この記法のことを***引数ラベル***と言います。
# 2. 実例
~~~swift:引数ラベルなし
func greeting(name: String, country: String) {
    print("Hello \(name) from \(country) !!")
}

greeting(name: "Tommy", country: "UK")
~~~

~~~swift:引数ラベルあり
func greeting(firstname name: String, from country: String) {
    print("Hello \(name) from \(country) !!")
}

greeting(firstname: "Tommy", from: "UK")
~~~

nameと言われてもfirstnameを書けば良いのか？familynameを書けば良いのかわからないですよね？
引数ラベルを使用することによって、関数を使用する際により分かりやすく***可読性***を高める目的で使用されます。(個人的には、引数名で可読性を担保してよ〜て感じです笑)

# 3. おわりに
皆さんは、関数ラベルの存在意義わかりましたでしょうか？
私は正直あまり感じていないですが、Swiftにはこんな記法があるんだ！くらいに思っておきます。

本記事を読んでいただきありがとうございました。
目指せ脱初学者で頑張りましょ〜〜
At line 145 of file neib.f90 Fortran runtime error: Cannot open file '..': Is a directory

# poscar2nnlistで引数に，相対パスでファイル指定するとエラーが発生

以下，そのログ．

### 現在地
```
$ pwd
~/clustering_crystal_structure/datas/SrC3O6/distance_2A
$ ls -CF
POSCAR
```

### エラー発生
```
$ ../../../bin/poscar2nnlist ../POSCAR 2
At line 145 of file neib.f90
Fortran runtime error: Cannot open file '..': Is a directory

Error termination. Backtrace:
#0  0x7fe4cb8c7960 in ???
#1  0x7fe4cb8c84d9 in ???
#2  0x7fe4cbb17ee6 in ???
#3  0x557e9cede636 in MAIN__
#4  0x557e9cee0c71 in main
```




### エラー発生なし
```
$ ../../../bin/poscar2nnlist POSCAR 2
$ ls -CF
POSCAR  POSCAR.nnlist
```

POSCAR.nnlistの先頭から15行を表示．:
```
$ head -15 POSCAR.nnlist
      1     1    0.000000    0.000000   0.000000   0.000000    0   0   0  O O
      1    29    1.227922   -0.893898   0.676568  -0.500995    0   0   0  O C
      2     2    0.000000    0.000000   0.000000   0.000000    0   0   0  O O
      2    30    1.227922    0.893898  -0.676567   0.500995    0   0   0  O C
      3     3    0.000000    0.000000   0.000000   0.000000    0   0   0  O O
      3    31    1.227922    0.893898   0.676567   0.500995    0   0   0  O C
      4     4    0.000000    0.000000   0.000000   0.000000    0   0   0  O O
      4    32    1.227922   -0.893898  -0.676568  -0.500995    0   0   0  O C
      5     5    0.000000    0.000000   0.000000   0.000000    0   0   0  O O
      5    33    1.174074    0.693553   0.888283  -0.329225    0   0   0  O C
      6     6    0.000000    0.000000   0.000000   0.000000    0   0   0  O O
      6    34    1.174074   -0.693553  -0.888283   0.329225    0   0   0  O C
      7     7    0.000000    0.000000   0.000000   0.000000    0   0   0  O O
      7    35    1.174074   -0.693553   0.888282   0.329225    0   0   0  O C
      8     8    0.000000    0.000000   0.000000   0.000000    0   0   0  O O
```
URLパラメータって何？ペナルティを回避するURLパラメータの適切な使い方を紹介！

WEBマーケターやWEB担当者が頻繁に使う「パラメータ」という言葉、理解できていますか？

誤って使用すると、Googleによる意図しないペナルティがかかる恐れもあります。

この記事では、パラメータの定義や、WEBマーケターやWEB担当者が知っておくべきURLパラメータの基本的な知識、そして思わず重複コンテンツを生成してしまうのを避けるためのツールの取り扱い方を取り上げます。

パラメータとは？

「パラメータ」とは、コンピュータプログラムの文脈で、外部からの情報をサーバーに伝達するための可変の要素を指します。

簡単に言うと、外部から情報を追加し、その結果を変える要素です。

WEBマーケティングの領域では、「パラメータ」を知っているだけでは十分ではありません。

実際のところ、URLにパラメータを追加できる技能があるとき、真にパラメータの力を引き出せると言えるのです。

URLパラメータの活用法
続けて、WEBマーケターやWEB担当者としての実践知識としての「URLパラメータ」の活用方法を説明します。

まず、基礎的な「URLパラメータ」の定義を押さえてみましょう。

URLパラメータとは、URLの終端に追加される変数（文字列）で、サーバー上のプログラムに情報を伝送する目的で使用されます。

通常、URLの末尾に「?」を付け、直後に「パラメータ名=パラメータ値」という形式で表示されます。

さらに、複数のパラメータを連結する場合、「＆」で分けて、URLの末尾に情報を追加します。

このパラメータの追加により、ユーザーのデータの収集や、表示ページの変更などが可能になります。

以下は、基本的なURLと、URLパラメータを追加した場合のURLのサンプルです。

●URLパラメータがないURL: https://www.example.com/

●URLパラメータを「?」以降に追加し、”color”が変数で “red”が値となるURL: https://www.example.com/?color=red

複数のパラメータを設定する場合、各パラメータを「変数=値」の形式で指定し、それらの間には「&」（アンパサンド）を使用します。

●2つのパラメータを設定したURL: https://www.example.com/?color=red&size=m

●3つのパラメータを設定したURL: https://www.example.com/?color=red&size=m&price=sale

URLパラメータのカテゴリーとSEOの影響

2つのURLパラメータ
URLパラメータには「パッシブパラメータ」と「アクティブパラメータ」の2つのタイプが存在します。

パッシブパラメータ
パッシブパラメータは、パラメータの有無にかかわらず、表示されるページの内容に変更は生じません。

主な目的はデータ収集にあります。

Googleアナリティクスなどのアクセス解析ツールで、オンラインユーザーのアクセスパスや滞在時間をトラッキングするために使用されます。

どのページから自社サイトにアクセスされたのかを測定するために、URLの末尾に追加されるこのパラメータを「パッシブパラメータ」と称します。

表示内容に変動がないことから、「ダミーパラメータ」とも呼ばれることがあります。

アクティブパラメータ
アクティブパラメータとは、パッシブパラメータと対照的に、URLにパラメータを追加することで表示されるページの内容が変わり、パラメータがない場合とは異なる情報が表示されることを意味します。

主に、ECサイト（オンラインショップ）での利用が多いことが知られています。

商品の数が増えると、検索するユーザーが目的の商品ページにアクセスするのに時間がかかります。

アクティブパラメータを適用することで、商品を価格順や人気順に並べ替えたり、色や特性でフィルタリングすることも可能になります。

URLにパラメータを追加することで内容が変わるのがアクティブパラメータの大きな特色で、ECサイトユーザーが快適に利用できるようにアクティブパラメータが採用されています。

SEO効果への影響
パッシブパラメータとアクティブパラメータのどちらにも、ページの重複が発生していない限り、適切にインデックスされていれば評価は同じだと一般的に言われています。

また、URLにパラメータが含まれる動的URLや、パラメータのない静的URLにも評価の違いはありません。

以前、動的URLは静的URLに比べてSEOに有利だとされていましたが、検索エンジンの技術進化により、その差は小さくなったようです。

「URLパラメータ」の様々なタイプやそのSEOへの影響について解説しましたが、次に「URLパラメータ」を使用する際の注意点について触れていきます。

URLパラメータの使用時の注意点

https://lifrell.co.jp/methods/url_-parameter/
【Next.js】< Module not found: Can't resolve 'fs' > 

:::note warn
(2023-10-29 加筆）
[Aggregating modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export)が原因だったかもしれない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552712/953fab67-0084-0d71-6950-36b49440e231.png)

上図の`export * from 'module-name'`をエラーが出ていたときは使用していました。

次のように変更しました。

```js
export * from 'module-name'
// ↓
export { name1 } from "module-name"
```

:::

:::note warn
本記事の内容は誤りでした。(2023-10-26 加筆）

@honey32 さん にご指摘をうけて調査したところ、表題のエラーはかなり特殊な状況でしか再現しませんでした。(コメント欄も御覧ください）

以下はその状況説明と解決した方法です。

---

素のNextでは再現しなかったので、現象がおこったアプリのコードを見直しました。

本記事ではエラー画面の一部しか記載しませんでしたが、すべての内容は以下の通りとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552712/af06ed7f-cd4e-a70d-1f8b-78cf4fd2a43a.png)

図中のImport Trace（以前は注目していませんでした）を辿ってみました。

`remarkWrapper.ts`という外部モジュールをまとめるバレルファイルを以前作っていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552712/cefc1a8e-45c0-a253-a17b-502d21beca52.png)

この`remarkWrapper.ts`のあとからインポートが `node_modules`に変わっていました。よって、当該ファイルのインポートが悪さしているのかなと思ったので、`index.ts` へのインポートを外しました。

```ts
// index.ts

export * from './getOembed'
export * from './getDataTheme'
// export * from './renderReact'
export * as rehype from './rehypeWrapper'
// export * as remark from './remarkWrapper' <===!!!!!!
export { default as getLang} from './getLang'
```

すると本記事のエラーは生じなくなりました。

---



::: 


次のエラーに対して、再現する状況と解決方法について示します。

特にバレルエクスポート - [参考１](https://typescript-jp.gitbook.io/deep-dive/main-1/barrel), [参考２](https://blog.logrocket.com/using-barrel-exports-organize-react-components/) - している場合に発生しやすいかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552712/8160586e-82e9-daa0-5c8b-5e72d0e37a37.png)

## 状況

- Next.js: 13.5.6
- `Client Component` にモジュールをインポートしている。
- そのモジュールは、`index.ts` ファイルからエクスポートしている。

```tsx
// ButtonTest.tsx
'use client' <=== Client Component Only!!!!

import { testHello } from '@/lib/testHello' <=== OK (/lib/testHello.ts)
import * as TEST from '@/lib'               <=== NG (/lib/index.ts)
import {testHello} from '@/lib'             <=== NG (/lib/index.ts)
import {testHello} from '@/lib/index'       <=== NG (/lib/index.ts)
import {testHello} from '@/lib/libs'        <=== OK (/lib/libs.ts)
import * as TEST from '@/lib/index.lib'     <=== OK (/lib/index.lib.ts)


export const ButtonTest = () => {
  return (
    <div>
      <button
        onClick={() => {
          testHello()
        }}
      >
        ButtonTest
      </button>
    </div>
  )
}

```

## 解決方法

エクスポートするファイル名を`index.ts`以外にしてください。それ以外であれば、`index.lib.ts` や `lib.ts`など、なんでも良いです。

## 補記

`index.js`のパターンは試していないのですが、多分だめでしょう。

クライアントサイドには`index`ファイルによるインポートを解決する仕組みがないのでしょうか？

ここで示した解決方法以外があれば教えてほしいです。
***Error: cell setup: Unknown H-M symbol.

# cif2cellでエラーが発生

### エラー発生状況
以下コマンドで，cifファイルをPOSCARファイルへの変換を試みた．
```
cif2cell 1011228.cif -p vasp --vasp-format=5
```
```
***Error: cell setup: Unknown H-M symbol.
```

以下に，エラーについてchatGPTに質問した回答を掲載．：

"Error: cell setup: Unknown H-M symbol" エラーメッセージは、CIFファイル内の空間群（Space Group）に関連する問題が原因で発生することがあります。このエラーメッセージは、CIFファイル内の空間群が認識できないか、不正確である場合に表示されます。

対処方法：

1. **CIFファイルの確認**:
   最初に、CIFファイルを確認し、その中の空間群情報が正確であることを確認してください。特に、`_symmetry_space_group_name_H-M`というCIFデータ項目に関心を払います。この項目は、空間群を表すために使用されます。CIFファイル内の空間群名が誤っている可能性があります。

2. **正確な空間群名の指定**:
   正確な空間群名を確認し、CIFファイル内に正しく記述されていることを確認します。空間群名は通常、国際結晶学会（International Union of Crystallography, IUCr）が定義する形式に従う必要があります。正確な空間群名をCIFファイルに記入し直すことで、問題を解決できるかもしれません。

3. **CIFファイルの修正**:
   空間群名が誤っている場合、CIFファイルを修正して正しい情報を含める必要があります。修正後に再度 `cif2cell` を使用して変換を試みます。

4. **異なるツールの使用**:
   一部のCIFファイルは、`cif2cell`で処理できないことがあります。他のCIFファイル処理ツールを試し、同じ問題が発生するかどうかを確認します。別のツールを試して問題が解決しない場合、CIFファイル自体に問題がある可能性があります。

このエラーは、CIFファイル内の空間群情報に関する問題に関連している可能性が高いため、CIFファイルの内容を検討し、必要に応じて修正する必要があります。


### 解決策
保留中．
zshの自動補完の話

たぶん多くの人にとっては常識なんだろうけど、自分は迂闊にも知らずに来たので、そうした人が一人でも減るとよいなと思ってメモ。

## zsh-completions
macのデフォルトであるzshで、サブコマンドの自動補完（候補表示）を行ってくれるもの。
いちいち`--help`みたいなことをしなくて済むのでだいぶ作業が効率化される。
個人的には、近視の人がメガネに出会ったぐらいのインパクトがある気がする。

OSコマンドもさることながら、kubectlやeksctlなどにも適用できることが大きい。
例えば、`kubectl `（半角スペースあり）まで入力してTabを押下すると（あるいは`kubectl`まで入力してTabを2回押下でもOK）、実行可能なコマンド一覧を表示してくれる。表示候補が多すぎる場合は、`kubectl e`まで入力してTabを押下することで、eで始まるサブコマンドのみを表示させることができる。

### インストール方法

Homebrewでいける。

```zsh
brew install zsh-completions
```

インストール後に実行すべきコマンドや`.zshrc`への追記事項については、以下のブログに詳しいので参照されない。

https://zenn.dev/sprout2000/articles/bd1fac2f3f83bc

### kubectlへの適用方法

以下を実行。

```zsh
kubectl completion zsh > "${fpath[1]}/_kubectl"
```

### eksctlへの適用方法

以下を実行。

```zsh
mkdir -p ~/.zsh/completion/ ; eksctl completion zsh > ~/.zsh/completion/_eksctl
```

`.zshrc`に以下を追記。

```zsh
fpath=($fpath ~/.zsh/completion)
```

最後に設定を再読込。

```zsh
. ~/.zshrc
```

## aws_completer

AWS CLIにも同様の機能がある。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-completion.html

### インストール方法

AWS CLIと一緒にインストールされている。
ただし、パスがインストール方法によって違っていて、Homebrewでインストール（`brew install awscli`）した自分の場合は以下にあった。

```zsh
> which aws_completer
/opt/homebrew/bin/aws_completer
```

上記の確認後、`.zshrc`に以下を追加（パスは自身の環境に併せて変更）。

```zsh
export PATH=/opt/homebrew/bin/:$PATH
autoload bashcompinit && bashcompinit
autoload -Uz compinit && compinit
complete -C '/opt/homebrew/bin/aws_completer' aws
```

最後に設定を再読込。

```zsh
. ~/.zshrc
```

こんな感じになる。
![スクリーンショット 2023-10-25 14.55.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/631fd19c-e76c-4d68-46bd-bc7a19cd6f87.png)


## まとめ
ターミナル生活が楽になる小ネタでした。
もっと早く知っておくべきだった・・・。

## おまけ
zsh-autosuggestionsというのもある（こちらは以前から使っていた）。
過去に入力したコマンド履歴から自動補完してくれるもので、長いコマンドの再実行や、typo回避などに有益なのでこちらもお勧めしたい。

https://github.com/zsh-users/zsh-autosuggestions

また、少し毛色は違うがpower10kも是非。zshにテーマを追加してくれるもので、特にgit使って作業する際、ブランチとの差分を視覚的に表示してくれるなど大変便利。

https://github.com/romkatv/powerlevel10k
Excelの検索クライテリア、とくにチルダ（~）と仲良くしよう

最近お仕事中にハマった問題からの投稿です。
前回と同じくちまちました話題で恐縮です。

# Problem

Excelで `VLOOKUP` や `COUNTIF`、`MAXIFS`など、「マッチする値を検索して◯◯する」系関数を利用する時、どういうわけか「現にそこに存在するのに検索にヒットしない、結果◯◯してもらえない」あるいは逆に「ヒットしないと思っていたものがヒットして、結果◯◯されてしまう」という問題がたまに起きます。

# Solution

ワイルドカードと関数の特性を理解しましょう。

まず、ワイルドカードです。
[Microsoftのサポートページ](https://support.microsoft.com/ja-jp/office/%E6%A4%9C%E7%B4%A2%E3%81%A7%E3%81%AE%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89%E6%96%87%E5%AD%97%E3%81%AE%E4%BD%BF%E7%94%A8-ef94362e-9999-4350-ad74-4d2371110adb)にも案内がある通り、Excel内で検索をするときにはワイルドカード `?` と `*` そしてそれらを非ワイルドカードとして利用するためのエスケープ文字 `~` が使用できます。
恥ずかしながら私は今回始めてこのページを見ました：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/b26dc558-deec-e3e3-2261-71966d8fd3f4.png)

その上で、関数の特性も重要です。
正確に言うと、ワイルドカードの解釈を巡って、関数ごとに挙動が異なるという点の理解が重要です。

ここでは、`CONTIF(範囲, 検索条件)` と `VLOOKUP(検索値, 範囲, 列番号, [検索方法])`を比較してみます。
`?`や`*`の基本的なマッチングについては違いはありません。

* 値 `smith` や `smyth` に対して、クライテリア `sm?th` はマッチします。
* 値 `East` や `Southeast`に対して、クライテリア `*east` はマッチします。
* 値 `fy06?` には `fy06~?`が、 `fy06*`には`fy06~*`が、それぞれマッチします。

以上の点で、2つの関数でマッチの成否に違いはありません。

では 値 `~?fy06` に対して、クライテリア `~?fy06`はどうでしょうか？
`COUNTIF()` も `VLOOKUP()` もマッチしません。
`?` が `~`によってエスケープされ、ワイルドカードではなくただの文字として扱われることになるので、想定通りの結果です。

ではさらに 値 `~~fy06` に対して、クライテリア `~~fy06`はどうでしょうか？
`COUNTIF()` は __マッチします__ が、 `VLOOKUP()` はマッチしません。
おや？となりますよね。

これと値 `~fy06` に対して、クライテリア `~~fy06`はどうでしょうか？
`COUNTIF()` は __マッチしません__ が、 `VLOOKUP()` はマッチします。
この通り、 __`~`で `~`をエスケープするクライテリアを `COUNTIF()`はサポートしていない__ ようです。

加えて、
値 `~fy06` に対して、クライテリア `~fy06` は、`COUNTIF()` はマッチ、 `VLOOKUP()` は非マッチ。
値 `fy06` に対して、クライテリア `~fy06` は、`COUNTIF()` は非マッチ、 `VLOOKUP()` は __マッチ__。
つまり、`VLOOKUP()` は `~~` → `~`というエスケープに加えて、 __`~(非ワイルドカード)` → `(非ワイルドカード)` というエスケープ（？）もサポート__ している。

これは重大な違いです。
このような違いがなぜあるのかわかりませんが、値の中に `~` が含まれる場合、使用する関数によってマッチしたりマッチしなかったりするということです。

検索クライテリアを使用する関数は多数ありますが、それらを利用する場合、「ワイルドカードを使うつもりがあるかないか」に関わらず、ワイルドカードとそのエスケープシーケンスに要注意（意図せずマッチに失敗する可能性）ということです。
rex0220 アプリ集計プラグイン 翌月締日以降の営業日

[アプリ集計プラグイン](https://qiita.com/rex0220/items/9a6996d46e199c83289d)で、翌月締日以降の営業日を取得します。

# 概要

日付の翌月10日以降の営業日を締日として、取得します。

- 10日以降に営業日がある前提
- 土日は休日
- 祝日は、休日管理アプリに設定

![2023-10-25_14h24_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7db686d0-d06a-2a2b-c5bb-4aaa1f0170dc.png)

- 休日管理アプリ　※[rex0220 プラグイン 祝日チェック](https://qiita.com/rex0220/items/23045118eaa3a189f228) 参照
![2023-10-25_14h24_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/efa4bb5f-6d4f-854d-5171-b67c73c45546.png)

# 操作例

![2023-10-25_14h28_57.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/6fa4e8cd-9478-4af9-51a4-dd6bd111079d.gif)

# アプリ集計プラグインの設定

![2023-10-25_14h30_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ea66eeff-f9b7-aab2-aac6-72f40509338b.png)

- 自動・ボタン別設定
![2023-10-25_14h37_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/cf9dc7da-2a17-29ad-cb6e-a93baa60746a.png)

- 対象アプリ条件
![2023-10-25_14h31_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/6a3ae72d-adab-e35d-b7c6-2f28eb06f522.png)

- 集計項目
![2023-10-25_14h31_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f9b38932-926c-c0c6-0eee-c67d29a5e42f.png)

```.js
// 翌月締め日
LET(
  c,DATE_ADD(#日付,1,"month","YYYY-MM-10"),
  x,TDSIF(
    AND(DATE_FORMAT(date)>=c,
      IN(type,"祝日","休日")),
    DATE_FORMAT(date)
  ),
  dt,"",
  w,ARRAY_FOR(21,idx,
     IF(NOT(dt),LET(
        w1,DATE_ADD(c,idx,"day"),
        IF(OR(IN(x,w1),IN(DATE_FORMAT(w1,"e"),"0","6")),,FSET(dt,w1))
     ))
  ),
  dt
)
```
Kotlin : Timer 処理を Handler で行う

こちらと同じことを行いました。
[タイマー処理＝一定周期で処理を行う、てのをkotlinで極力カンタンに書いてみる（Handler利用）](https://little-strange.hatenablog.com/entry/2019/10/05/221200)

## プログラム

```kt:MainActivity.kt
// ------------------------------------------------------------------
//	timer02
//
//						Oct/25/2023
// ------------------------------------------------------------------
package com.example.timer02

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.widget.TextView

class MainActivity : AppCompatActivity() {

    var count = 0
    val hnd0 = Handler(Looper.getMainLooper())
    var textMessage: TextView? = null

    val rnb0 = object : Runnable {
        override fun run() {
            count++
            textMessage?.text = count.toString()
            if (count < 50) {
                hnd0.postDelayed(this, 2000)
                println(count)
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textMessage = findViewById(R.id.textView)
        hnd0.post(rnb0)
    }
}

// ------------------------------------------------------------------
````

## 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/2c1a27c5-4c0e-0b9c-ff0f-a51e26ab5c97.png)
【合格体験記】E資格

# 記事の内容
E資格 (JDLA Deep Learning for ENGINEER 2023 #2) に合格しました。
勉強方法などをまとめます。



# 前提　E資格
E資格とは、「ディープラーニングの理論を理解し、適切な手法を選択して実装する能力や知識を有しているかを認定する」ための資格です。
（[JDLA公式サイト](https://www.jdla.org/certificate/engineer/)より引用）

JDLA認定プログラムを終了していることが受験資格になっています。運転免許をとるために、自動車教習所を卒業するようなイメージです。



# 勉強したこと
### AVILEN
JDLA認定プログラムの[AVILEN](https://avilen.co.jp/)の教材のみを使用して勉強しました。AVILENの学習コースは、始めが一番難しくなっており、驚いてしまう人も多そうです。E資格試験に最短で合格することだけが目的ならおすすめできませんが、AI系エンジニアとしての基礎力は確実につくと思います。他の教材も併用すれば、E資格試験に安心して臨められるかと思いますが、AVILENだけでも十分に合格できました。

E資格の試験出題範囲は公式から公開されているので、**出題科目ごとに勉強したことをまとめます。**

| 出題範囲 |
|:-:|
| 1. 応用数学  |
| 2. 機械学習  |
| 3. 深層学習  |
| 4. 開発・運用環境  |N




### 応用数学
応用数学の試験範囲は、情報量の分野以外は、理工系の大学1年生で習う内容です。応用数学については、E資格試験対策のための特別な勉強をせずに試験に挑みました。



### 機械学習
機械学習の試験範囲は、機械学習という分野を俯瞰したような内容になっています。機会学習というとニューラルネットを想像してしまいがちですが、それ以前の基礎的なものが多いです。E資格のために勉強したというより、AI系のブログなどを見ていて自然に知っている内容だという印象があります。



### 深層学習
深層学習の試験範囲は非常に広いです。高得点を目指す勉強というより、失点をなるべく抑える勉強をしました。

具体的には、[JDLA公式サイト](https://www.jdla.org/certificate/engineer/)で公開されている試験範囲の機械学習モデルの特徴やアルゴリズムを勉強しました。順伝播と逆伝播などの基本的なニューラルネットの動かし方を理解すれば、あとは暗記の要素が大きいです。試験範囲になっている機械学習モデルの画期的だった点や、特徴的なアルゴリズムを一つ一つ調べていきました。



### 開発・運用環境
深層学習分野とは対照的に、開発・運用環境の試験範囲は少なめです。試験範囲になっている言葉をすべて調べて、あとは時間を置いて何度か復習したくらいで試験本番を迎えました。



# まとめ
E資格 (JDLA Deep Learning for ENGINEER 2023 #2) へ向けて勉強したことをまとめました。


ディープラーニングは日進月歩なので、随時試験範囲が更新されているようです。もしE資格をこれから受験されるという方は、最新の試験範囲のご確認をお願いいたします。
【ChatGPT無（web版&アプリ版）】で、音声入出力をやろう！


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

　今回は、ChatGPT無料版で、音声入出力をやろう！という企画。やっぱりアプリ（有料版）でのChatGPTさんとの会話には憧れます。そこで、スマホの機能を使用しての音声入出力をしていきます。

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

　正直、
　　やってる人が
　　　羨ましいですよ。

　ChatGPTさんと
　　会話するなんて、
　　　無料版を使っている限り
　　　　無理！

　と、あきらめていました。
　　でも、と思い出したのです。
　　　AndroidにもiPhoneにも
　　　　音声入力はありますよね。
　　　　　パソコンにも。

　パソコンでは、
　　ゴールシークプロンプトで
　　　有名なシュンスケさんが
　　　　音声入力を活用しています。

　私は、Androidスマホで
　　いつも操作しています。
　　　また、iPadもiPhoneも
　　　　ありません。

　**ですから、注意してください。
　　iPhoneやiPadではどうなのか、
　　　わかりませんので。
　　　　もしかしたら
　　　　　的外れになるかも
　　　　　　しれません。
　　　　　　　そのときは、
　　　　　　　　ごめんなさい。**

　では、
　　はじめましょうか。
***
　音声入力は、
　　アプリ版の場合ならば
　　　無料版でも、
　　　　音声入力が可能です。

　ですから、
　　音声出力に
　　　ジャンプしてください。

　続けます。

　文字入力できる場所では
　　AndroidならGboardが現れ、
　　　その右上に、
　　　　マイクアイコンがあります。

　それをタップすれば、
　　音声入力が開始されます。

　iOSは、
　　設定が必要みたいですね。
***
　音声を出す設定方法は、
　　以下の記事を
　　　参照してください。
　　　　AndroidとiOS、
　　　　　それとパソコンにも
　　　　　　対応しています。
[【無料で簡単】ChatGPTと音声会話する方法！パソコン、スマホの場合の設定と使い方](https://ondoku3.com/ja/post/how-to-have-a-voice-conversation-with-chatgpt/)
***
　設定できましたか？

　まずは、
　　練習して
　　　慣れましょう。

　以下は、
　　私がGboardで
　　　音声入力してみた内容です。
```Text:音声入力テスト
今回は キーボードに関して書きます
GPT 4 ビジョンには 音声入力ができるようになっています
音声入力だけならば キーボードでもできます
今回はそれを話していきましょう

以前 キーボードを使った際にはあまり変換効率が良くなく 間違えてばかりでした
地学部に触ってみたところ なんか変換効率がかなり高くなっていることに気づきました

そこで チャット GPT でも使えるかどうかを確認しようと思った次第です
まずは キーボードについて書きましょう
キーボードとは Google が開発した 入力キーボードです
マイクアイコンをタップすることで入力ができるようになります
一部の単語は変換 しづらいですが よく変換してくれます
音声入力中に音声が途切れると 半角スペースが入るようになっています
```
　“Gboard”が“キーボード”に、
　　“ChatGPT”が“チャット GPT”に
　　　なりますが、
　　　　概ね、OKかと。

　“地学部に”は
　　“しばらくぶりに”と
　　　発言したところかな？

　改行は、
　　自分で行ないます。
　　　その都度、
　　　　音声入力が切れます。

　音声入力の途中で、
　　音声が途切れると、
　　　半角スペースが
　　　　挿入されますね。

　これらに
　　注意すれば、
　　　イケそうです。
***
　音声出力を
　　やってみましょう。

　Androidスマホの場合、
　　改行の下に、
　　　“人が両腕を横に伸ばした”
　　　　アイコンがあります。

　それをタップして、
　　音声出力したいテキストを
　　　タップすれば、
　　　　しゃべってくれます。

　**ただ、入力枠の文字列は、
　　全体が選択されてしまいます。
　　　エディタなんかは、
　　　　“その場所に
　　　　　テキストはありません”
　　　　　　と注意されます。**
***
　ではでは、
　　ChatGPTさんとの
　　　会話をしてみましょうか。

　　………………

　まぁ、ここでは、
　　やり取りは出しませんw

　やってみての
　　感想になります。

　まずは、**短所**です。
　・アプリ（有料版）での会話と
　　　比べると、オンオフする
　　　　必要があり、手間が掛かる。
　・エディタなどの文字列は、
　　　音声出力できない。

　今度は、**長所**。
　・ほかのアプリでも使える。
　　　（アプリは自己完結）
　・出力文字列が読める。
　　　（アプリでは隠されてしまう）
　・入力方法に、音声入力が追加
　　　された、というだけで、
　　　　文字入力もふつうにできる。
　　　　　（アプリでは音声Onlyに）
　・すべてではなく、
　　　選択された場所を
　　　　音声出力するので、
　　　　　すべてを聞く必要がない。
　・リピートすることもできる。
　　　語学学習などに、便利。
***
　とりあえず、
　　こんなところでしょうか。

　ではでは、
　　ChatGPTさんとの
　　　会話をお楽しみください。

　今回は、ここまで。
Linuxめも_カーソルを移動したいんご篇

## はじめに
タイトルそのまま。
長ったらしいコマンド打つことが最近多いので調べました。

## 結論
- 行の先頭に移動`Ctrl A`
- 行の最後に移動`Ctrl E`

ここまではいい。ただあたいが知りたいのは、
```
## ★をカーソル位置とするよ
$ aws ecs execute-command --region ap-northeast-1 --profile dev★
```

これを

```
$ aws ecs★ execute-command --region ap-northeast-1 --profile dev
```

こうするやり方なんだああああああ！！

GPT4大先生「`Ctrl 左カーソルキー`」

解決。と思ったらMacOSのミッションコントロールでCtrl 左・右カーソルキーはウィンドウの移動に割り当てられてた。
適当に解除したら無事移動できた〜

## おわりに
拙い記事でした。
簡単ですが以上です:metal:
AWS EC2 ruby on rails 環境構築

AWSのEC2で、ruby on railsをダウンロードするだけでは使えない。その前に、rbenv とruby-buildのインストールを行う。
以下手順です。


## EC2でruby on railsを使う前にrbenvとruby-buildのインストールを行う。

```bash
# ①rbenvのインストール
[ec2-user@ip-172-31-25-189 ~]$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv 

# ②パスを通す
[ec2-user@ip-172-31-25-189 ~]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile 

# ③rbenvを呼び出すための記述
[ec2-user@ip-172-31-25-189 ~]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# ④.bash_profileの読み込み
[ec2-user@ip-172-31-25-189 ~]$ source .bash_profile

# ⑤ruby-buildのインストール
[ec2-user@ip-172-31-25-189 ~]$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build

# ⑥rehashを行う
[ec2-user@ip-172-31-25-189 ~]$ rbenv rehash  
```

## EC2にrubyをインストールする

```bash
# Ruby 3.2.0のバージョンをインストール
[ec2-user@ip-172-31-25-189 ~]$ rbenv install 3.2.0

# EC2インスタンス内で使用するRubyのバージョンを決める
[ec2-user@ip-172-31-25-189 ~]$ rbenv global 3.2.0

# rehashを行う
[ec2-user@ip-172-31-25-189 ~]$ rbenv rehash  

# Rubyのバージョンを確認
[ec2-user@ip-172-31-25-189 ~]$ ruby -v 
```
PowerShellでExport-Csvした時に先頭のTYPE行を無くす

# 概要

例えば下記の出力結果csvについて…

```powershell
Get-ADComputer -Filter * -Properties * | Export-Csv 出力先csvパス
```

1行目がヘッダー行ではなく
```#TYPE Microsoft.ActiveDirectory.Management.ADComputer```
になってしまいます。

これだとエクセルや別システムに展開する時に邪魔。

1行目をヘッダー行にしたい。

# やり方

``` -NoTypeInformation``` を付けるだけ。

```powershell
Get-ADComputer -Filter * -Properties * | Export-Csv 出力先csvパス -NoTypeInformation
```

# 参考サイトさん

https://teratail.com/questions/272241

# バージョン

Microsoft Windows [Version 10.0.19045.3570]
PSVersion 5.1.19041.3570
AWS EC2運用

・EC2のインスタンス作成後、SSH接続のみ可能な状態で、http接続はできないので、接続できるようにするためにポートを解放します。

・ssh接続は、一定時間操作をせずにいるとタイムアウトしてしまいます。その場合は、「ssh -i 〜」のコマンドを再度実行することでサーバーに接続できます。
AllocConsole で SJIS(ShiftJIS)。printf ではいけるが、_cprintf はなぜか文字化け

古いがVS2005のMFC(C++)のGUIモードのアプリにて実験。
MFCも土台はWin32なので、以下で、Win32 に起因するような事柄に関しては、Win32 という言葉で説明することがある。
Win32のGUIモードのアプリは、最初は端末画面は存在していないが、AllocConsole() を呼び出せば作る事が出来る。
そして、AllocConsole の文字コード(cp: CodePage)は、今回調べた限り、最初から 932 であったが、CP=932 は、SJIS を表す。
文字コードとは全く無関係の話になるが、この状態では、_cputs や _cprintf はその端末画面に対して機能するが、printf はその端末には接続されていない、したがって、基本事項として、
freopen("CONOUT$", "w+", stdout);
として、新しい端末画面を stdout に接続してから printf しなければならない。
こうすると、_cprintf と printf のどちらも、ASCII コードならば、この端末に出力できるようになる。
一番重要なことは、この状態で、_cprintf では、SJISの日本語が文字化けするが、printf では文字化けしないことである。
理由は不明。
取り急ぎ、メモ。

なお、ソースファイル test.cpp の文字コードは、SJISとして保存している。

```C:test.cpp
    AllocConsole();
	_cprintf( "Hello\n" );
	_cprintf( "GetConsoleOutputCP() = %d\n", GetConsoleOutputCP() ); // 932
	_cprintf( "GetConsoleCP() = %d\n", GetConsoleCP() ); // 932
	SetConsoleOutputCP( 932 );   // Console の出力文字コードを SJIS に
	SetConsoleCP( 932 );  //  Console の入力文字コードを SJIS に
	_cprintf( "GetConsoleOutputCP() = %d\n", GetConsoleOutputCP() ); // 932
	_cprintf( "GetConsoleCP() = %d\n", GetConsoleCP() ); // 932
	_cprintf( "_cprintf, Nihongo = 日本語\n" );　// 文字化けする。
	
	freopen("CONOUT$", "w+", stdout);   // stdout を console に接続する。
	SetConsoleTitle("Debug Console");   // AllocConsole の端末の Window のタイトル文字列を変更できる。
	//SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED);  // AllocConsole の端末の中の色を変えられる事を確認した。
	printf( "Hello2\n" );
	printf( "printf, 1, Nihongo = 日本語\n" ); // 正常に出力され、ちゃんと日本語が見える
	SetConsoleOutputCP( 932 );
	SetConsoleCP( 932 );
	printf( "printf, 2, Nihongo = 日本語\n" ); // 正常に出力され、ちゃんと日本語が見える
	_cprintf( "_cprintf, 2, Nihongo = 日本語\n" );　// 文字化けする。
```

その時に AllocConsole の端末に出力された様子 :
```
Hello
GetConsoleOutputCP() = 932
GetConsoleCP() = 932
GetConsoleOutputCP() = 932
GetConsoleCP() = 932
_cprintf, Nihongo = ?u?{?e
Hello2
printf, 1, Nihongo = 日本語
printf, 2, Nihongo = 日本語
_cprintf, 2, Nihongo = ?u?{?e
```
Kotlin: Timer() の使い方

## プログラム

```kt:MainActivity.kt
package com.example.timer01

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import java.util.*

class MainActivity : AppCompatActivity() {
    val timer = Timer()
    private val timerTask = Task()
    private val delay: Long = 0L
    private val interval: Long = 2000L

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main) // activity_mainのレイアウトを使用

        timer.scheduleAtFixedRate(timerTask, delay, interval)
    }

    class Task : TimerTask() {
        var count = 0
        override fun run() {
            println("count = " + count)
            count += 1
        }
    }

    override fun onStop() {
        super.onStop()
        timer.cancel()
    }
}
```

## 実行結果

```text
13:12:59.468  I  count = 3
13:13:01.468  I  count = 4
13:13:03.468  I  count = 5
13:13:05.469  I  count = 6
13:13:07.468  I  count = 7
13:13:09.469  I  count = 8
13:13:11.468  I  count = 9
13:13:13.468  I  count = 10
13:13:15.468  I  count = 11
```
1変数素因数分解

どうにかして変数1個かつ1文で素因数分解をしたので、記録として、あと誰かの参考になれば、と思い、残しておきます。
# レギュレーション
- 入力はprompt()、出力はalert()を用いること。(JavaScript以外で書く場合はそれに該当する関数を使うこと。)
- 使用できる変数は入力として受け取ったnumber型変数nのみ。ただし、nは必要に応じて再代入してよい。
- `for`や`while`は、`{}`を書かなくてよい(中身が1文しかない)のならば、使用してよい。
- 変数のスコープを使い、nという名前の別の変数を使うのはアウト。
- 当然、インライン関数はアウト。
- 1文としてみなせるのなら、何文字になっても構わないが、同じ処理を2度書いてはならない。

# 私の解
```js
for(var n=parseInt(prompt()<<16);-65536&(n|="0".repeat(n>>16).match(/^(00+)\1+$/)?.[1]?.length);n<<=16)alert(((-65536&n)>>16)/(65535&n||1));
```
問題点は、32767までしか分解できないこと。
# どうやって作られたか。
正規表現で素数判定ができるのは知っている方も多いと思う。

それを利用すれば、素因数分解の不必要なネストがいらなくなる。(処理は重くなるが。)

あとは、`n`を上位16ビットと下位16ビットにわけて割り算しているだけ。
# より良い解、改良案等お待ちしております。
以上。
【挑戦状】スプレッドシートで列を追加すると自動で日付が入力される

# はじめに
スプレッドシートは多くの方と共有しますが、そのリテラシーは様々です。
見知らぬ方がスプレッドシートを操作する際、極力追加で関数を打ち込まなくて済むようなシートがあったら理想的ですよね。

そこで今回は、日付周りの関数を使ったクイズを作成してみました。
ぜひ一度解いてみてください^^

# Question
下記を満たすシートを作成せよ。

スプレッドシートで、列を追加すると、
・自動で日付が入力される
・該当する曜日が出力される
・毎月1日だけ何月かを表示する

# 完成イメージ
![sheet.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/661839b4-3ea0-53fb-15fa-c25e3431105d.gif)

# コメント
Answerは別記事にて紹介しようと思います。

ゴリ押しで作成したため、関数が複雑化しており、あまりきれいな解答は期待しないでください m(_ _)m

いろんな解答法があると思いますので、作成できた方は是非お教えくださいませ^^
Stepfunctionのステートマシンでコールバック設定をする

# 概要
AWSのStepfunctionで、人による承認作業や何らかの処理を待ちたい要件があった場合、「コールバック」というのを利用できる。コールバック設定をするとタスクトークンがAWSの何らかのサービスに出力され、待ちたい処理が終わったらそのトークンを取り出し、Stepfunctionに投げ返すと処理が再開するといった仕組みである。

AWSの公式ドキュメントではSQSを利用した例があったが、他にはLambda/SNS/DynamoDB/S3/Stepfunctionといったものにもタスクトークンを出力させられることが可能であった。(おそらく他にもあると思われる。)

# Stepfunction ステートマシンのフロー図
![Stepfunctionフロー図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3339313/b88f1bc9-6182-5b59-b57e-483833e5f771.png)
DynamoDB PutItemでコールバック設定をしており、ここでフローを停止することができる。
タスクトークンをsend-task-successで返すとCodebuild StartBuildに進み、
SendTaskFailureで返すとSNS Publishに進むフロー図。

# コールバック設定の方法
1. タスクトークン出力できるAWSサービスを選ぶ。(以下は例)
SQS:SendMessage
Lambda:Invoke
SNS:Publish
DynamoDB:PutItem
S3:Putobject
　

2. Wait for callbackオプションにチェックを入れる。
![Stepfunction設定画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3339313/f0ad1271-1d6f-12ca-3caa-67d9229aac8a.png)
※DynamoDBのときはIntegration typeをAWS SDKにするとWait for callbackを選択できるようになります。

　
3. エラーハンドリングのフローを追加する。(設定しなくても大丈夫)
![Stepfunctionフロー図エラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3339313/5e8385dc-065d-20c1-55fd-505118606ffc.png)
※上記はエラーのすべての場合はSNS Publishに進むように設定している例です。

# タスクトークンの出力例
ステートマシンを保存して実行すると、
サービスにより出力形式が異なるがおおよそ以下のJSON形式で出力されます。
S3だとファイルに出力、SQSはキューの中に、DynamoDBはテーブル内に出力されます。
```
{
	"MessageTitle": "Task started by Step Functions. Waiting for callback with task token.",
	"TaskToken": "AQCEAAAAKgAAAAMAAAAAAAAAAeRy・・・・・・・・・・・・・・・Khis5Rsx0ONGo2"
}
```
# タスクトークンの返却方法
AWS CLIで返す場合の例は以下です。
```
aws stepfunctions send-task-success --task-token AQCEAAAAKgAAAAMAAAAAAAAAAeRy・・・ --task-output {} --region ap-northeast-1
```
TaskTokenの文字列"AQCEAAAAKgAAAAMAAAAAAAAAAeRy・・・"を抜き出して「send-task-success」を実行するとStepfunctionにトークンが返されフローが再開する。
処理を失敗とさせたい場合は「SendTaskFailure」を呼び出す形になると思う。

# DynamoDBへのタスクトークン出力設定方法
手探りでやった結果、API Parametersに以下json投入する形になります。
```
{
  "TableName": "XXXXTableXXXX",
  "Item": {
    "XXXXtasktokenXXXX": {
      "S": {
        "MyTaskToken.$": "$$.Task.Token"
      }
    }
  }
}
```

変更箇所
・XXXXTableXXXXは自身で作成されたDynamoDBのテーブル名に置き換えてください。
・XXXXtasktokenXXXX(Item直下の4行目のところ)は作成したテーブルのカラム名に置き換えてください。
知っておいて損しない質問の仕方

# はじめに

現在、企業間取引向け後払い決済サービス「NP掛け払い」にて24卒内定者インターンをしています。

私が、内定者インターンで感じたこと・学んだことを複数回に分けて、投稿していきたいと思います。

- **これから内定者インターンをしていくよ**
- **内定もらったけど、これからどうしよう**

と言う方に見てもらいたいです！

1回目のテーマは、**質問**についてです。

# 質問

みなさんは疑問が出てきたとき、どうやって解決しますか？


先輩？ 友達？ GPT? GG?

簡単な疑問なら、基本はググって解決できると思います。


しかし、業務が絡んだ複雑な疑問に直面したら？

その場合、通常は業務担当者に質問する必要がありますが、担当者が忙しい場合もありますよね。


## どうすれば質問を返してくれるのだろうか？

実際、私はそのような状況に直面しました。

忙しい社員から如何にして、時間を割かずに質問できるか。

色々考えてみた結果、

**「相手にとって読みやすい文章を書くこと」**

これが一番大切だと気づきました。

## 読みにくい文章事例

私は、Slack上のチャットコミュニケーションで、最低限注意すべき点を学びました。

【質問内容】
![スクリーンショット 2023-07-14 19.39.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627753/954736ab-43b7-970f-9a0b-812149ffeeb2.png)

上記は、先輩に対して送った質問メッセージですが、以下3点ほど突っ込みどころがあるなと感じています。

- **結論ファーストでない**

- **自分の意見がどこから始まるか分かりづらい**

- **どういう結果を出したいのかが見えてこない**



## 最低限守るべきルール

私が学んだこととして、少なくとも3つのルールを守るべきだと考えています。

- **結論ファースト**
一文で内容を圧縮し、だいたい**40文字くらい**で収める。


- **事実と意見を分ける**
事実：客観的な情報（例：エラーが起きたとか）
意見：主観的な情報（例：背景や仮説）


- **画像など貼り、結果のイメージを示す。**
写真を用い情報を明確にする。



## もっと読みやすくするには

私が最近意識していることなのですが、これができれば読みやすさが倍増します。

以下、3点ほど示します。

- **難しい漢字を避ける**（麒麟とか憂鬱とか）
字面見ただけで読むのが嫌になるなと思いました。

- **改行に注意する**
重要度を示すには有効です。
改行がしづらいなら、太線を使うのも👍

- **句読点に気を付ける**
1行にできるだけ句読点をいい感じに入れる。

こんな感じで、メッセージを書くようにしています。

![スクリーンショット 2023-07-14 19.42.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627753/00614cb5-05a5-543b-d48b-99f1552dde1d.png)

## 質問しなくてもググって解決できる

ここまで、質問することを前提として読みやすい文章を考えてきました。

しかしながら、質問しなくてもいいこともあります。

特に以下、2点です。

- **社内のドキュメントに書いてある時**

- **ググればなんとかなりそうな時**

こういったことは自分で考えて、進めてもいいですよね。

もちろん許可が必要なことは確認すべきです。

## おわり

以上、質問の仕方についてまとめてみました。

読みやすい文章と質問の質を上げて、作業スピードを上げていきましょう！
PowerShellで現在日時をyyyyMMddHHmmss形式で取得

# やり方

```powershell
$datetime_ = Get-Date -Format "yyyy年MM月dd日HH時mm分ss秒";
Write-Output $datetime_;
```

実行結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c10139b3-ecf2-bb4a-0e99-4c4a38366384.png)


# 注意点

## 月のMMは大文字

小文字だと『分』。

## 時は24時間表記なら大文字

小文字だと12時間表記。

# 参考サイトさん

https://bayashita.com/p/entry/show/38

# バージョン

Microsoft Windows [Version 10.0.19045.3570]
PSVersion 5.1.19041.3570
Googleのコード生成AI「Codey」を使ってみたい話

# 目的
話題のコード生成AIをお試し。

https://cloud.google.com/vertex-ai?hl=ja#section-2

↑まずはこちらから無料トライアルを開始します。
※利用には住所およびクレジットカードの登録が必要になります。（無料枠の範囲でなら自動更新もされず、料金は発生しません。）

# Vertex AI
　Vertex AIというgoogleの機械学習モデルを使うことでCodeyをしようすることができるそうなので、こちらを導入してみます。

![スクリーンショット 2023-10-25 10.31.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403549/9865b114-d8b9-2efe-3673-64eae5ad7383.png)

　トップページはこのような形ですが、今回扱いたいのは生成AIであるため、言語タブをクリックします。

![スクリーンショット 2023-10-25 10.33.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403549/50bf7aa2-1ce5-9797-5b74-576715560d27.png)

　するとこのように作成を開始できる箇所まできますが、まずはチュートリアルを読んでみましょう。

![スクリーンショット 2023-10-25 10.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403549/7a2dda37-d06e-0729-07f3-6b798065793a.png)

　アップグレードする気はないので必要なAPIを有効化だけしておきます。

![スクリーンショット 2023-10-25 10.36.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403549/a9f173ac-404d-8614-d2d9-405160c7c956.png)

　チュートリアルを進めるとこちらの`Transcript summary`を開けと言われますので開いてみましょう。

## Transcript summary
![スクリーンショット 2023-10-25 10.39.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403549/c0bff2be-8b98-dd54-b24d-683b91834359.png)

　ここまできたら右側のモデル選択エリアにて、Codeyを選択してみます。

![スクリーンショット 2023-10-25 10.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403549/9b491971-f918-601e-83f5-dfc74a7ae6b2.png)

　AIに指示を出す経験はなかったためよくわからないまま要求してみると...

![スクリーンショット 2023-10-25 10.47.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403549/b46ba801-a7b2-efe8-2167-f5a31318742c.png)

　割と指示を出すだけなら簡単ですね。

# Colabで扱ってみる。
 画面右上の`コードを表示`欄でColab用のAPIコードが記載されていました。

![スクリーンショット 2023-10-25 10.49.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403549/771883d6-32fc-9e39-2db0-0880acc03e09.png)

 こちらをそのままColabに貼り付けていけば良いのですが、途中で再起動の要求やgoogleドライブの共有設定などを促されますので従います。

![スクリーンショット 2023-10-25 11.04.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403549/008c69d5-0617-035a-3682-7a99fc3d81d2.png)

Oh...

```python
parameters = {
    # "candidate_count": 1,
    "max_output_tokens": 1024,
    "temperature": 0.2
}
```
　半ば無理矢理にはなりますが、自分はエラーの原因らしき箇所をコメントアウトしました。

![スクリーンショット 2023-10-25 12.03.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403549/d012f2c2-d508-ddea-eae6-531f5348ed43.png)

　しっかりと結果は返ってきていますね。
感情を持ったガッチャモールオリジナルキャラを定義して、個性を持ったAIと対話してみた

[前回](https://qiita.com/GD-son/items/47fa03d06ca9d99b14d4) の続きです。
今回は、 タイトルの通り個性を持ったAIと対話したいと思います。
利用するのはOpenAIのChatGPTのModel:GPT-4です。

## 今回のテーマ
・オリジナルAIキャラの定義
・AIキャラと対話
　※ガッチャモール非公式キャラです

## １. オリジナルキャラの準備をします

1-1. ペンギンをモチーフにしてみます
![ChatGPT.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103946/96b0ebe5-ce75-79a6-6ed2-3bba87844371.gif)

---
1-2. 出来上がったベースとなるペンギンに個性を追加します
「キャラクターの中心になる要素は、白衣を着て博士の帽子を被っていて、赤い縁のメガネをしている。」
ベタですけど。
![ChatGPT01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103946/7c25e44f-5dda-df54-4c06-13a78ab3bd27.gif)

---
1-3. Bing Image Creatorを利用して出来たイメージがこちら
よりキャラをイメージしやすいように、1-2で出力した内容を利用し、画像生成AIにイメージを作ってもらいます。

![chatgpt07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103946/949ecb46-3cc1-50c6-a8fc-d5197707c90a.png)
脇道に少し逸れましたが。。文字だけで会話するよりもイメージを作ることで対話しているような柔らかい印象を与えることが出来ると思います。
オリジナルキャラの名前は「Dr. ペンペン」です。

---
1-4. 「Dr. ペンペン」と対話するために、ChatGPTに特徴を設定します
![ChatGPT02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103946/3551a869-9102-e67d-9a8f-cf509734376a.png)

## 2. AIキャラ「Dr. ペンペン」と初めての対話

2-1. ガッチャモールでガッチャをPLAYしてもらいます
![ChatGPT03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103946/3b41ff4b-beaf-12e6-cfb6-6d549bae47b7.png)
外部ブラウザの特定のアクションは実行出来ないようですが、指定したURLへアクセスしたのか
ガッチャモールについての情報を収集したのか分かりませんが、ある程度理解した上での反応しています。

---
2-2. クーポンが見つからないユーザーを慰めてもらいます
![ChatGPT04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103946/223a4d19-9d8e-b180-16bf-c768cb51da9d.png)
大切なのはクーポンなのですが、、「楽しむ経験や、新しい発見が出来た」ことに着目させる点なんて、自分にはパッと出なそうです（笑）

---
2-3. ガッチャモールユーザーが喜んでもらえるイベントを考えてもらった
![ChatGPT05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103946/aef175d4-2900-192b-9b6a-a615bbd21ce4.png)
ユーザーには何がメリットなのか、補足もしてくれました。
アイデア出しや、アイデアのブラッシュアップにも十分使えそうです。
何度もブラッシュアップすることで、短時間でアイデアの精度を上げてくれます。

前回の記事で、ChatGPT自体は「感情を理解し経験する能力はありません」と返答がありましたが、感情について定義することで、感情を持ったAIシュミレーションが出来ました。
オリジナルキャラのイメージを生成AIで作成し、キャラにイメージを定義することで対話することも容易な時代になりました。
個々のユーザー毎に、PLAYしたことのあるガッチャ、取得・利用したことのあるクーポン情報をDBから取得し、AIがその情報を基にユーザと対話できるようなサービスも出来そうです。
記事作成が苦手な方は、資料作成も・企画出しも苦手なんでしょうね。ChatGPTとの向き合い方を理解出来ていないからだと思いますが、それすら気付いていないのでしょうね。
（時間の上手な使い方も苦手ですよね）

某氏がChatGPTの事を曖昧コンパイラと発言していたことを思い出しました。


## 最後に
少しでも参考になれば幸いです。
何歳からでもスキルは伸ばせます。
やる気次第です。