OmniAICreator/Qiita-1.07M huggingface dataset:
君の居場所はどこ？～Teachable Machineだけが知っている～

みなさんこんにちは～　夏 生です。

私は普段化粧品関連の部署で商品の仕入れを担当していて最近デジタルの勉強を始めました！
今回はTeachable Machineを使ってお店の悩みも商品部の悩みも一挙に解決しよう！の巻です。

# 作ったものはこちら

https://x.com/kitsunadawaka/status/1838540790194491860

# Teachable Machineってなに？

まずは今回使うTeachable Machineってなんぞ？を解説します。

Teachable Machine は、Google が提供する<strong>機械学習ツール</strong>です。このツールを使用することで、ユーザーは簡単に機械学習モデルを作成することができます。

https://teachablemachine.withgoogle.com/train/image

初心者でも簡単に使えるUIが特徴で、ユーザーは、画像やビデオをアップロードし、ラベルを付けるだけで機械学習モデルを作成することができます。また、作成したモデルはウェブカメラやマイクを使ってリアルタイムにテストすることもできます。

具体的な例を挙げると、雑誌の画像を裏・表というラベルを付けて学習させ、実際に雑誌をカメラに映した時に裏と表を判別させるというようなことができます。

詳しくはこちらから▼

https://knowledge.insight-lab.co.jp/aidx/google-teachable-machine-how-to-use

今回、Teachable Machineを使った背景も簡単に書きます。
普段私たち商品を調達する側の人間は商品の陳列の仕方や場所もお店に指示書で指示をしているのですが
お店に実際に足を運んでみると。。。<strong>並んでいない！</strong>あるいは<strong>並べ方が違う！</strong>なんてことが多々あります。
店舗への巡回へは複数人で行くのであちこちできていないところを写真を撮って全店に徹底してもらえるように毎週発信しているのですが、なかなか改善されない陳列にやきもきしていました。

しかし私が店舗にいたときのことを思い出してみると、いちいち指示書なんてみてられないから<strong>陳列場所がわからない</strong>、<strong>PC開く時間なんてない</strong>、パートさんにまで指示書の存在が伝わってないし教える時間もないから<strong>とりあえずいい感じに並べなきゃ。</strong>となっていたことがあります。

どちらの立場の気持ちも尊重したい。わがままですが一気に解決したいと思いました。
そこで作成したのが、、、
 <strong>陳列場所教えてくれルン★</strong>
です。毎度安直命名すみません。
この子に商品の画像を登録して（学習させて）、ラベルを陳列場所に設定しています。
商品画像を見せると、その商品がどの位置に来るか教えてくれます。

ここからは具体的な作成手順をご紹介します！

# 作成手順
### ①画像データの収集
まず、棚の陳列状況を判断するための画像データを用意します。このデータは、モデルが正しい配置かどうかを学習するために必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826220/15f83490-b839-b461-a547-14f782053ba8.png)


各パターンの画像を可能な限り多く集めることで、モデルの精度が向上します。
本来は商品を用意してカメラから<font color="#ff0000">100枚以上</font>読み込むのが良いです。
今回は商品を用意できなかったため各商品の単品画像と販促物に陳列した状態の画像の2種類を集めました。

### ②ラベルと画像の登録

続いてラベルと画像ぼ登録をします。
今回は最上段・中段・最下段の3つを登録しました。
前項で用意しておいた写真を並ぶ場所のラベルに登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826220/1dfb1251-ee76-458a-c3c9-5899814e54b5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826220/cfbf4365-ed86-9d21-defc-7ef8d4d32a4d.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826220/c6819e71-5733-cd55-dcc2-2e4770da0368.png)


### ③モデルをトレーニング
作成したモデルが実際に動くかトレーニングします。<font color="#ff0000">モデルをトレーニングする</font>を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826220/b93b92ef-7e4d-f131-b9ff-b4aa4fd8488c.png)

トレーニングを押すとプレビューが出ます。
初期設定ではカメラでの画像認識になっていますのでPCで行う場合、自分の顔面が出てきます。
ここに先ほど登録した商品画像を映すと画像が登録されているラベルが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826220/803c127b-c1d3-7cea-5258-7c634c997e2b.png)

今回のように実物がない場合はカメラで読み込むのではなく、画像を読み込むこともできます。
ファイルをクリックして、認識させたい画像をインポートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826220/ecd446d7-cdc4-94a1-e3ea-408bb1ce1c74.png)

画像データが少ないため、あまり出力できていませんが最上段であることを認識できています。



# まとめ

Teachable Machineを使用すれば陳列間違いをすぐに発見できたり、場所を指示することも容易にできるようになります。
もう少し商品を実際に用意して制度を上げられたらよかったのですが、今回はサンプルを手に入れられず断念しました。
このモデルをエクスポートすればcodepenなどを使ってウェブ上でアプリを作成することもできます。
時間があれば次回はアプリ化したいと思います！
是非みなさんも試してみて下さい。
【Google Cloud Platform】OAuth 同意画面を本番公開する際にやること

Google Cloud Platform（GCP）でOAuth同意画面を本番公開するに当たり、「そんなのどこに書いてあるんだよ！」という感じのリジェクトをいくつか食らったのでメモを残しておきます。

いや多分どこかに書いてあるんでしょうが。

<img width="500px" src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075750/980dc863-01cb-9bbd-16f7-8276150017bd.png'>

赤枠の話。

- 「ホームページ」の画面にはプライバシーポリシー画面へのリンクを配置する必要がある
- プライバシーポリシー画面はレスポンシブである必要がある（スマホ表示に対応しろという話）
- ドメインの所有権というのはGoogle Search Consoleから行う
- ちなみにこれらの対応を行ったら指摘メール（が来ているはずなので）に返信する必要あり

https://search.google.com/search-console/about?hl=ja

1. 上記にアクセスし「ドメイン」に対象を追加し「続行」ボタンを押下
1. TXTレコードが発行されるので、それをDNSレコードに追加する
1. しばらくしたら（30分から最長1日程度かかるとのこと）確認を行う
1. 所有権確認が取れたらOK
1. Google Search ConsoleにログインしていたユーザをGoogle Cloud Platform側にも追加する

何かあれば追記していきます。
eclipse 【複数のコンテキストに "/" のパスがあります】対処法

localhost の Tomcat9 (Java11) のサーバー構成を公開できませんでした。
複数のコンテキストに "/○○○" のパスがあります。

というエラーが発生しました。

対処法としては

Servers/localhostのtomcat(Java11)-config/server.xml
内にContextタグが複数ある

Contextタグ被っているので被っているContextタグを消す。
もしくは書き換える。
Pythonでlistの中で一つ前のインデックスの要素との差を求める。

# はじめに
競技プログラミングで思いついたけど使わなかった方法を備忘録として残しておきます。

```Python
[0,3,7,9,10]
```
このような配列があった場合、配列の要素間の差は以下のようになります。

```Python
#3,4,2,1
```

これを求めるときいったんforで考えました。

```Python:forを使った場合
A = [0,3,7,9,10]
ans=[]
for i in range(1,5):
  ans.append(A[i]-A[i-1])
```
実行時間 : 59ms

もっと早い方法がないかと模索してmapも試してみました。
```Python:mapを使った場合
from operator import sub
A = [0,3,7,9,10]
B=A[:]
A.pop(0)
B.pop(-1)
ans = list(map(sub, A, B))
```
実行時間 : 58ms

結果変わらず、、、
# まとめ
この後要素数を増やしたりして実行速度を測定しましたが、ほぼ同じ速度でした、今回の教訓はforもmapも同じような使い方ができるけど、選択肢としてどちらも使えることができるようにしておくことが大事だと思います。
Querying database in chunks

Sometimes you want to fetch data from a table using SQL like "SELECT * FROM some_table WHERE some_column in (<comma seprated values>)". And you often have restrictions on how many records you can fetch at a time. For instance let's say you have a table of equity prices and you want to fetch data for 10K equities but you can fetch data only for 500 equities at a time. You will want to split your 10K into chunks of 500 each and run the query iteratively to fetch batch of 500 records and in the end concatenate them into a single dataframe.

Below is how you can achieve that.

```python

def get_chunked_list(original_list, chunk_size: int = 400):
    chunked_list = [original_list[i:i + chunk_size] for i in range(0, len(original_list), chunk_size)]
    return chunked_list


def get_db_records_in_chunks(record_keys, query_func, con, chunk_size=500, *query_args):
    chunked_record_keys = get_chunked_list(record_keys, chunk_size=chunk_size)
    df_list = []
    for record_keys_chunk in chunked_record_keys:
        query = query_func(record_keys_chunk, *query_args)
        df_list.append(pd.read_sql(query, con))
    if len(df_list):
        return pd.concat(df_list)
```
Date time utils

Below are some date time utils I found useful

