OmniAICreator/Qiita-1.07M huggingface dataset:
備忘録 cpython Unicodeデータの入出力方法

訳あってPython CAPIを使い始めたが、C言語、C++初心者のため悪戦苦闘中。
ただし初心者でもわかるぐらいpython3系のUnicodeAPIは、
とっ散らかっている。おそらく過渡期なんだとCpythonのソースから感じた。

単にUnicodeオブジェクトの読み書きをしたいだけなのだが、
どうもExampleが見当たらない。備忘録として残しておく。

# Cへの入力（PyObjectを読込む）

##python2系

```c++
PyObject* o = xxxx;
if (PyUnicode_Check(o))
    return NULL;
Py_UNICODE* u = PyUnicode_AsUnicode(o);
// uはC言語で扱えるデータ
```

ここまでは分かりやすかったのだが、3分の2は廃止予定の関数、、

##python3系
どんだけ2系と違うんだよ。。

### パターン１
きっツ

```c++
PyObject* o = xxxxx;
if (PyUnicode_READY(o) == -1)
    return NULL;
void *data = PyUnicode_DATA(o);
int kind = PyUnicode_KIND(o);
Py_ssize_t len = PyUnicode_GET_LENGTH(o);

Py_UCS4* u = new Py_UCS4[len+1]; // C++ならこうか？
// Py_UCS4* u = (Py_UCS4*)calloc((len+1)*sizeof(Py_UCS4)); // Cならこうか？
for (Py_ssize_t i = 0; i < len; i++) {
    u[i] = PyUnicode_READ(kind, data, i);
}

//メモリ開放忘れるととんでもないことに
delete[] u;
// free(u);
```

### パターン２
ソースを見る限りこういう技もあるようだがやってよいのか？

```c++
PyObject* o = xxxxx;
if (PyUnicode_READY(o) == -1)
    return NULL;
int kind = PyUnicode_KIND(o);
void *data = PyUnicode_DATA(o);
if (kind == PyUnicode_1BYTE_KIND)
    Py_UCS1 *s = (Py_UCS1 *)data;
elif (kind == PyUnicode_2BYTE_KIND)
    Py_UCS2 *s = (Py_UCS2 *)data;
else
    Py_UCS4 *s = (Py_UCS4 *)data;

Py_UCS4* u = (Py_UCS4 *)s;
// uはC言語で扱えるデータ
```

うーん

```c++
// さらに枝狩りして以下と同じかと
PyObject* o = xxxxx;
if (PyUnicode_READY(o) == -1)
    return NULL;
void *data = PyUnicode_DATA(o);
Py_UCS4* u = (Py_UCS4 *)data;
```

うーん直感的に何やってるのかわからない。

## パターン3
これに落ち着いた。

```c++
PyObject *orgpy;//<-インプット

Py_ssize_t len =PyObject_Length(orgpy);
Py_UCS4 u;
for (Py_ssize_t i = 0; i < len; i++)
{
   u = PyUnicode_READ_CHAR(orgpy, i);
   //何か処理
}

```

## 迷走の理由
https://docs.python.org/ja/3/c-api/unicode.html
この説明だけ見て使える人ってどれだけいるの？
使い方を知りたいだけなのに例がないため、中途半端な説明のおかげで大混乱。
ソースを読み、デバッグしながらでようやく理解できたレベルで腹立たしい。


# pyへの出力(PyObjectを書き出す）
マルチバイト系の取り扱い方法がまだ全く分かってない。

## python2系

```c++
const char *ascii = "hoge";
PyObject* o = PyUnicode_FromString(ascii);
// oはpythonから見えるオブジェクト

const Py_UNICODE *u; //<-マルチバイトだとする
Py_ssize_t size = 1; //<- たぶん文字数？未確認
PyObject* o = PyUnicode_FromUnicode(u, size)

```

## python3系
uだけあっても書き込めない！？
謎過ぎてあってるのかどうかすらわかない。

```c++
PyObject *py;

Py_UCS1 *data = PyUnicode_1BYTE_DATA(orgpy); //<-これ1byte大事
int kind = PyUnicode_KIND(orgpy); //<-でもKINDは1とは限らない                  //kind情報がわかってないといけないということは元となるPyObjectがないとはっきりとわからないのでは？
Py_ssize_t len = zz; //あらかじめdataの長さがわかってないといけない。
// uの長さってどうやったら調べられるの？


for (Py_ssize_t i = 0; i < len; i++)
{
    py = PyUnicode_FromKindAndData(kind, data + (i * kind), 1);
    // 何か処理！っていうか1文字単位でしかPyObject作れないんだけど、、
}

```
負担と利益を書き出す

#コーチング・面談のテクニック

（１）コスト＝ベネフィット診断
（２）GROWモデル
（３）メタ認知


##（１）コスト＝ベネフィット診断

<b>長期的なメリット</b>に目を向ける。
人はやるべきでない短絡的な行動に目が行く。
目の前でやっている行為が、『長期的に見て』どのようなメリット・デメリットがあるかを意識する。
一般論：　なにもしていないという不安感を回避したい→メリットがあるかどうかにかかわらず、目に見えている手を付けやすいものから始めてしまう。

###具体的な方法

自分の行為について、“負担”と“利益”を書き出す。
１．変えたいけど気が進まないと思っている行為（＝目標）を１つ挙げる
例：　早く寝ること
２．１．の行動を妨げている要素（＝原因）を１つ挙げる
例：　夜にYouTubeを見てしまうこと
３．「短期・長期」「負担・利益」の２軸で分析する
例： 

|[夜にYouTubeを見て<br>しまうこと]による…|   負担                    |利益                      |
|:-------|:------------------------|:-------------------------|
| 短期的|短期的な負担：<br>寝不足|短期的な利益：<br>楽しい動画が見れる|
|<b>長期的</b>|<b>長期的な負担：<br>・夜ふかしで判断力低下<br>・肌が荒れる<br>・太る<br>・遅刻のリスク　などなど<br></b>|長期的な利益：<br>話のネタになる？？？|


４．これまでの過程を通して、自分について知ったこと・もっとも印象に残ったこと・心に残ったこと・学んだこと・この過程の応用方法を書き出す。
例：
自分はエンタメが好きで、楽しさを求めている。
自分はメリットを理解すれば行動できる。　など


- やめたいことを意識したい場合、「長期的な負担」を強く認識する。
→書き出した負担が大きいと認識できたら、ネガティブな感情によってその行為をやめることができる。
- やるべきことを意識したい場合、「長期的な利益」を強く意識する。
→書き出した利益が大きいと認識できたら、ポジティブな感情によってその行為を始めることができる。

人は、<b>感情や欲望に振り回される</b>。
→書き出すと、感情や欲望が自分と切り離されて冷静な分析＝客観視できる。


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



##（２）GROWモデル

目標をベースにしたコーチングのテクニック。
"G"oal, "R"eality, "R"esource, "O"ption, "W"illの頭文字。

###１．Goal：　目標・あるべき姿

目的：　行動の動機を認識する

>どうなりたい？具体的には？例えば？なぜそう思う？
どんな価値を感じるか？
どれぐらいの数値になれば達成感が湧くか？
他に目標はあるか？
達成した先に何が得られる？

できるだけ具体例や数字を上げて明確にする。

###２．Reality、Resource：　現状とリソース（過去）

目的：　目標との差を認識し、行動の選択肢を洗い出すため

>達成状況はどのような感じか？
今まではどんな対応をしてきたか？そのうち上手くいったものとそうでないものは？それらの差は？
他の人はどのようにやっているのか？
一番うまい人はどうやっているのか？
他に活用できるものはないか？
誰か頼れる人はいないか？
なにが活かせるか？
なにを持っているか？

成功した要因を探っていく。

###３．Option：　どんな選択肢が考えられるか？

目的：　考えた選択肢を選び、意思決定や行動に移すため

>なにをすれば目標を達成できそうか？
他の人のやり方で取り入れられる方法は？
徹底的にマネをしたらどうなるか？
他に選択肢はないか？
うまくいった時のやり方で再現できる方法は？
うまくいかなかった原因を潰す方法は？
習慣化するための方法はないか？
別のやり方はないか？


###４．Will：　なにをしたらいいか？

>選択肢の中からなにを実行するか？
いつまでに実行するか？
うまくいきそうだと感じるか？
達成の可能性は？なぜそう思うか？
もっとうまくいくために決めておくべきことはないか？
誰か巻き込んでおいたほうがいい人はいないか？
今のうちに準備しておくことはないか？
進捗のチェックはどのようにやるか？

意思決定の精度を上げる。

https://www.youtube.com/watch?v=1L2zoSSMmCc


##（３）メタ認知

メタ認知＝自分自身を客観的に見ること



身体の限界よりも、脳の限界の方が先に来る。
フロー・ゾーンの状態：　「自分の高い課題＝自分のスキル」となる時

https://www.youtube.com/watch?v=Zeq8KjsqNh8
ai 形式の画像ファイルを Ubuntu で表示

ai 形式の画像ファイルを Ubuntu で表示する方法です。

