OmniAICreator/Qiita-1.07M huggingface dataset:
[プロダクトリスクとプロジェクトリスク] JSTQB FL 勉強記録②

# はじめに
前回に引き続きJSTQBの勉強をしているわけですが、何回やっても頭に入ってこない厄介な単元（？）があるんです。それが、
### 5.5.2 プロダクトリスクとプロジェクトリスク
です。いやこいつは本当に厄介ですよ。何が厄介かって、***知識が曖昧でも何となく言葉の意味を捉えてよく考えれば問題に正解できちゃう***というところです。
問題を解いているその場で考えて解いちゃってるイメージです。

正解できるならそれでいいじゃん、という感じで今まで放置してきましたが、テストでよく考えて時間を使った挙句、合っているか不安な気持ちでもやもやはするのは嫌です。そのうえ、間違えていることも平気でありますから困ったものです。

それならばQiitaに勉強も兼ねて内容をまとめておけばいいじゃん！と。

# プロダクトリスクって？
JSTQBのシラバスには
「作業成果物（例えば、仕様、コンポーネント、システム、テストケース）がユーザー、および/またはステークホルダーの正当なニーズを満たすことができない恐れを含む。」
と表現しています。
・・・。
まぁ、わかるっちゃわかるんですがちょっとだけわかりにくいので簡単に説明すると、
何かしら製品を作るうえで世に出す前に、その製品のテストを実施して品質を保証するのはとても大切なことです。しかし、人間なのでテスト漏れがすることもあります。で、その時に発生し得る損失や損害に対するリスクというイメージです。

これは「プロダクトリスク」という言葉の意味を考えれば大抵の人はイメージできるかと思います。特に重要な試験に出るプロダクトリスクの項目をまとめておきます。

---
***・故障の起きやすいソフトウェアの出荷***

***・ソフトウェアやハードウェアが個人や会社に対して損害を与える可能性***

***・貧弱なソフトウェア品質特性***

***・貧弱なデータの完全性と品質***

***・予定の機能が動作しないソフトウェア***

---

以上を基にしたシラバスに挙げられている例がこちら。

***・ソフトウェアの意図されている機能が仕様通りには動かないかもしれない***

***・ソフトウェアの意図されている機能がユーザー、顧客、および/またはステークホルダーのニーズ通りには動かないかもしれない***

***・システムアーキテクチャーが非機能要件を十分にサポートしないことがある***

***・特定の計算結果が状況によって正しくないことがある***

***・ループ制御構造が正しくコーディングされていないことがある***

***・高性能トランザクション処理システムで応答時間が適切でないことがある***

***・ユーザーエクスペリエンス（UX）のフィードバックがプロダクトの期待と異なるかもしれない***

# プロジェクトリスクって？
シラバスでは
「発生した場合にプロジェクトの目的達成に悪影響を与える。」
と表現しています。
こちらはわかりやすいですね。プロジェクトリスクを正しく捉えるうえで重要になってくるのが
***・ヒト***
***・モノ***
***・カネ***
の3項目です。この3項目でどういったリスクがあるかを考えると非常にわかりやすいと思います。
こちらもシラバスに載っている例を基に理解を深めたいと思います。
## スケジュールに関するリスク
***・テストにより大量の問題が検出され、テストの進捗が滞る***

***・機能追加や仕様変更により、テストケースの作成/実行が追い付かなくなり、スケジュール内で収まらなくなる***

## テスト環境に関するリスク
***・シミュレーターや測定器などの機材の調達が滞り、テスト環境が構築できない***

***・テスト環境で前バージョンの開発が終わっていない***

***・データ変換ツールの開発の遅れにより、予定通りにテスト環境用のデータが揃わない***

***・開発環境からステージング環境へ移行するためのツールに問題があり、受け入れテストの環境が構築できない***

## テストマネジメントに関するリスク
***・テストの計画/設計/実行に要するコストと必要なテスト人員（スキル面、人数）が確保できない***

***・テスト計画、設計フェーズへ十分に人をアサインできない***

***・一度作った後に、誰も見ないテスト計画を作ってしまう***

***・無計画、かつ成り行き任せでテストリソース（ヒト、モノ、カネ）を割り当ててしまい、その結果予算がショート（不足）してしまう***

# おわりに
以上になります。プロジェクトリスクの例は多いので、プロダクトリスクを覚えちゃって、それらに類似しないものはプロジェクトリスク、と覚えるのが良いかもしれません。
これでJSTQBの試験問題を解いていてこの問題が出てきても自信をもって答えることができると思います。
JSTQBが気になった方は勉強記録①もまとめておりますので是非そちらもご覧になってください。
それでは～。
よく分かるデッドロック

## はじめに

本記事は非エンジニア向けに「デッドロックって何？」という話を解説します。
エンジニアの方は「うんうん、そうだよね」と頷いてもらえればと思います。

## デッドロックとは

[wikipedia](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%83%E3%83%89%E3%83%AD%E3%83%83%E3%82%AF)
>デッドロック (英: deadlock) とは、特に計算機科学において、2つ以上のスレッドあるいはプロセスなどの処理単位が互いの処理終了を待ち、結果としてどの処理も先に進めなくなってしまうことを言う。

なるほどよく分からんですね。

## 例

お父さん「おーい、ワンピースとヒロアカの最新巻を買ってきたぞー」
兄「やったー、じゃあワンピース→ヒロアカの順に読もう」
弟「やったー、じゃあヒロアカ→ワンピースの順に読もう」
兄「ワンピースを読むぞ（手に取る）」
弟「ヒロアカを読むぞ（手に取る）」
兄「ワンピースを読み終わったぞ、さて次はヒロアカ…あれ、誰かが持っていってるみたいだ」
弟「ヒロアカを読み終わったぞ、さて次はワンピース…あれ、誰かが持っていってるみたいだ」
どちらかが手に持っている巻を返さないと兄も弟も次の巻が読めない状態になってしまいました。
これがデッドロックの状態です。

## 解説

兄弟はそれぞれの処理です。
漫画はテーブルです。
手に取るのがロックです。
双方の処理がロック待ちになってしまい処理が進まなくなってしまうことをデッドロックと言います。

## デッドロックを起こりにくくするために

### 処理順を統一して

今回の例だと兄がワンピース、弟がヒロアカから読み進めました。
例えば2人ともワンピースから読み進めることにした場合。
兄「ワンピースを読もう」
弟「兄がワンピースを読んでいるから終わるまで待とう」
兄「ワンピースを読み終わったぞ、次はヒロアカを読もう（まだワンピースは手に持っている）」
弟「まだワンピースが本棚に戻らないな、待とう」
兄「両方読み終わったぞ、両方とも本棚に戻そう」
弟「あ、ワンピースが本棚に戻ってきたぞ。早速読もう」
となりデッドロックが発生しません。
このように処理順を統一してあげると良いです。

### ロック範囲を小さく

今回の例だと
兄「ワンピース→ヒロアカを読み終わるまで」
弟「ヒロアカ→ワンピースを読み終わるまで」
がそれぞれのロック範囲です。
なので例えば
兄「ワンピースを読み終わるまで」
弟「ヒロアカの1話を読み終わるまで」
のようにロックを取る範囲を狭めて、ロックが終わったら本棚に戻してあげるとデッドロックが発生しにくくなります。

### ロック時間を短く

これは単純な処理速度・処理時間を早くするという話で、今回の例だと弟がヒロアカを取る前に兄がワンピース→ヒロアカを読み終えればデッドロックは発生しません。
ロック範囲が広くてもものすごい速読であれば問題は発生しにくいです。

### そもそもそのロック必要？

そもそも今回の例だと「ワンピース→ヒロアカ」に関連性はなく、この順に読む必要性がありません。
処理を書く際に「この処理にロックは必要なのか？」というのは今一度検討してみてください。

## 最後に

非エンジニアの方にデッドロックが何か、が伝わってくれると嬉しいです！

## 参考

こちらの記事が大変参考になります。
図も分かりやすい。

https://cloudear.jp/blog/?p=1335
【Unity】AndroidでMesh.verticesのサイズが０になる？

OnPreRender()関数内で次のようなMesh.verticesにアクセスするコードを書いていたところ、エディタ上では期待通り動いていたのですが、AndroidOSの端末で動かすと、頂点の数が0になってしまっていました。
```cpp
var vertices = meshFilter.sharedMesh.vertices;
// Android端末でvertices.Lengthが0になっている。
for( int i = 0; i < vertices.Length; i++ ){
   　　　　　　・
　　　　　　   ・
　　　　　　   ・
}
```
この問題は下記のメッシュのインポート設定のRead/Writeをオンにすると解決しました。
![importSettings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167635/db9955f1-fe46-1331-0c8a-aaef93691a0d.png)

Unityの公式マニュアルを読んでみると、「このオプションを無効にすると、Unity はメッシュデータを GPU で処理可能なメモリにアップロードし、それを CPU で処理可能なメモリから削除します。」と書かれていました。メモリ節約のためですかね。エディタ上でも同じ挙動にしておいて欲しいなぁって思っちゃいました。

