OmniAICreator/Qiita-1.07M huggingface dataset:
ArduinoUNOとWS2812B(160個、未定?)を単一の値で光らせる。(ON OFF あり)


x 割り込みを止めないと誤作動する
x NOP (ノップ?)やループでタイミングを取らずにダイレクト
x いちお、UNOの互換機である　水晶は、16Mが刺さっている

目的
ぞくに言う「テープLED」「NeoPixel」「5050」を光らせる
GPIOのテスト


![o_con20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5846899d-6a6e-9796-4716-a2b909dafd05.jpeg)




```c++



#define G0  0
#define R0  12
#define B0  0

char l[160*3]; //max160 led

//             12345678   12345678   12345678   12345678
int b8[8] = {0b10000000,0b01000000,0b00100000,0b00010000,
             0b00001000,0b00000100,0b00000010,0b00000001  };

//              76543210
#define on1   0b00100000
#define off1  0b00000000

// 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 
void bit_off1(){
  PORTB = on1;   PORTB = on1;  //2 0.33uS
  PORTB = off1;  PORTB = off1; //4
  PORTB = off1;  PORTB = off1; //6
  PORTB = off1;  PORTB = off1; //8
  PORTB = off1;  PORTB = off1; //2
  PORTB = off1;  PORTB = off1; //4
  PORTB = off1;  PORTB = off1; //6
  PORTB = off1;  PORTB = off1; //8
}//bit_off1

// 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
void bit_on1(){
  PORTB = on1;  PORTB = on1; //2
  PORTB = on1;  PORTB = on1; //4
  PORTB = on1;  PORTB = on1; //6
  PORTB = on1;  PORTB = on1; //8
  PORTB = on1;  PORTB = on1; //2
  PORTB = on1;  PORTB = on1; //4
  PORTB = on1;  PORTB = on1; //6
  PORTB = off1; PORTB = off1; //8 0.33uS
}//bit_on1

//RGB_LEDにデータをn回分送る
int ws_led(int num1)
{
  int on_off;

noInterrupts(); //割り込み禁止

  //num1で指定された分だけループする
  for(int ii=0;ii<num1;ii++){

    //8ビット分送る
    for(int jj=0;jj<8;jj++){

      on_off = l[ii] & b8[jj];

      if( on_off == 0 ){
        bit_off1(); //ビットが0
      } else {
        bit_on1(); //ビットが1 
      }//endif

    }//for 8bit

  }//for

interrupts(); //用が済んだらコンパイラさんにお知らせしましょう。

  return(0);
}//ws_led

//RGB_LEDに0データをn回分送る
int ws_led_cl(int num1)
{

noInterrupts(); //割り込み禁止

  //num1で指定された分だけループする
  for(int ii=0;ii<(num1*8);ii++){
    bit_off1(); //ビットが0
  }//for

interrupts(); //用が済んだらコンパイラさんにお知らせしましょう。

  return(0);
}//ws_led

void setup() {

  //GPIOの初期化
  pinMode(13, OUTPUT);
  pinMode(A0, INPUT_PULLUP);

  //状態を1づつ進める
  for(int ii=0;ii<160;ii++){

    //1個のデータをセット  
    l[(ii*3)+0] = G0;
    l[(ii*3)+1] = R0;
    l[(ii*3)+2] = B0;

  }//for

}//setup

void loop() {

  if( digitalRead(A0) == 0 ){
    //ws2812bへ0データを送る
    ws_led_cl(160*3);
  }else{
    //ws2812bへデータを送る
    ws_led(160*3);
  }  

  //0.1秒待つ
  delay(100);

}//loop




```
ハッシュ関数の基本的な用語やプリミティブ

## Merkle–Damgård construction
一方向圧縮関数を使って、衝突耐性のあるハッシュ関数を構築するための方法

### メッセージブロック
入力のメッセージを固定のブロックサイズ（例：512, 1024）のメッセージブロックのリストに分割する。メッセージの長さが、ブロックサイズの倍数でない場合には、MD-compliant padding を使って、メッセージ長をブロックサイズの倍数に合わせる。

### MD-compliant padding
以下の条件を満たす Padding 関数 $Pad$。$M, M_1, M_2$ はメッセージ
- $M$ は $Pad(M)$ のプリフィックス。
- $|M_1| = |M_2|$ ならば $|Pad(M_1)| = |Pad(M_2)|$。
- $|M_1| \ne |M_2|$ ならば、$Pad(M_1)$ の最終ブロックは、$Pad(M_2)$ の最終ブロックと異なる。

Length padding のデーター長のブロックを含めない形で Padding して問題ない。

### IV (Initialization Vector)
$f$ の出力と同じ長さの、固定の値を持った初期ベクター。

### 一方向圧縮関数 f
メッセージブロックと、$f$ の前回の出力（初回は $IV$)の 2 つの入力を受け取り、どちらかの入力と同じ長さのデータを出力する。

## Length padding
Padding の初めのオクテットのビットを１にして（= 0x80）、のこりを 0x00 で埋める形で、ブロックサイズにデーター長を調整する。更に、データーの長さだけを含んだブロックを最後に追加する。
初めのビットを立てるのは、0x00... で終わるメッセージの終わりの部分と padding を区別するため。

例
データー：
`48 61 73 68 49 6e 70 75 74`

ブロックサイズ：8 byte

1. 7 バイトで、先頭のビット 1 にしたPaddingを追加
   `48 61 73 68 49 6e 70 75`
   `74 80 00 00 00 00 00 00`


1. データー長 9 だけを含んだブロックを追加
   `48 61 73 68 49 6e 70 75`
   `74 80 00 00 00 00 00 00`
   `00 00 00 00 00 00 00 09`

### 実行の流れ

```javascript
msgBlocks = split(message, blockSize)
msgBlocks.last = pad(msgBlocks.last, blockSize)
prevOut = IV
for(m of msgBlocks) {
  prevOut = f(m, IV) 
}
result = lengthPad(prevOut, blockSize)
```

## Random oracle
任意の長さの入力メッセージから、その他の出力と独立して、均一に分布した、無限の長さの出力メッセージを出力する。また、入力が同じ場合は、紐づく出力は常に同じになる。

## PRF (Pseudo-random function family)
効率的に実行可能な、Random oracle と区別することが、効率的なアルゴリズムで実行できない、Random oracle をエミュレートする関数。

## Feistel 構造
ブロック暗号を構築するためのプリミティブ

### ラウンド変数
$L_r, R_r$ where $r=0..総ラウンド数$

### ラウンド鍵
各ラウンドごとに使用する鍵 $K_r$

### ラウンド変数
全ラウンドで共通。$L_r$または$R_r$と、$K_r$を入力に取って、入力が $L_r$ であれば $R_r$、$R_r$ であれば $L_r$ を出力する

### 暗号化

$R_{r+1} = L_r \oplus F(R_r, K_r)$
$L_{r+1} = R_r$

$F$への入力が$L_r$の場合は、$L$と$R$が入れ替わる。

### 復号化

$L_r = R_{r+1} \oplus F(L_{r+1}, K_r)$
$R_r = L_{r+1}$

$F$への入力が$L_r$の場合は、$L$と$R$が入れ替わる。

### 実行のイメージ

```javascript
r = 0
L, R = split(Message)

for(r in 0...keys.length) {
  L, R = R, L (+) F(R, keys[r])
}

Hash = merge(L, R)
```

## SPN (Substitution Permutation Network) 構造
ブロック暗号を構築するためのプリミティブ

### S-Box (Substitution-Box)
m ビットの入力を n ビットの出力に変換する関数

### 構造の詳細
#### 暗号化

1. 置換 (Substition)
   S-Boxを使ってデーターを置換する
1. 転置 (Permutation)
   置換したデーターを並べ替える

を繰り返し適用する。

#### 復号化
暗号化のステップを逆に実行することで、復号化ができる。
また、そのために置換と転置は全単射である必要がある。

## 参考資料
https://en.wikipedia.org/wiki/Merkle%E2%80%93Damg%C3%A5rd_construction
https://en.wikipedia.org/wiki/Pseudorandom_function_family
https://ja.wikipedia.org/wiki/SPN%E6%A7%8B%E9%80%A0
https://ja.wikipedia.org/wiki/Feistel%E6%A7%8B%E9%80%A0
flaskで複数routingを同じ関数に紐つける

*個人用メモです*

# 要点

デコレータを重ねればよい

```python
from flask import Flask


app = Flask(__name__)


@app.route("/v1/test")
@app.route("/v2/test")
def root():
    return "<h1>Test</h1>"


if __name__ == "__main__":
    app.run(debug=True)

```

これで`/v2/test`にアクセスしたときにも`/v1/test`と同じものを出せる。
[Rails Minitest]'test' is already defined in Users::SessionsControllerTest (RuntimeError)

## イントロダクション

RailsMinitest中に発生したエラー。


```
`test': test_new_test is already defined in Users::SessionsControllerTest (RuntimeError)
```

エラー文のまま検索したら、検索結果が０件だったので共有しておく。



## 原因

このエラーは、同じテストファイル内で同一のテスト名が指定されている時に表示されるエラーである。

自分のファイルを見返してみると全く同じテスト名のものがあった。

```ruby
test "new test" do
get new_user_session_path
assert_response :success
end


