OmniAICreator/Qiita-1.07M huggingface dataset:
「ProScheduler WBS Gantt」と「リックソフト WBS Gantt」の比較


[ProScheduler WBS Gantt](https://marketplace.atlassian.com/apps/1223423/resource-planning-gantt-chart-project-management-for-jira?hosting=datacenter&tab=overview) がいかに リックソフト WBS Gantt よりも優れているか、さらに詳しく見てみましょう。
ProScheduler はプロジェクトとリソース管理のアドオンで、プロジェクト計画、リソーススケジューリング、タイムトラッキング用のツールを提供します。WBS Gantt chartはProShedulerに含まれる機能で、Ricksoft WBS GanttはGantt chartのみのツールとなります。

[ProScheduler WBS Gantt for Jira](https://marketplace.atlassian.com/apps/1223423/resource-planning-gantt-chart-project-management-for-jira?hosting=datacenter&tab=overview) の画面
![TBPS_GANTT(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3097452/d7af251c-4426-a264-2d8f-4b567b2bd7a9.png)


Ricksoft WBS Ganttの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3097452/e04027ed-7416-dce5-47a3-023fced397f6.png)



## 機能概要
どちらもガントテーブル、ガントバー、マイルストーン、クリティカルパス、ベースライン、オートスケジューリングなどのガント機能を実装しています。
しかし、ProScheduler はより高度なイシュー・テーブルを提供し、他のExcelのような表計算ツールを使わずにスプレッドシートのように作業することができます。以下のデモで、その動作を確認してください。
ProsSchedulerはガントバーで進捗を可視化するのに対し、RS WBS Ganttはそれができません。


## UI
Ricksoft WBS GanttのUIは20年前に設計され、サードパーティによって開発、販売されたJavascript Ganttライブラリを使用しています。そのため、コードを完全に制御することができず、変更や機能追加が困難で、バグの修正も業者に頼らざるを得ません。
ProScheduler WBS GantはDevSamuraiチームによって管理され、すべて社内で実装されたモダンなUIUXを備えています。メンテナンス、アップグレード、機能追加も非常に簡単です。

## パフォーマンス
Ricksoft WBS Ganttは、1回の試行ですべての課題を取得し表示しますが、表示数には制限があります（デフォルトは2000件）。
ProScheduler WBS Gantt は、最新のウェブアプリケーションの利点を生かし、ボード上の課題を非同期にロードして表示し、制限もありません。30,000件の課題をテストし、問題なく動作することが証明されています。

## 今後のアップデート
Ricksoft WBS Gantt は15年以上前から Atlassian Marketplace にて提供されている製品ですが、その間あまりアップデートや 新機能の追加がなく、サードパーティライブラリを使用しているため、今後のアップデートには限界があると思われます。
[ProScheduler](https://www.teamboard.cloud/) WBS Ganttは新たに作成されたプロジェクト管理ツールの一機能で、より多くの機能を追加し、現在の動作を継続的に改善するためにチーム一丸となって懸命に働いています。リソーススケジューラ、タイムトラッキング、WBSガントが利用可能で、DevSamuraiは顧客からのフィードバックと要求に基づいて、カレンダー、リスク管理などを追加する予定です。

Atlassian Marketplace にて 2 つのアプリを比較することができます。

https://www.youtube.com/watch?v=B2wbYtb118I
CISSP認定試験　合格体験記

# はじめに

CISSP認定資格試験にパスしたので記事にしてみました。

# Who am i ?

しがないエンジニアです。

# この記事の想定読者

 - CISSP認定試験の受験を想定している、もしくはトレーニング受講を検討している人
 - CISSPが何かを知りたい人
 - その他


# CISSPとは？

CISSPについてはNRIセキュア社のページが詳しいです。トレーニングも開催されていて、こちらから申し込みが可能になっています。私もこちらから申し込みを行いました。試験バウチャー付きがオススメです。

https://www.nri-secure.co.jp/service/learning/cissp_overview

# CISSPになるためには？

CISSPになるためには、試験合格後にエンドーサー（推薦人）からの推薦などが必要です。
私は職場の人にエンドーサーになってもらいました。正式にCISSPを名乗るためには、これらを突破する必要があります。

こちらのページが詳しいです。

https://japan.isc2.org/cissp_outline.html


職場にエンドーサーがいない場合には、上記トレーニングの講師がエンドーサーになってもらうことも可能みたいです。そういった意味でもCISSPのCBKトレーニングはオススメですね。

# CISSPについて勉強する前に

実を言うと、私はCISSPの研修を受講する前にEC-CouncilのCertified Network Defender（以降、CND）という資格を取得していました。CNDを取得するにあたり勉強した内容が、CISSPの内容とも多少オーバーラップしていることもあって、勉強がとっつきやすかったです。ただし、CISSPは考え方について問われる試験なので、CNDとは毛色が異なる資格というのは理解しておく必要があります。一方でCNDはどちらかというと知識を問われる資格です。CNDについても記事を書いているので、もしよろしければ参考になさってください。

https://qiita.com/forest_moririri/items/177de91b69c109b5e6a0


# CISSP認定試験の勉強について（特に教材）

CISSP認定試験の勉強法は他の方が色々ブログにされている通りで、新版CISSP CBK 公式ガイド日本語版とCISSP公式問題集日本語版がオススメです。

新版CISSP CBK 公式ガイド日本語版とCISSP公式問題集日本語版についてはこちらで詳しく説明されています。

https://japan.isc2.org/cissp_examination.html


# 試験当日

試験当日はPeasonVueで受験をしました。試験時間が6hもあるのですが、自分が受験した時は見直しができない方式でしたので、ほとんど時間を使い果たしました。精神力との勝負な感じでしたね。。合格した時は涙が出そうになりました。嬉しかったです。

# 最後に

CISSPホルダーは少しずつ日本でも増えてきているようで、4000人に届きそうな感じのようですね。
日本語問題集も出版されてきているようで、取り組みやすくなってきていると思います。
PKI とは

## 勉強前イメージ

サーバのSSLの鍵置くのとかPKIって名前ついてた気がする

## 調査

### PKI とは

Public Key Infrastructure の略で、他にも公開鍵基盤とも言われます。
公開鍵暗号方式の技術を使って、安全に通信を行うための環境のことを指します。

公開鍵暗号方式とは公開鍵と秘密鍵を使いますが、暗号化・復号化する際に別々の鍵を使います。
公開鍵は誰でも取得できますが、秘密鍵は受信側だけが持っています。
その為第三者が公開鍵を取得したとしても復号ができないようになっています。

### PKIの機能

- 暗号化

データを暗号して他の第三者に解読されないように保護する

- デジタル署名

データ作成時に作成者が署名を行います。
受け取る際に署名を検証することで正しい相手が作ったことを証明することができ、偽造防止に役立ちます。

## 勉強後イメージ

PKIは公開鍵暗号方式の環境ってことなのかな？
だからwebサーバのSSL置くところとかのディレクトリ名で見たことあるのか、何のやつかは忘れたけど。

## 参考

- [PKIとは](https://www.einspki.jp/support/whatspki/)
- [PKIとは](https://www.nic.ad.jp/ja/basics/terms/pki.html)
基本情報技術者３（学習用）

●データベース・・関連づけて保存されている数値など情報の集まり・データをうまく管理をするため
・リレーショナルデータベース（Rdb)・関係性を持ったデータの集まり

●スキーマ・データベースの仕様や構造を定義するもの.標準的には３層スキーマ。
１外部スキーマ・見た目の決定
２概念スキーマ・データー同士にどのような関連を持たせていくか
３内部スキーマ・どのように保存していくのか。

●ACID・データベースが満たすべき４つの特徴。
原子性・中途半端は許さない
一貫性・矛盾を許さない
隔離性・実行方法により異なることは許さない
耐久性・障害による破損は許さない

●データベースの処理
正規化・データベースの一貫性を保つために必要な処理（主に第一から第３まである）、データ変更の時に処理がしやすくなる
（用語）
関数従属・任意の属性Xが決まれば、一意に属性Yも決まること
部分関数従属・関数従属における属性が複数の時、そのうちの一部だけでも関数従属が成り立つこと
主キー・その属性によってレコードを一意に定めることができるもの

●トランザクション・データの原子性を保つために定める一連の処理のグループのこと。
・コミット・トランザクションが最初から最後まで問題なく終わること
・ロールバック・トランザクションの途中で何かしらの問題が発生し最初に戻ること
・ロールフォワード・データベース自体がダメになってしまった時に,直前にとったバックアップに戻す。

●排他制御・データを一度に変更するなどして起きる、データの不整合をなくす。（同時にトランザクションをやる場合などに一方の処理途中の時はもう一方が処理できないようにする仕組み）
１、共有ロック・読み取れるが書き込めない
２、専有ロック・読み取リモ書き込みもできない

・デッドロック・2つのトランザクションが互いのロック解除を待ち処理が進まないこと
・２相コミット・準備と確定の二回コミットを行う（安全性より高い）
・レプリケーション・障害に備え同一データを別系列に保管しておくこと
2022年のアクティビティ（アウトプットと参加イベントの振り返り）

2022年にアウトプットしたものや参加したイベントなどをまとめてみました。
（といっても勉強会に参加しただけだった…）

## connpass

https://connpass.com/

connpassで面白そうな勉強会が開催されているようであれば、2023年も積極的に参加していきたい。

* 2022/11/22
	* [これから必要とされるPM、必要とされないPM](https://sebook.connpass.com/event/262998/)
* 2022/11/15
	* [「技術書」の読書術を達人に聞いてみた - Forkwell Library #10](https://forkwell.connpass.com/event/264319/)
* 2022/11/08
	* [アウトプットからはじまるエンジニアのキャリア戦略 Vol.3](https://findy.connpass.com/event/263814/)
* 2022/11/02
	* [ToriさんとYosuke Furukawaさんから学ぶ、エンジニアキャリア論](https://findy.connpass.com/event/262314/)

[LAPRASポートフォリオはこちらから](https://lapras.com/ "LAPRASポートフォリオはこちらから")
データカタログ ってなに？

## 勉強前イメージ

なんだろう・・・雰囲気カタログだからこんな奴が入ってるよーみたいなやつ？

## 調査

### データカタログ とは

データのカタログで、企業で持っているデータの辞書のようなものです。

近年ビッグデータともいわれていますが、膨大なデータを扱うことが多くなってきました。
大量のデータを収集し活用は進んでいますが、どう管理するかは大きな課題になっています。

データには [メタデータ](https://qiita.com/miyuki_samitani/items/40131945d884ba9abca5) と呼ばれるものがあります。
メタデータとはデータそのものではなく、データに関する情報を記したデータを指します。
例えば文書のデータであれば、  
文書の内容ではなく、文書の著者や作成日などがメタデータになります。

そして、データカタログとはそのメタデータを管理するシステムのようなものになります。
メタデータを管理することでデータマネジメントを可能とします。


### データカタログのメリデメ

#### メリット

- 分析スピードの向上

データベースは形式や書式などバラバラなデータが格納されているので膨大なデータから必要なものを取り出すのは大変です。
仕組みがきちんと整備されていれば抽出するのも安易になるので、自ずと分析のスピードも上がります。

- データの信頼性のアップ

必要なデータが無かったり逆にデータがいくつも入ってたりすると正しい分析を行うことができません。
データの管理をすることで、データがないことやデータの重複をすぐに見分けることができ信頼性の向上に繋がります。

#### デメリット

- 日々更新し続ける必要がある

ユーザのニーズによってデータカタログを整備し続ける必要があります。
不変のものでないのでアップデートが求められます。

- メタデータの作成が必要

新たなデータが追加されたり、逆に変更されたりします。
その際にメタデータを作成する必要があり時間もかかってしまうことがあります。

## 勉強後イメージ

メタデータ自体の検索もできるようにならないといけないのか

## 参考

- [データカタログとは？導入のメリットや使い方、ツールのご紹介](https://blog.trocco.io/glossary/data-catalog)
windows環境でpre-commitを使ってgit hookを管理する方法

# はじめに
mac環境で行っている記事が多かったので書いてみました。


# 環境
Windows 11
python 3.10.4
powershell 5.1
pre-commit 2.21.0

# 手順

## 前提:仮想環境の作成

※以下すべての手順(1~5)は仮想環境上で行われています。
```powershell
mkdir pre_commit_test
cd pre_commit_test
python -m venv .venv
.\.venv\Scripts\activate
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -For
```

## 1 pre-commitインストール

```
pip install pre-commit
```

## 2 git init
```
git init
```

## 3 設定ファイルの作成

※ powershellからpre-commit用yamlファイルを扱う場合、encodeが必要
```
pre-commit sample-config | out-file .pre-commit-config.yaml -encoding utf8
```

以下のようなファイルができる↓
```.pre-commit-config.yaml
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v3.2.0
    hooks:
    -   id: trailing-whitespace
    -   id: end-of-file-fixer
    -   id: check-yaml
    -   id: check-added-large-files
```

## 4 pre-commit 設定ファイルをgit hooks に適用
```
pre-commit install
```

## 5 テストする
```sample.py
"test" 
```
※ 上記コードは 空白あり 最終行が空行ではない

sample.py作成後、
```
git add
git commit -m "add sample.py"
```

結果↓
```
Trim Trailing Whitespace.................................................Failed
- hook id: trailing-whitespace
- exit code: 1
- files were modified by this hook

Fixing sample.py

Fix End of Files.........................................................Failed
- hook id: end-of-file-fixer
- exit code: 1
- files were modified by this hook

Fixing sample.py

Check Yaml...........................................(no files to check)Skipped
Check for added large files..............................................Passed
```

修正後
```sample.py
"test"

```

※ 空白の削除と最終行に空行を追加を自動で行ってくれている。

修正後commit結果↓
```
Trim Trailing Whitespace.................................................Passed
Fix End of Files.........................................................Passed
Check Yaml...........................................(no files to check)Skipped
Check for added large files..............................................Passed
[master 9a75752] add sample.py
 1 file changed, 1 insertion(+)
 create mode 100644 sample.py
```

# おわりに
次回はpython scriptをgit hooksに適用させる方法について書きたいと思います。


# 参考

https://github.com/pre-commit/pre-commit/issues/1550

https://zenn.dev/yiskw713/articles/3c3b4022f3e3f22d276d
Web技術の基本を学ぶ

# ステートフル
 　statefulのsateは状態や状況を表している。fulとは～に満ちた」という意味がある。つまり状態を維持しているという意味になる。
　ステートフルなプロトコルの例として「FTP」があり、ファイルを転送するための通信プロトコルである。クライアントとサーバー間でファイルのアップロードやダウンロードを行う時に使われる。

# ステートレス
  statelessのlessは不足や乏しいを表している。つまりステートレスの反対で状態を持たないを意味している。以前のログイン状態を持たずにその都度同じレスポンスを返す。ステートレスなプロトコルの例として「HTTP」があり、webサイトでよく見かける「http://」または「https://」から始まるURLがそれにあたる。誰がいつやっても表示されるのは同じwebサイトである。

# Cookie(クッキー）
   　ユーザー情報を一時的に保持をする機能である。それにより快適な操作が可能となる。
  　例えばamazonやtwitterで一度ログインすれば、サイトを訪れるごとにIDやパスワードを入力しなくてもすんなり入ることができる。しかし学校や共有のパソコンでCookieを利用するとCookieが残っていることで、クレジットカード情報やID・パスワードの情報が共有のパソコンに残ってしまい、悪用される危険性があるので注意が必要。

# リクエストとレスポンス
　ページの公開と閲覧は「Webサーバー」と「クライアント(各ユーザーのこと)」間で実現されている。やりとりの流れは
1.クライアントが閲覧したいページ(HTML)の要求をする
2.Webサーバーがそれに応じたページ情報を返す(HTML)
3.クライアント側のPCでWebページを表示する。

# プロトコル
　 Webサーバーとクライアントが通信を行うには約束ごとが必要であり、それをプロトコル(通信プロトコル)という。WebサーバとWebブラウザの間で、Web情報をやりとりするためには「HTTP」、インターネットを使って通信するときは「TCP/IP」、ファイルを受け渡しするときは「FTP」、メールを送るときは「SMTP」などそれに応じた約束事がある。
　例えば人間同士でコミュニュケーションを取ろうとして、片方が日本語でもう片方は英語だとすると言語が異なるので成り立たない。お互いが日本語に統一すれば成り立つ。このように事前に約束ごとを決めておく必要がある。それをプロトコルという。

# ポート番号
　まずIPアドレスというものがありネットワーク上に存在する個々にコンピューターを識別するために、それぞれに異なる値を割り当てたものがある。電話番号みたいなものという説明もあり、それに従えば相手に接続できると考えてもおかしくない。しかしコンピューターの通信は電話とは少し違う。IPアドレスで特定できるのは、ネットワーク上のどのコンピューターなのかというところまである。現実世界でいうと場所まである。電話をかけて特定の方に用事があるときに「〜さんはいますか」といって呼び出すことがある。この呼び出している人(コンピューターの世界では番号)をポート番号という。
　　IPアドレスに加えてポート番号まで加えることで送信した情報をどのアプリケーションで処理すべきかまで指定することができる。

# まとめ
　読んだだけでは単語の意味が曖昧になっていたが、こうやって調べながら文字に書きだすことで頭の中が整理されたので、定期的にアウトプットをしていきたい。

# 参考文献
[『プロになるためのWeb技術入門』――なぜ，あなたはWebシステムを開発できないのか](https://www.amazon.co.jp/%E3%80%8E%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEWeb%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80%E3%80%8F%E2%80%95%E2%80%95%E3%81%AA%E3%81%9C%EF%BC%8C%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AFWeb%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E9%96%8B%E7%99%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B-%E5%B0%8F%E6%A3%AE-%E8%A3%95%E4%BB%8B-ebook/dp/B09MVGM99L/ref=sr_1_1?crid=2RUFI5FRBVD4D&keywords=web%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80&qid=1645489804&sprefix=web%E6%8A%80%E8%A1%93%2Caps%2C205&sr=8-1)

[ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識](https://www.amazon.co.jp/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC2%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84TCP-IP%E3%80%81LAN%E3%80%81%E5%85%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%90%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E6%88%B8%E6%A0%B9/dp/4822283119/ref=sr_1_1?crid=3PMJJE4FEPF0J&keywords=%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8B%E3%81%AE%E3%81%8B+%E7%AC%AC3%E7%89%88&qid=1673233807&sprefix=%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AF%2Caps%2C184&sr=8-1)
シンクライアント とは

## 勉強前イメージ

syncの意味なのかな？
同期してるとかどうとか・・・

## 調査

### シンクライアント とは

シンクライアントとは、
薄いの意のThinとクライアント端末のclientをかけ合わせたもので、
クライアント側でできるだけデータを保存せずにサーバ側でデータを保存する方式になります。
逆にアプリケーションをインストールしてデータを保存するのをファットクライアントと呼びます。

端末はネットワークを経由してサーバにアクセスし、サーバに保存されたデータやソフトを使用します。
シンクライアントではネットワークの接続、またマウスとキーボード、モニターが必要で大きな容量のディスクは不要になります。

### シンクライアントの特徴

- セキュリティリスクの低減

端末にデータを保存しないため、情報漏洩などのリスクを下げることができます。
例えば [ドライブバイダウンロード](https://qiita.com/miyuki_samitani/items/212faa45ad6cbc3ffc4d) に引っかかったとします。
webを開いてダウンロードが開始されたとしてもデータを保存するサーバでブロックされます。

- データの一元管理

アプリケーションなどのアップデートをPC台分すること無く、サーバ側で管理することが可能になります。

### シンクライアントの種類

シンクライアントの種類として主に以下の2種類になります。

- ネットブート型

起動時にイメージをクライアントの端末に送って、メモリ上で動作させるものになります。
起動は比較的遅くなりますが、普通のPCと同様に作業することができます。
ただ、ユーザごとに作業環境をサーバ側で作る必要があるので管理する工数が膨らむ可能性があります。

- 画面転送型

クライアント側では画面を表示させ、マウスやキーボードの情報をサーバに転送する方式で
アプリケーションの実行などはサーバ側で行います。
ソフトのインストールなど一括でサーバ側でできますが、通常のPCとは少し使い心地が異なることがあります。

## 勉強後イメージ

sync関係なかったwwww
薄いか。
amazon workspaceとかもこれにあたるんじゃない？

## 参考

- [シンクライアントとは？｜基礎知識と導入のメリット・デメリット](https://www.splashtop.co.jp/knowhow/40/)
WordPress AMPページから、通常ページへリダイレクトする

WordPress AMPページから、通常ページへリダイレクトする際の.htaccessの設定のメモです。
AMPを有効にしたページのURLを、無効にしたURLへリダイレクトするようにするための設定です。

```
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} (^|&)amp=1(&|$)
RewriteRule ^(.*)$ https://example.com//%{REQUEST_URI}? [R=301,L]
</IfModule>
```
スミッシング とは

## 勉強前イメージ

詐欺っぽいイメージはあるけど・・・
なんだろう？情報を遠くから取る的な

## 調査

### スミッシング とは

英語で Smishing と書きます。
SMS(ショートメッセージ)とフィッシングをあわせた造語になります。
元々フィッシングというものがありますがそれはメールを使った詐欺で、SMSを使うのがスミッシングと言われます。
電話番号宛に送られてくるSMSを信頼しているユーザは比較的多いために開封率が高いのが特徴になります。
また、メールはGmailとかであれば迷惑メールのフィルターでいくつかはブロックできますが
SMSはそのまま届いてしまうのもスミッシングが多い理由となります。

### スミッシングの手法

フィッシングメールと同様の手口になります。
アプリをインストールさせられたり電話帳を盗まれたりなどです。

スミッシングは実際にある企業を装うケースが多くあります。
金融銀行やECサイト、宅配業者や国の機関を装うケースもあります。
どの手口もURLをタップさせ、情報を盗み取るのが特徴です。

実際に私のところへ来たものであれば国税庁から税金を払えというものが来ていますが
[こちら](https://www.nta.go.jp/data/040721_03jouhou.pdf) でもある通り、国税庁ではSMSでの案内はしていないと記載があるので
なりすましの可能性が大きいです。

メールもそうですが、見覚えのないメッセージについては開かないようにするのが一番です。

## 勉強後イメージ

なんか、造語おおいよね。。。
確かに昔から来てたわ、結構。

## 参考

- [不審なショートメッセージやメールにご注意ください](https://www.nta.go.jp/data/040721_03jouhou.pdf)
- [スミッシングとは何か？スミッシングの手口や主な被害と具体的な対策方法について](https://www.hammock.jp/assetview/media/what-is-smishing.html)
Pythonでの音声信号処理 (5) 色々な波形（ノコギリ波、矩形波）の作成

## やりたいこと
ノコギリ波、矩形波を作ってみること

## やってみる
もう少しダミーデータ作成処理の検証も兼ねて、色々な波形として、ノコギリ波、矩形波を作成してみる。

ノコギリ波 = 1/1 sin x + 1/2 sin 2x + 1/3 sin 3x + ...

矩形波 = 1/1 sin x + 1/3 sin 3x + 1/5 sin 5x + ...
（ノコギリ波の奇数部分だけ）

```p5.py
# -*- coding: utf-8 -*-
import sys
sys.dont_write_bytecode = True

from Grp import Line
import Dummy as dmy

from multiprocessing import Process
import time

def main():

    smpl = 1024  # サンプリングレートは1024
    sec = 2      # 2秒分

    # ノコギリ波
    wav1 = dmy.makeWave(1, smpl, sec, 0, 0, 1)
    for i in range(64):
        freq = i + 1
        wav1 += dmy.makeWave(freq, smpl, sec, 1 / freq, 0, 1)

    # 矩形波
    wav2 = dmy.makeWave(1, smpl, sec, 0, 0, 1)
    for i in range(64):
        freq = i + 1
        if freq % 2 == 0:
            continue
        wav2 += dmy.makeWave(freq, smpl, sec, 1 / freq, 0, 1)

    p_s = []

    p = Process(target=drawGraph, args=(wav1, smpl))
    p.start()
    p_s.append(p)

    p = Process(target=drawGraph, args=(wav2, smpl))
    p.start()
    p_s.append(p)

    while len(p_s) > 0:
        for p in p_s:
            if not p.is_alive():
                p.join()
                p_s.remove(p)
        time.sleep(0.1)

def drawGraph(data, rate):
    grp = Line()
    grp.setData(data, rate)
    grp.display()

if __name__ == '__main__':

    main()
```

実行結果

ノコギリ波
![P05_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850619/3066a75a-ae47-0032-272a-18ee3d236546.png)

矩形波
![P05_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850619/f2f3ed26-6b71-97c4-57be-b2a4757a6d2f.png)

## 補足
Grp.pyはここにあります。
https://qiita.com/u1tym/items/b52c466620f65225edf3

Dummy.pyはここにあります。
https://qiita.com/u1tym/items/3e2be5364e83df1b7792
マネジメント経験ゼロの人間がPMを1ヶ月やってみた所感

# はじめに

ある日の1on1にて…

```
ワイ：マネジメントの経験を積んでみたいです
リーダー：そういえば、ちょうどPMが空くプロジェクトがあるからやってみるか
```

こんな感じで2022年の12月からPMをやることになりました。

実務経験はまだ1年半ほどですが、今までのプロジェクトにはメンバーでしか参画したことがなく、マネジメントをするのは初めてでした。

1ヶ月ほどやってみて得た学びと反省点をまとめて今後に活かしていければと思います。

# どんなプロジェクトか

- 既存サービスのリプレイス開発
- 自分を入れて5人のバックエンドチーム
- スクラム開発(2週間スプリント)
- 自分も手を動かして開発に携わる(マネジメント全振りではない)

# 反省点

### 後続タスクを把握していなかったこと

毎朝行っているデイリースクラムでメンバーから、

**今のタスクがもう終わりそうなのですが、次はどのタスクに着手すれば良いですか？**

と質問されたのですが、その返事が

**次は…えーっと、、(どれをやればいいんだ、、？)**

後続タスクがすぐに答えられず、グダッてしまったことがありました。
後から振り返って、**着手するタスクも把握してないのに何がプロジェクトマネジメントだ**と思いました。
この件以降、前日までにメンバーのタスクの進捗を確認して、タスクが枯渇しそうなら後続タスクを確認する作業を入れて対応しています。

### バッファを設けずにスケジューリングしてしまった

スプリント初日にスプリントゴールを決めるのですが、過去のベロシティ(1スプリントで消費したストーリーポイントの合計)と各タスクのストーリーポイントで判断していました。

**最近いい感じでベロシティ上がってるし、タスクちょっと増やしてみるか**

と軽い感じでスプリントゴールを決めました。

前任の方はバッファを1営業日分設けてスケジューリングしていたにも関わらず、自分は全営業日フルで使って終わるくらいのスプリントゴールを設定してしまいました。
結局、**メンバーの体調不良での欠席・進捗の遅れが発生し**、2タスクくらい未達で終わりました。

全てがうまくいったら達成できるようなゴールを決めるのではなく、不測の事態が起きても対応できるようにするために、バッファを設けることの大切さを感じました。。

### メンバーに頼りすぎた無責任な行動

この点が1番反省すべき部分だなと感じています。。

スクラム開発では、PBRというミーティングがあるのですが、羅列してあるPBIのサブタスクをPBRまでに準備するのがPMの主なタスクとなっていました。(あくまで自分のチームの話です。他のチームがどう運用しているのかはわかりません、、)

そんな中、複雑な機能の実装タスクが後続に控えていました。サブタスクを考えないといけないのですが、複雑ということもあって全く検討がつかず、PBRで**この機能ってどんなサブタスクを切ればいいですかね**とメンバーに丸投げしてしまいました。

メンバーから返ってきた答えは、**PBRの時間だけでは必要なサブタスクを網羅できない**でした。
そもそもPBRって**サブタスクの見積もり**をメンバーと認識合わせする場なので、サブタスクを切ってない状態で臨むのは論外なんですよね。。

後日、サブタスクを自分なりに考えた状態でPBRに臨みました。そこでメンバーから、**このサブタスクってどう実装するイメージですか**という言葉が返ってきました。自分はハッキリとした答えを返せませんでした。
今回どうやってサブタスクを切ったのかというと、自分のチーム以外にも似たようなリプレイス開発をしているチームがあって、そのチームが切っていたサブタスクを自分のチームに当てはめただけでした。

メンバーからは、**サブタスクの実装イメージを持って、メンバーが見積もりの議論に参加できる環境を構築してください**という指摘をもらいました。

#### なぜメンバーに丸投げする姿勢になっていたのか

自分を入れて5人のメンバーがいるのですが、全員自分より年上でエンジニア経験もあり、弊社に関わっている期間が長い人たちでした。
そのようなメンバー編成だったので、**PMっぽいことをしておけば助けてくれるだろう**という考えを、心のどこかで持ってしまいました。プロジェクトをマネジメントするどころか、自分がマネジメントされようとしていました。

今まで参画したプロジェクトのPMの方を思い返してみると、質問したら何でも答えてくれたし、自分の意見をしっかり持った上でミーティングには参加してたし、他人を頼る部分は頼っていたしで、自分の軸をしっかり持っていたなと感じました。

今回メンバーから指摘をもらえたことは本当にありがたかったです。

# 学び

### どう実装するかという設計の工程を経験できている

今までのプロジェクトでは、詳細設計まではほぼ終わっていて、あとはコードに落とし込むだけという段階から参画したことがほとんどでした。

PMになったおかげで、既存のコードを読んでリプレイスではどう実装するかという工程からやらせてもらえているので、正直めちゃくちゃ難しいですが今後もめげずに取り組みたいと思います。

### 技術力以外のスキルを伸ばせている

PMになってから参加するミーティングが一気に増えました。メンバーとして参画していた時には関わらなかったような方ともコミュニケーションをとる機会が増えたので、他部署との調整力というのは身についているなと感じます。

また、ミーティングのファシリをやることも増えたので、コミュニケーション力・ファシリテーション力というのも身についているなと感じます。(まだまだファシリをやるのは苦手ですが、、)

### 責任を追及される立場になった

学びというよりは良い経験だと思っているのですが、、

- スプリントゴールが達成できなかった時の原因追及
- 障害が発生した際の一次請け
- メンバーのタスク管理
- タスクの見積もり

などなど、メンバーの時には経験できなかったことだらけなので、精神的な負荷が増えたのはとても良い経験だなと感じています。

# これから

**PMはチームの中でプロジェクトに一番詳しい人じゃないといけない**というマインドを持って、今後取り組めたらなと思っています。
他人を頼ることと、他人に丸投げするのは全然違うと思っているので、自分の軸を持ちつつチーム全員で助け合いながら開発を進めていきたいです。

2023年の秋頃にリプレイス完了の見込みとなっているので、まずは期日通り完遂できるよう頑張ります！
Pythonでの音声信号処理 (4) ダミーデータの作成

## やりたいこと
ダミーデータの作成処理を用意すること。

## やってみる
今後も踏まえて、ダミーデータ作成用の処理を用意しておく。

```Dummy.py
import numpy as np
import math

def makeWave(freq, smpl_freq, smpl_sec, r, a, b):
    """
    サンプルデータ生成

    Parameters
    ----------
    freq : int
        周波数(Hz)
    smpl_freq : int
        サンプリング周波数(Hz)
    smpl_sec : int
        サンプリング秒数(sec)
    r : float
        振幅
    a : float
        位相用定数(cos)
    b : float
        位相用定数(sin)

    Returns
    -------
    res : numpy.ndarray
        サンプルデータ
    """

    res = []
    for t in range(smpl_freq * smpl_sec + 1):
        theta = 2.0 * math.pi * freq / smpl_freq * t
        y = r / math.sqrt(math.pow(a, 2) + math.pow(b, 2)) * (a * math.cos(theta) + b * math.sin(theta))
        res.append(y)
    res = np.array(res)
    return res
```

検証として、周波数1Hz（＝1秒あたり、sin波が1個）を2秒分（なので、sin波が2個）、周波数2Hz、その合成波の3つを表示させてみる。

ついでに、いまのままだと、複数のグラフを一度に表示できないので、表示部分のプロセスを分けて起動するように変えておく。

```p4.py
# -*- coding: utf-8 -*-
import sys
sys.dont_write_bytecode = True

from Grp import Line
import Dummy as dmy

from multiprocessing import Process
import time

def main():
    rate = 1024
    sec = 2

    # 周波数 = 1Hz
    wav1 = dmy.makeWave(1, rate, sec, 1, 0, 1)
    # 周波数 = 2Hz
    wav2 = dmy.makeWave(2, rate, sec, 1, 0, 1)
    # 合成
    wav3 = wav1 + wav2

    p_s = []

    p = Process(target=drawGraph, args=(wav1, rate))
    p.start()
    p_s.append(p)

    p = Process(target=drawGraph, args=(wav2, 1024))
    p.start()
    p_s.append(p)

    p = Process(target=drawGraph, args=(wav3, 1024))
    p.start()
    p_s.append(p)

    while len(p_s) > 0:
        for p in p_s:
            if not p.is_alive():
                p.join()
                p_s.remove(p)
        time.sleep(0.1)

def drawGraph(data, rate):
    grp = Line()
    grp.setData(data, rate)
    grp.display()

if __name__ == '__main__':

    main()
```

実行結果

![P04_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850619/43feff3b-fb24-ba01-06e1-d0c7fbb7241f.png)

![P04_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850619/7578be0d-f595-6a12-11f6-eab4cf775c18.png)

![P04_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850619/7b421465-c2f3-154b-8a88-6dc9ebcc4a9a.png)

## 補足
Grp.pyはここにあります。
https://qiita.com/u1tym/items/b52c466620f65225edf3
Googleプロジェクト管理：PMOとは？

# はじめに

わたしが [Google プロジェクト管理:プロフェッショナル認定証で得られた素晴らしい体験][google]を、要点をまとめ小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ ***"Google プロジェクト管理:プロフェッショナル認定証"*** を受講してみてください。

[google]: https://qiita.com/mapami/items/317ae776a2268fd54c8f

https://jp.coursera.org/professional-certificates/google-project-management

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/579e805c-6045-9c1c-543d-f9519b57d50c.png" width="800">

# PMOとは？

プロジェクト・マネジメント・オフィス（PMO）は、組織内のグループであり、組織全体のプロジェクトマネジメントの標準とプロセスを定義し、設定し、維持することを支援します。

PMOは、組織内のすべてのプロジェクトの調整センターとして機能し、プロジェクトがより円滑かつ効率的に実行されるように支援します。

プロジェクトマネージャーは、PMOの中で活動することもあれば、他の部署の中で活動することもあります。

# PMOの機能

PMOは、組織内のプロジェクトマネージャーを指導・支援する組織です。

PMOは、組織内のすべてのプロジェクトのベストプラクティス、プロジェクトの状況、方向性を共有する一方、しばしば自ら戦略的なプロジェクトを担当することもあります。

PMOの主な機能は以下の通りです

### 戦略立案とガバナンス

プロジェクトの基準を定め、組織のビジネス目標に沿ってプロジェクトを選択し、それらのプロジェクトのビジネスケースを経営陣に提示することが含まれます。

### ベストプラクティス

PMOは、組織内のベストプラクティスとプロセスの導入を支援します。また、過去の成功したプロジェクトから学んだ教訓を共有します。また、プロセス、ツール、測定基準に関するガイダンスを提供することで、組織内のプロジェクト間の一貫性を確保する手助けをします。

### 共通のプロジェクト文化

PMOは、最適なアプローチやベストプラクティスについて従業員を教育することで、共通のプロジェクト文化を形成するのに役立ちます。これにより、組織全体で一貫性のある効率的なプロジェクトマネジメントを実践することができます。

### リソース管理

PMOは、予算、優先順位、スケジュールなどに基づいて、人、設備などのリソースを管理し、組織全体のプロジェクトに割り当てる役割を担っています。また、プロジェクトに必要な役割と責任の明確化も行います。PMOは、すべての従業員、特にプロジェクトマネージャーに対して、トレーニング、メンタリング、コーチングを提供します。

### プロジェクト文書、アーカイブ、ツールの作成

PMOは、プロジェクト管理に必要なテンプレート、ツール、ソフトウェアに投資し、提供します。また、組織のプロジェクト履歴を管理することも重要な役割の一つです。プロジェクトが終了すると、プロジェクト中に作成されたすべてのドキュメントをアーカイブし、将来の参照や教訓を記録することができます。

:::note info
PMOで働く最大のメリットは、多くのベストプラクティスを互いに共有できることだと思います。 たとえば、他のプロジェクトマネージャーとつながり、自分の課題を共有し、他の人がどのようにそれを乗り越えたかを見ることができることです。また、自分では時間をかけて開発したテンプレートやツールも、他の人がすでに持っているので、そのツールを借りたり、自分用に使うこともできます。でも一番いいのは、同じように問題を考え、非常に合理的で、タスク指向で、行動指向で、目標指向の人たちのコミュニティがあることです。
:::
コードなしで Salesforce アンケートを送信する

[Salesforceのアンケートに戻る](https://qiita.com/Keiji_otsubo/items/ce153ec9d338d7af0d81)


# フローを使用してアンケートの招待状を送信するにはどうすればよいですか? 

 元の記事　[Send Salesforce Survey Without Code](https://automationchampion.com/2022/04/20/send-salesforce-survey-without-code-2/)

+ [Flow Core Action: Send Surveys](https://help.salesforce.com/s/articleView?id=sf.flow_ref_elements_actions_sendsurveys.htm&type=5&utm_source=weeklycontent&utm_campaign=SelfHelpContent_December2021)

# 前提条件

Salesforce アンケートが有効になっており、正しく設定されていることを確認してください。次に、次のスクリーンショットのような調査 ( Customer Satisfaction )を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e2afae9a-bd13-142f-99bf-4dc7f93f3229.png)

# まず、アンケートの招待状を送信するためのさまざまな方法を理解しましょう。 

+ アンケートへの招待を送信するためのフローが必要ですか? 

答えはノーです。調査への招待を送信するためのフローや Apex コードはもう必要ありません。この記事で説明する障害にぶつからない限り. 調査招待ルールを使用して、フローを作成せずに条件に基づいて調査招待をトリガーします。

+ アンケート招待ルールとは？ 

アンケート招待ルールを使用すると、SurveySubject でサポートされているオブジェクトのレコードが作成または更新されたときに、ルールベースの調査を送信できます。顧客エンゲージメント コンテキストをルールに追加して、対象となるグループに関する情報を収集します。

次の調査招待ルールは、ケースがクローズされたときに調査招待をトリガーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fd00f614-a22e-6528-29db-ebe43b2ba770.png)

+ フローを使用してアンケートの招待状を送信するユースケース 

ただし、Survey Invitation Rules には次のような制限があります。

1. 注文が配達されたら、主要な連絡先に調査の招待状を送信します
2. 商談が成立したときに、主要な連絡先ロールに調査への招待を送信します
3. アンケートへの招待の有効期限を定義する
などなど

Flow または Apex コードを使用することで克服できます。

+ Salesforce アンケート データ モデルを理解する

ここで一時停止して 、データ モデルを含む Salesforce のSurveySubject および SurveyInvitationオブジェクトについて理解しておきましょう。

|オブジェクト名|詳細|
|:--------------------------------|:----------------------|
|[SurveySubject](https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_objects_surveysubject.htm)|これは、アンケートと別のオブジェクト (取引先やケースなど) の間の関係を表します。|
|[SurveyInvitation](https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_objects_surveyinvitation.htm)|	これは、調査を完了するために参加者に送信される招待状を表します。|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2e210896-d64c-aba2-4be2-ab3e493c6a54.png)


これはApex TriggerやFlowなどのさまざまな自動化ツールを使用して解決できますが、ここではAfter-save Record-Triggered Flowを使用します。この記事をチェックして、このシナリオで保存後のレコード トリガー フローを使用している理由を理解してください。 

ソリューションについて説明する前に、プロセス フローの概要図を示します。次のフロー ダイアグラムに数分かけて理解してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/df1d2397-f53f-19ab-92b8-5a7ea282089a.png)


 After-Save  Record-Triggered Flowを使用して Olivia のビジネス要件を解決するには、7 つのステップがあります。我々はしなければならない：

1. レコード トリガー フローのフロー プロパティを定義する
2. 商談ステージが成約に等しいことを検証する決定要素を追加します
3. レコード取得要素を追加して、商談の主な連絡先の役割を見つけます 
4. 一次連絡先の役割が見つかったかどうかを確認する決定要素を追加します 
5. テキスト変数を追加して、主要な連絡先レコード ID を保存します
6. 商談レコード ID を格納するテキスト変数を追加する
7. アンケートの送信コア アクションを追加 – アンケートの招待状を送信します
【JavaScript】アコーディオンUIの作成！

# 1日1UI投稿！

2日空いてしまいましたが、UI投稿します！

## アコーディオンUI
本日はアコーディオンUIを作成しました。




<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="bGjgKeb" data-user="ri-tama" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ri-tama/pen/bGjgKeb">
  アコーディオンUI</a> by ri-tama (<a href="https://codepen.io/ri-tama">@ri-tama</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>



## 書き始めたはいいものの、わからんことばっかでした。。

結局不明部分は参考にしたサイトのを参考にして補完しました。
千里の道も一歩から。
塵も積もれば山となる。
という感じでしょうか。。

## 不明部分を自分で書き出して、説明していくパート！

### dl dt ddについて

初見のタグ群です。
簡単に言ってしまえば

・説明するリストだよ！
・説明する言葉！
・説明する言葉の説明だよ！

という感じです。覚えておきましょう。

### user-select :none;

```CSS
dt{
    padding:8px;
    cursor:pointer;
    user-select: none;
    position:relative;
}
```

これも初見の言葉でした。
簡単に言えば、選択できんぞ！コピーさせんぞ！
というおまじないです。覚えておきましょう。

### beforeとafter
```CSS
dt::before{
    content:'Q.';
}
dt::after{
    content:'+';
    position:absolute;
    top:8px;
    right:16px;
    transition:transform 0.3s;
}
```

タグ::before
もしくは
タグ::after
そして中身にcontent:'';
タグの文字列の前か後にcontentの中身を付けるおまじないです。
外部に委託しといて、変更をかけやすくする感じでしょうか。

### parentNode
```javascript
dts.forEach(dt=>{
     dt.addEventListener('click',()=>{
         dt.parentNode.classList.toggle('appear');
         });
    });
```
これも初見の言葉でした。
parentNodeはタグの親クラスを示しております。
ですのでdtの親クラスであるdivを指しており
appearをその親クラスに付け外しする処理という処理でした。




明日も投稿できるように、午後からも頑張ります！
読んでいただきありがとうございました！


作成参考↓

https://dotinstall.com/
Flask のチュートリアルの DB を DynamoDB へ置き換えてみた。

Amazon DynamoDB を Flask アプリケーションから利用する方法を説明するため、Flask 公式サイトのチュートリアルで使用している DB を SQLite から DynamaDB へ変更してみました。

https://github.com/juno-rmks/flask/tree/feature/dynamodb/examples/tutorial

変更するチュートリアルは Flask 2.2.x の 2023-01-19 時点 (8f13f5b6...) をベースにしています。

https://github.com/pallets/flask/tree/8f13f5b6d672f1ba434f9c8ebe2c1b1dd385962e/examples/tutorial

変更にあたり、変更箇所が分かりやすいように可能な限りベースとするチュートリアルの構造を維持するように努めています。本来は、RDBMS である SQLite から NoSQL である DynamoDB への変更のため、データ構造やその処理ロジックといった設計からの見直しも必要です。
【ド基礎】Goコマンドをフローで整理する

GoのDocker環境を立てている時に `go install` と `go mod tidy`の厳密な動作内容などでつまづいたのでフローで整理しておきます。正しいんだろうかと悩んでいるのでお気軽にツッコミください。

![スクリーンショット 2023-01-09 10.50.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893208/f81fa14f-ef74-0a91-77d3-fc593923063f.png)

# `go install`

外部のモジュールを新しく導入したい時に使う。ただソースコードをダウンロードしてくるだけではなく、ダウンロードしたモジュールを実行可能なバイナリにビルドもしてくれるコマンド。

ってことは差分が `go install` しただけであれば理論上は `go build` しなくて良い？

# `go mod tidy`

go.modファイルとソースコードとの整合を取ってくれるコマンド。go.modとgo.sumに必要なエントリを加え不要なエントリを削除する。エントリを加えた場合は加えたエントリのソースコードも併せてダウンロードしてくる。(ただしビルドはしない)
逆にエントリを削除した場合は削除したエントリのソースコードも削除する。
CTI 関係のまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)



+ [Add the Softphone Utility to your app](https://qiita.com/search?sort=&q=CTI+user%3AKeiji_otsubo)
+ [電話番号のクリックを携帯電話で受ける方法](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000QLJD5)
+ [CallCenterId のバグ？](https://qiita.com/Keiji_otsubo/items/71b8664dbf5f9fe34d8a)




# The Amazon Connect Instance Alias is current set to the default value. You must configure a valid CTI Adapter record before proceeding

+ ['Build an Amazon Connect Integration' Trailhead error](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000GhwhE)

# フローで　Click to ダイヤルの機能を使う

+ [画面フローを用いた電話番号リストの作成について](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Miw1q)

Open CTI onClickToDial イベントを発生させていますか？

その場合は英語ですが回答があります。

Usually The click to call gets disabled when the Softphone login is not available or expired

通常、ソフトフォンのログインが利用できないか、有効期限が切れている場合、クリック ツー コールは無効になります。
https://developer.salesforce.com/forums/?id=906F00000008oCQIAY

またモバイルでは機能しないと書かれていますが、VF Pageに専用のタグがあるようです。
Although Salesforce has a specific VisualForce tag "<support:clickToDial> for CTI adapters this will not work for mobile dialers although most web browser integrations such as Skype will work with this.

+ [Add click-to-dial phone numbers in VisualForce Pages for Salesforce for Android and iOS](https://help.salesforce.com/s/articleView?id=000387858&type=1)
+ [support:clickToDial](https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_compref_support_clickToDial.htm)

# モーダル画面とは併用できない？

+ [Sales Team cannot answer calls from the CTI Softphone while in the Add Products (AddProducts) screen on Quote.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UrdXa)


# クッキーのエラー

+ [Chrome のサードパーティ Cookie 制限により、Salesforce Classic で Open CTI ソフトフォン エラーが発生する](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XIRLM)

:::note
1. Add the following sites to third-parry Cookie allow list

[*.]visualforce.com
[*.]salesforce.com
[*.]force.com

2. Add the following sites to CookiesAllowedForUrls of Chrome policy

[*.]visualforce.com
[*.]salesforce.com
[*.]force.com
:::
【AWS】API Gatewayで配列パラメーターを受取る

API Gateway(REST API)で配列のクエリパラメーターを受け取れませんでしたので、その解決方法をメモします。

# 前提
API GatewayとLambdaプロキシ統合で使用
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/d0d701ce-3898-5c86-2a7a-a6385373c9d3.png">

# multiValueQueryStringParametersを受取る(node.js)
ローカルの場合リクエストからクエリパラメーター配列を受け取れますが、API gateway経由で配列を受け取れないそうです。そのため、eventのmultiValueQueryStringParametersから配列パラメーターを受け取ります。
```js
const express = require('express')
const router = express.Router()
router.get('/demo', [
], (req, res, next) => {
  (async () => {
    // 配列パラメーター
    let areaCodes
    if (req.apiGateway) {
      // api Gateway
      areaCodes = req.apiGateway.event.multiValueQueryStringParameters.areaCodes
    } else {
      // ローカル
      areaCodes = req.query.areaCodes
    }
  })().catch(e => next(e))
})
```
node.jsでalexaスキル

# 概要
node.jsでalexaスキル、やってみた。

# 手順

- スキルに名前を付けます

キヨシ

- プライマリロケールを選択

日本語

- エクスペリエンスのタイプを選択します

ゲーム

- モデルを選択する

カスタム

- ホスティングサービス

Alexa-hosted (Node.js)

- ホスト地域

米国西部オレゴン


- Templates

スクラッチで作成

- コードエディタ

日本語に直す

- 保存

実行

- デプロイ

実行

- テスト

キヨシを開いて

# テスト実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/05406c9c-ce65-25d0-d61e-900c7bceed34.png)


以上。
機械学習で使用する評価指標


# 混合行列について

二値分類では混合行列を用いて予測結果を分類することができる。予測結果の「陽性；Positive」、「陰性；Negative」に対して、それが正解かどうかの「True」、「False」をつけて表現する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137120/155cff02-4999-a19c-dd6f-fe033cb7eed4.png)

- True Positive, TP：陽性と予測して、真に陽性（正解した）
- False Pisitive, FP:陽性と予測して、真には陽性ではなかった（不正解）
- True Negative, TN：陰性と予測して、真に陰性（正解した）
- False Nenegative, FN：陰性と予測して、真にいんせいではなかった（不正解）

# 各評価指標

## Accuracy（正解率）
全データのうちどれだけ正解したかの指標。アンバランスなデータセットである場合（ex. 負例が多い）、とりあえず「負例」と答えても accuracy が 99% とかになってしまうので、データの性質に注意。
$$
\frac{TP+TN}{TP+FP+TN+FN}
$$

## Precision（適合率、≒精度）

「陽性」と予測したもののうち、真に陽性であるものの割合。

$$
\frac{TP}{TP+FP}
$$

- 分母は、モデルが陽性と判断したデータ数（実際のデータの陽性数ではない）
- 分子は、正しい陽性判定数

### 備考点

- 分かりやすいデータにのみ（自信を持てる場合にのみ）陽性判定を行えば、FP（偽陽性）が少なくなり Precision は 100% に近くなる。
- Precision が高ければ、モデルの陽性判定は信用できることになる
    - ただし、どれだけ真の陽性を見逃しているかは評価されていない。


## Recall（再現率）

真に陽性であるもののうち、正しく「陽性」と予測したものの割合。

$$
\frac{TP}{TP+FN}
$$

- 分母は、真に陽性であるデータ数（実際のデータの陽性数）
- 分子は、正しい陽性判定数

### 備考点

- モデルがすべて「陽性」と予測した場合、FN（偽陰性）はゼロになるため Recall が100% になる
    - Recall が高い場合は、真の陽性を逃していないということになる
- 「すべて陽性」と判定すると、TPも増えるがそれに伴って、FP（偽陽性）も増える
    - Precision が低下するので、モデル自体の「陽性判定」に信頼が置けなくなる

## Precision と Recall

Precision と Recall は以下の理由からトレードオフの関係にある。

- Precision を高くするには、FP を減らす
    - 「陰性；N」判定を増やすことになり、TNと共にFNも増加する
- Recall を高くするには、FN を減らす
    - 「陽性；P」判定を増やすことになり、TPと共にFPも増加する

各種指標を使いたいのは次の場合

- とにかくモデルの陽性判定が確度の高いものである必要がある場合→Precision
    - ex. 広告マーケティング：DMを送付すれば効果がある、というユーザーを的確に見抜きたい。Precision が低いと、無駄なDMを大量に送付することとなってしまう
- 陽性者の見逃しを極力避けたい場合→Recall
    - ex. がん患者の診断：がん患者かどうかを判定するときに、ひとまず「がんである（＝陽性）」と判定しておけば、見逃しはなく多くの人命を救うことに繋がる

## Specificity（特異度）

真に陰性であるもののうち、正しく「陰性」と予測したものの割合。
$$
\frac{TN}{FP+TN}
$$

## F1スコア

Precision と Recall の調和平均であり、トレードオフの関係にある両者の評価指標を同時に評価し、バランスの良いモデル予測かどうかを調べることができる。

$$
F_1 = \frac{1+1}{1/P + 1/R} = 2\cdot \frac{P\cdot R}{P + R} 
$$
基礎情報技術者2(学習用）

●ソフトウェア
・OS(オペレーティングシステム）・・最も基本的な部分、普遍的な機能を提供（windows/mac/unix)
・OSの上にアプリケーションソフトウェアとOSをつなぐ役割を果たすAPI、ミドルウェアがあり、その上にアプリケーションソフトウェアがある。

●OSのはたらき・・どのような順番でタスクを実行していくか。どのようにタスクを切り替えるか。限られたメモリ領域をどう使うか

●タスクの切り替え方
イベントドリブン・・状態変化を起点としてタスクの切り替えを行う（割り込み）
タイムスライシング・・時間でタスクを変化させる

＊今のOSはこの二つを組み合わせて使われる

プリエンプティブ・・タスク実行中にそのタスクを一時中断（実行可能状態）にし、他のタスク実行
ノンプリエンプティブ・・中断しない

割り込みの種類・・
外部割り込み（ハードウェア）・・タイマ割り込み、機会チェック割り込み、入出力割り込み
内部割り込み（ソフトウェア）・・svC割り込み、ページフォールト割り込み、プログラム割り込み
＊それぞれの働きがわかるようになる

●タスクスケジューリング・・
到着順方式（ノンプリエンプティブ）、
優先順方式・・優先度の高いタスクから実行＊スタベーションを防げるかが課題（優先度の低いタスクが実行されない）
ラウンドロビン方式・・処理時間を決め順にタスクを処理する

●マルチプログラミング・・プログラミングを複数組み合わせて高速化を図る（イベントドリブンでのタスク管理が必要）

●限られたメモリ領域をどのように使うか・・仮想記憶管理（仮想的に記憶領域を扱うことで効率的に処理を実行できる）ex)図書館での本の検索システムが仮想記憶領域みたいなもの

●仮想記憶管理の分類・・固定区画方式（始めから区画を分けておく）、可変区画方式（プログラムニ応じて調整）、スワッピング・・情報を出し入れする

●限られたメモリ領域をどのように使うか２・・
ページング（物理的な配置可能領域よりも大きなプログラムをロードするための仕組み）＊重要
ページ書き換えアルゴリズム
1、FIFO(first in first out)・・最初にページインしたものから順にページアウト対象とする
2、LIFO(last in first out)・・最後にページインしたものをページアウト対象にする
3、LRU(least recently used)・・最近使われてないやつ、最も長い間参照されていないもの
4、LFU(least frequently used)・・最も参照頻度が少ないもの

●ファイルの種類
1、テキスト
2、CSV
3、PDF

●バックアップ・・
差分バックアップ・フルバックアップからの差分をやる
増分バックアップ・増えた分のみバックアップ
フルバックアップ・すべてバックアップをとる

●OSS・すべての人が自由に使えるソフトウェア・ソースを公開していることによって利点がたくさんある

●AI・元々はエキスパートシステムで知識の詰め込みによって学習させようと試みた。→限界が見える。知識ではなく自分で学んでもらおうという機械学習が盛んに。（知識体系について人間が考える必要がなくなった）しかし機械学習も「特徴量の選択」において人間が手を貸さないといけない。そこで考えられたのが「ディープラーニング」という仕組み。
Gazebo, rviz2でGPUを使うメモ

ubuntu 環境でNvidiaのGPUマシンでGazeboやrviz2を実行したときに、そのままだとGPUを使ってくれなかったので
GPUを使う設定方法のメモ

## 環境変数の追加

以下を実行して環境変数を設定する
毎回実行するのは面倒なので常にGPU有効にする場合は.bashrcに書いておく

```bash
export __NV_PRIME_RENDER_OFFLOAD=1
export __GLX_VENDOR_LIBRARY_NAME=nvidia
```

## GPUが使われているかの確認

nvidia-smiコマンドを実行して、Gazebo (gzserver, gzclient)、rviz2 (rviz2)のプロセスがあればOK

```bash
$ nvidia-smi
                                                 
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1319      G   /usr/lib/xorg/Xorg                 79MiB |
|    0   N/A  N/A      4689    C+G   ...177541916386972095,131072      107MiB |
|    0   N/A  N/A      6184      G   gzserver                            4MiB |
|    0   N/A  N/A      6185      G   gzclient                           78MiB |
|    0   N/A  N/A      6471      G   rviz2                               4MiB |
+-----------------------------------------------------------------------------+

```
Discord Botから画像を添付したメッセージを投稿するcurlコマンド

備忘録

```
curl \
-X POST https://discord.com/api/v10/channels/<channel_id>/messages \
-H "Authorization:Bot <DISCORD_BOT_TOKEN>" \
-H "Content-Type:multipart/form-data" \
-F "file=@\"/path/to/image/file.png"" \
-F "payload_json={\"content\":\"Hello, world!\"}"
```
(備忘録)AWS MLS試験学習～データ形式

# SageMaker
SageMakerのアルゴリズムで一般的にサポートされているものが下記。
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/cdf-training.html#cdf-common-content-types

### パイプモード
S3から直接データをストリーミングする。対するファイルモードはデータをインスタンスボリュームに保存するため、パイプモードの利用によりトレーニングジョブの開始時間が短縮され、スループットが向上する。

データ形式はCSVとRecordio-protobuf。パイプモードリリース直後はCSVがサポートされていなかったらしい。
https://aws.amazon.com/jp/blogs/machine-learning/now-use-pipe-mode-with-csv-datasets-for-faster-training-on-amazon-sagemaker-built-in-algorithms/

# Amazon Athena
Parquet圧縮ファイルまたはORC圧縮ファイルで実行すると、実行時間とコストを削減できる。
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/performance-tuning.html#performance-tuning-file-formats

Amazon Kinesis Firehoseにおいて、インプットしたストリーミングデータをParquet形式、ORC形式に変換することが可能。
https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/record-format-conversion.html

#### Parquet形式とは
https://www.databricks.com/jp/glossary/what-is-parquet

#### ORC形式とは
https://aws.amazon.com/jp/about-aws/whats-new/2017/11/s3-inventory-adds-apache-orc-output-format-and-amazon-athena-integration/#:~:text=ORC%20%E3%81%AF%E3%80%81Hadoop%20%E3%82%A8%E3%82%B3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82
【Python】set型のremoveとdiscardの違いと覚え方

　競技プログラミングをやっていて、ふと「どちらも削除するものだけど、この2つの違いってなんだ？」と思い調べてみました。結論としては、**取り除くものがそもそも存在しないときエラーを返すかどうか**です。

## removeとdiscardの共通事項
- 集合から要素を削除するメソッド。
- 複数指定はできない。
- 要素を指定しない場合、エラーが出る。

## removeとdiscardの違い
```python
S = {one, two, three}

S.remove()
#エラー：remove() takes exactly one argument (0 given)
S.discard()
#エラー：discard() takes exactly one argument (0 given)

S.remove('four')
#KeyError: 'four'
S.discard('four')
#エラーは出ない

```
　先述の通り、要素を指定しなければどちらもエラーを出しますが、要素を指定して、それが含まれていない場合、`remove`はエラーを吐き出し、`discard`は吐き出しません。2つの違いはここにあります。

## 覚え方
　違いはわかってもいつも忘れるので、英語から理解して覚えようと思います。
　`remove`は、**『ある場所から移動させるだけで、ものはまだある』**、`discard`は、**『取り除き、廃棄してしまう』** というニュアンスがあります。なので、まだ存在しているニュアンスの強い`remove`は、要素にないものを指定すると「そもそもそんなのないから移動させられないよ！」みたいにエラーを出すのかなと覚えました。
Assign Accounts, Rules, and Users to Territories

[Territory Management Basics --> Assign Accounts, Rules, and Users to Territories](https://trailhead.salesforce.com/content/learn/modules/territory-management-basics/assign-accounts-rules-and-users-to-territories)

# In the 'US East Coast Zip Code' assignment rule, we can't find the expected selection criteria. Select only accounts with a Billing/ZIP/Postal Code that’s 30000 or lower.

+ [Assign Accounts, Rules, and Users to Territories Trailhead Error](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000LIMVG)
+ [Assign Accounts, Rules, and Users to Territories Trailhead Error](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000LIMVGSA5)

:::note
Please go through this link you will get the idea how you can resolve it.

https://www.youtube.com/watch?v=LV0lOWk-UFs
:::

+ [Error Message on Hands-On Territory Management Basics Part 2](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Jfftb)

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

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

# Enterprise Territory Management Evaluate Account Checkbox

+ [Enterprise Territory Management Evaluate Account Checkbox](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Pko2M)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4382b72e-6d61-8b34-3de4-7bcb8e023968.png)

:::note
Please check this article.

https://salesforce.stackexchange.com/questions/215751/territory-management-account-assignment-working-in-sandbox-but-not-in-productio

From what I understand from the post you provided, the checkbox doesn't show in edit mode when Default is checked as means it's automatically evaluating the territory.  

Strangely, the Evaluate checkbox doesn't show on the page layout when Default is unchecked.

あなたが提供した投稿から私が理解していることから、デフォルトがチェックされている場合、チェックボックスは編集モードで表示されません。これは、テリトリーを自動的に評価していることを意味します。

奇妙なことに、デフォルトがチェックされていない場合、評価チェックボックスはページレイアウトに表示されません。
:::

# テリトリーごとにアカウント数を数えてレポートを作成したいのですが、アカウント数が 0 のテリトリーも取得したいのです。

+ [Reports about Accounts and territories](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007EcaBm)

:::note
Please check, 

https://help.salesforce.com/s/articleView?id=sf.tm2_report_accounts_with_without_territories.htm&type=5 

https://help.salesforce.com/s/articleView?id=sf.tm2_report_territories_with_without_assigned_accounts.htm&type=5 
:::
N: リポジトリ 'http://dl.google.com/linux/chrome/deb stable InRelease' がアーキテクチャ 'i386' をサポートしないため設定ファイル 'main/binary-i386/Packages' の取得をスキップ

```bash
sudo apt update
N: リポジトリ 'http://dl.google.com/linux/chrome/deb stable InRelease' がアーキテクチャ 'i386' をサポートしないため設定ファイル 'main/binary-i386/Packages' の取得をスキップ
LANG=C sudo apt update
N: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'http://dl.google.com/linux/chrome/deb stable InRelease' doesn't support architecture 'i386'
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/66338465-23bf-aab0-012c-aca312764549.png)

# 教えてSenpai
`[arch=amd64]`を追加することでエラーを回避できます。
```bash
sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
```

参考

https://zenn.dev/gkz/articles/skipping-acquire-of-configured-file

https://tech.librastudio.co.jp/entry/index.php/2016/07/09/post-913/
NVidiaドライバが突然なくなった？

# 高負荷を掛けたから？
tensorflowを使ってDiffusionモデルの学習をしていました。
transformer encoderっぽいものをたくさん並べて学習しようとしたら…
まずはいつものリソースエキゾースト。
じゃあというんでバッチサイズを減らして再実行。いくらバッチサイズを減らしても回らない。
おかしいと思いOSの再起動とかしてみてたらなんかメモリエラーとか出るようになり、それでもバッチサイズをいじったりしたらなんとか回りだした…と思ったら異様に遅い。
まさか…？と

OSはubuntu 22.04LTSです。
```
nvidia_smi
```
してみると
```
NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running. 
```
なんとそのまさかですよ。GPUが動いていません。ドライバーと通信できないってなんで？今の今まで動いてたのに？

# ドライバを入れ直してみる
あわててググっても突然こうなったという記事は出てきません。ただNVidiaのドライバはトラブルが多いとかアップデートでこうなったとかがあったので、再起動のときに勝手にアップデートがかかった？
高負荷を掛けてGPUが焼ききれたとかだったらどうしよう…そんなはずは…でも…と焦りながら、ドライバを入れ直してみることにしました。

```
lsmod | grep nouveau
```
とすると、何も出てきません。一応GPUはVGAボードとしては動いているようです。それはそうか画面が出てるんだから。

```
ubuntu-drivers devices
```
とすると
```
vendor   : NVIDIA Corporation
driver   : nvidia-driver-515-open - distro non-free
driver   : nvidia-driver-525-open - third-party non-free recommended
driver   : nvidia-driver-525-server - distro non-free
driver   : nvidia-driver-515 - distro non-free
driver   : nvidia-driver-515-server - distro non-free
driver   : nvidia-driver-510 - distro non-free
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-470 - distro non-free
driver   : nvidia-driver-525 - third-party non-free
driver   : xserver-xorg-video-nouveau - distro free builtin
```
こんな感じで出てきました。(2023.1.9現在のリストです)
recommended　とあるやつをインストールします。

なんかインストールにすごい時間がかかりました。ドライバ、こんなでかかったっけ？と思いながらインストール終了したので再起動。

# ダメでした

nvidia-smiすると

```
No devices were found
```
とうとうデバイスがないとか言い出しました。もうダメかもしれない…嫌な汗が出てきます。

# -open は入れちゃダメ

ぐぐってみると、Qiitaの記事で

[【注意】ubuntu-drivers devicesでお薦めされたNVIDIA GPUドライバーをインストールしたら事故になります。](https://qiita.com/y-vectorfield/items/72bfb66d8ec85847fe2f)

というのをみつけました。
なんとか-openとついてるのはrecommendedされてても入れたらやばいというもの。

上のリストで-openがついてないやつで一番新しそうなやつは…

```
driver   : nvidia-driver-525 - third-party non-free
```

だったので

```
sudo apt install -y nvidia-driver-525
```
インストールはさっきのとは大違いですぐに終わりました。
再起動。

# 動きました。

背中に悪寒のようなものを感じながら祈るような気持ちで

nvidia-smi

…いつもの画面が出てきました。
ほっと一安心です。

学習させてみるとちゃんとGPUを使って学習してくれました。
でもなぜかドライバインストール直後からしばらくは遅い？なんか暖機運転でもしてるかのように今までの60％くらいの速さしかない様子。
しかしそれもしばらく（30分くらい）するといつもの速さになりました。

# 謎
動いたのはよかったのですが、なぜ突然ドライバがいなくなってしまったのか、しかも高負荷を掛けたタイミングで？それはただの偶然で再起動でアップデートのようなものがかかって変なドライバが入っておかしくなった？
これは謎として残りました。
mockito基本

# 基本

## Mockしたクラスのメソッドが呼ばれることのテスト

```java
@ExtendWith(MockitoExtension.class)
public class IndexSelectScanTest {
  @Mock
  private User user; // mockしたいClass
   
  @Test
  public void testMock() {
    Example expl = new Example(user);
    expl.doSomethingForUser(); // ExampleのdoSomethingForUser()メソッドをコール
    verify(user).doSomething(); // userのupdateIdメソッドも呼ばれたことをテスト
  }
}
```

## Mockしたクラスで返す値をセットしておく

```java
@ExtendWith(MockitoExtension.class)
public class IndexSelectScanTest {
  @Mock
  private User user; // mockしたいClass
   
  @Test
  public void testMock() {
    when(user.getId()).thenReturn(10); // userのgetId()で10を返すようにセット
    Example expl = new Example(user);
    assertEquals(10, expl.getUserId()); // getUserId()内でuser.getId()を呼んでるとして10が返すことをテスト
  }
}
```

# Tips

## when ~ thenReturn

コールされる順番で返す値を変える

```java
when( method-call ).thenReturn( value1, value2, value3 );
```

## verify

コールされる回数をテスト

```java
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

verify(mockObject, atLeast(2)).someMethod("was called at least twice");
verify(mockObject, times(3)).someMethod("was called exactly three times");
verify(mockObject, never()).someMethod();
```

# 参考
1. https://stackoverflow.com/questions/14889951/how-to-verify-a-method-is-called-two-times-with-mockito-verify
1. https://stackoverflow.com/questions/8088179/using-mockito-with-multiple-calls-to-the-same-method-with-the-same-arguments
1. https://www.javadoc.io/doc/org.mockito/mockito-core/2.7.21/org/mockito/Mockito.html#4
【Homeを非表示】Ubuntu 23.04でホームを削除【個人フォルダーを表示する】

下記コマンドで非表示になります
```bash
gsettings set org.gnome.shell.extensions.ding show-home false
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/78cd203d-b9f2-3832-b556-2cd360972d02.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/494236ed-0e00-823f-faa1-15bbaed0bcef.png)

引用

https://askubuntu.com/a/1407178
【実験中】UnityでAmiVoiceを試す④

Unityに呼び出せたので、次はTextへの呼び出し修正をまずは行おうと思います。

## テキストを呼び出す
追加したcsファイルから上手く呼出ができなかったため、呼出元のcsファイルに
インスタンス化させた関数を呼び出すように設定しました。

```cs
	public void resultFinalized(string result) {
//		Debug.Log("F " + result);
		Debug.Log(result);
		string text = text_(result);
		if (text != null) {
			Debug.Log(" -> " + text);
			AmiVoice_test.instance.SetText(text);
		}
	}
```

しかしながらフリーズしてしまい、上手く反映されません。
名前空間のcsファイルに呼出関数を埋め込んでいたのが原因のようで、
取り出したいTextをStaticにして外に出し、別のcsファイルから呼出することで
なんとか実装できました。

```csharp
    public void Test()
    {
        HrpSimpleTester.HrpSimpleTester.Main(strings);
        
        //ここがテキスト呼出用
        amiVoiceText.text = HrpSimpleTester.HrpSimpleTester.text;
    }
```

![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/cec315c6-8cce-6c48-cc7b-b6e1433c8ff4.png)

上手くいったと喜びましたが、どうやらQuestLinkなら表示されるものの
実機にもっていくと表示がされません。なぜ・・・

## 実機でログを追う
調べたらUnityがツール出してくれていました。

https://qiita.com/tak001/items/478c11746a38d414c0dc#:~:text=Unity2019%E3%81%8B%E3%82%89Package%20Manager%E3%81%AB%E5%85%AC%E5%BC%8F%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E3%81%8C%E5%8A%A0%E3%82%8F%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82&text=%E5%B7%A6%E4%B8%8A%E3%81%AEPackages%E3%82%92%E3%80%8CUnity%20Registry%E3%80%8D%E3%81%AB%E3%81%97%E3%81%BE%E3%81%99%E3%80%82&text=%E3%81%9D%E3%82%8C%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E3%81%A0%E3%81%91,%E3%83%AD%E3%82%B0%E3%81%8C%E5%87%BA%E5%8A%9B%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

ということで、PCから実行しつつログを出して検証をします。
Quest繋いだら速攻ログがでてきたので、一回Disconnectしておきます。

![cc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/3f53c7e6-8153-94bf-4b35-0987ddfb985a.png)

結果としては、Windowsでは読み込めていた音声ファイルが読み込めないと・・・
取り込み方法が異なるのでしょうか。

それっぽい記事が見当たらないこともあり、wavファイルを生成＆処理を渡す
といったことをして解決しようかと思います。