https://docs.unity3d.com/ja/2018.4/Manual/FBXImporter-Model.html
cscの作法 その256

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
xml秘密鍵ファイルからJsonWebKeyを生成せよ。

# 方針
- xml読み込みにFromXmlStringを使う
- ExportParameters使う
- ExponentとModulusを使う
- base64url使う

# サンプルコード

```
using System;
using System.IO;
using System.Security.Cryptography;
using System.Collections.Generic;
using System.Text;

	class test0 {
		static void Main() {
			var privateKey2 = File.ReadAllText("privateKey.xml");
			var rsa = RSA.Create();
			rsa.FromXmlString(privateKey2);
			var publicParameters = rsa.ExportParameters(false);
			var e = Convert.ToBase64String(publicParameters.Exponent).TrimEnd('=').Replace('+', '-').Replace('/', '_');
			var n = Convert.ToBase64String(publicParameters.Modulus).TrimEnd('=').Replace('+', '-').Replace('/', '_');
			var dict = new Dictionary<string, string>() {
				{"e", e},
				{"kty", "RSA"},
				{"n", n}
			};
			foreach (var item in dict)
			{
				Console.WriteLine(item.Key + ": " + item.Value);
			}
		}
	}
```

# 実行結果

```
>xml2jwk
e: AQAB
kty: RSA
n: lrpUlgxTaOLAUNOus45cl_VBOtqoAv1Y3w3ka5VLzxHVgw9Z4gW1t5a1KsbboJQn_u_gG5SJ_FaV4RzlJe_nGxYYep5fcfSHiZPCV__5xl7QJLvh4PzA6vXJ3BJQF7mEx5xvvW2Ga-gTYpfAQppo_OGcjGJ1VLw06x4oNUliz9zH_vUROlNR2Tbhl8xpSUY6LCPJiQvhVbIBC6GJKosfrXXe-rtrGbUrNtsOjGYJk7496_hzHtsrDy-HdBAWKDjdot7GW2ESxybIrVUIDvyNXV9CUyyQmC_jA6_yiAN9xrWK75Un7Eav_bbhOKVGN9DC2JaSoTcjavomP9QMEWjWOxNcCX0f6iONBGDw4FpaYaCRyiqkD_lY1xfAFLEhD_5QY6GWvHgvRSDyjQwV8Mc4ZUORsEX7eN1DUdIZUfJ5lsRFwXuxCnjgzkdi_-RZocPOuaFkjpX_Es0ZcWc8Rb_-dyaJQlVzrQHC7y8LduPa-qotb7vLUjoxp-1g0yGeK6Sy4sXO0UflrrfsIn8vfmW3VNFxhUUJB4ruXw99yAkyGwCWEonYH3GbK09sx-3_cNDZdx9V04q3vp3nMr0jQ2VfF6I5pRGRl6niWUDNH5OFcGOQ6DRBGaaJ-LXXn6dnsvpimPmf38pshYV8OiHVl1o4fP0NxdeQl25XIpGAWJEJJAE


```

以上。
Reactで日付選択にDatePickerを使う

```
import React, {useState} from 'react';
import DatePicker from 'react-datepicker';
import ja from 'date-fns/locale/ja'; //日本語カレンダーのImport

export const App = () => {
    const Today = new Date();
    const [date, setDate] = React.useState(Today);

    return (
      <div>
        <form>
          <label>
            <DatePicker dateFormat="yyyy-MM-dd" //フォーマット指定
                        selected={date}
                        maxDate={Today} //過去日のみを選択可能にする
                        filterDate={date => date.getDay() === 1} //月曜日指定の場合、1
                        locale={ja} //日本語カレンダーにする
                        onChange={selectedDate => { setDate(selectedDate || Today) }} />
          </label>
          <Button onClick={} text='検索' />
        </form>
      </div>
    );
};

export default App;
```
初心者　MySQL8に挑戦する 13

# 数値型復習

　昨日の問題は数字の扱いだったので、ちょっと復習する。

- tinint    1byte   2^7-1
- smallint  2byte   2^15-1
- mediumint 3byte   6^23-1
- integer   4byte　 2^31-1 = 2,147,483,647
- bigint    8byte   2^63-1

　だから138億年はbigintでないとカバーできない。でも多細胞生物ぐらいまで進めばintegerでまかなえる。でもシュメールとかエジプト古王国までならsmallintで十分ということだ。

　ということは、有史とそれ以外でテーブルを分けるんだな。地質時代をさらにGyr(ギガ・１０億年)、Myr(
メガ・100万年)、Kyr(キロ・1000年)に分けて、浮動小数点を使う？
　floatとdoubleもよくわからんけど・・・。まあ、まちがってたら、文句言われるだろうから直せばいいか。

　入力画面から、どのテーブルにinsertするか、という場合分けがちょっとめんどうになるけど、まあ、がんばってみよう。

## それともぜんぜん考え違い？

　明日は空間情報について勉強しよう。

https://qiita.com/dongri727/items/7febbad00a8d0cef1382

https://qiita.com/dongri727/items/81409786b29a3ec14813
【合格体験記】AWS Certified Cloud Practitioner 試験 (CLF-C01)

AWS Certified Cloud Practitioner 試験 (CLF-C01) に合格したので、その体験記を書き連ねてます。

# 筆者
* 某SES企業に所属の4年目
* AWSの基礎に関しては講師として登壇し教える
* 現場が決まらず待機状態となったためこれを機に勉強してみた

# 結果
![合格書.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1045926/231f3af4-f2b1-056d-6a12-4b085bac8a23.png)


# 勉強方法
期間：7/8～7/22
勉強時間：60hくらい
受験日：7/22

実施内容
* （AWS Skill Builder）AWS Cloud Practitioner Essentials (Japanese) 日本語実写版(6h)の視聴
* （udemy）【2022年版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）を解く

主に上記2つを参考に勉強を実施
AWS Cloud Practitioner EssentialsでクラウドについてからAWSの基本的なサービスの概要などを学習
学習した内容をもとに模擬試験問題集をひたすら解く

問題集はクラウドプラクティショナーレベル65問 × 5セット(基本レベル2つ、応用レベル3つ)とアソシエイトレベル130問(2セット分)があった。
基本レベル問題の2セットを10周実施。
応用レベル問題は1セットのみ5周程度実施。

