OmniAICreator/Qiita-1.07M huggingface dataset:
せっかくAWSの勉強をするので、インフラの基礎から勉強してみることにした

ただの備忘録です。

## 色々な単語について
#### インフラとは 　
 - サーバやネットワークのこと 　
 - infrastructure：基盤 　
 - 技術用語としての意味：システムやサービスの基盤となる設備

#### サーバーとは
- クライアントに対してサービスを提供するコンピューター

#### ネットワークとは
- 複数のコンピューターをつないで、データを送受信できるようにするもの

#### クラウドとは
- ネットワークを利用してコンピューターリソースを利用する形態のこと
- インフラをネットワーク経由で使用・管理すること
- 利点は、初期コストがすくなく、すぐに始めることが出来、サーバーの増減が自由に出来ること
- 欠点は、費用の予測がつきづらいこと、クラウド全体で障害が起きると対応のしようがない事

#### オンプレミス
- インフラを自前で用意して、自社で所有・管理する事
- 利点は、自由度が高いこと
- 欠点は、初期コストがかかり、調達期間が必要で、サーバーの増減がしにくいこと

#### AWSとは
- Amazon社が提供するクラウドサービス。サーバーやネットワークなどを提供する

#### AWSのネットワークの概念 
- リージョン
  - AWSの各サービスが提供されている地域のこと 
   最新機能はアメリカサーバーから始まり、徐々に広まる
   日本の場合は東京がおすすめ

- アベイラビリティゾーン
  - 独立したデータセンターのこと
  基本的に一つのリージョンに複数ある、災害などで利用できないものが発生した時に他で補えるように複数存在する

- VPC（Virttual Private Cloud）
  - AWS上に仮想ネットワークを作成できるサービス 
  他とは分離されたネットワーク環境を作成することが出来る 　
  
- サブネット 
  - VPCを細かく区切ったネットワーク 
  インターネットからアクセスできるサーバーと出来ないサーバーを作成したいなどの際に使用する

- パブリックサブネット
  - インターネットから接続が可能
  Webサーバーなど

- プライベートサブネット
  - インターネットから接続できない
  DBサーバーなど
  
#### IPアドレス 　
ネットワーク上の機器を認識するためのインターネット上の住所
- 特徴
  - ネットワーク上で重複しない番号
  - 32ビットの整数値で構成される
  - 読みにくいので32ビットのIPアドレスを8ビットずつの4つに組み分け（.）をいれて10進数で表現する
  - 0.0.0.0~255.255.255.255まで

- 二進数
各桁を0か1を使って数値を表す。コンピューターは2進数で計算を行う

- ビット 
2進数の1桁（0か1）。コンピュータのデータの最小単位

- バイト
8ビットを1バイトと呼ぶ

- 10進数
0~9の10種類の数値を使って数値を表す。普段使用している数値表現

- パブリックIPアドレス 　
インターネットに接続する際使用するIPアドレス
重複すると正しく通信できなくなるので、ICANNという団体が管理している
プロバイダーやサーバー事業者から貸し出される（AWS上でも貸し出される）

- プライベートIPアドレス 
インターネットで使用されないIPアドレス
使用範囲は'10.0.0.0 ~ 10.255.255.255', '172.16.0.0 ~ 172.31.255.255', '192.168.0.0 ~ 192.168.255.255'
社内LANの構築やネットワークの実験時はプライベートIPアドレスを使用する

### AWSでやった作業
#### AWS初期設定 
- AWSのアカウント作成 　
公式サイトの無料サインアップから指示された項目を入力してアカウントを作成する

- IAMで作業用ユーザーを作成 　
  - 何故作成するか
  ルートユーザーは完全なアクセス権限を持っており、思わぬ操作が発生しないよう極力ルートユーザーを使用しない
  - ルートユーザー 
  そのアカウントのすべてのAWSサービスとAWSリソースすべてに完全なアクセス権を持つ特権ユーザー 
    - アカウントの変更・解約、サポートプランの変更等をする時のみ使用する
    - 極力ルートユーザーを使用しない
  - 作業用ユーザー（IAMユーザー）
    - AWSで作成するユーザー
    - 認証情報とアクセスの許可の権限を個別に変更できる
    - 作業者ごとに個別に作成する 
    - 通常の作業はIAMユーザーで行う

- やる事
  - アカウントページにてIAMユーザーおよびロールによる請求情報のアクセスを有効化
  - サービスからIAMページへ→左側のメニューからユーザーを選択→ユーザーの作成
  - 指示に従い順に情報を入力
  - AWSマネジメントコンソールへのユーザーアクセスを提供するにチェック
  - IAMユーザーを作成しますにチェック
  - コンソールパスワードは自動作成、カスタムでもどちらでも可
  - ユーザーは次回のサインイン時に新しいパスワードを作成する必要がありますのチェックもお好みで 
  - 許可設定 
  - 許可のオプションはお好みで、今回はポリシーに直接アタッチするにチェック（AWS側が予めある程度用意してくれたもの
  - 今回は自作なので最強の権限を付けます -Administrator
  - タグの追加
  - ユーザーの役割を明示化するためのもの、今回の不要のため次へ
  - ユーザー作成完了
  - ログイン用のURL「コンソールサインインURL」をどこかへ保存
  - ユーザー名とパスワードもメモを取る
  - IAMユーザーのログイン
  - 「コンソールサインインURL」にアクセスしてお気に入り保存
  - 情報を入力してログインして完了

#### CloudTrailで操作ログを記録
いつ誰が何をしたのかを記録する。不正アクセスや不正操作があった時にチェック出来るようになる 　

- やる事
  - CloudTrailで証跡を作成する→S3に保存される
  - 今回はしない


記事を読んでくださった方は、是非弊社開発課のXもフォローしてください
毎日エンジニアに向けた情報発信を行っています
https://twitter.com/tech_cin
「現代数理統計学の基礎」演習問題解法メモ　第5章問12～14

問12は難問。未だすっきりしません。
問13(2)は、漸近分布ではなく極地分布ではと思うのですが。
問14は計算大変。
問14までは脳内ライブラリアンも参考にしていましたが、問15からはQiitaの@toukei(Ryuji Hasimoto)さんを頼りにしました。
UPしてくれた方々には感謝しています。
![第5章問12　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/07a05bbc-938c-34af-f3f3-edab0fde4da6.jpeg)
![第5章問12　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/11f294f8-2e5b-b6be-5c68-6702e529afac.jpeg)
![第5章問12　②P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/d918aaf8-5ea0-9214-ea8f-4467921fe382.jpeg)
![第5章問12　②P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/7a7802b1-a5f3-9bd7-7c2d-63a27606926e.jpeg)
![第5章問13　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/355265ca-b28a-62ef-ac4a-418ee129d58a.jpeg)
![第5章問13　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/7560b97c-3c67-863d-ab70-630d59b9aef3.jpeg)
![第5章問13(2) P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/0cb7aa6a-e26e-1c29-be6f-ad386fc2a3ce.jpeg)
![第5章問13(2) P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/0d65fb62-97c3-5cd2-8a93-18ab7bca3c0b.jpeg)
![第5章問14　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/a675971a-a60c-4651-7865-97d2a2791adb.jpeg)
![第5章問14　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/0b3cf18c-9edc-2232-691e-aeaf95805a4d.jpeg)
![第5章問15 P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/37a356a9-dbb5-e200-019d-7112d6e6116c.jpeg)
![第5章問15 P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/a4b87ddf-2361-1871-ab96-70a067c5dd5f.jpeg)
自分メモ　ECS起動タスク数の設定で詰まったこと

CDK(L3)で以下のようなECS起動設定を行っていたが必要タスク数が想定通りにならなかった。
``` L3-ECSFargate
const loadBalancedFargateService = new ecsPatterns.ApplicationLoadBalancedFargateService(this, properties.fargateServiceId, {
      cluster,
      assignPublicIp: true,
      serviceName: properties.fargateServiceId,
      memoryLimitMiB: properties.fargateMem,
      desiredCount: properties.fargateDesiredCount, ← ここを4で設定
      cpu: properties.fargateCpu,
      taskImageOptions: {
        image: containerImage,
        logDriver:ecs.LogDrivers.firelens({})
      },
      loadBalancer: alb,
      platformVersion: ecs.FargatePlatformVersion.VERSION1_4,
      enableExecuteCommand: true,
    });
```
desiredCountを任意の数に設定することで必要タスク数を調整できると思っていたが、
実際に起動すると1タスクしか起動しない形だった。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ecs.FargateService.html#:~:text=for%20the%20service.-,desiredCount,-%3F

前試したときはここだけで問題なかったのに…と困っていたがどうやら
AutoScalingPolicyの設定追加の影響によるものだとわかった。

