OmniAICreator/Qiita-1.07M huggingface dataset:
【UiPath】よみがなを取得する

# はじめに

この投稿は、RPAツール「UiPath」での 実装例 について記事です。


# 漢字のよみがなを取得

以下のように漢字の読み仮名を取得してみます。

```
令和 -> レイワ
平成 -> ヘイセイ
```

Excelには、漢字のよみがなを取得する「GetPhonetic」メソッドがあります。（phonetic 【形】 〔人の発話の〕音声の、音声に関する、表音つづり字）

https://docs.microsoft.com/ja-jp/office/vba/api/excel.application.getphonetic


.NETのコードで「Excel.Application」を操作し、読みがなを取得してみます。

以下のコードをInvokeCode（コード呼び出し）に記述すると変換されます。

``` VB
' # Argument
' - in_text
' - out_text
Dim ap As New Microsoft.Office.Interop.Excel.Application
Try
	out_text = ap.GetPhonetic(in_text)
	'// カナ->かな変換（1041：日本語）
	' out_text = Microsoft.VisualBasic.Strings.StrConv(out_text, microsoft.VisualBasic.VbStrConv.Hiragana, 1041)
	Console.writeLine(out_text)
Catch ex As Exception
	If Not(ap Is Nothing) Then ap = Nothing
	Console.writeLine(ex.ToString)
	Throw(ex)
Finally
	If Not(ap Is Nothing) Then ap = Nothing
End Try
```


# 英単語のカタカナ読みを取得

今度は英単語をカタカナ読みにしてみます。例えば以下のような変換です。

```
YOUNG -> ヤング
YOU'VE ->  ユーブ
YOU'RE ->  ユーアー
```

この「英語カタカナ読み変換」は上述のようなアプリケーションで解決する方法がないので、辞書ファイルを用いて変換します。

今回は以下の辞書ファイルを使用しました。
　[Bilingual Emacspeak Project(BEP) GPLライセンス](https://fastapi.metacpan.org/source/MASH/Lingua-JA-Yomi-0.01/lib/Lingua/JA)



``` VB
' # Argument
' - in_text
' - in_filepath_dictionary '// 辞書ファイルのパス
' - out_text
Try
	'// 辞書ファイルの読み込み
	Dim dic As New Dictionary(Of String, String)
	Using sr As StreamReader = New StreamReader(in_filepath_dictionary, System.Text.Encoding.GetEncoding("UTF-8"))
		Dim line As String = sr.ReadLine()
		Dim aryLine As String()
		Do Until line Is Nothing
			If Not(line.StartsWith("#")) Then
				aryLine = Strings.Split(line, " "c)
       			dic.Item(aryLine(0).ToUpper) = aryLine(1)
			End If
        	line = sr.ReadLine()
      	Loop
	End Using	

	'// 変換対象テキストを「スペース」区切りでループ
	Dim lstText As New List(Of String)
	For Each tx As String In  Strings.Split(in_text, " "c)
		'// 辞書から読みを取得
		If dic.ContainsKey(tx.ToUpper) Then
			lstText.Add(dic(tx.ToUpper))
		Else
			'// 最後の文字が「S」なら「S無し」で検索
			Dim lastw As String = tx.Substring(tx.Length-1, 1).ToUpper
			If lastw = "S" AndAlso dic.ContainsKey(tx.Substring(0, tx.Length-1).ToUpper) Then
				lstText.Add(dic(tx.Substring(0, tx.Length-1).ToUpper) & "ス")
			End If
		End If
	Next
	out_text = Strings.Join(lstText.ToArray, " "c)
	Console.writeLine(out_text)
Catch ex As Exception
	Console.writeLine(ex.ToString)
	Throw(ex)
End Try
```


# 終わりに

いかがでしたでしょうか。実装時に役立てば幸いです。
この記事が参考になったら、 LGTMをお願いします。閲覧ありがとうございました。
ncコマンドを用いてポートスキャンニング(疎通確認)を行う

ncのmanページの引用です。ncコマンド便利ですね。

## コマンド

ホスト`host.example.com`の20~30番ポートの内、どのポートがどんな用途で開いているか確認する。

```sh
$ nc -z host.example.com 20-30
```

```sh:output
Connection to host.example.com 22 port [tcp/ssh] succeeded!
Connection to host.example.com 25 port [tcp/smtp] succeeded!
```

## ref
https://linux.die.net/man/1/nc
コンピュータ特有の演算誤差

### この記事の執筆者
プログラミング学習を始めて、5ヶ月ほど。Vue.js Typescript Railsを学習中の大学生.

### きっかけ
Typescriptの参考書を学習中に下記のようなコードを書いたら予期しない結果になったため調べてみることにした。参考書には誤差が出る理由等は詳しく書かれていなかった。

```js
let price = 12500
let tax = 1.1
let withTax = price * tax

console.log("金額" + price )
console.log(`税込価格は、${withTax}`)
```

結果

```
金額12500
税込価格は、13750.000000000002
```

上記のコードは定価である12,500円に対して税率である0.1を加えたものである。
期待していた結果としては下記のようなもの

12,500 * 1.1 = 13,750
****

###  コンピューター特有の演算誤差

このような予期しない演算結果が出るのは、どうやら調べてみるとJavascriptだけではないようだ。
##### コンピュータの内部では2進数で計算されているため！
らしいのだが2進数について完全に忘れていたため(おそらく高校で少しだけやった...)まずは2進数について調べてみた。

### ２進数

そもそも2進数とは 0と1で表された値

|  10進数  |  2進数 |
| ---- | ---- |
|  0  |  0  |
|  1  |  1  |
|  3  | 11  |
|  4  | 100  |
|  5  | 101  |
|  6  | 110  |
|  7  | 111  |
| 0.1 | 0000 0000 . 00001 1001 1001 1001 1001...|

https://www.pc-master.jp/words/2sinsu.html


http://www.it-license.com/cardinal_number/DecimalToBinary.html


どうやら 0.1は２進数で表すと0000 0000 . 0001 1001 1001 1001 1001 1001　.....以下無限に続くよう(循環小数）

このように小数の一部では2進数で表すと循環小数になってしまう。よってそれを扱った演算では計算が意図しないものになることがわかった。


### 解決方法

```js
let price = 12500
let tax = 1.1 * 10
let withTax = (price * tax) / 10

console.log("金額" + price )
console.log(`税込価格は、${withTax}`)
```

結果

```
金額12500
税込価格は、13750
```

上記のコードでは小数を10倍して整数に直す（2進数では整数の形だと循環小数にならないため）
そして、計算した結果を10で割ることによって結果を出している。
他のやり方もあるそうなのでできなかった方は以下を参考にしてください。

https://qiita.com/k_moto/items/0b576a3351b77fb0aa98

###　まとめ
万能に見えていたコンピュータでも1と０しか把握できないことで意図しない計算結果を生む可能性があることがわかった。複雑な計算になればなるほどこのような箇所は見落としがちなので十分に注意したい。
TypeScriptでHTMLElementのstyleプロパティの型を指定する方法

## 結論
DOMのstyleを動的に変えたい時に

```typescript
 let someElementStyle:Partial<CSSStyleDeclaration>;
```
と指定することで、エディタによる補完や型チェックの恩恵を得ることができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659469/019a8ec8-df20-fa58-3468-0e4466b090ef.png)
Python3: cos類似度を計算 (ginza)

こちらと同じことを ginza で行いました。
[Python3: cos類似度を計算 (janome)](https://qiita.com/ekzemplaro/items/f43ab16e9e4a5ba84d44)
[Python3: cos類似度を計算 (Mecab)](https://qiita.com/ekzemplaro/items/33b4067086739b109ed9)

次のページを参考にしました。
[何もない所から一瞬で、自然言語処理と係り受け解析をライブコーディングする手品を、LTでやってみた話](https://qiita.com/youwht/items/b047225a6fc356fd56ee)

ライブラリーのインストール

```bash
pip3 install tqdm
```

```py:ginza_check.py
#! /usr/bin/python
#
#	ginza_check.py
#					Nov/27/2021
# ------------------------------------------------------------------
import sys
import spacy
nlp = spacy.load('ja_ginza')

# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")

sentence_list = [
        '昔ある所に、王様がいました。',  # 文章A
        'ある所に、かわいい女の子がいました。',  # 文章B
        '一人の王様がいました。',  # 文章C
        '昔ある所に、貧しい女がいました。',  # 文章D
        '昔、王様がある所にいました。',  # 文章E
        ] 

doc0 = nlp(sentence_list[0])
doc1 = nlp(sentence_list[1])
doc2 = nlp(sentence_list[2])
doc3 = nlp(sentence_list[3])
doc4 = nlp(sentence_list[4])

print(doc0.similarity(doc1))
print(doc0.similarity(doc2))
print(doc0.similarity(doc3))
print(doc0.similarity(doc4))

sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行結果

```text
$ ./ginza_check.py 
*** 開始 ***
0.9474321582971902
0.9597373335339604
0.9445045437998065
1.0000000473810928
*** 終了 ***
```
Python3: cos類似度を計算 (Mecab)

こちらと同じことを Mecab で行いました。
[Python3: cos類似度を計算 (janome)](https://qiita.com/ekzemplaro/items/f43ab16e9e4a5ba84d44)

次のページを参考にしました。
[PythonのMeCabで形態素解析！Tf-idfとCos類似度で文書の類似度を算出してみよう！](https://toukei-lab.com/python-mecab)

```py:mecab_check.py
#! /usr/bin/python
#
#	mecab_check.py
#					Nov/27/2021
# ------------------------------------------------------------------
import sys
import MeCab
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer

# ------------------------------------------------------------------
def mplg(article):
	word_list = ""
	m=MeCab.Tagger()
	m1=m.parse(text)
	for row in m1.split("\n"):
		word =row.split("\t")[0]
		if word == "EOS":
			break
		else:
			word_list = word_list +" "+ word
	return word_list

# ------------------------------------------------------------------
def tfidf(word_list):
	docs = np.array(word_list)#Numpyの配列に変換する
	#単語を配列ベクトル化して、TF-IDFを計算する
	vecs = TfidfVectorizer(
				token_pattern=u'(?u)\\b\\w+\\b'#文字列長が 1 の単語を処理対象に含めることを意味します。
				).fit_transform(docs)
	vecs = vecs.toarray()
	return vecs


# ------------------------------------------------------------------
def cossim(v1,v2):
	return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
sentence_list = [
		'昔ある所に、王様がいました。',  # 文章A
		'ある所に、かわいい女の子がいました。',  # 文章B
		'一人の王様がいました。',  # 文章C
		'昔ある所に、貧しい女がいました。',  # 文章D
		'昔、王様がある所にいました。',  # 文章E
		]	
word_list = []
for text in sentence_list:
	word_list.append(mplg(text))
	
vecs=tfidf(word_list)
print(cossim(vecs[0],vecs[1]))
print(cossim(vecs[0],vecs[2]))
print(cossim(vecs[0],vecs[3]))
print(cossim(vecs[0],vecs[4]))

sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行結果

```text
$ ./mecab_check.py 
*** 開始 ***
0.5274797167376858
0.47111722018067215
0.6698436999383569
1.0
*** 終了 ***
```
AWS Code シリーズ要旨

CI/CD
====
アプリケーションの開発フェーズにおける自動化を行い、開発チーム、運用チームに生じる問題を解消するためのソリューションです。
AWSのCodeシリーズは、この CI/CD を果たすための役割としてサービスを提供しています。

Code Commit (継続的インテグレーション)
==========
- Code Commit はAWS上にプライベートな Git リポジトリをホストし、複数の開発者が共同で効率的に作業を行うために提供されたソース管理サービスです。
- 任意のIAMユーザーからソースコードをリポジトリに`push`し、プルリクエスト、コミットの機能を利用して、リポジトリのソースコードに対して変更管理を行う事が可能となり、AWS上でセキュリティを保全しながら共同開発が行えます。
- ブランチと呼ばれる、マスターの変更管理から派生した特定の開発工程を管理するための機能を作成する事が可能で、Masterブランチから分岐したブランチにより、開発者は不特定多数のソースコードに対して並行作業をする事が可能です。
- リポジトリのプッシュをトリガーにメールを通知させたり、ビルドの開始を `Code Pipeline` を使用せずに行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/a85b0d57-ccd2-2c00-0d23-0e87e790df91.png)


Code Build (継続的インテグレーション) 
=========
- ソースコード(S3,CodeCommit,Gitサービス)をコンパイルし、テストの実行、デプロイ可能なパッケージの生成を行うサービスです。
-  ビルド環境として生成される Docker Image、ECR リポジトリ、コンピュートリソース(Amazon Linux2、ubuntu) を選択し、`buildspec.yml` に記載された手順に沿ってビルド環境を生成していきます。
- `バッチビルド`を有効化して、同時ビルドと協調(逐次)ビルドを指定出来ます。
- ビルドしたファイルをS3にアップロードしたり、ビルド環境を Cloudwatch Logs へメトリクスおよびログを出力する事が可能です。また、通知ルールを設定して、SNSでビルド状況の通知を受けることも可能です。
- VPC内にCodeBuildを配置する事も可能で、テスト環境として DB にアクセスしたい要件を満たすためRDS等へのアクセスする事も可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/7879272d-7aff-f673-3a09-b2e809ff908b.png)


Code Deploy (継続的デプロイ)
==========
- アプリケーションのデプロイを自動化するサービスです。
- EC2インスタンス、オンプレミスインスタンス、Lambda関数、ECS Fargateのうちデプロイ先を採択し、`デプロイグループ`を作成します。デプロイ先には`デプロイエージェント`を導入します。
- デプロイ設定により、任意のデプロイ方式を設定する事が可能で、LB を使用した `Blue/Green方式`、あるいは `Inplace方式`を採択する事も可能です。
- `appspec.yml` と呼ばれる deploy をするための仕様書を用いて、記述通りのdeploy 方式を行う事が出来ます。
- アプリケーションのソースコード、リビジョンは、S3,GitHubに配置し、`appspec.yml` と共にクライアントからデプロイが開始できます。
- デプロイが失敗、あるいは任意のしきい値を超過した場合`自動ロールバック`機能が動作し、以前のアプリケーションリビジョンの状態に戻すための`手動ロールバック`機能が提供されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/c81538cc-aa9f-4709-fc7e-b1c59cbd3d36.png)


Code Pipeline (継続的デリバリー)
============
- Source Stage / Build Stage / Deploy Stage をそれぞれ定義し、定義されたサービスのオブジェクトに対してCI/CD のステップを自動化します。
- Source Stage では、開発者のインテグレーションにより発生した変更を`Cloudwatch Events` または`Webhook`にて検出します。
- 検出をトリガーに後続の Build Stage で定義されたサービスのアクションが実行されます。先述したようにビルド環境を生成し、テストを実施するサイクルを提供します。(省略可)
- ビルドが完了すると、Deploy Stage で定義したサービスに対してデプロイを自動で実施します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/7081f54e-4c01-bc43-c8fa-e1144e585578.png)


