OmniAICreator/Qiita-1.07M huggingface dataset:
なぜ日本人の英語はネイティブスピーカーに通じないのか

インド人の巻き舌かつ早口でまくし立てるような英語。
日本人には非常に聞き取りづらいですが、不思議なことにネイティブスピーカーには、日本人のカタカナ英語よりインドや中国訛りの英語の方がよく通じます。
日本人の英語の方がゆっくり・はっきり話しているのに逆に通じない。

それはなぜか？

英語の「リズム」や「テンポ」を日本人は理解していないからだと思ってます。

どう言うことか？？？

## チョコレートが通じない問題

「チョコレート」や「バニラ」はお店などで注文をする時など、日常でもよく使うけれど日本人が発音しても通じにくい単語の筆頭ではないでしょうか？

例えば「チョコレート」を日本人が普通に発音すると、「チョ・コ・**レー**・ト」のように4つの音節で発音する感じになります。
また、アクセントが「レー」の部分にきて長音になります。

一方で正しい**"chocolate"**の発音は、無理やりカタカナにすると、「**チョ**ク・レット」あるいは「**チョー**・コ・レット」のように2つか3つの音節になります。
どちらの場合も「チョ」にアクセントがあり、それを「チョー」と伸ばすか否かの違いです。

この**「音節の数の違い」**と**「アクセントの位置の違い」**は日本人にとっては些細なことに思えるかもしれませんが、これこそが**日本人の英語が通じない大きな原因**だと思います。

日本人の「チョコレート」の発音は音節・アクセントがでたらめなので通じないし、
聞き取ってもらえないからといって「チョ・コ・レ・エ・ト」のように音節をはっきりと分けて発音するとさらに逆効果になってしまいます。1つの単語ではなく複数の単語の文を話そうとしているようにネイティブには聞こえて混乱しているかもしれません。

ネイティブスピーカーは単語を聞きとる時に「音節の数とアクセントの位置」つまりは「リズム」を土台として聞き取っていて、母音やLやRなど子音の細かいニュアンスは重要ではないと思います。

その証拠に、米・英・豪それぞれの英語は母音などの発音に差があったりしますが、土台の「リズム」の部分はほとんど同じなのでネイティブ同士では全く問題なく通じます。
一方でアイルランドの英語は完全に独自の「リズム」と「テンポ」があるので、訛りが強いとネイティブにも全く通じません。
インド人の英語は「テンポ」が速いし巻き舌などの鈍りがあるけれど、「音節の数とアクセント」は割と自然なので通じやすいのだと思います。

----

なので単語の綴りや意味だけでなく、発音記号を見て「音節の数」と「アクセントの位置」を意識しつつ声に出して見て覚えていくのがいいと思います。

慣れてくれば法則のようなものが掴めて、初見の単語でもそれっぽく発音できるようになってくるでしょう。

単語の単位での「リズム」が掴めてきたら次は単語と単語をつなげたときの文の「リズム」です！
続く・・・
Grove IoT スターターキット for SORACOMを実際につなげてみた

#１．概要
Grove IoT スターターキット for SORACOM(Wio LTE JP Version)
https://soracom.jp/products/kit/grovestarter_kit_lte/

だいぶ前に購入しましたが、積んだままにしていました。
ようやく重い腰を上げて動作させてみることにしましたのでまとめます。

![qiita01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668128/2e51e699-42ba-7f0f-f7ca-953c8f12f223.jpeg)

#２．内容
・基本的には以下のサイトを参考にしました。

Seeed製品公式ページ
https://seeedjp.github.io/Wiki/Wio_LTE_for_Arduino/Setup-ja.html

SORACOMの解説ページ
https://soracom.github.io/jp-training/WioLTE/1/2-uptime.html


・よくあるArduinoボードと違うのは、プログラム書き込みと動作でモードを変える必要があること。DFUモードと通常モードの2つのモードがあります。
※プログラムを書き込むときは、裏面のBootボタンを押しながら起動するとDFUモードになります。
※この辺の話は公式ページに写真付きで詳しく書かれております。


・Arduinoのサンプルコードを使用して、SORACOM Harvestへ接続しました。
以下の順にたどります。
　スケッチ例　→　WioLTEforArduino　→　soracom　→　soracom-harvest　

上記の　soracom/soracom-harvest　のサンプルコードは、
Wio LTEの稼働時間をSORACOM Harvestへ送信します。
（コメントを有効にすると、温湿度センサも対応出来そうですが、とりあえずそのまま使ってみます。）

※シリアルモニタでデバッグコードを確認しようとしましたが、Arduinoのシリアルモニタで受信できなかったため、代わりにTereTermでモニタしました。

・10秒程度で接続が完了し通信OKの出力が確認出来ました。
実際の通信状況はLEDでも確認出来ました。

*****
.### TIMEOUT ###
.### TIMEOUT ###
.### TIMEOUT ###
.### TIMEOUT ###
.### TIMEOUT ###
.->
-> RDY

Elapsed time is 10162[msec.].
<- AT
-> AT
-> OK

<- ATE0
-> ATE0
-> OK
<- AT+QURCCFG="urcport","uart1"

*****


・上がってきたデータはSORACOM側のSORACOM Harvestでも確認出来ました。


![soracom-02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668128/65646ea6-0008-0554-1cff-fc3d29733921.png)


・今回のサンプルコードはデバイス稼働時間を計測するコードであり、
自動更新をONしておくと徐々に起動した時間の分だけ、数値が増加することを確認出来ました。


#３．まとめ
・ひとまず、サンプルコードそのままでもデータ通信出来ることが確認出来ました。ほぼプログラミングせずに動作確認出来るのは開発キットの強みですね。

・データを上げる基盤を確認することが出来たので、次は定番の温湿度測定が出来るところまで進めたいと思います。
高速フーリエ変換(FFT)を行列で理解する

何番煎じか分からんですが、どうしても数式が多い[^2]と読む気がなくなるので、
厳密さは棚上げして、なんで計算量が減るのかのイメージを把握する目的で、記事を残してみます。

[^2]: 結局、記事書いてみたら数式が多くなってしまった…

# 前提知識

- 三角関数を知っている
- 複素数を知っている
- オイラーの公式を知っている
- 積分を知っている[^1]
- 行列の積の計算規則を知っている

結構なレベルの数学知識が要求される内容なんだと改めて思いますね。。
[^1]: 高速フーリエ変換を計算するだけであれば無くてもどうにかなるが、フーリエ変換自体の理解には必要

# フーリエ変換