``` AutoScalingPolicy
const autoscaling = loadBalancedFargateService.service.autoScaleTaskCount({ maxCapacity: 5 });
    autoscaling.scaleOnMemoryUtilization('ScalingOnMemory', {
      targetUtilizationPercent: 80,
      scaleInCooldown: Duration.seconds(60),
      scaleOutCooldown: Duration.seconds(60)
    }
```
上記がオートスケール設定だがmaxCapacityを5で設定しているがminCapacityの設定はない状態。
この場合minCapacityはデフォルト値の1で設定される。

このminCapacity値がdisiredCountより優先されるようで、必要数（常時起動数）が1になっていた。
なのでminCapacity: 4を追加する形で対処した。

詰まったのでメモがてら記事化
debian11系にpython2.7をインストールする際の備忘録

debian11系にpython2.Xをインストールする際の備忘録

※ python2.X系はもうEOLなので、python3.X系を使った方がいいです
※ 以下は妄想です

## 背景

ある日、debian11系にpython-devインストール試みるとエラーとなった

```sh
$ sudo apt install --yes python-dev
...
E: Package 'python-dev' has no installation candidate
```

debian11系以降、python-devはもはや利用可能ではないらしい

> https://unix.stackexchange.com/questions/708493/python-dev-package-installation-error
> python-dev is no longer available since Debian 11, Ubuntu 20.10, and any distribution derived from those.

## 対策

以下を参考に、こちらからソースコードをダウンロードして直接ビルド/インストールした

> https://arkgame.com/2023/11/01/post-323941/

```sh
sudo apt install --yes make zlib1g-dev
curl -LO https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz
tar xf Python-2.7.18.tgz
cd Python-2.7.18
./configure
make & make install
cd ..
su ln -s /bin/python2.7 /usr/bin/python   # ここは要調整
```

しかし昨今の事情を踏まえると、流石にpython3.X系を使った方がいいと考える。

## zlib1g-devがなくてエラー出力してしまう

以下で解決

```sh
sudo apt install --yes zlib1g-dev
```

## makeがなくてエラー出力してしまう

以下で解決

```sh
sudo apt install --yes make
```

## 参考

https://qiita.com/ysd_marrrr/items/472162288b9c131f5427

https://arkgame.com/2023/11/01/post-323941/
localhot xampp セッティング例「備忘録」

一度整理して、再構築したので構築の見本と備忘録のため例として載せることにしました。
それぞれの環境のパスに合わせ参考程度でお願いします。
```text
xampp-control.exe  action to stato

it my address
C:\xampp\htdocs
http://localhost/    to PHP: index.php http://127.0.0.1/index.php

Apache 2.2 work Area action?
file:///C:/Program%20Files%20%40x86%41/Apache%20Software%20Foundation/Apache2.2/htdocs/my_work_index.memo
PHP
php_5_4_6_Win32_VC9_x86 Chec Apach conf httpd.conf No Sete UP.
php_8_2_12_vs16_64 local no setup
Sete up: Apache
     AddHandler cgi-script .cgi .pl .rb .ext .py

     ####2023/11/27,12/07,2024/02/07
AddType application/x-httpd-cgi .cgi
AddType application/x-httpd-cgi .pl
AddType application/x-httpd-cgi .rb
AddType application/x-httpd-cgi .ext
AddType application/x-httpd-cgi .py


adores: python action?
file:///C:\Python3\pyhton.exe%20-X%20utf8   : cd C:\Python3 python.exe -X utf8 ;to sell address to exit();
#!c:/Python3/python -X utf8
local Area
http://localhost/my_python/
2nd: Anaconda 3.11
#!C:/Anaconda/python -X utf8

php local setup; no.
local Area
http://localhost/my_php/


address: Perl 5.32.1
#!c:/xampp/perl/bin/perl
2nd: 5.22.1
#!c:/Perl64/bin/perl

tomcat work 2:C:\Program Files\Java C:\Program Files (x86)\Java JDKなし
file:///C:\xampp\tomcat\webapps\examples/my_work_index.memo

```
JAVA 初期においてxamppがランニングにならない場合は、画像の様にsettingをしてみてください。JDKも忘れずセットアップする事をお勧めします。
![2024-02-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/cc03f6e4-6082-fb36-7df5-3e94a7bd8d59.png)
ユーザー名とパスワードを設定します。tomcat-users.xml
```text
<!--chenge no stop eria-->
  <role rolename="manager-gui"/>
 <!-- <role rolename="role1"/> -->
  <user username="tattyan" password="1122xx" roles="manager-gui"/>
 <!-- <user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
  <user username="role1" password="<must-be-changed>" roles="role1"/> -->
<!-- -->
</tomcat-users>
```
http://localhost:8080/ ユーザーとパスワードの認証を一回行ってください。
```text
http://localhost:8080/　　Apache Tomcat/8.5.96    404 セットアップアドバイス

http://localhost:8080/examples/index.html   ここのアドレス it sampul url link.
C:\xampp\tomcat\webapps\examples
```
shell でポートが動いているか確認するコマンド。
Get-Process -Id (Get-NetTCPConnection -LocalPort 8080).OwningProcess

ただし、python perl cgi はランニングまださせていません。
参考になればうれしく思います。
/connect/cms/contents REST API


+ [REST API Error when creating or updating CMS content with an image reference](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XITuv)