```python
import pandas as pd
import numpy as np
import datetime
from gpwrap.utils.date.dateUtil import to_str
from <somelibrary>.util import calendar
import logging


def to_yyyymmdd(date):
    return to_str(date, '%Y%m%d')


def to_yyyymmdd_with_hyphen(date):
    return to_str(date, '%Y-%m-%d')


def to_mmddyyyy_with_slash(date):
    return to_str(date, '%m/%d/%Y')


def ppd_price_risk_date_strptime(strdate, date_pattern='%m/%d/%y'):
    return datetime.datetime.strptime(strdate, date_pattern)


def get_day_of_week(adate):
    """
    Get weekday based on datetime.date
    :param adate:
    :return:
    """
    weekdays = {0: "Mon", 1: "Tue", 2: "Wed", 3: "Thu", 4: "Fri", 5: "Sat", 6: "Sun"}
    return weekdays[adate.weekday()]


def get_holidays_for_calendar(calendar_name, year):
    cal = calendar.Calendar(calendar_name)
    holidays = []
    next_holiday = cal.next_holiday(datetime.date(year - 1, 12, 31))
    holidays.append(next_holiday)
    while next_holiday and next_holiday < datetime.date(year, 12, 31):
        try:
            next_holiday = cal.next_holiday(next_holiday)
            holidays.append(next_holiday)
        except Exception as e:
            logging.info(f"exception was raised {e}")
            break
    return holidays


def get_npdatetime64_business_monthends(start, end, cal):
    recent_monthends = pd.date_range(start, end, freq='M')
    monthends = [np.datetime64(cal.final_businessday_of_month(m)) for m in recent_monthends]
    logging.info(f"Finished getting np.datetime64 business month ends from {start} to {end} based on {cal}")
    return monthends


def get_datetime_business_monthends(start, end, cal):
    recent_monthends = pd.date_range(start, end, freq='M')
    monthends = [cal.final_businessday_of_month(m) for m in recent_monthends]
    logging.info(f"Finished getting datetime business month ends from {start} to {end} based on {cal}")
    return monthends


def get_datetime_business_days(start, end, cal):
    """
    Return business days based on calendar
    :param start:
    :param end:
    :param cal:
    :return:
    """
    cal_days = pd.date_range(start, end)
    bus_days = [d for d in cal_days if cal.is_business_day(d)]
    logging.info(f"Finished getting business days from {start} to {end} based on {cal}")
    return bus_days


def get_datetime_days(start: datetime.date, end: datetime.date):
    """
    Get date range between two dates
    :param start:
    :param end:
    :return:
    """
    return [d for d in pd.date_range(start, end)]


def generate_now_str_timestamp():
    """
    Generate current timestampe in YYYYMMDD_HHMMSS format and return as string
    :return:
    """
    return datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d_%H%M%S')
AWS 認定ソリューションアーキテクト – アソシエイトを５日間で取得(賞金かせぎ)



こんにちは。前回に引き続き賞金稼ぎです。続編として「AWS 認定ソリューションアーキテクト – アソシエイト」を5日間で取得した体験をお伝えします。

賞金稼ぎとは：会社の奨励金が期間限定でアップするのでお金目的でサクッと取得すること。知識の定着よりも取得に集中する戦略。

## はじめに

AWS認定ソリューションアーキテクト – アソシエイトとは、、、
無数に記事があるので割愛しちゃいます。

## 使用した学習リソース

- **Udemyコース**：【SAA-C03版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座

https://www.udemy.com/course/aws-associate/?couponCode=ST22MT92324A

ぶっちゃけ、模擬試験だけやりました（実務経験ありです）

## スケジュール概要

書くまでもないかもしれません。仕事の昼休みや土日の空き時間をみつけて模擬試験をガーッと、ダーッとやりまくりました。1週目は考えずにとにかくいっきに問題と解答をみて流れをつかむ。
２周目からは考える、くらいのゆるさです。




## 結果と感想

Udemyの模擬試験コースだけを使って格安(1500円くらい)で短期間で合格できたので大満足です。今回は模擬試験しかみませんでしたが、ハンズオンなどもあるので初学者にもいいかも？
MySQL認証方法変更時に「PIDファイルが更新されていない」「サーバーが正常に起動していないため、ソケットファイルが存在しない」というエラーが表示される

MySQL5.7以前と8.0以上でユーザ認証の方法が変更になりました。MySQL 8.0以降では、ユーザー認証方法が変更されました。この変更により、特にHomebrewを使用してMySQLをインストールした場合に、以下のようなエラーが発生することがあります。

１. PIDファイル更新エラー
「PIDファイルが更新されていない」というエラーが表示され、MySQLサーバーが何らかの理由で正常に起動できない問題

```
% mysql.server start           
Starting MySQL
. ERROR! The server quit without updating PID file (/opt/homebrew/var/mysql/****-MacBook-Air.local.pid).
```

２. ソケットファイル接続エラー:

「サーバーが正常に起動していないため、ソケットファイルが存在しない」と出る問題
```
% mysql -u root
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```
上記2つが出て認証方法変更に苦労しました。

# MySQL認証エラーの解決方法
まずは立ち上がっているmy.confを削除するという方法もありますが、アンインストールが結果的には一番早かったです。

１. MySQLのアンインストールと再インストール:
- 既存のMySQLをアンインストール: brew uninstall mysql@8.0
- 再インストール: brew install mysql@8.0
- サービスの再起動: brew services restart mysql@8.0

２. 認証プラグインの変更:
- /opt/homebrew/etc/my.cnfファイルを編集
- [mysqld]セクションに以下を追加:
```
default_authentication_plugin=mysql_native_password
```
MySQLを再起動:
```
brew services restart mysql@8.0
```
３.rootユーザーの認証方法変更
- MySQLにログイン: mysql -u root
- 以下のコマンドを実行:

```
ALTER USER 'root'@'localhost' identified WITH mysql_native_password BY '';
```
４.変更の確認:
```
mysql> select User, Plugin from mysql.user;
+------------------+-----------------------+
| User             | Plugin                |
+------------------+-----------------------+
| mysql.infoschema | caching_sha2_password |
| mysql.session    | caching_sha2_password |
| mysql.sys        | caching_sha2_password |
| root             | mysql_native_password |
+------------------+-----------------------+
4 rows in set (0.00 sec)
```
これでrootのPluginも「mysql_native_password」に変更されていることを確認できます。
Mod_proxyの脆弱性対応について

おはようございます、こんにちわ、こんばんわ。

mod proxyで脆弱性があるため停止しなさいと指令を受けました。

https://at-virtual.net/%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86%e3%82%a3/%e3%80%90cve-2021-40438%e3%80%91%e6%94%bb%e6%92%83%e3%82%b3%e3%83%bc%e3%83%89poc%e3%81%82%e3%82%8a%e3%81%aeapache%e3%82%b5%e3%83%bc%e3%83%90%e3%81%aessrf%e3%81%ae%e8%84%86%e5%bc%b1%e6%80%a7/#google_vignette

理由はこれなのか・・・？
違う気がしますがとりあえずapacheにデフォルトで組み込まれているmod proxyの停止手順を記載します。

方法は大きく分けて２つ
1. confファイル自体を逃がす
1. confファイルの中身を編集する

です。
## 1. confファイル自体を逃がす
```
/etc/httpd/conf.modules.d

配下の
00-proxy.conf
```
が対象です。

このファイル自体をtempフォルダか何か作って、そこに逃がして再起動すれば動作しません。

:::note warn
が、WEBコンテンツを提供するのにバックグラウンドでプロトコルを使用している場合があります。
なので「特定のプロトコルだけ有効にして、他は全て停止する」など検討が必要ですね。
:::


## 1. confファイルの中身を編集する

/etc/httpd/conf.modules.d/00-proxy.confの中身

```
# This file configures all the proxy modules:
LoadModule proxy_module modules/mod_proxy.so
#LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
#LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
#LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
#LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_express_module modules/mod_proxy_express.so
#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
#LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
#LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
```
https://shinke1987.net/?p=790

上記引用させていただいたページにプロトコルの詳細が書いてあります。
こんな感じでコメントアウトして必要無いモノ（もしくは全て）潰しちゃってください。


ではまた。
[その5] Terraform Cloud で別ワークスペースのoutputの値を参照する

## これは何?
Terraform Cloudにおけるワークスペース間の値の参照をtfe_outputsを使用して、参照した話になります。


## tfe_outputsとは?
従来の別のプロジェクトのstateファイルを参照する際は[**terraform_remote_state**](https://developer.hashicorp.com/terraform/language/state/remote-state-data)を使用しますが、HashiCorp HCP Terraformにおいては[**tfe_output**](https://registry.terraform.io/providers/hashicorp/tfe/latest/docs/data-sources/outputs)のデータソースを使用することを推奨と記載されているため、今回はこちらを使ってTerraform Cloud 上でのワークスペース間の参照をしようと思います。


## 手順

今回使用するソースコードは[こちら](https://github.com/atsw0q0/test-terraform-cloud/tree/main/04_remote_workspaces)から参照をお願いします:pray:

以下のコードのようにtfe_outputsからnonsensitive_valuesを参照するようにします。

```hcl:main.tf
data "tfe_outputs" "vpc" {
  organization = "atsuw0w-test-terraform"
  workspace    = "test-terraform-cloud-private-registory"
}

# data "terraform_remote_state" "vpc" {
#   backend = "remote"
#   config = {
#     organization = "atsuw0w-test-terraform"
#     workspaces = {
#       name    = "test-terraform-cloud-private-registory"
#     }
#    }
# }


module "ec2_instance" {
  source  = "app.terraform.io/atsuw0w-test-terraform/webapp-templates/aws//modules/ec2_instance"
  version = "1.0.1"

  pj_tags = var.pj_tags

  ec2 = {
    prefix        = "webapp"
    instance_type = "t4g.micro"
    subnet_id     = data.tfe_outputs.vpc.nonsensitive_values.network-templates_values.subnet_pub_ids.pub_a
    vpc_security_group_ids = [
      data.tfe_outputs.vpc.nonsensitive_values.ec2-sg_values.sg_id
    ]
    is_pubic = true
  }
}

```

tfe_outputsの参照元については、以下の画像のように参照したいワークスペースのOutputsから参照することができます。今回は、Output属性に`sensitive = true`を付与していないので`nonsensitive_values`で呼び出すようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/8eb39f57-2469-f760-2116-726900a20615.png)


上記のコードをgit にpushし、mainブランチにpull requestを投げるとterraform plan/applyが実行されます。

しかしここでエラーになります。「別ワークスペースのoutputsが参照できるためのトークンを定義していないためこのようなエラーが出力されているのか？」というのが私の考えです。

> This object does not have an attribute named "network-templates_values".

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/c462514c-aa0c-d053-aa02-4ec7961400ed.png)

[こちら](https://github.com/hashicorp/terraform-provider-tfe/issues/1124)によると、おそらくですがワークスペースでワークスペース間の参照をできる権限がないから？かと考えます。

そのため、以下の画像の通りトークンを発行したのち、ワークスペース変数`TFE_TOKEN`として登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/5337878c-33d3-5921-1361-bca0a9ec262d.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/d4291eb4-699a-12dd-fff8-0b51e0482be5.png)


その結果、以下のようにplan/applyが通るようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/872532/c4f15221-76f7-c04a-717d-6462935c8ebc.png)
20代後半一児の父親の未経験エンジニアとしての挑戦

## はじめに
こんにちは。医療技術職からWebエンジニアを目指している30歳手前の一児の父です。この記事では、私のキャリアチェンジの経験と、そこで直面した課題、そして今後の展望について共有します。

## 1. プログラミング学習の開始
2023年1月、医療技術職として勤務しながらオンラインスクールへ受講しプログラミング学習を開始しました。Webエンジニアへの転職を目標に、Ruby、Ruby On Railsなどの技術を学び個人開発アプリケーションを作成しました。

## 2. 初めてのエンジニア転職
約1年後の2024年3月、念願のエンジニア転職を果たしました。フルスタックWebエンジニアとして、3ヶ月の業務委託契約（その後、正社員登用の可能性あり）で採用され、自社開発および受託開発プロジェクトに携わることになりました。

## 3. 直面した課題
エンジニアとしての新たな職場では、主に二つの課題に直面しました。

- 技術面での苦戦
  - 慣れない開発環境とプロジェクトに戸惑う日々が続きましたが、先輩エンジニアの方々のサポートを受けながら、徐々に適応していきました。
- 予期せぬ業務委託契約の終了
  - 契約3ヶ月目に、家族の体調不良により休暇を取得せざるを得なくなりました。その休暇申請直後に、突然業務委託契約終了の通知を受けました。抗議も考えましたがその企業で働いていく熱意も失われてしまった為、業務委託終了の受諾を決意。

## 4. 再就職活動と保育園継続の問題
契約終了後、再就職活動と保育園継続の両立に苦心しました。保育園を継続利用するためには、市役所に「月64時間以上の就労証明書」を3ヶ月以内に提出し、さらに3ヶ月以内に新しい就労先で勤務を開始する必要がありました。

この条件を満たすため、まずはアルバイトや派遣の仕事を探しましたが、10社以上に問い合わせても就労証明書の発行が困難でした。そのため、Webエンジニアとしての再就職を目指し、約2ヶ月間就職活動を行いましたが、実力不足もあり残念ながら内定を獲得することはできませんでした。

> **補足**: 住んでいる市区町村によって条件が異なる場合があります。病気ややむを得ない理由があれば延長を相談できる可能性もあるので、役所に相談することをお勧めします。

## 5. 現在の状況と今後の展望
このような状況を踏まえ、現在は医療資格を活かした正社員としての就職を決断しました。保育園を継続利用するため、一時的にエンジニア転職の目標を断念せざるを得ませんでした。

しかし、エンジニアになる夢を諦めたわけではありません。今後の計画として、以下の取り組みを行っていきます

- 医療職での就労継続
- 空き時間を利用したプログラミングスキル向上
- IT関連資格の取得
- ポートフォリオ用Webアプリケーションの制作

## 6. 学んだこと
この経験を通じて、いくつかの重要な教訓を得ました：

- キャリアチェンジには予想以上の困難が伴う
- 家族の生活基盤（保育園など）の維持を考慮することの重要性
- 長期的な視点でのキャリア計画の必要性

## おわりに
キャリアチェンジの道のりは決して平坦ではありません。しかし、この経験を通じて、諦めずに目標に向かって進み続けることの重要性を実感しています。困難を乗り越え、いつかは必ずエンジニアとしての目標を実現させたいと思います。もしご意見などがありました気軽に教えていただけたら嬉しいです。
組込機器に無線インタフェースをつけるのって案外面倒？ その1

## ～ 一言「組込機器の無線化」と言っても… ～

もう組込機器と言えども普通にHTTPやMQTTのような汎用TCP/IPプロトコルで通信することがあたりまえの時代となりました。これまで組込機器のネットワークI/FはEthernet（有線）が主流でしたが、小型化への要求や配線コストを考えて無線化の要求が高まってきています。
[以前の記事](https://qiita.com/Cente_mw/items/345e763d134d36d48fd1) でも書きましたが、ネットワークI/Fの違いはプロトコルスタックに影響を与えません。ブロックを組み合わせるように、ネットワークドライバを入れ替えるだけで、それより上のソフトウエアはそのまま使えます。また、今やノートPCやスマホなどには普通に無線のネットワークI/Fが入っているので、当然「組込機器ネットワークI/Fの無線化」なんてさくっとできるもの、と思いますよね？ところが、これがなかなか悩ましい問題なのです。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032022/94378ddc-598b-fd6e-2f6c-f8f5558f96e8.png)


まず、「TCP/IPプロトコルがそのまま通る(*注)無線規格」は、主に以下のものがあります。使いたい方はどれなのか、という問題です。
・IEEE802.11b/a/g/n/acなどのWiFi（APに接続するタイプ）
・IEEE802.11ah(WiFi HaLow)(これもAPに接続するタイプ)
・モバイル回線を用いるLTE（公衆網に接続するタイプ）

::: note
注
最大1500byte近いパケットを6LowPANのような別の仕組みを入れずに通信できる、という意味。
:::

Ethernetの場合は組込CPUにLANコントローラが内蔵されているパターンも多く、外部に必要なのはほぼソフトウエア制御なしに使えるPHY（デジタルデータとアナログ信号を変換するデバイス）とRJ-45などのコネクタでした。簡単です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032022/5ca618fa-f700-40b5-8d5e-335d867c7112.png)

しかし、前述いずれの無線規格も、現時点では組込CPU自体にLANコントローラが内蔵されているものは一般的ではなく([ESP32](https://www.espressif.com/en/products/socs/esp32)などWiFiに特化したSoCもありますが)、<b>外部に専用デバイスを用意して何らかの手段で組込CPUと接続する</b>ことになります。（ちなみに、CPUと専用デバイスの両方が載っている無線モジュール、というものも存在します。）
こうなった瞬間に、考えること・決めることが以下のように一気に増えるので、案外面倒だよ、ということです。
・どの会社のどの無線デバイスを使う？
・それは組込CPUとはどうつながる？
・組込CPU側に必要な、無線デバイスを設定したり制御するソフトウエアはどうする？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032022/8db3a133-dc40-6dcb-b207-765177173f76.png)

ただ、「それはわかるけど、できれば組込機器は今の仕様のまま使いたいんだよ」という方も多いと思います。「組込機器の無線化」と言ったとき、Ethernet I/Fしか持っていない組込機器には一切手を入れないで実現する方法も、検討のテーブルには載せたいところです。たとえば以下の製品を外付けて無線化する方法です。

イーサネットコンバータ：
[BUFFALO社のWI-UG-AC866/N](https://www.buffalo.jp/product/detail/wi-ug-ac866_n.html)のように、一方がRJ45コネクタ、他方がWiFi子機となっていて、Ethernetパケットを双方向に転送する（だけ）の機器です。

LTEルータ：
[I-O DATA社のWN-CS300FR](https://www.iodata.jp/product/network/wnlan/wn-cs300fr/index.htm)のように、一方がRJ45コネクタ、他方がLTE子機となっていて、LAN側がプライベートIPアドレス、WAN側がグローバルIPアドレスで運用されるいわゆるNAPTルータです。これ自身がDHCPdや簡易DNSサーバの機能を持っています。

当然これらは外部機器のため、製品という視点では機器全体のサイズや供給体制、運用中にその機器にトラブルが発生した時の保守体制という新たな課題が発生します。

次回は、組込CPUにWiFiの無線デバイスを接続するとして考えること・決めることをもう少し詳しく解説したいと思います。何が一番面倒なポイントか、想像できますでしょうか…

Cente：
https://www.cente.jp/
お問合せはこちら：
https://www.cente.jp/otoiawase/


## ■今日の閑話
今回のようにTCP/IPパケットをEthernet以外に流す、という話題はかなり古くからありました。私がネットワークのファーム書きを始めたン十年前は、モデムやISDNターミナルアダプタを使って会社のリモートアクセスサーバにダイヤルアップして社内LANとTCP/IP通信していた時代です。組込CPUとモデムの間はデータの区切りがない非同期シリアルで、通信に関する設定、認証情報、TCP/IPパケットなどを流すためPPPという第二層のプロトコルが使われていました。当時PPPにはどんどん新しい機能・プロトコルがRFC化され、ネットワーク機器メーカ各社が競うように追加実装していたことを思い出します。そんなPPPも近年はあまりその名を見なくなったので今更解説記事は不要と思いますが、何かリクエストがあれば是非コメントにてお知らせください！笑
G14-Jerrydog Music Vol.1/Vol.2

# はじめに

## Let's have fun with music!

音楽してますか？　ーいえ、プログラミングしてます。

ここにいらっしゃる方の大半はこんな感じかと思いますが、プログラミングはアートだと思うので、映画とか音楽とか好きな人も多いに違いないと確信しております（間違いない）。

さて、ゲーム中に流れる曲というのはゲームのイメージと一体となるわけですが、それはそれ、音楽単体として聞いても楽しいものです。特に、自分が作った曲というのは誰が何と言おうと名曲な訳で、何度聞いても飽きません。ということで、最近作った曲を聴くだけのプロジェクトさこさえてみました。ーそう、音楽（を聴くため）のプログラミングしました。

というのも、たまに mp3 をダブルクリックして流したりしてるのですが、わざわざクリックせずに CD プレイヤーのように自動で順に曲が流れていってくれると楽だなぁ、と思ったからですね。

## G14-Jerrydog Music

そうです。音楽作るときの名義を G14-Jerrydog としています。既に私の作った曲の譜面では「作曲者」欄に G14-Jerrydog と書かれています。

### G14-Jerrydog Music Vol.1

https://scratch.mit.edu/projects/1058601943/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/2a9f0bd7-f120-638f-dddf-093bd85a97fc.png)

サムネには 3 つのタイトルが載ってますが、Vol.1 はこの 3 つのタイトルの音楽が入っています。

3 つ目の Time Trial On Edge は最近公開したので、最近までサムネは 2 つしかジャケット（タイトルの画像）載せてませんでしたが、最近 3 つ目として載せることができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/0ce7f303-5335-31d7-a32e-34011d7762c5.png)

緑の旗を押すと、こんな感じでプレイヤーとして機能します。基本、マウスで操作します。

曲を選んだり、ジャケットを選んだりできます。左側のジャケットはグルグル回転するカルーセル方式です。6 つの枠を用意してますが、現在 3 つ分が埋まっていますが、4 つ目を入れたらプロジェクト容量が 50MB を超えてしまったので、Vol.1 はここで打ち止めにして、既に Vol.2 を作ってあります。

曲やジャケットだけでなく、Volume も一応変えられます。

## G14-Jerrydog Music Vol.2

https://scratch.mit.edu/projects/1070391103/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/0f08c8f8-ce27-b354-120e-ccd74d1fed0f.png)

ということで、Vol2 です。

まだ実際のゲームは作ってなかったり公開してなかったりですが、音楽だけは聴きたかったので入れてあります。Coming Soon が実際に Coming Soon かどうかは神のみぞ知る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/f8e76f56-66e1-8b60-e221-89742137a046.png)

> 未公開モノはこんなジャケット。ちなみに、これは再生中の画面。再生中の場合、再生中のジャケットに PLAY と表示されます。

# Library & Tips

これをやったことで、以下ができてます。記事が書けてないけど。乞うご期待（誰が？）。

* Library
  * BGM コントロール
  * カルーセル（縦・横）
* Tips
  * 音楽の一時停止（実際はちょっとずつ進んでしまうので完全ではない）

---

### 主要リンク

* [Scratch ライブラリと Scratch Tips](https://qiita.com/Kray-G/items/e1900d5b6c6dcfbe5321)

---

ではまた。
[Kotlin]インターバルタイマーを作ってみた！ part2 レイアウト作成編[初心者]

<h2>はじめに</h2>

こんにちは、mAgmAです！
早速、投稿間隔がたくさん空いてますねぇ…w

戻ってこれたことに感謝して、勉強を進めます！w
今回はKotlinでインターバルタイマーを作成したいと思います。
また、今回はレイアウトの作成、画面の遷移に注目して進めていきます。

頑張っていきましょう！


<h2>最初の準備

それでは、早速やっていきます。

アプリケーションを作っていくためにAndroidStudioでプロジェクトを作成します。
今回は、BgInterbalTimerという名前で作成しました。
![EVA画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655335/10e081a6-f862-c057-e938-be67e54dad5a.png)


<h2>レイアウト作成</h2>

まずは、mainActivityにタイマーで使用する秒数を設定するためのレイアウトを作成します。

設置するものは、秒数を設定するTextView（タイトル）とEditText（秒数入力）をそれぞれ２つずつと、タイマーを開始するためのボタン１つです。
![mainLayout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655335/72b31b25-f7fd-1933-752c-ce526b007cad.png)


次に、タイマー処理をするためのTimeActivity.ktファイルをActivityからEmpty View Activityより作成して、同じようにレイアウトを作成していきます。

設置するものは、MainActivityで入力されたEditTextを代入するためのTextViewを２つとこれらのタイトルを表示するためのTextView２つ、さらにタイマー処理を開始するためのスタートボタンと停止するストップボタン、初めの秒数入力画面に戻るためのExitボタンです。
![TimeLayout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655335/1b753961-e47b-4961-2569-6097a855316c.png)
<!--
画像
-->

これで、必要なものをレイアウトに設置することができました。


<h2>ID取得と画面遷移</h2>

<h6>ID取得</h6>
ここでは、処理に使用するIDの取得とMainAcitivityのスタートボタンとTimeActivityのExitボタンを使用して画面遷移するコードを書いていきます。

まずは、IDの取得です。特に言うことはないです。
```kotlin:MainActivity.kt
//1)IDを取得する
val onTime:EditText = findViewById(R.id.onTime)
val offTime:EditText = findViewById(R.id.offTime)
val btnStart:Button = findViewById(R.id.btnStart)
```
```kotlin:TimeActivity.kt
//1)IDを取得
val runTime:TextView = findViewById(R.id.runTime)
val interTime:TextView = findViewById(R.id.interTime)
val btnRun:Button = findViewById(R.id.btnrun)
val btnStop:Button = findViewById(R.id.btnstop)
val btnExit:Button = findViewById(R.id.btnexit)
```
<h6>画面遷移</h6>
次に、画面遷移する処理を書いていきます。
setOnClickListenerを使用して、スタートボタンにはIntentを使用した画面遷移処理とputExtraによって遷移先でEditTextを使用できるようにstrに変えて送ります。

また、TimeActivityではputExtraで送られてきたEditTextを変数に格納し、表示できるようにします。Exitボタンにはfinish()で画面の消去をしていきます。
```kotlin:MainActivity.kt
//2)intentを使用して画面遷移
btnStart.setOnClickListener {
    val intent = Intent(this,TimeActivity::class.java)
    intent.putExtra("ON_TIME",onTime.text.toString())
    intent.putExtra("OFF_TIME",offTime.text.toString())
    startActivity(intent)
}
```
```kotlin:TimeActivity.kt
//2)putExtraを取得 -> テキストに表示
val ontime = intent.getStringExtra("ON_TIME")
val offtime = intent.getStringExtra("OFF_TIME")
runTime.text = ontime
interTime.text = offtime

btnExit.setOnClickListener {
    finish()
}
```

<h2>まとめ</h2>

今回は、レイアウト作成とIDの取得、画面遷移の処理をしました。
本題のタイマー処理はまだですが、処理を書くために必要なものを揃えることはできたのではないでしょうか。
不足なものは必要に応じて追加していく予定です。

次回からは本番、タイマー処理です。
きれいなコードを書くことは難しいですが、とりあえず動くことを目指して頑張ります！

では！
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（90/100）

【90日目】
トピック 9：SAPS/4HANAでの簡易製造（7/9）

≪問題90≫
かんばん生産管理プロセスで、供給元と需要元との間の関係はどのマスタデータオブジェクトによって管理されますか。
□生産供給場所
□補充方針
□管理周期
□レート作業手順

≪解答≫
□生産供給場所
□補充方針
■管理周期
□レート作業手順

≪解説≫  
◆かんばん生産管理において、供給元と需要元の関係は「管理周期」によって管理されます。  
◆管理周期では、次の項目が定義されます。  
（1）需要元（供給場所）  
（2）補充方針（外部調達のための購買発注、内製のための実行計画数量、在庫転送のための在庫転送入出庫予定）  
（3）供給元（供給者、または外部調達のための出庫プラント、内製の責任者、在庫転送のための保管場所）  
（4）需要元と供給元の間で循環するコンテナ（かんばん）の数  
（5）各コンテナに含まれる数量  
（6）納入先住所（かんばんカードに印刷可能な情報）  
（7）かんばんカードの印刷に使用する印刷パラメータ  
（8）保管位置（供給場所での品目の詳細な保管場所）  
（9）自動かんばん計算のためのパラメータ
pythonでYouTube動画をダウンロード【高画質、無料、ロゴなし、回数制限なし、複数可能】

ffmpegのインストールと環境パス設定が予め必要です。

urlにYouTubeのリンク、outtmplには出力動画のパスを載せてください。

時間指定で一部だけの保存もできます。ライブ配信などに便利です。


```
import os
from yt_dlp import YoutubeDL

#オプションを指定（最高画質の 動画と最高音質の音声を取り出し結合するためのオプション）
option = {
    'outtmpl' : '',
    'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]',
    'merge_output_format': 'mp4',
    # 'postprocessor_args': [
    #     '-ss', '1:04:39',  # 開始時間を指定
    #     '-to', '1:06:27'   # 終了時間を指定
    # ],
}

#インスタンスの生成
ydl = YoutubeDL(option)

#ダウンロードの実行
result = ydl.download(["url"])
```
レジデンシャルプロキシ

## レジデンシャルプロキシとは？
レジデンシャルプロキシとは、実際の居住者に割り当てられたIPアドレスを使用するプロキシサーバーです。家庭用のコンピュータやスマートフォンなどに割り当てられたIPアドレスを介してインターネットのリクエストを送信します。データセンタープロキシがサーバーから生成されるIPアドレスを使用するのに対し、レジデンシャルプロキシは物理的な場所と結びついているため、信頼性が高く、検出されにくいです。

レジデンシャルIPは、インターネットサービスプロバイダ（ISP）によって発行され、特定の地理的な場所に存在する実際のユーザーを表すため、より信頼されやすいとされています。

## レジデンシャルプロキシの仕組み
レジデンシャルプロキシを使用すると、Webサイトやオンラインサービスへのアクセスリクエストが、実際の居住者のIPアドレスを通じて送信されます。仕組みは以下の通りです。

1. リクエスト: ユーザーがレジデンシャルプロキシを介して特定のWebサイトやサービスにアクセスするためのリクエストを送信します。
2. ルーティング: プロキシがユーザーの元のIPアドレスを隠し、レジデンシャルIPアドレスを使用してリクエストを転送します。
3. 応答: Webサイトやサービスは、リクエストがプロキシやデータセンターからではなく、通常の居住者から送信されたと認識します。

このプロセスにより、ユーザーの身元と位置が隠されるだけでなく、Webサイトがプロキシを使用していることを検出するのが難しくなります。

## レジデンシャルプロキシのメリット
- 高い匿名性: レジデンシャルプロキシは実際の居住者のIPアドレスを使用するため、Webサイトがプロキシとして検出するのが非常に難しいです。これはデータセンタープロキシに比べて、はるかに高い匿名性を提供します。


- 信頼性の向上: データセンターIPは、自動化されたアクティビティと関連付けられることが多いため、Webサイトでブロックされることがよくあります。一方、レジデンシャルプロキシは、ブラックリストに登録される可能性が低く、使用中に中断やブロックされるリスクが少なくなります。

- 効率的なWebスクレイピング: データ収集に依存する企業は、レジデンシャルプロキシを使用することで、検出やブロックを回避しながら、データを効率的にスクレイピングできます。

- CAPTCHA回避: 多くのWebサイトは、自動化されたアクセスを防ぐためにCAPTCHAシステムを採用しています。レジデンシャルプロキシは、リクエストが実際のユーザーから来ているように見せることで、CAPTCHAを回避する手助けをします。

## レジデンシャルプロキシの主な使用例

- データスクレイピング: Webサイトからデータをスクレイピングする企業にとって、レジデンシャルプロキシは不可欠です。高度な対策が施されたWebサイトからも、ブロックされずにデータを収集することができます。

- 広告検証: マーケターは、異なる地域のユーザーが広告を正しく表示しているか確認するためにレジデンシャルプロキシを使用し、不正な広告が表示されないように監視します。

- スニーカーボット: スニーカーボットを使用して限定版商品の購入を自動化する際、レジデンシャルIPを使うことでボットの検出を避け、競争の激しいリリースでも優位に立つことができます。

- ソーシャルメディア管理: 複数のソーシャルメディアアカウントを管理する場合、同じIPアドレスを使っているとアカウントが検出され、ブロックされる可能性があります。レジデンシャルプロキシを使えば、複数のアカウントを安全に管理できます。

- SEOモニタリング: SEOの専門家は、異なる地域での検索結果を確認するためにレジデンシャルプロキシを利用します。これにより、地域に依存しない正確なデータを取得できます。

## レジデンシャルプロキシ vs データセンタープロキシ: どちらを選ぶべきか？
レジデンシャルプロキシとデータセンタープロキシは、どちらも匿名性とセキュリティを提供しますが、それぞれ用途が異なります。以下に主な違いを示します：

|特徴|レジデンシャルプロキシ|データセンタープロキシ|
|---|---|---|
| IPソース  | 実際のISP発行の居住用IP  | サーバー生成のIP |
| 検出リスク | 低い（通常のユーザーのように見える）| 高い（Webサイトによって簡単に検出される）|
|速度 | 実際のデバイス経由のため若干遅い | 通常は高速 |
|スクレイピングの信頼性 | 高い（ブロックや制限が少ない）| 低い（ブロックされやすい）|
|コスト | 高い（居住用IPが限られているため）| 低コスト|

大量のデータスクレイピングや高い匿名性を必要とする場合は、レジデンシャルプロキシが適しています。一方、コストや速度が重要で、匿名性がそれほど必要でない場合は、データセンタープロキシでも十分です。

## レジデンシャルプロキシ提供者を選ぶ際のポイント
レジデンシャルプロキシ提供者を選ぶ際に、以下のポイントを考慮することが重要です：

- IPプールの規模: 大規模なIPプールを提供するプロバイダーを選ぶことで、ブロックされるリスクを軽減できます。

- 地理的な位置: 必要な地域にIPアドレスを提供しているかどうか確認しましょう。

- IPのローテーション: 一部のプロバイダーは、定期的にIPアドレスを切り替える機能を提供し、検出されるリスクをさらに減らせます。

- 信頼性とサポート: 提供者が信頼できるサービスと、問題が発生した際の顧客サポートを提供しているか確認する必要があります。
AtomLiteで室温、湿度をLINEへ通知

# 概要
　AtomLiteとM5Stack用温湿度気圧センサユニット（Ver.3)を使い、
 　ボタンを押すと温度、湿度をLINEトークへ通知します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611426/27c13f30-1280-a0f9-b387-4e8314c0620f.png)

 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611426/286ece98-95f4-47ad-bf59-6b8ca5e39342.png)

# 環境など
　エディタ：VisualStudioCode（PlatformIO IDE）
　マイコン：ATOM Lite　
 　温湿度センサ：M5Stack用温湿度気圧センサユニット Ver.3（ENV Ⅲ）
　フレームワーク：Aruduino

 # コード　
``` cpp
#include <Arduino.h>
#include <M5Unified.h>
#include <WiFiClientSecure.h>
#include "M5_ENV.h"

const char* ssid     = "";//環境に合わせて適宜設定
const char* password = "";//環境に合わせて適宜設定
const char* host     = "notify-api.line.me";
const char* token    = "";//発行したトークンを記入

// ENV3定義
SHT3X sht30;
QMP6988 qmp6988;
float tmp      = 0.0;
float hum      = 0.0;
float pres     = 0.0;

// ENV3センサー値読み取り
void readENV()
{
  pres = qmp6988.calcPressure();//Pa
  pres=pres/100;//hPa
  if (sht30.get() == 0) {
    tmp = sht30.cTemp;
    hum = sht30.humidity;
  } else {
    tmp = 0, hum = 0;
  }
}

boolean line_notify(String msg) {
  WiFiClientSecure client;
  client.setInsecure();
  if(!client.connect(host, 443)) {
    Serial.println("connect error!");
    return false;
  }
  String query = String("message=") + msg;
  String request = String("")
              + "POST /api/notify HTTP/1.1\r\n"
              + "Host: " + host + "\r\n"
              + "Authorization: Bearer " + token + "\r\n"
              + "Content-Length: " + String(query.length()) +  "\r\n"
              + "Content-Type: application/x-www-form-urlencoded\r\n\r\n"
              + query + "\r\n";
  client.print(request);
  client.flush();
  client.stop();
  return true;
}

void setup() {
  M5.begin();
  Serial.begin(115200);//USBシリアル

  // I2C設定
  Wire.begin(26,32,100000UL);

  // ENV3設定
  qmp6988.init();

  delay(5000);
  Serial.println("WiFi Start"+String(ssid));
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi Connected");
}

void loop() {
  M5.update();
  if(M5.BtnA.wasPressed()) {
    readENV();
    String msg = "\n温度:" + String(tmp,1) +"℃ 湿度:"+String(hum,0)+"%";
    Serial.println(msg);
    String msg_notify = "\n温度:" + String(tmp,1) +"%E2%84%83 湿度:"+String(hum,0)+"%25";//URLエンコード　%E2%84%83⇒℃　%25⇒%
    line_notify(msg_notify);
    Serial.println("LINE-NOTIFY FINISH");
  }
}
```

# plathomeio.ini設定
[env:m5stack-atom]
platform = espressif32
board = m5stack-atom
framework = arduino
monitor_speed = 115200
lib_deps = 
	m5stack/M5Unified@^0.1.14
    m5stack/M5Unit-ENV@^0.0.7

# 参考サイト
https://sample.msr-r.net/m5stack-line-notify/

https://qiita.com/KoichiMatsui/items/098734fc15e558af06e4
Postgresql@16でベクトル拡張の失敗に対処する（Mac）

### 問題： macOS上で、brew installしたpostgresql@16にvector extensionを作成しようとするとエラーになる。
```bash
work1=# create extension vector;
```
ERROR:  extension "vector" is not available
DETAIL:  Could not open extension control file "/usr/local/opt/postgresql@16/share/postgresql@16/extension/vector.control": No such file or directory.
HINT:  The extension must first be installed on the system where PostgreSQL is running.

### 解決法： 以下の手順でpgvectorをインストール（brewでは失敗する）
```bash
git clone --branch v0.7.4 https://github.com/pgvector/pgvector.git
cd pgvector
make PG_CONFIG=/usr/local/opt/postgresql@16/bin/pg_config all
sudo make PG_CONFIG=/usr/local/opt/postgresql@16/bin/pg_config install
```
ポイントはPG_CONFIGの設定。これ無しで普通にmakeすると以下のエラーになる：
```bash
~/pgvector $make
```
Makefile:48: /usr/local/opt/libpq/lib/postgresql/pgxs/src/makefiles/pgxs.mk: No such file or directory
make: *** No rule to make target `/usr/local/opt/libpq/lib/postgresql/pgxs/src/makefiles/pgxs.mk'.  Stop.

### 確認:
```bash
work1=# create extension vector;
```
CREATE EXTENSION
```bash
work1=# \dx
```

                             
|Name|Version|Schema|Description|                     
|:---|:---|:---:|:-----:|
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
 *vector* | *0.7.4*  | *public*     | *vector data type and ivfflat and hnsw access methods*
(2 rows)


とvector行が追記されている。

・生成されたモジュール：
/usr/local/opt/postgresql@16/lib/postgresql/vector.dylib
・ vector.controlは、以下のディレクトリに生成された：
/usr/local/opt/postgresql@16/share/postgresql@16/extension

 ### << 参考情報 >>
makeしたく無い人は、postgresql@14 にする：
brew install pgvector で事足りるようです（下記サイトに記述があります）。

以下のサイトがヒント・参考になりました：
https://github.com/pgvector/pgvector?tab=readme-ov-file#installation-notes---linux-and-mac
Pythonにおける**辞書アンパック演算子の使い方

### **演算子の使い方
Pythonでは、辞書をマージしたり、キーワード引数を展開するために**演算子を使用することができます。特にFlaskを使ったアプリケーション開発において、これを活用することでコードの可読性を向上させることができます。

### 基本的な使い方
**演算子は、辞書を展開して、他の辞書や関数の引数に渡す際に利用されます。以下にその基本的な使い方を示します。

```python
common_attributes = {
    "attr1": "value1",
    "attr2": "value2",
}

specific_attributes = {
    "attr3": "value3",
    "attr4": "value4",
}

merged_attributes = {**common_attributes, **specific_attributes}
print(merged_attributes)
```
```
# 出力: {'attr1': 'value1', 'attr2': 'value2', 'attr3': 'value3', 'attr4': 'value4'}
```
この例では、common_attributesとspecific_attributesという二つの辞書をマージして、新しい辞書merged_attributesを作成しています。

### Flaskでの応用例
Flaskを使用する際、**演算子は特に便利です。以下の例では、共通の属性と特定の属性を組み合わせて、トランザクション属性を作成しています。

```python
data_dict = {
    **common_attributes,
    **specific_attributes,
    "api_id": "APIID",
}
```
このコードのポイント
common_attributesとspecific_attributesを**演算子を使ってマージしています。これにより、両方の辞書の内容を簡潔に組み合わせることができます。
さらに、新しいキー（api_id）を追加することで、必要な情報を一つの辞書に集約しています。
このように、**演算子を活用することで、辞書の操作が簡単になり、コードの可読性も向上します。特にFlaskのようなWebアプリケーションでは、リクエストやレスポンスのデータを柔軟に扱うために非常に役立ちます。

### まとめ
Pythonの**演算子は、辞書をマージしたり、キーワード引数を簡潔に扱うための強力なツールです。Flaskでの開発においても、その利便性を活かして、よりクリーンなコードを書くことができます。
xamppの環境構築

# XAMPPを使ったローカルホストでプログラミングを行うための準備

## 対象者
これからプログラミングを始める人、またはローカル環境を構築しようとしている人向けです。

## 手順

### 1. XAMPPの起動
1. `xampp-control.exe` を実行してXAMPPを起動します。

### 2. Apacheの起動
1. XAMPPのコントロールパネルから「Apache」を起動します。

### 3. ローカルホストへの接続確認
1. ブラウザを開き、URLに `http://localhost:80/` と入力します。
2. 「404」以外のページが表示されれば、Apacheの起動が成功しています。

### 4. MySQLの起動と確認
1. XAMPPのコントロールパネルから「MySQL」をスタートします。
2. `MySQL Workbench` などのツールを使って、MySQLが正常に起動していることを確認します。

### 5. Gitリポジトリのクローン
1. Visual Studioを起動し、「新しいターミナル」を開きます。
2. ターミナルで `cd xampp56/htdocs` と入力し、`htdocs` フォルダに移動します。
3. 次に、`git clone` コマンドを使ってGitLabからリポジトリをクローンします。
   ```bash
   git clone <リポジトリのURL>
Columinityでスクラムチームの強み・弱みを知ろう

### はじめに
私は普段、スクラム開発を導入しているチームで開発者として働いています。
所属チームに対しては、以前から雰囲気の良いチームであり、各人が開発をしながら成長できる環境が整っている、とポジティブな印象を持っていました。
しかしそれはあくまで個人の感覚であり、他のメンバーがどのように感じているのか、チームが一般的に見ても望ましい状態にあるのかを知るきっかけはありませんでした。

そこで今回、Columinityというツールを用いてチーム診断を実施してみました。
本記事では、Columinityとは何か、また、その診断結果を基にチームでどのようなワークを実施したかについて紹介します。

### [Columinity](https://columinity.com/home)とは
チームワークの質を明らかにすることで、チームの改善を支援するツールです。
今回はAgile/Scrum Team Effectivenessモデルを用いて診断を実施しました。

![agile_scrum_team_effectiveness.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513849/16ab9da4-e7e0-78f0-062a-a11591f7c50a.png)

このモデルは、[What Makes Scrum Teams Effective? A scientific investigation of 1.200 Scrum teams](https://www.scrum.org/resources/blog/what-makes-scrum-teams-effective-scientific-investigation-1200-scrum-teams)（[日本語版](https://www.servantworks.co.jp/posts/what-makes-scrum-teams-effective/)）で紹介されている研究に立脚しています。この研究では、実際のスクラムチームのデータを収集し、それに基づいてスクラムチームの有効性に寄与する要因を抽出することで、以下のようなモデルを作成しました。

![model_diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513849/cc99fa49-4675-93fa-9c53-55a23adf8349.png)
（引用元：https://dl.acm.org/doi/10.1145/3571849?ref=ServantWorksInc）

ColuminityのAgile/Scrum Team Effectivenessモデルを選択して、表示される多数の設問に回答していくことで、このモデルに沿ってチームの質を測定することができます。また、チーム単位でメンバーの回答を集計して、チームの平均スコアを確認できます。

![questionnaire.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513849/4b83dc8a-c4c0-dc04-7810-aa5ae267f452.png)

### Columinityの結果を用いたチーム内ワーク
所属チームの診断結果は以下のようになりました。この結果を参考にしながら、各人がチームに対して感じている印象や課題について共有し、スコアの低い項目を改善するための方法について議論を行いました。

![team_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513849/2d017d5f-8e73-9cea-2999-9f688a06b6b7.png)

議論した内容についていくつか紹介します。
- Continuous Improvement
Psychological Safety や Lack of Team Conflict のスコアが高く、ばらつきも少ないことから、メンバー間の関係性としては良いものを築けていることがわかりました。一方で、低いスコアとなった Metric Usage に関しては、現状チームのプロダクトを頻繁に測定する術を持てていないことが影響しました。今後、定量的かつ継続的に使える指標を導入できないか検討していこう、という話にまとまりました。

- Stakeholder Concern
Sprint Review Quality について特にばらつきが大きい結果となりました。高頻度でステークホルダーをスプリントレビューに招待しフィードバックを得ようとしている、というチームの行動を考慮して高いスコアをつけたメンバーがいる一方、実際にはステークホルダーからのフィードバックが質の高いものだとは言えないからと、低いスコアをつけたメンバーもいました。今後はスプリントのインクリメントの説明に終始するのではなく、背景や目的をより丁寧に繰り返し伝えていくことで、ステークホルダーからの関心を高めていきたい、という結論になりました。

- Responsiveness
Release Frequency の低さが全項目の中で最も顕著に現れました。プロダクトの性質上、頻繁にリリースすることは難しいのですが、スコープの一部分だけでもなるべく早くユーザーに試用してもらえるようにしていきたい、という意見が出ました。


### おわりに
Columinityによる診断が、チームに対する漠然とした印象を要素に分解して考慮・議論するきっかけになると感じました。診断結果を見て満足するのではなく、次の行動につなげ、チームをより良くしていけたらと思います。
最後までお読みいただきありがとうございました。
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（89/100）

【89日目】
トピック 9：SAPS/4HANAでの簡易製造（6/9）

≪問題89≫
繰返生産におけるライン負荷中に、数量と能力の両方を計画する必要があるのは、どのオプションですか。
（２つ選択）
□製造バージョンの自動選択を使用してMRPを実行する。
□繰返生産でPP/DSヒューリスティックを実行する。
□計画テーブルにおいてマニュアルで計画手配を割り当てる。
□供給量割当を使用してMRPを実行する。

≪解答≫
□製造バージョンの自動選択を使用してMRPを実行する。
■繰返生産でPP/DSヒューリスティックを実行する。
■計画テーブルにおいてマニュアルで計画手配を割り当てる。
□供給量割当を使用してMRPを実行する。

≪解説≫  
◆さまざまなオプションを活用することで、ライン負荷（生産ラインへの計画手配の割り当て）を計画することが可能です。これらのライン負荷オプションは、数量計画と能力計画の両方に関連するものと、数量計画のみに関連するものに分けられます。  
◆数量計画および能力計画の両方に関連するもの  
（1）計画テーブルを使用し、利用可能なラインに対して数量を手動で計画します。  
（2）PP/DSヒューリスティックの利用。繰返生産に対してPP/DSヒューリスティックを使用する場合、数量計画、ライン負荷計画、そして能力計画を3つのステップで自動的に統合し、実行することが可能です。  
◆数量計画のみに関連するもの  
（1）MRP実行時に製造バージョン（生産ライン）を自動で選択することができます。複数のラインが利用可能な場合、最初に見つかったラインが割り当てられます。  
（2）供給量割当を使用したMRP実行。複数の生産ラインが利用可能な場合、供給量割当を使用することで、代替ライン間で数量を配分することが可能です。
USB 3.xのバージョン比較 - 速度・機能・用途のまとめ

# USB 3.xのバージョン比較 - 速度・機能・用途のまとめ

USB 3.xシリーズは、データ転送速度や機能に違いがあり、利用シーンに応じて選択することが重要です。この記事では、USB 3.xの各バージョンについて、転送速度や充電、映像出力のサポート状況をわかりやすく整理しました。

## USB 3.xの規格と転送速度

USB規格は主に**データ転送速度**に関するものです。

| バージョン            | 最大転送速度  | コネクタ      |
|--------------------|-------------|-------------|
| USB 3.0 / 3.1 Gen 1 / 3.2 Gen 1 | 5 Gbps      | USB-A, USB-C |
| USB 3.1 Gen 2 / 3.2 Gen 2       | 10 Gbps     | USB-A, USB-C |
| USB 3.2 Gen 2x2                 | 20 Gbps     | USB-Cのみ      |

## 充電機能（Power Delivery）

USB Power Delivery（PD）は、デバイスとケーブルが対応している場合、最大100Wまでの電力供給が可能です。ただし、すべてのUSBケーブルがPD対応ではないため、**ケーブルとデバイスの両方を確認**する必要があります。

ケーブル内には**E-Marker（電子マーカー）**というチップが組み込まれていることがあり、このチップにはケーブルの最大電力、転送速度、その他の仕様が記録されており、充電器やデバイスはこの情報を読み取り、どの程度の電力を流すかを判断します。

## 映像出力機能

映像出力は転送速度に関係なく、**DisplayPort Alt Mode**や**HDMI Alt Mode**の対応が必要です。以下のような条件で映像出力が可能です。

| バージョン            | 映像出力のサポート |
|--------------------|------------------|
| USB 3.1 Gen 1（USB 3.0） | 標準では対応なし（USB-C使用時に可能な場合あり） |
| USB 3.1 Gen 2       | DisplayPort Alt Mode対応 |
| USB 3.2 Gen 2x2     | DisplayPort Alt Mode対応 |

## 後方互換性

USB 3.xのすべてのバージョンは**USB 2.0以前の機器とも互換性**があり、古いデバイスでも利用可能です。

---

### まとめ

USB 3.xの各バージョンはデータ転送速度に違いがあり、映像出力や充電機能はケーブルや機器の対応によります。


以下は、Qiita向けにUSB 3.xの記事の末尾に追加したい内容です。

---

### (補足)ケーブル管理のための略語表記

ケーブルの種類や機能をコンパクトに表記するため、私が使用している以下の略語を追記します。

1. **種類**: U2（USB 2.0）、U3（USB 3.x）、T3（Thunderbolt 3）、T4（Thunderbolt 4）
2. **長さ**: 1m、2m、3m
3. **転送速度**: 480M、5G、10G、40G
4. **充電機能**: 5W、60W、100W、N（非対応）
5. **映像対応**: 4K、8K、N（非対応）
6. **映像規格**: DP、HDMI、N（非対応）
7. **コネクタ形状**: C-A、C-C

例: 「T4 1m 40G 100W 4K DP C-C」
The Get Records element isn't configured properly



# The Get Records element isn't configured properly. Check the instructions for the Filter Contact Records section.


+ [I keep getting the error "The Get Records element isn't configured properly. Check the instructions for the Filter Contact Records section."](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clqkz)

:::note
Please check this article.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000GzH3HSAV

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000ElxFASAZ
:::

# Get Records element isn't configured properly. Check the instructions for the Filter Contact Records section.

+ [組織内の一致する取引先責任者の確認のハンズオンエラーについて](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V00007cmMeF)

:::note
同じエラーの投稿があります。 最新版を保存できていなかったとのことです。

After coming across this same issue myself, looking for answers, trying numerous things what worked was a simple user error... 

I had failed to click "save" in the top right of the flow. 🤦🏼‍♂️ I saved the element, but not the flow.   Hope this helps someone else avoid the silly mistake I was making!

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000ElxFASAZ
:::

# The Get Records element isn't configured properly. Check the instructions for the Filter Contact Records section

+ [Step not yet complete in Flows The Get Records element isn't configured properly. Check the instructions for the Filter Contact Records section.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ertAL)

:::note
Try changing the variable name to Contact.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5a06c1f0-0fb8-ec5e-1a0b-be4ff0a3f7a1.png)
:::
おすすめのVScode拡張機能15選

## 概要
VScodeはそのままでもとても使いやすいエディターではありますが、拡張機能を入れる事でより効率的に開発を行うことが出来ます。
今回は、React(javascript,typescript)とLaravel(PHP)を使って開発を行う際に入れておくと便利な拡張機能を15個ご紹介します。


## VScodeおすすめの拡張機能

### 基本編
1. __Japanese Language Pack for Visual Studio Code__
VScodeのUIを日本語化してくれる定番の拡張機能
1. __GitHub Theme__
VScodeの画面をGitHubのテーマに変更ができる拡張機能。シンプルで視認性も高い為、どんなテーマにしようか迷っている方におすすめです
1. __Material Icon Theme__
VScode上のエクスプローラにファイルの拡張子に合わせたアイコンを表示させる拡張機能。ぱっと見た時にファイルの種類が分かる為、一度使うと手放せない拡張機能の1つです
1. __zenkaku__
全角スペースを検知して教えてくれる拡張機能。不意な全角スペースの混入でコンパイルエラーに悩まされる経験はエンジニアの方なら1度は経験したことがあると思います。この拡張機能を使うことで、全角スペースを入力するとグレーでスペース部分が表示される為、全角スペースが紛れ込んでいるのに気づきやすくなります
1. __Docker__
VScodeでDockerfileの編集を行う際に入力補完を行ってくれたり、Dockerコンテナの状況を確認できる拡張機能。
開発でDockerを使うなら入れておくと痒い所に手が届く便利な拡張機能です
1. __Dev Containers__
Dockerではアプリケーションを動作させる環境を構築する事が出来ますが、Dev Containersを使うことでランタイムやVSCodeの拡張機能などの環境ごとコンテナにすることが可能になります。Aプロジェクトではコードフォーマッタは〇〇をBプロジェクトでは△△をといった異なる環境を構築したい時にも役立ちます
1. __Git History__
コードのバージョン管理をGitを用いて行っている方は多いと思います。VSCode上の画面にGitの履歴を表示したり、ブランチのツリーを確認したりできる拡張機能です。Gitでバージョン管理を行っている方はぜひ入れてほしい拡張機能の一つです

### 開発編（React,Laravel）
1. __ES7+ React/Redux/React-Native snippets__
VSCodeでReactを書く際に入力補完を行ってくれる拡張機能。「rfc」タブ補完で、コンポーネントの雛形の作成が行えるなど便利機能が多数追加されるので、ぜひ入れておきたい拡張機能の1つ。
1. __VSCode React Refactor__
JSX・TSXを編集時にリファクタリングメニューを追加してくれる拡張機能。
1. __Prettier - Code formatter__
Javascript,Typescriptのコードを自動整形してくれる拡張機能。VSCodeの設定でファイル保存時に自動で整形することも可能
1. __Rainbow CSV__
CSVファイルをVSCodeで閲覧する際に見やすく色分けしてくれる拡張機能
1. __DotENV__
.envファイルを編集する際に、見やすく色分けしてくれる拡張機能
1. __Laravel Extension Pack__
VSCodeでLaravel開発に必要な一連の拡張機能をまとめたパック
1. __PHP Debug__
デバッグを行う時に欠かせないブレークポイントの設定機能などを追加してくれる拡張機能。xDebugと連携することでより詳細なデバッグが行える
1. __PHP Intelephense__
PHPのコード補完や整形を行ってくれる拡張機能。Laravelで開発するならぜひ入れておきたい

### 番外編
VScodeの拡張機能とは違いますが、合わせて入れておくと便利なChromeの拡張機能もご紹介します
1. __React Developer Tools__
Reactのデバッグを行える拡張機能。コンポーネント構造の確認などReactで開発するなら必須で入れておきたい
1. __Xdebug helper__
前述のPHP Debugと連携することでLaravelのデバッグを行うことができる。
Set Up Your Salesforce Mobile Developer Tools for Lightning Web Components



https://trailhead.salesforce.com/content/learn/projects/set-up-your-salesforce-mobile-developer-tools-for-lightning-web-components?trail_id=build-lightning-web-components

# Use Salesforce Mobile Developer Tools

+ [[Error] LightningExperience : Error parsing file: Element {}enableLightningPreviewPref invalid at this location in type LightningExperienceSettings](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erMJM)

:::note
I was having the same issue, what fixed it for me is specifying that I want the preview release in my scratch org definition file by adding:

```
"release": "preview"
```

Definition should be similar to:

```
{
  "orgName": "Demo company",
  "edition": "Developer",
  "release": "preview",
  "features": ["EnableSetPasswordInApi"],
  "settings": {
    "lightningExperienceSettings": {
      "enableS1DesktopEnabled": true,
      "enableLightningPreviewPref": true
    },
    "mobileSettings": {
      "enableS1EncryptedStoragePref2": false
    }
  }
}
```
泳げない Windows のプール

どのアプリもメモリを使っていないのにも関わらず、メモリが枯渇することに遭遇したことはありませんか？それ、プールが大きくなっているかもしれませんよ。

## プールってなに？
プール は、Windows のカーネルモードで動作するドライバー（Microsoft製以外のドライバーを含む）が、必要に応じて確保するメモリ領域になります。

プールの使用量は、タスクマネージャーのメモリタブで確認でき、プールの使用量が多い場合は、カーネルモードでメモリが使用されていると判断できます。

![taskmgr_memory_pool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/b77f8f84-38e6-10a6-4e47-0c5ab7e60395.png)

タスクマネージャーの表示からわかるように Windows のプールにはページプールと非ページプールの２種類があります。

### 1. ページプール (Paged Pool)
ページング可能なメモリ領域で、必要に応じてディスクにページアウトされることがあります。システムの動作に応じて必要なときに再び物理メモリへページインされます。

### 2. 非ページプール (Non-paged Pool)
これは物理メモリに常に保持され、ページアウトされないメモリ領域です。ページアウトが許されない、すぐにアクセスする必要がある重要なデータを保持します。

非ページプールの容量は有限で、上限は物理メモリのサイズにより決まります。システムの安定性に関わるため、非ページプールの使用量が増え物理メモリ不足になると、システムに重大な問題が発生します。

## プールでメモリを確保するには？
ユーザーモードで動作するプロセスは、プールでメモリを確保することはできませんが、カーネルモードで動作するドライバーであれば、[ExAllocatePoolWithTag](https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-exallocatepoolwithtag) 関数を使用してメモリを確保できます。なお、第一引数で非ページプールやページプールのどちらを使用するかは指定できます。

## プールで発生する問題
一般的なメモリの問題であるメモリリークがあります。カーネルモードで確保したプールのメモリが使用後に正常に解放されないと、メモリリークが発生し、システム全体が不安定になることがあります。

特に非ページプールの上限は物理メモリに依存しているため、非ページプールでメモリリークが発生し、物理メモリが枯渇すると OS がハングすることがあります。

プロセスでのメモリリークが発生するとプロセスを強制終了することで、メモリを解放することができますが、プールでメモリリークが発生すると OS を再起動で解消する必要があります。

実際にページプールまたは非ページプールでメモリ使用量が多くなるとどのような問題が起きるかは、Microsoft が公開している [NotMyFault](https://learn.microsoft.com/en-us/sysinternals/downloads/notmyfault) ツールでテスト可能です。

NotMyFault ツールを起動し、Leak タブにある [Leak Paged] または [Leak Nonpaged] ボタンをクリックすると、１秒ごとに指定したメモリ量をページプールまたは非ページプールに確保して、メモリ リークを意図的に発生させられます。

![notmyfault.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/4c521dfa-86b2-b3d9-87b0-2cdd177e3ed9.png)

## さいごに
どのアプリもメモリを使用していないのに、メモリが枯渇している場合には、プールの使用量を確認してみてください。サイズが大きい場合は、いずれかのドライバーの不具合により、メモリリークが発生している可能性があります。

プールでメモリリークを発生させているドライバーは、[WPR](https://learn.microsoft.com/en-us/windows-hardware/test/wpt/windows-performance-recorder) や [WPA](https://learn.microsoft.com/en-us/windows-hardware/test/wpt/windows-performance-analyzer) を使用して調査できます。調査方法については、別途投稿しようと思います。
生成系AIと営業部隊について

## はじめに
個人の主観である
Geminiに関する授業を受け、感じたことのアウトプットである
とりわけ自社の営業組織と照らし合わせて考えたアウトプットである

## 作業をする法人営業部隊は不要になる
生成系AI✖️自社DBの活用で作業をする法人営業部隊は不要になる
具体として、法人と個人を**つなぐ**ような法人営業部隊は不要だ

法人が個人を選定する際、AIでスコア化して相性を測ることができる
AIに目標達成のプロセスを敷いてもらい、AIとNA設定し、AIスコアに応じて個人を選定する

個人が法人を選定する際、AIでスコア化して相性を測ることは難しい
企業の評価については、AIでスコア化することは難しい
そのような仕組みができれば、個人も活用できるが、現実味がない
企業が開示している情報は一部であり、かつAIスコアが低くついた場合の非難を受ける