ai のサンプルデータはこちらにあります。
[消太（ai形式）](https://www.fdma.go.jp/publication/materials/post2.html)

それらを次のように表示します。
![sho_1p.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/455faf97-e08e-8d31-3201-bb58a347186a.png)
![sho_2p.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/13e1ab2f-1bd6-f52e-4083-4235f3773870.png)

ソフトのインストール
こちらから deb パッケージをダウンロードします。
[XnView MP: Image management](https://www.xnview.com/en/xnviewmp/#downloads)

```bash
sudo dpkg -i XnViewMP-linux-x64.deb
```

ソフトの起動

```bash
xnview
```
絶対WebDriverを取得するマン


スクレイピングするプログラムを走らせてたらなんか止まってたので作った。
プログラムが走っている際にWebDriverを更新する人向け。

```python
from selenium import webdriver

def chrome_driver(options=['--headless']):
    """FileNotFoundErrorがたまに起こったりする人向け。
    エラーが続く場合は無限ループ。
    戻り値はWebDriver(Chrome)"""
    chrome_options = webdriver.ChromeOptions()
    for option in options:
        chrome_options.add_argument(option)
    while True:
        try:
            return webdriver.Chrome(options=chrome_options)
        except Exception as e:
            # 無限ループ注意
            pass
```
Mac：ターミナル（zsh）のテキストに色をつけてgitのブランチを表示、エラーを修正する。


環境：macOS Big Sur バージョン11.2.3
![スクリーンショット 2021-04-19 11.48.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1232501/a4831a65-1b03-9223-2114-ddfc47142fb4.png)
Macのターミナル（zsh）のテキストに色をつけ、背景色、テキストサイズを変え、gitのbranchが表示されるようにしたい！！

ちなみに、VSCodeにも反映されます。
###ターミナルの背景色を変更：

ターミナル > 環境設定（ターミナルを開いた状態でメニューバーの左上）> 背景 > 

色を好みのものにして不透明度を90%にした。 
![スクリーンショット 2021-04-19 11.48.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1232501/79d2145a-b410-0622-3538-c2417d278220.png)
###ターミナルのテキストサイズを変える：
環境設定 > フォント > Menlo > レギュラー > サイズ14

###zshの色をつける＆gitブランチを表示：

.zshrcファイルをホームディレクトリ（家マーク：~での移動先）につくる。

.zshrcファイルにコピペ↓（僕はVSCodeで開き、編集しました。）
https://tomiylab.com/2020/03/prompt/

zsh compinit: insecure directories, run compaudit for list.というエラーが出たので、修正↓

https://qiita.com/ayihis@github/items/88f627b2566d6341a741

###ターミナルに表示される長い名前を省略する：

https://qiita.com/tonkotsuboy_com/items/b752a86cee7eaedf28da
SQL テーブルの制約

SQLの勉強中ですが、自分の脳内整理や備忘録用に作成。
今回は、テーブルの制約についてアレコレ。

<h2>制約</h2>

<b>人為的ミスに備える</b>
　　・DBの本来の役割を考えると、テーブルに異常な値が格納されてしまうことは絶対に避けなければならない。
　　・以前学習したのは、同時実行や予期せぬ中断など、システム的な理由でデータが異常な状態に避ける用に、TRANSACTIONを学習した。しかし、DB利用者が文法としては正しいが、システムの意図としては誤ったSQL文を送ってしまうような<b>人為的なミス</b>に対しては、<b>トランザクション制御は全くの無力</b>です。
　　なので、<b>人為的ミスに対する対策</b>を行う。

<b>○あえて制限することで安全性を高める</b>
　　・予期しない値を格納できないように制限をかけることで、人為的ミスによるデータ破壊の可能性を減らすことができる。



---

<h3>●基本的な３つの制約</h3>
　　・制約は、CREATE TABLE文でテーブルを定義する際、<b>列定義の末尾</b>に指定することが可能。

　　例：
　　　　CREATE　TABLE　テーブル名(
　　　　　列名　型　<b>制約の指定</b> ,
　　　　　・
　　　　　・
　　　　)


<b>○３つの制約　その①</b>
　　<b>NOT　NULL制約</b>：NOT　NULL制約が設定された列には、NULLの格納は許可されない。誤ってINSERTなどを実行すると、エラーが発生し、行の追加に失敗する。
　　NOT NULL制約はDEFAULT指定と組み合わせて利用されることがほとんど。


<b>○３つの制約　その②</b>
　　<b>UNIQUE制約</b>：ある列の内容が決して重複してはならない場合、UNIQUE制約をつける。
　　　　※UNIQUE制約がかけられていても、NULLが格納された行が複数存在することは許される。なぜなら、「NULLはNULLとも等しくない」からです。

<b>○３つの制約　その③</b>
　　<b>CHECK制約</b>：ある列に格納される値が妥当であるかを細かく判定したい場合は、<b>CHECK制約</b>を用いる。CHECKの後ろのカッコ内に記述した条件式が真となるような値だけが格納を許される。

---

<h3>●主キー制約</h3>

　　・以前学んだ主キーの列とは、<b>「その列の値を指定すれば、どの1行のことかを完全に特定できる」</b>という役割を与えられた列のこと。要するに、<b>「他の行と重複してはならない」「必ず値が格納されなければならない（NULLであってはならない）」</b>という２つの性質を満たさなければならないことを学んだ。

　　<b>主キー制約(PRIMARY KEY 制約)</b>：主キーの役割を担う列には、<b>主キー制約</b>を付けます。<b>この制約がついている列は、単に「NULLも重複も許されない列」ではなく、主キーとしての役割が期待されているという意味</b>を持ちます。
　　　　
　　例)主キー制約の指定①：
　　　　CREATE　TABLE　テーブル名(
　　　　　　列名　型　<b>PRIMARY　KEY</b>,
　　　　　　・
　　　　　　・
　　　　)

　　例）主キー制約の指定②：
　　　　CREATE　TABLE テーブル名(
　　　　　　列名　型,
　　　　　　列名２　型,
　　　　　　・
　　　　　　・
　　　　　　<b>PRIMARY KEY</b>(列名,列名2)　---列名と列名２で複合主キーを構成する。
　　　　)
　　　　
---

<h3>●外部キーと参照整合性</h3>

<b>参照整合性の崩壊とは：</b>外部キーで<b>別テーブルの行を参照しているのに、その行が存在しない状態</b>をいう。このような状況になることは絶対に避けなければならない。


<b>○参照整合性崩壊を引き起こす４つのデータ操作
　　①「他の行から参照されている」行を削除してしまう。
　　②「他の行から参照されている」行の主キーを変更してしまう。
　　③「存在しない行を参照する」行を追加してしまう。
　　④「存在しない行を参照する」行に更新してしまう。

<b>●外部キー制約</b>
　　参照整合性が崩れるようなデータ操作をしようとした場合に、エラーを発生させ強制的に処理を中断させる制約が<b>外部キー制約(FOREIGN KEY制約)</b>です。この制約は、<b>参照元のテーブルの外部キー列に設定する</b>。

　　例）外部キー制約の指定①：
　　　　CREATE　TABLE　テーブル名(
　　　　　列名　型　<b>REFERENCES　参照先テーブル名(参照先列名)</b>
　　　　　・
　　　　　・
　　　　)

　　例）外部キー制約の指定②：
　　　　CREATE　TABLE　テーブル名(
　　　　　・
　　　　　・
　　　　　<b>FOREIGN　KEY(参照元列名)　REFERENCES　参照先テーブル名(参照先列名)</b>
　　　　)
CloudWatch Metric Streams使ってNew Relicにメトリクスを送ってみた

2021/03/31にリリースされたCloudWatch Metric Streamsを使ってNew Relicにメトリクスデータを送ってみた。
New RelicからAPIでポーリングしてメトリクスデータを取得するよりタイムラグが少なくなり、確実性があがるとのことなので、とりあえずやってみた。

## CloudWatch Metric Streamsってなんや？
CloudWatchからNew RelicなどのモニタリングSaaSに対してデータを送る機能です。
### いままで
New RelicなどのモニタリングSaaSでCloudWatchのメトリクスをモニタリングする場合、いままでは設定された間隔でSaaS側からCloudWatchにGetMetric APIを叩いてデータ収集していた。
### CloudWatch Metric Streamsを使うと
New RelicなどのモニタリングSaaSに対してCloudWatchからメトリックをストリームすることで、データ収集のタイムラグが大幅に改善される。

## とりあえずやってみた
### New Relic側の設定
1. New RelicへログインしInfrastrucure > AWS > Add an AWS Accountをクリック
2. Metric Streamを選択してクリック
3. 以降は画面に表示されるとおりに設定

※AWSにIAMロールを作ったりです。
※既存のAWSインテグレーションがあるものは、IAMロールはそのまま使えます。

### AWS側の設定
1. 対象のAWSアカウントへログインしておく。
2. 下記リンクのCFnテンプレートでスタックを作成して実行

※New Relicのライセンスキーが必要、ライセンスキーはNRで右上アカウントメニュー > API Keysで確認できる。
※Kinesisのエラー履歴を保存するS3バケット指定箇所があるが、既存バケットだとNGとなる。
https://console.aws.amazon.com/cloudformation/home?#/stacks/quickcreate?templateURL=https://nr-downloads-main.s3.amazonaws.com/cloud_integrations/aws/cloudformation/MetricStreams_CloudFormation.yml&stackName=NewRelic-Metric-Stream&param_NewRelicDatacenter=US

## 結果
16:29にNRQLでRDSのCPU Utilizationを確認したところ、16:26のメトリクスが記録されていた！__はやい！__
タイムラグは3分くらいかな。
WHERE句に下記のようなcloudwatch-metrics-streamsで取得したものという指定をすれば、従来のAPIポーリングと共存してもstreamのメトリクスのみを対象にできます。

```
`collector.name` = 'cloudwatch-metric-streams'
```
![スクリーンショット 2021-04-19 11.29.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/91793ce6-7a1f-56e5-df5b-70c13925398c.png)


## AWS利用料金
対象期間: 4/2 - 4/8の1週間
データ参照元: AWS Cost Explorer
使用コンポーネントなどにより変動しますので参考として。

### CloudWatch Streams
AWS利用料金: You pay $0.003 for every 1000 metric updates
料金参考: https://aws.amazon.com/jp/blogs/aws/cloudwatch-metric-streams-send-aws-metrics-to-partners-and-to-your-apps-in-real-time/

**<span style="color: #2357b5">23.81USD/1week
23.81USD * 4week = 95.24USD**</span>

---
ちなみに従来通りのGetMetricData APIだと…
<span style="color: #2357b5">19.93USD/1week
19.93USD * 4week = 79.72USD</span>


### Kinesis Data Firehose
AWS利用料金: 0.036USD/GBあたり
料金参考: https://aws.amazon.com/jp/kinesis/data-firehose/pricing/

**<span style="color: #2357b5">0.09USD/1week
0.09USD * 4week = 0.36USD**</span>


## 参考
■CloudWatch Metric Streams – Send AWS Metrics to Partners and to Your Apps in Real Time
https://aws.amazon.com/jp/blogs/aws/cloudwatch-metric-streams-send-aws-metrics-to-partners-and-to-your-apps-in-real-time/

■Move Faster with New Relic One and Amazon CloudWatch Metric Streams
https://blog.newrelic.com/product-news/aws-cloudwatch-metric-streams/
MySQL またserver startできなくなった件

# mysql.server start 　→　ERROR! The server quit without updating PID file
https://qiita.com/sxkxyori/items/723dcac7c856d7ddab40

↑上記記事で解決したはずのMySQLがまたstartできなくなった。

とりあえず、同じことを確認してみた。
PATHは問題なさそうだった…。

また再発したので、心折れそうになりましたが今回は結構早く解決したので記録します。


# 解決　/private/tmpの所有者をrootから自分に変えた

参考記事　
https://github.com/Homebrew/homebrew-core/issues/64304
https://teratail.com/questions/204129

`` sudo chown -R '自分の名前' /private/tmp/ ``　で変更。

無事、server start　できました。

# 経緯　

再インストールすると

```
Warning: The post-install step did not complete successfully
You can try again using:
  brew postinstall mysql@5.7
```
 
``brew postinstall mysql@5.7``しても変わらず…。

mysqlに拘らずpostinstall関係でググっていたら
https://github.com/Homebrew/homebrew-core/issues/64304
を発見。

**brew postinstall --debug ほげほげ**をすると内容が見れることを知り
``brew postinstall --debug mysql@5.7``を実行

```
==> Permission denied @ dir_s_mkdir - /private/tmp/homebrew
```

なにやらパーミッションデニッドしている！！

パーミッションを調べてみると

```
drwxr-xr-x  12 root  wheel  tmp
```

所有者がrootなので
``sudo chown -R '自分の名前' /private/tmp/``　を実行

```
drwxr-xr-x  12 自分の名前  wheel  tmp
```

そして 
``mysql.server start``　実行

```
Starting MySQL
. SUCCESS! 
```

よかった。


同じエラー内容でも深掘りすると違う原因ですね。
明日になったらまた違うエラーでだめになってそうで怖いけど
頑張ります。
vimのデフォルトのcolorschemeが反映されない問題に対処

# 環境
wsl (ubuntu20.04)
vim 8.1xx

# 解決方法

vimのバージョンが古いと反映されない模様。vimバージョン8.2になり問題解消された。

```
sudo add-apt-repository ppa:jonathonf/vim
sudo apt update
sudo install vim
```
```
vim --version
```

# 結論

デフォルトのcolorschemeが反映されないときは、vimのバージョンを`8.2`以上にする
TD4をTang-Nanoで動かす、更にちょこっと拡張

#目的
　Tang-Nanoと言うボードが去年(2019)の終わりごろに売り出されていた。
　一年近く立ってからやっと気か付いた。
　規模は１０００ＬＵＴ程度、xilinxのxc6lx9の1/10位かな。
　ＣＰＬＤに比べれば大容量と言えるが、でも大げさな事は出来ないだろうな。
　しかし、何だよこの値段。
　s**でのボードの値段は535円、m**でのチップ一個より安いじゃないか。
　◆◆◆　本当に使えるのか、試してみよう　◆◆◆


#経緯
　流石に日本国内では535円では買えないので、適当にチョイスして購入(800円)。まあ、値段は許容範囲かな。
　ハードはUSB TYPE-Cでつなげるだけ。ドライバーはソフトと一緒に入ってくる。
　ソフトの導入は、Tang-Nanoで検索すればやり方が出てきた。
　[SiPeed Tang Nanoの環境構築(Windows編)](https://qiita.com/tomorrow56/items/7e3508ef43d3d11fefab)を参考にした。
　ただ、管理者モード云々の記述が有るが、しなくても書き込みは出来た。
　　※Programmer -> Edit -> Cable Setting -> Cable -> Cable SettingのFrequencyが2.5MHzに設定されていた。
　ライセンスは上記に書かれている、- server address 45.33.107.56　- port: 10559　で動作するはず。
　　※LANケーブルを外すと使えなくなる。外部サーバに頼るのはアマチュアと言えど一抹の不安が...。
　サンプルプロジェクトも上記に書かれている。[Tang-Nano-examples](https://github.com/sipeed/Tang-Nano-examples)
　　※但し一つ注意が必要です。
　　　某所で買ったLCD(JST-4300-E3V03)はクロック上限が10MHz前後。
　　　サンプルは33MHZ動作なのでそのままだと、うすボケ表示となる。まあ写れば動作は出来ているとは言える。
　　　修正にはPLLのクロックを10MHzにすれば良し。
　　　Tools -> IP Core Generator の画面で、Target Deviceの横のフォルダマークをクリック、gowin_pll-> gowin_pll.ipcを選択。
　　　IP Customizationの画面が開くので、CLKOUTDの EXxpected Frequencyを10にして再コンパイルすれば治る。

#ＴＤ４とは
　「CPUの創り方」という本に書かれているＣＰＵの名称。
　概略性能は下記のようなもの。
　　アドレス　４ビット（１６番地）
　　ＡＬＵ　　４ビット
　　入出力　　４ビット
　　命令語長　８ビット
　　命令　　　１３種類

　ロジックを自分で考えるのは面倒なので、これを採用。
　「[「TD4」をVerilog HDL で書いてみた](https://gist.github.com/thata/ed0575c2871070ecc89d99bd7e357f5d)」に記載のVerilogをパクってちょこっと改変。
　　※簡潔にうまく纏められているが、一か所ロジック間違っている気がするのでそこは訂正。
　プログラムは図々しく、Githubに上げている。「[ＴＤ４](https://github.com/hi631/tang-nano/tree/master/td4%2BD_pjt)」
　多少の変更として、下記を追加。
　　１．ＬＥＤの代わりにＬＣＤでカウンタ類の表示。
　　２．釦Ｂを押すと、クロックが停止する。釦Ａでリセット。
　ＬＣＤ表示なしで、４６ＬＵＴで出来上がり。
　ＬＣＤを追加で、１３５ＬＵＴになる。
![Image31.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/023e622e-f235-2d81-3280-4e3bd058e88b.jpeg)

#ＴＤ８とは
　TD4の勝手拡張版。いろんな人がやってる様だ。
　TD4の命令を保持する事を前提にしたので、大した拡張では無い。
　　アドレス　８ビット（２５６番地）
　　ＡＬＵ　　８ビット
　　命令語長　１２ビット
　　命令拡張　レジスタを３個（Ａ，Ｂ，Ｓ）に増設
　　　　　　　ＪＰＭ，ＣＡＬＬ，ＲＥＴを追加
　これも、Githubに上げている。「[ＴＤ８](https://github.com/hi631/tang-nano/tree/master/td8%2BD_pjt)」
　ＬＣＤ無しで、７８ＬＵＴとなった。
　折角サブルーチンコールを新設したが、ラーメンタイマーでは、プログラムが逆に長くなったので封印。
<BR>
#感想
　個人的にはTD4は、アドレスと命令数がミスマッチではないかと思う。
　でも、ＣＰＵを作る切っ掛けになると考えれば、これも有りだと思う。
　なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。
AtCoder再入門に伴った現状確認[灰]

#0.はじめに
　毎年思い立って少しチャレンジしてはあきらめるAtCoderの茶レートチャレンジに再挑戦！
　ですが実際は、今年は2か月モチベがもつといいね…といったお気持ちなので、まず現状の確認と、今年の学習状況を来年の自分のために残そうといった趣旨です。

#目次
__1.自己紹介__
__2.AtCoder もとい Python学習の動機__
__3.現状の確認__
__4.学習方針__
__5.更新方針ほか__

#1.自己紹介
　簡単に、非理系学部を卒業したのちに非エンジニア職フルタイム労働者やってます。
補足すると、情報リテラシーレベルは並で思考レベルも並（程度だと思ってます。）
　日頃は簿記と読書とツイッターやってます。（たまにPS5）

#2.AtCoder もとい Python学習の動機
　大学を卒業するかどうかのタイミングが、機械学習（？）、ディープラーニング（？）が研究的に盛り上がっていた時期で日経電子版などでちらほら記事を読んだりしていました。
　素人目には、世の中が「Python!Python!」していたように映っていました。
　卒業後業務上の理由からExcelVBAを触ることもありながら、プログラミングが初等中等教育に組み込まれるといった流れもあり、より一層のことその周辺に対して向き合う必要があると考えるようになったのが根本的な動機です。
　
　そのあと、ツイッターのフォロワーが「競技プログラミング！CTF！」などとツイートしているのを見て、興味をもち参加のハードルが低そうな（入門記事等がwebでもあふれていた）AtCoderに登録しました。
　ExcelVBAでは参加できないので学習のハードルが低そうなPython（ry
　[退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング](https://www.amazon.co.jp/%E9%80%80%E5%B1%88%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AFPython%E3%81%AB%E3%82%84%E3%82%89%E3%81%9B%E3%82%88%E3%81%86-%E2%80%95%E3%83%8E%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AB%E3%82%82%E3%81%A7%E3%81%8D%E3%82%8B%E8%87%AA%E5%8B%95%E5%8C%96%E5%87%A6%E7%90%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Al-Sweigart/dp/487311778X)などを書店で見かけたのも業務との関連を感じたのも大きいと思います。
　つまるところ、ミーハー。

#3.現状の確認
###ExcelVBA
　検索しながらなら簡単なマクロの実装はできる。
　コーディングレベルはかなり低い

###Python
```python:hello.py
n = 0
cnt = 10
    for n in cnt:
 
```
　とか普通にやっちゃうレベルです。
　print内でのforとかうまく使いたいと思いながら…

###AtCoder
　継続できてないとはいえ、悲しい。
![スクリーンショット (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451611/8cd89d71-960a-94a9-d90a-acafba7341a1.png)

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451611/b3747595-3501-810c-a9e0-9684388c1f67.png)

![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451611/8981c4ba-6f38-b595-579e-3d1a8e4fdc74.png)

　
　ABCはC問題くらいになると解説の数学的思考についていけないことも多々。文法がわかっていないのも相まって、理解に至るまでの効率が悪いように感じています。

***
　こんな感じです。
二部探索？アルゴリズム？なにそれ、全探索しか勝たん！！


#4.学習方針
　まずは時間をみつけて、文法を勉強する。
###Qiita
　・[Python3で競技プログラミングする時に知っておきたいtips（入力編](https://qiita.com/kyuna/items/8ee8916c2f4e36321a1c)
　・[Python入門（Python版 APG4b）](https://qiita.com/saba/items/b9418d7b54cce4b106e4)

###書籍
　・[実践力を身につける Pythonの教科書 ](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5%E5%8A%9B%E3%82%92%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%91%E3%82%8B-Python%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E3%82%AF%E3%82%B8%E3%83%A9%E9%A3%9B%E8%A1%8C%E6%9C%BA/dp/4839960240)
　　　などを少しずつ読んでいこうと思います。

###問題集等
加えて、ABCに参加するためのモチベ維持のために、
　・[Boot camp for Beginners](https://kenkoooo.com/atcoder/#/training/Boot%20camp%20for%20Beginners)の1問目から進めようと思っています。1日1問ずつでも手を付けられたらいいですね。

　[AOJ](https://judge.u-aizu.ac.jp/onlinejudge/)は昨年途中までやったので、再チャレンジということで今年はABCの選りすぐり中心で精進しようと思います。
（AOJ自体は、入門期でも楽しく解けるよう、また文法についてもステップを踏んで学習できるよう多大な配慮がある良サイトです。息抜きにでもパスワードを再発行して問題を埋めていきます。）

#5.更新方針ほか
　更新自体もモチベ維持や学習継続を目的としようと思ってますので、
__・[Boot camp for Beginners](https://kenkoooo.com/atcoder/#/training/Boot%20camp%20for%20Beginners)を解いたとき、または詰まったとき__
__・コンテスト結果__
__・その他__
　でちょくちょく更新できるようにします。

##おわり
【開発メモ】C#でSQLを実行

現在c#で開発していて、よく使う処理をメモとして残します。(随時更新予定)
コネクションは普段Configに書いていますが、今回はソースコード上にべた書きしています。
***※完全に自分用のメモです。ご了承ください。***

##前準備
###開発環境
・Visual Studio 2019
・Microsoft SQL Server Management Studio 18

###usingディレクティブ
使用するパッケージはSqlClientです。
Visual Studioの「ツール」→「NuGetパッケージ　マネージャー」→「ソリューションのパッケージの管理」よりSqlClientをインストールしてください。
usingディレクティブは以下のように記述。


```c#
using System.Data.SqlClient;
```

#データ抽出
SELECT文でテーブルからデータを取得する。

```c#
public string Conn = @"Data Source = <サーバー名>; Initial Catalog = <DB名>; User ID = <ユーザID>;
 　　　　　　　　　　　　Password = <パスワード>; Encrypt=False; TrustServerCertificate=True";

/// <param name="Conn">コネクション</param>
public void Get_TableDatas(string Conn)
{
        //クエリ
        string query = "SELECT * FROM <テーブル名> ";

        using (SqlConnection con = new SqlConnection(Conn))
        {
                try
                {
                    SqlCommand comm = new SqlCommand(query, con);

                    //コネクション開始
                    con.Open();

                    using (SqlDataReader dr = comm.ExecuteReader())
                    {
                        //値取得
                        if (dr.Read())
                        {
                            var Data = ((データ型)dr["<カラム名>"]);
                        }
                    }
                }
                catch (Exception e)
                {
                    //エラーメッセージ
                    Console.WriteLine(e.Message);
                }
                finally
                {
                    //コネクション終了
                    con.Close();
                }
        }
}
```

#データ挿入
INSERT文でテーブルへデータを格納する。
テーブルは以下のような構成で行います。

**SAMPLE_TABLE**

|  DATA_DATETIME |  DATA_ID  |  DATA_VALUE  |
| :----: | :----: | :----: |
|  2021-01-01 00:00:00.000  |  1  |  90.6  |
|  2021-01-01 00:30:00.000  |  2  |  78.3  |　　　

```c#
public string Conn = @"Data Source = <サーバー名>; Initial Catalog = <DB名>; User ID = <ユーザID>;
 　　　　　　　　　　　　Password = <パスワード>; Encrypt=False; TrustServerCertificate=True";

/// <param name="Conn">コネクション</param>
public void Insert_TableDatas(string Conn)
{
            using (SqlConnection con = new SqlConnection(Conn))
            using (var command = con.CreateCommand())
            {
                try
                {
                    con.Open();

                    // クエリ
                    command.CommandText = @"INSERT INTO <テーブル名> VALUES('" + <DATA_DATETIME> + "'," + <DATA_ID> + ","+ <DATA_VALUE> + ")";

                    // SQLの実行
                    command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    //エラーメッセージ
                    Console.WriteLine(e.Message);
                }
                finally
                {
                    //コネクション終了
                    con.Close();
                }
            }
}
```


###最後に
時間があるときに随時更新していきます。
JavaScript [map filter forEach]の応用

JavaScriptで（map filter forEach）を使いこなすための練習として、作ったので、参考にしてみてください

*基本的な使い方がわかっている方向けです。　ちなみにjQueryを使っています。
それぞれの細かい説明は省きます。

今回使ったのはこんなの
![スクリーンショット (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1329320/02af0fcb-5b14-d880-6e2b-3b7bd2ff48da.png)

![スクリーンショット (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1329320/caaa3958-0ee5-fc43-4eee-0c754a393a91.png)

![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1329320/e07a8138-e7da-ea8c-59eb-411f6ae43541.png)

色を選択すると、その色の在庫があるサイズの選べるようになるシステム。

赤はSML全て選べて、黄はsかlからしか選べないようになっています。

早速作っていきますか。

htmlはこちら

```html:test.html
<select name="color">
        <option>色を選択してください</option>
        <option value="red">赤</option>
        <option value="blue">青</option>
        <option value="yellow">黄</option>
    </select>

    <select name="size">
        <option value="">-</option>
    </select>
```
JavaScriptはこちら

```JavaScript:test.js
//在庫の情報 (一例)
var product = {
        pattern: [
            {color: 'red',size: 's'},            
            {color: 'red',size: 'm'},
            {color: 'red',size: 'l'},
            {color: 'blue',size: 's'},
            {color: 'blue',size: 'm'},
            {color: 'yellow',size: 'l'}
        ]
    };

    // html側で書いた、selectのcolorの値が変わったら　変わった値のValue値を変数colorに入れる
    $('select[name=color]').on('change', function() {
        var color = $(this).val();
        // sizeを初期化
        var size = [];

        // 配列の中のcolorの値と、selectで変更したcolorの値が一緒の配列のみ返す
        size = product.pattern.filter(function(value) {
            return value.color == color;
        });

        // sizeの配列からsizeの値のみ取り出すため、mapを使い値を更新する
        size = size.map(function(value) {
            return value.size;
        })

        //サイズの初期化を色を変更する度に行う　
        //一致した値を追加する処理を行う。
        $('select[name=size]').empty()
        size.forEach(function(value) {
            $('select[name=size]').append('<option>' + value + '</option>')
        })
    })
```

$(this)で、変更された値のValue値を取得できるみたいです。自分もちょっとあやふやなので勉強しようと思います。

Html側のcolor size　という値と、jsの変数のcolor sizeがあるので間違いやすいです。

それぞれが何を指しているかを考えると勉強になります。
iSCSI とは

## 勉強前イメージ

ファイルサーバとか見てるときによく出てきたけど、よくわかってない

## 調査

### iSCSI とは

Internet Small Computer System Interfaceの略でアイスカジーと読みます。
IPネットワークを利用してSAN(Storage Area Network)を構築するプロトコル規格で、
イーサネットのインフラが使用できるので安価にストレージネットワークを構築できます。

### その前にストレージのお話

ストレージには大きく2種類あり、ファイルストレージとブロックストレージがあります。

- ファイルストレージとは

ファイルストレージはNAS(Network Attached Storage)と呼ばれており、
ファイルストレージのことでLANに接続して利用するHDDになります。

- ブロックストレージとはまた以下の2種類に分かれる
	- DAS(Direct Attached Storage)
	- SAN(Storage Area Network)

- DAS(Direct Attached Storage) とは

	SASケーブルでサーバと直接接続するブロックストレージの一種

- SAN(Storage Area Network) とは

	プロトコルを使ってDASと同じようにブロックアクセスを行わせるストレージ専用のネットワーク
	このSANのプロトコルの1つがiSCSIになります。


### 要するに

ストレージの中のブロックストレージでのアクセスを使用していて、
ブロックアクセスをおこなせるストレージ専用ネットワークのプロトコルの一つ になります。

## 勉強後イメージ

なんか色々見てると、もっと書くべき内容はあると思うけど
まずiSCSIからじゃなくて、ファイルストレージからやったほうがいいかも。
次はファイルストレージから攻めてみる

## 参考

- [iSCSI（アイスカジー）とは](https://www.fujitsu.com/jp/products/computing/storage/lib-f/tech/interface/iscsi/)
- [【図解】良くわかる DAS / NAS / SAN ストレージの違い～接続方法やメリット/デメリット～](https://milestone-of-se.nesuke.com/sv-basic/architecture/das-nas-san-storage/)
[AWS Amplify] amplify init して "InvalidSignatureException: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details." と言われたら確認するとこ

# 事象

こうすると

```zsh
% amplify init
```

こう言われました。

```zsh
InvalidSignatureException: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.
```


[DeepL](https://www.deepl.com/ja/translator)様の翻訳
>InvalidSignatureException: 私たちが計算したリクエスト署名は、あなたが提供した署名と一致しません。AWSシークレットアクセスキーと署名方法を確認してください。詳細は、サービスのドキュメントを参照してください。

# 解決策

` ~/.aws/credentials` の `aws_access_key_id` か `aws_secret_access_key` が間違えている可能性があるので確認しましょう。

```zsh
% cat ~/.aws/credentials
[default]
aws_access_key_id=XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```
Mysqlで50音検索（あ行からわ行まで）

コピペ用です。

```
$query = "SELECT * FROM example WHERE name REGEXP '^(あ|い|う|え|お|ア|イ|ウ|エ|オ)+';";
$query = "SELECT * FROM example WHERE name REGEXP '^(か|き|く|け|こ|カ|キ|ク|ケ|コ)+';";
$query = "SELECT * FROM example WHERE name REGEXP '^(さ|し|す|せ|そ|サ|シ|ス|セ|ソ)+';";
$query = "SELECT * FROM example WHERE name REGEXP '^(た|ち|つ|て|と|タ|チ|ツ|テ|ト)+';";
$query = "SELECT * FROM example WHERE name REGEXP '^(な|に|ぬ|ね|の|ナ|二|ヌ|ネ|ノ)+';";
$query = "SELECT * FROM example WHERE name REGEXP '^(は|ひ|ふ|へ|ほ|ハ|ヒ|フ|ヘ|ホ)+';";
$query = "SELECT * FROM example WHERE name REGEXP '^(ま|み|む|め|も|マ|ミ|ム|メ|モ)+';";
$query = "SELECT * FROM example WHERE name REGEXP '^(や|ゆ|よ|ヤ|ユ|ヨ)+';";
$query = "SELECT * FROM example WHERE name REGEXP '^(ら|り|る|れ|ろ|ラ|リ|ル|レ|ロ)+';";
$query = "SELECT * FROM example WHERE name REGEXP '^(わ|を|ん|ワ|ヲ|ン)+';";
```
Pythonで1行で複数の数値データを標準入力する方法

競技プログラミングでPython3で標準入力から1行で複数の数値データを入力する方法です。
メモとして書きます。今回は2個の例です。

```Python
data = list(map(int,input().split()))
print (data[0])
print (data[1])
```

メモ代わりに投稿いたしました。
WordPress「テンプレートファイル」について

# はじめに
・WordPress初心者
・WordPressのテンプレートフファイルについてよく分からない方

## テーマファイルとは
テーマファイルとは、WordPressのルールに沿って作成されたPHPファイルのことです。トップページと記事ページでデザインが違う時などに、テンプレートファイルを作成します。WordPressは、アクセセスされたページに合わせたページを表示するために、テーマ内にWordPressのルールに沿ったテンプレートファイル**`「~.php」`**を自動的に変更します。

※主な、WordPressテンプレートファイル一覧

> |テンプレートファイル名|概要|
|:---|:---|
|front-page.php|Webサイトのトップページを表示|
|single.php|投稿の記事ページを表示|
|page.php|固定ページを表示|
|category.php|カテゴリーページを表示|
|serach.php|検索結果ページを表示|
|archive.php|記事一覧ページを表示|
|404.php|404エラーページを表示|

引用: [[改訂版]WordPress 仕事の現場でサッと使える! デザイン教科書[WordPress 5.x対応版] (Webデザイナー養成講座)](https://www.amazon.co.jp/WordPress-仕事の現場でサッと使える-デザイン教科書-5-x対応版-Webデザイナー養成講座/dp/4297111853/ref=sr_1_7?__mk_ja_JP=カタカナ&dchild=1&keywords=wordpress+本&qid=1618752640&s=books&sr=1-7")

## テンプレート階層について
テンプレート階層とは、WordPressがテンプレートファイルを表示する際の優先順を示した、ルールのことです。テーマを作成するにあたり**`index.php`**が必須になりますが、優先順位は最も低くなります。また**`index.php`**のみの場合は。すべてのページが**`index.php`**になります。WordPressはそのルールに従い、優先順が高いがテンプレートファイルのページを表示します。

※以下は、テンプレートファイルの階層についてまとめたものです。

>●トップページのテンプレート階層

>|優先順位|テンプレートファイル名|備考|
|:---|:---|:---|
|1|front.page.php|ー|
|2|固定ページ表示ルール|「設定」→j表示設定」のj「フロントページの表示」が「固定ページ」に設定されている場合|
|3|home.php|ー|
|4|index.php|ー|

>●個別ページのテンプレート階層

>|優先順位|テンプレートファイル名|備考|
|:---|:---|:---|
|1|single-[post_type].php|例: 投稿タイプがvideoの場合はsingle-video.php|
|2|single.php|投稿記事ページ|
|3|singular.php|投稿や固定ページ、カスタム投稿タイプの記事ページ|
|4|index.php|ー|

>●カテゴリー別記事一覧ページのテンプレート構造

>|優先順位|テンプレートファイル名|備考|
|:---|:---|:---|
|1|category-{slug}.php|例：カテゴリーのスラッグが"news"の場合はcategory-news.php|
|2|category.php-{ID}|例：カテゴリーIDが6用のテンプレートはcategory6.php|
|3|category.php|ー|
|4|index.php|ー|

>●月別記事一覧のテンプレート構造

>|優先順位|テンプレートファイル名|備考|
|:---|:---|:---|
|1|date.php|ー|
|2|archive.php|ー|
|3|index.php|ー|

引用: [[改訂版]WordPress 仕事の現場でサッと使える! デザイン教科書[WordPress 5.x対応版] (Webデザイナー養成講座)](https://www.amazon.co.jp/WordPress-仕事の現場でサッと使える-デザイン教科書-5-x対応版-Webデザイナー養成講座/dp/4297111853/ref=sr_1_7?__mk_ja_JP=カタカナ&dchild=1&keywords=wordpress+本&qid=1618752640&s=books&sr=1-7")

## まとめ
・テーマファイルとは、WordPressのルールに沿って作成されたPHPファイルのこと。

・テンプレート階層とは、WordPressがテンプレートファイルを表示する際の優先順を示したルールのこと。
OGSMによる要件定義

#序
ここでは要件定義のための手法の一つであるOGSMを紹介します。

#OGSMとは
OGSMはObjective, Goals, Strategies, Measuresの略でビジネスの構造をモデル化し、機能、特徴、ビジネス領域を分析するモデル手法のひとつです。何をしたくてそのためにどうするのかを分析する手法になります。
まず、広い意味での目的(Objective)があって、その達成のためには満たさなければならない具体的で確固とした実測可能な目標(Goals)を設定し、その目標のための行動がぶれないための戦略(Strategies)を決定し、成果を実測するための基準(Measures)を定義するのが特徴です。

##目的(Objective)
目的は現在の状況を打破する高みを目指すものである必要があります。
意味が明快で解釈に意見がわかれないような、組織の指針となるものであるのが望ましいものです。

##目標(Goals)
目標は目的の達成のために設定される具体的な到達点です。
目標は絶対に詳細がなければなりません。いつまでにどれだけのユーザーを獲得するなどの、目標達成までの距離が簡単に測定できるものでなければなりません。
そして一つの目標は一つの成果を実測するための指針だけしか持ってはいけません。２つの指針がある場合は２つの目標に分けて設定することが必要です。

##戦略(Strategies)
目標達成のために行うべきことを決定することです。指標を満たすために何に注力するのか、手段はそのために最善と思われるならどのようなものでも構いません。できるかぎり柔軟であることが求められます。

##基準(Measures)
目標の達成度合を測るための実数のあるベンチマークが設定されなければなりません。これは戦略が正しく機能できているかの判断基準にもなります。

##図解
![OGSM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336928/c2a11b66-4231-b8b9-64b1-2ec825beda02.png)
【swift】複数のTableViewやCollectoinViewのスクロールを同期する方法

## 概要
- 一画面に複数の3つのcollection view（collectionView1,collectionView2,collectionView3とする）があるとする
- collectionView1とcollectionView2は縦軸の動きがそれぞれ連動、collectionView1とcollectionView3は横軸の動きがそれぞれ連動する仕様
- という画面を作ろうとして少しつまづいたのでメモ書き

## 方法

```swift

    /// 縦横スクロールを同期する
    private func syncronizeScroll(scrollView: UIScrollView) {
        
        // 縦スクロール
        if scrollView == collectionView1 {
            collectionView2.contentOffset.y = collectionView1.contentOffset.y
        }
        if scrollView == collectionView2 {
            collectionView1.contentOffset.y = collectionView2.contentOffset.y
        }
        
        // 横スクロール
        if scrollView == collectionView1 {
            collectionView3.contentOffset.x = collectionView1.contentOffset.x
        }
        if scrollView == collectionView3 {
            collectionView1.contentOffset.x = collectionView3.contentOffset.x
        }
    }

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        syncronizeScroll(scrollView: scrollView)
    }

```

- 当初はsetContentで実装していたが、スクロールはするけど慣性スクロールが全くしない状況だった（スワイプしたらすぐ止まるような感じ）
- おそらく処理が重すぎたためと思われたので、setContentOffsetではなく直接contentOffsetを設定する方法で実装
[golang] モジュール間の結合は関数インターフェースで

# 概要

Clean Architectureを学んだりオブジェクト指向に詳しかったりすると、サービス同士の結合はinterfaceを介して行うもんだと思ってしまう。Golangの教科書にもそう書いてある。だが、関数interfaceによる結合（DI）のほうがベターじゃない？という話。

例えばhttpサーバーを作る場合、こんな風になる。

```go
r := mux.NewRouter()
r.HandleFunc("/hoge", /*hoge*/).Methods("GET")
```
`/*hoge*/`をどう書こうか？

# 1. structをinterfaceで結合

```go
type HogeHandler struct {}
func (h *HogeHandler) ServeHTTP(w http.ResponseWriter, req *http.Request){
   // get hoge
}
r := mux.NewRouter()
h := &HogeHandler{}
r.HandleFunc("/hoge", h ).Methods("GET")
```
引数に`HogeHandler` structを渡している。なぜこれができるかというと、net/httpにHandlerというinterfaceが定義されているから。

```go
type Handler interface {
   ServeHTTP(http.ResponseWriter, *http.Request)
}
```
HogeHandler structはこのinterfaceを実装している。

# 2. 関数を関数interfaceで結合
カンタンな関数ならstructにする必要はないので、

```go
func handler(w http.ResponseWriter, req *http.Request){
   // get hoge
}
r := mux.NewRouter()
r.HandleFunc("/hoge", handler ).Methods("GET")
```
こう書くことも多いだろう。なぜこう書けるかというと、handler関数はHandlerFuncを実装しているから・・・

```go
// https://golang.org/src/net/http/server.go?s=59707:59754#L1950
type HandlerFunc func(ResponseWriter, *Request)

// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
    f(w, r)
}
```
というのは半分だけ正しい。handler関数はHandlerFuncの実装でありかつ、HandlerFuncはHandler interfaceを実装しているから。


# 3. structを関数interfaceで結合
本題。

```go
type HogeHandler struct {}
func (h *HogeHandler) GetHoge(w http.ResponseWriter, req *http.Request){
   // get hoge
}
func (h *HogeHandler) DeleteHoge(w http.ResponseWriter, req *http.Request){
   // delete hoge
}
r := mux.NewRouter()
h := &HogeHandler{}
r.HandleFunc("/hoge", h.GetHoge ).Methods("GET")
r.HandleFunc("/hoge", h.DeleteHoge ).Methods("DELETE")
```
HandlerFuncの引数に、関数（メソッド）を渡している。
同じリソースに対する複数の処理を一つのサービスにまとめながら、handler登録を柔軟に（メソッド名を気にせず）できるので、私はこれが好き。

#### net/http package

```go
type HandlerFunc func(ResponseWriter, *Request)
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request)

type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}
```
golangは、関数がinterfaceを実装できるんだ・・・・この書き方勉強になる。

# 結論

ここで言いたい事は、net/httpの話じゃない。

#### 一般的にstruct（実体）に依存するのではなく、interfaceに依存すべきとはよく聞くが、最も疎結合なのは関数interface依存だと思う。

もちろん、メソッドのセットに意味があるならその限りではない。たとえば全てのHandlerにGET/POST/DELETE/PUTの各メソッドの実装を強制したいなら、そういうinterfaceを作ってinterfaceで依存すべきかと思う。

いや、それはこういう問題が生じるぞ！などご意見あればください。
よろしくお願いします。

## 参考

https://qiita.com/immrshc/items/1d1c64d05f7e72e31a98
AppExchange の基礎 ⇒ AppExchange の操作 (スーパーヒーローのように)

１．AppExchange 戦略を作成するときに重要なことはどれですか?
２．AppExchange ホームページの説明として適切なのは、次のうちどれですか?
３．プロバイダが事例などのドキュメントを提供しているかどうかは、どのリスト要素で確認できますか?
４．機能制限トライアルと無料トライアルはどう違いますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/df92d623-1486-b5c4-6bb0-464aca8b144c.png)
SQL テーブルの作成/更新/削除

SQLの勉強中ですが、自分の脳内整理や備忘録用に作成。
今回は、テーブルの作成についてアレコレ。

<h4>テーブルの作成</h4>

<b>●テーブルの作成の基本</b>
　　テーブルを作成するには、<b>CREATE TABLE文</b>を使う。
　　例：
　　　　CREATE　TABLE　テーブル名(
　　　　　　列名１　列１の型名,
　　　　　　列名２　列２の型名,
　　　　　　・
　　　　　　・
　　　　　　列名X　列Xの型名
　　　　)；

<b>●デフォルト値の指定</b>
　　INSERT文で具体的な値を指定しなかった場合に、<b color:red>NULLではなく特定のデフォルト値を格納する。</b>
　　そのためには、CREATE TABLE文に、　<b>DEFAULT</b>　キーワードを指定する。

　　例：
　　　　CREATE　TABLE　テーブル名(
　　　　　　列名　型名　<b>DEFAULT　デフォルト値</b>,
　　　　　　・
　　　　　　・
　　　　);

---

<b>テーブルの削除</b>
　　テーブルそのものを削除するには、DDLに属する<b>DROP TABLE文</b>を利用する。
　　※DDLのロールバックは、DBMS製品によって異なる。重要な操作を行う場合には、念のためバックアップをしておくなど安全への配慮も大切。
　　
　　例：
　　　　<b>DROP　TABLE</b>　テーブル名;

---

<b>テーブルの更新</b>
　 テーブルの定義内容を変更するには、<b>ALTER TABLE文</b>を使います。この文では、具体的に<b>「何を」「どう」変えるか</b>を指定する必要がある。

　　例①：列の追加
　　　　<b>ALTER TABLE</b> テーブル名　<b>ADD</b>　列名　型　制約;

　　列②：列の削除
　　　　<b>ALTER　TABLE</b>　テーブル名 <b>DROP</b>　列名;

---

<b>全件のデータを高速に削除する</b>
　　テーブルの全行を削除する場合、<b>TRUNCATE　TABLE文</b>が利用されることがある。

　　例：
　　　　<b>TRUNCATE TABLE</b> テーブル名;---テーブル名のテーブルの全行を削除する。

　　実行結果は「DELETE　FROM　テーブル名」とほぼ同じですが、動作には以下のような違いがある。
　　　　・DELETEはWHERE句で指定した行だけ削除できるが、TRUNCATEは必ず全行削除する。
　　　　・DELETEはDMLだが、TRUNCATEはDDLに属する命令である。
　　　　・DELETEはロールバックに備えて記録を残しながら仮削除していくが、TRUNCATEは記録を残さずに行を削除する。（よってロールバックはできない）
　　　　・DELETEは記録を残すため低速だが、TRUNCATEは高速。

　　※TRUNCATE TABLEは、厳密にはデータ削除ではなく、テーブルの初期化の命令である。「テーブルを一度DROPして同じものをCREATEする」というような動作イメージを持つとわかりやすい。
Cygwin bash を Windows Terminal や Visual Studio Codeで使うプロファイル

## Windows Terminalの`settings.json`への設定

```
"commandline": "C:\\cygwin64\\bin\\env.exe CHERE_INVOKING=t /bin/bash --login -i",
"icon": "C:\\cygwin64\\Cygwin-Terminal.ico",
"startingDirectory": "%HOME%"
```

`"name"`や`"hidden"`はお好みで。

bashのオプション `--login` は、bashをログインシェルとして起動させる。そうしないと /etc/profile が実行されず、環境変数 PATH などがセットされない。

オプション `-i` は、起動するbashを対話的なシェルとする。

bashを直接起動せず、envを使って`CHERE_INVOKING`をセットした上でbashを起動するのは、/etc/profile でカレントディレクトリが ${HOME} にされてしまうのを防ぐため。

この設定で、エクスプローラーの右クリックメニュー「Open in Windows Terminal」で起動すると、そのフォルダでbashが起動する。

`"startingDirectory"` には、それ以外の場合の初期ディレクトリを設定しておく。

［設定］での表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346257/8b043441-cf73-5f4d-b4f0-18f98cd5a64a.png)

確認バージョン
Windows Terminal バージョン: 1.7.1033.0
BASH_VERSION: 4.4.12(3)-release x86_64-unknown-cygwin

## Visual Studio Codeの`settings.json`への設定

Visual Studio Code の`settings.json`の設定も同様でよい。

    {
      "terminal.integrated.profiles.windows": {
          "Cygwin bash": {
              "path": "C:\\cygwin64\\bin\\env.exe",
              "args": [
                  "CHERE_INVOKING=t",
                  "/bin/bash",
                  "--login",
                  "-i"
              ]
          }
      },
      "terminal.integrated.defaultProfile.windows": "Cygwin bash"
    }

## 参考リンク
[Windows ターミナルの全般的プロファイル設定 | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/profile-general)
[Integrated Terminal in Visual Studio Code](https://code.visualstudio.com/docs/editor/integrated-terminal)
EC2のRI（リザーブドインスタンス）の上限数について

## はじめに
日々の業務で、お客様からさまざまなサービスの上限緩和申請の依頼を受けることがあります。
その中でEC2のコスト削減に利用されるRI（リザーブドインスタンス）の上限数の認識でちょっと引っかかったので備忘録として残します。

## いきなりクイズ
あるAWSアカウントの東京リージョンにおいて、以下の状況の時、RIの上限はいくつでしょうか？？

![制限___EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/9af44560-2232-6d13-10d8-421fdc9b6a73.png)

答えは20個っ！

ではなく、80個です。

えっ？

って一瞬なりますよね。私もなりましたw

公式ドキュメントには以下記載があります。
>1 か月当たりに購入できる リザーブドインスタンス の数は制限されています。リージョンごとに 1 か月当たり 20 個のリージョン リザーブドインスタンス に追加して、アベイラビリティーゾーンごとに 1 か月当たり 20 個のゾーン リザーブドインスタンス を購入できます。
>たとえば、リージョンに 3 つのアベイラビリティーゾーンがある場合、リザーブドインスタンス の制限は 1 か月当たり 80 です。つまり、そのリージョンのリージョン リザーブドインスタンス 20 と、3 つのアベイラビリティーゾーンそれぞれで 20 のゾーン リザーブドインスタンス (20x3=60) です。

これを図解すると、東京リージョンの場合は以下のようになります。

![Untitled_New_Diagram_-_Cacoo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/e9fd9f8e-3efe-6b57-665d-1a83a9dc7bb1.png)


## Tips
-  Regional指定のRIがある
-  Region全体で80個が上限となっていても、各AZの上限は20個のため、1つのAZで20個以上の購入は不可
-  東京リージョンで、RI制限数を20個から30個に変更した場合は、そのリージョンでは合計120個が上限値となる
-  緩和申請の受理まで数日を要しますので、注意が必要
-  RIの購入形態(Standard/Convertible) に関わらず全体の合計数が上限となる

## 参考
EC2のリザーブドインスタンス概要
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-reserved-instances.html
ReagionalとAZでのRIの違い
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/reserved-instances-scope.html
Mybatisを使って、リストの要素で条件を絞り込む方法

# はじめに
### サービス開発を行う中で、複数の条件で絞り込みを行なった結果をデータとして取得し一覧表示したい場面に遭遇した。そこで、複数条件を含めたリストを作成し、その要素をループで一つずつ取り出し、条件文に適用させる方法がないかと思い、調査を始めた。
<br>

# 実現したいこと
### DBからデータを取得するときに、リストに含めた全要素を条件に付加したい。
<br>

# 調査
### 公式ドキュメントを参照したところ、MybatisのforEachタグを用いることで実現できそう。
>foreach
動的 SQL で良くあるもう一つの要件は、コレクションの要素をイテレーション処理したいというものです。多くの場合、IN 演算子を使った条件を構築するのが目的です。例：
```xml
<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>
```
<br>

# 実装
```java
@Mapper
public interface MainListMapper {
        public List<ACCOUNT> getMainUpperList(List<Integer> hideList);
}
```
```xml
<select id="getMainUpperList" resultType="com.example.matching.entity.ACCOUNT">
  SELECT *
  FROM ACCOUNT
  WHERE ID NOT IN 
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
          #{item}
  </foreach>
  ORDER BY CREATED DESC
</select>
```

# 躓いたところ
### 引数が一つの時は「collection="list"」の「list」の箇所に任意の名前が使用できたが、引数が二つ以上になった場合はinterfaceの引数で「@Param("hideList")」のように明示的に名前をつけてあげないと「collection="hideList"」をMybatis側で識別できない様子。
```java
@Mapper
public interface MainListMapper {
  public List<ACCOUNT> getMainLowerListMatchResidence(@Param("hideList") List<Integer> hideList, @Param("loginUserId") int loginUserId);
}
```
```xml
<select id="getMainLowerListMatchResidence" resultType="com.example.matching.entity.ACCOUNT">
  SELECT *
  FROM ACCOUNT
  WHERE ID NOT IN 
  <foreach item="item" index="index" collection="hideList"
      open="(" separator="," close=")">
          #{item}
  </foreach>
  AND
  RESIDENCE = (SELECT RESIDENCE FROM ACCOUNT WHERE ID = #{loginUserId})
  ORDER BY CREATED DESC
</select>
```

# まとめ
### 引数の数による影響で躓いたが、無事にリストの要素で条件を絞り込むことができた。
<br>

## 参考記事
https://mybatis.org/mybatis-3/ja/dynamic-sql.html
Expo-webでwebviewを使う

Expoはreact-nativeでの開発を楽にするためのラッパーというか開発ツールです。
SDKのバージョンのいくつかから、react-native-webを使ってWebアプリ開発も同時にできるようになりました。
iOS/Androidと同時に、Webも作れてしまうというものです。
ざっと使ってみた感じ、凝ったUIでなければ、重たいけど割とそのまま動いている印象です。

# Expo-webはWebViewに非対応

自分の作っているExpoのアプリで、WebViewを使っている部分がありました。下のとおりExpo-webは現時点(SDK41)で、WebViewには非対応です。

![WebView_-_Expo_Documentation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45686/c7b37b31-f7b9-cd32-95de-75254bfa4c41.png)


そこで、WebViewのほうは変えないまま対応する方法を探したところ `react-native-web-webview` というのを発見しました。

https://github.com/react-native-web-community/react-native-web-webview

`react-native-web-webview` を使う方法について書きます。

# react-native-web-webview のための設定

このパッケージ自体は適当にググった結果見つけていたのですが、設定のドキュメント読んでも、よくわかりませんでした。

しばらく放置してましたがこのZennの本を参考にようやく実装方法を理解しました。その他全般の理解に役立ったので、ExpoでのWeb対応を考えている方は読むといいかもしれません。

https://zenn.dev/nabettu/books/14a02b6cddb24af4652a

## webpack.config.js の生成

まず、やるべきことは、Web向けに独自の設定を入れるために `webpack.config.js` ファイルを生成します。以下のコマンドを叩きます。

```bash
$expo customize:web
```

## webpack.config.jsの設定

生成された `webpack.config.js` に、react-native-web-webviewの設定を追記します。



```javascript
const createExpoWebpackConfigAsync = require("@expo/webpack-config");

module.exports = async function (env, argv) {
  const config = await createExpoWebpackConfigAsync(env, argv);
  // Customize the config before returning it.
  config.module.rules.push({
    test: /postMock.html$/,
    use: {
      loader: "file-loader",
      options: {
        name: "[name].[ext]",
      },
    },
  });
  config.resolve.alias = {
    "react-native": "react-native-web",
    "react-native-webview": "react-native-web-webview",
  };
  return config;
};
```

これで、`yarn web` でwebアプリを起動したときに、ネイティブ部分でWebviewだったところが、iFrameで呼ばれるようになります。

# postMessage部分の修正

react-native-webviewでは、アプリ本体とデータをやり取りする際に以下のようにpostMessageで送ります。しかし、Webになると `window.ReactNativeWebView` がいません。

```javascript
window.ReactNativeWebView.postMessage(postObject);
```

Expo-webでiFrameとして読み込んだ場合は `window.parent` にメッセージを送ります。
同じドメインで読み込んでいる場合はサンプルコードの通り、 `window.parent.origin` を指定すればいいでしょう。自分の場合は違うドメインのものを読み込んでいたので、別のものを指定しています。


```javascript
window.parent.postMessage(postObject, 'https://yourdomain.com');
```

自分の実装では、この2つのパターンはWebViewで呼ばれる側のウェブサーバーで出し分けています。


以上のようなやり方で、Expo-webでWebViewが使えるようになりました。おしまい。
Amazon ConnectとAmazon Transcribeの素敵な関係

コールセンター構築サービスであるAmazon Connectと、音声認識システムであるAmazon Transcribeにはいくつかの基本的な組み合わせ方があります。
それぞれの詳細は別記事に譲るとして、3種類を簡単にまとめます。

# バッチ音声認識
Amazon Connectの録音機能を用いて音声をS3に保存し、S3上の音声をバッチ処理でAmazon Transcribeに処理させます。
通話終了後に音声ファイルが生成されそこから音声認識が実行されるため、後処理のタイミングで利用するのは難しいですが、精度は一番高くなります。
「オペレータ側の通話」が録音単位であり、IVRでの応答などは録音対象となりません。外線転送も対象となりません。

# リアルタイム音声認識
Amazon Connectのストリーム機能を用いて音声をKinesis Video Streamに流し、その音声ストリームをリアルタイムでAmazon Transcribeに処理させます。
通話と並行して音声認識が実行されるため、通話中のオペレータ支援や、通話完了後の後処理に利用することができます。
「ストリームした部分」が録音単位となるので、IVR含めて録音対象とすることができます。

# Amazon Lex音声認識
Amazon Lexと組み合わせる場合、コールフロー上でLexを指定するだけで内部的にAmazon Transcribeによる音声認識が実行されます。
「Lexが音声認識した部分」が録音単位となるので、基本的にはLexの精度向上を行うための音声認識です。
【Vscode】これだけは絶対に覚えておきたいショートカットキー(for Mac)

# 初めに
コードエディターでよく使われるVscode。マウスで操作する編集作業などをキーボードでできるようになれば、作業効率が上がります。そこでMacユーザー向けにVscodeのショートカットを良く使うものだけ纏めてみました。
※内容に間違いなどがある場合はご指摘をよろしくお願いします。

# 全般
| 動作       | キー       | 表示例    |
|:----------|:----------|:----------|
| 全てのコマンドを表示 | Shift +⌘ +P     | <img width="350px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/cd07a3c1-ca8e-71c2-91a2-e8ed1e2c06e1.png">|
| 設定ファイルを開く   | ⌘,   | <img width="350px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/9983bb5d-9f63-3777-7103-11a7b555a46b.png">|
| サイドバーの表示/非表示    |  ⌘+B     |  <img width="350px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/0e6f1b48-5174-b1f7-c86c-959ee73d7679.png"> |
| ターミナルの表示/非表示    |   Ctrl+Shift+@ | <img width="350px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/048e8002-1f48-da48-cbe3-962fc1091a52.png">|
| 新しいファイルを開く   | ⌘+N     |   |
| 開いたファイルを閉じる   | ⌘+W     |   |
| 新しいウィンドウ開く    | Shift+⌘+N    |     |
| ファイルを保存    | ⌘+S     |    |
| ファイルを開く    | ⌘+O     |   |

#コード編集
| 動作       | キー       | 表示例    |
|:----------|:----------|:----------|
| コードの整形    | Shift+Option+F   |     |
| コピー    | ⌘+C    |  |
| 切り取り    | ⌘+X    |    |
| 行を削除  | Shift+⌘+K   |    |
|取り消し|⌘+Z||
| 行を下へ移動   | Option+↓    |    |
| 行を上へ移動    |  Option+↑   |     |
| 行を下へコピー   | Shift+Option+↓  |  |
| 行を上へコピー      | Shift+Option+↑   |     |
| 行を下へ挿入    |   ⌘+Enter  |   |
| 行のインデント追加    | ⌘+]   |     |
| 行のインデント削除   | ⌘+[   |     |
| 全ての行を選択   | ⌘+A  |     |
| 同じ文字列の順次指定    | ⌘+D    | <img width="350px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/db70859e-1c41-54b6-4a21-88dfc620942b.png">|
| 一致する全ての文字列指定    | ⌘+Shift+L   | |
| 選択箇所順次指定    | Option+クリック    |<img width="350px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/b39c2b6b-a867-c921-345c-0c979e7d45ac.png"> |
| カーソルを上に挿入    | Option+⌘+↑   |<img width="350px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/a0086190-8dfe-c00a-e637-2236b61fccac.png"> |
| カーソルを上に挿入    | Option+⌘+↓   | |
| 選択行をコメントにする    | ⌘+/   | <img width="350px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/d410baa0-6a8d-2305-895f-a6d0fcc8019e.png">|
| ファイル内検索    |  ⌘+F    | <img width="350px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/0376cb94-7977-7d61-1b00-783a42c32148.png"> | 
|ファイル内置換   |  Option+⌘+F     |<img width="350px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/910720a5-4ed5-dba7-133d-088d8f3c8862.png"> |
| 絵文字を開く    | Control+⌘+Space  | <img width="350px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/865ebe79-1f6e-b076-897a-86e2ea7e25e4.png"> |

# 参考記事・サイト
https://qiita.com/oruponu/items/ae9c720d4522c1606daf
https://murashun.jp/article/programming/visual-studio-code/shortcut-keys.html
【Rails】ストロングパラメーターparam is missing or the value is empty:について

## 今回問題となる箇所

```rb
def create
    customer = Customer.new(customer_params)
    if customer.save
       render json: { status: 'success11111', data: customer }
    else
      render json: { status: 'error', data: customer.errors }
    end
  end

 private
  def customer_params
    params.require(:customer).permit(:name, :age, :sex, :memo) 
  end
```
です。
どういった問題かといいますと

## param is missing or the value is empty:
パラメーターがないか、値が空であるといった内容でした。
今回の場合はapiの実装中ということで、Postmanを利用し、リクエストに対するレスポンスの確認を行っていました。
[![Image from Gyazo](https://i.gyazo.com/fa6a99395c34a63076ecb0e4320a641e.png)](https://gyazo.com/fa6a99395c34a63076ecb0e4320a641e)
こんな感じです。

いろいろ調べてみた結果、

```rb
def create
    customer = Customer.new(customer_params)
    if customer.save
       render json: { status: 'success11111', data: customer }
    else
      render json: { status: 'error', data: customer.errors }
    end
  end

 private
  def customer_params
    params.permit(:name, :age, :sex, :memo) 
  end
```
`require(:customer)`を消せばエラー無くレスポンスがかえってきました。

原因はおそらく

controller側で@customer = Customer.newやなどの書き忘れが原因なことが多いようです！

```erb
<%= form_with model: Customer.new do %>
あるいはcontroller側で@customer = Customer.newとして
<%= form_with model: @customer do %
```
とした場合、パラメータは

```
<ActionController::Parameters {(略),"url"=>"https://(略)", "customer"=>{"group_id"=>"5", "commit"=>"Save ", "controller"=>"customer"}, "action"=>"create"} permitted: true>
```

となり、ストロングパラメータは正常に実行されるはずです
今回の場合はPostmanにてリクエストを送信していて、

```erb
<%= form_with model: @customer, url: customers_path, method: :post do %>
```
といったようにviewファイルからモデルを指定して送られたリクエストではないため、`param is missing or the value is empty:`が起きたと考えられます！

今回私はviewファイルを作成していない段階の事例でしたが、最初にも記述しましたがこのエラーに関しての多くは`@customer = Custome.new`などの書き忘れが原因なことが多かったり、複数形のスペルミスだったりするようなので、チェックしてみてください！
図解・図形表現メモ


## 図形表現の8つのパターン
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1308027/ec80bf88-136d-27c0-6e0b-618343cbc4c2.png)


###応用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1308027/adfd557f-ccb1-674f-21e9-cccb28034878.png)