[CMS Contents](https://developer.salesforce.com/docs/atlas.en-us.chatterapi.meta/chatterapi/connect_resources_cms_contents.htm)の例ではエラーになる

```Json
{
	
	"contentSpaceOrFolderId" : "0Zuxx00000003M5CAI",
	
	"title" : "Title of Document",
	
	"contentType" : "ftestSfdcOnly__banner",
	
	"urlName" : "testUrl",
	
	"contentBody" : {
		
		   "bannerImage" : "MCZOCY2AM5PFBADN5UDRB53TLXR4",
		
		   "featuredEvent" : "MCZOCY2AM5PFBADN5UDRB53TLXR4",
		
		   "excerpt" : "this is test except",
		
		   "body" : "<p>Test body</p>"
		   
		}
		
	}
 ```

 エラーにならないように調整した例

 "source":が必要？

 ```Json
 {
	
	"contentSpaceOrFolderId" : "0Zuxx00000003M5CAI",
	
	"title" : "Title of Document",
	
	"contentType" : "ftestSfdcOnly__banner",
	
	"urlName" : "testUrl",
	
	"contentBody" : {
		
		   "bannerImage": {
			 "source": {
				 "type": "imageReference",
				 "ref": {
					 "contentKey": "MCZOCY2AM5PFBADN5UDRB53TLXR4" 
					} 
					} 
				},
				
				   "featuredEvent": {
					 "source": {
						 "type": "imageReference",
						 "ref": {
							 "contentKey": "MCZOCY2AM5PFBADN5UDRB53TLXR4" 
							} 
							} 
						},
						
						   "excerpt" : "this is test except",
						
						   "body" : "<p>Test body</p>"
						   
						}
						
					}
```
AWS athenaのエンドポイントによるデータセットエラーについて

AWSのathenaにてS3のデータセットを選択しようした際に発生した、下記エラーの原因をメモ。

## 状況
バケットは表示されるが、中のディレクトリが表示されない。

## エラー内容
```
The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
```

## 原因
エンドポイントが異なっていた。
Athenaのリーションを変更すると解決。
Einstein 会話インサイト Einstein Conversation Insights

+ [Einstein 会話インサイト Einstein Conversation Insights の考察2](https://qiita.com/Keiji_otsubo/items/5bce0655596fe538f58c)


+ [Einstein 会話インサイト](https://help.salesforce.com/s/articleView?id=sf.call_coaching.htm&type=5)

+ [Salesforce CRM Feature Highlight: Have you seen Salesforce Einstein Conversation Insights Yet?](https://www.linkedin.com/pulse/salesforce-crm-feature-highlight-have-you-seen-einstein-bill-blagdan-9j0me)

しかし、これらの録音をたくさん聞く時間はありますか? 1 時間、さらには 30 分の録音を聞き、洞察を集めようとするのはとても苦痛です。何百ものそれらがあり、常に新しいものが入ってくると想像してください。

これらすべての録音が「AI」に入力され、録音が分析され、重要な瞬間、役立つトピック、キーワード、製品、価格設定、競合他社に分類されたらどうなるでしょうか?


そして、会話の特定の重要なポイントに焦点を当てて、すべての会話の要約を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fc79362f-7c14-a203-2fbd-7b0624be139f.png)

+ [#SalesforceRRL Einstein Converstation Insights w/ Google Meet](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X9jabSAB)


# トレイルヘッド

+ [営業のための Einstein 会話インサイト](https://trailhead.salesforce.com/content/learn/modules/einstein-call-coaching)

# Salesforce Einstein Call Coaching Deeper Dive

+ [Salesforce Einstein Call Coaching Deeper Dive](https://www.salesforceben.com/salesforce-einstein-call-coaching-deeper-dive/)

+ [#SalesforceRRL Unified Service Knowledge - Case Deflection via Live Chat](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XIcXHSA1)

# 概要部分を日本語にならない

+ [録画の概要部分を日本語に設定することは可能でしょうか？](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J7prh)

:::note
はい、ECI 記録の概要セクションを日本語に設定できます。Einstein Conversation Insights にアクセスでき、この機能に対する適切な権限があることを確認してください。 

詳細については、次のヘルプ記事を参照してください。

https://help.salesforce.com/s/articleView?id=release-notes.rn_sales_eci_summaries_langages.htm&release=248&type=5
:::
再現や原因判断難しいバグは、だいたい状態のせい

# 結論

再現が難しかったり、原因の判断が難しいバグは、
大抵の場合状態のせい。

既存メンバーに聞くと、結構あるある問題だから、
そこまで調査せず軽く聞いてしまうのが、だいたい良い。

# 原因の具体例

## **データベースのレコード**
不整合や特定の条件を持つレコードが原因でバグが発生する。
## **DB以外のデータ**
システムによってはテスト用のcsvやpdf, jsonなど配置が必要な可能性がある。
## **SaaSや外部システムの状態**
外部サービスの状態変化がアプリケーションに予期せぬ影響を与える。
## **ネットワーク**
ネットワークの遅延や断絶が原因で発生する問題。
## **ブラウザ、CDN、アプリケーションのキャッシュ**
キャッシュされた古いデータが原因でユーザーに誤った情報が表示される。
## **Cookie、LocalStorage**
ユーザー側のブラウザに保存された状態が原因で、特定のユーザーだけが遭遇するバグ。
## **セッション状態**
ユーザーセッションの特定の状態や期間が問題を引き起こす可能性があります。
## **環境変数やサーバーの設定**
開発、テスト、本番環境間での設定の違いがバグの原因となることがあります。
## **同時実行性の問題**
複数のプロセスやスレッドが同時に同一のリソースにアクセスする際に発生する問題。
## **依存する別リポジトリの問題**
ローカルで動作させる場合、モック用のリポジトリや依存ライブラリを格納した、別リポジトリが必要だったりする。
## **手順書が古い**
古い手順では正しく動作しない場合がある。
## OSSのバグ
たまにあるけど、そんなに無い所感。
新しいライブラリなどの場合注意。
## 作業ディレクトリが違う
気づきにくいミス。
レベルC復習

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/word-count

```py
A = {}
for target in input().split():
    if target not in A:
        A[target] = 1
    else:
        A[target] += 1

for word,result in (A.items()):
    print(word, result)
```

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/search_history

```py
n = int(input())
#チェック用の配列
re = []

for i in range(n):

    s = input()
    #もしsがre配列にあれば削除
    if s in re:
        re.pop(re.index(s))
    #追加
    re.append(s)
    
#最新から順番に（通常通りではない）
for i in range(len(re)):
    print(re[-i - 1])
```
SPAから動的に挿入されるDOMを取得する

chromeの拡張機能開発で、SPAからDOMを取得する際にハマったので、メモとして残しておきます。

## 問題点
例えば、以下のように、同期的に挿入される`sample`クラスがあったとします。
```html
<div class="sample">
    sample
</div>
```

最初は、画面の描画が完了したら、DOMを取得しようと思いました。
しかし、結果は`null`でした。
```javascript
window.onload = function() {
    let sample = document.querySelector(".sample")
    console.log(sample.textContent)
}
```

## なぜか
HTML、CSS、JSが読み取られた時に`onload`は発火するが、SPAはそこから画面を組み立てるので、取得できなかったというわけです。

## 解決策

DOMの変更を検知できる、MutationObserver[^1]を使います。
[^1]: https://developer.mozilla.org/ja/docs/Web/API/MutationObserver

これを使うことにより、DOMが挿入されたときに要素を取得することができます。

```javascript
let observer = new MutationObserver(function() {
  let sample = document.querySelector(".sample")
  if (sample) {
    console.log(sample.textContent)
    observer.disconnect()
  }
})

observer.observe(document, {childList: true, subtree: true});
```

## 参考リンク

https://ja.stackoverflow.com/questions/32430/spa%E3%81%A7%E5%8B%95%E7%9A%84%E3%81%AB%E6%8C%BF%E5%85%A5%E3%81%95%E3%82%8C%E3%82%8Bdom%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8Bdomelement-onload
rex0220 計算式プラグイン カテゴリーを文字列にセット

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、カテゴリーを文字列にセットします。
これで一覧画面をカテゴリー順に表示できます。

# 概要

カテゴリーを文字列項目にセットして、一覧画面でカテゴリー順に表示します。
一覧の表示順には、カテゴリーを指定できませんが、文字列項目にセットすることで、カテゴリー順に表示することができます。

- 大カテゴリー：カテゴリーから変換
- 文字列カテゴリー：複数カテゴリーをカンマ区切りでセット

![2024-02-08_10h43_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/84e804bd-a125-172d-0a54-fcccfd1a4d03.png)

# カテゴリーについて

カテゴリーは、同じ値を複数設定できますが、API 上では区別がつきません。
カテゴリーには別の値を設定しましょう。

![2024-02-08_10h55_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/481bd715-36ff-edf5-d09f-b11ec62f2b24.png)

# 計算式プラグイン設定

![2024-02-08_11h04_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/aa1e7d45-b98a-1f46-54dd-8a7bff65e2ac.png)

- 大カテゴリー：カテゴリーから変換
    - カテゴリーの親子関係を取得する関数が無いので、カテゴリーの名称体系から文字列変換する
    - カテゴリーから英数字を削除し、重複を除外してセット
- 文字列カテゴリー：複数カテゴリーをカンマ区切りでセット
    - 配列で取得できるカテゴリーを文字列項目にセットすると、カンマ区切りになる


```.js
// 大カテゴリー SINGLE_LINE_TEXT
LET(a,
  ARRAY_MAP(カテゴリー,w,
    REPLACERE(w,"[0-9a-zA-Z]","g","")
  ),
  DISTINCT(a)
)

// 文字列_カテゴリー SINGLE_LINE_TEXT
カテゴリー
```
sharepoint 「保留中またはアイテム保持ポリシーの適用中にリストを削除することができません」エラー対応

sharepoint のリストを削除中に、下記のエラーが出ました。
保留中またはアイテム保持ポリシーの適用中にリストを削除することができません」

対応方法は、まず、リストのフィルターを外して、
すべてのデータを削除してから、
また、リストを削除したらうまくいけます
「フロントエンドの技術的負債とその解消への道筋」LT試聴レポート

# 1. 背景
現在業務でNuxt2→React（Next）への移行を進めています。
技術選定について何かヒントになるのではと以下の勉強会に参加させて頂きました。

https://enechange-meetup.connpass.com/event/307711/

こちらで登壇された@suthioさんの
「フロントエンドの技術的負債とその解消への道筋」のLTを試聴しましたのでその内容と考えたことをまとめます。

# 2. 技術的負債
## 2.1. 定義
https://asana.com/ja/resources/technical-debt

>効果的なソリューションではなく簡単なソリューションを選ぶことで生じる追加作業のコスト

## 2.2. 影響
- 本質的な価値を出しづらい
- エンジニアのモチベが低下
- 機能追加、修正の不確実性が上がり、工数見積もりがしづらい

# 3. 技術的負債の原因
- レガシーコード、古いフレームワーク
- 新しい技術、トレンドの遅れ

# 4. フロントエンドの歴史
Yahoo! JAPANトップで見るウェブデザインの歴史

https://techblog.yahoo.co.jp/entry/20190530678295/

ユーザニーズを汲み取り続ける必要があります。
技術的に求めらること、知識量が増加していっています。
現在はbetterだったものが5年後に負債化する可能性があります。

# 5. 技術的負債をどのように解消するか

## 5.1.日々技術的負債を解消し続ける為の体制を作る
例： 副業の方に技術的負債の解消を依頼する

## 5.2.どのトレンドに乗るかの意思決定をする
React,Vue でしたりの大きなライブラリは一度使うことになると簡単には捨てられないです。
数年は使えそうか見極めたり、使う必要が本当にあるのか検討することが大切です。

一方で zod等のライブラリは切り替えたり、捨てたりするのは容易だと思います。

## 5.3. トレンドに載る必要がないもの
例：社内管理画面なのにReactでSPAは必要なのか

## 6. LTを試聴して考えたこと
- 管理画面でNuxt2からReactに移行中ですのでSPAの必要性があるのかを再検討したいです
- 移行プロジェクトとセットで技術的負債を解消し続ける為の仕組みを考えることが大切だなと思いました
キャリアに悩むエンジニア必見 Will-Can-Must による自己分析

Will-Can-Must は株式会社リクルートで使われている目標管理制度です。この記事では Will-Can-Must を使った自己分析方法を紹介します。

## 概要
Will-Can-Must は「やりたいこと・できること・すべきこと」からキャリアを考えるフレームワークです。3つが重なった部分が、自分の“生きがい”であり、理想だと言えるでしょう。

![124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/3ac7688a-57d3-1f87-142b-940b1c4eeee8.png)

### Will
Will では自分のやりたい事やなりたい姿を考えます。

- 仕事を通じて実現したいこと
- ロールモデル
- 理想の働き方・生き方

### Can
Can では自分のできる事や得意なことを考えます。

- 今の自分ができること
- スキルやこれまでの経験

### Must
Must では会社から求められている事を考えます。

- 社会や会社からの要望
- 職種の役割／売上目標
- 将来的に身につけなければならないスキル・経験

## ミスマッチ分析
Will-Can-Must の重なっている部分に着目することで、ミスマッチに気づくことができます。

### Will Can Must がばらばらの場合
Will Can Must がばらばらの場合は、ます自分が何をしていたいか、どうありたいか、自分を見つめ直す作業が必要です。

![142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/5f8d190c-1abd-7f22-bf08-0f0e6985e0eb.png)

### Will と Must が重なっている場合
会社の業務と自分の能力の間にギャップを感じるパターンです。このフェーズでは「できることを増やす」ことが重要になります。

![145.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/6ab9c82e-db69-e41c-f932-1ce5d413731c.png)
### Will と Can が重なっている場合
本人は満足している状態ですが、周りの期待に応えられてない可能性があります。

![144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/c9af6c93-ce28-2adb-17d7-9362cf103e73.png)
### Can と Must が重なっている場合
ある程度の経験を積んだ世代で起きやすい状態です。このフェーズでは、Will を貫くか、Will を諦めて Must に応えるのか、キャリアの分岐点にあります。

![143.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/b5031b79-c64d-ec14-0903-ad2f75ec9e5e.png)

### ３つが重なっている場合
3つの部分が大きく重なっている場合は、自分と周囲にとって理想の幸せな状態といえます。

![146.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/cc337a95-e1b3-74fc-db31-7b52874ab0f9.png)
## 参考文献
- マイナビ　キャリアの悩みには「Will Can Must」　転職面接やビジネスで活用しよう
https://tameni.mynavi.jp/career/6055/
- 【Will-Can-Mustシート】リクルートの活用事例～メンバーの本当に実現したいことを対話する方法
https://www.recruit.co.jp/blog/culture/20230921_4189.html
- リクルートでも「Will」が書けずに悩む人もいる取り組みたいことに縛られる“Willの神格化”からの脱却
https://logmi.jp/business/articles/327467

# 検索用キーワード
Will Can Must
Microsoft Copilotで、日本語プログラミング その16

# 概要
Microsoft Copilotのプロンプトを細工して、日本語プログラムを実行させようとする試みです。
巡回セールスマン問題をやってみた。

# Ohisama prompt

```
架空のブログを生成することを考えます。 ブログの記事を書くことです。 
構成は、
ある技術的なテーマを与えられた場合 、それに対する仮説を提案します 。
次に 仮説を裏付ける理論を示します。
計算結果を導くために、日本語プログラミングのダミーコードを書くようにしてください。 
そして、その理論を検証した計算結果を示します 。
最後に 簡潔な結論を加えるという構成です。 
では、「動的計画法で巡回セールスマン問題」というテーマで、ブログを記事にしてみてください。
```

# 回答

こんにちは、Copilotです。ブログの記事を生成するのは面白い挑戦ですね。😊
「動的計画法で巡回セールスマン問題」というテーマで、ブログの記事を生成してみました。以下がその内容です。

# 動的計画法で巡回セールスマン問題を解く

## 仮説
巡回セールスマン問題とは、ある都市の集合とそれらの間の距離が与えられたとき、全ての都市を一度ずつ訪れて出発地に戻る最短の経路を求める問題です。この問題はNP困難であり、一般には多項式時間で解くことができません。しかし、動的計画法という手法を用いると、都市の数が小さければ、効率的に解くことができます。動的計画法とは、大きな問題を小さな部分問題に分割して、それらの最適解を組み合わせて全体の最適解を求める手法です。巡回セールスマン問題では、部分問題として、ある都市$i$から出発して、残りの都市の部分集合$S$を訪れる最短経路の長さを求める問題を考えます。この部分問題の最適解をメモ化しておくことで、重複する計算を避けることができます。また、部分問題の最適解から、全体の最適解を再構成することができます。

## 理論
動的計画法で巡回セールスマン問題を解くためには、以下のような手順を踏みます。

1. 都市の数を$n$とし、都市を$0,1,\dots,n-1$と番号付けします。また、都市$i$と都市$j$の間の距離を$d(i,j)$とします。
2. 部分問題を定義します。部分問題は、ある都市$i$から出発して、残りの都市の部分集合$S$を訪れる最短経路の長さを表す関数$C(i,S)$です。ただし、$i \notin S$とします。また、$S$はビット列で表現します。例えば、$S=1010$なら、都市$1$と都市$3$を含む部分集合を表します。
3. 部分問題の漸化式を導きます。部分問題の最適解は、以下のように求めることができます。
    - $S$が空集合のとき、$C(i,S) = d(i,0)$です。これは、出発地に戻るだけの経路の長さです。
    - $S$が空集合でないとき、$C(i,S) = \min_{j \in S} \{d(i,j) + C(j,S \setminus \{j\})\}$です。これは、$i$から$S$の中の任意の都市$j$に移動し、そこから$S$から$j$を除いた部分集合を訪れる最短経路の長さに、$i$と$j$の間の距離を足したものの最小値です。
4. 部分問題の最適解をメモ化します。部分問題の最適解は、$n \times 2^n$の二次元配列に格納します。配列の要素は、$C(i,S)$の値と、その値を得るために選んだ都市$j$のペアです。配列の初期化は、$S$が空集合の場合のみ行います。その他の場合は、必要になったときに計算します。
5. 全体の最適解を求めます。全体の最適解は、$C(0,\{1,2,\dots,n-1\})$の値です。これは、都市$0$から出発して、残りの全ての都市を訪れる最短経路の長さです。
6. 最適解の経路を再構成します。最適解の経路は、配列に格納された都市$j$の情報を辿ることで得ることができます。具体的には、以下のようにします。
    - $i=0$と$S=\{1,2,\dots,n-1\}$とします。
    - 配列から$C(i,S)$の値と、その値を得るために選んだ都市$j$のペアを取り出します。
    - $i$を経路に追加します。
    - $i=j$と$S=S \setminus \{j\}$とします。
    - $S$が空集合になるまで、この操作を繰り返します。
    - $0$を経路に追加します。

## ダミーコード
日本語プログラミングのダミーコードを書くと、以下のようになります。

```python
# 都市の数
n = 5
# 都市間の距離
d = [[0, 3, 6, 7, 9],
     [3, 0, 4, 8, 2],
     [6, 4, 0, 3, 5],
     [7, 8, 3, 0, 6],
     [9, 2, 5, 6, 0]]

# 部分問題の最適解を格納する配列
# 配列の要素は、C(i,S)の値と、その値を得るために選んだ都市jのペア
C = [[(-1, -1) for _ in range(2**n)] for _ in range(n)]

# 部分問題の最適解を計算する関数
def solve(i, S):
  # Sが空集合の場合
  if S == 0:
    # C(i,S) = d(i,0)とj = 0を配列に格納
    C[i][S] = (d[i][0], 0)
    return C[i][S]
  # Sが空集合でない場合
  else:
    # 配列にすでに値がある場合
    if C[i][S][0] != -1:
      # 配列の値を返す
      return C[i][S]
    # 配列に値がない場合
    else:
      # 最小値とそのときの都市jを初期化
      min_val = float('inf')
      min_j = -1
      # Sの中の全ての都市jについて
      for j in range(n):
        # jがSに含まれる場合
        if S & (1 << j):
          # d(i,j) + C(j,S \ j)の値を計算
          val = d[i][j] + solve(j, S ^ (1 << j))[0]
          # 最小値を更新
          if val < min_val:
            min_val = val
            min_j = j
      # C(i,S) = min_valとj = min_jを配列に格納
      C[i][S] = (min_val, min_j)
      return C[i][S]

# 全体の最適解を求める
ans = solve(0, 2**n - 2)[0]

# 最適解の経路を再構成する
path = []
i = 0
S = 2**n -
```


以上。
Gitでコミットした後にメッセージを修正する

## 環境
Ubuntu 20.4
Git 2.25

## はじめに
コミット（git commit）した後でもメッセージを修正することができます。修正するコマンドは、状況に合わせて、２種類のコマンドがあります。

- 直前のコミット（HEAD）に対して修正する
- 過去のコミット（HEAD以降）に対して修正する

## 直前のコミットに対して

コマンドの雛形は次のようになります。
```
$git commit --amend -m "修正後のメッセージ"
```

現在のログの状況です。
```
$git log --oneline
7869790 (HEAD) abc
ce9d4dd ab
4c0a5a0 aa
```

直前にコミット（HEAD）したメッセージを修正します。
```
$git commit --amend -m "修正したよ"
[detached HEAD 86b8012] 修正したよ
```

abc（修正前）→修正したよ（修正後）に変更されました。
```
$git log --oneline
86b8012 (HEAD) 修正したよ
ce9d4dd ab
4c0a5a0 aa
```

メッセージは何度も修正することができます。
```
$git commit --amend -m "再度、修正したよ"
[detached HEAD ce0a15d] 再度、修正したよ
```

ログを確認すると、修正したよ（修正前）→再度、修正したよ（修正後）に変わりました。
```
$ git log --oneline
ce0a15d (HEAD) 再度、修正したよ
ce9d4dd ab
4c0a5a0 aa
```

## 過去のコミットに対して

現在のログの状況です。
```
$log --oneline
20e66d5 (HEAD) abb
effbad7 abab
776800d a+b+c+d+e
45a20eb a+bb###
2ee0155 a
```

HEAD以降の、３つの履歴をviで表示します。
```
$git rebase -i HEAD^^^
```

git logでログを表示すると、履歴は上から下に、新しい履歴から古い履歴の順に表示されますが、viで表示される履歴は、上から下に、古い履歴から新しい履歴の順に表示されます。viで、修正したい履歴の１行をpick→editに修正します。修正は複数行修正できてしまいますが、１行だけにします。ここでメッセージを修正しても反映されません。
```
# 修正前
pick 776800d a+b+c+d+e
pick effbad7 abab
pick 20e66d5 abb

# 修正後
edit 776800d a+b+c+d+e
pick effbad7 abab
pick 20e66d5 abb
```

更新してviを終了します。この時点でログを表示すると、editに修正した履歴がHEADになっています。一瞬焦りますが、それより新しい履歴は一時的に非表示になっているだけで、削除されたわけではありません。この後、復活します。
```
$git log --oneline
776800d (HEAD) a+b+c+d+e
45a20eb a+bb###
2ee0155 a
```

editした履歴に対し、修正後のメッセージを指定します。
```
$git commit --amend -m "a+b+c+d+e 修正したよ"
```

この時点でログを表示すると、新しいメッセージが反映されます。
```
$git log --oneline
b40f220 (HEAD) a+b+c+d+e 修正したよ
45a20eb a+bb###
2ee0155 a
```

ここで、履歴の再構築が行われます。
```
$git rebase --continue
```

修正したメッセージが反映された状態で、ログが元に戻りました。
```
$git log --oneline
8b50340 (HEAD) abb
d651247 abab
b40f220 a+b+c+d+e 修正したよ
45a20eb a+bb###
2ee0155 a
```

## 備考
参考記事
https://www.granfairs.com/blog/staff/git-commit-fix
キーワード削除のVBA

Sub DeleteLinesWithKeywordsInFolder()
    Dim Keyword As String
    Dim KeywordsSheet As Worksheet
    Dim KeywordsRange As Range
    Dim FolderPath As String
    Dim TempFilePath As String
    Dim TextFile As String
    Dim LineText As String
    Dim OutputText As String
    Dim fs As Object
    Dim File As Object
    Dim Cell As Range ' 追加：Cell変数の定義

    ' 削除ワードが記述されたシートを取得します。
    Set KeywordsSheet = ThisWorkbook.Sheets("KeywordsSheet") ' シート名を適宜変更してください
    
    ' 削除ワードが記述された範囲を取得します。
    Set KeywordsRange = KeywordsSheet.Range("A1").CurrentRegion
    
    ' フォルダーのパスを指定します。
    FolderPath = "C:\Path\To\Your\Folder\" ' フォルダのパスを変更してください
    
    ' フォルダー内のすべてのテキストファイルに対してループします。
    Set fs = CreateObject("Scripting.FileSystemObject")
    TextFile = Dir(FolderPath & "*.txt")
    Do While TextFile <> ""
        ' テキストファイルのパスを設定します。
        FilePath = FolderPath & TextFile
        
        ' 一時ファイルのパスを設定します。
        TempFilePath = FolderPath & "Temp_" & TextFile
        
        ' テキストファイルを開きます。
        Open FilePath For Input As #1
        Open TempFilePath For Output As #2
        
        ' テキストファイルを行ごとに読み込み、削除ワードを含む行を削除します。
        Do Until EOF(1)
            Line Input #1, LineText
            For Each Cell In KeywordsRange
                Keyword = Cell.Value
                If InStr(1, LineText, Keyword, vbTextCompare) > 0 Then
                    ' 削除ワードが含まれる行はスキップします。
                    Exit For
                End If
            Next Cell
            ' 削除されなかった行を一時ファイルに書き込みます。
            If InStr(1, LineText, Keyword, vbTextCompare) = 0 Then
                Print #2, LineText
            End If
        Loop
        
        ' ファイルを閉じます。
        Close #1
        Close #2
        
        ' 元のファイルを削除して一時ファイルを元のファイル名にリネームします。
        Kill FilePath
        Name TempFilePath As FilePath
        
        ' 次のテキストファイルに進みます。
        TextFile = Dir
    Loop
    
    MsgBox "処理が完了しました。"
End Sub
Databricks にて Databricks SDK 利用時の default auth: cannot configure default credentials エラーへの対応方法

## 概要

Databricks SDK にて`WorkspaceClient`のインスタンスする際に、`default auth: cannot configure default credentials`が発生した場合の対応方法を共有します。対応方法としては、Databricks SDK のアップグレードで解決するようです。2024年2月8日時点では、Databricks Runtime 14.3 LTS においても、アップグレードが必要なようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4a7cd694-1280-d9f1-152a-e324efed5938.png)

## エラーメッセージと対応方法

### エラーメッセージ

```python
from databricks.sdk import WorkspaceClient

w = WorkspaceClient()
```

```text
ValueError: default auth: cannot configure default credentials
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c324e81d-ca15-1143-964d-ff81e3b12b7a.png)

### 対応方法

### 1. Databricks SDK のアップグレード

```python
%pip install databricks-sdk --upgrade --q
dbutils.library.restartPython()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/dd1b5b98-c666-5ae2-692e-16969761602d.png)

### 2. 正常通りに実行できることを確認

```python
from databricks.sdk import WorkspaceClient

w = WorkspaceClient()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9fa7add0-511e-9d72-c3bc-bf3780cdc5e4.png)
「Error: error:0308010C:digital envelope routines::unsupported」エラーでビルドができない

# 問題
「Error: error:0308010C:digital envelope routines::unsupported」というエラー発生してビルドができない。

# 環境
Mac OS

# 原因
Node.jsの新しいバージョンにしたことで、パッケージやライブラリとの互換性に問題が生じたため。

# 解決方法

nvmが入っていない場合はインストール
```bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash 
nvm --version
```

ここで
「-bash: nvm: command not found」というエラーが返ってきた場合は

```bash
source ~/.nvm/nvm.sh
```
上記のコマンドを実行。


その後、改めてお好きなバージョンのnvmをインストール

```bash
nvm install 12.0.0
nvm use 12.0.0
```

再度ビルドを行なって確認
```bash
npm run build
npm run serve
```
Copilot Studioで複数のドキュメントを参照させたいならSharePointサイトを使おう 

# はじめに
Copilot Studioは、自身の好みにカスタマイズしたチャットボットをローコードで作成できるツールです。


Copilot Studioは生成AI機能を使うとWebサイトとSharePointを参照して文章を返してくれます。
プレビュー機能ですが、ドキュメントをアップロードして応答を強化することもできます。（アップロード数には上限があり、ファイルは４つまで）
今回紹介する方法では、４つ以上のドキュメントをアップロードして参照させることができます。
それが、SharePointサイトを作って、そこにドキュメントをアップロードする方法です。

# SharePointサイトを作成する

1. SharePointのホーム画面に行き、「サイトを作成」を押します
2. チームサイトを選択します
3. 標準チームを選択します
4. テンプレートを使用をクリックします
5. サイト名を入力し、次へをクリックします
![スクリーンショット 2024-02-08 8.56.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503518/1346449d-a03b-470d-fd3f-349b4bffb996.png)

6. プライベート・パブリックを選択し、サイトの作成をクリックします
7. メンバーに自分を追加し、完了をクリックします

# SharePointサイトにドキュメントをアップロードする
1. 作成したサイトで、左側のメニューのドキュメントをクリックします
2. アップロードをクリックしてファイルをアップロードします
![スクリーンショット 2024-02-08 8.58.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503518/1abd80bb-3a10-bf74-09df-062b284a6f03.png)


ここで注意なのが検索に対応しているのは以下のファイル形式です。
[参考：Microsoftのドキュメント](https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/nlu-boost-node)
- SharePoint ページ (aspx ページ)
- Word 文書 (docx)
- PowerPoint ドキュメント (pptx)
- PDF ドキュメント (pdf)

**Excelファイルは表をWordに貼り付けてそれをアップロードするということが必要です。**

# Azure PortalでAPIのアクセス許可を追加する
![スクリーンショット 2024-02-08 10.33.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503518/68df23c5-4ab8-6447-76c2-569697d3435d.png)



1. Copilotの設定->セキュリティ->認証を開きます。「手動（カスタムWebサイトの場合）」が選択されており、クライアントID・クライアントシークレットが正しく入力されていることを確認します。
※クライアントID・クライアントシークレットの取得方法については[こちらの記事](https://ippu-biz.com/development/powerplatform/copilot-studio/generate-answer-from-spo/)がわかりやすいです。
![スクリーンショット 2024-02-08 10.24.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503518/b175cbd9-622c-55c0-6c5a-683df80c2111.png)

2. 続いてAzure Portalのアプリの登録を開きます
3. 「アクセス許可の追加」をクリックし、Microsoft Graphをクリック、「委任されたアクセス許可」からFiles -> **Files.Read.All** と Sites -> **Sites.Read.All**を追加します。

# CopilotにSharePointソースを設定する
1. Copilots Studioの画面を開き、メニュー「生成AI」をクリックします
2. 下にスクロールし、「生成型の解答で会話の対象範囲を拡大します」をオンにします
![スクリーンショット 2024-02-08 9.31.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503518/9d0083be-4de0-e65a-1d91-726accdee562.png)

3. **SharePointサイトのURL**（アップロードしたドキュメントのURLではありません）を入力しAddボタンを押します（`https://`は省略することがベストプラクティスです）

![スクリーンショット 2024-02-08 10.16.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503518/baffdca9-a9c5-a0f1-ab8b-f705cef08aee.png)



4.忘れずに**保存ボタンを押すこと**



# 終わりに
以上の設定を終えて、Copilotとチャットしてみてください。長文は理解できないことが多く、単語を入力するとテストしやすいです。
Array.prototype.every()を学ぶ

今回はeveryです！
早速[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/every)を見ていきます。

> every() は Array インスタンスのメソッドは、列内のすべての要素が指定された関数で実装されたテストに合格するかどうかをテストします。これは論理値を返します。

配列内の全ての値が条件を満たしていればtrueを返す、なるほど。

```js
// 公式から引用
const isBelowThreshold = (currentValue) => currentValue < 40;
const array1 = [1, 30, 39, 29, 10, 13];
console.log(array1.every(isBelowThreshold));
// true


const isBelowThreshold = (currentValue) => currentValue < 40;
const array1 = [1, 30, 39, 29, 10, 40, ]; // 40にしてみる
console.log(array1.every(isBelowThreshold));
// false
```

## 構文、引数
every(callbackFn)
every(callbackFn, thisArg)

### callbackFn
よくみる３つを引数に持てますね。

>element
配列内で処理中の現在の要素です。
index
配列内で処理中の現在の要素のインデックスです。
array
every() が呼び出された配列です。

### thisArg
何をthisとして扱うかを指定できます。

## 解説
>配列のそれぞれの要素に対して、指定された callbackFn 関数が偽値を返すまで一度ずつ呼び出します。 そのような要素が見つかった場合、 every() は直ちに false を返し、配列の反復処理を中止します。

`直ちに false を返し` とあります。
[someの時](https://qiita.com/TMDM/items/d65daf416931f7c74183#%E8%BF%94%E5%80%A4)もそうでしたが、余計な処理をskipしてくれるのはいいですね。

> every は数学における「∀ （すべての / for all）」記号と同様のふるまいをします。特に、空の配列に対しては true を返します。（空集合のすべての要素が与えられた任意の条件を満たすことは空虚に真です。）

### 空虚に真（Vacuous Truth）

なにそれ？ChatGPTに聞いてみました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129861/a170a344-5946-fea0-38e1-d4d2711b46d7.png" width="400">

∀でターンエーだと思っていたら、まさかのユニコーン出てきました。
条件を満たす対象が存在しない場合trueとする。と言うことですね。なるほど。

確認します↓
```js
const isBelowThreshold = (currentValue) => currentValue < 40;
const array1 = [];
console.log(array1.every(isBelowThreshold));
// true
```

ほんとだ。trueです。

読み進めます。

>callbackFn は値が代入されている配列の要素に対してのみ呼び出されます。疎配列の空のスロットに対しては呼び出されません。

ここも[some()](https://qiita.com/TMDM/items/d65daf416931f7c74183#%E8%A7%A3%E8%AA%AC)と似ていますね。

確認します↓

```js
const isBelowThreshold = (element , index) => {
  console.log(element);
  console.log(index);
  console.log("-----------");
  return element < 40;
}
const array1 = [,,,,,,,2];

console.log(array1.every(isBelowThreshold));
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129861/f71ff7f9-3591-9ceb-c63a-d9beaa064288.png" width="200">

確かに、index7番までskipしてくれています！
読み進めます。

> callbackFn は、 every() の呼び出しを始めたときの配列の長さを超えて追加された要素にはアクセスしません。
既に処理したインデックスを変更しても、 callbackFn が再度呼び出されることはありません。
まだ処理していない既存の配列要素が callbackFn によって変更された場合、callbackFn に渡される値はその要素が取得された時点での値になります。削除された要素は処理されません。

ここもsome()で確認しました。
- everyを呼び出した時点の配列数しか処理しない
- 未来の値を変更したらその値が処理対象となる
- every中に配列の中身を増やしても、増えたものに関しては処理しない

ですね。なるほど！

-------

今回はeveryを見ていきました！
someの全部一致バージョンとして理解しました。
引き続き、学習を続けていきましょう！！
[AWS] 駆け出しAWSエンジニアこそJAWS-UGに参加しよう！

ごきげんいかがですか
新卒１年目のyuchamです。

AWSエンジニアのコミュニティであるJAWS-UGについての紹介をしたいと思います😄

### 1.JAWS-UGとは

正式名称はAWS Users Group – Japanで AWS を利用する人々のコミュニティです。

JAWS-UGの中にも**たくさんのグループ**があり、特徴も様々です。
AWSの公式サイトでは以下のように説明されています

:::note info
JAWS-UG はエリア、地域を拠点とした**地域支部**と、勉強会のテーマ、目的別に組織化された**専門支部**があります。

**地域支部**はほぼ日本全国の都道府県に存在し、地元を中心に勉強会を企画・開催しています。
**専門支部**は東京を中心に勉強会を開催し、リモート枠による勉強会内容のライブ配信をしたり、地域支部とのコラボレーションを行うことがあります。
:::
https://aws.amazon.com/jp/campaigns/manga/vol11-3/#:~:text=JAWS%2DUG%20%E3%81%A8%E3%81%AF%E3%80%81AWS,%E3%81%AA%E3%81%A9%E3%82%92%E8%A1%8C%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

勉強会のグループ一覧をこちらに載せておきますね👍

https://jaws-ug.jp/act/

### 2. なぜ駆け出しエンジニアにおすすめするか

JAWSの朝会や、様々な支部に時間がある時に参加させていただきました。

そしてJAWS-UG CLI専門支部では、ＬＴ会で発表する時間を与えてくださいました。

https://jawsug-cli.connpass.com/

JAWSの専門支部でのハンズオンなどは内容がしっかりしていて、ついていけないことも多々あります。

しかし、こんなにも**わからないことがたくさんあるということに気づくことができる**コミュニティだと思います。

資格を何個もとって満足してしまわず、謙虚に学び続ける姿勢それをこのコミュニティで得られるのではないでしょうか。

ある方が「AWSの資格を全て取得しても、AWSについて**2割分かっただけ**」だとおっしゃっています。

資格を取るとわかった気になりますが、まだまだ深くまで学ぶことができていないということですね、、

### 3. おわりに

新卒間もないAWSエンジニアこそJAWSに参加して、有識者と仲がよくなって、高め合える仲間を作りましょう！

僕も、週１回はJAWSに参加して学びを深めていきたいと思います。
tailwind+viteでcolorクラスが吐かれなくなった

# 起こったこと

Laravelを使った開発で、デザイン会社から上がってきたデザインを適用していました。

register.blade.php
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42707/6346a22b-70c7-250a-65a8-50607be7d00e.png)

必須の文字が白くならない！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42707/3ff86aca-0fb9-a346-a779-6e8d61c6822d.png)

# 原因調査

tailwind+viteが動かないことはよくあるのでググります。

:mag:tailwind vite not working

よくある問題は、
* ```npm run dev```を動かしてない
* 必要なモジュール(postcss,autoprefixer)が足りてない
* classを探索する先が間違えてる

とかですが、全然だめ。

```
npx tailwindcss -i ./resources/css/app.css -o ./public/css/app.css --minify
```
でcssを吐き出してみてもtext-whiteが無い。

# 解決編

```tailwind.config.js
import forms from '@tailwindcss/forms';

/** @type {import('tailwindcss').Config} */
export default {
    content: [
        './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
        './storage/framework/views/*.php',
        './resources/views/**/*.blade.php',
    ],
/** ★デザイン会社からもらったものを貼り付けた(つもり)  */
    theme: {
        fontFamily: {
            sans: ['Arial', 'ヒラギノ角ゴ Pro', 'system-ui', 'sans-serif'],
        },
        colors: {
            'basecolor': '#dc000c',
        }
    },
/** ここまで */
    plugins: [forms],
};

```

themaの部分はデザイン会社からもらったのを貼り付けた。
が、消してみると動いた。

よく見ると違っていて、

```diff_javascript:tailwind.config.js
import forms from '@tailwindcss/forms';

/** @type {import('tailwindcss').Config} */
export default {
    content: [
        './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
        './storage/framework/views/*.php',
        './resources/views/**/*.blade.php',
    ],
    theme: {
+        extend: {
            fontFamily: {
                sans: ['Arial', 'ヒラギノ角ゴ Pro', 'system-ui', 'sans-serif'],
            },
            colors: {
                'basecolor': '#dc000c',
            }
+        }
    },
    plugins: [forms],
};
```

```extend: {}```になってなかった！

> デフォルトのテーマを拡張する
> テーマ オプションのデフォルト値を保持しつつ、新しい値も追加したい場合は、theme.extend設定ファイルのキーの下に拡張機能を追加します。このキーの下の値は既存のtheme値とマージされ、使用できる新しいクラスとして自動的に利用可能になります。

extendをつけてないと上書きされて他のcolorが使えなくなってしまったのが原因でした。

あまりにしょうもないのと長時間ハマったので共有します。
Reactで学習記録アプリを開発

## はじめに

現在Shopifyのサイト制作を行なっているのですが、スキルアップを狙ってReactを学習中です。
習得の過程で「学習記録アプリ」を作成したので、その経験談を記載します！

## 今回作成したもの

学習記録アプリの内容

- inputタグを2つ配置（学習内容、学習時間を入力）
- inputタグ2つのうち1つでも未記入だった場合、登録ボタンが押せない仕様
- inputタグに学習内容と学習時間を入力して登録ボタンを押すと、学習記録のリストが追加される
- 記録された学習時間の合計時間をreduce関数で算出

元々サイト制作でちょっとしたJavascriptの記述は行なっていたことと、Udemyの講座でもTodoアプリを作成した経験があったので、こちらのwebアプリの開発は半日程度で完成できました！

開発期間としては自分ではかなり早くできたと思いますが、それでも新しく触るReact言語は難しい…
だけどそれ以上にJavascriptに比べてコードの記述量がめっちゃ少ない！！
そのおかげかミスを発見できるスピードも早い！（気がする）
**Reactめっちゃ楽しい**！となったのですが、やはりミスが出てきた時の絶望感はありましたし、「これどうやって実装するのか見当もつかない…」っていう過程もあったので、ここからはその紹介をします！

## レンダリング地獄

今回アプリの機能としてボタンをクリックしたら配列にリストを追加して、追加された後の配列をmap関数で表示っていうところがあったんですね！

Reactに全く不慣れな僕は、useStateを使用せずに配列に新しいリストを追加してしまっていました（なんのためにReactで記述しているのか…）。

具体的には既存の配列にJavascriptのpushメソッドを使用して、新しい配列を作っていました。
この新しい配列に対してmap関数を使って、学習の記録リストを更新しよう！
と思っていましたが、更新されない！！

そう、原因は**useStateで配列を更新していないからレンダリングされていません**！！

そこでレンダリングの起こるタイミングを調べました。

- **stateが更新された時**（←今回はここ）
- **propsが更新された時**
- **親コンポーネントが再レンダリングされた時**

の３パターンあるそうです！
これに気付かず2時間くらい悩んでいました…

## useStateの間違った記述

続いての壁はuseStateです。
配列をuseStateを使用して更新していこうと思っていたのに、初期値として入力していたものは文字列！！！

具体的には`const [array1 , array2] = useState(””)`といった感じです…

本来は`const [array1 , array2] = useState([])`と書かなければいけないところを、全く気にしておらず（そもそもこの書き方で動くと思っていました）ここでまた2時間近くロス…

自分なりに調査したところ、useStateの初期値として設定できる型には「**文字列**」「**数字**」「**配列**」「**関数**」があります！（足りなかったらすいません）

## アプリ開発を通して学んだこと

僕は割とHTMLやCSSはパパッと書いてしまって、一通り書き終わってから表示を確認してエラーの箇所を修正する、といった記述をしていました。
僕が慣れていないだけかもしれませんが、JavascriptやReactのミスを見つけるのって**めっちゃ時間かかる**んですよね…
なのでReactを書くときには1行づつミスの内容に、丁寧に記述しようと思いました！

あと今回はアプリ開発においての苦難の経験を書きましたが、実際にはここに達するまでにも大きな壁がありました。
それはUdemyの講座で使用する環境構築もできなかったということです。
つまりReactを開発する土俵にすら立てていませんでした…

ではこれをどうやって克服したかというと、、、
先輩エンジニアに聞きました（**決して自分で解決したわけではありません**）。

プログラミング学習においては、よくメンターをつけて学習するのが良いと言われています。
よく聞く言葉ですが、壁にぶち当たった時ほどその言葉の重要性がわかります。
自分で考えることはめっちゃ大事ですが、早く成長したいなら有識者にアドバイスをもらうのが一番ですね！

## 終わりに

今回無事に学習記録アプリの開発が終わったのですが、やっとスタート地点に立ったという感覚です。
今後もReact周りのスキルアップに励んで、Qiitaへアウトプットをしていきたいと思います！
投稿に対してアドバイスやフィードバックをいただけると、とっても勉強になります。

これからもよろしくお願いいたします！
【Vue】uncaught referenceerror: vue is not definedに遭遇

# 今まで使えていたVueのアプリが突然使えなくなった
以前勉強用にアプリ作成をしていたのだが，久々に開いてみるとタイトル以下が表示されない。
コンソール画面を開くと以下のエラーが表示された。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/29224eea-e0b6-db63-9dfe-441d55f85845.png)

Vue is not definedということなので，Vueとして認識されていないようだ。

# 調査
試しにエラー文をそのまま打ち込むと，参考になる記事を発見。

https://qiita.com/shantianchengyilang316/items/1d2dd0f91c4869fb77bf

こちらではCDNの記載位置に言及している。自分の場合Scriptタグは位置は合っていたのだが，こちらの記事が解決への糸口になった。

# scriptタグの確認
最終的にはscriptタグの内容誤りだった。まずCDN読み込みを以下のように設定していた。

```ruby:HTML
<script src="https://unpkg.com/vue@next" defer></script>
```

恐らく参照していた講座からそのまま持ってきたものである。これが原因かと思い，Vue.jsの公式ガイドを確認したところ，正しくは以下で指定する必要があった。

```ruby:HTML
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
```


https://ja.vuejs.org/guide/quick-start#using-vue-from-cdn

これにより，無事エラーもなくVueアプリが使えるようになった。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/64f81477-a490-134c-ddad-1a7a9df15a05.png)



# 終わりに
今回は単純なミスだったため時間をかけずに調べることができたが，それもVueの公式ガイドや関連するQiitaの記事のおかげである。
このようなドキュメントを読む力を今後養っていきたい。
[Flutter] 非同期の複数処理を並列実行＋エラーハンドリングで困ったこと

# はじめに
本記事では複数のAPIを非同期で並列実行したい時などに使用する`Future.wait()`についてつらつらと書いています。
並列処理を行いたい場合、またそのエラーハンドリングで困っている場合にご活用ください。
# Flutterの非同期処理について
まずそもそも非同期処理とは`ある処理が終わるのを待たずに、別の処理を実行すること`です。
そのため、『ユーザーエクスペリエンス向上』『リソース効率化』など様々なメリットがあります。
Flutterの基本的な非同期処理は以下の通り
```dart
import 'dart:async';

// 非同期関数の定義
Future<void> fetchData() async {
  // 非同期処理の実行
  try {
    // ネットワークリクエストなどの非同期処理をawaitキーワードで待機する
    var result = await http.get('https://hogehoge');

    // 非同期処理が完了した後の処理を記述する
  } catch (e) {
    // エラーハンドリング
  }
}

// メイン関数
void main() {
  // fetchData関数を非同期的に実行する
  fetchData();
}
```
# 非同期処理を並列実行とエラーハンドリング
いくつかの非同期処理を並列実行する際は`Future.wait()`を使用します
以下のコードでは`fetchData1()`　`fetchData2()`を並列で実行しその完了を待ちます。
```dart
Future<void> fetchData1() async {
  try {
    // fetchData1非同期処理
  } catch (e) {
    rethrow;
  }
}

Future<void> fetchData2() async {
  try {
    // fetchData2非同期処理
  } catch (e) {
    rethrow;
  }
}

Future<void> main() async {
  try {
    // 並列実行する非同期処理をリストに格納
    List<Future<void>> futures = [fetchData1(), fetchData2()];
    
    // Future.waitを使用して並列実行し、完了を待機
    await Future.wait(futures);
  } catch (e) {
    // ※エラーハンドリング
  }
}
```
ただし`fetchData1()`　`fetchData2()`でエラーが発生し、`rethrow`しても`main()`でハンドリングされません → ここがつまづいたポイント
.then()や.catchError()などでチェインさせる必要があります。
そのため`main()`で正しくハンドリングすることを考慮した最終的な形は次のようになります

```dart
Future<void> fetchData1() async {
  try {
    // fetchData1非同期処理
  } catch (e) {
    rethrow;
  }
}

Future<void> fetchData2() async {
  try {
    // fetchData2非同期処理
  } catch (e) {
    rethrow;
  }
}

Future<void> main() async {
  try {
    // 並列実行する非同期処理をリストに格納
    List<Future<void>> futures = [fetchData1(), fetchData2()];
    
    // Future.waitを使用して並列実行し、完了を待機
    await Future.wait(futures, eagerError: true)
        .then(() => {
            // 完了後の処理
        }, onError: (Object e) => {throw e})
        .catchError((Object e) => throw e);
    
  } catch (e) {
    // エラーハンドリング
  }
}
```
`eagerError`をtrueにすると、`futures`の中から最初のエラーが発生した場合、即座にエラーとして完了します。そのため本例のように複数の非同期処理に対して同一のエラーハンドリングを行う際などにはこちらが適しています。

こちらでエラーハンドリングも含めた非同期処理の並列実行の例は以上です！

# 参考
https://api.dart.dev/stable/2.8.1/index.html

https://api.dart.dev/stable/2.8.1/dart-async/Future/wait.html
住所項目のまとめ

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

-------------

+ [カスタム住所項目の作成](https://qiita.com/Keiji_otsubo/items/2ff1d2d4312bc6376213)
+ [住所型のカスタムフィールドを使う](https://qiita.com/Keiji_otsubo/items/926200b61bfe657d62aa)

# 既知の問題

+ [取引先の住所（請求先）にて郵便番号を入れての自動反映を行ったところ、都道府県部分だけが自動で取得ができないようになってしまいました。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000HDjUd)

:::note
ちょっと古い投稿ですが同じようなことが質問されています。
どちらもクラッシックなら機能してLightningでは機能しない点ではバグと言っています。
以下の投稿も示してサポートに確認した方がいいかもしれません。

Billing State/Province Code Is Not Carrying Forward On Lead Conversion
https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000A8bbESAR
:::

# 数式でのエラー

+ [取引先住所に半角&を入力できないように入力規則を設ける](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ajBMY)


REGEXの引数が間違っている

```
REGEX( BillingAddress , "[.*&]*" )
```

:::note
BillingAddressが複合項目なので、それぞれの詳細の項目を使う必要がありそうです。

例えば、BillingStreetなど
:::

# ちょっと不思議な仕様

+ [多くの国の値が表示される理由を教えていただけますか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000mvHE)

:::note
 州および国/地域の選択リストを有効にすると、テキスト入力の [州/​​県] および [国] 項目がインテグレーション値項目として再利用されます。レポートおよびリストビューでは、インテグレーション値項目は [州/​​県 (テキストのみ)] および [国 (テキストのみ)] と呼ばれます。さらに、[州/​​県 (テキストのみ)] および [国 (テキストのみ)] 項目ごとに、選択リスト入力の [州コード] または [国コード] 項目が作成されます。組織で設定されている州および国/地域の選択リスト値によって、これらのコード項目で使用できる値が決まります。 

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

# DE環境では地図の表示ができない

+ [取引先に地図を表示する](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifjyP)

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

:::note
+ Lightningページに、アクションとして住所を配置：地図が表示されない

+ ページレイアウトに、住所を配置：地図が表示される
:::

# 経度緯度情報

+ [Geocodes for Account Billing Address こちら有効設定にしています。 自動反映されない](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PXQoS)

:::note
私も何年か前に機能してないと思って、手動で更新した記憶があります。 

この機能ですがData.com Geo サービスを使っているみたいですが、
Data.com自体が2019年に廃止されたような気がします。以下でも2019 年 7 月 31 日までに廃止される予定となってますね。 

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

やっぱり廃止かな 
https://www.data.com/
:::
(高速?)digitalWrite(PA8, 1);のレジ直、マクロ化


(高速?)digitalWrite(PA8, 1);のレジ直、マクロ化


Arduino マクロ gpio Lチカ STM32C011


目的
ioを高速化する為にマクロ化して遊ぶ
(注意)かなり、いろいろ、はしょつている。　PAポートしか動かない
ピンの初期化のレジ直化は、めんどいのでしない。





結果


![o_cop932.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c19bd925-6a8b-a32b-ba96-6fa11184e7f1.jpeg)




プログラム


```c++



//これは、GPIOレジスターを直接操作する方法
//GPIO_IO_PA8_REG_C011_1


//定義 PA8の時は、引数は、8にしてください。
#define DW(aa,bb) GPIOA->ODR=((bb==0)?GPIOA->ODR&~(1<<aa):GPIOA->ODR|(1<<aa))
#define DW_ON(aa) GPIOA->ODR|=(1<<aa)
#define DW_OFF(aa) GPIOA->ODR&=~(1<<aa)

//初期化
void setup() {

  //ピンの初期化 PA8
  pinMode(PA8, OUTPUT);

} //setup


//メインループ
void loop() {

  //8をオン
  DW(8,1);
  //digitalWrite(PA8, HIGH);

  delay(1000); //1秒待つ

  //8をオフ
  DW(8,0);
  //digitalWrite(PA8, LOW);

  delay(1000); //1秒待つ

} //loop




```
windowsでiverilog その144

# 概要　
windowsでiverilogやってみた。
cpu(kemu)見つけたので、アセンブラ、シミュレーター書いてみた。


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9a6fbef9-0faf-ac8b-acdb-7a30783006ec.png)


# 投入したアセンブラ
「hello」を出力。

```
  LD      ACC, 104
  OUT
  LD      ACC, 101
  OUT
  LD      ACC, 108
  OUT
  LD      ACC, 108
  OUT
  LD      ACC, 111
  OUT
  nop
  HLT
  END
```

# 生成されたバイナリー

```
62 68 10 62 65 10 62 6c 10 62 6c 10 62 6f 10 00 0f
```

# ステップ実行結果

```

pc acc flag out phase
01  00  00  00  01  
01  00  00  00  02  
02  00  00  00  03  
02  68  00  00  00  
pc acc flag out phase
03  68  00  00  01  
03  68  00  00  02  
03  68  00  68  03  
03  68  00  68  00  
pc acc flag out phase
04  68  00  68  01  
04  68  00  68  02  
05  68  00  68  03  
05  65  00  68  00  
pc acc flag out phase
06  65  00  68  01  
06  65  00  68  02  
06  65  00  65  03  
06  65  00  65  00  
pc acc flag out phase
07  65  00  65  01  
07  65  00  65  02  
08  65  00  65  03  
08  6c  00  65  00  
pc acc flag out phase
09  6c  00  65  01  
09  6c  00  65  02  
09  6c  00  6c  03  
09  6c  00  6c  00  
pc acc flag out phase
0a  6c  00  6c  01  
0a  6c  00  6c  02  
0b  6c  00  6c  03  
0b  6c  00  6c  00  
pc acc flag out phase
0c  6c  00  6c  01  
0c  6c  00  6c  02  
0c  6c  00  6c  03  
0c  6c  00  6c  00  
pc acc flag out phase
0d  6c  00  6c  01  
0d  6c  00  6c  02  
0e  6c  00  6c  03  
0e  6f  00  6c  00  
pc acc flag out phase
0f  6f  00  6c  01  
0f  6f  00  6c  02  
0f  6f  00  6f  03  
0f  6f  00  6f  00  
pc acc flag out phase
10  6f  00  6f  01  
10  6f  00  6f  02  
10  6f  00  6f  00  
pc acc flag out phase
11  6f  00  6f  01  
11  6f  00  6f  02  
11  6f  00  6f  00  
pc acc flag out phase
11  6f  00  6f  00  
```

# 成果物

https://embed.plnkr.co/plunk/dsJZIP5q0ABa7Hl3


以上。