Code Artifact
=============
- 開発に利用される python,java,nodejs等のパッケージマネージャーをAWS にキャッシュしたり、プロキシとして使用する事で、ダウンロードする手間を最小限に抑えたり、アクセスに制御を掛ける事が可能です。
- Domain と呼ばれる後述のリポジトリを管理する定義を行い、ドメインの内部に複数のリポジトリを配置します。ドメインに対してJSON形式のポリシーを設けてアクセス制御を行う事が可能です。
- リポジトリは使用するパッケージを含みます。`アップストリームリポジトリ`と呼ばれる、パッケージマネージャとの外部接続の関係性、および一般リポジトリとの上下関係を持つリポジトリを定義する事が可能で、開発者は一般リポジトリとのアクセスを行う事で最新のパッケージマネージャをインターネットを介さずに入手出来ます。また、リポジトリにもポリシーが作成可能で、ここでアクセス制御を行う事が出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/2ca7aade-8b8b-5fe7-330f-4e11009ed4d2.png)


Code シリーズによるCI/CD の自動化
===============================
- 順番が前後する場合や、不要なフェーズを省略する事も可能かと思いますが、これら Code サービスを使用して CI/CD の全体の流れがAWS 上で実装出来るという便利なサービスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/fea2d132-b185-d641-47c0-162a74a5e78e.png)
Gatsby×HeadlessCMS(Contentful)でポートフォリオサイトを作った話

ポートフォリオサイト、今まであったものを作り直し、GatsbyとHeadlessCMS(Contentful)で作ってみました。

できたのがこちら！🥳
https://www.qulo.ooo/

作り直しの経緯とこれらの組み合わせについてまとめてみることにします✍️
<br><br>
##🎨ポートフォリオサイトの経緯
- 1代目 FC2ホームページ
- 2代目 html+CSS(この頃はプログラミングのプの字もわからず…<br>海外のデザインサイトを検証→ソースコードみて必要そうなパーツをつなぎ合わせてヨシとしたキメラ)

<br><br>
##🤔どうして2代目から作り直そうと思ったか？

更新性が以下の理由から悪かった…

- 表示用画像をディスプレイサイズの最適化用に複数枚用意する必要があった
- 記事を増やすときはhtmlを編集、記事ファイルがその度に増えていく
- CSS記述だったため関数が使えず全体的にちょっとカラー変えたいみたいなときに<br>該当するカラーコードをすべて書き換えなければいけない
- html CSS以外の言語でかいてみたいなとおもった

そのために更新頻度が無＆モダンな技術を試してみたいこともあり作り直すことにしました。