# ~~~


test "new test" do
get new_user_password_path(format: :json)
assert_response :success
end
```

なので、どちらか片方のテスト名を編集してやればテストはいつも通り動作する。


```ruby
test "new test" do
get new_user_session_path
assert_response :success
end


# ~~~


test "passwords new test" do
get new_user_password_path(format: :json)
assert_response :success
end
```

以上。
【自分用メモ】Mavenのスコープについて

### 参考
やはり英語ドキュメントの方が分かりやすかった。
https://howtodoinjava.com/maven/maven-dependency-scopes

---
### スコープとは
> Maven dependency scope attribute is used to __specify the visibility of a dependency__, relative to the different lifecycle phases (build, test, runtime etc). Maven provides six scopes i.e. compile, provided, runtime, test, system, and import.

「visibility of a dependency（__依存性の可視性__）」を設定するための属性。

もうちょい砕くと

「JUnitは__テスト実行時のみ使える(見える)ように__しよう」
「DBドライバは__アプリ実行時のみ使える(見える)ように__しよう」

みたいな感じ。

---
### 「〜」の時にはこの依存性が使える(見える)ようにしよう。どんな時？
|タイミング|何してるの|
|---|---|---|
|① build|ビルド（実行可能なファイルを作成する）時|
|② test|テスト実行時|
|③ run|アプリ実行時|


---
### ６つのスコープ

||①build|②test|③run|具体例(ライブラリ)|
|---|---|---|---|---|
|compile (デフォ)|○|○|○||
|provided<br>(実行環境から与えられるから実行時には見えなくていい)|○|○|✖︎|・lombok<br>・maven-plugin-annotations|
|runtime<br>(アプリ実行時にしか使わないから実行時に見えるように)|✖️|○|○|・postgres(DBドライバ)<br>・spring-boot-devtools(ソース修正→HotReload)|
|test<br>(テスト実行時にしか使わないからテスト実行時のみ見えるように)|✖️|○|✖️|・spring-test<br>・spring-security-test<br>・spring-boot-starter-test<br>・awaitility<br>・junit<br>・junit-jupiter-api<br>・mockito<br>・selenide<br>・maven-plugin-testing-harness|
|system<br>(providedの「実行環境から与えられないバージョン」)|○|○|✖️|・MavenリモートリポジトリにはないJARファイル等|

##### importスコープ
・dependencyManagement要素内で定義する依存性
・transitive dependencyの定義をするためのスコープ
・具体例
　-　spring-boot-dependencies（springのバージョン指定）
　-　software.amazon.awssdk（AWS SDKのバージョン指定）
PowerShellで 行編集モードを Emacsに設定する

# はじめに

デフォルトの PowerShellの設定では Ctrl+pやCtrl+n でコマンド履歴が追えなかったり、Ctrl+a や Ctrl+e で行頭/行末に飛べなかったりとストレスを感じたため、これらをEmacsライクな行編集モードに設定するための方法について調べた

# PowerShell で Emacs風キーバインドを設定する

上記のEmacs風キーバインドは PoserShell 上で `Set-PSReadLineOption -BellStyle None -EditMode Emacs` を設定することで実現できる。

ただしこれだけでは、シェルを閉じたときに設定値が失われてしまうので、.bashrc 的なものに設定情報を保存しておく必要がある

# PowerShell で .bashrc のようなものを設定する

PowerShellでは以下の環境変数にプロファイル情報のパスが記載されている。

```
$Profile.AllUsersAllHosts
$Profile.AllUsersCurrentHost
$Profile.CurrentUserAllHosts
$Profile.CurrentUserCurrentHost
```

今回は、`$Profile.CurrentUserAllHosts` を使用して以下のように設定した。

```sh
echo '$script = "$Home\profile.ps1" 
if (Test-Path $script) { 
  . $script 
}' > $Profile.CurrentUserAllHosts

echo "Set-PSReadLineOption -BellStyle None -EditMode Emacs" >> $Home\profile.ps1
```

` . $PROFILE.CurrentUserAllHosts` を実行するかPowerShellを再起動することで設定が反映される。

権限エラーで上記スクリプトが実行できない場合は、ExecutionPolicy を設定する必要がある。

今回は `RemoteSigned` (ローカルのスクリプトは実行できるが、インターネットからダウンロードした外部のスクリプトについては署名が必要）を設定した。

```sh
Set-ExecutionPolicy RemoteSigned
```
# 参考文献

https://qiita.com/smicle/items/0ca4e6ae14ea92000d18
https://qiita.com/alchemist/items/e6706cd425f8f5e5032e
AndroidでIR（赤外線通信）

#Androidで赤外線送信を行います。

受信は取り扱いません。(私の端末が非対応)
Androidには赤外線通信対応している端末と、していない端末があるので注意してください。

ConsumerIrManagerクラスを使用するだけで簡単に実装できます。
このクラスはandrod.hardwareパッケージに入っていますが、このパッケージにはカメラとかセンサとか扱う系のやつが入っていて面白そうです。


<details>
<summary>android端末が赤外線通信に対応しているか</summary>
<div>

```Java


ConsumerIrManager irM = (ConsumerIrManager) getSystemService(CONSUMER_IR_SERVICE);
((TextView) findViewById(R.id.text)).setText(irM.hasIrEmitter() ? "この端末で使用できます" : "この端末では使用できません");
//hasIrEmitter()は赤外線が使用できるならtrue,そうでなければfalseです。
```
</div>
</details>

<details>
<summary>赤外線をAndroid端末から送信</summary>
<div>

```Java
    //carrierFrequency  ：ヘルツ単位のIRキャリア周波数。 →大抵38000で問題なし。各自で調べる
    //pattern           ：送信するマイクロ秒単位の交互のオン/オフパターン。　int配列
    irM.transmit(38000, pattern);//送信
```
</div>
</details>

<details>
<summary>使用例</summary>
<div>

```Java
import androidx.appcompat.app.AppCompatActivity;
import android.hardware.ConsumerIrManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    ConsumerIrManager irM;
    int[] pattern;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ((Button) findViewById(R.id.sendButton)).setOnClickListener(this);

        irM = (ConsumerIrManager) getSystemService(CONSUMER_IR_SERVICE);

        ((TextView) findViewById(R.id.text)).setText(irM.hasIrEmitter() ? "この端末で使用できます" : "この端末では使用できません");

        赤外線パターン
        pattern = new int[]{3534, 1735, 466, 419, 466};//...省略
                


    }

    @Override
    public void onClick(View v) {
        //carrierFrequency  ：ヘルツ単位のIRキャリア周波数。 →大抵38000らしい?
        //pattern           ：送信するマイクロ秒単位の交互のオン/オフパターン。
        irM.transmit(38000, pattern);
    }
}
```
</div>
</details>
git push したら「The requested URL returned error: 403」され続けた。解決方法を記載する。

## 背景
昔自分のPCに登録していたGithubアカウント情報がまだ残っていて、
`git push origin master` をしても「The requested URL returned error: 403」のエラーが出て少し躓いたのでメモします。

## git push したら、、、
```shell
$ git push origin master
remote: Permission to paths-are/map-api-create-sales-list-in-nodejs.git denied to <昔登録したGithubユーザー名>.
fatal: unable to access 'https://github.com/paths-are/map-api-create-sales-list-in-nodejs.git/': The requested URL returned error: 403
```
と怒られました。

## やったこと（これだけじゃダメ）
```shell
git config user.email < my new email >
git config user.name  < my new name >
# ちなみにGithubアカウントで利用しているメールアドレスはhttps://github.com/settings/emailsで確認できます。
```
こうすることで、
`C:\Users\guyni\.gitconfig` の中身が更新されます。

で、ユーザー名が変わったからもう大丈夫だと思い、
`git push ...` したら、また同じエラーが発生しました。
しかも、ユーザー名を更新したはずなのに変わっていないかのようなエラーメッセージが来ました。

## やったこと（これで解決）
こちらの記事 [git pushで自分のレポジトリへのアクセスが403で拒否される対処法 Remote: Permission to user1/repo denied to user2](https://qiita.com/mtc465/items/c2e8472f797e9f5bbc43)  が参考になりました^ ^ めちゃ感謝！

次のコマンドを実行すると

```
$ git config credential.helper
manager
```

となります。

`manager`と表示された場合は、
`コントロールパネル > ユーザーアカウント > 資格情報マネージャー > Windows資格情報` を実行し
Githubの情報を削除します。
こんな感じのやつです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640981/4e7099b1-e767-78a4-a11a-f0efc828c85d.png)

そして

```
git push origin master
```

を実行すると、アカウントにログインしてねと聞かれるので、
Githubアカウントのメールアドレスとパスワードを入力し、ブラウザでの認証もすると、設定が完了します。

以上！
windowsでiverilog その107

#概要　

windowsでiverilogやってみた。
シリパラ変換、書いてみた。

#サンプルコード

```
module seripara8(input sck, input rst, input en, input sda, output reg [7:0] q);
	always @(posedge sck)
	begin
		if (rst)
			q <= 8'h0;
		else if (en)
		begin
			q <= { q[6:0], sda };
		end
	end