基礎レベルの問題を解く際には各AWSのサービスの問われ方とそのサービスが一致するように復習を実施。
1つのサービスでも問われ方が様々あるので、そのサービスの本質を知ることが大切だった。
2つほど用語のまとめを作成したので参考までに使っていただければ嬉しいです。
* [AWS用語集①](https://qiita.com/mame_hiro416/items/2f7903087dec33ff950a)
* [AWS用語集②](https://qiita.com/mame_hiro416/items/d582b37580d3f970e6ed)

※重複している用語もあるがあまり気にしないでください。

以上の内容を繰り返して勉強をした。

# 感想
試験は無事に合格をすることができてよかった。
そこそこ時間をかけたので落ちたらショックだったかも・・・
スコア的には778/1000でややギリギリだったと思える。
もう少し取りたかった。
試験の内容的には難しいサービスを問われる問題はほとんどなく、良く使われるであろうサービスが多かった印象。
また、問題として「責任共有モデル」や「AWS Well-Architected」に関する問題が予想外に多く問われた。
ここら辺の内容をしっかり理解していなかったためスコアが伸びなかったと自己分析している。
模擬試験問題集ではあまり「責任共有モデル」や「AWS Well-Architected」について問われていないので
この内容は別途学習が必要な感じがした。

# 終わりに
短期間で勉強し合格できたのでよかった。
今後も他の認定試験を受けようと思う。
読んでいただいてありがとうございました。
XcodeとGitHubの連携で「RSA key with SHA-1」エラーが出たので対処

# エラー内容
Cloneやリモートリポジトリ作成をしようとするとエラーが出る。ちなみにリポジトリの選択肢は出てきたので、アカウントの連携は出来ている状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734189/a8504107-18b3-548f-5174-90a41f5de87e.png)
「2021年9月のセキュリティアップデートで古い形式のキーは使えなくしたよ。SHA-1のRSAはダメ」ということらしい
```
ERROR: You're using an RSA key with SHA-1, 
which is no longer allowed. 
Please use a newer client or a different key type
```

# 対処
[エラーメッセージ中に「ここを見ろ」と言われたリンク先](
https://github.blog/2021-09-01-improving-git-protocol-security-github/)を見ていく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734189/eec96ab7-1a10-1b2c-08c8-9a192d408363.png)
SSHのキーに関する変更および暗号化されてないプロトコルの削除を進めてます、かな

RSAキーについては新たな要求項目が追加されたらしい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734189/b77f1c03-e216-92ed-9bfd-ed8240917836.png)
SHA-1はセキュリティ弱いからSHA-2を使ってね、だね

↓

**でもSHA-2使ってるはずなんだけど。妙だな・・・**

ssh-keygenでオプションなしで作るとsha-256で作られる（[参考](https://wiki.archlinux.jp/index.php/SSH_%E9%8D%B5#SSH_.E9.8D.B5.E3.81.AE.E3.83.9A.E3.82.A2.E3.82.92.E7.94.9F.E6.88.90)）。
これはsha-2の一種（[参考](https://wa3.i-3-i.info/word15996.html)）。

新しく`ssh-keygen`で作成し直したけど、やっぱりダメだった。
Xcodeの機能でsshキー作成してもダメだった。

↓

ここで改めてググる。[Appleが回答しているページ](https://developer.apple.com/forums/thread/702389)が見つかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734189/db913ef4-d041-428b-2ebb-6334d34b26a6.png)

**`ecdsa`のSSHキーを作れ**ってさ

↓

結局、`ssh-keygen -t ecdsa`で作成したら解決した。
（ssh-keygenでメールアドレス指定しなくても動いた）
**SHA-1とか2とかって問題じゃないじゃん**

以上、エラー内容を真面目に読んで対処してハマったけど、「Xcode+エラー内容」でググったら解決策が見つかった話でした。

# 参考）バージョンなど前提情報
Xcodeのバージョンなど
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734189/44a118a1-9012-3c05-a903-3484663d4de7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734189/d57d0830-44b6-9f1e-cef3-7c8b8d73017f.png)
主記憶装置と高速化手法

レジスタとメモリとハードディスクの間には超えられない速度の差がある。
そのギャップを緩和するために２つの間に設ける```キャッシュメモリ```と```ディスクキャッシュ```がある。
# キャッシュメモリ
CPUとメモリの```読み書き速度の差は非常に違う。```
CPUが読み書きしてメモリに渡そうとすると違う処理をしていて```待ち時間が発生```する。
その待ち時間を無くすために```高速に読み書きできるメモリ```を置く。
それが```キャッシュメモリ```だ。
特徴は
* 主記憶装置から読み込んだデータは、キャッシュメモリにも保持される。
* 同じデータを読み込む場合は高速な```キャッシュメモリから取得する```ことができる。

このキャッシュは一つだけでは無い。

### データを探すためキャッシュへ次から次とアクセスする
```１次キャッシュ、2次キャッシュ...```と重ねて設置することができる。
１次キャッシュにデータがない場合２次キャッシュへアクセスされる。

CPUよりも低速だけどその分容量を大きく持てるものが```増えることでキャッシュ効果に期待```が持てる。

また```主記憶装置と磁気ディスク装置の間```で担うのが```ディスクキャッシュ```だ。
ディスクキャッシュは専用の半導体メモリを搭載したり、主記憶装置の一部を間借りすることで実装している。

記憶装置は階層構造になっている。
上から
* レジスタ
* キャッシュメモリ
* 主記憶装置
* ディスクキャッシュ
* 磁気ディスク装置（ハードディスクなど)

これが階層構造で組み合わさることで```見かけ上は高速で大容量```な記憶装置を実現させている。
これを```記憶階層```と言う。
上に行くほど```高速```、逆は```低速```
高速なものほど```高価なので容量は限られている。```

## 気づき
全部高速のものにしたら高価すぎるのか。
単価とはそう言うことか。
高速なものは高価なのか。

# 主記憶装置への書き込み方式
キャッシュメモリは読み出し専門ではない。書き込みも行う。そしてそこで```書き込んで終了とはならない。```
なので```主記憶装置にも反映させなくてはいけない。```
その反映方式の紹介だ。

## ライトスルー方式
主記憶装置へも```同時に書き込み```を行う。

## ライトバック方式
普段はキャッシュメモリにしか書き込まない。
```キャッシュメモリから追い出されるデータが発生```した場合に、その内容を```主記憶装置```へと書き戻して更新内容を反映させる。
普段の書き込み処理が高速化できるのは良いのですが、```制御が大変だ。```

## 気づき
ライトバックの説明で制御が大変と書いてあった。
今までの勉強の内容で説明できるのだろうか。
どうして制御が大変かをしっかり言えるようにしたい。

# ヒット率と実行アクセス時間
キャッシュメモリはメモリに比べて容量が小さい。なので必ずしも目的のデータがキャッシュメモリに存在するかわからない。
目的のデータが存在する確立は```ヒット率```と言う。
キャッシュメモrになくて、主記憶装置を読みに行く確率は1-ヒット率になる。

### 予想されるキャッシュメモリのアクセス時間は
```キャッシュメモリのアクセス時間 * ヒット率```
### 予想される主記憶装装置にアクセスする時間は
```主記憶装置のアクセス時間 * (1-ヒット率)```

これらを足し合わせて平均的なアクセス時間（```実行アクセス時間```)が求まる。

# メモリインタリープ
主記憶装置へのアクセスを高速化する手法。
主記憶装置の中の```複数の区画(バンク)に分割```します。
区画は```それぞれ並行してアクセスできる```のが特徴です。
分割した区画は```横断するように番地を振り分けられています。``` 連続した番地のデータを```一気に読み出す```ことができる。

# 問題を解い解いた時の気づき
## キャッシュミス
```命令処理に必要なデータがキャッシュメモリに存在せず```、キャッシュメモリからデータを読み込むことができないことです。

キャッシュメモリはメインメモリに比べると容量が小さいため、多くのデータを保存しておくことができません。そのため、```CPUがキャッシュメモリを検索しても、必要なデータが存在しない```場合があります。 この場合をキャッシュミスといいます。 

キャッシュミスの場合、命令処理に必要なデータをメインメモリ等に探しに行きます。```メインメモリはCPUからの距離が遠い```ので、```アクセスに時間がかかります。```その間、命令処理はメモリアクセス待ちとなり、処理の実行が滞ります。

## キャッシュヒット
命令処理に```必要なデータがキャッシュメモリに存在```し、キャッシュメモリからデータを読み込むことができることです。
出典　https://www.fujitsu.com/jp/products/computing/servers/unix/term/cachehit/#:~:text=%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%83%92%E3%83%83%E3%83%88%E3%81%A8%E3%81%AF%E3%80%81%E5%91%BD%E4%BB%A4,%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82
Rでパッケージが読み込めない

Rでパッケージが読み込めないときにどうするかをメモしておく。

## 依存関係のパッケージがインストールできないとき
R4.1.3 (Windows10) でtidyverseを読み込もうとしたら以下のエラーがでた：
```R
Namespace 'cli' 3.2.0 already loaded, >= 3.3.0 requested
```  
cliをアップデートすればいいのかとインストールしようにもPermission deniedでうまくいかない。  
remove.packages()でcliを消してからもう一度install.packages()でインストールしたらうまくいった。  

## 工事中
dependency injectionについての備忘録

# dependency injectionとは？
依存性注入と呼ばれるもので、コンピュータープログラムのデザインパターンの一つでオブジェクトなどの間に生じる依存関係をオブジェクト内のコードに直接記述するのではなく外部から与えることで依存性を下げる手法の一つ

例えば、クラス A と B があってA の中で B がインスタンス化されているとした時、A は B に依存しているという。

```java
class A {
    var temp = new B();
}

class B{
    ...
}
```

こうなると A と B の関係は固定的になりA が B を利用していることは外部からは分かりにくくなる。

## どうしてこのような状態が良くないのか。

例えば単体テストを行わなければならない時に、クラス A のテストを行う時クラスBの実態がなければならない。
クラス A のテストをしたいのにクラス B の実装に引っ張られてテストができないという問題が起こってしまう。

そこでDIでの実装を行うことでそのような問題が起きなくて済む。

依存性注入ではクラス A に当たる依存する側のことをクライアント、クラス b にあたる依存される側をサービスと言う。

注入をどのように行うかは様々な方式がありサービスをクライアントのコンストラクタ引数として渡すコンストラクタインジェクションやセッターメソッド用いるセッターインジェクションなどがよく知られている。DI コンテナなど専用のツールを利用すれば依存性をプログラム自体ではなく外部の設定ファイルなどに記述しておくことができる。

# 全てをDI で実装する方がいいのかそれとも一部だけ DI で実装すべきなのか。
利用している Web フレームワークにもよるが、基本的には分けた方が良いのではないか。

例えばシンフォニーで実装する例を考えてみたいと思います。

```php
namespace App\Controller;

use App\Entity\Product;
use Symfony\Component\Routing\Annotation\Route;

class HelloController extends AbstractController
{
    /**
     * @Route("/", name="test_index")
     */
    public function indexAction()
    {
        $em = $this->getDoctrine()->getManager();
        $products = $em->getRepository(Product::class)->findAll();

        $startDate = new \Datetime('04-01');
        $endDate = new \Datetime('05-28');
        $now = new \Datetime();

        $isTerm = ($now >= $startDate $$ $now <= $endData);

        return $this->render('test/index.html.twig', [
            'products' => $products,
            'isTerm' => $isTerm
        ];      
    }
```

このようにあるコントローラーに対して特定の期間内に属するかどうかの判定を記述した一番簡単な例です。

# コントローラー内にドメインロジックを実装する問題点
シンフォニーは MVCアーキテクチャに基づいていて、

### モデル
アプリケーションが処理する情報ビジネスロジックを表す
### ビュー
モデルの情報を Web ページにレンダリングするための機能を提供
### コントローラー
ユーザーのアクションを受け取りモデル柳生の変更を適切に行う

これら三つで構成されている。

特定の期間内かどうかは、ドメイン知識つまりビジネスロジックに相当する。
コントローラーの責務として URL をマッピングしリクエストおよびレスポンスをハンドリングすることでありドメイン知識には関心がない。

それなのにコントローラー側にビジネスロジックが入っていることは責務の観点から問題がある。

さらには特定の期間かどうかを判定するロジックは他の場所でも使う可能性が高く、コントローラ側にベタ書きしているともし変更があった時に変更し忘れなどの問題が発生する可能性もある。

この問題をサービスコンテナの実装でコントローラーからロジックを抜き出して書くことで疎結合が実現できかつテストがしやすくなるというメリットを享受できる。

参考文献
[サービスコンテナを実装する](https://qiita.com/azukiazusa/items/a0f01dc6317862aefbd2)
[symfony のコードを探求する](https://symfony.com/legacy/doc/gentle-introduction/1_4/ja/02-exploring-symfony-s-code)
Storybook 内の時間を固定して無駄なスナップショット差分を減らそう！

# 困ったこと
ユニークビジョンのプロダクトのフロントエンドは、[Chromatic](https://www.chromatic.com/) で Storybook のスナップショット差分をレビューしています。
現在時刻に依存しているコンポーネントがある場合、時刻が少しでも変化してしまうと、スナップショット差分として検出されるという問題がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474068/4df0303f-169a-83dd-1221-170c8ada92e6.png)

やや見づらいですが、右の時刻部分に緑色で差分が表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474068/ee621087-8a36-8310-521e-e2d20ceeb5ba.png)

このようなコンポーネントが十数個あり、毎回差分として検出されるため、**本来見たい差分が見づらい状況になっていました。**

# 解決方法
Storybook 内の時間を [MockDate](https://github.com/boblauer/MockDate) というライブラリを使って固定することで解決しました。

```bash
yarn add -D mockdate
```

https://github.com/boblauer/MockDate

Storybook 側の設定は簡単です。

```preview.js
import MockDate from 'mockdate'

MockDate.set(new Date('2022-12-15T00:00:00'));
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474068/963bc54c-fa7e-e9f4-53c6-cf89b383d270.png)


解決！

# 追記
## 日付操作系のライブラリとの相性
`date-fns` や `dayjs` でも使えるの？という疑問があったので、調査しました。

結果はどちらも期待通りで、**固定した時間で動作しました。**

```ts
// date-fns
startOfTomorrow() // -> Fri Dec 16 2022 00:00:00 GMT+0900 (日本標準時)

// dayjs
dayjs().toDate() // -> Fri Dec 15 2022 00:00:00 GMT+0900 (日本標準時)

```

## 相性の悪いライブラリ
[vue-chartjs](https://vue-chartjs.org/guide/) というグラフ表示ライブラリは、mockdate を使っていると storybook 上で表示されたりされなかったりする、という不具合が生じてしまいました。原因は不明ですが、**一部のライブラリはこのように上手く動作しない可能性があるので注意してください。**

https://vue-chartjs.org/guide/
確認テスト基礎編 1.12 (標準) 最尤推定量の漸近正規性，t検定

## 答案

- (a) 線形回帰モデルの誤差項が正規分布する，という仮定から，パラメータを最尤推定する．
- (b) sigma^2が未知なのでsigma^2を一致推定してt分布を作る．
- (c) √3やt分布の分位点など，提示されていない情報があるため無理．

## 答案

![確認テスト 基礎編1-27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/a022ad50-7a48-a343-5a0e-b4bdd2d93952.jpeg)

![確認テスト 基礎編1-28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/52f3f194-1894-11da-1425-bb7da0e911aa.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
確認テスト基礎編 1.11 (易) 確率変数の和の平均，分散

## 方針

ラグランジュの未定乗数法によって条件付き最小化問題を解く．得られた不偏推定量がCR下限を達成していることを確かめると良い練習になる．

## 答案

![確認テスト 基礎編1-25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/2f91980f-6670-4517-abac-b9a5603ab9fc.jpeg)
![確認テスト 基礎編1-26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/ed81b3d0-f994-f5aa-875f-eb014035b9ad.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
確認テスト基礎編 1.10 (標準) 最尤推定量の評価

## 方針

- (a) 標本平均の期待値と分散を求める．
- (b) 指数分布がガンマ分布であること，ガンマ分布が再生性を持つこと，ガンマ分布がカイ二乗分布であることを用いる．これらは[7.7](https://qiita.com/ut-tokei/items/ca1e5480e2847deebc3c)の補足説明で言及した．
- (c) デルタ法を利用する．

## 答案

![確認テスト 基礎編1-24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/97541ffa-5e79-f4a4-0e6a-f4a876117e38.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
python3 ベクトルの基本

# ベクトルとは
ベクトルとは以下のように()の中に縦に数を配置したものです。
```math
v =
\begin{pmatrix}
1\\
2\\
3\\
\end{pmatrix}
```
()内に入っている数字を成分と呼びます。ベクトルで縦に並べた数の個数を次元と呼びます。上のベクトルだと数が３つ並んでいるので三次元ベクトルです。
# ベクトルの足し算 引き算 掛け算
ベクトルの足し算引き算掛け算は以下のように次元が等しい場合のみでき、成分どうしを足し合わせるだけです。
```math
v =
\begin{pmatrix}
1\\
2\\
3\\
\end{pmatrix}
u = 
\begin{pmatrix}
5\\
6\\
7\\
\end{pmatrix}
```
```math
v + u =
\begin{pmatrix}
1 + 5\\
2 + 6\\
3 + 7\\
\end{pmatrix}
```
これをnumpyを使ってやってみたいと思います。
```python
import numpy as np

v = np.array([1,2,3])
u = np.array([5,6,7])　#　ベクトルを作成
v1 = v + u　#　ベクトルの足し算
print(v1)
```
出力
```
[ 6  8 10]
```
# ベクトルのスカラー倍
ベクトルに対して通常の数をスカラーと言います。スカラーをkと置いてベクトルとかけると以下のようになります。
```math

v =
\begin{pmatrix}
1\\
2\\
3\\
\end{pmatrix}
kv =
\begin{pmatrix}
k1\\
k2\\
k3\\
\end{pmatrix}
```
これをコードで書くと以下のようになります
```python
import numpy as np

v = np.array([1,2,3])
v1 = v * 3
print(v1)
```
出力
```
[3 6 9]
```
確認テスト基礎編 1.9 (標準) デルタ法 

## 方針

(a),(b)はデルタ法の典型問題．(c)は関数gが0になってしまいデルタ法が使えないので，二階微分して近似する．[5.12](https://qiita.com/ut-tokei/items/4623974207bbe3e229ca)で書いたデルタ法の証明方法と同じ考え方．

## 答案

![確認テスト 基礎編1-22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/0815826e-6764-f24e-8bb8-7113e82547c4.jpeg)
![確認テスト 基礎編1-23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/c5d35fba-8ce1-2518-1089-51e1e836de03.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
seabornのpaletteの作り方・使い方

作成日：20220725
言語：Python


# 環境
Python 3.6.10 :: Anaconda, Inc.
seaborn 0.10.1

# パレットの作成

パレットはリスト。リストの各要素は色の名前（blue、redなど）もしくはその色のRGB値。

```python:
import seaborn as sns
palette = sns.color_palette("RdPu",4) #パレット名、色の数を指定
sns.palplot(palette)
```

![palette.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1056016/d0395fd2-7362-f980-51d8-b01713b2362d.jpeg)

```python:
print(palette)
```

で見てみると、RGBの値を指定した3要素のtupple（これで1色）が入ったリストになっている。今回は4色のパレットなので、リストの中にはtuppleが4つ入っている。

```python:
[(0.9898039215686275, 0.8149019607843138, 0.7984313725490196), (0.9780392156862745, 0.5803921568627451, 0.6941176470588235), (0.8870588235294118, 0.24470588235294116, 0.6), (0.6007843137254902, 0.00392156862745098, 0.4831372549019608)]```
```

色を直接指定したリストを作っても良い。
```python:
palette = ["red", "orange", "yellow", "green"]
sns.palplot(palette); plt.savefig('palette2.jpg')
```

![palette2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1056016/1df417a5-b37c-bfd5-7915-79d026ace520.jpeg)


```python:
print(palette)
```
の出力は当然のことながら次のようになる。

```python:
['red', 'orange', 'yellow', 'green']
```

詳しい使い方は下のリンクを参考のこと。


# 参考リンク

1. paletteの使い方について
https://qiita.com/SaitoTsutomu/items/c79c9973a92e1e2c77a7 Qiitaの日本語記事
http://seaborn.pydata.org/tutorial/color_palettes.html seabornのtutorial

2. 選べるパレット名一覧 （※パレット名はmatplotlibのcolormapから取ってきている）
https://matplotlib.org/stable/tutorials/colors/colormaps.html matplotlibのtutorialより

3. この他にも、自分の好きな色を1つ選んでグラデーションのパレットを作れたりする。
http://seaborn.pydata.org/tutorial/color_palettes.html#custom-sequential-palettes seabornのtutorialの"custom sequencial palettes"のセクションより
確認テスト基礎編 1.8 (難) 標本平均と標本分散

## 方針

- (a)(1),(2)はVからカイ二乗分布に従う確率変数が作れるので，そこから期待値を計算する．カイ二乗分布については[3.18](https://qiita.com/ut-tokei/items/60b4fc91eaf9db0c1b44)参照．(3)はTがt分布に従うことから期待値を[5.2](https://qiita.com/ut-tokei/items/9b2c31dd9062c4339852)と同様に求めた．(4)の共分散は，標本平均と標本分散が独立に分布することから期待値を積に分離することで求められる．標本平均と標本分散の独立性については，Hermart行列によって非常に綺麗に証明することができる．
- (b) (5)はカイ二乗分布そのままの形なので期待値が求まる．(6)は分母と分子が独立でないので(4)の様に求めることはできない．そこで，分母を二つの独立なカイ二乗分布に従う期待値に分解して，ベータ分布を導出する要領で期待値を求める．これは[4.14](https://qiita.com/ut-tokei/items/657fd6f243fc15c55bd6)で扱った．

## 答案

![確認テスト 基礎編1-17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/df32bff6-e8e6-43ee-29c7-29addafebdc0.jpeg)
![確認テスト 基礎編1-18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/5e39f7f9-3448-afe8-318b-16339452e2f7.jpeg)
![確認テスト 基礎編1-19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/3ad7ed87-9f87-1b30-8666-1d7cd27f657c.jpeg)
![確認テスト 基礎編1-20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/7e3fff83-5070-0de0-69e3-615704ca742f.jpeg)
![確認テスト 基礎編1-21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/46246012-8911-8921-38c7-173834ea8b26.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
確認テスト基礎編 1.7 (易) 確率変数の和の平均，分散

## 方針

類題は[4.2](https://qiita.com/ut-tokei/items/67676ac308d5ecf2e256)

## 答案

![確認テスト 基礎編1-16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/b4418bde-047f-b3a6-8b29-9ec82af1530b.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
確認テスト基礎編 1.6 (標準) 二次元確率変数

## 方針

(1)は全確率1になるように正規化定数Cを定める．(2),(3)は期待値と共分散を求める．答案では周辺分布を定義通り周辺化によって求めているが，今回は同時密度が積の形になっているためX，Yが独立であること，さらに同時密度の中にxが存在せず0<x<1であるためXが一様分布に従うことが分かるので，より簡単に周辺分布が得られる．共分散に関しても，独立性より0としても良い．(4)は分位点を求める問題．上側確率が0.25になるような点をalphaと置いて，積分により方程式を作る．

## 答案

![確認テスト 基礎編1-14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/0b659614-cbe5-832c-066a-e5d97d22222e.jpeg)
![確認テスト 基礎編1-15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/90bc6270-bd68-01e5-4527-a08b545f2d92.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Tauriでデスクトップアプリを開発する

## 概要

Tauriでアプリのひな形を作成して実行、ビルドするまでの手順をまとめました。

## Tauriとは

Web技術とRustでデスクトップアプリを開発するためのフレームワークです。
Electronの様にUI側(Renderer Process)とCore側(Main Process)で構成されています。
UI側はOSのWebiViewを用いて描画し、Core側はRustで記述します。
Electronと比較して以下の様な特徴があります。

* ChromiumやNode.jsを同梱しないためファイルサイズが小さい
* メモリ使用量が小さい
* Core側をRustで記述するため速度が早い

## 準備

Tauriでアプリケーションを開発するには以下のものが必要です。

* Rust
  https://www.rust-lang.org/tools/install

* Node.js
  `yarn`をインストールしておきます。

* 各種ビルドツール
  今回はWindowsで開発するので[Microsoft C++ Build Tools](https://visualstudio.microsoft.com/ja/visual-cpp-build-tools/)をインストールします。

## ひな形を作成

アプリケーションのひな形を作るには以下のコマンドを実行します。
実行すると対話形式で色々聞かれます。

```
$ yarn create tauri-app
```

アプリケーション名を入力します。

```
? What is your app name? tauri-sample
```

ウィンドウのタイトル名を入力します。

```
? What should the window title be? Tauri Sample
```

使用するフレームワークを選択します。
今回は`React`を使用するので`create-react-app`を選択します。

```
? What UI recipe would you like to add? create-react-app
```

`tauri-apps/api`を追加します。

```
? Add "@tauri-apps/api" npm package? (Y/n) Y
```

`create-react-app`のテンプレートを選択します。
ここでは`Typescript`を選択します。

```
? Which create-react-app template would you like to use? create-react-app (TypeScript)
```

少し待つとカレントフォルダに`tauri-sample`フォルダが作成されます。

## 実行

`tauri-sample`フォルダの直下で以下のコマンドを実行します。

```
$ yarn tauri dev
```

アプリケーションが起動しました。

![react.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2693350/693446fa-0f31-7049-660a-8bf3e2dbced9.png)

## ビルド

実行ファイルとインストーラーを作成するには以下のコマンドを実行します。

```
$ yarn tauri build
```

すると以下のエラーが発生します。

```
yarn run v1.22.19
warning ..\..\..\package.json: No license field
$ tauri build
       Error You must change the bundle identifier in `tauri.conf.json > tauri > bundle > identifier`. The default value `com.tauri.dev` is not allowed as it must be unique across applications.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

`src-tauri/tauri.conf.json`内の`identifier`の値を修正する必要があるようです。
適当な値に書き換えて再度コマンドを実行します。
ビルドが完了すると実行ファイルが`src-tauri/target/release`に作られます。 

![exe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2693350/eda8c671-9ba0-fd61-a0df-67d0962997de.png)

インストーラーは`src-tauri/target/release/bundle/msi`に作られます。

![msi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2693350/580af4e1-0063-dabb-7f8b-3e6f39a0600d.png)

## 終わりに

難しい所は特にありませんでしたが、初回の実行やビルドは結構時間がかかりました。
まだTauriの日本語記事は少ないですが今後流行るかもしれないので
Rustの勉強も兼ねて色々調べていこうと思います。

## 参考文献

https://tauri.app/

https://github.com/tauri-apps/tauri

https://zenn.dev/kumassy/books/6e518fe09a86b2
確認テスト基礎編 1.5 (標準) 幾何分布，指数分布

## 方針

- (a) (1)は，確率母関数を求めて，これを3階微分することで3次階乗モーメントを求める．確率母関数については[2.11](https://qiita.com/ut-tokei/items/1cb6d840b24f047b0383)を参照．(2)はハザード関数を導出するのと同じ要領で条件付き確率を書き下す．ハザード関数については[3.5](https://qiita.com/ut-tokei/items/adf7a39955d419cd720f)を参照．
- (b) (3),(4)は期待値を定義通り計算する．lambda=1の指数分布なので期待値はガンマ関数の形になる．(5)は変数変換の問題．変数変換はまず分布関数から考える．分布関数ができたらそれを微分することで確率密度関数を求める．類題は[2.9](https://qiita.com/ut-tokei/items/f8acc154a93b0a979685)など．

## 答案

![確認テスト 基礎編1-11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/afffa6e9-1f99-9673-49b0-d85e5dbd3c43.jpeg)
![確認テスト 基礎編1-12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/24349847-b862-6c73-5e33-b61814b0800b.jpeg)
![確認テスト 基礎編1-13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/c9171a0e-a8db-dde4-cf0b-1a902ddfed12.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Ubuntu 18.04 でwifiを認識しなくなったときの対処

参考：https://qiita.com/dego_96/items/fb097b1226e4f1c5c578


sudo update をさぼると、ドライバが最新のカーネルに対応しなくなる。以下のリンクから、自分のwifiに対応するドライバをダウンロードして、/lib/firmwareにmvすればOK。

https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/


どのWifiカードがどのドライバに対応するかは以下で確認する。

https://www.intel.co.jp/content/www/jp/ja/support/articles/000005511/wireless.html

自分の場合はインテル® Wi-Fi 6 AX200 (160MHz)だった。Ubuntuのターミナルからはわからなかったので、Windowsから確認した。lspci でも確認できるかもしれない（が自分はわからなかった）。
確認テスト基礎編 1.4 (標準) モーメントの計算

## 方針

- (a) P[X<=x]が与えられているので，確率関数P[X=x]を求めて期待値を計算する．[2.6](https://qiita.com/ut-tokei/items/46f75d506f9a1bd44fe3)で導出した非負離散確率変数の期待値の求め方を使っても良い．
- (b) 分布関数が与えられているので，これを微分することで密度関数を求めて期待値を計算する．[2.7](https://qiita.com/ut-tokei/items/54259c7cd5b549bfd3b8)で導出した連続確率変数の期待値と分布関数の関係を使っても良い．
- (c) 分布関数の逆関数が与えられているので，分布関数を求めてから(b)と同様に期待値を計算する．
- (d) 積率母関数が与えられているので，これを3階微分してt=0を代入することで3次モーメントを計算する．積率母関数については[2.10](https://qiita.com/ut-tokei/items/3dc74550b3f7bb5cd3f2)を参照．

## 答案

![確認テスト 基礎編1-7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/77529aa4-67dd-7f34-0423-84f506b4de24.jpeg)
![確認テスト 基礎編1-8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/18790725-1b9b-0cd4-ee48-967f2351529c.jpeg)
![確認テスト 基礎編1-9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/fc132271-b1ad-e10e-5c9a-2a6f3e52c053.jpeg)
![確認テスト 基礎編1-10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/8967b07e-c6db-90fd-cd59-8a9c435a6b45.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
確認テスト基礎編 1.3 (標準) 期待値と分散

## 方針

- (a) 二項分布の期待値，分散から連立方程式を解く．類題ではないが，二項分布は[3.8](https://qiita.com/ut-tokei/items/988b5397630be8b3e9c0)で扱った．
- (b) 負の二項分布の期待値，分散から連立方程式を解く．期待値，分散を覚えていないと時間がかかってしまうので覚えていなければ飛ばすべき問題．負の二項分布は[3.7](https://qiita.com/ut-tokei/items/aa197ffe97986ce2db37)で扱った．
- (c) ポアソン分布の四次階乗モーメントを確率母関数を使って求める．確率母関数は[2.11](https://qiita.com/ut-tokei/items/1cb6d840b24f047b0383)で扱った．
- (d) 中心極限定理 (CLT) を使って二項分布に従う確率変数が収束する分布を求める．X/nとは，Ber(p)に従う確率変数の標本平均であるからCLTを適用できる．[3.8](https://qiita.com/ut-tokei/items/988b5397630be8b3e9c0)では，CLTを使わずに二項分布の漸近正規性を導出した．
- (e) 指数分布に従う確率変数XのシーリングをYとすると，Yは幾何分布に従うことを使う．幾何分布の形が見えなくても期待値が導出できるよう補足を書いた．類題は[3.6](https://qiita.com/ut-tokei/items/bc84cbc06140083d3000)．

## 答案


![確認テスト 基礎編1-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/1567387b-ccc8-d212-67ee-cbfe78b6626a.jpeg)
![確認テスト 基礎編1-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/99706c80-63fb-bc9b-91ab-751582cb89ff.jpeg)
![確認テスト 基礎編1-5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/9638649c-18d5-64a9-5962-afefe6bddb42.jpeg)
![確認テスト 基礎編1-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/e4f65eab-cfde-5af4-1a4e-1bca7cac14d8.jpeg)


## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
確認テスト基礎編 1.2 (易) 分布関数，密度関数の定義

## 方針

全確率1になるように正規化定数を求める問題．類題は[2.1](https://qiita.com/ut-tokei/items/b1c31c29443ffca8ad8c)．

## 答案

![確認テスト 基礎編1-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/b1e516ce-4cf2-d73e-9142-c0430cc2afa7.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Elixirにて機械学習／ディープラーニングするためのライブラリ ＆ ツール

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

Elixirにて機械学習／ディープラーニングするためのライブラリ ＆ ツールをここにまとめておきます

# 「Livebook」…Web上でのElixir開発環境

https://github.com/livebook-dev/livebook

- JupyterNotebookやColaboratoryと同じフィーリングの開発がElixirでも叶いました
- Livebook専用のレンダラー「Kino」も、画像／グラフ／データテーブルがとても扱いやすいです
  - https://github.com/livebook-dev/kino
- Livebook専用のグラフハンドラ「VegaLite」は、データを投入するとグラフ描画してくれます
  - https://github.com/livebook-dev/vega_lite
- これまでElixirのことを知らなかった層からもLivebookのおかげで注目が集まると思います

# 「Nx」…行列操作

https://github.com/elixir-nx/nx

- Elixirに行列ライブラリが初お目見えし、GPU駆動のための環境がElixirに整いました
- これらを土台とした機械学習／ディープラーニング環境が遂にElixirでも実現されます
- Pythonで言うところのNumPyに相当

# 「EXLA」「TorchX」…GPU駆動のためのバックエンド

https://github.com/elixir-nx/nx/tree/main/exla

https://github.com/elixir-nx/nx/tree/main/torchx

- NxでXLAもしくはLibTorchを駆動するためのライブラリ
- これらを通じて、ElixirはGPUを利用可能となります（CPU駆動も可能）

# 「Axon」…ニューラルネットワーク

https://github.com/elixir-nx/axon

- Nxをベースにニューラルネットワークが扱えます
- Pythonで言うところのTensorFlow／KerasやPyTorchに相当

# 「AxonOnnx」…Onnxモデルをハンドリング

https://github.com/elixir-nx/axon_onnx

- ElixirでもPython同様、Onnxモデルをロードし、利用することができます

# 「Explorer」…データフレームによるデータ変換／統計

https://github.com/elixir-nx/explorer

- データ変換や統計処理を行うためのライブラリ
- Pythonで言うところのpandasに相当

# 「Scidata」…データセットダウンローダ

https://github.com/elixir-nx/scidata

- 機械学習／ディープラーニングで使うデータセットをダウンロードするためのライブラリ

# 「StbImage」…画像加工

https://github.com/elixir-nx/stb_image

- 画像のリサイズやgif化を行うためのライブラリ
- OpenCVのミニマム版＋Nx連携が入ったもの

# 主催／運営しているElixirコミュニティ紹介

[**1. ElixirImp** : A place to LOVE the buds in Elixir (Elixir実装の芽を愛でる場)
**2. fukuoka.ex** : Fukuoka local Elixir Community (福岡Elixirコミュニティ)
**3. kokura.ex** : Kokura local Elixir Community (小倉Elixirコミュニティ)](https://fukuokaex.connpass.com)

https://fukuokaex.connpass.com

[**4. LiveView JP** : A place to mob-program in LiveView, LiveBook+Nx+Axon, and elixir-desktop](https://liveviewjp.connpass.com)

https://liveviewjp.connpass.com

[**5. Neos.ex** : A place to connecting Elixir and NeosVR to create a new world](https://elixirjp.slack.com/archives/C02J9C12VMF)

## :ocean::ocean::ocean: Elixir生誕10周年を祝い、"Elixirの現在" に追いつける :ocean::ocean::ocean:

Elixir界隈に激震をもたらした2021年の大変動を活用するコラム群を日々アップデートしています

https://qiita.com/piacerex/items/e5590fa287d3c89eeebf

# p.s.このコラムが、面白かったり、役に立ったら…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/67568d54-6584-ad33-77c7-b3b3afe70287.png) や ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/f5b819ef-d655-ef72-294c-b1a9d2c5b563.png) にて、どうぞ応援よろしくお願いします:bow
確認テスト基礎編 1.1 (易) 条件付き確率の典型問題

## 方針

類題は[1.5](https://qiita.com/ut-tokei/items/83297ec6bb5093753951)．

## 答案

![確認テスト 基礎編1-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/0928cf6b-d8b1-4eee-3759-1a529e5e5b2d.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
「対称式a+b+c(Symmetric polynomial)」についてwolframalphaとsympyで調べた。


### wikipediaで

https://ja.wikipedia.org/wiki/%E5%AF%BE%E7%A7%B0%E5%BC%8F

https://en.wikipedia.org/wiki/Symmetric_polynomial

### WolframAlphaで
初等対称多項式の和として対称多項式を書く：

https://reference.wolfram.com/language/ref/SymmetricReduction.html

以下は,wolframでできました。

https://www.wolframalpha.com/input?i=SymmetricReduction%5B+a2%2Bb2%2Bc2%2C%7Ba%2Cb%2Cc%7D%5D&lang=ja

結果 {(a + b + c)^2 - 2 (a b + a c + b c), 0}

### sympyで

Rewrite a polynomial in terms of elementary symmetric polynomials.

https://lidavidm.github.io/sympy/_modules/sympy/polys/polyfuncs.html

https://docs.sympy.org/latest/modules/polys/reference.html#sympy.polys.polyfuncs.symmetrize

sympy.polys.polyfuncs.symmetrize(F, *gens, **args)

https://docs.sympy.org/latest/modules/polys/reference.html#sympy.polys.polyfuncs.symmetrize

# sympyでsymmetrizeを調べた。

以下、汎用性はありません。
```python
from sympy import *
var('x,y'  ,real=True)
var('s1,s2',real=True)
eq=Eq(x**3-x*y+y**3,1)
print("#",           eq.lhs )
print("#",symmetrize(eq.lhs))
print("#",symmetrize(eq.lhs,formal=True))
s=symmetrize(eq.lhs,formal=True)
print("#0  ",s[0])
print("#1  ",s[1])
print("#2  ",s[2])
print("#20 ",s[2][0])
print("#21 ",s[2][1])
print("#200",s[2][0][0])
print("#201",s[2][0][1])
print("#210",s[2][1][0])
print("#211",s[2][1][1])
print()
def mySymmetrize(myLhs):
    s=symmetrize(myLhs,formal=True)
    mySubs={s[2][0][0]:s[2][0][1],s[2][1][0]:s[2][1][1]}
    return s[0].subs(mySubs).expand()
print("#",mySymmetrize(eq.lhs))

# x**3 - x*y + y**3
# (-3*x*y*(x + y) - x*y + (x + y)**3, 0)
# (s1**3 - 3*s1*s2 - s2, 0, [(s1, x + y), (s2, x*y)])
#0   s1**3 - 3*s1*s2 - s2
#1   0
#2   [(s1, x + y), (s2, x*y)]
#20  (s1, x + y)
#21  (s2, x*y)
#200 s1
#201 x + y
#210 s2
#211 x*y

# x**3 - x*y + y**3
```

# 参考
#### 問題1
a+b+c,a^2+b^2+c^2

```python
var('a b c')
print("#",symmetrize(a**2+b**2+c**2))
# (-2*a*b - 2*a*c - 2*b*c + (a + b + c)**2, 0)
```
#### 問題2
a+b+c,a3+b3+c3-3abc


# 参考

https://qiita.com/mrrclb48z/items/21f1b743b4d05b6f30cd

# 未整理

https://brilliant.org/wiki/completing-the-square-multiple-variables/
間違えてmigrateした時の対処法について（初心者向け）

## 始めに
ポートフォリオ作成中に間違った`マイグレーションファイル`を`migrate`してしまった。
恐らく、今後も同じ様な失敗をすると考えられるため忘備録として記事にしました。

## そもそも`モデル`、`マイグレーションファイル`、`マイグレーション`とは
|単語|意味|
|:-:|:-:|
|__Model__ (名)|_(服装品・自動車などの)…型、雛形_   |
|__migration__ (名)|_移住、転住、渡り、移住者群、移動する動物の群_   |
|__migrate__ (動)|_(…へ)移住する、定期的に(…に)移動する、渡る_   |
|__マイグレーションファイル__|_データベースの更新処理を行う設計図のようなもの。これをmigrateすれば、SQLを書かなくてもデータベースにテーブルが設計できる。_|


### つまり
 - `モデル`は __主に__ データベースのデータのやり取りを行う`機能`を担っている。
 - `マイグレーション`はSQLを書かなくてもデータベースの構造を操作できる`便利な機能`のこと。
 - その操作して`反映する作業`を`migrate`といい。
 - `マイグレーションファイル`は反映する内容が書いてある`設計図`ということになる。

### 私が今回失敗した内容は
誤った設計図（`マイグレーションファイル`）を渡してしまい、反映（`migrate`）してしまった。

## ここから修正方法

### まずは現状の把握
`rails db:version`とコマンド入力します。
```:ターミナル
rails db:version

Running via Spring preloader in process 24830
Current version: 20220725031230
```
すると`Current version: 20220725031230`:現在のバージョンは日時、と表示されます。

### 巻き戻そう
次に反映した状況を __一つ前の状態__ に巻き戻します`rails db:rollback`
```:ターミナル
rails db:rollback

rails db:rollbackRunning via Spring preloader in process 24982
== 20220725031230 ResetAllPostCacheCounters: reverting ========================
== 20220725031230 ResetAllPostCacheCounters: reverted (0.0051s) ===============
```
これで間違った設計図を反映する前の状態に巻き戻せたはずです。
状況を確認するために以下のコマンドを入力します
```:ターミナル
rails db:abort_if_pending_migrations　　　(もし保留中の設計図がある場合は中止する)

You have 1 pending migration:
  20220725031230 ResetAllPostCacheCounters
Run `bin/rails db:migrate` to update your database then try again.
```
以下翻訳
`1件のマイグレーションが保留されています。
  20220725031230 ResetAllPostCacheCounters　←(ミスった設計図)bin/rails db:migrate　を実行してデータベースを更新してから、もう一度試してみてください。`

### これでどうなった、、、
現状確認の結果、`rails db:rollback`で`反映`状況が一つ巻き戻され、先ほどの誤った設計図は保留中となっている様です。

間違って渡してしまった設計図：マイグレーションファイルの中身を修正して反映させて作業は完了となります。
お疲れ様でした。

### おわり
QGISで都道府県堺のみのポリゴンをつくる

国土数値情報からDLしたデータだと細かい行政区域のデータが表示される。
これをQGIS都道府県堺のみにしたい。

https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-v3_1.html#prefecture00

1. まずうえのサイトに飛んで全国のshapeファイルをDLする。
1. そのあとQGISでshapeファイルを開く。
1. メニューバーのベクタから空間演算ツール > 融合を選択する。
1. 入力レイヤを最初に読み込んだ全国の細かい行政区域が書かれたレイヤにする。
1. もし使いまわせるようにしたいなら融合ポリゴンの出力にファイル名を書くと出力される。
1. 基準となる属性は「NAME_1」にする。
1. 実行をクリック。

おわり
M1MacでDockerのMySQL5.7が使えない

備忘録

## 修正内容

- linux/amd64に対応しているimageをdockethubから探して変更
- MySQL接続エラー対応でMYSQL_ROOT_HOST変数を追加

## docker-compose.ymlの修正

#### 修正前

```
services:
  db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=1
```

#### 修正後

```
services:
  db:
    image: mysql/mysql-server:5.7
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=1
      - MYSQL_ROOT_HOST=%
```
テスト用に任意の処理をするWebサーバをpythonで書く

# 概要
検証用途などで何かしら好きな処理をさせるWebサーバの作り方をちょくちょく忘れるので、備忘録として書いておく。

# 基本形
基本的な任意の処理をするWebサーバは以下のように書く。
```python
import http.server

def run(server_address=('',8080), server_class=http.server.HTTPServer, handler_class=http.server.BaseHTTPRequestHandler):
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()

class MyHTTPRequestHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        """任意の処理を書く"""

if __name__ == "__main__":
    run(handler_class=MyHTTPRequestHandler)
```
HTTPServer Classの第一引数に使用するアドレスとポートのタプル、第二引数にリクエストのハンドラを指定して、`serve_forever`関数を起動する。
リクエストのハンドラは`BaseHTTPRequestHandler`クラスのサブクラスとして実装する。このままだとなんのリクエストも処理しないので、GETリクエストを処理させたい場合は`do_GET`関数を定義する。

# マルチスレッド
上記のサーバはシングルスレッドで、同時に複数のリクエストを処理できない。同時に複数のリクエストを処理するマルチスレッドのWebサーバを立てたい場合は、以下のようにする(要python 3.7以上)。
```python
import http.server

def run(server_address=('',8080), server_class=http.server.HTTPServer, handler_class=http.server.BaseHTTPRequestHandler):
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()

class MyHTTPRequestHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        """任意の処理を書く"""

if __name__ == "__main__":
    run(server_class=http.server.ThreadingHTTPServer, handler_class=MyHTTPRequestHandler)
```
使用するサーバのクラスをHTTPServerからThreadingHTTPServerに変更する。中身はThreadingMixInなので従来と大して変わらない。
メモリの分類

# メモリ
メモリの役割は書類を拡げる机みたいなものだ。
机の広さが、メモリの容量とイコールになってる。
大きい方が一度にたくさん扱えて効率が良い。
しかし逆だと扱えるものが少なくなるので効率は悪くなる。
このようなメモリの種類を```RAM```と言う。
```RAMは中身を読み込んだり書いたりできる。``` ```電源を切れたら内容を忘れる。```
この他の大部類として、```ROM```と言う種類がある。
```中身を読めるけど書くことが出来ない。``` ```電鍵切っても内容を忘れたりしない。```

## RAM(Random Access Memory)
```読み書きが自由にできる```と言う特徴を持ちますが、その中身は```電源を切ると消去されて後に残りません。```

## ROM(Read Only Memory)
```決められた動作を行うだけの特定用途向け```コンピュータに使われる。
電源の状態に関係なく消えることありません。この性質を```不揮発性```と呼ぶ。

# RAMの種類いろいろ
主記憶装置に使われるDRAMとキャッシュメモリに使われるSRAMの２種類ある。
## DRAM(Dynamic RAM)
* 使用する回路は```コンデンサ```
* ```リフレッシュ動作は必要```
* 速度は```低速```
* ```集積度は高い```
* 価格は```安価```
* 主な用途は```主記憶装置```

## SRAM(Static RAM)
* 使用する回路は```フリップフロップ回路```
* ```リフレッシュ動作は不要```
* 速度は```高速```
* ```集積度は低い```
* 価格は```高価```
* 主な用途は```キャッシュメモリ```

# ROMの種類いろいろ
```読み出しだけ```のメモリのこと。
しかし専用の機器を使うと記憶内容の消去と書き込みができる```PROM```と言う種類がある。
例えばデジタルカメラに使われてるSDカードはPROMの```フラッシュメモリ```と呼ばれている。

## マスクROM
```読み出し専用```のメモリ。　```製造時にデータの書き込み```、以降は内容を```書き換えることが出来ません。```

## PROM（Programmmable ROM)
```プログラマブル```なROM。
ユーザーの手で書き換えることができるROM。

### 疑問　プログラマブルとは？
* ```ソフトウェアプログラムによって、一連の作業指示を与えられる```こと。固定的なロジックだけでなく、ソフトウェアプログラムによって動作を制御できるハードウェアデバイス、あるいはマクロなどによって一連の作業指示を与えられるアプリケーションなどは「プログラマブル」であると言われる。
出典 https://kotobank.jp/word/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%96%E3%83%AB-10839
* 装置やソフトウェア、システムなどの動作を```利用者が必要に応じて変更したり自動化したりできる```こと。特に、ひとまとまりの処理手順などを一定の形式で記述したプログラムにより、動作の指示をまとめて行なうことができること。
出典　https://e-words.jp/w/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%96%E3%83%AB.html#:~:text=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%96%E3%83%AB%E3%81%A8%E3%81%AF%E3%80%81%E8%A3%85%E7%BD%AE%E3%82%84,%E3%81%A6%E8%A1%8C%E3%81%AA%E3%81%86%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A8%E3%80%82

### EPROM(Erasable PROM)とは？
```紫外線```でデータを消去して書き換えることができる。

### EEPROM(Electrically EPROM)とは？
* ```電気的```にデータを消去して書き換える
* ```読み出し専用のROM```
* ```バイト単位でデータ消去```を行う。
* ```電気的に一括または一部分を消去```することで書き換えができる。

### フラッシュメモリ
EEPROMを改良したもの。
全消去ではなく、```ブロック単位```でデータを消去して書き換える。

## 問題を解いた時の気づき
* 周期的にデータの再書き込みが必要と書いてあった。周期的と定期的は同じ意味なんだな。気をつけよう。

# 出典 
https://gihyo.jp/book/2020/978-4-297-11781-8

https://gihyo.jp/book/2022/978-4-297-12375-8
Google Colab で7つの全文検索を試した結果

[![Github](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1646184/0e201e0c-e21f-a715-4353-142b23059ccd.png)](https://github.com/saliton) 

>ご覧いただきありがとうございます。
>過去の記事も含め、全てのコードを[Github](https://github.com/saliton)で公開しています。

これまで全文検索について７つのシステムを検証してきました。

* [Colabで全文検索（その１：MySQL編）](https://qiita.com/saliton/items/ab5632c6b3bbb79009b5)
* [Colabで全文検索（その２：PostgreSQL編）](https://qiita.com/saliton/items/9f6ed62c965945887672)
* [Colabで全文検索（その３：Groonga編）](https://qiita.com/saliton/items/cdd28f2ee18388b36fc4)
* [Colabで全文検索（その４：Mroonga編）](https://qiita.com/saliton/items/3ab5b602bc7cb4baee60)
* [Colabで全文検索（その５：PGroonga編）](https://qiita.com/saliton/items/4c630e4b5fbc5e122b9b)
* [Colabで全文検索（その６：ElasticSearch編）](https://qiita.com/saliton/items/3b5b10e81341628fed10)
* [Colabで全文検索（その７：RediSearch編）](https://qiita.com/saliton/items/ff77f8405ca494a4f8f3)

今回、検証結果を簡単にまとめます。

使用したのは、日本語wikiから取得した50万件です。検索は「日本語」を含むレコードを取得しました。検索結果の件数は17006件です。IO待ちを含めた処理時間を知りたいので、以下の時間はセルの実行のWall timeです。検索についてはキャッシュの可能性を考慮して2回測定しましたが、1回目でキャッシュが効いていない保証はありません。1回目と2回目が同等の場合、キャッシュが効いていたと見なすべきでしょう。時間の単位は秒です。

| システム |索引| 登録 |索引作成| 検索1回目 | 検索2回目|
|:-------|:----:|----:|-----:|-----:|-----:|
|MySQL |なし| 605 |-| 13.6 | 13.7 |
|MySQL |あり| 605| 3215| 8.1| 7.7|
|PostgreSQL|なし| 579|-| 17.8| 14.3 |
|PostgreSQL|あり| 579| 880| 9.3| 9.3 |
|Groonga|なし|400|-|29.8|29.1|
|Groonga|あり|400|413|1.7|1.7|
|Mroonga|なし|>|2599|11.3|11.1|
|Mroonga|あり|>|2599|4.3|4.2|
|PGroonga|なし|617|-|42.5|43.6|
|PGroonga|あり|617|429|10.6|10.3|
|ElasticSearch|あり|>|844|7.5|4.0|
|RediSearch|あり|>|795|1.3|1.2|

今回の検証ではRediSearchが最速でした。Groongaがそれに続いています。MySQLとMroongaは索引作成が非常に遅いことも分かりました。見過ごされがちですが、索引のデータが頻繁に変更される用途では登録の時間も重要です。その点、RediSearchは索引付きの登録も検索も共に最速で非常に優秀です。オンメモリなので当然かもしれません。図らずもRediSearchの宣伝になってしまいましたが、回し者ではありませんので、悪しからず。
cscの作法 その255

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
httpプロトコルでレスポンスヘッダーを獲れ。


# 方針

- webclient使う
- タイムアウトを待つ
- ResponseHeaders使う

# サンプルコード

```

using System.Collections;
using System.IO;
using System;
using System.Text;
using System.Net;

namespace app
{
	class test0 {
		static void Main() {
			ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
			WebClient wc = new WebClient();
			Console.WriteLine("30秒程度お待ちください");
			string response = wc.DownloadString("https://acme-v02.api.letsencrypt.org/acme/new-nonce");
			Console.WriteLine("ok1");
			WebHeaderCollection myWebHeaderCollection = wc.ResponseHeaders;
			for (int i = 0; i < myWebHeaderCollection.Count; i++)
				Console.WriteLine("\t" + myWebHeaderCollection.GetKey(i) + " = " + myWebHeaderCollection.Get(i));
			Console.WriteLine(myWebHeaderCollection["Replay-Nonce"]);
			Console.WriteLine("ok2");
		}
	}
}

```

# 実行結果

```
>none
30秒程度お待ちください
ok1
        Connection = keep-alive
        Link = <https://acme-v02.api.letsencrypt.org/directory>;rel="index"
        Replay-Nonce = 01027T2gQEp-oAvA56FrPXLBye2xDFKjaBEV8qYbFwogyws
        X-Frame-Options = DENY
        Strict-Transport-Security = max-age=604800
        Cache-Control = public, max-age=0, no-cache
        Date = Sun, 24 Jul 2022 23:06:17 GMT
        Server = nginx
01027T2gQEp-oAvA56FrPXLBye2xDFKjaBEV8qYbFwogyws
ok2

>

```
以上。
代理ログイン

今日は代理ログインについて共有させていただきます。

まずはユーザのページを確認していただいて、編集の後ろに何もついてない状態です。
![截屏2022-07-25 11.08.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709131/7dfec021-965a-d98b-abbe-0302fb49e1d5.png)

クイック検索⇨セキュリティー⇨ログインアクセスポリシー⇨有効（チェック）⇨保存
![截屏2022-07-25 11.30.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709131/dcab5f96-c269-e097-9d6f-9ac256b82d78.png)

そしましたら、またユーザのページに戻りましょう。
![截屏2022-07-25 11.20.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709131/672984f5-ef5f-e9c7-760b-73c98ae36e62.png)
編集の後ろにログインがついてきました。
ログインを押していただいて、代理ログインのページに入りました。
![截屏2022-07-25 11.21.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709131/79ecf38a-6c84-08a1-ca74-b12f77e7f816.png)
Chatter Expertとしてログアウトが押せば、完全にログアウトされました。
![截屏2022-07-25 11.25.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709131/40e665fb-a999-da8b-4b57-00879a42f5cf.png)
もし大量のユーザがあれば、毎回ユーザ名とパスワードを入力するのはややこしいので、こういう問題はどうやって解決しましょうって聞かれる人が多いと思います。
解決方法：
セッションの設定」から[ユーザとしてログインしてから再ログインを強制する] の選択を解除することでユーザを切り替えながら表示を確認する、という作業の手間が少し軽減されるのではないかと思います。ぜひお試しください。
![截屏2022-07-25 11.31.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709131/33f7a153-23df-c3f6-deb0-f66026c55c35.png)
今日の共有は以上となります！
ありがとうございますた！