<br><br>
##💡Gatsbyのよいところ
<br>![211123thirdportfoliowebsite 4](//images.ctfassets.net/fdd258lzl3qd/5vwfjnW3ala4fGNt2wuA9G/8863458164cf4b1d39ab20433b78cf01/211123thirdportfoliowebsite_4.jpg)
<br>
__そもそもGatsbyとは？__<br>
Facebook社(最近Metaへの社名変更が話題になってましたね〜)が開発している<br>React製の静的サイトジェネレーター。JavaScriptライブラリ。

- スターター(テンプレート)がいっぱいある
- Netlifyというホスティングサービスを使い、それをGitHubと連携させることで、<br>masterブランチに更新内容をマージするだけでサイトを更新することができるので更新性が◎
- マークダウン式で記事をかけるので、QiitaやMediumといった別サイトへそのまま持っていくことができる

<br><br>
##💡Headless CMS(Contentful)のよいところ
<br>![211123thirdportfoliowebsite 5](//images.ctfassets.net/fdd258lzl3qd/1wKXfvFQZHPnSncASrQkVv/f73a19eb4c23e8a16b32cb86a120edb9/211123thirdportfoliowebsite_5.jpg)
Gatsbyだけでもマークダウン式で記事をかくことはできるが、記事ファイルをリポジトリ内で管理しないといけない…
＝html　CSSで記述していた2代目ポートフォリオサイトのときに問題となっていた、記事が増える度にファイル数が増えていく問題の解決になっていない！
👉Headless CMSの導入により記事管理を外部サービスにお任せすることができるように！
(サイトを多言語化したいといった場合、ファイル数が単純に倍になる問題も解決◎)

<br>
__なぜContentful？__

- Gatsbyとの組み合わせで使用されているユーザーが多くコミュニティが活発なため
- 将来的に対応したい多言語化対応にはContentfulがつよそうだったため
- マークダウン式でかけるので、MediumやQiitaなど外部サービスにそのままもっていくこともできる

<br><br>
##🙌使ってみた感想
__Gatsby × Contentful めちゃ使いやすい！__
__けど自分用にもドキュメントを残しておくべし__
<br>![211123thirdportfoliowebsite 6](//images.ctfassets.net/fdd258lzl3qd/5dVSbxB3RdAu5R0DC5zJ1r/5eb66d941e63b92606e9a1b4dca0d8ed/211123thirdportfoliowebsite_6.jpg)


__なぜドキュメントが必要？__

- HeadlessCMS使用している箇所はソースコードからも読み解きにくい。
- 例えば更新性があるところだけ使っている人もいれば、<br>About画面など更新性の低いページもすべてHeadlessCMSで管理している人もいた。
- 「あれっ、ここの文言修正したいけどソースコードにない！」ということが起こりうるので、<br>HeadlessCMSの使用範囲は記録しておく必要があるなぁと思った

React(JavaScriptライブラリ)により、html CSSだと手が届かなかった表現も可能になるGatsby。<br>
スターターセットを活用することでお手軽にはじめることができるので、
個人サイト興味あるけどなにからはじめたらいいかわからない…という方にもすごくおすすめです！

<br><br>
##💡他に検討したこと
__フレームワークについて__
FlutterWebなども検討したがSEOの観点からやめておいた

<br>
##✅スライド資料公開中
[Speaker Deck](https://speakerdeck.com/oquloo/gatsbyxheadlesscms-contentful-dedepotohuoriosaitowozuo-tutahua "SpeakerDeckのURL")にスライド資料投稿しております！
よかったら合わせてご覧ください🙇‍♀️
【図解解説】JOI2021-2022 一次予選 第1回 問題2 移動

## 図解解説シリーズ
競技プログラミングを始めたばかりでAtCoderの解説やJOIの解説ではいまいちピンと来ない…という人向けに、図解を用いて解説を行います。

## 問題文
### 情報オリンピック日本委員会に掲載されている問題

https://www.ioi-jp.org/joi/2021/2022-yo1/2022-yo1a-t2.html

### AtCoderに掲載されている問題
入出力など実際に確認して自分の作成したプログラムを採点することができます。

https://atcoder.jp/contests/joi2022yo1a/tasks/joi2022_yo1a_b

## 図解解説
今年度の一次予選のB問題は、以下の３つのスキルを確認する問題になっています。
１．入力・出力を正しく利用できる
２．算術演算子を正しく利用できる
３．条件分岐（if）を正しく利用できる

問題文を整理するために、具体的な数字を用いて、図示して考えてみます。
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2211017/f682e6a8-82a8-f22a-a18b-2626d7ca8833.png)
入力例を使って図示して考えてみます。

入力例１を図示すると、移動時間は５時間となり、４時間３０分以内に移動できません。入力例２を図示すると、移動時間は７時間となり、１０時間３０分以内に移動可能です。なお、入力例２の移動時間を使うと、７時間３０分でぎりぎり移動可能です。３０分という時間の扱いを考えなければ、図の赤字に注目して処理を記述することができそうです。

そこで、文字を使って考えると、A地点からB地点までの移動時間がX時間、B地点からC地点までの移動時間がY時間、最終的なA地点からC地点までの移動時間はX+Y時間です。このX+Y時間と、Z時間を比較して、X+Y<=Zが成立すれば移動可能となります。

![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2211017/5244d351-e7bd-aa75-44d9-e10725c78b0d.png)
条件分岐について、不安がある場合には上のスライドを参考にしてみてください。

## 解答例

```b.py
X = int(input())
Y = int(input())
Z = int(input())
#A地点からB地点までの移動時間がX時間、B地点からC地点までの移動時間がY時間です。
#最終的なA地点からC地点までの移動時間はX+Y時間です。
#このX+Y時間と、Z時間を比較して、X+Y<=Zが成立すれば移動可能となります。
if X + Y <= Z:
  print(1)
else:
  print(0)
```
[採点サイトに提出したプログラム](https://atcoder.jp/contests/joi2022yo1a/submissions/27504172)

## イラスト
スライド内で使用しているイラストはすべて「[いらすとや](https://www.irasutoya.com/)」の素材を利用しています。
いまさらJavascriptの非同期処理について

PHP8.1で非同期処理が書ける様になったので、JavaScriptの非同期処理について、スタック、キュー、イベントループなどの言葉を使わないで説明します。

```javascript
// 素数を割り算で求める計算だけをする実行に時間のかかる関数
function sleep(){
  for(let i= 2; i<100000; i++){
    for(let j = i - 1; j > 1; j--){
      if(i % j === 0){
        break;
      }
    }
  }
  console.log('おしまい');
}

// 0.1秒後, 0.2秒後に表示されるのを期待している
setTimeout(()=>{console.log('setTimeout!200')}, 200);
setTimeout(()=>{console.log('setTimeout!100')}, 100);

sleep();
```

上記コード実行するとマシンのパワーにもよりますが**５秒くらいたってから**

```
setTimeout!100
setTimeout!200
```

と表示されます。0.1秒後と0.2秒後に表示したかったのに･･･。

登場人物は「ブラウザ」、「JSを実行する場所」、「順番待ち列」

setTimeoutはブラウザの役割です。これがポイントです。
JSの関数の実行順序は以下の通り。

1. JavaScriptのコードは書かれている順に順次「JSを実行する場所」で実行されていく。
2. 順次実行するコードにsetTimeoutがあったら、setTimeoutの中の関数を実行しないで「ブラウザ」に渡す。
3. ブラウザは指定された時間になったら「順番待ち列」に受け取った関数を入れる。
4. 「JSを実行する場所」は引き続きコードを実行していっている。実行するコードがなくなったら、関数は「順番待ち列」から「JSを実行する場所」へ入ることができる。
5. 「JSを実行する場所」で関数が実行される。

上の方で書いたプログラムだと、ブラウザはsetTimeoutで渡された関数を100ms, 200ms後に「順番待ち列」に入れたんだけど、その関数たちは`sleep();`が終わるまでを「JSを実行する場所」に入れなかったという事です。

setTimeoutはブラウザの役割と書きましたが、例えば、ボタンをクリックしたときに関数を「順番待ち列」に入れるのもブラウザの役割です。
dxlibでjoyconを使う　その１

　去年に続いて今年もアドベントカレンダーに投稿させてもらいます。
　つい最近switchを買ったので、joyconをPCに繋げて使ってみたいと思います。
# joyconとは
　任天堂が発売しているゲーム機のswitchに付属しているコントローラー。コントローラー自体はbluetoothでPCとつないで使うことができます。joyconは二つで1セットだが、それぞれ別の二つのコントローラーとして認識されます。

# 前提条件
　joyconを使うには、あらかじめPCとペアリングという作業をする必要があります。ネットで調べれば接続方法はたくさん出てきます。

# 接続テスト＆検証
　dxlibにはちょうどjoypadに接続、使用するための関数が存在するので接続テストもかねてdxlibにあるどの定数がどのボタンに対応しているのか検証します。ジョイスティックはまた別のプログラムで検証します。
　検証には以下のプログラムを用いました。

```c++
#include "Dxlib.h"

int WINAPI WinMain(HINSTANCE h1,HINSTANCE hp,LPSTR lpC,int nC) {
	ChangeWindowMode(true);

	if (DxLib_Init() == -1) return -1;
	printfDx("%d",GetJoypadNum());
	while (ProcessMessage() != -1) {
		int padinput = GetJoypadInputState(DX_INPUT_PAD1);
		int padinput2 = GetJoypadInputState(DX_INPUT_PAD2);
		int n = 0x10;
		clsDx();
		for (int i = 0; i < 28; i++) {
			printfDx("id:%d state1:%d	state2:%d\n",i,padinput&n,padinput2&n);
			n *= 2;
		}
	}
	DxLib_End();
	return 0;
}
```
検証結果は以下の通りです。上下左右は縦持ちの時です。

|定数|対応するボタン|
|:-----------|:-----------|
|PAD_INPUT_1|A or 左ボタン|
|PAD_INPUT_2|X or 下ボタン|
|PAD_INPUT_3|B or 上ボタン|
|PAD_INPUT_4|Y or 右ボタン|
|PAD_INPUT_5|SL|
|PAD_INPUT_6|SR|
|PAD_INPUT_9|-|
|PAD_INPUT_10|+|
|PAD_INPUT_11|ジョイスティック押し込み左|
|PAD_INPUT_12|ジョイスティック押し込み右|
|PAD_INPUT_13|HOME|
|PAD_INPUT_14|キャプチャーボタン|
|PAD_INPUT_15|R|
|PAD_INPUT_16|ZR|
以上の検証結果を参考にすればjoyconをdxlibで使うことは可能です。
次にジョイスティックを検証します。
検証には以下のプログラムを使いました。

```c++
#include "Dxlib.h"

int WINAPI WinMain(HINSTANCE h1,HINSTANCE hp,LPSTR lpC,int nC) {
	ChangeWindowMode(true);

	if (DxLib_Init() == -1) return -1;
	printfDx("%d",GetJoypadNum());
	while (ProcessMessage() != -1) {
		int x=0, y=0;
		clsDx();
		GetJoypadAnalogInput(&x, &y, DX_INPUT_PAD1);
		printfDx("x:%d y:%d\n",x,y);
		GetJoypadAnalogInput(&x, &y, DX_INPUT_PAD2);
		printfDx("x:%d y:%d\n", x, y);
	}
	DxLib_End();
	return 0;
}
```
が、ここで問題が発生しました。なんとジョイスティックいくらいじっても数字が変わりません。原因を探るために追加で検証を行います。
GetJoypadDirectInputStateという関数のサンプルをそのまま使います。
 結果としてはPOVというところの0番に反応がありました。LとR同じです。そういえばこの後書く予定の記事のための情報収集の時にjoyconのジョイススティックは8方向取得できるってあったような。POVはハットスイッチ用のメンバみたいですが…え？ハットスイッチなの？ついでに押し込み時の取得方法がわかったので上記の表に書いておきました。少し話が脱線しますけどここまでくるとなぜか空いている7と8が何なのか気になります。知ってたら教えてください。

# まとめ
　これでjoyconのボタン、ジョイスティックの動作が取得できます。次はjoyconといえば両手持ち。両手持ちを使うためのラッパークラスを作りたいと思います。

# 追加検証
　ふとjoyconのジョイスティックがハットスイッチであることから追加で検証しました。結果として以下のようになりました。

|定数|対応するジョイスティックの方向（横持ち）|
|:-----------|:-----------|
|PAD_INPUT_UP|上|
|PAD_INPUT_DOWN|下|
|PAD_INPUT_RIGHT|右|
|PAD_INPUT_LEFT|左|
なお、斜めの時には対応する二つの定数を両方調べればいいようです。
ついでに検証してなかったので試したところ、振動機能が搭載されているのに振動させることはできませんでした。
A.複数の関数プロットを一枚の図にしたい

[出題編](https://qiita.com/advent-calendar/2021/r_tips_attack25_q)3日目の解答編です。

あくまでも@kosugittiはこうした，というだけで唯一の正解でもなければ最適なコードとは言えないかもですが。

```R:
myModel <- function(x, b0, b1) {
  b0 + b1 * x
}

plot.list <- list()
for (g in 1:NROW(dat_lm)) {
  plot.list[[g]] <- dat_lm[g, ] %>%
    unnest(data) %>%
    ggplot(aes(x = Sepal.Width, y = Petal.Length)) +
    geom_point(color = g) +
    stat_function(fun = myModel, args = list(b0 = dat_lm[g, ]$b0, b1 = dat_lm[g, ]$b1), color = g) +
    ggtitle(dat_lm[g, ]$Species)
}

g <- do.call(gridExtra::grid.arrange, plot.list)
plot(g)
```

まず自作関数を作りました。今回はただの直線ですが，ここは必要に応じて変更していただければと思います

で，図のggplotオブジェクトを格納するリストを作って，`for`文で毎行のデータから図を作る，という作業をしています。

最後にgridExtra::grid.arrangeを全部のリストに適用してプロット。これでできました。

このやり方だと，ggplot関数が自由にいじれるので結構便利かなと思っています。
for文を使うあたりが美しくない。purrr::mapとかのほうがいいのかも。でもこっちの方が私には直感的に分かりやすかったんですよねー。



こんな感じで，自分のTips,こんなバグをこうやって解決したよ，というような話を，よろしければ皆さんもお寄せください。
[出題編はこちらです。](https://qiita.com/advent-calendar/2021/r_tips_attack25_q)
あるいは「こちらの解法のほうが美しいぞ」というのがありましたら，コメントいただけると幸いです。
Q.複数の関数プロットを一枚の図にしたい

# 問題の背景

状況の説明がちょっと難しいんですが。
たとえば階層線形モデルをつくっていて，群ごとに線形モデルを当てはめたとします。
数値的な結果を見て，固定効果はこれぐらいねアハーン，と思うことはできるんですが，やっぱり群ごとに当てはめて見てみたいですよね。
できれば確信区間つきで。

ggplotのgeom_smoothで書いてもいいんですが，自分で推定した値を使いたいということもあると思いますし，線形モデルじゃない独自関数の場合もあるかも。
そんなときの問題です。

# 具体例

次のコードを実行すると，irisのSpeciesごとの線形回帰ができます。

```R:
dat_lm <- iris %>% 
  group_by(Species) %>% 
  nest() %>% 
  mutate(model_lm = map(data, ~lm(Petal.Length ~ Sepal.Width, data = .))) %>% 
  mutate(coeff = map(model_lm,tidy)) %>% 
  unnest(coeff) %>% 
  select(Species,data,term,estimate) %>% 
  pivot_wider(id_cols=c(Species,data),names_from=term,values_from=estimate) %>% 
  rename(b0=3,b1=4)
```

仕上がりはこんな感じ。

```
# A tibble: 3 × 4
# Groups:   Species [3]
  Species    data                 b0     b1
  <fct>      <list>            <dbl>  <dbl>
1 setosa     <tibble [50 × 4]>  1.18 0.0814
2 versicolor <tibble [50 × 4]>  1.93 0.839 
3 virginica  <tibble [50 × 4]>  3.51 0.686 
```

ここから，次のような図が描きたいわけです。
もちろんggplotで。

![Rplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53345/b63bb912-7be9-ccc7-904e-61e7685a56ab.png)

たとえば次のような，`geom_smooth`とか`facet_wrap`はナシです。
というのも，関数が独自なものでmethodが使えないかもしれないし，今回の推定値を使いたいから。サンプルデータでは切片(b0)と傾き(b1)しかないですが，たとえばこれに95％CIの推定値などがついてて，それを含めて図にしたいとか，色々あるかもしれないから。

```R:
ggplot(iris, aes(x = Sepal.Width, y = Petal.Length, group = Species)) +
  geom_point() +
  facet_wrap(~Species) +
  geom_smooth(method = "lm", se = F)
```


いかがでしょう。
[解答編はこちら。](https://qiita.com/advent-calendar/2021/r_tips_attack25_ans)

ヒントです。私の解法では，gridExtraパッケージを使いました。
reCAPTCHAをシステム導入するときに見るイメージ図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/5f6657ab-ba98-1358-cd8c-24042fddc269.png)

1. FrontendからreCAPTCHAで判定した結果をGoogleに送信
1. Googleから判定結果を照会するためのreCAPTCHAトークンが発行される
1. 発行されたreCAPTCHAトークンをBackendに送信
1. BackendでGoogleにreCAPTCHAトークンを送信し結果を照会
1. Googleから取得した判定結果を利用して、reCAPTCHAのエラー処理または処理を続行する

## reCAPTCHA認証とは

> [wikipedia](https://ja.wikipedia.org/wiki/ReCAPTCHA)
> reCAPTCHA（リキャプチャ）とは、ウェブサイトの制限エリアへのアクセスを試みるボットからサイトを防御するためCAPTCHAを利用するのと同時に、そのCAPTCHAに対する返答を紙の本のデジタル化に活かすシステムである。

ボットと呼ばれるアクセスを検知して防御する仕組みです。

#### ボットによる不正利用の例

- ログインを行う画面で、ユーザーID、パスワードをランダムに入力してログインできるか試すのを、自動的に大量に行う
- 口コミなどの評価を故意に上げ下げする為など、存在しない評価コメントを自動的に投稿する
- SNSで、悪用目的に作成したアカウントで友達申請を、自動的に行う


## システム導入するときにやること

1. [reCAPTCHA](https://www.google.com/recaptcha/about/)の利用登録
1. FrontendにreCAPTCHAが提供するスクリプト、判定処理、ボタンを埋め込む
    - reCAPTCHA v3 -> https://developers.google.com/recaptcha/docs/v3
    - reCAPTCHA v2 -> https://developers.google.com/recaptcha/docs/display
    - reCAPTCHA v2 -> https://developers.google.com/recaptcha/docs/invisible
1. BackendにreCAPTCHAトークン判定処理（WebAPI呼び出し、結果判定）を追加
    - https://developers.google.com/recaptcha/docs/verify

## reCAPTCHAの種類

- reCAPTCHA v3
  - サイト利用者に、reCAPTCHAの判定（文字入力やタイル選択）を求めません
  - カーソル移動などのサイト操作情報をGoogleに送信しボット判定を行います
- reCAPTCHA v2
  - チェックボックスタイプ
      - サイト利用者に、「ロボットではありません」のチェックボックスの操作と、ボットの疑いがあると判断した場合に、タイル選択を求めます
      - Googleに送信する情報は、タイル選択結果などの限られた情報です
  - バッチタイプ
      - サイト利用者に、ボットの疑いがあると判断した場合に、タイル選択を求めます
      - Googleに送信する情報は、タイル選択結果などの限られた情報です
【図解解説】JOI2021-2022 一次予選 第1回 問題1 余り

## 図解解説シリーズ
競技プログラミングを始めたばかりでAtCoderの解説やJOIの解説ではいまいちピンと来ない…という人向けに、図解を用いて解説を行います。

## 問題文
### 情報オリンピック日本委員会に掲載されている問題

https://www.ioi-jp.org/joi/2021/2022-yo1/2022-yo1a-t1.html

### AtCoderに掲載されている問題
入出力など実際に確認して自分の作成したプログラムを採点することができます。

https://atcoder.jp/contests/joi2022yo1a/tasks/joi2022_yo1a_a

## 図解解説
今年度の一次予選のA問題は、以下の２つのスキルを確認する問題になっています。
１．入力・出力を正しく利用できる
２．算術演算子を正しく利用できる

![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2211017/0cd89743-ac2b-4f3e-4a4c-c13f187eb991.png)
割り算の余りをどの演算記号で表現すればよいか考える問題です。それぞれの演算記号とその使い方について、しっかりと確認しておくことが大切です。特に、割り算の商と余りについては、頻出ですので必ず確認しておいてください。

## 解答例

```a.py
X = int(input())
print(X%21)
```
[採点サイトに提出したプログラム](https://atcoder.jp/contests/joi2022yo1a/submissions/26024469)

## イラスト
スライド内で使用しているイラストはすべて「[いらすとや](https://www.irasutoya.com/)」の素材を利用しています。
Python3: cos類似度を計算 (janome)

次のページを参考にしました。
[Pythonで「Bag Of Words」を使い文章の類似度を調べる【自然言語処理】](https://yu-nix.com/blog/2020/12/14/python-bow/)

ライブラリーのインストール

```bash
pip install janome
```

```py:janome_check.py
#! /usr/bin/python
#
#	janome_check.py
#					Nov/27/2021
# ------------------------------------------------------------------
from janome.tokenizer import Tokenizer
import numpy as np
import sys

# ------------------------------------------------------------------
def gen_toks_list(sentence_list):
	"""
	文章のリストをJanomeのトークン列のリストに変換する
	"""
	t = Tokenizer()
	return [list(t.tokenize(s)) for s in sentence_list]

# ------------------------------------------------------------------
def gen_word_to_index(toks_list):
	"""
	トークンの表層形から添え字を得られるようにマップを作成する
	"""
	word_to_index = {}

	for toks in toks_list:
		for tok in toks:
			# もしトークンがマップに含まれていなければインデックスを追加する
			if tok.surface not in word_to_index.keys():
				new_index = len(word_to_index)  # 新しいインデックスを作成
				word_to_index[tok.surface] = new_index  # マーク

	return word_to_index

# ------------------------------------------------------------------
def gen_corpus(toks_list, word_to_index):
	"""
	行列の作成
	"""
	# len(toks_list) x len(word_to_index) の成分0の行列を作成
	corpus = np.zeros((len(toks_list), len(word_to_index)))

	# 行列を処理する
	for i, toks in enumerate(toks_list):
		# 行を処理する
		for tok in toks:
			# 行の持っているトークンの列に対してマーキング
			corpus[i, word_to_index[tok.surface]] += 1

	return corpus

# ------------------------------------------------------------------
def gen_bag_of_words(toks_list):
	"""
	Bag of Wordsを使って行列を作成
	"""
	word_to_index = gen_word_to_index(toks_list)
	corpus = gen_corpus(toks_list, word_to_index)
	return corpus

# ------------------------------------------------------------------
def cos_sim(x, y):
	"""
	類似度の計算
	cos類似度という方法を用いる
	"""
	return np.dot(x, y) / (np.sqrt(np.sum(x ** 2)) * np.sqrt(np.sum(y ** 2)))

# ------------------------------------------------------------------
def show_per(corpus):
	for it, vv in enumerate(['B', 'C', 'D', 'E']):
		it += 1
		per = cos_sim(corpus[0], corpus[it])
		print(f'A vs {vv}: {per:.2}')

# ------------------------------------------------------------------
def proc01(sentence_list):

	# トークン列のリストの作成
	toks_list = gen_toks_list(sentence_list)

	# Bag of Wordsの作成
	corpus = gen_bag_of_words(toks_list)

	# 結果を出力
	show_per(corpus)


# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")

sentence_list = [
		'昔ある所に、王様がいました。',  # 文章A
		'ある所に、かわいい女の子がいました。',  # 文章B
		'一人の王様がいました。',  # 文章C
		'昔ある所に、貧しい女がいました。',  # 文章D
		'昔、王様がある所にいました。',  # 文章E
	]

proc01(sentence_list)

sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行結果

```text
$ ./janome_check.py 
*** 開始 ***
A vs B: 0.82
A vs C: 0.6
A vs D: 0.87
A vs E: 1.0
*** 終了 ***
```
T-DASHのOPENβ申込からテストツールの起動まで実施したら、とてもハードルが低かった

バルテスさんが提供している[T-DASH](https://www.t-dash.io/)という「ソフトウェアテスト自動化ツール」のOpenβ版の申込が開始されたようです。バルテスさんといえば、ソフトウェアテスト！第三者品質評価！と名前は聞いたことはあるものの、提供されているサービスを利用するのは初めてです。この記事ではT-DASHのOPENβ版を申込するところから、サービスを利用開始するまでの手順を逐一おっていこうと思います。

## 記事の補足

### 本記事で利用したシステムのバージョン情報
- T-DASH：0.1.004b
- PC：Windows 10 Home 20H2
- ブラウザ：Chrome 96

### アドベントカレンダー2021
この記事はQiita Advent Calendar 2021の[T-DASHを使ってみた！【PR】T-DASH](https://qiita.com/advent-calendar/2021/tdash)の1日目の記事です。

## ところでT-DASHとはなに？
T-DASHについて事前にホームページで調べてみました。特徴を箇条書きで書くと次の通りです。

- Webアプリケーションのテスト自動化ツール
- 日本語でテストケース、シナリオを作成できる
- ローコード系のツール
- 現在OPENβ版で、機能制限なく利用できる様子

## さっそくOPENβ版に申込してみる
早速申し込みをしてみます。

### 1. HPより「OPENβ版お申し込み」をクリック

ホームページはこちら→ https://www.t-dash.io/
画面右上の「OPENβ版お申し込み」ボタンよりスタートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/0bfda509-ef8a-28c4-e4f2-81568e04a23f.png)

お申し込み用のフォームに遷移しますので、項目に合わせて必要な情報を入力をし登録をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/34cbc759-1129-6fd9-e7af-4cdec5cb8980.png)

### 2. QUINTEEアカウントの登録を行う

申し込みが完了するとQUINTEEというナレッジサイト（これもバルテスさんの運営）のアカウントが発行されるようです。2通のメールが届きますので、「【Quintee管理】アカウント登録確認」というタイトルのメールに記載のURLよりアカウント登録を完了させます。

### 3. インストーラーの入手
登録したアカウント情報を利用してQUITEEにログインをします。
→https://mypage.quintee.io/#/login
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/a83f3a25-a001-18d0-35fd-d7c097dbcc91.png" width=60%>

ログインしたトップページにアプリのダウンロードリンクがあります。ここからテストツールをダウンロード。サイズは140MBほど。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/86dc6228-dc17-6f34-8157-1b3ec3784fb9.png)

### 4. ライセンスキーの取得
この後のインストール時にライセンスキーが必要となります。同じ画面の「ライセンス管理」からライセンスキーを手に入れておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/6db93461-24d8-54a3-7161-5e05dd93c651.png)

### 5. インストールする
3でダウンロードしたZipファイルを解凍します。中身はセットアップツール（exe）と、マニュアル（PDF）です。tdash-setup.exeをダブルクリックしてインストールをスタート。インストール画面は指示通りに前進できます、まったく迷わず困らずで、インストールが楽です。10秒ほどでインストール完了。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/552e8329-dba8-f1e0-0f56-ba7947851397.png" width=60%>

インストールを完了すると、ライセンス認証画面が開きます。さきほど入手したライセンスキーを入力し、認証も完了です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/7d771f96-22c9-1f30-6dda-d649419156f1.png" width=60%>

### 6. 無事に起動！
ローカルWebアプリケーション形式で起動するらしく、ライセンスキー入力後にブラウザが起動しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34410/faecfcab-b1f5-bb97-f092-3bc6f9c4847c.png)

## 最後に
T-DASHは「導入がカンタン」とありましたが、確かに特に悩みもせず問題なくセットアップすることができました！テストツールってよく、レジストリをいじったり、メモリの利用量を調整したりとセットアップが面倒なものもあるので、これは楽で良いですね。次のポストでは、サンプルアプリケーションを使って、実際にテストを書いて動かしてみたいと思います。
A.フォルダ内の全てのファイルを読み込む

これが必要になった実際のケースは，次のようなものでした。

+ Web調査で複数の調査票を用意し，調査後にそれぞれダウンロードしたから，同じ内容の調査票なのに複数のデータファイルができてしまった。
+ 二相三元データを収集したので，二相データが複数のファイルに分かれて入っている
+ エクセルの各シートに実験状況ごとのデータを分けて保存しちゃいました

まあ他にも，実務的なシーンでこういうことがあるかもしれない。データはあるフォルダに集めてあるんだけど，ファイル名の統一もないし，とにかく全部読み込みたいんだけど，というような。

# アルゴリズムの確認

やるべきことを確認しておきましょう。

1. 目指すフォルダのファイルリストを収集する
2. 繰り返し読み込む
3. 整形する

です。次のようなコードで実行できます。

```R:
list.files("dataset/", full.names = T) %>%
  purrr::map(read_csv) %>% 
  dplyr::tibble() %>%
  dplyr::rename(rawdata = ".") %>%
  tibble::rowid_to_column("ID")
```

私がpurrr::mapを使ったのはこれが初めて。このときやっと「便利だなあ」と理解しましたよ。


こんな感じで，自分のTips,こんなバグをこうやって解決したよ，というような話を，よろしければ皆さんもお寄せください。
[出題編はこちらです。](https://qiita.com/advent-calendar/2021/r_tips_attack25_q)
あるいは「こちらの解法のほうが美しいぞ」というのがありましたら，コメントいただけると幸いです。
Scalaとは・環境構築

# 概要
最近業務でScalaを用いることが多くなってきた。Scalaの日本語文献が少なく、初学者にはハードルが高い言語だと自分の中で思っているが（筆者も苦しんだ。。。）、なにかまとまったサイトがあればいいなと思い執筆している。

# Scalaとは

一言で表すと、**オブジェクト指向と関数型プログラミングが融合された言語**である。歴史を辿ると、スイス・ローザンヌにあるスイス連邦工科大学の教授であるMartin Odersky氏がJavaにジェネリクス（様々なデータの型を同じように処理することができる機能）を実装するプロジェクトに参加したのが始まりである。すなわち、Scalaの基となった言語はjavaなのである。そのため、Scalaを実装するにあたりjavaの知識も必要だし、なおかつ関数型言語の知識も必要である。

では、Scalaの良さとはなんなのだろうか。それはつまり、**コード量の少なさ**が挙げられる。具体的にはJavaだと20行も記述しなければならないコードが1行に短縮することが可能である。

現在ではTwitterやLinkedInの開発言語としてScalaを採用されており、日に日にその需要は増している。Scalaを学習することでオブジェクト指向と関数型プログラミングの両方を学ぶことができ、マスターすれば引く手数多な人材（実際にScalaの求人広告の単価は非常に高い）になっていることだろう。

# 環境構築
今回は**sbt**と呼ばれる、ScalaとJavaのビルドツールを用いて実行やビルドなどを行えるように環境構築を行なっていく。大まかな手順としては

1. JDK (Javaの開発環境)をインストールする
1. sbtをインストールする

の2つである。
JDKがインストールされているかどうかは、以下のコマンドで確認できる。

``` terminal
> javac -version
```

ちなみに`javac`のcはコンパイル（compile）の省略語である。

### 1. JDKをインストールする

JDKはOracle社が提供しており、[以下のHP](https://www.oracle.com/java/technologies/downloads/)から最新版のJDKをダウンロードする。

https://www.oracle.com/java/technologies/downloads/

「Java SE Development Kit 17.0.1 downloads」（2021年11月26日現在）をダウンロードする（Javaの環境も整うキットとなっているが、中にJDKも含まれている。）

**Windows**人は環境変数を自身で設定する必要があるため、以下の手順に従って環境変数を設定する。

1. コントロールパネル > 全てのコントロールパネル項目 > システム　から「システムの詳細設定」（左側にある）をクリックする。
1. 詳細設定タブを押し、下部の環境変数をクリックする。
1. システム環境変数の「Path」をクリックし、編集ボタンを押す。
1. インストール時に置いた場所（デフォルトの場合は`C:\Program Files\Java\jdk17XX\bin`）をコピペする。（`\bin`まで書く必要あり）
1. 最後にシステム環境変数の欄にJAVA_HOMEがない人のみ新規作成で環境変数の設定を行う。変数値として`C:\Program Files\Java\jdk17XX\`を設定する。（`\bin`は不要）

無事にPathが通っているかは上記で書いたJDKがインストールされているかどうかを実行すれば確認可能である。

### 2. sbtをインストールする

次にscalaのビルドツールのインストール方法を説明する。[下記HP](https://www.scala-sbt.org/1.0/docs/ja/Installing-sbt-on-Windows.html)からmpiインストーラーをクリックしよう。

https://www.scala-sbt.org/1.0/docs/ja/Installing-sbt-on-Windows.html

mpiインストーラーをダウンロードしsbtがインストールされたことを確認するために以下のコマンドを叩こう。

```terminal
> sbt sbtVersion
```

# 実際に書いていこう

scalaが正常に起動できたため、コマンドラインでscalaを実際に書いてみよう。

```terminal
scala
```

と打つとscalaが起動されるため、最初に`Hello World`を表示させるコードを実装しよう。

```scala
println("Hello World")
```

無事に`Hello World`が表示させることができたなら、次のブログではScalaでつまづくobject/trait/classに関して説明していく。（編集中）
Q.フォルダの中にあるファイルを読み込む

# フォルダの中にあるファイルを読み込む

今日のお題はタイトルの通り。

たとえば`data`というフォルダに，`foo1.csv`,`foo2.csv`,...,`booX.csv`という複数のファイルが入っていて(しかも名前に統一感がない)，これを連続で読み出してデータセットにしたい，という時のコードはどうかけばいいでしょうか，というもの。

指定されたフォルダの，ファイルのリストを読み込んで，読み込む動作を繰り返す・・・？
MicroPythonを使ってみる（その２：マルチタスク）

# MicroPythonでマルチタスク（マルチスレッド）
めでたく第２回目。スレッドを使ったマルチタスクを実現してみる。

## 用いたもの
[その１](https://qiita.com/infinite1oop/items/76d240e41dcc3fcd2282)同様、ESP32 DevKitボード。

## マルチタスク手法
今回用いるスレッド（_Thread）以外にも、asyncioなどがあるようだが、どうもうまく動作せず、その他はとりあえずPending。

### _Thread
本家サイトの[ここ](https://micropython-docs-ja.readthedocs.io/ja/latest/library/_thread.html)から情報が見つかる。

## 試す内容
タスク（スレッド）を２つ起動し、タスク間でメッセージの通信を行うもの。

### タスク間通信
キューの利用を考えたが、[この記事](https://zenn.dev/kotaproj/articles/fcec7ac5d23158)のスレッド間通信の説明によると、MicroPythonにはQueueモジュールが搭載されていないらしい。なので、単なるリストを利用した。また、リストの排他制御はここでは扱っていない。

### ソースコード
[こちら](https://techtutorialsx.com/2017/10/02/esp32-micropython-creating-a-thread/)のコードをもとに作成。

```python:Thread&List.py
import _thread
import time
 
q = []  # メッセージを送受信するリスト（Queue）
 
def SendThread():  # データ送信スレッド
  count = 0
  while True:
    print("Send data")
    q.append(count)  # リストへcount値を入れる
    count += 1
    time.sleep(3)

def RecvThread():  # データ受信スレッド
  while True:
    print("Recv Thread");
    if len(q) > 0:
      data = q.pop()  # リストから値を取り出す
      print('Recv data = {}'.format(data))
    time.sleep(1)
 
_thread.start_new_thread(SendThread, ())  # SendThreadの起動
_thread.start_new_thread(RecvThread, ())  # RecvThreadの起動
```

- SendThread: 3秒毎にcount値を送る＆"Send data"表示
- RecvThread: 1秒毎に"Recv Thread"表示＆リストデータがある場合に値を表示

### 実行結果
![ThreadTest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/fb7f9633-929c-fd6f-d08c-49e58e1729c3.png)
成功。
CNAMEレコードとALIASレコードの違い

# 前提
- ドメイン名からI Pアドレスを受け取って通信したい
- AWS S3とRoute53使用
- Aリソースレコード（Aレコード）とは、ドメイン名に対するIPv4アドレスを指定するリソースレコード。同じドメイン名に対して複数記述することができる。

https://jprs.jp/glossary/index.php?ID=0161

# CNAMEレコードの場合
>DNSの名前解決では、CNAMEリソースレコードが見つかった場合、ドメイン名を正式名に置き換えて名前解決を継続します。

https://jprs.jp/glossary/index.php?ID=0212

つまりCNAMEレコード名でアクセスしたらAレコード名を返す。
でも通信するためにはIPアドレスが欲しいので、Aレコードが返されたらそのAレコード名を使用して名前解決をしてIPアドレスを受け取る。![CNAME A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1836602/700d41ae-1755-a509-60b0-2858859c3acc.png)

赤のアドレスでIPアドレスが欲しいとRoute53にリクエストを送るとCNAMEレコードの青のアドレスをクライアントに返す。
でもまだIPアドレスは手に入れられていないので、
クライアントは返ってきた青のアドレスを元にRoute53に問い合わせをしてAレコード内の黄のアドレスでS3でIPアドレスを取得し、クライアントに返して通信が成功する。


=> <b>クライアントとRoute53の通信が２回行われる</b>

# ALIASレコード

>Amazon Route 53 エイリアスレコード で、DNS 機能に Route 53 固有の拡張機能が追加されます。エイリアスレコードを使用すると、選択した AWS リソース (CloudFront ディストリビューションや Amazon S3 バケットなど) にトラフィックをルーティングできます。また、エイリアスレコードにより、ホストゾーン内のあるレコードから別のレコードにトラフィックをルーティングできます。

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resource-record-sets-choosing-alias-non-alias.html

クライアントはRoute53に対してIPアドレスの問い合わせをすると、Route53はAレコードのALIASがあればそれを元にAWS内でS3に問い合わせをし、IPアドレスをクライアントに返す。
(AレコードなのでIPアドレスを返す)

![s3-website-ap-nort.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1836602/6fcb42d8-7571-c290-a6c8-f92bc936a16e.png)

=> <b>クライアントとRoute53の通信は１回で済むのでCNAMEを使うよりも通信の速度が上がる</b>


最近はこちらのサイトでアウトプットしているのでよろしければ覗いてみてください
↓
https://abillyz.com/moco/studies
[Cocoa][Swift]weak self

<p>Objective-C時代にUIViewControllerでBlocksを使う場合は、以下のように、自分の過去のコードをテンプレートのようにしてコピーして使っていた。</p>

<pre><code>__block ViewController * __weak blockWeakSelf = self;
[[Connector sharedConnector] demoWithCompletionHandler:^() {
    ViewController *tempSelf = blockWeakSelf;
    if (! tempSelf) return;
 
    :
    }];
</code></pre>

<p>ある条件でのみ呼ばれるBlockの場合、呼ばれない可能性もあり、BlockでViewControllerのselfを強参照で保持すると、画面遷移などでViewControllerが不要になってもメモリの残り続けることになる。そこで、Blockでキャプチャするのはweak selfとし、利用時にnilなら、そのViewControllerは存在しないので、何もしないとしていた。</p>

<p>また、Block内で自身を参照すると、循環参照になるということで、Xcodeで警告されるようになったので、weak selfを記述するようになったと思う。</p>

<pre><code>MyClass * __weak weakSelf = self;
self.block = ^{
    [weakSelf hoge];
    weakSelf.foo = @"bar";
};
</code></pre>

<p>Swiftではweakに加えunownedが使え、前者はnilになる可能性があり、後者はnilにならないとなる。</p>

<p>プロパティの初期化では、自身はnilにならないので、以下のように遅延処理で記述できる。</p>

<pre><code>class MyClass: NSObject {
    lasy var block: () -> Void = {
        [unowned self] () -> Void in
            self.hoge()
    }
}
</code></pre>

<p>また、コード中は以下のように記述できる。</p>

<pre><code>self.block = {
    [unowned self] () -> Void in
        self.hoge()
}
</code></pre>

<p>最初のViewControllerの場合のように、自身がnilになる可能性がある場合は、weakを選択ということになるのだろう。</p>

<pre><code>self.block = {
    [weak self] () -> Void in
        guard let self = self else { return }
        self.hoge()
        self.foo = "bar"
}
</code></pre>

【関連情報】
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a>
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a>
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a>
【Rails】jbulderの基礎・使い方

ポートフォリオ制作でjbuilderを使ったので学習した内容をまとめました。

## jbuilderとは？
jbuilderとは、JSON形式のデータを簡単に作成することができるgem。Railにデフォルトで導入されている。


## jbuilderでできること
`app/view/〇〇.json.jbuilder`ファイル内のjsonオブジェクトに対して様々なメソッドを使うことでJSON形式の文字列のデータを簡単に作ることができる。

「APIを叩く」みたいなことができるのだと思います。（たぶん）
「APIを叩く」に関して、こちらの記事が大変参考になりました。

https://qiita.com/antk/items/d762fdb3695cb85712ad

## 使い方
RailsとVue.jsを使用、取得するデータは作成済みの想定で進めます。
### 1. Jbuilderが導入されていることを確認する

```:Gemfile
ruby '2.7.3'
gem 'rails', '~> 6.1.4'
・・・
gem 'jbuilder', '~> 2.7'
```

### 2. コントローラーの準備
`localhost/api/v1/comments.json`でデータが扱えるようにするため、コントローラーの設定を行います。

```Ruby:app/controller/api/v1/comments_controller.rb
class Api::V1::CommentsController < ApiController
  def index
    @comments = Comment.all
  end
end
```
### 3. jbuilderファイルの作成
各メソッドは後術します。

```Ruby:app/views/api/v1/comments/index.json.jbuilder
json.set! :comments do
  json.array! @comments do |comment|
    json.extract! comment, :id, :context
  end
end
```
### 4. 生成されたjsonデータを確認
`http://localhost/api/v1/comments.json`にアクセス
※二点いかがわしいコメントがありましたので隠させていただきます。
![スクリーンショット 2021-11-27 6.18.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1722047/81405d88-0510-2954-617e-99de85aa32b6.png)

## メソッド

- `json.extract!`：第一引数に指定したインスタンス変数のデータをJSON形式の文字列で返す。

```ruby:〇〇json.jbundler
json.extract! @commnet, :id, :context

# 実行結果=> {"id": 1, "context": "hogehoge"}
```

- ネスト
<br>入れ子構造にして属性をまとめたい場合は以下のように記述。

```ruby:〇〇json.jbundler
json.set! commnets do
  json.extract! @commnet, :id, :context
end
# 実行結果=> {"comments":[{"id": 1, "context": "hogehoge"}]}
```

- `json.set!`：キーと値がペアとなったJSON形式の文字列を返す

```ruby:〇〇json.jbundler
json.set! "context", "hogehoge"
# 実行結果=> {"context": "hogehoge"}
```

- `json.array!`：モデル内のデータが配列に格納され、JSON形式の文字列のデータで返す

```ruby:〇〇json.jbundler
json.array! @comments, :id, :context
# 実行結果=> [{"id": 1, "context": "hogehoge"},{"id": 2, "context": "hojihoji"}]
```


##　参考記事
https://pikawaka.com/rails/jbuilder
neosでlogix その5

# 概要

niosでlogixやってみる。
sin波やってみた。

# 参考にした動画

https://www.youtube.com/watch?v=Rm5QpT_pls8

# 写真

![2021-11-26 05.33.25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/09abc215-e9ab-e2eb-94a8-be642cc8abc9.jpeg)


# 手順

- LogiXToolTipを装着して、Tとsinを配置する。
- DivToolTipを装着して、空のオブジェクトを配置する
- ValueField(float)
- ValueGraphRecorder
- StandaloneRectMesh(LinGraphMesh)
- MeshRendererを呼び出す
- Tとsinをつなぐ
- ValueFieldから、インターフェースを取り出してsinとつなぐ
- ValueFieldとValueGraphRecorderをつなぐ
- ValueGraphRecorderとStandaloneRectMeshをつなぐ
- StandaloneRectMeshとMeshRendererをつなぐ
 
以上。
Delphi: いいえ(No)とキャンセル(Cancel)は違う

話の結論は [「いいえ」と「キャンセル」の違いって？](https://www.itmedia.co.jp/news/articles/1206/08/news003.html)
となるのだが以下小話まじえて説明です。
ここに4つ実行ボタンがある。センスの欠片もない画面だが許してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/c5296d93-2009-fbc7-cadd-decd3b7f59f5.png)

## 実行ボタン1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/200ad230-b1cf-69e6-9d04-a07f5b943f43.png)

```pascal
procedure TForm1.Button1Click(Sender: TObject);
begin
  if MessageDlg('サンプル'+ #13#10 +'です。実行してよろしいですか？', mtWarning, [mbOK, mbNo, mbCancel], 0) <> mrOk then
  begin
    showmessage('Cancelしました');
    exit;
  end;
  Showmessage('実行しました');
end;
```
というようなことがやりたいとする。


## 実行ボタン2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/7bfefbb8-0dd4-baac-7862-621429c62f26.png)

```pascal
procedure TForm1.Button2Click(Sender: TObject);
begin
  if MessageDlg('サンプル'+ #13#10 +'です。実行してよろしいですか？', mtWarning, [mbOK, mbCancel], 0) <> mrCancel then
  begin
    showmessage('実行しました');
  end;
end;
```
別パターン。

## 実行ボタン3

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/32ba95ab-fd77-e08c-6fa4-f58fd581b2fc.png)

```pascal
procedure TForm1.Button3Click(Sender: TObject);
begin
  if MessageDlg('サンプル'+ #13#10 +'です。実行してよろしいですか？', mtWarning, [mbOK, mbNo, mbCancel], 0) = mrOK then
  begin
    showmessage('実行しました');
  end;
end;
```
これも別パターン。


## 実行ボタン4 (アンチパターン)

問題のパターンです。以下ソースは罠なので注意ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/66070b99-2ca4-65c1-68e8-de8b1ba71c4d.png)

```pascal
//罠
procedure TForm1.Button4Click(Sender: TObject);
begin
  if MessageDlg('サンプル'+ #13#10 +'です。実行してよろしいですか？', mtWarning, [mbOK, mbNo], 0) <> mrNo then
  begin
    showmessage('実行しました');
  end;
end;
```
2 や 3 と何が違うのか？というと `mrCancel` が画面上からなくなり `mrNo` になっているだけに見える。
CancelもNoも同じじゃないかと感じそうだがここで事故が起こる。


### 事故の再現映像
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/85e21949-3276-fb82-f82c-b2562b709145.gif)

### ソースは一見「実行ボタン2」「実行ボタン3」と似ているが
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/14f0428b-3474-1449-c528-ee459abd4dca.gif)
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/3a7691c7-397d-f496-d4af-db6a4c9e0b96.gif)

こちらはCancelされるんですね。
Delphiの `dialog.pas` の中身を見るともう少し紐解けるのですがいったんここは別の機会に譲りつつ

```pascal
function CreateMessageDialog(const Msg: string; DlgType: TMsgDlgType;
  Buttons: TMsgDlgButtons): TForm;
```


つまりは[「いいえ」と「キャンセル」は明確に違う](https://www.itmedia.co.jp/news/articles/1206/08/news003.html)。本来下のような用途。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/687bd86d-11b1-0d1a-8e24-26bb0ae7e501.png)
> つまりこの場合の「はい」と「いいえ」は、表面上は文書を保存するかどうかを確認しているのですが、どちらも暗黙的に「アプリを終了する」という事を意味しています。これに対し「キャンセル」は、メニューから「アプリの終了」を“選択した事自体”をキャンセルしますので、何もしません。したがって、アプリも終了しません。


この誤解により昔に大事故があった（右上のｘボタンを押したのに処理が...）ようなので確かめてみました。以上参考になればさいわいです。
【Lab色空間】cifar-10画像データを読み込みRGB画像をLab画像に変換する方法(Python)

# 目的
cifar-10の画像データを読み込みRGBをLabに変換する

# 事前準備
## インポート

```python
import pickle
import numpy as np
import matplotlib.pyplot as plt
import cv2
```
# 画像の読み込み
[cifar-10データセット](https://www.cs.toronto.edu/~kriz/cifar.html)から画像データセットをダウンロード

###**画像の中身**（[cifar-10データセット](https://www.cs.toronto.edu/~kriz/cifar.html)より引用）

- 10クラスの60000の32x32カラー画像
- RGBフルカラー画像： RGB（赤色／緑色／青色）3色の組み合わせで、それぞれ「0」～「255」の256段階
- 1つ分のデータが基本的に(3, 32, 32)もしくは(32, 32, 3)（＝計3072要素）という多次元配列の形状


**「pickled」オブジェクトのため、ファイルを開いて辞書を返す**

```python
def unpickle(file):
    import pickle
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict
```

（unpickle関数は[cifar-10データセット](https://www.cs.toronto.edu/~kriz/cifar.html)より引用）

###**辞書の中身**（[cifar-10データセット](https://www.cs.toronto.edu/~kriz/cifar.html)より引用）


- データ- 10000x3072 numpyののの配列のuint8。配列の各行には、32x32のカラー画像が格納されます。最初の1024エントリには赤のチャネル値が含まれ、次の1024エントリには緑、最後の1024エントリには青が含まれます。画像は行優先順に格納されるため、配列の最初の32エントリは、画像の最初の行の赤チャネル値になります。
- ラベル-0〜9の範囲の10000個の数値のリスト。インデックスiの番号は、配列データのi番目の画像のラベルを示します。

## data_batch_1の読み込み

```python
# バッチ1を読み込み
data_batch_1 = unpickle('cifar-10-batches-py/data_batch_1')
```

```python
data_batch_1_data.shape # -> (10000, 3072)
```

# カラー画像のNumpy配列に変換
辞書では１列のNumpy配列になっているため、カラー画像のNumpy配列に変換する。

```python
# 1 列の Numpy 配列を 32 x 32 のカラー画像の Numpy 配列に変換
def data_to_array(data):
    ar1 = np.empty((32, 32, 3), dtype='uint8')
    data1 = data.reshape(3, 32, 32)
    for i in range(3):
        ar1[:, :, i] = data1[i, :, :]
    return ar1
```

```python
# バッチ1データ（10000件）を 32 x 32 のカラー画像の Numpy 配列に変換しリストに格納
data_batch_1_img_list = list()

for data in data_batch_1_data:
    img = data_to_array(data)
    #print(img.shape)
    data_batch_1_img_list.append(img)
```

```python
len(data_batch_1_img_list) # -> 10000
```

```python
type(data_batch_1_img_list[0]) # -> numpy.ndarray
```

# 表示

カラー画像のNumpy配列に変換したリストを表示。

```python
# カラー画像を表示
def check_image(n):
    plt.imshow(data_batch_1_img_list[n])
```
```python
chek_image(0)
```

![cifar-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2327316/8bbe5319-43de-aca4-c25f-1d8781e2db5c.png)

# Lab画像に変換

## Lab画像とは？
"Lab色空間は補色空間の一種で、明度を意味する次元 L と補色次元の a および b を持ち、CIE XYZ 色空間の座標を非線形に圧縮したものに基づいている。RGBやCMYKとは異なり、Lab色空間は人間の視覚を近似するよう設計されている。"
（出典：https://ja.wikipedia.org/wiki/Lab%E8%89%B2%E7%A9%BA%E9%96%93)


## Lab画像に変換し表示する。

```python
# rgb　を Lab に変換
img_Lab = cv2.cvtColor(data_batch_1_img_list[0], cv2.COLOR_RGB2Lab)
img_L, img_a, img_b = cv2.split(img_Lab)
plt.imshow(img_Lab)
```
![cifar_10_Lab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2327316/af737cfd-b765-6f04-e86a-a177ce8ccc0a.png)

```python
img_Lab.shape # -> (32, 32, 3)
```
Win11から追加されたShow more option を消してWin10のオプションタブと同じにする方法

#参考
具体的なやり方は下の動画を参考にしました

https://youtu.be/GM5FUqufT1w

#やり方
---

Windowsキーを押し

```
Registry Editor
```
と検索します
コントロールの許可(Yes)を押し，ソフトウエアを開きます

---

```
Computer\HKEY_CURRENT_USER\Software\Classes\CLSID
```
を検索バーに入力し, フォルダを探します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412006/5b193f55-86bc-bd5d-c20e-7d3daa965140.png)

---

`CLSID`を左クリック，右クリックの順で行い,keyを追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412006/38e9dfa0-76cd-a3f1-9825-b7ecc8a85f4c.png)

---

新しく追加されたフォルダの名前を

```
{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}
```
に変更します

---

{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}フォルダの中に先ほどと同様にKeyを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412006/3df6297e-13da-64cd-d9d4-3a568ed034e8.png)

---

こんどは新しく追加されたフォルダの名前を

```
InprocServer32
```
に変更します

---

InprocServer32を左クリックし開き，さらに(Default)を開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412006/f7254e99-c079-4216-7efd-40481210b0a2.png)

---

value data:の下のボックスに何も書かれていないことを確認したらOKを押し，すべて閉じます

---

コンピュータを再起動するとWin10と同様なオプションが開けるはずです

---

#まとめ
デフォルトでこれにしてほしい