endmodule


module test;
	reg sck;
	reg rst;
	reg en;
	reg sda;
	wire [7:0] q;
	seripara8 u(.sck(sck), .rst(rst), .en(en), .sda(sda), .q(q));
	initial
	begin
		sck = 0;
		rst = 1;
		en = 0;
		sda = 0;
		$display("sck, rst, en, sda, q");
		$monitor("%b %b %b %b %b", sck, rst, en, sda, q);
		#2
			rst = 0;
			en = 1;
			sck = 1;
			sda = 1;
		#2
			sck = 0;
			sda = 0;
		#2
			sck = 1;
		#2
			sck = 0;
		#2
			sck = 1;
		#2
			sck = 0;
		#2
			sck = 1;
		#2
			sck = 0;
		#2
			sck = 1;
		#2
			sck = 0;
		#2
			sck = 1;
		#2
			sck = 0;
		#2
			sck = 1;
		#2
			sck = 0;
		#2
			sck = 0;
			en = 0;
		#2
			$finish;
	end
endmodule





```

#結果


```

sck, rst, en, sda, q
0 1 0 0 xxxxxxxx
1 0 1 1 xxxxxxx1
0 0 1 0 xxxxxxx1
1 0 1 0 xxxxxx10
0 0 1 0 xxxxxx10
1 0 1 0 xxxxx100
0 0 1 0 xxxxx100
1 0 1 0 xxxx1000
0 0 1 0 xxxx1000
1 0 1 0 xxx10000
0 0 1 0 xxx10000
1 0 1 0 xx100000
0 0 1 0 xx100000
1 0 1 0 x1000000
0 0 1 0 x1000000
0 0 0 0 x1000000



```

以上。
dockerでcakephpの環境を用意する時にmysqlで関連で起きたエラー

dockerでcakephp3.6の環境構築の際にデータベースにmysqlを使用した時に遭遇したエラーと解決方法です。

## エラーその1

`[2002] php_network_getaddresses: getaddrinfo failed: Name or service not known`

## 原因 host名とdocker-compose.ymlで指定したサービス名が異なる

これは調べてみたらアプリケーション側で指定したhost名とdocker-compose.ymlで指定したservice名が異なる場合に起こるエラーらしい。

```yaml:docker-compose.yml
version: '3'

services:
  db:
    image: mysql:8.0
    restart: always
    container_name: cake-db
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: master
      MYSQL_USER: pass
      MYSQL_PASSWORD: pass
```

```php5:.env
DB_HOST=db
MYSQL_ROOT_PASSWORD:root
DB_DATABASE=master
DB_USERNAME=pass
DB_PASSWORD=pass
```
service名とDB_HOSTを一緒にしたら直りました。


## エラーその2
`[2054] The server requested authentication method unknown to the client`

今度は認証系で何やらエラーが起きてます。

## 原因 mysql8.0からデフォルトの認証方式が変更されている

今回は5.*系ではなく8.0のイメージを指定していて8.0からデフォルトの認証方式が従来の`mysql_native_password`から`caching_sha2_password`に変更されたらしいので、とりあえず認証方式を従来の方法に変更してみます。

dbサービスのところに

```yaml:docker-compose.yml
command: --default-authentication-plugin=mysql_native_password
```
を追加

エラーが解消されました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555286/8266a2c2-22e5-bb17-63a4-2b7bddbeee6a.png" width="300px"/>



参照:
https://dev.mysql.com/doc/refman/8.0/ja/sha256-pluggable-authentication.html
https://mebee.info/2020/08/17/post-16830/
https://qiita.com/uta3chame/items/47b393e5887530573118
Kubernetes完全ガイド 第2版 第１章

めも

# Dockerの復習

Dockerコンテナ...Dockerイメージをもとに実行される**プロセス**。特徴は**ポータビリティの高さ**。(Dockerさえあれば良い)。ゲストOSのカーネルを利用したまま、`namespace`や、`cgroups`(control groups)を用いた制御によって独立したOSのような環境を実現している。

cgroups...１つ以上のプロセスを含むグループに対して、**リソースの制限（CPUやメモリなど）**を行う仕組み。cgroupfsというファイルシステムを介して操作する。

[Dockerコンテナの仕組み -namespace、cgroup、overlayfs-](https://www.itbook.info/network/docker06.html)

namespace...namespace内のプロセスは他のnamespace内のプロセスとリソースが隔離されていて、**プロセスごとに**環境を構築することが可能。(**独立したネットワーク・ファイルシステムの構築、ユーザー権限の制限**など)

[Docker内部で利用されているLinuxカーネルの機能 (namespace/cgroups) - Qiita](https://qiita.com/wellflat/items/7d62f2a63e9fcddb31cc)

### Dockerコンテナの仮想マシンとの比較

- 軽量
- 起動・停止が高速...仮想マシンはハイパーバイザー(仮想マシンの作成・実行をするソフトウェア)を用いてゲストOSを起動するが、コンテナはホストOSのカーネルを利用する

## Dockerコンテナの設計上の注意

- １コンテナ１プロセス...複数プロセスが存在すると、アプリケーション同士で干渉し合う可能性あり。Dockerコンテナは、**アプリケーションの実行を容易にする**ことが目的の一つであるため、それに反する。
- Immutable Infrastructure(不変)なイメージにする
    - 環境を変更する際は古い環境を廃棄して新しく作る...k8sを使ってたら勝手にそうなるので、k8sを使う上ではあまり考慮の必要はない。
    - 一度作られた環境は変更されないことを徹底する...コンテナ起動後に環境を変更されないように設計する。(ライブラリのインストールなどは、できるだけ全てDockerfileに書く)
- 軽量なDockerイメージにする...pullする際の時間の短縮→サービス反映速度を向上。手法として、マルチステージビルド、キャッシュファイルの削除、diveといったイメージ調査ツールを用いるなどがある。
- プロセスの実行ユーザーの権限を最小化する...セキュリティリスクの軽減。プロダクションでは、判別できるように専用ユーザーを作成した方が良い。

Immutable Infrastructure...インフラを管理する手法の一つで「一度構築した本番環境には更新やパッチの提供などの変更を加えず稼働させる」という考え方。**度重なる更新によるサーバー環境の複雑化や、それによるアプリケーション実行の不安定化を防ぐ**。

公式のイメージにも、更新の滞っているものがあったり、脆弱性が潜んでいるものがある。脆弱性検出の必要。

→コンテナのセキュリティスキャンツール…Trivy, Clairなど
Slack API を使って email から User ID を取得

# はじめに

連携しているアプリから Slackへメッセージを送る際に、特定のユーザにメンションしたい場合、メンバーID（User ID）が必要になるのですが、User ID って `W012A3CDE` みたいな文字列なので連携アプリ側からはわからないことが多いです。

そんな時は API を使って、email から User ID を取得すれば解決！

試してみたので備忘メモとして残します。

## 使ったAPI
使ったAPIは `https://slack.com/api/users.lookupByEmail` です。
ドキュメント見れば、本記事なんて読まなくてもすぐわかります！笑笑

https://api.slack.com/methods/users.lookupByEmail

# 1. アプリの登録

