OmniAICreator/Qiita-1.07M huggingface dataset:
pyenvから3.11をインストール

pyenvをアップデートしたら3.11が追加されていました。

```shell
$ pyenv update
$ pyenv -v
  pyenv 2.3.6
$ pyenv install --list | grep "  3.1[0-9]"
  3.10.0
  3.10-dev
  3.10.1
  3.10.2
  3.10.3
  3.10.4
  3.10.5
  3.10.6
  3.10.7
  3.10.8
  3.11.0
  3.11-dev
  3.12.0a1
  3.12-dev
```

早速インストールしてデフォルトにしました。

```shell
$ pyenv install 3.11.0
$ pyenv global 3.11.0
$ pyenv rehash
$ pyenv versions
  system
  3.10.7
* 3.11.0 (set by /Users/k.abe/.pyenv/version)
```

高速化が気になったのでクラスメソッドさんの記事を参考にパフォーマンスを測ってみました。参考にしたブログは[こちら](https://dev.classmethod.jp/articles/benchmark-test-python3-11/)です。

コードも参考にさせてもらいました。

```python:fb.py
import sys

def fb(n):
    if n == 0 or n == 1:
        return n
    else:
        return fb(n - 2) + fb(n - 1)

print(fb(int(sys.argv[1])))
```

さっそく自分のPCで測定してみます。
こんな寂しいスペックですが😭
* MacBook Pro
* チップ Apple M1
* メモリ 16G
* macOS Ventura 13.0


まずは、python 3.10で測定しました。

```shell
$ pyenv global 3.10.7
$ pyenb rehash
$ time python fb.py 40
  23.08s user
  0.04s system
  99% cpu 
  23.204 total
```

つづいて、python 3.11で測定しました。

```shell
$ pyenv global 3.11.0
$ pyenb rehash
$ time python fb.py 40
  12.39s user
  0.03s system
  99% cpu 
  12.488 total
```

自分のPCでも23.2秒から12.5秒になり、2倍ぐらい早くなってるのでこれはうれしい。
ググルとpyperformanceで検証した結果など公開されますね。

---

参考文献
* [What's New In Python 3.11](https://docs.python.org/ja/3/whatsnew/3.11.html)
* [Python 3.11の新機能(その1） CPython高速化計画](https://www.python.jp/news/wnpython311/index.html)
* [Python3.11が高速化しているかベンチマークしてみた](https://dev.classmethod.jp/articles/benchmark-test-python3-11/)
オーバーライドをめっちゃ簡潔にまとめてみた

## はじめに
オーバーライドについて改めて学んだことを簡潔にまとめることとする。尚、継承の知識も必要である。

## オーバーライド（override）の詳細
- 子クラスが親クラスを引き継いだ（継承）をした際、親クラスで定義されているメソッドやプロパティを「子クラス」で上書きすることができる。<br>

- 親クラスの上書きは「継承している子クラス」で行われるため、その上書きした子クラスのクラス内でのみ、あるいは、インスタンス化したときに上書き内容が反映される。
- 親クラスで既に定義されているメソッドやプロパティで同じシグニチャ（同じ名前、同じ引数、同じ戻り値）のメソッドやプロパティを定義する場合は、「override」を指定する必要がある。
- プロパティを上書きする場合は、親・子クラス共に「コンピューテッドプロパティ」でなければ上書きできない。
→こうすることで誤って親クラスのメソッドを上書きしてしまうミスを防ぐことができる。目印はoverride。
- また、superをつけることによって、「子クラス」で親クラスに定義されてる関数などを呼び出すことができ、機能の追加などが可能


```swift:Swift
class User {
    let id: Int
    
    //コンピューテッドプロパティ（親クラスでコンピューテッドプロパティでなければ子クラスでもコンピューテッドプロパティで上書きできない）
    var message: String {
        return "Hello"
    }
    
    init(id: Int) {
        self.id = id
    }
    
    func printProfile() {
        print("id：\(id)")
        print("message：\(message)")
    } 
}


class RegisterUser: User {
    var name: String
    
    //overrideを付けることにより親クラスのmessageプロパティを「この子クラスにおいて」上書き
    override var message: String {
        return "Hello, my name is \(name)"
    }
    
    init(id: Int, name: String) {
        self.name = name
        //superを付けることで継承している親クラスのinit()を子クラスで呼び出すことができる
        super.init(id: id)
    }
    
    //overrideを付けることにより親クラスのprintProfileメソッドを「この子クラスにおいて」上書き
    override func printProfile() {
        //superを付けることで継承している親クラスのprintProfile（）を子クラスで呼び出すことができる
        super.printProfile()
        print("name：\(name)")
    }
}


class NonRegisterUser2: User {

    //親クラスを継承するだけで何も定義しない
}

//親クラスのインスタンス化
let user = User(id: 1)
user.printProfile()
//id：1
//message：Hello


//子クラスのインスタンス化
let registeruUSer = RegisterUser(id: 2, name: "山田")
registeruUSer.printProfile()
//message：Hello, my name is 山田
//name：山田


//子クラスのインスタンス化
let nonRegisterUser = NonRegisterUser2(id: 3)
//registeruUSerを上書きしてインスタンス化したからといって、今後すべての親クラスを継承した子クラスに反映されるわけではない。あくまで、上書きされるのは、その上書きに関わる子クラス関連のみ。
nonRegisterUser.printProfile()
//id：3
//message：Hello
```

## おわりに
継承についても次回記事にまとめます。（宿題）

## 参考記事
[[増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)　](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88-Swift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AA%E6%96%87%E6%B3%95%E3%81%A8%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E5%85%BC%E3%81%AD%E5%82%99%E3%81%88%E3%81%9F%E8%A8%80%E8%AA%9E-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297112132)
↑引用元
石川 洋資  (著), 西山 勇世  (著)
発行者：片岡 巌
出版社：技術評論社
印刷/製本：日経印刷株式会社



## 開発環境
- Xcode-13.4.1
- iOS13以降
Volta コマンド

Volta公式
https://docs.volta.sh/guide/getting-started

以下コマンドを必要に応じて使用

```
# Node LTS版インストール
volta install node

# 最新バージョンをインストール
volta install node@latest

# 特定バージョンをインストール
volta install node@18.12.1

# 安定板インストール(数字のバージョン)
volta install node@18

# 各種バージョンの確認
volta list

# 管理しているものを一覧表示
volta list all
```
プロジェクトのバージョン固定は` volta pin `を使う

```
# nodeのバージョン固定
volta pin node@18.12.1	

# npmのバージョン固定
volta pin npm@8.19.2
```
バージョン固定した際はpackege.jsonを書き換える必要あり

```ruby:package.json

"volta": {
  "node": "14.17.3",
  "npm": "6.14.13"
}
```
プロになるためのWeb技術入門を読んでアウトプット

# はじめに
自分は今年の春に新卒で受託開発会社に入社しました。  
この半年ほど、Webアプリケーションの仕組みなどIT知識があまりないままコードを書いていました。
Webアプリケーションの基本的な知識について完璧に理解したとは言えませんが、自分なりに用語についてアウトプットしたいと思います。
<br>
書籍「プロになるためのWeb技術入門」（著）小森裕介
# 用語
- ステートフル
状態を持つプロトコル。
高級美容室に例えられる。来店したお客様の情報を記録しているので、「前回と同じ髪型で」と注文すれば通じる。
サーバが以前のリクエストを記録することで、それを踏まえたリクエストを実行できる。
- ステートレス
状態を持たないプロトコル。
１０００円カットに例えられる。来店したお客様の情報を記録してないことが多いので、どんなお客様がいつきても「どんな髪型にしますか？」と聞かれる。
サーバがリクエストを都度要求し、それを踏まえたリクエストを実行している。<br><br>
- リクエスト
  - クライアントからサーバに対する要求
  - コンテンツ（テキスト、写真、動画．．．）を持っているWebサーバに対してこういうコンテンツが欲しい！と連絡すること
- レスポンス
  - サーバからクライアントに対する応答
  - 要求されたコンテンツをWebブラウザに返している

　水泳で例えると
　試合でタッチ板にタッチすることがリクエスト
　タッチ板に手がついたのを感知して電光掲示板に記録を表示することがレスポンス<br><br>
- クッキー（Cookie）
WebアプリケーションはステートレスなHTTPで実現している。Cookieを使うことでWebブラウザに状態を持たせステートフルのように通信している。
例えると、Amazonで買い物をするときは以下のような操作をすることが考えられる。
　1. まずログインする。
　2. 次に、レース水着の「ミズノ　GX」と検索した場合、GXシリーズの商品一覧が表示される。
　3. 商品の詳細、レビューなどを見る
　4. 商品を買う
基本的には１の操作の時だけユーザ名、パスワードのユーザ情報を入力することが多い。しかし、状態をもつCookieがないとWebサーバはユーザが何番の操作したかわからない。よって、２、３、４のような操作をする度にWebサーバはユーザ情報を要求してしまい、ユーザにとって操作性がよくない問題が起きる。
問題を解決するには、Cookieに何番まで操作したかわかるような情報を管理した番号（セッションID）を持たせる。WebブラウザとWebサーバはそのCookieを送りあうことで、毎回ユーザ情報を入力しなくて良くなる。WebサーバがCookieの（セッション）管理をしている。
セッションとは１〜４のような処理の一連の流れのこと。<br><br>

- プロトコル
コンピュータ同士がどのような方法で情報をやりとりするかの取り決め。
WebサーバとWebブラウザが通信するプロトコルはHTTP。<br><br>
- ポート番号
リクエストの宛先を指定したもの。ポート番号を指定することで、どのプロトコルでリクエストが来るのか、どのアプリケーションが対応するのかを判断している。

# 最後に
基本的なことを知らないまま、ただコードを書いているのが不安でした。
この本を読むことでようやくスタート台に立てた気がします。
基本なくして応用なしだと思うので、土台がしっかりしたエンジニアになれるよう勉強していきます。
[python] JSONファイルの扱い方


# はじめに
最近はcsv形式よりもjsonの方が紐づけなどに利点をより感じる。
会社で自分のデータをjson形式で管理しようか考えたりする
ここではpythonを用いてjsonファイルを扱う方法をまとめる

# 環境
windows 10
python version: 3.7.8

# Code
## JSONとは
JSON(JavaScript Object Notation)はインターネット上でデータのやり取り時に使われる手法の１つである。そのほかにXML, CSV、BSONなどがあり、JSONはネット上でよく使われるだけであって、特にJSONだけにこだわる必要はない。
しかし、JSONは高次元のデータ、例えば表の中に表が存在するようなデータ、において利点がある。
```json: test.json
{
	"employees": {
		"1": {
			"name": "Kobaayshi",
			"age": 12,
			"sex": "M"
		},
		"2": {
			"name": "Tanaka",
			"age": 33,
			"sex": "W",
			"hobby": [
				"swim",
				"golf"
			]
		},
		"3": {
			"name": "Suzuki",
			"age": 26,
			"sex": "M",
			"family": {
				"married": true,
				"children": false
			}
		}
	}
}
```
このように３人の従業員のデータがあるとするとき、それぞれの従業員番号1,2,3があり、その中に名前、年齢、性別が存在する。よってそれぞれの従業員の情報は従業員番号に紐づけられており、従業員番号さえあれば、他のデータベースに紐づけることができる。

## jsonファイルの書き方
```python
import json

data = {"employees": {
    1: {
        "name": "Kobaayshi",
        "age": 12,
        "sex": "M",
    },
    2: {
        "name": "Tanaka",
        "age": 33,
        "sex": "W",
    },
    3: {
        "name": "Suzuki",
        "age": 25,
        "sex": None,
    },
}
}

f = open('./test.json', 'w')
json.dump(data, f, indent="\t")
f.close()
```

```json: test.json
{
	"employees": {
		"1": {
			"name": "Kobaayshi",
			"age": 12,
			"sex": "M"
		},
		"2": {
			"name": "Tanaka",
			"age": 33,
			"sex": "W"
		},
		"3": {
			"name": "Suzuki",
			"age": 25,
			"sex": null
		}
	}
}
```
`open`のモード`'w'`ではファイルが存在しなくても新しく生成され、ファイルが存在する場合は必ず上書きされる。


## jsonファイルの読み方
```python
f = open('./test.json', 'r')
f_json = json.load(f)
print(f_json)
f.close()
```
```terminal
{'employees': {'1': {'name': 'Kobaayshi', 'age': 12, 'sex': 'M'}, '2': {'name': 'Tanaka', 'age': 33, 'sex': 'W'}, '3': {'name': 'Suzuki', 'age': 25, 'sex': None}}}
```

```python
print(f_json["employees"]["3"])
# {'name': 'Suzuki', 'age': 25, 'sex': None}

print(f_json["employees"]["3"]["age"])
# 25

print(f'The age of {f_json["employees"]["3"]["name"]} is {f_json["employees"]["3"]["age"]}')
# The age of Suzuki is 25
```
キーワードで必要な情報を読み取ることができる。
## jsonファイルの修正

```python
f = open('./test.json', 'r')
f_json_modify = json.load(f)

print(f_json_modify["employees"]["3"])
# {'name': 'Kobaayshi', 'age': 12, 'sex': 'M'}


f_json_modify["employees"]["3"]["age"] += 1

f_json_modify["employees"]["3"]["sex"] = "M"

f_json_modify["employees"]["3"]["hobby"] = ["Swimming", "golf"]
# キーワードや値がなくても追加できる
# リストとしてデータを追加

print(f_json_modify["employees"]["3"])
# {'name': 'Suzuki', 'age': 26, 'sex': 'M', 'hobby': ['Swimming']}

f.close()

f = open('./test.json', 'w')
json.dump(f_json_modify, f, indent="\t")
f.close()
```

## 最終的なJOSNファイルの内容
```json
{
	"employees": {
		"1": {
			"name": "Kobaayshi",
			"age": 12,
			"sex": "M"
		},
		"2": {
			"name": "Tanaka",
			"age": 33,
			"sex": "W"
		},
		"3": {
			"name": "Suzuki",
			"age": 26,
			"sex": "M",
			"hobby": [
				"Swimming",
                "golf"
			]
		}
	}
}
```

# まとめ
pythonでjsonを扱う方法をまとめた。
csv形式の方が社内データベースとしては良く使われる気がするが、高次元でデータを管理したい場合はJSON形式の方がよりメリットを感じる。firebase や mongodbのように、高次元データの利点がある。
特にデータの紐づけが大変な時はJSONですかね

# 参考

https://www.youtube.com/watch?v=1ID6pfTViXo&t=330s
supertest error

Jest did not exit one second after the test run has completed.

This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with `--detectOpenHandles` to troubleshoot this issue.

このようなエラーがでた。

https://qiita.com/yuta-katayama-23/items/29b91fed629fe758a42d

原因はポートが開きっぱなしになってしまうこと。

app.jsを分割。testを非同期にすることで解決
railsのマイグレーションの見方・できること

# 動機
MySQLに直接テーブルを作っていたためこれからのことを考えて、使えるように勉強する。
一応テーブルを作成するところまでできるようになりたい。

# マイグレーションとは?
マイグレーションは、```データベーススキーマの継続的な変更（英語）を、統一的かつ簡単に行なう```ための便利な手法です。マイグレーションでは```RubyのDSL```が使われているので、生のSQLを作成する必要がなく、```スキーマおよびスキーマ変更がデータベースに依存しなく```なります。

```個別のマイグレーションは、データベースの新しい「バージョン」```とみなせます。```スキーマは空の状態から始まり```、マイグレーションによる変更が加わるたびにテーブル、カラム、エントリが追加または削除されます。Active Recordはマイグレーションの時系列に沿ってスキーマを更新する方法を知っているので、```履歴のどの時点からでも最新バージョンのスキーマに更新```できます。Active Recordは```db/schema.rb```ファイルを更新し、```データベースの最新の構造と一致する```ようにします。

# 例
```rb
class CreateProducts < ActiveRecord::Migration[7.0]
  def change
    create_table :products do |t|
      t.string :name
      t.text :description

      t.timestamps
    end
  end
end
```
## コードの意味
### テーブル名を指定
```rb
class CreateProducts < ActiveRecord::Migration[7.0]
def change
    create_table ここ⇨:products do |t|
```
### テーブルのカラムを指定
上のマイグレーションを実行するとproductsという名前のテーブルが追加されます。
```rb
      t.string :name
      t.text :description
```
この中にはnameというstringカラムと、descriptionというtextカラムが含まれています。
主キーはidという名前で暗黙に追加されます。idはActive Recordモデルにおけるデフォルトの主キーです。
### 気づき
idは自動的に生成されるのか。

### created_atとupdated_atという2つのカラムを追加
```rb
      t.timestamps
```
timestampsマクロは、created_atとupdated_atという2つのカラムを追加します。
これらの特殊なカラムが存在する場合、Active Recordによって自動的に管理されます。

## マイグレーションのできること
マイグレーションで定義されているのは、時間を先に進めるときに実行したい動作である点にご注目ください。
### マイグレーションでテーブルを作ることができる
マイグレーションの実行前にはテーブルは1つもありません。マイグレーションを実行すると、テーブルが作成されます。
### マイグレーションをロールバックさせる
Active Recordは、この```マイグレーションを逆進させる方法も知っています```。```マイグレーションをロールバックさせると、テーブルは削除```されます。

## ？？(理解できた時に編集）
### サポートされている場合
トランザクション内でスキーマを変更するステートメントがデータベースでサポートされていれば、```マイグレーションはトランザクションでラップ```されます。
### サポートされていない場合
この機能がデータベースでサポートされていない場合は、マイグレーションの一部が失敗した場合にロールバックされません。その場合は、変更の逆進を```手動で記述する```必要があります。

# とりあえず作成したい。
一度に理解することはできないから、とりあえずマイグレーションファイルを作成することをしてみたい。
長くなりそうだから次の記事に書く。

# 出典
https://railsguides.jp/active_record_migrations.html
Vultrで月6ドルのVPSが増えたので比較してみた

# はじめに
個人的な好みでVultrというVPSを使っている。詳細はこちら。
https://qiita.com/toyolab/items/44bb2fccf0630b144833

これまで使ってきたのは、そのなかでもCloud Computeの「**High Frequency**」っていうサービスで、SSD 32GBのやつ。これが月６ドル。（消費税込みだと6.6ドル）

以前はスナップショットが**無料**だったので、使うときだけサーバーを契約して、使わなくなったらスナップショットとってサーバーを削除するという使い方をしていた。

最近はスナップショットが**有料**になったので、こまめにサーバー契約するメリットは少なくなったけど、スナップショットも10GBなら月0.5ドル程度なので、フル契約するより安くあげることはできる。

それはそうと、最近、Vultrで月６ドルで使用できるサービスが増えたようだ。
「**High Performance**」と呼ばれていて、High Frequencyと紛らわしい。しかも、CPUにIntelとAMDが選べるようになっている。

結局、同じ値段のサービスが３つに増えたのでので、どれがいいのか選ぶ必要がある。以前はウェブサイトにベンチマークが載っていて、それを参考にできたのに、今はそれがなくなっている。
決め手に欠けるので、今回独自のベンチマークで比較してみることにした。

# ベンチマークプログラム
このVPSを使う個人的な目的は、MT4、MT5といったトレードソフト上で自動売買プログラム（EA）を安定して動かすことだ。
EAはテクニカル指標の計算がメインなので、単純な計算時間がわかればいい。
ということで、手元にあったプログラムでベンチマークを作ってみた。

````dft.cpp
#include <iostream>
#include <complex>
#include <sys/time.h>
#define complex complex<double>
using namespace std;

void dft(complex x[], int n)
{
	complex w[n];

	for(int k=0; k<n; k++){
		w[k] = complex(0.0, 0.0);
		for(int i=0; i<n; i++){
			w[k] = w[k] + x[i] * exp(complex(0.0, -2.0*M_PI*i*k/n));
		}
	}
	for(int i=0; i<n; i++) x[i] = w[i];
}

int main()
{
	int N=1024;
	cout << "Input number of data = ";
	cin >> N;
	complex x[N];
	timeval start, end;

	cout << "***** DFT Start *****\n";
	gettimeofday(&start, NULL);
	dft(x, N);
	gettimeofday(&end, NULL);
	double ptime1 = (end.tv_sec - start.tv_sec) + (double)(end.tv_usec - start.tv_usec) * 1.0e-6;
    printf("Processing time = %g sec\n", ptime1);

	return 0;
}
````
これは離散フーリエ変換の計算時間を計測するプログラムで、本来はFFT(高速フーリエ変換)と比較するためのものだ。ここで、ポイント数$N=2^{13}=8192$くらいにすると、数秒程度時間がかかるから、これを使うことにした。

ちなみに、OSはDebian 11なので、C++のソースはすぐにコンパイルできる。手元のPC(AMD Ryzen9 5900HX 3.30GHz)だと、４秒弱だった。
````
Input number of data = 8192
***** DFT Start *****
Processing time = 3.82177 sec
````

# 結果
多少ばらつきがあるので、それぞれ10回試行して平均値を出してみた。
### 従来のHigh Frequency(Intel)
````
4.873573
````
### High Performance(AMD)
````
6.897502
````
### High Performance(Intel)
````
4.839029
````
手元のPCよりは遅いが、いずれも２倍も遅くはない。
ただ、新設されたHigh Performanceは、CPUによって違いがあった。**Intelの方は、従来のHigh Frequencyと大差はない**が、**AMDだとちょっとパフォーマンスが落ちる**感じだった。
ウェブサイトのベンチマークがなくなったのも、このせいかなと勘ぐってしまう。
あくまで独自のベンチマークでの結果なので、別のベンチマークだと違った結果になるかもしれない。

なお、High FrequencyとHigh Performanceでは、同じ6ドルでも、仕様に違いがある。
### High Frequency
````
SSD：32GB
バンド幅：1TB
````
### High Performance
````
SSD：25GB
バンド幅：2TB
````
ディスク容量の多さで決めるか、トラフィックの多さで決めるか、使用する目的で決めることになるだろう。ただ、個人的な用途では、どちらもそんなに要らないから安くしてほしいところだ。

結局、個人的には決め手に欠けるので、従来のHigh Frequencyのままでいいかなという感じ。またCPUの世代が新しくなったときに検討することにしよう。
緑本をStanで書く

# はじめに
短くて恐縮ですが, 自分用のメモです．

緑本("データ解析のための統計モデリング入門"(久保拓也著))の9章以降では既に開発が終了しているWinBUGSが使われていますが、入門を兼ねてStanで書き直してみました．

教科書ではギブスサンプリングでMCMCを実行していますが, Stanではハミルトニアンモンテカルロ法を採用しているため,パラメータの事後分布が異なる点に注意してください．

## 9.4 ベイズ統計モデルの事後分布の推定

- Stanファイルの作成

```S
data{
  int N;
  int Y[N];
  real X[N];
}

parameters{
  real beta1;
  real beta2;
}

transformed parameters{
  real lambda[N];
  for(i in 1:N){
    lambda[i] = exp(beta1 + beta2 * X[i]);
  }  
}

model{
  for(i in 1:N){
    Y[i] ~ poisson(lambda[i]);
  }
  beta1 ~ normal(0, 100);
  beta2 ~ normal(0, 100);
}
```

- 実行方法 (サンプリングパラメータは教科書に準拠しています)

```R
set.seed(123)
d = load.csv('d.RData') 
fit = sampling(model, data=list(N=20, X=d$x, Y=d$yiter=1600, warmup=100, thin=3, chains=3))
model = stan_model("poisson.stan")
fit
```

- 結果 (lambdaパラメータの記載は省略)

```
             mean se_mean   sd   2.5%    25%    50%    75%  97.5% n_eff Rhat
beta1        1.55    0.01 0.37   0.82   1.32   1.56   1.81   2.25   654    1
beta2        0.09    0.00 0.07  -0.05   0.04   0.08   0.13   0.22   661    1
```

教科書に記載の値 (beta1 mean: 1.973, beta2 mean: 0.082)とは異なりますが,より真の値(beta2: 0.1)に近いですね． 95%信頼区間の中にゼロが入っちゃってますが、、

## 10.3 階層ベイズモデルの推定・予測
- Stanファイルの作成
```S
data{
  int N;
  int Y[N];
}

parameters{
  real beta;
  real r[N];
  real s;
}

transformed parameters{
  real q[N];
  for (i in 1:N){
    q[i] = inv_logit(beta + r[i]);
  }
}

model{
  for (i in 1:N){
    Y[i] ~ binomial(8, q[i]);
    r[i] ~ normal(0, s);
  }
  beta ~ normal(0, 100);
  s ~ uniform(0, 10000);
}
```

- 結果 (一部のみ抜粋)
```
          mean se_mean   sd    2.5%     25%     50%     75%   97.5% n_eff Rhat
beta      0.03    0.01 0.34   -0.64   -0.19    0.03    0.25    0.71   621 1.01
r[1]     -3.82    0.03 1.74   -7.80   -4.77   -3.59   -2.59   -1.11  2920 1.00
r[2]     -1.19    0.02 0.88   -3.05   -1.74   -1.15   -0.60    0.43  3017 1.00
r[3]      1.99    0.02 1.09    0.13    1.22    1.90    2.68    4.42  3212 1.00
s         3.02    0.01 0.36    2.39    2.77    2.99    3.24    3.84  1200    1
```

教科書に数値の記載がないため正しく推定できているか怪しいですが, 図10.3に一致していそうです．

## 10.5 
[こちらの記事](https://qiita.com/Naka-u/items/493d96254f600ce72404) を参照ください．

## 11章
[こちらの記事](https://note.com/calmtree/n/nc69b3165c680
) を参照ください．
【解決済】環境パス・シェルスクリプトで実行できない問題

シェルスクリプトを作成し、`./ファイル名`で実行できず作業が止まってしまっているので記録。

## 状況整理
・作成済みのシェルスクリプトをホームディレクトリ/binディレクトリに格納
・作業場所(`pwd`)は、ホームディレクトリ（`/home/yuzo`）
・`./ファイル名`で実行したいので、環境パス通し済み
・エラー【-bash: ./homesize.sh: そのようなファイルやディレクトリはありません】

```
[yuzo@localhost ~]$ pwd
/home/yuzo
[yuzo@localhost ~]$ ls -l ~/bin/
合計 4
-rwxr-xr-x. 1 yuzo yuzo 32 11月  5 15:07 homesize.sh
[yuzo@localhost ~]$ echo $PATH
/home/yuzo/.local/bin:/home/yuzo/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/yuzo/bin:~/bin
[yuzo@localhost ~]$ homesize.sh 
68K	/home/yuzo
[yuzo@localhost ~]$ ./homesize.sh
-bash: ./homesize.sh: そのようなファイルやディレクトリはありません
[yuzo@localhost ~]$ 
```

## 自分の理解

`./ファイル名`で実行するので、サブシェル上で実行されるため、bashの設定ファイルに'~/.bash_profile'に環境パス次のように記述済み。

```[yuzo@localhost ~]$ cat ~/.bash_profile 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs

PATH="$PATH:~/bin"
```
編集内容を有効にするため、sourceコマンドで設定ファイル読み込み済み。

この状態で、なぜシェルのパスが見つからないとエラーがでてくるのか理解できません。

```
[yuzo@localhost ~]$ ./homesize.sh
-bash: ./homesize.sh: そのようなファイルやディレクトリはありません

```
.csvを.txtにするだけで救える命（データ）がある

## 結論：CSVファイルの拡張子は.txtにするといい

以上。以下、その背景を解説する。

また、操作方法はMicrosoft 365 for Bussinessのエクセル（2022-11-05時点）を前提としている。

## CSVファイルの3パターンのエンコード

csvファイルを企業間でやり取りするケースは多い。その時に問題になるのが、エンコード。

.csvファイルでありえるエンコードは以下の3種類。

- SJIS
- BOMありUTF8
- BOMなしUTF8

以下良し悪し

| エンコード | 良し | 悪し |
|:-:|:-:|:-:|
|  SJIS | 20年前のシステムとの互換性。 ダブルクリックでエクセルで開ける | サーバサイドで扱いにくい。自動化には向かない   |
| BOMありUTF8  | サーバーサイドで扱えるし、BOMありならエクセルのダブルクリックで開ける  |  BOMなし前提で取り込むシステムが大混乱  |
| BOMなしUTF8  | UTF8と言えば普通はこっち   | .csvファイルのダブルクリックでエクセルが化ける  |


## 普通はUTF8と言えばBOMなし

BOMとはバイトオーダーマークのことで、バイト順序気にしないと行けないのはUTF16の方。そもそもUTF8はバイトオーダーなど教えてもらわなくてもいい。

さらにBOMありUTF8のファイルを結合すると途中にゴミが入る。

例えば以下のようなBOMありcsvがあったとする。
（`less -U ファイル名` でBOMを表示できる。まずこのオプションを探す段階で苦労する）

```
<U+FEFF>id,sei,mei
1,gouda,takeshi
2,minamoto,shizuka
```
bomなし前提でのシステムがこのCSVを読むと、idカラムの指定は `<U+FEFF>id`としないと行けない。そんなの無理。

とはいえ、.csv拡張子のファイルはうっかりダブルクリックしちゃう。エンジニアなら糸へんだらけの文字化けをみて、あぁUTF8かと思うけど、非エンジニアは引く。そしてエンジニアは非エンジニアを引かせちゃいけない。システム設計の最善手は驚き最小限の法則だ。

じゃぁやっぱりBOMつきUTF8の.csvなら文字化けセずに開けるんだから驚かせずに済んでいいじゃないという判断もありえる。そういう判断をするシーンはとても多い。

## そもそも.csvをダブルクリックしてはいけない

.csvをダブルクリックすることで、エクセルは「エンコードの自動判定」「型の自動判定」を行う。BOMつきUTF8にすることでエンコードの自動判定はクリアされるが、型の自動判定でやっぱり事故が起こる。例えば以下のようにデータが壊れる

- 電話番号の `09012345678` が数値扱いになって　`9012345678` と前ゼロが欠落する
- 長めのID `1588774516955942912` のような文字列が数値扱いになって `1.58877E+18` という指数表記になる。一度指数表記になったら有効数字が減って元データも`1588774516955940000` と変わってしまう
- `11-12` のようなIDが日付扱いになって`11月12日` と表記される。実データも `2022/11/12` とデータが変わる

化ける化けないどころか情報を失うのが問題。しかもデータが空になるわけではない。別物がこっそり入る。ウソが入る。消えたことは分かるがすり替わったことは見つけにくい。「エクセルあるある」など悠長なことを言ってる場合ではない。

これらはPowerQueryなら型の変換画面が一拍挟まるので、自動変換させずに取り込むことができる。

## 解決策は「必ずPowerQueryを起動させて型をしてして取り込む」しかない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/83802938-7d82-f755-25e6-149c37a06fe1.png)

`データ→データの取得→ファイルから→テキストまたはCSVから ` という導線で取り込むしかない。ダブルクリックで開けるのから比べると格段に不便。不便だがしかたない。

文字が化ける化けないが問題じゃない。データを失うのが問題なのだ。

だったら最初から、.csvなんて要らない。.txtにしてしまえばダブルクリックで開くのはWindowsならメモ帳だ。そして今のメモ帳はBOMなしUTF8でも見れる。データとして正しい。表形式で確認したければ、PowerQuery経由でエクセルみれる。

.csvを.txtにすることで、驚かせることもなければ、データを欠落するリスクも抑えれる。

## PowerQueryのショートカット

とはいえPowerQueryを起動する導線は遠い。当然ショートカットボタンもある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/26c87385-1602-ca51-674d-cca025014c09.png)

わかりにくいが「テキストまたはCSVから」のボタンがむき出しにはなってる。

さらに、一度PowerQueryで取得したなら履歴から同じPowerQueryの設定データを取り込むこともできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/ff5cb2b3-0e55-5527-e151-bc9745932151.png)

ファイル名が違うと当然PowerQueryでカラムの型設定からやり直す必要がでるが、逆に同じ設定で取り込みたいなら都度ファイル名を揃えるというのもデータフローとしては健全かも知れない。
【Unity】Testを実行するかどうかを個別に制御する

## 本記事について

- 時間がかかる
- ある一定条件でしか実行する必要がない

等の理由で常に実行はしたくないテストがある時がある。
本記事ではそのやり方を示す。

![スクリーンショット 2022-11-05 16.04.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/29c3f8fe-7667-0c0f-2f27-24e16b362d70.png)

## 方法

```.cs
#if SKIP_DL_TEST
        [Ignore("ダウンロード先に依存するので基本はスキップ")]
#endif
        [UnityTest]
        public IEnumerator 正常系_DownloadAsync() => UniTask.ToCoroutine(async () =>
```

このように条件付きコンパイルによって[Ignore](https://nunit.org/nunitv2/docs/2.6.4/ignore.html)をつけるかどうかを切り替える。

あとはScripting Define Symbolsなり、csc.rspなりで設定するだけ。

```Assets/csc.rsp
-define:SKIP_DL_TEST
```

## 関連
https://qiita.com/Teach/items/15bf19b104aad396fe71
はじめてのFlutter開発

Flutterでスマホアプリを開発するために、公式Webサイトや書籍を読んでみましたが、ハンズオンで動かすのが身につくと思いハンズオン教材をつかってみました。
このハンズオンがおすすめです。

https://zenn.dev/takumma/books/flutter-beginners-hands-on/viewer/first-app
LPC812MAXと液晶、ACM1602K-NLW-BBWで「HELLO...」を表示(74HC164)(mbed)


x mbed2リビジョン144
x リビジョンを変更できる人むけ

x 74HC164使用

x 原因は、わからないが液晶がちらつく場合は、ウェートを調整してね!!
(電源-GND間のパスコン(47μF～100μF...するといいらしい)


![o_con88.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/df7bcc7e-5871-724d-9186-0574838536eb.jpeg)



![o_cop232.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7f488548-7efa-abbc-1e1d-c3accaade3be.jpeg)



目的
パラレルLCDのテスト
とりあえず、配線を減らしたかった。



```c++



// gpio_P_LCD_HEL_812_1


#include "mbed.h"

//*          *****  *****       ***  ***  *
//*         *       *    *     *   *    * *
//*         *       *    *     **  * * *  *
//*         *       *    *     * * * *    *
//*         *       *    *     *  ** *    *
//********   *****  *****       ***  ***  *


#define S_SCK  P0_12    //ic 3pin
#define S_MOSI P0_14    //ic 20pin
#define S_SSEL P0_13    //ic 2pin

DigitalOut s_sck(S_SCK);
DigitalOut s_mosi(S_MOSI);
DigitalOut s_ssel(S_SSEL);


void seg1(int v,int rs)
{
    for(int jj=0; jj<8; jj++) {
        if( (v<<jj) & 0x80 ) {
            s_mosi=1; //ビットが1
        } else {
            s_mosi=0; //ビットが0
        }//endif
        s_sck=1;
        s_sck=0; //clk
    }//for

    s_mosi=rs;
    s_ssel=1;
    wait_ms(1);
    s_ssel=0;
}

//文字列の表示 nana_seg
int ns_printf(const char *str1)
{

    //文字の中身がゼロか
    while(*str1) {

        //一文字出力
        seg1( *str1 ++, 1  );

    } //while

    //戻り値
    return(0);
}//ns_printf

int lcd_int[]= {
    0x30,0x30,0x30,0x38,0x08,0x01,0x06,0x08+0x04
};//lcd_init

int main()
{

    //GPIOの初期化
    s_ssel=0;
    s_sck=0;
    s_mosi=0;
    wait_ms(200); //debug

    //液晶の初期化
    for(int ii=0; ii<8; ii++) {
        seg1( lcd_int[ii], 0);
        wait_ms(2);
    }//for

    seg1( 0x80+(0x40*0)+0, 0  );  //1ライン目にカーソルを移動
    ns_printf( "START" );
    wait_ms(700);

    //画面クリア
    seg1(   0x01, 0  );
    wait_ms(5);

    seg1( 0x80+(0x40*0)+0, 0  );  //1ライン目にカーソルを移動
    ns_printf( "HELLO" );

    seg1( 0x80+(0x40*1)+0, 0  );  //2ライン目にカーソルを移動
    ns_printf( "WORLD" );

    while(1) {} //無限ループ

}//main




```
G検定受験感想

11/5にG検定を受験しました。
もし、落ちた時に範囲や感じたコツを確認するために感想を残します。

<h3>受験感想</h3>

感想
５割くらいは、自信を持って解けたと感じました。
Udemyの問題集に対して過学習になってしまっていたなと実感

内容的な観点
G検定問題集などを解いておけば、即答できるのが5割
言葉の意味を理解して、ITの知識、法律系に詳しければ解ける問題が５割の感覚でした。

勉強内容
・UdemyのG検定の問題集400問を平均90%以上の正答率にする
・UdemyのG検定の講座を受講

反省点
表面的な用語の理解はできていたが、少し掘られた内容の問題が出ると対応ができなかった
不適切な答えはどれですか問題になった時に、その用語のかなり特徴的な部分しか理解していなかったため対応ができなかった

法律系の例外や、どこがダメなのかの理解が薄かった

<h3>改善点</h3>
・会社の実践的なAI研修を受講し、AIに対して深い理解を得る
・公式が出している問題集やTwitterで見つけた問題集をとく
[docker]cURL error 7: Failed to connect to localhost portが出た時の対処法

コンテナA(localhost:8000)からコンテナB(localhost:8001)へcurl -I http\://localhost:8001を叩いた際にcURL error 7: Failed to connect to localhost port となってしまった。

## 解決方法

localhostをhost.docker.internalにするだけでOK！

```
curl -I http://host.docker.internal:8001
```
チェックボックスフィールドのカウント


+ [行数を取得し、レポートの総計で割ります](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000Jeby7SAB)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/78e5954c-9807-952e-9bb7-6750d2cb8346.png)


584/649 を分割して、一番下の総計だけでなく、各スイート タイプの合計の下に表示しようとしています。一番下に「総計」を表示する必要はありません。すべてのバージョンを試したような気がしますが、現在の式は次のとおりです。

```
RowCount / PARENTGROUPVAL(RowCount, Suite__c.Suite_Type__c, Suite__c.Occupied__c)
```


既にチェックボックス フィールドがあるので、それを合計します。チェックボックスの値は 1 または 0 として保存され、それらを合計できます 

```
Suite__c.Occupied__c:SUM / RowCount
```
プログラムの命名は立派な設計行為

# はじめに
最近、技術書で「[良いコード/悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方](https://gihyo.jp/book/2022/978-4-297-12783-1)」という本に出会いました。

自分に足りていなかった設計の考え方についてかなり勉強になりました。
本当に良かったので内容を忘れないようにQiitaに書き残そうと思います。またこれを機にアウトプットの習慣化ができればいいなと思っています。

動くプログラムは割と誰にだって書けると思いますが、良い構造へ改善するためのアプローチを知っている人は世の中に少ないのではないかと思います。
その少数派、価値の高いレイヤーに参加できる入門書が本書だと思いました。

その中でもまずは「**名前設計**」について執筆していきたいと思います。

# 目次
1. [意味不明な命名](#意味不明な命名)
2. [命名は省略を避けよう](#命名は省略を避けよう)
3. [変数の使いわましを避けよう](#変数の使いわましを避けよう)
4. [名前設計を怠ったプログラムの末路](#名前設計を怠ったプログラムの末路)
5. [参考文献](#参考文献)



# 意味不明な命名
```swift:UnintelligibleNaming.swift
// 何してるんだ・・・？
var d = 0
d = p1 + p2
d = d - ((d1 + d2) / 2)
if (d < 0) {
    d = 0
}
```
このコードだけ見たエンジニアは、このコードが何をしたいのか見当もつかないはずです。
このコードは何と「ゲームの相手に与えるダメージ計算ロジック」なんですって。
なぜこんなにも難解なコードになってしまったのか、原因は明確で「**変数名の省略**」です。

下記が対応表になります。
|変数|意味|
|-|-|
|d|ダメージ量|
|p1|プレイヤー本体の攻撃力|
|p2|プレイヤーの武器の攻撃力|
|d1|敵本体の防御力|
|d2|敵の防具の防御力|






# 命名は省略を避けよう
つまり、全て日本語に置き換えると下記のようになります。
```swift:UnintelligibleNaming.swift
var ダメージ量 = 0
ダメージ量 = プレイヤー本体の攻撃力 + プレイヤーの武器の攻撃力
ダメージ量 = ダメージ量 - ((敵本体の防御力 + 敵の防御力) / 2)
if (ダメージ量 < 0) {
    ダメージ量 = 0
}
```
なので、省略せずに名前設計をすると下記のようなコードになります。
```swift:UnintelligibleNaming.swift
var damageAmount = 0
damageAmount = playerArmAmount + playerWeaponPower
damageAmount = damageAmount - ((enemyBodyDefence + enemyArmorDefence) / 2)
if damageAmount < 0 {
    damageAmount = 0
}
```
一番最初の命名が省略されたコードと比較すると可読性が上がったと思います。
```swift:UnintelligibleNaming.swift
var d = 0
d = p1 + p2
d = d - ((d1 + d2) / 2)
if (d < 0) {
    d = 0
}
```







# 変数の使いわましを避けよう
```swift:UnintelligibleNaming.swift
var damageAmount = 0
damageAmount = playerArmAmount + playerWeaponPower // ・・・　①
damageAmount = damageAmount - ((enemyBodyDefence + enemyArmorDefence) / 2)
if damageAmount < 0 {
    damageAmount = 0
}
```
改善が見られたように思えるこのコードですが、まだ修正すべき点があります。
`damageAmount`に目的に沿わない再代入が行われている点です。

①の処理を和訳すると
「プレイヤー本体の攻撃力とプレイヤーの武器の攻撃力を足したものはダメージ量です」となります。ですが本来は
「プレイヤー本体の攻撃力とプレイヤーの武器の攻撃力を足したものはプレイヤーの攻撃力です」が正しいはずです。

コードで書いてみましょう。
```swift:UnintelligibleNaming.swift
let playerAttackPower = playerArmAmount + playerWeaponPower
```
こちらの方が目的に合った変数を用意できて、可読性が高いと思われます。

全体的に修正を加えると、下記のようになります。
```swift:UnintelligibleNaming.swift
let playerTotalAttackPower = playerArmAmount + playerWeaponPower
let enemyTotalDefence = enemyBodyDefence + enemyArmorDefence
var damageAmount = playerTotalAttackPower - (enemyTotalDefence / 2)
if damageAmount < 0 { damageAmount = 0 }
```
攻撃力と防御力とダメージ量の目的ごとの変数が用意され、各変数の関係性が分かりやすくなったと思います。

ご紹介させていただいた技術書では、この後に「メソッド化、クラス化をしていこう」という流れになります。
この記事は名前設計について執筆させていただきたいので趣旨がズレるため割愛させていただきます。





# 名前設計を怠ったプログラムの末路
https://qiita.com/MinoDriven/items/37599172b2cd27c38a33
> 本記事の考えは、「名前に注意を払い、名前とロジックを対応付ける」ことを前提としています。従って、名前に無頓着だと全てが瓦解します…。

名前設計を怠った場合に、高確率で闇コードが出来上がってしまいます。
開発者一人一人が名前設計について向き合わなければいけません。




# 参考文献
- [良いコード/悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方](https://gihyo.jp/book/2022/978-4-297-12783-1)
【論文読み】AIのリスクと倫理

## はじめに
こんにちは。論文を読んだ結果の紹介記事です。  
今回紹介するのは、「AIのリスクと倫理」という論文です。  

- タイトル：【論文読み】AIのリスクと倫理
- 出典：久木田水生; 人工知能学会、 2022   
- URL：  https://www.jstage.jst.go.jp/article/pjsai/JSAI2022/0/JSAI2022_2J6OS24b01/_pdf/-char/ja


## 概要
- 倫理的・法的・社会的問題は、ELSI（Ethical, Legal and Social Issues）の頭文字をとったものの事である。  
- 2021 年 4 月には欧州委員会が AIに関する規制案を発表。AI システムが「受け入れられないリスク」、「高いリスク」、「低い、あるいは最小限のリスク」を生み出すものに分類され、それぞれに対して異なるレベルの規制を課すことを提案。


## 特徴
- 倫理とは固定され、実践に先立って倫理的な良し悪しがすべて決まっているようなものではない。私たちの判断の前提を問い直し、場合によっては規範を改訂するというプロセスを含んでいるものである。それゆえ倫理的なガバナンスは固定された基準でリスクを評価するようなものではありえない。

## 想定される適用例
- AI応用の全般  


## 参考
- [AIのリスクと倫理](https://www.jstage.jst.go.jp/article/pjsai/JSAI2022/0/JSAI2022_2J6OS24b01/_pdf/-char/ja)
【GitHub】github pagesを作ってもURLが表示されない


# はじめに
github pagesを利用したが、参考にしたサイトと同様の手順で進めてもURLが表示されず、作られているのかわからなかった。

# 結論
ここに出てた。
![スクリーンショット 2022-11-05 15.26.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/b115c02c-7861-d9ad-0db5-18f3814096c4.png)


# 環境
| No |    項目     |   内容    |
|---:|-------------|------------|
| 1  |      OS       |   MacOS Monterey ver 12.5.1     |
| 2  |      Xcode     |   14.1 |

# 実際進めた手順
1. 「ID名.github.io」という名前のリポジトリ名を作成する。
1. READMEのファイルを作って、次にindex.htmlを作る。(READMEを作ったのは、github上でファイルを作るにはまず何かしらのファイルを作る必要があるから。index.htmlの名前は変えない。ここの中身がWEBサイトの中身になる。)

2. 下図の順でクリックする。
![スクリーンショット 2022-11-05 15.18.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/7cc222aa-b4ec-bf4f-8b33-f42359a9cf3a.png)

3. 「Save」すると下図のように表示される。（他の記事だとURLがオレンジ色とかにハイライトされてるけどちょっと下の方に表示されるようになった。）![スクリーンショット 2022-11-05 15.26.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/5cfad84c-d7df-da58-0f04-e50a04e3ac6b.png)

4. 「Visit site」でリンクに飛ぶと、上で設定したindex.htmlが表示される。

# おわりに
以上の手順でwebsiteを公開することができた。
最新のUIと、参考記事のUIが異なるだけでパニックになってしまったので、ちゃんと今表示されてる内容を読んで進みます。
terraformでGCPやる際の認証方法(ユーザアカウント編)

GCPのリソース作成にTerraformを利用するときのお話。
恐らくサービスアカウントによる認証の場合は問題ないと思いますが、ユーザアカウントによる認証でTerraformを利用する場合に１０分ほど溶かしたので備忘録しておきます。

# GCPでTerraformやる場合の正しい認証コマンド　(結論！)
```bash
$ gcloud auth application-default login
```

# GCPでTerraformやる場合、不十分な認証コマンド　(失敗例)
```bash
$ gcloud auth login
```

# 不十分な認証コマンドでterraform applyするとどうなるか？
以下のように、`invalid_grant`という400エラーが発生してしまいます。
```
module.stg.google_storage_bucket.XXXXXXXXXXX: Creating...
╷
│ Error: Post "https://storage.googleapis.com/storage/v1/b?alt=json&prettyPrint=false&project=projectXXXXXX": oauth2: cannot fetch token: 400 Bad Request
│ Response: {
│   "error": "invalid_grant",
│   "error_description": "Bad Request"
│ }
│ 
│   with module.stg.google_storage_bucket.XXXXXXXXXXX,
│   on ../../modules/XXXXXXXXXXX.tf line 164, in resource "google_storage_bucket" "XXXXXXXXXXX":
│  164: resource "google_storage_bucket" "XXXXXXXXXXX" {
│ 
╵
```

はじめログインしているのになぜ？と思いましたが、`gcloud auth login`はあくまでCLIとしてのログインのようです。(たぶんです)
一応、[このあたり](https://cloud.google.com/sdk/docs/authorizing?hl=ja#set_up_application_default_credentials)に説明がありますが、いまいち曖昧な感じもする気がしています。難しいですね。

この解決策に気づけたURLも一応残しておきます。→[こちら](https://stackoverflow.com/questions/72849502/terraform-returns-invalid-grant-for-gcp-when-attempting-to-create-load-balance)

現場からは以上です！
ファイル、Salesforce CRM Content、Salesforce ナレッジ、ドキュメント、添付ファイルの違い


+ [ファイル、Salesforce CRM Content、Salesforce ナレッジ、ドキュメント、添付ファイルの違い](https://help.salesforce.com/s/articleView?id=sf.collab_files_differences.htm&type=5)

|種類|目的|一般的な用途|最大ファイルサイズ｜
|:---|:--------------------|:--------------------|:--------------------|
|[ファイル] ホーム	|クラウドの Salesforce ファイルをアップロード、保存、検索、フォロー、共有、およびコラボレーションします。|ファイルをアップロードして、共有の準備ができるまで非公開で保存します。ファイルを同僚やグループと共有してコラボレーションを行ったり、フィードバックを受け取ったりします。[ホーム] タブ、[Chatter] タブ、プロファイル、レコード、またはグループで Chatter フィードの投稿にファイルを添付します。|2G|
|SALESFORCE CRM CONTENT	|会社の公式なファイルを公開、同僚と共有、顧客に配信します。|営業プレゼンテーションを作成、コピー、または変更し、自分だけが表示および処理できるように保存します。準備ができたら、社内の他のユーザがアクセスできるように公開します。コンテンツパックを作成して、顧客に送信します。|2 GB Connect REST API によるアップロード時: 2 GB (ヘッダーを含む)　REST API によるアップロード時: 2 GB (ヘッダーを含む)　SOAP API によるアップロード時: 38 MB　Bulk API によるアップロード時: 10 MB　Bulk API 2.0 によるアップロード時: 150 MB　Visualforce によるアップロード時: 10 MB|
|SALESFORCE ナレッジ	|知識ベースのコンテンツ (記事) を作成および管理します。社内ユーザや顧客が必要な記事をすぐに見つけて表示できます。顧客には、カスタマーポータル、パートナーポータル、Service Cloud ポータル、Lightning プラットフォームサイトを利用している人々も含まれます。|[記事の管理] タブを使用して記事の作成、編集、公開、アーカイブを行います。または、[記事] タブを使用して公開記事の検索と表示を行います。カスタマーポータル、パートナーポータル、Service Cloud ポータル、Lightning プラットフォームサイトで Salesforce ナレッジが有効になっている場合、顧客およびパートナーが記事にアクセスできます。Web サイト訪問者が記事を参照できるよう、公開知識ベースを作成します。|5 MB|
|[ドキュメント] タブ	|Web リソース (ロゴ、DOT ファイル、その他の Visualforce 資料など) をレコードに添付せずにフォルダに保存します。|[ドキュメント] タブにロゴをアップロードして、ミーティングのお願いにカスタムロゴを追加します。|5 MB 、カスタムアプリケーションロゴ: 20 KB|
|添付ファイル|選択した詳細ページの [添付ファイル] 関連リストからレコードにファイルを添付します。|ファイルを [添付ファイル] 関連リストで添付して、特定のレコード (行動、マーケティングキャンペーン、連絡先、ケースなど) に追加します| 添付ファイル: 25 MB、フィードの添付ファイル: 2 GB|

ファイルタイプはすべてサポートされています。
Google UXデザイン：ワイヤーフレームの紹介

# はじめに

わたしが[Google UX Design Crtificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/1ed400d1-bbdf-302d-70be-3175620c3912.png" width="800">

# ２つの忠実度デザイン

デザインとは、ユーザーが経験している現実の問題を解決するものです。そして、強いデザインは常にユーザーを前面に押し出すものです。

デザインはさまざまなレベルの忠実度（Fidelity）を持つことができます。UXでは、忠実度は、デザインが最終製品の外観と感触にどれだけ近いかを意味します。

### Low-fidelity design(lo-fi、ローファイ)
- デザインが低忠実度である場合、それは複雑さの度合いが低く、洗練されていない、または磨かれていないことを意味します。
- UXデザイナーが低忠実度のデザインを使うのは、アイデアを素早く出し、探求の余地を残しておきたいときです。

### High-fidelity design(hi-fi、ハイファイ）
- デザインが高忠実度である場合、それは最終製品の外観や質感と密接に一致し、全体としてより洗練されたものであることを意味します。
- UXデザイナーが高忠実度を使うのは、実際の製品のように見えるデザインをテストして、ユーザーからより具体的なフィードバックを得たいときです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/29e4ea18-797e-4b8c-3de4-d399c8901588.jpeg" width="１００">

# ワイヤーフレーム

ワイヤーフレームは、低忠実度デザインの1つです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/ac07c7ab-256a-5b00-1919-53bd69c95b86.png" width="２５0">

:::note info
ワイヤーフレームは、手書きでもデジタルツールでも作成できますが、通常、紙に絵を描くことからワイヤーフレームを作り始めます。
:::

### 特徴①基本的なページ構成を確立

ワイヤーフレームは、色や画像などのビジュアルを追加する前に、ページの基本構造を確立します。そのため、プロジェクトの初期にチームが同じ見解を持つためのアウトラインとして機能します。

### 特徴②製品の意図された機能を強調

ワイヤーフレームを描くときは、要素が全体的な機能にどのように役立つかを考える必要があります。例えば、ボタンの機能は明確であるべきで、その機能はボタンの描き方によって表現される。

### 特徴③デザイナーの時間とリソースを節約

ワイヤーフレームを使うことで、チームはさまざまなデザインの選択肢を素早く試すことができます。また、プロジェクトに関わるすべての人にとってのガイドとなり、のちの時間を節約できます。
Wordle攻略用のアプリケーションをruby.wasmで作りつつ貢献した話

Wordleという、いくつかのヒントをもとに5文字の英単語を当てるゲームがあります。

https://www.nytimes.com/games/wordle/index.html

ヒントには次のような物があります。
- 正解の単語に含まれない文字
- 正解の単語に含まれる文字
- 正解の単語に含まれて、位置が一致した文字

これらの情報を元に英単語の辞書から候補となる単語を検索するアプリケーションを作りました。
次にスクリーンショットを表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15964/3750ba53-4c2f-5f3a-465b-88e053def98a.png)

上から

- 正解の単語に含まれない文字
- 正解の単語に含まれる文字
- 正解の単語に含まれて、位置が一致した文字

を入力して検索すると、候補になる文字列を表示します。
このアプリケーションは辞書を検索するだけです。
辞書も5文字の英単語に限定されているので、せいぜい4500語です。
ブラウザに配信するスクリプトに埋め込める分量です。
つまり辞書と検索機能の両方をブラウザだけで完了出来る小さなアプリケーションです。

現在RubyのWebAssemblyバイナリが開発されています。
RubyKaigi 2022の一日目のKeyNoteで発表されていました。

https://www.youtube.com/watch?v=-x8pU6mGtPI&t=109s

このテクノロジーをつかうとブラウザだけで完了出来る小さなアプリケーションをRubyで書くことが出来ます。
とういうわけで、先ほどのアプリケーションはRubyスクリプトで実装しています。
Google Chroemの開発ツールで見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15964/bbcc8026-0b89-dc9c-4706-9dcd87a2c483.png)

wordle_search.rbとmain.rbというRubyスクリプトをダウンロードしている事が確認出来ます。
HTMLはこんな感じです。

```index.html
<script src="https://cdn.tailwindcss.com"></script>
<script defer
  src="https://cdn.jsdelivr.net/npm/ruby-head-wasm-wasi@0.4.0/dist/browser.script.iife.js"></script>
<script type="text/ruby" src="wordle_search.rb"></script>
<script type="text/ruby" src="main.rb"></script>
```

ruby.wasmを実行するためのbrowser.script.iife.jsを読み込みます。
それから`type="text/ruby"`属性をもつscriptタグで、実行したいRubyスクリプトを読み込みます。
RubyKaigiで発表された時点では、browser.script.iife.jsはsrc属性に対応していませんでした。
次のようにscriptタグにインラインで書いたRubyスクリプトを実行していました。

```html
  <script type="text/ruby">
    puts "Hello, world!"
  </script>
```

これは開発時にエディタのシンタックスハイライトが効かない点が不便です。
多くのエディタはHTMLに埋め込まれたJavaScriptのシンタックスハイライトをサポートしています。
Rubyスクリプトのシンタックスハイライトには対応していません。
ruby.wasm自体が開発途上のものなので、エディタが先行して対応しているはずはありません。

scriptタグからのRubyスクリプト読込がsrc属性に対応していれば外部ファイルを読み込めます。
ファイルには自由な拡張子が指定できます。
拡張子をrbにすれば、一般的なエディタでRubyスクリプト用のシンタックスハイライトできるようになります。
このためのsrc属性に対応するための、PullRequestを作成しました。

https://github.com/ruby/ruby.wasm/pull/49

すでにマージされており、上記のように便利に使えています。
ABC129 C - Typical Stairs も DP でアプローチ

Qiita で解説が少ない問題だったので触れてみる。
問題は[**コチラ**](https://atcoder.jp/contests/abc129/tasks/abc129_c)。

# いきなり回答
雑な気もするが一旦、以下のコードを動かしてほしい。

```dp.cpp
#include <iostream>
#include <vector>
#include <set>
using namespace std;

int main() {
    // data input --------------> 
	int N, M; cin >> N >> M;
	int a; set<int> nums;
	for (int i = 0; i < M; i++) {
		cin >> a; nums.insert(a);
	}
    // <-------------------------
    // COMMENT
    // memory the broken stair information with SET.
    // you can check whether current stair is broken with O(N).
    // this is why i use set.

	vector<long long>dp(N + 1, 0); dp[0] = 1;
	for (int i = 1; i <= N; i++) {

		if (nums.find(i) != nums.end()){ //if current stair is broken, let's skip. 
			continue;
		}

        //key point-----------------
		if (i-1 >= 0)
			dp[i] += dp[i - 1];
		if (i-2 >= 0)
			dp[i] += dp[i - 2];
		dp[i] = dp[i] % 1000000007;
        //---------------------------

	}

	cout << dp[N] ;
	while (1) {}
	return 0;

}
```

# 回答例1 を試す
cout << dp[N] の前に cout で dp を羅列させてみました。

```.cpp
//input
6 1
3

// dp
1 1 2 0 2 2 4

/*
STAIR#0
Every one would start from here.
so dp[0] = 1.

STAIR#1
There is only one way to reach STAIR#1.
so dp[1] += dp[0].

STAIR#2
There are two ways to reach STAIR#2.
1 => 2....dp[2] += dp[1]　　// we often to write it, such as "dp[2] += dp[1]+1".
0 => 2....dp[2] += dp[0]    // but it's not good way to caulcurate combination number.

STAIR#3
here is broken. so no need to action.

STAIR#4
there is only one.
3 => 4....dp[4] += dp[2]

STAIR#5
4 => 5....dp[5] += dp[4]
3 => 5.X.. stair 3 is broken

STAIR#6
5 => 6....dp[6] += dp[5]
4 => 6....dp[6] += dp[4]
*/

// answer
4
```

上記にあるように、前段、前々段の組み合わせを足していけば答えになることが分かる。
※組み合わせだから掛けて行けば良いかと思い、試したがダメだった。

# 手を動かしてみよう
何でも良い、上記でコメントした内容に沿って
メモしていけば分かる。以下のような適当な図で良い、やってみる。
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/2f5ee552-9131-f49d-71b4-fd2a1c2aba25.jpeg)

動作例としてデータが足りないのであれば
回答例 2, 3 を試して、考えてみると良い。

"前段、前々段の和" に気が付くと簡単だが、
そこに行くまでが大変だったりする(笑)
PythonのOpenEXRモジュールをpipで入れるとImfIO.hが見つからない場合の対処法@Rocky Linux 8

# 自己紹介
株式会社digitalbigmoのパイプラインエンジニアの小池@plinecomです。

# これは何？
pythonのOpenEXRモジュールをpipで入れようとすると、以下のようなエラーが出ることがある。
RockyLinux 8 での対処方法を記す。

```terminal:terminal
    OpenEXR.cpp:36:10: fatal error: ImfIO.h: No such file or directory
     #include <ImfIO.h>
              ^~~~~~~~~
    compilation terminated.
    error: command 'gcc' failed with exit status 1
```    
# 対処方法
```terminal:terminal
dnf install -y python3 python3-devel gcc gcc-c++ epel-release zlib-devel
dnf config-manager --set-enabled powertools
dnf localinstall -y --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm
dnf install -y OpenEXR-devel
pip3 install OpenEXR
```
おまじないのように上記の呪文を１行ずつ順番に唱える。
簡単に解説すると、pipで引っ張ってきているOpenEXRのソースが足りないっぽいので、いっそのこと別のところからコンパイル済みのバイナリをもらってきて、それで充足している。

# 宣伝
株式会社digitalbigmoでは美肌プラグインの販売や映像VFXの制作業務を行なっています。ご興味のある方は、webページを見にきてください。一緒にお仕事しましょう。

https://digitalbigmo.com
変更セット

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

+ [送信変更セット](https://qiita.com/Keiji_otsubo/items/defa3357e9f1dd8fb1c0)


# 変更セット：グローバル値セット

+ [変更セット：グローバル値セットについて](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Kgcjf)

実際に試してないのですが、グローバルピックリスト値には変更できないようなことが書かれています。
https://docs.copado.com/articles/#!copado-ci-cd-publication/cannot-change-which-global-value-set-this-picklist-uses-deployment-error

https://salesforce.stackexchange.com/questions/323961/how-to-deploy-picklist-field-whose-value-set-was-changed-from-local-to-global

アイデアも出ているのですが、この中では出来たと投稿している人もいますね。
https://ideas.salesforce.com/s/idea/a0B8W00000GdhUWUAZ/migrate-global-picklists-in-a-change-set

ただ、一旦グローバルピックリスト値にすると変更できないのとかの制約もあるようです。
https://ideas.salesforce.com/s/idea/a0B8W00000GdiLGUAZ/change-picklists-assigned-global-value-set

+ [Error: "Global value set ....cannot be resolved" when deploying change set](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007EbLIT)

:::note alert
Global value set 'Assessment_Outcome__c' in record type 'Assessment' on the entity 'PS_Program_Audits__c' cannot be resolved
:::

:::note
 I found the answer with the help of my team so putting it here to help others who may face this issue:

Attach the system admin profile to the change set and it works !

私のチームの助けを借りて答えを見つけたので、この問題に直面する可能性のある他の人を助けるためにここに載せておきます。

システム管理者プロファイルを変更セットにアタッチすると、機能します。
:::


# 変更セットで渡せるもの

+ [How to pass changes in My Domain & Theme and Branding to another Org with Change Sets?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PfDOz)

:::note
I've found out that my request is not possible to do using Change Sets.
The components available in Change Sets are listed here:

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


# できない

+ [ユーザー アクセス ポリシーが変更セットの展開に失敗する](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZA1WS)

:::note
解決できませんでした。結局、本番組織で手動で作成することになりました。
:::
AUTOSAR  Countdown Calendar 2022 満席御礼

AUTOSAR Advent Calendar 2022

https://qiita.com/advent-calendar/2022/autosar

を開催することになりました。　

 <この項は書きかけです。順次追記します。>


幸い、100席　満席をいただいております。ありがとうございました。　
予定では200隻にする予定です。しばらくお待ちください。

詳細は、順次、閲覧していただいた際に、ご意見をたまわりますようお願いいたします。　

AUTOSAR 21-11, 335文書読んだ。2022年6月初旬にFO, AP, CP全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

に登録した文書番号順に100登録しています。　

昨年、6ヶ月かかった記事を、今年１ヶ月で書けるとはとうてい思いません。　
その前の前の年は、３ヶ月で書きました。仕事時間中に作っていたものです。
今は、仕事では投稿できず、仕事時間以外で作成しています。


各文書を紹介する感じというよりは、
文書側の課題と、自分の整理の課題の両方を記述して、　
参加者の方からのご意見で解決していこうという、
新しい参加型AdventCalendarを企画しています。


 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞


AUTOSAR 「完全に理解した」

https://qiita.com/kaizen_nagoya/items/51983798ad7902b33cb1

A big wrapping cloth with the miniature garden


# Countdown Calendar 2022

今年企画した6つのCountdown Calendarと、それぞれの記事一つをご紹介します。

AUTOSAR Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/autosar

AUTOSAR References to ISO, IEC, ITU, IEEE, RFC and SEA etc.

https://qiita.com/kaizen_nagoya/items/d7d252211e10a79516df

Automotive Handbook Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/automotivehandbook

Basic principles, ボッシュ自動車handbook(英語)11版まとめ<2>

https://qiita.com/kaizen_nagoya/items/24a1ba5da3d09b2a95d1


2022 いいねをいただいた記事ランキング(O.K.版) Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/goods

2022年１月下旬　いいねをいただいた記事　16

https://qiita.com/kaizen_nagoya/items/0ee589a8edaeab24fd2a

AdCale(O.K.) Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/adventcalendar2022

「会議は15分未満」に。小耳にはさんだ話。

https://qiita.com/kaizen_nagoya/items/510c47c5d1e8d03145db

ABC language (O.K.版） Advent Calendar 2022

https://qiita.com/advent-calendar/2022/abc_ok

LLVMソースコードのコンパイルをしようと思ってハマった罠とそこから脱出するための努力

https://qiita.com/kaizen_nagoya/items/16f270e42b947756ced3

ABC maker(O.K版） Advent Calendar 2022

https://qiita.com/advent-calendar/2022/abcmaker

JAXA/IPA クリティカルソフトウェアワークショップ WOCS言語関連発表(改定版)

https://qiita.com/kaizen_nagoya/items/4789832baf494cb74626

CountdownCalendar2022 報告

https://qiita.com/kaizen_nagoya/items/5b4b99cb9ad571f4094b

誤差の評価が苦手（専門分野以外）

https://qiita.com/kaizen_nagoya/items/cc3a50827b24ab80985f



https://qiita.com/kaizen_nagoya/items/96411f20632e7f3ff73a
# 文書履歴(document history)
ver. 0.01 初稿 　20221105
【Angular】練習アプリ作成日記（アプリインストール～何を作る？編）

# はじめに
IT業界で働く自分は、客先常駐で様々な開発手法を学んできました。
どの開発方法も素晴らしいもので、自分もいずれは・・・
そんな想いで日々の業務をこなしています。
暇な時は自分のPCに入れたVSCodeでプログラミングをやっていて
ちょうどいいところまで来ましたので、自分のノウハウをここに残したいと思います。
長い目で見ていただければと思います。

# 開発環境を準備する。
VSCodeで作業を行います。以下のリンクで実施してください。
[VSCodeのダウンロードサイト](https://code.visualstudio.com/download)
※インストールは自身のPCにあったもので実施してください。
次にVScodeを開いてください。
初めは、英語で表示されると思いますので、日本語で表示するようにしましょう。
左のメニューの拡張機能の検索メニューに[japan]と入力してください。
一番上に、日本語表示するためのツールがありますので、
それをインストールしてください。
<font color="Red">※緑のマーカーで塗ってあるものです</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1991436/84829e78-5656-6bca-bfe3-6de40aaef422.png)

# 何を作ろうか？
最近、Angular、typeScriptなどの知識を習得しました。
とりあえず、検索して表示するものを作ってみようと思います。

# どうやって作ろうか。
フロントがjavaScriptとAngular、
バックエンドがpythonを使ったものを作ってみようと思います。

# 環境準備について
それっぽく作ってみるために、以下のものを準備しました。
* git
* PostgreSQL
* python
* node.js

詳しくは次の記事で説明したいと思います。

# まとめ
こんな感じの記事を書こうと思いますので、よろしくお願い致します。
【Rails】params周りの理解を深める回〜"param is missing or the value is empty"へのアプローチ法〜

Railsのparams周りのエラーについて。
とある情報を保存しようとしたときに出てしまったので残す。
<h2>エラー文</h2>

![スクリーンショット 2022-11-05 13.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059549/ce21ac0d-a192-5bc3-6234-d477c05cbb5e.png)

paramsが存在していない、または空であるという意味らしい。

<h3>問題となっているファイルのコード</h3>

```ruby:memory_submits_controller.rb
class MemorySubmitsController < ApplicationController
  def index
    @memorys = MemorySubmit.all 
  end

  def new
    @memory = MemorySubmit.new
  end

  def create
    memory = MemorySubmit.new(memory_params)
    if memory.save
      redirect_to :action => "index"
    else
      redirect_to :action => "new"
    end
  end

  private 
  def memory_params
    params.require(:memory).permit(:body)
  end
end
```
出力は以下の通りである。ちゃんと情報は渡せてるように思うが、、、
```
Parameters: {"authenticity_token"=>"[FILTERED]", "memory_submit"=>{"body"=>"aaa"}, "commit"=>"投稿する"}
```
<h2>エラー解決方法</h2>
<strong>params.require(:memory)</strong>を<br><strong>params.require(:memory_submit)</strong>
に変更して解決した。
以下が修正後のコードである。

```ruby:memory_submits_controller.rb
private 
  def memory_params
     params.require(:memory_submit).permit(:body)
  end
end
```
requireの中にはモデル名を記述してあげることで解決することができた。

<h2>ストロングパラメータ</h2>
ストロングパラメータとは
<br><br>
<strong>
Web上で受けたパラメータが、安全であるかどうか確認をおこなった上で、取得することができる仕組み
</strong><br><br>
のことである。
この仕組みを導入したことによって、意図していない、つまり安全であるかどうかわからないデータの保存や更新を未然に防ぐことができるようになった。
情報セキュリティの観点からしてみれば非常に優れた仕組みであることがわかる。

<h2>基本的な書き方</h2>
<h3>requireメソッド</h3>
paramsの中にある特定のキーに紐づいている値を抽出することができるものである。<br>
（ここではカラムに紐づいているモデルという解釈で大丈夫であろう。）
<h3>permitメソッド</h3>
許可された値だけを取得することができるメソッドであり、引数には登録を許可するカラム名全てを指定しておくことが非常に重要である。（記述していないカラムは取得されずに無視されるようになっています）

```ruby
     params.require(:memory_submit).permit(:body)
```

カラムを追加しておこなう場合は追加して記述する必要がある。
例）imageカラムを追加した場合
```ruby
     params.require(:memory_submit).permit(:body,:image)
```
<h2>適用対象</h2>
このストロングパラメータの仕組みは全てに適用されるわけではない。Viewから送信されるようなデータ（コントローラーに記述しているparams）やそれに対するメソッド(createやupdateなどのアクション)でしか原則適用がされないため、注意が必要である。<br><br>

こちらはを[公式のドキュメント](https://railsguides.jp/action_controller_overview.html#strong-parameters)参考に記述させていただいたため、こちらも一読することをおすすめしておく。
Common Modulus Attack

# 0 まず
高校1年のもちもちです。セキュリティキャンプ全国大会2021やCODE BLUE2022に参加してました。CTFをやってる最中にこれを使う問題が出てきたので備忘録もかねて書くことにしました
# 1 Common Modulus Attackとは
RSA公開鍵 {$ n,e_2$}と{$n,e_2$}と平文$m$を暗号化した暗号文${c_1,c_2}$が与えられたときに$GCD(e_1,e_2)=1$である時に平文$m$を復元できるという攻撃です(GCDが1であることは後々重要になってきます)。
# 2 原理
そもそもRSA暗号の定義について振り返ると$c=m^e$ $mod$ $n$でした。ここで$e_1s_1+e_2s_2=1$となるような$s_1,s_2$が存在した場合
```math
c_1^{s_1}c_2^{s_2}=m^{e_1s_1}m^{e_2s_2}=m^{e_1s_1+e_2s_2}=m^1=m \ (mod \ n)
```
と平文$m$が復元できる。$e_1s_1+e_2s_2=1$となるような$s_1,s_2$の求め方であるが、これは拡張ユークリッドの互除法により簡単に求めることができる。もし$GCD(e_1,e_2)\neq1$であった時、$d>1$であるような整数$d$を用いて$e_1=dE_1,e_2=dE_2$といったように書けるため$e_1s_1+e_2s_2=d(E_1s_1+E_2s_2)\neq1$となる。そのための$GCD(e_1,e_2)=1$である。

# 3　実装

https://ctf.cpaw.site/questions.php?qnum=29

例題を持ってきた。
```py
from typing import Tuple, Iterator, Iterable, Optional
def excGCD(a:int,b:int)->Tuple[int,int,int]:
    if(b!=0):
        d,y,x=excGCD(b,a%b)
        y-=(a//b)*x
        return d,x,y
    return a,1,0

def Common_Modulus_Attack(N,e_1,c_1,e_2,c_2):
    d,s_1,s_2=excGCD(e_1,e_2)
    return (pow(c_1,s_1,N)*pow(c_2,s_2,N))%N


e_1=11
N=236934049743116267137999082243372631809789567482083918717832642810097363305512293474568071369055296264199854438630820352634325357252399203160052660683745421710174826323192475870497319105418435646820494864987787286941817224659073497212768480618387152477878449603008187097148599534206055318807657902493850180695091646575878916531742076951110529004783428260456713315007812112632429296257313525506207087475539303737022587194108436132757979273391594299137176227924904126161234005321583720836733205639052615538054399452669637400105028428545751844036229657412844469034970807562336527158965779903175305550570647732255961850364080642984562893392375273054434538280546913977098212083374336482279710348958536764229803743404325258229707314844255917497531735251105389366176228741806064378293682890877558325834873371615135474627913981994123692172918524625407966731238257519603614744577
c_1=80265690974140286785447882525076768851800986505783169077080797677035805215248640465159446426193422263912423067392651719120282968933314718780685629466284745121303594495759721471318134122366715904 
e_2=13
c_2= 14451037575679461333658489727928902053807202350950440400755535465672646289383249206721118279217195146247129636809289035793102103248547070620691905918862697416910065303500798664102685376006097589955370023822867897020714767877873664
m=Common_Modulus_Attack(N,e_1,c_1,e_2,c_2)
print(m)
```
```
motimotipurinn:/mnt/c/dev/pydev$ python3 pico.py 
424311244315114354
```
cpaw{424311244315114354}
ちなみにこれは

https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%AA%E3%83%A5%E3%83%93%E3%82%AA%E3%82%B9%E3%81%AE%E6%9A%97%E5%8F%B7%E8%A1%A8

らしくrsaiseasyだそうです