上記の前提知識があれば、下記が分かりやすいと思います。
[【画像45枚あり】フーリエ変換を宇宙一わかりやすく解説してみる](https://www.yukisako.xyz/entry/fourier-transform)

# 高速フーリエ変換


数学・工学系の記事にしてはめずらしく、
Wikipediaの解説（下記）がイメージ付きやすいように思います。
- [計算したい式（離散フーリエ変換）](https://ja.wikipedia.org/wiki/%E9%AB%98%E9%80%9F%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B#%E6%A6%82%E8%A6%81)
- [高速フーリエ変換を行列で表現](https://ja.wikipedia.org/wiki/%E9%AB%98%E9%80%9F%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B#%E5%8E%9F%E7%90%86%E3%81%AE%E7%B0%A1%E5%8D%98%E3%81%AA%E8%AA%AC%E6%98%8E)

## 上記(Wikipedia記事)の補足説明

上記のWikipediaの式（行列の計算式のとこ）で使われている記号と同じ記号を割り当てます。[^3]

[^3]: 厳密にはWikipediaのほうは指数部にマイナス符号がついてるが、本質には影響しないはず。

```math

W=e^{2\pi i\frac{1}{N}}
```

とおくと、高速フーリエ変換では下記の$X_0, X_1, X_2,...,X_{N-1}$が求める対象になります。

```math

X_t = \sum_{k=0}^{N-1}W^{k\ t}x_k

```

例として、$N=8$のときは下記のようになります。（通常、高速フーリエ変換を適用する際は$N$は$2$のべき乗を前提とします。）

```math
\begin{align}
X_0&=W^0x_0+W^0x_1+W^0x_2+W^0x_3+W^0x_4+W^{0}x_5+W^{0}x_6+W^{0}x_7\\

X_1&=W^0x_0+W^1x_1+W^2x_2+W^3x_3+W^4x_4+W^{5}x_5+W^{6}x_6+W^{7}x_7\\

X_2&=W^0x_0+W^2x_1+W^4x_2+W^6x_3+W^8x_4+W^{10}x_5+W^{12}x_6+W^{14}x_7\\
   &:\\
X_7&=W^0x_0+W^7x_1+W^{14}x_2+W^{21}x_3+W^{28}x_4+W^{35}x_5+W^{42}x_6+W^{49}x_7
\end{align}
```

下記のようにベクトルにみたてて、

```math

\begin{pmatrix}
X_0\\
X_1\\
X_2\\
:\\
X_7\\
\end{pmatrix}
```
と書くと、下記のような行列とベクトルの積として表現できます。左辺の行列の要素をクリックすると、関連する要素が強調表示されます。
（※下記で左辺の$x$の添え字の並びが連番ではなくなっているのは意図的なものです。）

<p class="codepen" data-height="520" data-theme-id="light" data-default-tab="result" data-user="kob58im" data-slug-hash="gOrRQwN" style="height: 520px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Matrix Image of Fast Fourier Transform">
  <span>See the Pen <a href="https://codepen.io/kob58im/pen/gOrRQwN">
  Matrix Image of Fast Fourier Transform</a> by kob58im (<a href="https://codepen.io/kob58im">@kob58im</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
（描画サイズが大きいので、縮小表示(0.5x)もしくは[CodePen上での閲覧](https://codepen.io/kob58im/pen/gOrRQwN)推奨です。[^4]）

[^4]: 環境によっては縮小できない模様・・・。

上記の分解は、$W^N=e^{2\pi i}=1$であることにより、$W^8=1\ (=W^0)$が成り立つことを利用しています。

右辺の右側から結合させる（積を求める）のがミソのようで、
右辺の右側の行列（真ん中というべきかも（？））が、$\frac{N}{2}$次の行列２つ分相当になり、再帰的に分解ができる構造になります。
さらに、$W^{N/2}=e^{\pi i}=-W$であることを使って計算を効率化させたりするようです。

# バタフライ演算

[高速フーリエ変換(FFT)のバタフライ演算を可視化してみた](https://qiita.com/kob58im/items/c082a7904926aa8479e4)
[Java] 条件分岐

#if文
　if文は数値や文字列などの評価（比較）結果を判定します。評価結果が「true（真）」の場合、ifブロック内の処理が実行されます。評価結果が「偽 (false)」 の場合はelse文を組み合わせます。

```
if( 条件文 ) {
     // 条件文が真 (true) のときにここが実行される
}
else {
     // 条件文 が偽 (false) のときにここが実行される
}
```
　if文など、処理分岐するためには条件を判定する必要があります。判定のことを「評価」と呼びます。

##関係演算子

![関係演算子.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646368/0e286b4c-f331-0b89-1311-879360d4e46f.png)

##論理演算子

![drow.io.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646368/0e3126f7-94e5-c1cb-9fc4-4cf754f38f1e.png)

#switch文
　switch 文は指定した変数が特定の値をとる場合に、実行するコードを指定できます。 変数は switch で指定して、条件となる値は case に指定します。case 値: に続けて、 実行するコードを指定できます。コードブロックは break まで実行されます。

```
switch( 変数 ) {
case 値1:
case 値2:
     // 値1 か値 2 のときここが実行される
     break;
case 値3:
     // 値3 のときにここが実行される
     break;
default:
     // 値1, 2, 3 のいずれでもない時にここが実行される
     break;               
}          
```
datetimepicker datepicker 違い

#初めに
僕が携わっている案件での修正部分にdatetimepickerの知識が必要だったので、調べるとともに記事にしてまとめました。
#datetimepickerとは
ユーザーが日付や時間を入力する際に、直感的な操作で簡単に日時を指定できる
jQueryに依存しており、導入も比較的簡単
#datetimepickerとdatepickerの違い
datetimepickerは日付と時間を両方指定できるが、datepickerは日付のみ指定できる(名前の通りでした、、)
datetimepicker
![スクリーンショット 2020-08-30 22.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624073/a90429a4-2462-52bf-31d9-1c26eef8a868.png)
datepicker
![スクリーンショット 2020-08-30 22.56.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624073/ddfe64c4-46fc-5d42-79c1-b5ca70fc8285.png)
HTTPメソッドの「べき等」と「安全」について考察してみる

有名な書籍[Webを支える技術](https://www.amazon.co.jp/Web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-HTTP%E3%80%81URI%E3%80%81HTML%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6REST-WEB-PRESS-plus/dp/4774142042/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=rest&qid=1598794845&sr=8-1)で紹介されていた「べき等」と「安全」について自分なりに考察してみました。

Restの実装経験は業務でないですが、今後実装経験を積んでいくにつれて
必要な知識になりそうだと思い、学習しています。

学習途中で、「べき等」と「安全」という概念が書籍で紹介されており、
その内容について考察してみました。

# 「べき等」と「安全」

RESTに用いられるHTTPメソッドには「べき等」と「安全」という考え方があるようで、

べき等
　ある操作を何回行っても結果が同じであること
　e.g) 何度UPDATE処理をしても、すで更新済みの内容であればデータは変化しない
　　　 DELETEも同様に、一度削除すればずっと削除された状態が保持されるのでデータは変化しない

安全
　操作対象のリソースの状態を変化させないこと
　e.g) SELECTの場合、データに変化を与えず取得のみを行う

上記をまとめると、以下のように分類できる
書籍では、HTTPメソッドごとに下記のように分類されている(p101参照)
————————————————————————
HTTPメソッド　　　 性質
GET、HEAD　　　　べき等かつ安全
PUT、DELETE　　　べき等だが安全でない
POST　　　　　　　 べき等でも安全でもない
————————————————————————
　
　
# 考察

なぜこのような「べき等」と「安全」という概念が存在するのか考察してみる。

そもそもデータ操作の種類に着目すると2パターンの動きが考えられる
1. データを取得する
2. データに変化を加える

上記の操作に行うにあたって必要な考えとして
(1)では、データに対する取得のみを行う → GETメソッドで再現する
(2)では、データ挿入(INSERT)する、データを更新する(UPDATE)、データを削除する(DELETE)の3パターンにさらに分類できる
　　ーーさらに更新(UPDATE)では、データをある一定の値に留まらせるための更新(※1)と
　　ーーデータを加算的に常に変化させる操作を加えるもの(※2)が存在する


(2)の場合でデータを削除(DELETE)する場合はHTTPメソッドのDELETEに該当することは一目瞭然だが、
INSERT/UPDATEと対になるHTTPメソッドは何かということについては不明瞭である

ここで、HTTPメソッドの本質的な概念を振り返る
INSERT/UPDATEをする際に、用いられるHTTPメソッドはPUT/POSTに該当するが
PUTの概念である「べき等だが安全でない」に従わなければならない
とすれば、PUTによるデータ操作でINSERT/UPDATE処理を行った場合、
2度目以降の同様のデータ操作は何度行っても同じ結果にならなければならない
つまり、上記(※1)に該当する操作としてPUTを用いることがREST処理において
正しい使い方だと考えられる

POSTについては、「べき等でも安全でもない」に従う必要がある
PUTとの違いは「べき等でない」ことである。
これは上記(※2)に該当することがわかる。
つまり、POSTによるデータ操作は常にデータに変化を加え続けるという性質のもと利用されなければならない
INSERT処理を行った場合、次回に同じ内容のリクエスト処理がきても
新たにレコードを追加してまたINSERT処理を行う。
すでにINSERT済みのデータにUPDATE依頼がきたら
対象のデータの状態を変化させる必要がある。

以上の内容をまとめるために、[考察]の仮定を再度振り返る。
1. データを取得する　　　　　SELECT(GET)　　　　　　　　・・・対象のデータの取得のみを目的とする操作
2. データに変化を加える　　　ー DELETE(DELETE)   　　　　・・・ 対象のデータの削除をのみを目的とする操作
　　　　　　　　　　　　　　　ー ー　INSERT/UPDATE(PUT)　・・・データをある一定の値に留まらせる操作(更新/挿入)　
　　　　　　　　　　　　　　　ー ー　INSERT/UPDATE(POST) ・・・データを加算的に常に変化させる操作を加える操作(更新/挿入)

これら全てのデータの基本操作を概念化したものを「べき等」と「安全」と呼んでいるのだと思われる。
つまり、HTTPメソッドにおいてデータ操作を行う際は、
そのデータ操作の概念として常に下記に分類される方法によってなされなければならないということだと考えられる。
————————————————————————
HTTPメソッド　　　 性質
GET、HEAD　　　　べき等かつ安全
PUT、DELETE　　　べき等だが安全でない
POST　　　　　　　 べき等でも安全でもない
————————————————————————

　
　
　
実際の現場では、POSTはPUTの操作も兼ねて使用されることが非常に多いと思うが、
その背景としてクライアントソフト側でAjaxという技術や概念がなかったころ、
Form形式でデータの送信を行う必要があり、Form形式のよるデータ送信の規定として
GET/POSTとしか使用できないという規制(p98)があったため、データ操作の基本概念を無視した
実装がされるようになったのではないかと考えています。

あるいは、PUTという考え方自体が不要で、
データ操作の分類として無視できず存在してしまうから
PUTという操作を概念化させているのかもとも思いました。

この辺の内容については、今後調べていきたいです。
また、RESTの実装にあたって、この「べき等」、「安全」のルールを守って実装することを
今後心がけようと思います。
イラストレーターで漢字にルビをふる

専用の機能はなさそう。


https://www.too.com/support/faq/adobe/23425.html
ただし、上のサイトにあるように無理やりつけることができるとのこと。


ふりがなと漢字を一行に入力して、2行に分ける設定を行うことでルビを作っている。
ただし、この方法だと意図しないところで改行されておかしくなることがあるとのこと

自分も「保護者」という文字にルビを振ろうと思ったが「ほごしゃ保」「護者」という別れ方になりおかしくなった。


InDesignというソフトでやった方がいいらしい
jupyter lab上で画像のラベリングをする

## やりたいこと
AIに使いたい画像のラベリングをしたいが、GUIを作るのが面倒。。。と思い、
JupyterLab上でできないかーと考え、色々調べてたらできたのでそのときのメモ。
matplotで表示した画像を更新しながらinputでラベリングを入力するようなイメージ。

## 実行環境
- Python 3.8.5
- jupyter lab 2.2.2
- mac(windows10でも実行済み)

## コード
sample_imgフォルダにある画像をラベリングする。

### 準備
```python
import cv2
import matplotlib.pyplot as plt
import os
import glob
import IPython
# 画像のpathを取得
img_list = glob.glob(os.path.join(r"sample_img","*.jpg"))
img_list
>>> ['sample_img/img3.jpg', 'sample_img/img2.jpg', 'sample_img/img1.jpg']
```

### 画像を表示するコード
```python
name_list = []
for img_path in img_list:
    # 画像の読み込み
    img = cv2.imread(img_path)
    # 画像を表示するフレーム
    fig = plt.figure(figsize=(5,5))
    ax = fig.add_subplot(1,1,1)
    ax.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
    plt.title(img_path)
    plt.pause(.01)
    
    # ラベル付けするためのテキストボックス
    comment = input()
   
    if comment == "break":
        break
    else:
        # 表示している画像をクリア
        IPython.display.clear_output()
        # Inputに入力した文字列をリストに追加
        name_list.append(comment)
```

動作画面はこんな感じ。
pass![labeling.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521159/384faad8-4291-191a-0b7f-e11e48530bef.gif)

### 確認
```python
# name_listの確認
name_list
>>> ['dog', 'cat', 'cat']
```

## 最後に
Input部分をラジオボタンみたいにできたらいいな〜.
[Python] UnionFind　ABC177D

#[ABC177D](https://atcoder.jp/contests/abc177/tasks/abc177_d)

一番大きいユニオンに属する人数の数だけグループを作ればい。
UnionFindにはいろいろな実装があるが, 本問ではparents配列にノード数を保持する実装だと非常に簡単に解ける. 以下のようにしてノード数を保持する.

・自身が子のとき, 親ノード番号を格納する。自身が根のとき, ノード数を負の数で格納する。
・負の数のときは自身が根であり, その絶対値がその木のノード数を表す。

（参考）
グループ数を求める問題が、ACL BeginnerのCで出ている。
[【AtCoder解説】PythonでACL BeginnerのA,B,C問題を制する！](https://qiita.com/u2dayo/items/02afa4fdcf4d9726366c)

```python:サンプルコード
import sys

#UnionFindTreeクラスの定義
class UnionFind():
    #クラスコンストラクタ
    #selfはインスタンス自身
    def __init__(self, n):
        #親ノードを-1に初期化する
        self.parents = [-1] * n

    #根を探す（再帰関数）
    def find(self, x):
        if self.parents[x] < 0:
            return x
        else:
            self.parents[x] = self.find(self.parents[x])
            return self.parents[x]

    #xとyの木を併合する
    def union(self, x, y):
        #x,yの根をX,Yとする
        X = self.find(x)
        Y = self.find(y)

        #根が同じなら結合済み
        if X == Y:
            return

        #ノード数が多い方をXとする
        if self.parents[X] > self.parents[Y]:
            X, Y = Y, X

        #XにYのノード数を足す
        self.parents[X] += self.parents[Y]
        #Yの根を X(>0) とする
        self.parents[Y] = X

    #木のサイズ
    def size(self, x: int) -> bool:
        return self.root[self.find(x)] * -1


N, M = map(int, input().split())
 
#UnionFindインスタンスの生成
uf = UnionFind(N)
for _ in range(M):
    #インデックスを調整し、a,bの木を結合
    a, b = map(int, input().split())
    uf.union(a-1, b-1)

ans = min(uf.parents)

print(-ans)
```
Material-uiでDate pickerを使うときの注意点

<h1>本記事の目的</h1>

ReactのCSSフレームワーク「Material-ui」で日時入力（Date/Time）をするためのフォームを実装する際に詰まったので、メモ。

Material-ui公式ドキュメント内の該当項目はこちら↓
https://material-ui.com/components/pickers/

<h2>1. 必要なコンポーネント </h2>
公式ドキュメントの記載が不親切で、初心者には何が必要かいまいち分からなかった。
下記３つのコンポーネントの導入で動作しました。

```
"date-fns": "^2.16.0",
"@date-io/date-fns": "1.x"
"@material-ui/pickers": "^3.2.10"
```
※２０２０年8月時点のヴァージョン
注：ヴァージョン制限に注意、下記2.で解説

date-fns以外にも、moment,luxion,dayjsがあるけど、
詳しくないのでMaterial-uiの公式ドキュメント内で採用されている、date-fnsを採用。
※比較記事見つけたら追記します。

<h2>2. @date-ioのヴァージョン制限</h2>
これも公式ドキュメントをしっかり読めという話だけど、
https://material-ui-pickers.dev/
の中に、
>Important: For material-ui-pickers v3 use v1.x version of @date-io adapters.
※意訳：v3のmaterial-ui-pickersnにはv1.X台の@date-ioを使いなさい。

とある。これを見逃してエラーにハマったので大事。

<h2>実装例</h2>
DatePickerコンポーネントの実装例を記載します。
useStateを上位から渡していますが、もっと良い方法があれば、ご指摘いただける嬉しいです。

```
import React from 'react';
import {
  MuiPickersUtilsProvider,
  KeyboardDatePicker,
} from '@material-ui/pickers';
import DateFnsUtils from '@date-io/date-fns';

const DatePicker = ({ selectedDate, setSelectedDate }) => {
  const handleDateChange = (date) => {
    setSelectedDate(date);
  };

  return (
    <MuiPickersUtilsProvider utils={DateFnsUtils}>
      <KeyboardDatePicker
        disableToolbar
        variant="inline"
        format="yyyy/MM/dd"
        value={selectedDate}
        onChange={handleDateChange}
      />
    </MuiPickersUtilsProvider>
  );
};

export default DatePicker;
```
Context Switch(コンテキストスイッチ)とは？

![what-is-context-switching-in-operating-system-context-switching-flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684074/0f1e8498-9405-95aa-e2b9-7ef1f3d0e6e9.png)

# Context Switch(コンテキストスイッチ)とは？
> コンテキストスイッチ (context switch) とは、複数のプロセスが1つのCPUを共有できるように、CPUの状態(コンテキスト (情報工学))を保存したり復元したりする過程のことである。コンテキストスイッチはマルチタスクオペレーティングシステムに不可欠な機能である。通常コンテキストスイッチは多くの計算機処理を必要とするため、オペレーティングシステムの設計においてはコンテキストスイッチを最適化することが重要である。

[※ウィキペディア](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81)

- マルチプロセスの環境で**CPUがある一つのプロセスを実行している状態**で**インターラプトリクエストによる次の優先順位のプロセスが実行しなければならないとき**、既存のプロセスの状態またはレジスタの値（Context）を保存してCPUが次のプロセスを行えるように**新しいプロセスの状態またはレジスタ値（Context）を変える作業**をContext Switch（Context Switching）といいます。

# Context(コンテキスト)とは？

- ユーザーと他のユーザー、ユーザーとシステムまたはデバイス間の相互作用に影響を受ける人、場所、オブジェクトなどの現在状況を規定する情報をいいます。

- AndoroidやServletなのでもContextがあるが、**OSでのContextはCPUが該当プロセスを実行するためのプロセス情報**です。

- このContextはプロセスのPCB（Process Control Block）に保存され、Context Switching時にPCBの情報を読み込んで（積載）CPUが前のプロセスがしていた作業を続けて行うことができます。

# PCB(Process Control Block)の保存情報
- プロセス状態
  - 生成
  - 準備
  - 実行
  - 待機
  - 中止


- プログラムカウンター
  - プロセスが次に実行するアドレス


- レジスタ
  - アキュムレーター（累算器）
  - スタック
  - 索引レジスター

- プロセス番号

##### ちなみにContext Switching時、該当CPUは何もできない。なので頻繁にContext Switchingを行われるとオーバーヘッドが発生し、効率（性能）が落ちます。


# Context Switching - Interrupt
InterruptはCPUがプログラムを実行している時、実行中のプログラムの外から例外が発生し、処理が必要な場合
CPUに伝えて例外状況を処理できるようにすることをいいます。

では、なんのInterruptリクエストが来たらContext Switchingが起きるでしょう？
-　I/O リクエスト（入出力リクエスト）
-　time slice expired (CPU使用時間の満了時)
-　fork a child (子プロセスを作成時)
-　wait for an interrupt (Interrupt処理を待っている時)

その他にもあるで法けど、詳しいことは省略します。
UITableViewにUIButtonを追加する

UITableViewの追加方法と、Cellにボタンを追加する方法を記載します。

# UITableViewの作成

UITableView(frame: CGRect, style: UITableView.Style)でUITableViewを作成します。
CGRect(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat)でテーブルのサイズを指定し、
self.view.addSubview()でテーブルを画面に追加します、


``` swift:
var tableView: UITableView = UITableView()

override func viewDidLoad() {
     super.viewDidLoad()

     // 画面の横の長さ
     let width = self.view.frame.size.width
     // 画面の縦の長さ
     let height = self.view.frame.size.height

     tableView = UITableView(frame: self.view.frame, style: UITableView.Style.grouped)
     tableView.dataSource = self
     tableView.delegate = self
     tableView.sizeToFit()
     // tableViewのサイズ指定
     tableView.frame = CGRect(x:0, y:50, width:Int(width), height: Int(height))
     // 追加
     self.view.addSubview(tableView)
}

```

UITableViewを作成するばあ、row数とsection数の指定も必要になります。

```swift:
// section数
public func numberOfSections(in tableView: UITableView) -> Int {
     return 1
}

// row数
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     return 9
}
```

# Cellの中身を追加
UITableViewのCellを内容を追加します。
Cellに、UItextField、UIButton等の追加ができます。
追加時にタグにindexPathを入れることで、選択時にどこを選択しているのか判断できます。

``` swift:
// Cellの高さ
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
     return 50
}
 
// Cellの内容   
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     var cell = tableView.dequeueReusableCell(withIdentifier: "Cell")

     if cell == nil {
          cell = UITableViewCell(style: .value1, reuseIdentifier: "Cell")
     } else {
          self.view.willRemoveSubview(cell!)
          cell = UITableViewCell(style: .value1, reuseIdentifier: "Cell")
     }

     let width = self.view.frame.size.width

     // UITextField     
     let textfi = UITextField()
     textfi.delegate = self
     textfi.tag = indexPath.row
     textfi.frame = CGRect(x:50, y:0, width:width - 50, height: 50)
     cell?.addSubview(textfi)

     // UIButton
     let addbutton = UIButton()
     addbutton.tag = indexPath.row
     // 押下時動作
     addbutton.addTarget(self, action: #selector(buttonEvemt), for: UIControl.Event.touchUpInside)
     addbutton.frame = CGRect(x:0, y:0, width:50, height: 50)
     cell?.addSubview(addbutton)
     return cell!
}
```


# Cellの選択時の動作

Cellを選択してときの動作を追加できます。
UIButton、UITextField等は画面に追加したときと同じ用に記載すればいいですが、
どのCellを選択しているかわからないため、tagに入れたindexPath.rowでどれを選択しているか
判断できるようにする必要があります。

``` Swift:
// Cell選択時動作
func tableView(_ table: UITableView, didSelectRowAt indexPath: IndexPath){

}

// UIButtonを選択した時
@objc func buttonEvemt(_ sender: UIButton) {
     print("buttonTag", sender.tag)
}

// UITextFieldを選択した時
func textFieldDidBeginEditing(_ textField: UITextField) {
     print("start",textField)
     print("tag",textField.tag)
}
   
// UITextFieldを離した時
func textFieldDidEndEditing(_ textField: UITextField) {
     print("end",textField)
     print("tag",textField.tag)
}
```
Microsoft Office Specialist（MOS） Excel 2016

2020年8月30日にMicrosoft Office Specialist（MOS） Excel 2016を受けました。
合格したので記事を書いておきます。
少しでも次受ける方の参考になれば幸いです。
※エキスパートではなく、スペシャリストです。


## 受験理由
■１ これまで我流でやってきたので正式な方法を学ぶため
■２ 仕事の効率化のため
■３ ビジネス統計スペシャリスト（エクセル分析ベーシック）と Microsoft Office Specialist（MOS） Excel 2016 エキスパートを受ける前に取っておきたかったので

## 感想
■１ エクセルを仕事で使っている人であれば、1週間（毎日２～３時間程度）ほど勉強すれば受かると思います。心配なら、2～3週間ほど勉強すればよいかと思います。
■２ 本番の試験より市販の問題集（模擬試験）の方が少し難しいです。
■３ 今回紹介している試験対策の本2冊にはCD-ROMがついており（※学習教材の箇所を参照してください）、動画での解答があるので、試験対策の本を買って勉強するだけでもよいかもしれません。受験料は1万円ほどで高いですが、対策本自体は2千円前後でお買い得です。この値段で、動画解答付きは本当にありがたいです。勉強になります。
	
## 学習教材
※１、２どちも動画での解答があります。
■１ Microsoft Office Specialist（MOS） Excel 2016（第2版第6刷）（富士通エフ・オー・エム株式会社 (FOM出版), 2020, FOM出版）
・・・ これだけやれば問題ないです。エクセル使ったことある人なら、この教材のCD-ROMをインストールして模擬試験を全て理解して解けるようになれば受かると思います。また、本は気になる点だけ読む程度でよいかと思います。おそらくエクセルの細かなバージョン違いで、正解と認識されないこともありますが、動画での解答を確認して、自分の行った操作と同じであればOKです。
■２ MOS攻略問題集 Excel 2016（初版第10刷）（土岐, 2020, 日経BP社）
・・・ 個人的な感想ですが、１より模擬試験は簡単です。難易度的にこちらの方が本番に近いかもしれません。１の模擬試験が難しい場合は、こちらからやってもいいかもしれません。私は1がすぐに終わってしまい、暇になったのでこちらを購入して模擬試験を解きました。こちらも動画の解答があります。本の中身はこちらの方が読みやすかったです。

## 学習方法
■１ 上記の学習用教材の模擬試験10回分を解き、不正解の箇所に関しては、動画で解答を見て勉強しました。
・・・1～2週間ほどだらだらと勉強しました。毎日勉強はしていませんが、平均して1日に2～3時間ほど勉強しましたので、トータルで20～30時間ほど勉強したと思います。模擬試験は時間を気にしないで3回分ぐらい解いて、そのあとは本番の試験と同じで50分以内に解きました。最初の数回は（試験慣れしておらず）、問題の意味（意図）など含めて、わからないこともあるので制限時間は気にしなくてよいと思います。
（※エクセルを多少使えることが前提ですが、しっかり勉強するなら1週間もあれば十分だと思います。また、ものすごく本気で勉強するのでしたら、2～3日やれば受かる気がします）


## 試験
■１ 模擬テストよりも本番の試験の方が判定が甘い気がします。模擬試験で不正解の判定が出ていても、本番の試験で正解判定してくれている気がします。ちなみに、私は模擬テストは7～8割ほどの点数しか取れませんでしたが、本番は満点でした。模擬テストだと、あっているはずなのに「なぜか不正解」とかありまして、そのせいで試験前に少し不安でしたが、そこまで心配しなくても大丈夫なようです。
■２ 試験問題は「プロジェクトとタスク」で構成されています。ひとつのプロジェクトに4～7個のタスクがあり、試験ではこのタスクをこなしていくことになります（タスクを正確にこなすことが解答となります）。前のプロジェクトに戻って、解答を修正したい場合は、一度全てのプロジェクトを終える必要があります。ので、前のプロジェクトの解答を修正したい場合は、一旦すべてのプロジェクトを終わらせる必要があります。一旦すべてのプロジェクトを終わらせたら、レビューページを見ることができ、このページから修正したい解答（タスク）のあるプロジェクトに戻ることができます。

## 反省点
■１ 特になし。

## 試験前にやっておいてよかったこと等
■１ 当日に模擬試験を3回分解いて、試験の感覚を確認しておいてよかったです。試験ですので、制限時間内に正確に解くことが重要なため、試験前に数回分の模擬試験を解くのは効果的だと思います。
Macで右クリックを使用して新規テキストファイルを作成する

# 背景と目的
WindowsからMacに乗り換えて「Mac良いぞ!」と思う今日この頃。しかしながらWindowsでやっていたあの操作をMacでもやりたいと思うこともなくはない。そう、右クリックで新規テキストファイルを作成したいのだ。

調査が足りないのかもしれないが、Macの標準機能に欲しい機能がなかったのでAutomatorを使用して作成する。

# 使用したもの
- macOS Catalina バージョン 10.15.6
- Automator
- Bash

# 機能作成

## 元となるシェルスクリプトを作成する
まずはシェルスクリプトでカレントディレクトリに「newTextFile_*N*.txt」（*N*は整数）と言う名前のテキストファイルを作成できるようにしよう。ここでカレントディレクトリにファイル「newTextFile_*N*.txt」が存在するときはファイル「newTextFile_*N*+1.txt」を作成することにし、*N*の上限として100を指定した。下記「createNewFile.sh」を実行するとカレントディレクトリに「newTextFile_1.txt」などのファイルが生成される。なお`while`ループの行に書かれているコロンはヌルコマンドである。

```bash:createNewFile.sh
#!/bin/bash

# ファイル名の基本部分と拡張子
file_name_stem="newTextFile_"
file_extension=".txt"

# 新規テキストファイルの上限の指定
max_num=100

# 初期値を設定して無限ループを開始
i=1
while :; do
  # テキストファイルのファイル名の指定
  file_name="${file_name_stem}${i}${file_extension}"
  # 上記ファイル名が存在しない場合、空ファイルを作成し終了
  if [ ! -e "${file_name}" ]; then
    touch ${file_name}
    exit 0
  fi
  # 上記ファイル名が存在する場合、iをインクリメント
  i=$((i+1))
  # iが上限を超えたらエラーを表示して終了
  if [ ${i} -gt ${max_num} ]; then
    echo "Error: The new text files are too many." 1>&2
    exit 1
  fi
done

```

## Automatorで新規クイックアクションを作成する
Finderでディレクトリを右クリックして選択できるサービスのメニューの中に新しくテキストファイルを追加するメニューを作成しよう。以下の手順で作成することができる。手順番号と図中の丸で囲まれた番号は対応しているので適宜図を参照してほしい。
1. Automatorを開いて新規作成でクイックアクションを選択する。
2. 左カラムの検索窓からアクション「シェルスクリプトを実行」を検索する。
3. 左カラムにあるアクション「シェルスクリプトを実行」を右カラムにドラッグする。
4. 右カラム上部にある「ワークフローが受け取る現在の項目」欄を「フォルダ」にする。
5. 右カラム上部にある「検索対象」を「Finder.app」にする。
6. 右カラムの「シェルスクリプト実行」欄にある「シェル」を「/bin/bash」にする。
7. 右カラムの「シェルスクリプト実行」欄にある「入力の引き渡し方法」を「引数として」にする。
8. 右カラムの「シェルスクリプト実行」欄内のスクリプト記述欄を右クリックして自動変換の全てのオプションのチェックを外す。
9. 右カラムの「シェルスクリプト実行」欄内のスクリプト記述欄にスクリプトを記述する（次節参照）。
10. 適当な名称で保存する（例えば「create a new text file」）。
![select_quick_action.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246571/dada8d00-7cf3-8867-a059-7e7a87857509.png)
![edit_script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246571/2a270e15-fd41-46de-041f-619e3098a1dd.png)

この後Finderで適当なフォルダを右クリックしてサービス欄を見ると先程保存した名称があるはずだ。これをクリックすれば選択したフォルダに新規テキストファイル「newTextFile_1.txt」が作成される。もし「newTextFile_1.txt」が既に存在すれば「newTextFile_2.txt」が作成される。

## Automatorに記述するスクリプトについて
Automatorには先述したシェルスクリプトを少し改変した以下のものを記述する。具体的にはまず`$1`で選択したディレクトリのパスを取得する。それに伴いファイル名の先頭にディレクトリのパスを追加。また作成ファイル数が上限を超えた場合に通知する場所を標準エラー出力からFinderのポップアップに変更。

```bash
#!/bin/bash

file_name_stem="newTextFile_"
file_extension=".txt"
# 選択したディレクトリのパスを取得
selected_directory="${1}"

max_num=100

i=1
while :; do
  # ファイル名の先頭に選択したディレクトリのパスを追加
  file_name="${selected_directory}/${file_name_stem}${i}${file_extension}"
  if [ ! -e "${file_name}" ]; then
    touch ${file_name}
    exit 0
  fi
  i=$((i+1))
  if [ ${i} -gt ${max_num} ]; then
    # ファイル数の上限を超えた場合はポップアップで通知
    osascript -e 'tell app "Finder" to display dialog "Error: The new text files are too many."'
    exit 1
  fi
done
```

# 参考
自動変換のオフについては[このページ](http://hitoriblog.com/?p=29994)を見た。

# 理解不足な点
Finderで選択したディレクトリのパスを取得する方法として`$1`を利用する方法は[このページ](http://siio.jp/index.php?How2Gyazomodoki)を見て思いついた。意図通りの動作をしているが理解しているわけではない。この辺の仕様がわかる人がいれば是非教えて欲しい。
CodemagicでApp Store Connect APIの使い方が新しくなっていたので対応した記録

Codemagicを使っていて少し久しぶりにビルド・配信しようとしたらAndroidは問題なかったのですが、iOSだけApp Store Connectに配信できていませんでした。
結論としては、App Store Connectとの連携方法が変更されていたから見たいです。

雑ではありますが、以下対応した記録となります。

## Codemagicからのお知らせ
> New Apple Developer Portal integration
Apple Developer Portal integration for automatic code signing now uses App Store Connect API keys for authentication. This means there will be no more expiring sessions or hassle with two-factor authentication. It is possible to set up several keys for code signing and select the right key in workflow settings. We have automatically migrated most of our users but if you’re asked to connect the Apple Developer Portal integration, follow the instructions in our documentation.

> DeepL翻訳
新しいApple Developer Portalの統合
自動コード署名のためのApple Developer Portal統合では、認証にApp Store Connect APIキーを使用するようになりました。これにより、有効期限の切れたセッションや二要素認証の煩わしさがなくなります。コード署名用に複数のキーを設定し、ワークフロー設定で適切なキーを選択することが可能です。ほとんどのユーザーは自動的に移行していますが、Apple Developer Portal連携の接続を求められた場合は、ドキュメントの指示に従ってください。

## User setting画面のIntegrations
Developer Portal欄を見ると…
App Store Connectとの連携をし直さなくてはならないようです。
API Keyを使うんですね。
![スクリーンショット 2020-08-23 16.28.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54170/a0689493-2bfc-e910-928d-9529057e3f1c.png)

App Store Connectの「ユーザーとアクセス」にアクセス。
「キー」タブに「App Store Connect API」がありました。
「アクセスをリクエスト」します。
![スクリーンショット 2020-08-23 16.23.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54170/072889ec-4994-4f60-7c7d-de7c04c1245d.png)

すでに自動で生成されたキーがありましたが、API Keyファイルがダウンロードできないので、新しく生成しました。
![スクリーンショット 2020-08-23 16.24.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54170/71a3271c-c93f-c114-deaf-98aea07b3ca3.png)

名前は適当につけます。アクセス（権限）は、ドキュメントでお勧めされていた「Developer」を選択。
![スクリーンショット 2020-08-23 16.33.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54170/7ca9a94b-c3e8-f3e4-a504-9a96d169f0a4.png)

生成できました。.p8ファイルはダウンロードしておきましょう。
Issuer IDも使います。
![スクリーンショット 2020-08-23 16.51.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54170/0f7468dc-814b-a7fc-65b9-abc594d5c792.png)

Codemagic/User setting/Integrations/Developer Portal
App Store Connectのユーザーとアクセス画面で手に入れたIDと.p8ファイルを使います。
![スクリーンショット 2020-08-23 16.28.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54170/a0689493-2bfc-e910-928d-9529057e3f1c.png)

## Workflowでも設定が必要（忘れてた）
上記設定して、再ビルドしても配信できてなくて、なんで？と思いましたが、Workflowでも設定が必要でした。
App Store Connect API key (using keys from user settings)でAPI Keyを選択する必要があります！
![スクリーンショット 2020-08-23 17.16.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54170/631e77da-79f6-0e51-0b80-36314d1d87a4.png)

## 参考ドキュメント
https://docs.codemagic.io/code-signing/ios-code-signing/
お手軽競プロ環境構築入門 (for Windows) 

#はじめに
Windowsを使っている人にとって、環境構築は難易度が高くミスが発生しやすいため頭が痛い問題でした。
ここではソフトウェア管理ソフトウェアScoopを使い、簡単に環境構築を行う方法を紹介します。

#爆速環境構築コース(超初心者向け)
[環境構築ツール](https://drive.google.com/file/d/1FWFBkYxWI8evaHHYmNFJrgn7BYJs0sZR/view?usp=sharing)(2020/8/30 22:23 修正版)をダウンロードして、展開してから中にあるInstall.batを実行するだけで競プロのためのC++環境構築が完了します。
インストールされるプログラムは以下の通りです。

|  役割  |  ツール名  |
| ---- | ---- |
|  ソフトウェア管理  |  Scoop  |
|  C++コンパイラ  |  g++   |
| ビルド自動化 | cmake |
| 統合開発環境(IDE) | Geany |
| バージョン管理 | git |

#Geanyの使い方(超初心者向け)

まず左下のWindowsボタンをクリックしてメニューを開き、Geanyを探して起動します。
起動すると文字が打ち込める画面になっているので、C++言語でソースコードを書く事が出来ます。
テストとして、以下のソースコードを打ち込んでみましょう。

```
#include <bits/stdc++.h>
using namespace std;
int main(){
	cout << "Hello World!" << endl;
}
```

打ち込み終わったら、左上の"保存"ボタンをクリックしましょう。
ファイルの場所はどこでも構いませんが、ファイルの名前を変更して末尾が".cpp"で終わる名前を新たにつけましょう。
例として、Hello.cppなどが挙げられます。Helloの部分は自分で気に入った名前に変えても構いません。

保存した後は、"保存"ボタンの列の右側にある"ビルド"ボタンを押しましょう。
このボタンによって、ソースコードが自動的に実行可能なプログラムへと変換されます。
コンパイル終了後に隣の実行を押してみましょう。
新しい画面が出て、"Hello World!"と表示されたら完了です。
次は自分だけのプログラムを作成したり、AtCoder Programming Guide for beginnersなどの競プロコンテンツに取り組んでみましょう！

#カスタマイズ環境構築コース(初心者コース)
ここからは、インストールするプログラムをカスタマイズしたい方への情報になります。
爆速環境構築コースで最初にダウンロードしたファイルは、Windows組み込みのpowershellというソフトウェアを起動してその中で以下のコマンドを実行するものです。

```
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
iwr -useb get.scoop.sh | iex
scoop install git
scoop bucket add extras
scoop install gcc cmake geany
```
1行目と2行目でScoopをインストールしています。
3行目では、Scoopと親和性が高いツールgitをインストールしています。
4行目ではextrasという汎用性が高いソフトウェアが保管されているサイトをScoopのダウンロード元に追加しています。
5行目ではgcc,cmake,geanyをインストールしています。

Scoopでは、ここでインストールしたソフトウェアの他にもVSCodeやPython、Zoomなどの様々なソフトウェアをダウンロードする事ができます。
まずはScoopで導入したソフトウェアのリストを見てみましょう。

```
scoop list
```

次に、インストールしたいソフトウェアを探しましょう。

```
scoop search (ソフトウェア名)
```
(ソフトウェア名)に探したいソフトウェアの名前を入れると、その名前が含まれているソフトウェアを検索してくれます。
インストールできるソフトウェアを全て見たい場合は(ソフトウェア名)を空にして検索する事もできます。

最後に、ソフトウェアをインストールしましょう。

```
scoop install (ソフトウェア名)
```
VSCodeなどの一部のソフトウェアでは、導入後に追加で行う作業が存在する場合があります。
指示に従って作業を行いましょう。

Scoopで導入したソフトウェアはアンインストールも簡単です。

```
scoop uninstall gcc
```

たった一行を入力するだけでアンインストールが自動的に行われます。

#バージョンアップ方法
コマンドプロンプトを起動して以下のコマンドを打ち込んでください。

``` 
scoop update *
```

これを実行するだけで自動的にScoopで入れたソフトウェア全てをバージョンアップしてくれます。

#競プロに疲れてしまったら(アンインストール方法)
コマンドプロンプトを起動して以下のコマンドを打ち込んでください。

``` 
scoop uninstall scoop
```

これでScoopと導入したプログラムが全てアンインストールされ、Scoopインストール前の状態に戻ります。
Gitの用語をわかりやすくまとめる(レポジトリ?コミット?ブランチ?)

#プログラミングの勉強日記
2020年8月30日
チーム開発には欠かせないGitの用語をまとめる。

#レポジトリ
　Gitの基本的な機能で、時系列でファイルの記録を整理することができる。この記録を管理するデータベースをレポジトリという。データを一元的に管理することができ、最新のデータだけでなく昔のデータも見ることができる。
　すでに誰かが作ったものをコピーしてくることを<font color=orange>レポジトリのクローン</font>といい、自分で空のものを作成することを<font color=orange>レポジトリのイニット</font>という。

#コミットとコミットメッセージ
　レポジトリに現在のファイルの内容を記録することや、その結果作られた記録のことを<font color=orange>コミット</font>という。
　Gitではファイルを変更するたびにコミットすることができる。複数のファイルをまとめてコミットすることも１つのファイルをコミットすることもできる。
　<font color=blue>コミットしない限りファイルの変更はリポジトリに記録されない。</font>

　コミットするときに、自動的にコミットしたユーザの名前が記録されて、コミットメッセージを残す必要がある。コミットメッセージは、そのコミットでの変更を具体的に記述する。
　チーム開発においては良いコミットメッセージを残すことも大切なスキルとなる。１日の作業において数回以上コミットする方がいい。

#ワークツリー
　ワークツリーは普通のフォルダのようなもの。ただ、ワークツリーにあるファイルの変更がGitによって監視されている。
　Gitは、現在のコミットとワークツリーの内容を比較してそこに差があったときに行単位で変更箇所がわかる。ファイルの削除や追加も差分として扱われる。

#ブランチとマージ
　ブランチは複数の機能を同時に開発するときに使われる、コミットの系図の枝分かれを指した概念のこと。作業履歴を枝分かれさせて記録する。この枝分かれしたブランチは他のブランチの影響を受けないので、同じリポジトリの中で複数の変更を同時に進めることができる。
　枝分かれしたブランチは他のブランチと<font color=orange>マージ</font>(合流)することで１つのブランチにまとめ直すことができる。

#コンフリクト
　ブランチはファイルの衝突を先延ばしにすることができるが、完全に衝突を阻止することはできない。同じファイルが2つのブランチでそれぞれ変更されて、Gitで中身を合体できないという状況になると<font color=orange>コンフリクト</font>が発生する。
　コンフリクトが起こるとブランチのマージは一旦保留になり、ユーザが手動でコンフリクトを解消しなければならない。

#参考文献
[本当の初心者向け！Git入門のための概念から基本用語まで](https://liginc.co.jp/246190)
[ブランチとは](https://backlog.com/ja/git-tutorial/stepup/01/)
PlantUMLでソケットインターフェイスを表す

次のようにするとソケットインターフェイスを表現できます。

```
TestClass --(( IRequiredInterface
```

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697830/7138c23b-4800-2cb8-0f65-64e94bd44c5a.png">

ちなみにロリポップインターフェイスはこれですね

```
TestClass --() IImplementedInterface
```

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697830/c52800e2-83f5-b96d-b381-2f86e508021e.png">

ロリポップインターフェイスは情報が結構あるんですが、ソケットインターフェイスの書き方は情報があまりなかったので記事にしました。
nuget パッケージがダウンロードできないとき

## この記事は
PowerShell で nuget などパッケージがダウンロードできない時がまれにあります。
インターネット接続を確認するように促されますが、インターネット接続に問題はなく、
原因不明に陥りやすいです。

```
> Install-PackageProvider -Name NuGet -Scope CurrentUser -Force
警告: URI 'https://go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409' から '' へダウンロードできません。
警告: 利用可能なプロバイダーの一覧をダウンロードできません。インターネット接続を確認してください。
Install-PackageProvider : プロバイダー 'NuGet' について、指定された検索条件に一致するものが見つかりませんでした。パッケ
ージ プロバイダーには 'PackageManagement' タグと 'Provider' タグが必要です。指定されたパッケージにこれらのタグがあるか
どうかを確認してください。
発生場所 行:1 文字:1
```

# 解決策
PowerShell の TLS 接続バージョンが古い場合に、TLS 接続に失敗して発生する場合があります。
下記のように TLS 1.2 を追加して、改善するか確認ください。
※最近、多くの接続先で暗号化された接続を TLS 1.2 に限定することが多いです。

1. PowerShell を管理者モードで起動します。

2. 以下のコマンドを実行して、TLS のバージョンを確認します。
> [Net.ServicePointManager]::SecurityProtocol

3. 項目 2 の結果、Tls12 ではなかった場合、以下のコマンドを実行して TLS 1.2 に設定し、正しく設定されたことを確認します。
> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
> [Net.ServicePointManager]::SecurityProtocol

4. 以下のコマンドを実行して、リポジトリの確認をします。
> Get-PSRepository

5. 項目 4 を実行した結果、PSGallery が設定されていない場合は、以下のコマンドを実行してリポジトリを設定します。
> Register-PSRepository -Default
> Get-PSRepository
【自分用メモ】Python3 + Django 学習メモ

# はじめに
Python3 + Djangoの自分用学習メモです。
殴り書きしています。
学習したら随時更新していく予定。

## 環境
mac
python 3.7.3
Django 3.1

## Pythonのインストール
mac の場合はプリインストールされている。特定のバージョンを使用したい場合は公式サイトからダウンロード
アナコンダ版があるため注意

## Djangoのインストール
```
sudo Pip3 install Django==3.1
=> OK

pip install Django==3.1
エラーになる

pip3 install Django==3.1
=> Permission エラーになる
sudo つける
```

## Project 作成
```
django-admin startproject プロジェクト名
```

## ローカルWEBサーバー起動
ローカルでテストする場合は内蔵のWEBサーバーを利用することが可能.
初期状態であれば http://localhost:8000/ で接続できればOK

```
python3 manage.py runserver
停止する時は control + c  
```

## アプリケーションを作る
```
python3 manage.py startapp アプリ名
```

to be continued……
Git clone から　pushまで

#Gitの使い方
**リモートリポジトリからclone→ローカルでブランチ作成→ファイル修正→リモートにpushまでの方法のまとめ**

**ディレクトリ作成**
 ```mkdir test```

**ディレクトリ移動**
 ```cd test```

**リポジトリからファイルをクローン**
 ```git clone URL(githubのリポジトリのURLを貼り付け）```

**ブランチ作成参考URL**
https://backlog.com/ja/git-tutorial/reference/branch/#section2

**現在のブランチを確認（ここからの操作はvscodeのターミナルでも可能）**
 ```git branch```

**ブランチの作成**
 ```git branch hoge(hoge部分は自分の作りたいブランチ名を設定）```


**ブランチの変更**
 ```git checkout hoge```

 **ここまで進んだらでファイルの編集を行う**


**編集が終わったらステージング**
 ```git add README.md(README.MDの部分はステージングしたいファイル名を記述）```
*※変更したファイルを全て選択する場合は「git add .」*

**ステージングした内容をコミット**
 ```git commit -m "add new file"```

**コミットした内容をpush**
 ```git push origin master(masterの部分はpushしたいブランチに変更する。今回であれば git push origin hoge)```

**以上でクローンからリモートへのプッシュまでが完了**
 
この後について
####プルリクエスト→マージの流れはターミナルではなく、github上でやればOK
Vue の transition で entering/leaving が非対称なトランジションを実装する

Vue には `v-if` などの条件付き描画を使ってコンポーネントを表示/非表示する際に CSS の transition や animation の動きを付与できる [transition ラッパーコンポーネント](https://jp.vuejs.org/v2/guide/transitions.html)というものがあります。今回は表示・非表示で非対称な動きをする Vue transition と CSS の実装についてメモします。

## 時間差でフェードイン、クリック時にフェードアウトするカード

次のようなカードの要素を作ってみます。なおカードの上にあるボタンは動作確認用のものなので、記事の本題とは関係ありません。

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="hamakou108" data-slug-hash="PoNjdQj" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="vue-transition-asynchronously-fade-in/out-1">
  <span>See the Pen <a href="https://codepen.io/hamakou108/pen/PoNjdQj">
  vue-transition-asynchronously-fade-in/out-1</a> by hamakou108 (<a href="https://codepen.io/hamakou108">@hamakou108</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

このカードは Vue インスタンスがマウントされてから3秒後に表示され、クリックするとフェードアウトします。

実装を見ると分かる通り、 enter-active-class と leave-active-class に別々の CSS を当てることで非対称なトランジション・アニメーションを実現しています。 leave-active-class の方は transition を利用していますが、トランジション完了時の opacity の値を leave-to-class に指定することでフェードアウトを実現できます。

## 時間差でフェードインした後に時間差でフェードアウトするカード

次に少しひねったパターンとして、フェードインしてしばらく時間が経つと勝手に消えるカードを作ってみます。
クリック時にフェードアウトする動作も残しておきます。

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="hamakou108" data-slug-hash="wvGeYKx" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="vue-transition-asynchronously-fade-in/out-2">
  <span>See the Pen <a href="https://codepen.io/hamakou108/pen/wvGeYKx">
  vue-transition-asynchronously-fade-in/out-2</a> by hamakou108 (<a href="https://codepen.io/hamakou108">@hamakou108</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

enter-active-class が利用する `@keyframes` を変更して自然にフェードアウトするようにしました。
ただ `@keyframes` の変更だけだと幾つか問題があります。

まず enter-active-class に指定したスタイルはアニメーション終了後に削除されます。
これにより、アニメーション終了後は `.card` に指定したスタイルがそのまま当たるため、 `visibility: visible; opacity: 1` となってフェードアウトさせたカードが再表示されてしまいます。
これを避けるため `.card` には `visibility: hidden; opacity: 0;` を設定しています。

さらにこの設定によって今度は leave-active-class のトランジションの初期状態が `visibility: hidden; opacity: 0;` となるため、クリック時はフェードアウトではなく瞬時に消えてしまうような動きになってしまいます。
これを避けるため `.fade-leave-active` には `visibility: visible; opacity: 1;` を指定して、表示された状態からトランジションが開始するようにしています。

## まとめ

Vue transition を使って非対称なトランジション・アニメーションを行う際、少しの動作の変更が細かな部分に影響してきます。
特に entering 終了後および leaving 開始前の状態がどうなっているべきかを考慮して CSS を当てていくことが重要になりそうです。
【Android】Retrofitについて

# 【Android】Retrofitについて

## Retrofitとは
Retrofitとは、Http通信をする際に使われるライブラリ。
webApiを叩くとかで、けっこう使うのでは

今回は、構成とかは考えず、とりあえず最低限の動くという状態でやってます。
叩くAPIは、[QiitaのWebApi](https://qiita.com/api/v2/docs)です。


## 目次
1. build.gradleとManifestへの記述
2. Interfaceの作成
3. レスポンスのmodel作成
4. 実行

## 1. build.gradleとManifestへの記述
- 依存関係の記述

``` build.gradle
    // retrofit
    implementation "com.squareup.retrofit2:retrofit:2.5.0"
    // 以下は、gsonというjsonをjavaで扱えるように変換してくれるライブラリ
    implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
```

- Manifestへの記述
  - 通信を許可するパーミッションを記述 

``` AndroidManifest.xml
    <uses-permission android:name="android.permission.INTERNET"/>
```

## 2. Interfaceの作成
- 

``` ApiService.kt
interface ApiService {
  // 記事をとってくるメソッドです。
  @GET("/api/v2/items") // => GETのリクエスト
  fun getArticle(): Call<List<Article>>
}

```

## 3. レスポンスのmodel作成
- 先ほど、Interfaceで定義したリクエストに対するレスポンスに対応するmodelクラスを作成します。

``` Article.kt
data class Article (
    val id: String,
    val title: String,
    val user: User
)

data class User (
    val id: String,
)
```

## 4. 実行
- 実行は、Activityで実行してます。

``` MainActivity.kt
class MainActivity : AppCompatActivity() {

    val TAG = "MainActivity"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        val retrofit = Retrofit.Builder()
            .baseUrl("https://qiita.com")
            .addConverterFactory(GsonConverterFactory.create()) // ここで、jsonをjavaで扱えるようにするGsonを使ってます。
            .build()

        // サービスを実行するクライアントの作成
        val articleClient = retrofit.create(ApiService::class.java)

        // 通信は非同期でやらないといけないので、今回はThreadで実行
         Thread().run {
           // とりあえず、レスポンスは返ってきます。あとは煮るなり焼くなり
           articleClient.getArticle()
         }
}

```
Angular ngForで配列要素の最初の１つだけを取得する方法

#ngForの最初の配列要素だけ取る

```typescript
*ngFor='let item of items | slice:start:end;'
```

このように`slice`を使う事でできました！

![スクリーンショット 2020-08-27 12.18.45.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/54419c1a-ce34-837b-5227-476430eb1261.jpeg)

`slice`を使う事で、自由に取得したい配列要素を指定できます。

```typescript
*ngFor='let item of items | slice:0:10;'
```

例えば、こうすれば10個だけ取得することができます！
【エラー】アソシエーション

特技はエラー生成・・・

アソシエーションの蓋を開けてみれば大したことのないエラーです。

![cba1fc592f3761b8133678864f62fa7b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696835/d3717f91-3ca8-125d-4d0e-44069e610699.png)

```
<% current_user.rooms.each do |room|>
```

userというテーブルとroomテーブル関係のアソシエーションを組んでいた記述で、roomsがないよと言われたんですが、どこを探しても間違っていないと思いきや、アソシエーションはやっぱりアソシエーションが原因でした。

/models/room.rb

```
has_many :room_users
has_many :users, through: :room_users
```
/models/user.rb

```
has_many :room_users
has_many :users, through: :room_users
```
ここで何が違ったのか全く気づけなかったのですが、アソシエーション指定がどちらもusersになっていました。

なので
/models/user.rb

```
has_many :room_users
has_many :rooms, through: :room_users
```

でOKです。
Arch Linuxにデスクトップ環境を導入する(LightDM+Xfce4)

この記事では, Arch Linux にディスプレイマネージャ LightDM と デスクトップ環境 Xfce4 を導入します.
可能な限りシンプルな手続きでデスクトップ環境を起動することを方針とします.

# はじめに

ディスプレイマネージャとデスクトップ環境の一般的な話と, 今回導入する LightDM, Xfce4 について触れておきます.



## ディスプレイマネージャ

ディスプレイマネージャは, グラフィカルなログイン画面を提供するアプリケーションです.
これを使わなくても, GUI環境にログインすることはできますが, ユーザ, デスクトップ環境の選択が直観的になります.
ディスプレイマネージャに関しては以下を参照のこと(他のディスプレイマネージャの候補の一覧も載っています):
<https://wiki.archlinux.org/index.php/Display_manager>

この記事では, ディスプレイマネージャとして LightDM をインストールします.
<https://wiki.archlinux.jp/index.php/LightDM>

## デスクトップ環境

Arch Linux はいくつかのデスクトップ環境をサポートしており, gnome や KDE plasma, xfce4 といった好みのデスクトップ環境を導入できます.
また, いくつかのディスプレイマネージャでは, 複数のデスクトップ環境をインストールするとログイン画面からインストールしたデスクトップ環境を選択することができ, 様々なデスクトップ環境を試すことができます.
サポートされるデスクトップ環境については以下を参照のこと(デスクトップ環境の比較もなされています):
<https://wiki.archlinux.org/index.php/Desktop_environment>

この記事では, デスクトップ環境としてXfce4をインストールします.
<https://wiki.archlinux.jp/index.php/Xfce>




# 前提となる環境

Arch Linux がインストールされており, ネットワーク接続の設定が完了していることを前提とします.
また, 一般ユーザの追加と `sudo` が設定済みであることを前提とした表記をします.
root ユーザで設定しても構いませんが非推奨です.

前回の記事 [Arch Linux インストールガイド(UEFIデスクトップ編) - Qiita](https://qiita.com/HayatoAoi/items/fd760f349c8cc71358a5) の続きと考えてもらっても構いません.

# 必要なパッケージのインストール

必要なパッケージをインストールします.
Arch Linux が提供する公式のパッケージのみで(すなわち, `pacman` のみを使って)構築することができます.
個々のパッケージをインストールする前にシステムをアップデートしておきます。

    $ sudo pacman -Syu


## X11 のインストール

X11 をインストール:

    $ sudo pacman -S xorg-server

`xorg-server` がないと, Xfce4はもちろんのことLightDMすら起動することができません.
なお, デスクトップ環境がインストールされていなくても LightDMのインストールと起動まではできますが, ログインができません.


## LightDM のインストール

LightDM のインストール:

    $ sudo pacman -S lightdm lightdm-gtk-greeter

LightDM の起動には, greeter が必要になります.
greeter には, いくつかの選択肢がありますが, デフォルトでは `lightdm-gtk-greeter` が設定されており, 
`lightdm-gtk-greeter` をインストールしておけば, 特別な設定なしでLightDMが起動します.




## Xfce4 のインストール

Xfce4をインストールします.
公式がサポートするデスクトップ環境には, `xfce4` の他に, `gnome`, `kde-plasma`, `mate`,  `lxqt` などがあります.
他のデスクトップ環境をインストールする場合, `xfce4` を好みのデスクトップ環境に変えてインストールしてください.

    $ sudo pacman -S xfce4




# LightDM サービスの起動

`systemctl` を使って LightDM サービスを有効化します:

    $ sudo systemctl enable lightdm.service

`.service` は省略可能です.

有効化したら再起動します.
再起動後にLightDM が起動しグラフィカルなログイン画面が表示されます.
適当なユーザでログインすると, インストールした Xfce4 が起動されるはずです.

`lightdm-gtk-greeter` を用いた場合, LightDM の右上にデスクトップ環境の選択メニューが表示されます.
複数のデスクトップ環境をインストールした場合は, ここでデスクトップ環境の選択が可能です.



# まとめ

LightDM を用いて, Arch Linux にグラフィカルなログイン画面とデスクトップ環境 Xfce4 を導入しました.
基本的には必要なパッケージをインストールし, LightDM のサービスを有効化するだけでGUI環境の導入が可能です.

LightDM だけでなく, `gdm`, `sddm`, `lxdm` など各デスクトップ環境が提供するディスプレイマネージャに関しても同様の手続きで起動することができます.適当なディスプレイマネージャをインストール後にサービスを有効化することで再起動時にグラフィカルなログイン画面を起動することができます.

LightDM の詳細な設定(greeter やテーマの設定, 仮想コンソールへのログインなど)に関しては, 別の機会に述べようと思います.
AtCoder Beginner Contest 177 問題C 間違った理由を調べてみた

#はじめに
2020/8/29に行われたContest177の問題Cで、絶望するほどハマったので、調べてみました。


#問題
https://atcoder.jp/contests/abc177/tasks/abc177_c

#考えたこと
まともに計算すると、多分TLEになると思った。
でもちょっと工夫すればなんとかなりそう。

しばし熟考。

求める和が、{(A1+A2+…＋An)^2-(A1^2+A2^2+…+An^2)}÷2 だという結論に達し、コード化。
およそ10分後、完成。

```python:c.py
n = int(input())
l = input()
a = l.split(' ')

tmp = 0
tmp2 = 0

for i in range(n):
    tmp += int(a[i])

for i in range(n):
    tmp2 += int(a[i])*int(a[i])

print(int((tmp*tmp-tmp2)/2)%1000000007)
```

よっしゃ、今日は調子ええで！４問いけるかもしれんな！
と思った矢先、無常の判定が。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284023/491cb3ad-d810-b798-2549-1804c2867ec4.png)
ここでフリーズしてしまい、この日は２問で終了。

#なんで

コンテスト終了後、解説を見る。わからない。なんで？累積和でもこの計算方法でも、数学的には同じ値になるはずやん。
土曜日はとにかく納得いかなかったので、寝て、心を落ち着かせ、
日曜日に累積和バージョンを書いて、提出してみた。

```python:c_.py
n = int(input())
l = input()
a = l.split(' ')

tmp = 0
total2 = 0

for i in range(n):
    tmp += int(a[i])

for i in range(n):
    total2 += int(a[i])*(tmp-int(a[i]))
    tmp -= int(a[i])

print(total2%1000000007)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284023/9e6aa26c-1652-9f4b-86a9-1383bbf85c55.png)

**えええええええええええええ**

なんで？なんで同じことをしているのに、片方はWAで片方はACなん？？？

#色々試してみた
まずpythonでint型の数字が、どれぐらい大きな数字を扱えるか確認した。
結果、pythonのver3では、メモリが許す限りいくらでも大きな値が使えるとのことだった。
とすると、おかしいのは÷2のところ？
きっと大きな数字の時に、変なことが起きているに違いない。

適当な大きさの数字を10個入力して、２で割る前の数字と２で割った時の数字を表示させてみた。

```:input_data1
10
1234567 2345678 3456789 4567890 5678901 6789012 7890123 8901234 9012345 1111111

2257615544087530
1128807772043765
```
これは大丈夫そう。もうちょっと大きくしてみる。

```:input_data2
10
12345678 23456789 34567890 45678901 56789012 67890123 78901234 89012345 90123456 11111111

225761590208477104
112880795104238560
```
１の位を見ると、２で割る前が４だから、２で割ったものは２か７になるはず。
なのに０。
ということで、大きな数字を２で割ると、どうもおかしな事が起こるらしい。

#どうして２で割れないの
「python 割り算 おかしい」でググったら、以下の記事を見つけました。

Python3で巨大な浮動小数計算の結果が変だったので理由を調べてみた
https://paiza.hatenablog.com/entry/2017/08/01/Python3%E3%81%A7%E5%B7%A8%E5%A4%A7%E3%81%AA%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E8%A8%88%E7%AE%97%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%8C%E5%A4%89%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%A7%E7%90%86

うーん、分かったような・・・でもやっぱり分からない。。。
ただ大きい数字は、割り算するとおかしな事が起こりうる、ということなんですね。
一つ賢くなりました。ありがとうございました。

・・・ああああ、悔しい。
サンプリング周波数の量子化ビット数のデータ量

応用情報技術者平成30年春期 午前問4

サンプリング周波数40kHz，量子化ビット数16ビットでA/D変換したモノラル音声の1秒間のデータ量は，何kバイトとなるか。ここで， 1kバイトは1,000バイトとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/d0ac69f4-74f9-c4e9-4932-cb886df55383.png)

１、サンプリング周波数とは、標本化において、1秒間にアナログ音声からデータを取得する回数を示します。また量子化ビット数は、量子化において、1回ごとの取得データを何ビットで表現するかを示します。

転換ロジックは、
・サンプリング周波数40kHzとは、
　1秒間に40,000回データを取得する

・量子化ビット数16ビットとは、
　各々のサンプリングデータを16ビットで表現する

・1秒間のデータ量は「サンプリング回数×量子化ビット数」で求められるので、
　40,000回×16ビット＝640,000ビット＝640kビット＝80Kバイト


２、アナログデータからディジタルデータへの変換では、標本化、量子化、符号化の3段階の処理を行います。
・標本化
　時間的に連続したアナログ信号(振幅、周波数、電圧など)を一定の時間間隔で測定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/eee6fc7a-fa85-5ee9-4e9d-a856f7f2fde1.png)

・量子化
　標本化で得られた数値を整数などの離散値で近似する


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/6a8b359c-d984-eb14-2007-5eed49add5ce.png)


・符号化
　量子化した整数値を2進数のビットに対応付ける



参照：
https://www.ap-siken.com/kakomon/23_aki/q4.html

サンプリング周波数と量子化ビット数）
http://www.kuma-de.com/blog/2008-09-12/100
【エラー】localhostに接続できなかったサーバーの重複

特技はエラー生成・・・

localhost:3000にアクセスしたら急に読み込みが止まったままになってしまい、ターミナルを確認したところ
こんなような記述が（他略）

```
Address already in use - bind(2) for "127.0.0.1" port 3000 (Errno::EADDRINUSE)
```
原因は、ローカルサーバー（rails s）を切らずに(control cをせずに)ターミナルのタブを消してしまっていたので接続が重複して飽和状態になっていたとのこと

lsof -i :3000
を入力してポート接続を確認→PIDの番号を確認

```
kill -QUIT <PIDの番号>
```
で、ポートを空けてあげると直りました。

こちらの記事を参考にしました
https://qiita.com/nagao_norihiro/items/aba40bd4e0eac9f9a92d#comments
定額課金時の決済代行サービスを比較

定額課金時のクレジットカードの決済代行サービスを検討しました。

- 基本情報（名前、住所、利用サイト、特定商取引法に基づく表記のページ）
- 振込先口座



## 前提

Paypalは、[製品名：ウェブペイメントプラス](https://www.paypal.com/jp/webapps/mpp/developer/wpp)を対象としています。

> ペイパル決済に加えて、ペイパルアカウントをお持ちでない方も、VISA・MasterCard・JCBによる決済を受付けることができます。

Pay.jpはベーシックプランとプロプランがあります。

> プロプラン：月額費用1万円で手数料が安く、入金サイクルが早くなるプラン
クレジットカード決済額が月額250万円を超える方におすすめ

## サービス比較表

|   |Stripe  |Pay.jp（ベーシック）  |Pay.jp（プロ）  |PayPal  |
|---|---|---|---|---|
|月額利用料金 |0円  |0円  |10,000円  |3,000円  |
|固定手数料  |3.6%  |3.0, 3.6%  |2.59%, 3.3%  |2,9%〜3.6%  |
|都度手数料  |0円  |0円  |0円  |40円  |
|対応カード  |全て  |全て  |全て  |Visa/MasterCard/JCB  |
|その他の支払いサービス  |ApplePay/GooglePay  |ApplePay  |ApplePay  |なし  |
|定期課金の仕組み  |あり  |あり  |あり  |なし（cronを使って実装可能） |
|定期課金の手数料  |0.5%  |なし  |なし  |- |
|定期課金の頻度設定  |1ヶ月/四半期/1年 |1ヶ月/1年  |1ヶ月/1年 |cronを使って実装 |
|定期課金に独自頻度を設定したい場合  |Customerを使用してcron  |Customerを使用してcron  |Customerを使用してcron  |cronを使って実装 |
|ドキュメント  | [Documentation](https://stripe.com/docs) | [PAY.JP API 利用ガイド](https://pay.jp/docs/started) | [PAY.JP API 利用ガイド](https://pay.jp/docs/started)  |[ウェブペイメントプラスインテグレーションガイド](https://www.paypalobjects.com/webstatic/ja_JP/developer/docs/pdf/paymentsplus_jp.pdf)  |

## まとめ

定額課金において、PayPalの[ウェブペイメントプラス](https://www.paypal.com/jp/webapps/mpp/developer/wpp)を選定するメリットはない。
Pay.jpとStripeで気になる点は手数料、管理画面、API、ドキュメントの違い。
開発者視点で選ぶならAPIや管理画面の充実したStripe。
固定手数料を少しでも安くしたいならPay.jp。

## 参考

- [3ヶ月に1回などの間隔での課金は可能ですか？ \| PAY.JP ヘルプ](https://help.pay.jp/ja/articles/3438162-3%E3%83%B6%E6%9C%88%E3%81%AB1%E5%9B%9E%E3%81%AA%E3%81%A9%E3%81%AE%E9%96%93%E9%9A%94%E3%81%A7%E3%81%AE%E8%AA%B2%E9%87%91%E3%81%AF%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%81%8B)
- [ストライプカードトークンの有効期間はどれくらいですか?](https://www.366service.com/jp/qa/9a076b26001623bdb8b15cb4d532258f)
- [Stripe API recurring payments with Php - Stack Overflow](https://stackoverflow.com/questions/38574674/stripe-api-recurring-payments-with-php)
- [javascript - Stripe: How to set up recurring payments without plan? - Stack Overflow](https://stackoverflow.com/questions/26803973/stripe-how-to-set-up-recurring-payments-without-plan)
- [Stripe Billing 101 - Qiita](https://qiita.com/y_toku/items/235b5e7ee00792edcbbf)