Slack の [Your Apps](https://api.slack.com/apps/) でアプリを登録します。
すでに登録済みのものを使う場合はこの手順飛ばしてOKです！

## 1. Your Apps 画面
 - "Create New App" を押下
![スクリーンショット 2021-09-25 16.32.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/11bf2556-7f1e-c51d-1971-c39a8e82f516.png)

## 2. Create an app 画面
 - "From scratch" を押下
![スクリーンショット 2021-09-25 16.33.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/861e9648-257c-2158-e1cc-d55b4f94266f.png)

## 3. Name app & choose workspace 画面
- "App Name" を入力
- "Pick a workspace to develop your app in:" でアプリを作成するワークスペースを選択
- "Create App" を押下
![スクリーンショット 2021-09-25 16.33.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/562dec7b-8a7d-47fa-2da6-ee414a3189fa.png)

## 4. アプリの Basic Information 画面
- 作成完了したら表示される
![スクリーンショット 2021-09-25 16.33.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/7c36df2b-5eaa-feec-a3c8-e54110a99cdb.png)


# 2. アプリをワークスペースへインストールして token 取得

## 1. [OAuth & Permissions] メニュー で Scopes を登録
- Scopes が何も登録されてないとワークスペースへインストールできないのでまずはScopesの登録
- 画面下の方にある [Scopes] の項目で "Add an OAuth Scope" 押下
![スクリーンショット 2021-09-25 16.34.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/ad6e241c-1ccc-0580-d036-69c8cb1f1815.png)

- `https://slack.com/api/users.lookupByEmail` を使うには `users:read` のスコープが必要なのでそれを選択 して登録する
![スクリーンショット 2021-09-25 16.34.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/abd56ee4-1230-2544-67f8-bcea9f99a31f.png)

## 2. ワークスペースへインストール
- "Install to Workspace" を押下
- OAuth & Permissions のメニューから行っても良いし、Install App のメニューからでも良い
![スクリーンショット 2021-09-25 16.35.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/8ba807ec-c34e-68f3-9e97-de9b1929d548.png)

- 許可を求められるので問題ないこと確認して許可する
![スクリーンショット 2021-09-25 16.35.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/dc5a9bf2-3ef8-cb29-db83-4a1e07704e7e.png)

## 3. トークンを確認
- 無事発行されてます
- API叩くときにこのトークンを使います
![スクリーンショット 2021-09-25 17.06.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246440/42ddc568-0cc4-46d4-8382-6eb82b91466b.png)

# 3. いざAPI！
APIの仕様を [Slackのドキュメント](https://api.slack.com/methods/users.lookupByEmail) で詳細確認してその通り利用します。

今回は `https://slack.com/api/users.lookupByEmail` を使うので、下記でOK

```http:GET
https://slack.com/api/users.lookupByEmail?email=[メールアドレス]&token=[取得したトークン]
```

ユーザ情報のJSONが返却されるので、そこから User ID の情報を取得して使えば良いです。

-----
以上、何の悩みポイントもないです簡単簡単〜。
Amazon EFSのパフォーマンス概要

#Amazon EFSを構築するには
Amazon EFSを構築するには以下の設定を実施する。
・ファイルシステムの作成
・接続先のマウントターゲットの作成
・パフォーマンスモードおよびスループットモードの選択

以上の中の一つであるパフォーマンスモードとスループットモードの選択について、まとめていきたいと思います。

#パフォーマンスモード
パフォーマンスモードには、汎用モードと最大I/Oモードの2種類があります。
###汎用モード
ファイルサービスのような一般的な用途を想定したモードであり、レイテンシーを優先する場合に使用するモードです。
デフォルトでは汎用モードが設定されており、推奨の設定となっている。
###最大I/Oモード
ファイル操作のレイテンシが汎用モードと比べて、若干長くなる代わりに、何十〜何千台のクライアントから同時にアクセスするような、合計スループットを優先する場合に使用するモードです。
２つのモードの具体的な違いは以下のホワイトペーパーに記載があります。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/linux-efs-performance-modes/

#スループットモード
スループットモードはバーストモードとプロビジョニングモードの2種類があります。

###バーストモード
バーストモードは使用しているファイルシステムの容量に応じてスループット性能が拡張されるモードです。
一時的なピークにより負荷が増大する可能性がある場合にスケーラビリティを確保することができます。

ファイルシステムの容量に応じてスループットのベースライン性能が設定され、現在のスループットがベースラインより低い場合はクレジットシステムと呼ばれる別の機能に蓄積され、ベースラインよりも高い場合はそのクレジットが消費されます。蓄積されたバーストクレジットにより、ベースラインを上回るスループットを実現することができます。（最大スループットはベースライン性能の２倍まで）

###プロビジョニングモード
プロビジョニングモードでは、一貫したスループットが提供されます。ストレージに対して高いスループットが求められるアプリケーションや、バーストモードで許容されている以上の要件がある場合に使用します。API/CLI/マネジメントコンソールから設定可能。
そのため、このモードでは追加料金が発生します。

#注意点
パフォーマンスモードは後から変更を行う場合、手間がかかるため、事前に利用用途などを確認し最適なモードを選択する必要があります。
スループットモードは、後から変更可能であるので、追加料金が発生しないバーストモードの利用からはじめ、利用状況を見ながらプロビジョニングモードを使用していくのが良いかと思われます。
[超入門]Touchdesignerの「UnrealEngine Plug-in Samples」 解説してみたよ～ TOP編

#TouchEngineComponentで扱えるオペレーター
TouchEngineComponentで、Input/Outputで使えるTouchdesignerのオペレーターは主に**3つ**です。
それは、

- TOP
- [CHOP](https://qiita.com/miwa_maroon/items/3c9d7016626eb8389475)
- DAT

この3つ！！

Tox内でSOPやCOMPなどは使用可能ですが、直接的にかかわれるのは、上記3つです。
ということで、それぞれUE4での処理が異なるので、

今回は**TOP編！！**

こちらから[動画](https://youtu.be/4aDJ5DKFLfM)はどうぞ！

<iframe width="560" height="415" src="https://www.youtube.com/embed/4aDJ5DKFLfM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

#避けては通れないブループリントシステム
UE4では、ノードベースのシステム
**ブループリント**
というのがあります。
通称BP

Touchdesignerのオペレーターをつなぐ感覚と似ていて、
処理ごとにそれぞれのノードをつないでいくことになります
![BP_entire.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704869/0c5d92dd-d176-8632-fac2-97d4e435e6e4.jpeg)


BPは避けては通れないものであるので、UE4公式のチュートリアルをやるのをおすすめしますが、

**安心してください！**
**今回はやらなくても大丈夫！！**

というのも
基本的には、まっさらな状態から
ノードを出して～つないで～
みたいなことやりますが、
今回はSamplesの内容を見るので、
もともと作られたBPを使います

####どうやってブループリントを開くのか？
例として、BP_TE_UESample02_SimpleTextureを挙げます
そしたら、`Detailパネル` -> `右上の青いEdit Blueprint` -> `Open Blueprint Editor`
そうすると、こんな画面が出てきます

これが**Blueprint editor**

詳しい方法は飛ばしますが、
TouchEngine Componentのノードは解説しようと思います！

#TouchEngine 基本ノード

##イベントノード(赤色のやーつ)
TouchEngineComponentの右下のボタンにすべてそろっています
クリックで出せますよー
![TE_Events.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704869/34198119-bc72-37ad-17ea-23a3ac1c1ec2.jpeg)

###Set Inputs
TouchEngineのInputになんらかのCHOPやTOPやDATが入ってきたとき！
に発火します
###Get Outputs
TouchEngineのOutputを取得したとき！
に発火します
**これはめっちゃ使う！大事オブインポータント**

##関数ノード(青色のやーつ)
###Set TouchEngine Input
Input NameとValueを指定すると、UE4の型でInputに値を入れることができます
###Get TouchEngine Output
Output nameを指定すると、UE4の型としてCHOP/TOP/DATがvalueに値として入ってきます。

#TOPはUE4ではどーいう型なの？
先ほどから、UE4の**型**という単語を出しています。
これが要はどーいうことなのかというと、
**UnrealEngineの中では、TouchdesignerのTOPをそのままの形でUE4で使うことができないのです！**
UnrealEngine専用の形に変える必要があります。

これは翻訳みたいなものですね。
日本をTouchdesigner、アメリカをUnrealEngineで例えると、
「お腹がすいた」という日本語は、日本ではみなが理解できますが、
アメリカでそのまま言ったらどうでしょう？
謎の英語としてとらえられるでしょう

アメリカでは、アメリカで通じる言葉、そう英語に翻訳する必要があります
I'm hungryといえば伝わりますね

型変換というのは、この翻訳作業に似ています

さあ、**じゃあTOPがどんな型になるのか？**

それは次回で！！

と、アニメの次回予告のように勿体ぶりはしません！

それでは、発表します！ドラムロールどうぞ

でゅるるるるるー、デン！

**Texture2D**
です！！

うおーーーー

といってもUE4触ったことない人には、聞きなれないものかと思いますが、
**Textureとして使えたりする型です**

とにかく！
**TOPはTextue2D**
これが大事！！
これを覚えていただいたら、その証拠としてLGMTでもしてください（笑）

他にもUE4には、おなじみのIntやFloat、String、Nameなどなどめちゃくちゃたくさんあるみたい。こわっ

#Switch TOP が使われている！？
[UE4Sample04_SimpleBlendCubeTexture](https://youtu.be/4aDJ5DKFLfM)をご覧なってください
ここでは、2つのTOP(Texture2D)がブレンドされていくのがわかると思います
ここにTouchdesignerの`Switch TOP`がつかわれてるんですね～
![SwitchTOP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704869/5a960df9-8a49-efc0-83f9-5266beb7e80c.jpeg)

こんなかんじでお気に入りのTOPを使うことができます

ここだけの話、UE4では使えないglslも使えたりしちゃうの
ピクセルシェーダー、コンピュートシェーダー
ためになったね～

#皆さんおまちかね
次回皆さんお待ちかねの**[CHOP](https://qiita.com/miwa_maroon/items/3c9d7016626eb8389475)**をやっていこうと思います

全部乗せの次郎ラーメン並みにボリューム満点なので
基本と
アドバンスにわけつつ
最後まで味をかみしめて
楽しんでください～

[CHOP編](https://qiita.com/miwa_maroon/items/3c9d7016626eb8389475)にて
また
【Laravel】jScrollで無限スクロール

#jScrollファイルをダウンロード#
　[こちら](https://github.com/pklauzinski/jscroll)からjScrollをダウンロードして、public/jsディレクトリ内に「jquery.jscroll.min.js」ファイルを入れます。

#ファイルの読み込み#
　jScrollを使うには、ファイルを読み込む必要があります。
HTMLのheadにこのように記述します。

```php:view.blade.php
<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
　    
　　　　　　　//〜略

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <script src="{{ asset('js/jquery.jscroll.min.js') }}" defer></script>

   //〜略
    </head>
```

asset関数で、publicディレクトリ内のファイルを読み込むことができます。
この時、jQueryも一緒に読み込んでおきます。


#controllerの書き方#
 コントローラーではモデルで取得したデータを受け取ります。

```controller.php
$products = DB::table('products')->paginate(15);
```

paginate関数の引数には、取得するデータの件数を入れます。今回は15件ずつデータを取得してきます。

#viewの書き方#
セキュリティ・ツール「mod_evasive」ubuntu

自分のメモとして

Apacheに対するDoS攻撃対策としてmod_evasiveをインストール
OS : ubuntu20.4

###インストール
sudo apt-get install apache2 apache2-utils -y
sudo apt-get install libapache2-mod-evasive -y

###Apacheモジュールとして有効になっているかどうか確認
sudo apachectl -M | grep evasive

###mod_evasiveの設定
sudo vim /etc/apache2/mods-enabled/evasive.conf
<IfModule mod_evasive20.c>
　DOSHashTableSize 3097
　DOSPageCount 3　（←1秒間に3回アクセスがあった場合）
　DOSSiteCount 50　（←サイトに50回アクセスがあった場合）
　DOSPageInterval 2
　DOSSiteInterval 1
　DOSBlockingPeriod 60　（←60秒間アクセスを拒否）
　DOSWhitelist 127.0.0.1 192.168.1.*
　DOSEmailNotify example@example.com
　DOSLogDir “/usr/local/apache2/logs/mod_evasive_log”
</IfModule>

（設定項目について）
DOSHashTableSize
各子プロセスでのハッシュテーブル・サイズ。
サイズを大きくするとパフォーマンスは良くなりますがメモリを消費。

DOSSiteCount
同じサイトから「DOSSiteInterval」で指定した時間（秒）内にアクセスがあった場合「403」を返す

DOSSiteInterval
「DOSSiteCount」の設定値（秒）

DOSPageCount
同じページに「DOSPageInterval」で指定した時間（秒）内にアクセスがあった場合「403」を返す

DOSPageInterval
デフォルト：１秒間隔

DOSBlockingPeriod
IPアドレスを遮断する時間（秒）。この遮断されている間のアクセスには403 (Forbidden)を返します

DOSWhitelist
検出対象外とするIPアドレス

DOSEmailNotify
ブラックリスト登録時にメール通知を行うアドレス

DOSLogDir
ログファイルの設定

###テスト
 sudo perl /usr/share/doc/libapache2-mod-evasive/examples/test.pl




###参考サイト
https://ficus-forum.myvnc.com/t/awstats/27/3

https://www.shinbo.org/archives/2241

https://www.thefunky-monkey.com/page/ubuntu-18-04-vpsmodevasiveapache-web/
ワイルドカード証明書について調べてみた

## 勉強前イメージ

サブドメインとかまとめて使える証明書
ガラケー使えれへんけど、なんではかしらん

## 調査

### ワイルドカード証明書 とは

同一サブドメイン内であれば複数のサブドメインを一つの証明書で
保護できる証明書になります。
複数のサブドメインが使えることから
インストール作業が軽減され、有効期限の管理も楽になります。
また、サブドメインの追加が合った際も使用が可能です。

### ワイルドカード証明書のメリット

- コストの削減が可能

複数のサブドメインごとにSSLを発行すると
発行の準備や、管理の手間がかかります。
ワイルドカード証明書にすることで、サブドメインごとで買うより価格が抑えられ
また管理コストも下がります。

- すぐ使用できる

上記と似たような感じですが他のサブドメインで証明書が必要になった際
SSL発行の審査を通す必要がないのですぐに使用できるのがメリットになります。

- セキュリティリスクが上がる

使用しているワイルドカード証明書にトラブルが発生した際同じ証明書を使用してるwebサイトのセキュリティリスクが上がります。
顧客の個人情報を流出させてしまう可能性も上がります。

### ワイルドカード証明書のデメリット

- EV証明書は非対応

[EV認証](https://qiita.com/miyuki_samitani/items/91badfc8594b4ec9c5df) には非対応です。

- ガラケーは非対応

ガラケーはワイルドカード証明書が対応しておらず
ワイルドカード証明書が適応されているwebサイトにガラケーでアクセスしたとしてもSSL通信が出来ません。
理由としては、ガラケーはSNIに対応していないからです。
[SNI](https://qiita.com/miyuki_samitani/items/446353c3af9d1fd1ca8e) というのは1台のサーバの名前ベースのvhostsの設定で複数ドメインでの複数のSSL証明書を使えるようにする という方法で、
SNIに対応していないとアクセスするサブドメインごとの独自SSLを使用する必要があります。

つまり、
アクセスするwebサイト → www.example.com だと
証明書のドメイン → www.example.com というアクセスするwebサイトのドメインと同様しかだめ
証明書とwebサイトのドメインは同様である必要があります。

なので、証明書が *.example.com というドメイン名になるのは
ガラケーは対応していない ということになります。

- 複数階層のサブドメインには使用できない

一般的には複数階層のサブドメインには対応していません。
例えば *.example.com という証明書を持っていたときは以下になります。

- sub.example.com → OK
- sub1.sub.exampple.com → NG

一部では複数階層のサブドメインにも対応するワイルドカード証明書も登場していますが、
通常のワイルドカード証明書より費用が高くなることが多いです。

## 勉強後イメージ

ガラケー使えない理由が知れてよかった。
ただ、ちょっと難しいね。
あと複数階層のサブドメイン対応してないのはちょっと忘れそうね。

## 参考

- [ワイルドカード証明書のメリット&デメリット。サブドメインのSSLサーバー証明書が、これ1枚ですべて対応可！](https://goworkship.com/magazine/wildcard-certificate/)
- [ワイルドカード証明書とは](https://jprs.jp/pubcert/about/wildcard/)
- [【Nginx】ガラケーからSSL接続できなくて原因を調べたときの話](https://racchai.hatenablog.com/entry/2016/09/23/114150)
- [SNI、なぜこれ以上適用を遅らせられないのか](https://pr.cdnetworks.co.jp/blog-sni-why-cant-we-delay-the-application-any-more/)
- [SSL証明書の便利機能をご紹介（SNI、SANs、2way）](https://www.idcf.jp/rentalserver/aossl/basic/ssl-function/)
公開！週末研究ノート０１　ー　はじめに

# はじめに

個人的に研究的な活動をやるにあたり、オープンにしてみたら面白いかもと思い、自分が興味を持っている ざっくりテーマについて、これから、ゆるい週末研究を公開していこうと思います。（有識者の方のアドバイスも、ちょっとというかかなり期待してます！笑）

どこかの権威的な学会やジャーナルなどで発表する予定はないため、万が一、私の記事を利用する際には自己責任でお願いします。そんな人はいないと思いますが、念のため。


# TL; DR

- これから、週末研究がんばります！


# 環境

- 今回はなし


# 今考えている週末研究のアイデア集

- 自然言語関係のモデルの解釈性について
    - 判定結果が、どの一文が効いているのか、に答えることができるような、判定モデルの開発
    - 文単位でベクトル化し、それぞれの寄与度を学習するようなモデル
        - 文単位の寄与度をラベル付しなくても学習できるようにする
        - 人間から寄与度が高い文を提供（教育）されたら、該当文・文集合の寄与度が高くなるように学習する

- ベクトル化のアイデア（理論的によい性質を持ちそうな・・という観点で何か作れないか）
    - 言語のベクトル化に波の性質取り込めないか
        - 解釈性の高いモデル、ベクトル化の開発
    - フーリエ級数の考え方を応用できないか
        - 主要な基底が張るベクトル空間（無限次元のベクトル空間の射影空間の位置付け）の意味づけ(どうすべきか)
    - グラフ構造との対応関係
        - 概念間のネットワーク構造をベクトルの演算で表現できるか
        - 局所的には、ネットワーク構造は行列で表現できるが・・・なんか違う気がする

- 解釈性が高い汎用時系列モデル
    - 実は、ちょっと作って止まっている笑
    - TCSI 分解できるようにモデルを構成する
    - 言語モデルにも使えると、本当はいいんだけど・・

- アイデアが出てきたら、随時アップデートしていく


# まとめ

- とりあえず、思いつく範囲でアイデアを発散させてみた
- こんな感じで、ゆるくはじめて、ゆるくやっていく笑


# 参考文献

- 主に、フーリエ級数周り
    - [フーリエ解析とヒルベルト空間](https://www.math.nagoya-u.ac.jp/~yamagami/teaching/fourier/fourier2013.pdf)
    - [フーリエ級数展開をベクトルで直観的に理解する](https://blog.physips.com/entry/fourier_orthogonal)
    - [三角関数の直交性とフーリエ級数](https://shakayami-math.hatenablog.com/entry/2018/08/07/230000)
    - [三角関数 積和の公式](https://w3e.kanazawa-it.ac.jp/math/category/sankakukansuu/kahouteiri/henkan-tex.cgi?target=/math/category/sankakukansuu/kahouteiri/seki-wa-no-kousiki.html)
    - [積分公式一覧](https://manabitimes.jp/math/850)
    - [ラプラス変換の説明と直感的な視覚化](https://www.youtube.com/watch?v=6MXMDrs6ZmA)
【laravel 本番環境】リダイレクト時、sessionがうまく機能しない原因と問題の解明

#○起こっていること
ログイン後リダイレクトするのですが、ログインユーザーの情報をsessionに保持させています。

しかしながら、リダイレクト時には反映がなされず、リロードすると読み込める状態です。

ローカル環境での開発時にはこのようなことはなかったのですが、解決していきたいと思います。

#○解決方法

結論として取った方法ですが、

* ```redirect()``` → ```view()```に変更
* flashメッセージではなく、sessionにデータを持たせることで解決しました。

（修正前のコード）

```sample.php
return redirect()->route('top')->with('message', 'ログイン完了');
```

（修正後のコード）

```sample.php
// sessionに保存
session([
    'register.name' => 'laravel',
]);

// ①、②はどちらかそれぞれの状況によって

// ①$requestをsessionに保存するパターン
$request->session()->flash('message', '$requestからのsession');

// ②Sessionファザードを使用するパターン
Session::flash('message', 'Sessionファザード');

return view('sample');
```

（ブレード：sample.blade.php）

```sample.html
<div @if(session('message')) flex @else hide @endif">
    <div class="content">
        <p class="text">{{ session('register.name') }} さん</p>
        <p class="text">{{ session('message') }}</p>
        <button class="btn close" id="close"></button>
    </div>
</div>
```

#○そもそも、原因は？

原因は、
>**Laravelのセッションの情報はレスポンスを返す直後に保存されるためです。**

そのため、レスポンスを返していないリダイレクトでは、sessionが保存されていない。

https://teratail.com/questions/54205#reply-86859
GAS & Appsheet触ったメモ

## このページは何か
非エンジニア・PjMがGAS&Appsheetを初めて触ってみての備忘録。

## 感想
- 友人や家族内での、ちょっとした不便をさくっと解決するツールを作る際には重宝しそう。
    - 今回は蔵書管理アプリを作成。
- 企業や部署が導入する際、導入・運用ルールを事前設計しないと混乱しそう。
    - 簡単にアプリケーションを作れるが故に、複数の現場担当者が作成した類似野良アプリが乱立したり、セキュリティザルなまま顧客情報扱われたりしそう。

## やりたかったこと
- 友人と共同管理している、本棚の蔵書管理したい。

## やったこと
- こちらのまとめをそのまま実行。ISBNをカメラ読み取りして書籍登録。


https://qiita.com/takatama/items/fa141cb13ccc7324f887

## 次やりたいこと
- UIのカスタマイズ
    - フォントサイズとか色とか。
    - デフォルト設定だとイケてる感じはしないし、使いにくい。
- 貸出記録機能をつけたい。
    - アプリ内に記録すれば、本を借りられるようにしたい。
        - 全利用者が、「誰が、いつ、何を借り、いつまでに返却されるのか」がわかるようにしたい。
        - 借りる人が、「いつまでに返却すればよいか」わかるようにしたい。
- アカウント権限設定を作りたい。
    - 管理者、借りることができる者、借りることができない者に分けたい。
Sponge関数

以下は、元論文を Keccak の記事の内容で調整したもの。

## 構成要素

- 入出力の文字で構成される群 $\mathcal{A}$。ニュートラル要素 $0$ と、$+$ 演算が定義されている。１つの文字は、$1$ビット($\mathcal{A}=Z_2$)から、$n$ビットのブロック
($\mathcal{A}=Z_2^{n}$)までのいずれかの長さ。
- $\mathcal{C}$ は、任意のビット長のスポンジの内部状態の Capacity 部分。
- $0$ は、スポンジ Capacity 部分の初期値を表す。
- ステート $S = (S_{\mathcal{A}} \in \mathcal{A}, S_{\mathcal{C}} \in \mathcal{C})$ は、スポンジの内部状態。
- $P(m)$ はメッセージ $m$ を、$\mathcal{A}$ の文字長ごとに分割してリスト化する。メッセージの長さが、$\mathcal{A}$ の文字長の倍数でない場合には、末尾に Reversible な Padding rule を使った Padding を追加して、事前に $\mathcal{A}$ の文字長の倍数になるように調整する。$P(m)$ は単射で、出力の最後の文字は $0$ 以外、出力のサイズは $1$ 以上という条件を満たす必要がある。
- $f$ は、ステートを受け取り、新しいステートを返す関数 $f: S\rightarrow S$
- $x|a$ は、文字列 $x$ の末尾に、文字 $a$ を追加

## 定義

### Rate
$rate = |\mathcal{A}|$
※元論文では $rate = log_2|\mathcal{A}|$

### Capcity
$capaticy = |\mathcal{C}|$
※元論文では $capacity = log_2|\mathcal{C}|$

### 入力
メッセージ $m$

#### 前処理
$p = P(m)$ を使って、$\mathcal{A}$ の文字で構成される、可変長の文字列 $p$ を作る。

#### 入力処理 (Absorbing)
文字列から文字を一つ取り、現在のステートと $XOR$ したものを $f$ で変換して、新しいステートにすることを繰り返す。具体的には、

初期ステート $S = (0,0)$ に設定して、

for $i$ in $0..|p|$ {
$\;\;S \leftarrow f(S_\mathcal{A} \oplus p_i, S_\mathcal{C})$
}

$\oplus$ は XOR。（元論文では、定義はない $+$ 演算）
$p_i$ は、文字列 $p_i$ の $i$ 番目の文字。


### 出力 (Squeezing)
$\mathcal{A}$ の文字で構成される、任意の長さの文字列 $z$

#### 出力処理 (Squeezing)
ステートの $S_{\mathcal{A}}$ 部分を出力に追加して、ステートに変換をかけてステートを更新することを繰り返す。出力が求める長さになったところで処理を打ち切る。具体的には、

$j=0$
$z=""$
loop {
$\;\;z = z | S_\mathcal{A}$ 
$\;\;$if z.length == desired length: break
$\;\;S \leftarrow f(S)$
$\;\;j$++
}

## 参考資料
https://www.researchgate.net/publication/242285874_Sponge_Functions
https://en.wikipedia.org/wiki/Sponge_function
https://keccak.team/sponge_duplex.html
[Ruby] AtCoder過去問 C - Prison

##はじめに
AtCoder過去問C問題をRubyで解いてみました。
よろしくお願いします。

問題はこちらから確認してください↓

https://atcoder.jp/contests/abc127/tasks/abc127_c

##C - Prison
まずは入力受け取ります。

```ruby
n, m = gets.split.map(&:to_i)
ary = readlines(chomp: true).map{|line| line.split.map(&:to_i)}
```

2行目は複数行に複数要素が存在するときに二重配列として受け取ります。
入力例1でいえば```[[1, 3], [2, 4]]```という感じで受け取ります。

この問題の答えの法則はRの中の最小値とLの中の最大値の差に+1した数字が答えになります。

現在の配列では扱いにくいのでL（左側）だけをまとめた配列とR(右側)だけをまとめた配列を作ります。

```ruby
n, m = gets.split.map(&:to_i)
ary = readlines(chomp: true).map{|line| line.split.map(&:to_i)}
l_ary = []
r_ary = []

ary.each do |a|
  l_ary << a[0]
  r_ary << a[1]
end
```

これでLだけ、Rだけの配列がそれぞれできました。
入力例1でいえば
```l_ary => [1, 2]```
```r_ary => [3, 4]```
となります。

これを使って先ほど述べた「Rの中の最小値とLの中の最大値の差に+1」を出力させます。
もしその答えが0よりも小さくなったら通過できるidカードの数が-1とか-2などの負の数はあり得ないので0以下は全て0と出力させるようにします。

```ruby
n, m = gets.split.map(&:to_i)
ary = readlines(chomp: true).map{|line| line.split.map(&:to_i)}
l_ary = []
r_ary = []

ary.each do |a|
  l_ary << a[0]
  r_ary << a[1]
end

if (r_ary.min-l_ary.max)+1 < 0
  puts 0
else 
  puts (r_ary.min-l_ary.max)+1
end
```
【Unity】BannedApiAnalyzersのハマりポイントと警告をエラーにする方法メモ

# はじめに
プロジェクトで使用するUnityを2020.3に上げてBannedApiAnalyzersを使えるようになったので以下の記事の内容を試してみた。

* [【Unity】CsprojModifier と BannedApiAnalyzers を使用して、特定の関数が使われていたら警告を表示線してみる](https://baba-s.hatenablog.com/entry/2021/07/19/090000)（コガネブログ）

いくつかハマりポイントがあって手間取ったのでメモ。

# 環境

* Unity 2020.3.16f1
* Rider 2021.2.1

# ハマりポイント
## asmdef使ってるとちょっと面倒
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【Unity】CsprojModifier と BannedApiAnalyzers を使用して、特定の関数が使われていたら警告を表示線してみる <a href="https://t.co/dEauef4OsI">https://t.co/dEauef4OsI</a> <br><br>これasmdefでcsprojが分かれてるとC# Project Modifierの設定からcsprojをポチポチ足す必要があった。<br><br>asmdef多いプロジェクトだとちょっと面倒そう。</p>&mdash; su10@ハイパーカジュアルゲーム開発 (@su10_dev) <a href="https://twitter.com/su10_dev/status/1441626768666861570?ref_src=twsrc%5Etfw">September 25, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

![Initialize_-_SharpenTheKnife_-_iOS_-_Unity_2020_3_16f1__Metal_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27863/71d820bf-88fe-aacd-a819-ae9b663c00f9.png)

参考：

* [CsprojModifier × BannedApiAnalyzer を使ってカスタムな静的解析を作る【Unity 静的解析】](https://xrdnk.hateblo.jp/entry/2021/05/17/234035)（デニッキ！）

## 警告じゃなくてエラーにしたい
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://t.co/M88IJpPdC5">https://t.co/M88IJpPdC5</a><br><br>これ見て.editorconfigで設定できそうなことがわかって、<a href="https://t.co/6VtFAXDCgn">https://t.co/6VtFAXDCgn</a><br><br>これ見てRS0030で指定できそうだったから.editorconfigに<br><br>dotnet_diagnostic.RS0030.severity = error<br><br>って書いてみたらエラーにできた🎉 <a href="https://t.co/GRBD3ZYBbM">pic.twitter.com/GRBD3ZYBbM</a></p>&mdash; su10@ハイパーカジュアルゲーム開発 (@su10_dev) <a href="https://twitter.com/su10_dev/status/1441635454822936576?ref_src=twsrc%5Etfw">September 25, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

`.editorconfig` に以下を足す。

```.editorconfig
[*.cs]
dotnet_diagnostic.RS0030.severity = error
```

もしくは

* Visual Studio

>UnityエディタおよびVisual Studioの場合、ルールセットファイルを使用します。設定方法は公式マニュアルの Roslyn analyzers and ruleset files を参照してください。

* Rider

>Riderの場合は、Preferences... を開き、Editor | Inspection Settings | Roslyn Analyzersの中で設定できます。

引用元：[Unityプロジェクト向けRoslynアナライザの作りかた](https://swet.dena.com/entry/2021/05/25/100000)（DeNA Testing Blog）

参考：

* [Microsoft.CodeAnalysis.BannedApiAnalyzers](https://github.com/dotnet/roslyn-analyzers/blob/main/src/Microsoft.CodeAnalysis.BannedApiAnalyzers/Microsoft.CodeAnalysis.BannedApiAnalyzers.md)

### 個別で設定したい
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">BannedApiAnalyzers: Change warning severity case by case #3846<a href="https://t.co/zNGkeVmpMf">https://t.co/zNGkeVmpMf</a><br><br>項目ごとに警告とかエラーとか細かく設定できないかなーと思ったけど、現状はできないっぽい。</p>&mdash; su10@ハイパーカジュアルゲーム開発 (@su10_dev) <a href="https://twitter.com/su10_dev/status/1441655111739064320?ref_src=twsrc%5Etfw">September 25, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

現状は無理っぽい。

# 不明点
Rider上では警告・エラーが出るようになったけどUnityエディタ上では出せないんだろうか？🤔
Ubuntu 18.04でUSB無線子機TP-Link TL-WN725Nを使う

Ubuntu18.04のノートPCをWiFiを使うため、
USB無線子機TP-Link社のTL-WN725Nのドライバをインストールし、使うまでをまとめます。
参考にしたURL：https://askubuntu.com/questions/1047832/tp-link-tl-wn725n-driver-for-18-04-version


使用したUSB無線子機
---
TL-WN725N
Amazonで700円台で買えて、性能も問題ないです！
https://amzn.to/2WedVty

Windows, MacOS, Linuxに対応しています。
Windowsなら付属のCDにインストーラもついていて簡単に導入できそうです。


ドライバのインストール
---

一応本家のTP-Link社のHPからダウンロードもできるのですが、それを使うとmakeが通らず・・・。
git cloneしてインストールしました。

```
$ sudo apt-get update
$ sudo apt-get install -y linux-headers-$(uname -r) build-essential git
$ git clone https://github.com/lwfinger/rtl8188eu
$ cd rtl8188eu
$ make all
$ sudo make install
$ sudo insmod 8188eu.ko
```

最後 sudo insmod を実行するとエラーが。。。

```
insmod: ERROR: could not insert module 8188eu.ko: Required key not available
```

これはセキュアブートが有効になっているためでした。
一旦再起動してBIOSを開いて、secure boot disabledにすると、解決！

無事WiFiが使えるようになりました！！
jQuery 図形をクリックすると大きさが変わるアニメーション

(やりたいこと)
円の図形をクリックすると、2,000ミリ秒かけて大きさが変わる。

width: 100px
height: 100px
　　　↓
width: 400px
height: 400px

(コード)

```test.html
<!DOCTYPE html>

<html>
    <head>
        <style>
            #circle{
                width: 100px;
                height: 100px;
                border-radius: 50%;
                background-color: red;
        </style>
    </head>
    <body>
        <script src="jquery-3.6.0.min.js"></script>
        
        <div id="circle"></div>

        <script type="text/javascript">
            $("#circle").click(function(){
         $("#circle").animate({width:"400px",height:"400px"},2000);
            })
        </script>
    </body>
</html>
```

(備考)
jQueryは、上記のtest.htmlと同じディレクトリにダウンロードしていて、

```
<script src="jquery-3.6.0.min.js"></script>　
```
で、インストールしています。

jQueryダウンロードリンク
https://jquery.com/download/
OracleのDATE型データをPostgreSQLのtimestamp型カラムに挿入

Oracle DBにあるデータをCSV出力し、PostgreSQLへCOPYで挿入する際、Oracle側のDate型データがPostgreSQLのtimestamp型カラムに正しく入りませんでした。

# OracleのDATE型
標準的なOracleのDATEフォーマットは、DD-MON-YYです。

https://docs.oracle.com/cd/E15817_01/server.111/e05765/datatype.htm#17913

# PostgreSQLのtimestamp型
一方PostgreSQLのtimestampフォーマットはyyyy-mm-dd HH:MM:SSです。

https://www.postgresql.jp/docs/9.2/datatype-datetime.html

# Oracle DATE型→PostgreSQL timestamp型
Oracle側のDATE型フォーマットをデフォルトの形式から変更してから出力し、PostgreSQLに取り込みます。上述したように、デフォルトの場合はDD-MON-YY形式であるため、PostgreSQLのtimestamp型に合うようにyyyy-mm-dd HH:MM:SSに変更します。変更はnls_date_formatパラメータに任意の形式を指定します。下記SQLによって、セッション内は指定した形式で出力されるようになります。

```sql
ALTER SESSION SET nls_date_format='YYYY-MM-DD HH:MM:SS';
```

# alter sessionの出力が邪魔

今回の場合、あらかじめ出力したい内容をSQLファイルにまとめて、shell経由でCSVを作成していました。従って、SQLファイル上に上記のalter session~を記述しCSV出力を実行しました。しかし出力したCSV内にデータと共に、「セッションが変更されました。」とalter session~の実行結果が入ってしまいました。
そこで下記のように ALTER session実行前後で出力の無効/有効を指定することで、出力したいSELECT結果だけを取得できます。

```sql
SET TERMOUT OFF
ALTER SESSION SET nls_date_format='YYYY-MM-DD HH:MM:SS';
SET TERMOUT ON
SELECT * FROM ~

```
USBメモリ起動のUbuntu 21.04に書き込み領域を作る

# USBメモリ起動のubuntu21.04に永続的な書き込み領域を作る。

casper-rwというボリュームを用意することで、USB bootのubuntuをアップデートしたり、
パッケージを追加したりと、便利に使えるようになります。
しかも、windows上で [Rufus](https://rufus.ie/ja/) を利用してisoイメージからboot用のUSBメモリを作成した場合、
Ubuntuで特別な設定を行わなくても書き込み領域を持たせる事ができました。

すごく簡単w
USBメモリへのインストールも考えましたが、ドライブ初め色々な構成が違うパソコンで使う
には、Liveイメージの方が良いかな〜　と、思ってこんな事をしてます。

USBメモリ起動のubuntuを使って気になること

* 書き込みが多い処理は遅い。例えば apt upgrade はすごく遅い。（初回 5Hほど掛かった）
* TIME Zone が GMT+1 になってた。早めに修正しよう。
* アプリの初回起動が遅い。Firefoxで30秒くらい。一回閉じて再度起動する時は瞬時
* なかなか起動してくれないアプリがある。
* 普段使い出来る程快適にはならない気がしてる・・・

## 起動用USBメモリを作る。

Windows10 上でRufusを使用して、起動用USBメモリを作ってみました。

### ISOイメージの入手

今回は、[Ubuntu Japan Team](https://www.ubuntulinux.jp/) の Ubuntu Desktop 21.04 を使用させて頂きました。

### Rufusの入手

特に条件はないと思います。
インストーラータイプ・ポータブルアプリ版、どちらでもいいと思われます。
このメモを書くときは、PortableAppsから入手したポータブル版を使用しました。

[Rufus:PortableApps](https://portableapps.com/apps/utilities/rufus-portable)
[Rufus:公式](https://rufus.ie/ja/)

### Rufusの起動

起動するとこんな画面です。
この段階では永続的な書き込みをするための領域を設定するメニューは表示されていません。
気にせず、書き込み先とISOイメージの選択を行います。

![Rufus 3.15.1812 (Portable) 2021_09_24 23_14_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560759/cbacf518-dcca-8f31-6202-1b4120533e19.png)


### 保存領域のサイズ　を指定

（書き込み先）デバイスとISOイメージを選択すると、**保存領域のサイズ**を指定出来るようになります。
今回は、割り当てられる最大量を割り当てました。

![Rufus 3.15.1812 (Portable) 2021_09_24 23_16_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560759/146fe297-3567-ab70-a510-8b2a0952d352.png)

### 起動用USBメモリの作成

準備はこれだけです。
**スタート**　をクリックして起動用USBメモリを作成します。

### 出来上がり

書き込みが完了したら、**閉じる**　をクリックして完了です。

![Rufus 3.15.1812 (Portable) 2021_09_24 23_30_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560759/c63d820f-5391-8343-0310-9f4abed1b0db.png)


## USBメモリからUbuntu 21.04を起動

特に意識する事は有りませんでした。
富士通製ノートPC２台で使ってみましたが、セキュアブートを有効に設定した状態で普通に起動する事が出来ました。

### 起動時のdmesg

boot時のオップションに **persistent** の文字が確認出来ます。

```shell
ubuntu@ubuntu:~$ sudo dmesg
[    0.000000] Linux version 5.11.0-16-generic (buildd@lgw01-amd64-035) (gcc (Ubuntu 10.3.0-1ubuntu1) 10.3.0, GNU ld (GNU Binutils for Ubuntu) 2.36.1) #17-Ubuntu SMP Wed Apr 14 20:12:43 UTC 2021 (Ubuntu 5.11.0-16.17-generic 5.11.12)
[    0.000000] Command line: BOOT_IMAGE=/casper/vmlinuz persistent file=/cdrom/preseed/ubuntu.seed quiet splash --- debian-installer/language=ja debian-installer/locale=ja_JP.UTF-8 keyboard-configuration/layoutcode?=jp keyboard-configuration/modelcode?=pc105
```

### upgradeで消費したcasper-rwの容量

sudo apt upgrade後のcasper-rwの使用量は3.7GB
それなりの容量を確保しておいた方が良さそうです。

```shell
ubuntu@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           3.1G  2.0M  3.1G   1% /run
/dev/sdb1       3.0G  2.4G  541M  82% /cdrom
/cow             26G  3.7G   21G  16% /
tmpfs            16G     0   16G   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           4.0M     0  4.0M   0% /sys/fs/cgroup
tmpfs            16G  500K   16G   1% /tmp
tmpfs           3.1G  128K  3.1G   1% /run/user/999
/dev/sdb2        26G  3.7G   21G  16% /media/ubuntu/casper-rw
ubuntu@ubuntu:~$ 
```
依存性注入（DI）をするメリットとは？

#依存性注入とは？
DIとかって呼ばれている奴ですね。
過去にDIの記事を書いた事あるので、そちらも見ていただけると理解が深まるかなと。

https://qiita.com/LaO/items/799478f9b9f54a1812ee

ドキュメント先生によると以下の恩恵を受けられるそうです。

>・コードを再利用できる
・リファクタリングが容易になる
・テストが容易になる

#依存関係とは？
そもそもの依存関係とは？について話していきます。
とはいえ、大したことないです。

AクラスとBクラスとがあります。
AクラスでBクラスのインスタンスを生成すれば、あっという間に依存関係の出来上がりです。

このように、特段難しいことではないです。

要約すると「参照」ですね。

とあるクラスが別のクラスを参照した時、それは依存関係が成り立つということですね。

#依存性注入とは？
で、今の他のクラスを参照する行為は依存性注入ではありません。

それと、そのような依存関係にはいくつか問題があるようです。

AクラスとBクラスの例を使うと

```kotlin
class A {
    val b = B() // 再利用できない。Aクラス独自のインスタンスになってしまう。
}

class C {
    val b = B() // Aクラスとは別のBクラスインスタンスを使っている
}

class B {
    val hoge = 0
    fun hoge() = 1
}
```
コメントアウトで示したようにコードの再利用ができない点が良くないですね。
このように依存関係が固定化されてしまって、柔軟性に欠けるとテストがしにくいです。

この場合の依存性注入は、こちらになります。

```kotlin
class A(private val b: B) {
     println(a.hoge.toString)  
}

class C(private val b: B) {
    println(b.hoge().toString)  // Aクラスと使っているインスタンスが同じ
}

class B {
    val hoge = 0
    fun hoge() = 1
}
```

#依存性注入の何が良い？
先程のコメントアウトで示したように無駄なインスタンス生成が無くなります。
また、代替実装ができるのでテストがしやすくなります。

#終わり
ぶっちゃけテストしたことないから、テストしやすくなったー！って思って事は一度もないのじゃ。
三角形の外接円をwolframとsympyとvbaソルバーでやってみた。

# wolframalphaで

https://www.wolframalpha.com/input/?i=%E4%B8%89%E8%A7%92%E5%BD%A2%E3%81%AE%E5%A4%96%E6%8E%A5%E5%86%86&lang=ja

# SymPy Liveで
以下のソースコードを貼り付けて、Evaluateです。

https://live.sympy.org/

### 例1
circumcircle

https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.Triangle.circumcircle

```python
from sympy import *
var('p1x p1y p2x p2y p3x p3y')
p1, p2, p3 = Point(p1x,p1y), Point(p2x,p2y), Point(p3x,p3y)
t = Triangle(p1, p2, p3)
print("#",t.circumcircle)
mySubs={p1x:0 ,p1y:0 ,p2x:1 ,p2y:0 ,p3x:0 ,p3y:1}
print("#",t.circumcircle.subs(mySubs))
# (省略)
# Circle(Point2D(1/2, 1/2), sqrt(2)/2)
```

### 例2

https://keisan.casio.jp/exec/system/1161228797

辺の長さ a 3
辺の長さ b 4
辺の長さ c 5

外接円の半径 r 2.5

```python
from sympy import *
var('a b c x p1x p1y p2x p2y p3x p3y')
p1x=0.0
p1y=0.0
p2x=a
p2y=0.0
p3x=solve((b**2-x**2)-(c**2-(a-x)**2),x)[0]
p3y=sqrt(b**2-p3x**2)
p1,p2,p3 = Point(p1x,p1y), Point(p2x,p2y), Point(p3x,p3y)
t = Triangle(p1, p2, p3)
mySubs={a:3,b:4,c:5}
print("#",t.circumcircle.subs(mySubs))
# Circle(Point2D(3/2, 2), 5/2)
```
### 例3
https://qiita.com/mrrclb48z/items/8fae87b765865246accf#freecad%E3%81%AE%E3%83%9E%E3%82%AF%E3%83%AD%E3%81%A7%E4%BD%9C%E5%9B%B3

```python
単体ではうごきません。
def myTriangle_Move_CircumcenterToOrigin(dumABC):
    dumO=dumABC.circumcircle.args[0]
    return Triangle( dumABC.vertices[0]-dumO,
                     dumABC.vertices[1]-dumO,
                     dumABC.vertices[2]-dumO )
myT=myTriangle_Move_CircumcenterToOrigin(myT)
```


# vbaソルバーで　
エクセルのソルバーのダイアログ入力で普通にできますが、あえてVBAでチャレンジしてみました。ソルバーのための以下の参考の設定が必要です。
SolverOptions AssumeNonNeg:=False追加しました。
おすすめのサイトがあれば、教えて下さい。

参考　

https://docs.microsoft.com/ja-jp/office/vba/excel/concepts/functions/using-the-solver-vba-functions

### 例1(距離)xy2変数

```vb
Const myMethod = "GRG Nonlinear"
'Const myMethod = "Simplex LP"
'Const myMethod = "Evolutionary"
Sub aaa_main()
    ActiveSheet.Cells.Clear
MsgBox "3点を通る円を" & myMethod & "で計算します。"
    Range("A1") = 0
    Range("B1") = 0
    Range("A2") = 1
    Range("B2") = 0
    Range("A3") = 0
    Range("B3") = 1
    
    Range("C1").Formula = "=(A1-$A$4)^2+(B1-$B$4)^2"
    Range("C2").Formula = "=(A2-$A$4)^2+(B2-$B$4)^2"
    Range("C3").Formula = "=(A3-$A$4)^2+(B3-$B$4)^2"
    Range("C4").Formula = "=(C1-C2)^2+(C1-C3)^2"
    Dim ws As Worksheet: Set ws = ActiveSheet
    SolverReset
    SolverOk setCell:=ws.Range("C4"), _
                   MaxMinVal:=3, _
                   ByChange:=ws.Range("A4:B4"), _
                   EngineDesc:=myMethod
    SolverOptions AssumeNonNeg:=False
    SolverSolve UserFinish:=True
    Range("C5").Formula = "=sqrt(c1)"
End Sub
'結果
'"GRG Nonlinear" で 0.5,0.5,0.707106781
```

### 例1(ヘロンの公式)1変数
勉強中

### 例2(余弦定理)1変数
勉強中

### 例2(ヘロンの公式)1変数
勉強中