OmniAICreator/Qiita-1.07M huggingface dataset:
生態学と拡散　築地書店　大久保昭先生

```{r}

#p.100 6.3 魚や鳥の回帰移動モデル

t=c(1,2,3,4,5,6,7,8,9)


x=c(8,4,7,6,5,3,5,2,1)

N=10

loglik=function(X,D){
  
return(sum(-log(4*pi*D*t)/2+log(exp(-(x-X)^2/(4*D*t))-exp(-(x+X)^2/(4*D*t)))))  
  
}

ite=1000

eta=0.01

h=0.01

X=1;D=1

for(l in 1:ite){
  
X=X+eta*(loglik(X+h,D)-loglik(X,D))/h

D=D+eta*(loglik(X,D+h)-loglik(X,D))/h

print(loglik(X,D))
  
}


#帰巣するフラックス

func=function(time){return(N*X*exp(-X^2/(4*D*time))/(2*time*sqrt(pi*D*time)))}

func(t) #xと比較

#時刻Hまでに帰巣する個体数

#シンプソンの第一公式による積分値の計算(一変数関数の積分)


#a:積分区間の始点、a+H:積分区間の終点、n:積分区間の分割数
a=0.01;H=20;n=100000

#重合公式の計算
Y=(H/3)*(1/(n-1))*(func(a)+func(a+H));

for(j in 1:(n-2)){

  #奇数番目は4、偶数番目は2になる係数
  coefficient=ifelse(j-floor(j/2)*2==0,4,2)

  Y=Y+((H*coefficient)/(3*(n-1)))*func(a+(j*H)/(n-1))

}

#simpson積分値
print(Y)

#ライブラリによる計算
integrate(func,a,a+H)

#平均帰巣速度

v=function(time){
  
return((2*D)*(1+N*X*exp(-X^2/(4*D*time))/(sqrt(pi*D*time)*integrate(func,0,time)$value))/X)  
  
}

v(3)


```

```{r}


#p.98 

t=c(1,2,3,4,5,6,7,8,9)

x=c(8,4,7,6,5,3,5,2,1)

mat=(t(t(rpois(9,4)))%*%t(rpois(9,8)))

rownames(mat)=paste0("t:",t);colnames(mat)=paste0("x:",x)

t_vec=matrix(rep(t,9),ncol=9)

x_vec=matrix(rep(x,9),ncol=9)

N=100

#p.164 Gauss法

Y=c(mat)

f=function(x){
  
D=x[1];mu=x[2]  

return(N*exp(-c(x_vec)^2/c(4*D*t_vec)-mu*c(t_vec))/sqrt(4*pi*D*c(t_vec)))

}


h=0.001

ite=10^3

sita=rep(0.1,2)

eta=10^(-2)

for(l in 1:ite){

sita_pre=sita

Z=array(0,dim=c(length(Y),length(sita)))

vec=sita

for(j in 1:ncol(Z)){

vec_sub=vec;vec_sub[j]=vec_sub[j]+h

Z_sub=(f(vec_sub)-f(vec))/h

Z[,j]=Z_sub

}

beta=solve(t(Z)%*%Z)%*%t(Z)%*%(Y-f(sita))

sita=c(sita+eta*beta)

print(sum(abs(sita_pre-sita)))

}







```

```{r}

#7.5　群れの分裂と合併　p.120

n=10

N=rep(100,n)

k=sample(10:90,n,replace=T)

lam=5;mu=5


loglik=function(x,y){

a=x/y

return(sum(log(dbinom(k-1,N-1,(a)/(1+a)))))

}


ite=10^3

eta=0.001

h=0.001

for(l in 1:ite){

lam=lam+eta*(loglik(lam+h,mu)-loglik(lam,mu))/h

mu=mu+eta*(loglik(lam,mu+h)-loglik(lam,mu))/h

print(loglik(lam,mu))

}



```
lwc中js打开一个新的lightningpage

       


 let SW = screen.availWidth;
        let SH = screen.availHeight;
        let SX = (SW - 1000)/2;
        let SY = (SH - 1000)/2;
        let W = 800;
        let H = 750;
let win = window.open('你的domain或者community的前缀'+target+'?object='+你的object名,'OpenWin','left='+SX+',top='+SY+',Width='+W+',height='+H+',resizable=no,scrollbars=yes,status=no,toolbar=no,menubar=no,location=no');
Power BI データセットをデータソースにするピボットテーブルが Excel Online でも更新できるようになったので。

タイトル通りである。これまでよりもうちょっと使えるようになったかなと。で、データモデルの作りこみについて再考があるとよいねと思うのです。

# ピボットテーブルの更新が Excel Online でも可能になった
例えば、Microsoft 365 Apps for business の Excel で作成した ピボットテーブルを利用したレポートや

https://support.microsoft.com/en-us/office/create-a-pivottable-from-power-bi-datasets-31444a04-9c38-4dd7-9a45-22848c666884

Power BI service から出力した Analyze in Excel の レポートを

https://docs.microsoft.com/en-us/power-bi/collaborate-share/service-analyze-in-excel

OneDrive for Business もしくは、SharePoint Online ドキュメント ライブラリに配置し、Excel Online でレポートを利用するとき、ピボットテーブルの更新ができるようになったという話。

これまででも、表示だけならできていたんだけどね。更新しようとすると失敗していたわけだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/116b31c5-f59e-3ff8-1abe-94e3489d075e.png)
SharePoint Server で外部データ接続を用意するとかそんなことしたことあったかなぁと懐かしんでみたりするけれども、Power BI といえども外部データ接続になるので仕方がないねと。
で、Power BI serviceへの接続をサポートしますよとこの春くらいに発表されていて、使っているテナントに展開されたのだ。

# Power Pivot for Excel を使う理由がひとつ減った
これまでどうしていたのかというと、Excel Online 上での操作ができるように Power Pivot for Excel を使ってレポートを作成し共有をしていたのである。また、OneDrive for Business もしくは SharePoint Online ドキュメント ライブラリに配置した Excel モデルありのレポートは Power BI service に接続させ Excel モデルのスケジュール更新することが可能でもある。
とはいえ、モデルサイズが大きくなると Excel Online で表示すらできなくなったしまうはずだから、そこそこ気を遣うのであった。

私の場合、Power Pivot for Excel を使う理由がほぼなくなった。
# モデリングを再考しよう
Power BI だけじゃなく、Excel ベースのレポートにも不具合なく利用できるデータモデルを考え直す。

## ベストプラクティス通りに

- メジャーを必ず定義
- レポートで使用しない列 / テーブルは必ず非表示
- 日付テーブルは必ず定義

暗黙のメジャーは利用できないからメジャーの定義は必須だし、Power BI Desktop が用意してくれる 自動の日付テーブルは利用できないのだ。当然レポートに使用しない列/テーブルは非表示である。
再考しようとしたものの、Power BI データモデルに関するベストプラクティスそのままであるね。

## せっかくなのでもう少し
**Perspective を使うとよいかもね**

https://docs.microsoft.com/en-us/power-bi/create-reports/power-bi-personalize-visuals

このドキュメントは、レポートユーザによるビジュアルのカスタマイズについてだけど、設定する Perspective を Excel ベースのレポート用に準備して使うとよいのではなかろうか。Power BI レポートでのみ使用する列/テーブルを除外したPerspectiveを使う感じ。

Excel でレポートを作成 もしくは、Analyze in Excel でレポートを用意して Connection のプロパティで使用する Perspective を選択するとよい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/29c5f714-36c5-c864-df29-c30fb21824ab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/193715f9-4b28-6734-9798-e398f9b99876.png)


**もっともっと(IsAvailableInMdx)**
大きいデータセットのパフォーマンス最適化のため、ファクトテーブルの属性値を表す列について調整することがある。

https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.analysisservices.tabular.column.isavailableinmdx

MDX ツールとは、ここでいうところの Excel ピボットテーブルを指し、このプロパティが false のとき、ピボットテーブルのデザイナに表示されなくなる。
Power BI は MDX を利用せず DAX ネイティブであるから影響を受けることはないし、メジャーを定義しなければならないから、不要なメモリ消費も避けたいのである。

# 思ったこと🙄
レポートを共有するのではなく、データセットを共有するのだ。さすれば、マネージド セルフサービス BI に一歩前進ってことよね。
# その他
https://powerbi.connpass.com/

http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981

http://qiita.com/PowerBIxyz/items/52e563037b855a099ca9

- [Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
- [Power BI Desktop を使い始めるには](http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981)
- [Excel で Power Query を使い始めるには](http://qiita.com/PowerBIxyz/items/52e563037b855a099ca9)
【備忘録】【エラー解決】cannot load such file -- rexml/document (LoadError)

```ruby:
$ docker-compose exec app bin/rspec
```

を実行すると下記のようなエラーが返ってきました。

```ruby:返ってきたエラー
/usr/local/bundle/gems/bootsnap-1.7.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:34:in `require': cannot load such file -- rexml/document (LoadError)
```


```
gem 'rexml', '~> 3.2', '>= 3.2.4'
```

こちらをGemfileに追加したところ、解決しました！



▼参考記事①▼

https://stackoverflow.com/questions/65479863/rails-6-1-ruby-3-0-0-tests-error-as-they-cannot-load-rexml

▼参考記事②▼

https://github.com/CocoaPods/CocoaPods/issues/10388
props宣言とtypeの型定義を使わずに関数コンポーネントの引数の型を指定する(TypeScript)

# 構文

({変数名}:{変数名:型})=>{}

# 例

``` tsx
const App = ({ message }: { message: string }) => <div>{message}</div>;
```

# 利点

- props宣言とtypeの型定義を使う必要がない

# 欠点

- 変数名を2回タイプする必要がある

# 引用文献

- [GitHub - typescript-cheatsheets/react: Cheatsheets for experienced React developers getting started with TypeScript](https://github.com/typescript-cheatsheets/react#function-components)
GIFアニメを見て覚えるNotionのショートカット


# 経緯

- 画面共有しているNotionのメモで、議事録を取る機会がありそうなので、高速に操作できるようにしておく
- 数あるショートカットの中で、使用頻度の高そうなショートカットをまとめた自分用のメモ

# 環境

- macOS
- 英字キーボード
- Notion ウェブブラウザ版

# ナビゲーション（ページの移動）

- 思わずページのリンクをクリックしてしまい、意図せずにページを移動してしまうことがある
- パンくずから戻ることができるが、
- 「戻る」、「進む」、「一覧からページ選択」のキー操作を覚えておくと便利

|  キー  |  動作  |
| ---- | ---- |
|  Cmd + [  |  戻る  |
|  Cmd + ]  |  進む  |
|  Cmd + P  |  最近開いたページ、検索  |

![nav.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/96fc3dcf-6e61-2373-49c8-6d62d5a73669.gif)



# マークダウン

## 見出し設定

|  入力文字列  |  動作  |
| ---- | ---- |
|  `# `  |  見出しレベル１ |
|  `## `  |  見出しレベル２ |
|  `### `  |  見出しレベル３ |

- 「見出し１」のところで、`### `と入力すれば、見出し３に変更できる
- Command + Opt + 1 などで「見出し１」にできる（マークダウンではなくキー操作）
  - 数字に様々な操作が割り当てられているが、4以降は直観的ではない

![heading.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/baf082a1-ed88-2f41-5f17-d9adb8d2450e.gif)



## リスト

|  入力文字列  |  動作  |
| ---- | ---- |
|  `- `  |  番号なしリスト |
|  `* `  |  番号なしリスト |
|  `+ `  |  番号なしリスト |
|  `1. `  |  番号付きリスト |


![bulletlist.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/a84a5024-0234-b542-2b77-84c52d7ca311.gif)

![numbered.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/6f6debed-cf2c-4816-fe5c-9109543bdad9.gif)

## チェックボックスとトグル表示

|  入力文字列  |  動作  |
| ---- | ---- |
|  `[]`  |  チェックボックス |
|  `> `  |  トグル |

- `Command + Enter` でチェックのOn/Offができる（便利！）
- `Command + Enter` でトグルの開閉ができる 
- トグルを作成後、トグルを開いて、エンターを押すと、中身の編集ができる（キーボード操作だけでできる）
  - トグルを開いた後、矢印キーの下だと中身の編集にならないので注意


![check.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/2614ac44-82f6-482c-26d6-c314217a84c0.gif)



![toggle.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/76d2005f-6ff8-77cd-74c4-0c6d97dd24af.gif)

## ボールド（太字）

|  入力文字列  |  動作  |
| ---- | ---- |
|  `**bold**`  |  太字  |

![bold.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/c6d2bf96-66c1-efde-c387-4895f5d59d2c.gif)

## イタリック（斜体）

|  入力文字列  |  動作  |
| ---- | ---- |
|  `*Italicize*`  |  斜体  |

![italicize.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/cb303f28-8120-ada9-ef01-594f27ad40a1.gif)



## その他（インライン、取り消し線、引用）

|  入力文字列  |  動作  |
| ---- | ---- |
|  \`inline\`  |  インライン |
|  ~strikethrough~  |  取り消し線 |
|  `" `  |  引用 |


![inline.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/8084cb3c-21f8-7aa9-3026-6209f63b8d5c.gif)

![strike.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/24b8c1d2-9534-dbb2-d549-63c82b41c119.gif)


![quote.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/e2b92f6d-836d-f28c-849f-aa25e018fa59.gif)


# Slashコマンド

- 操作を忘れたらスラッシュを押せばよさそう

![slash.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/6fe0ce53-333b-6b12-077a-13e419f06a29.gif)

# 参考

https://www.notion.so/0d2e6e88fc804dbf8f307191de8ca005
疑似要素のbeforeとafterの使用方法について簡単にまとめてみた[CSS]

###擬似要素とは
要素の一部に対してスタイルを適用できる指定方法です。
HTMLの要素を擬似的にCSSで設定するので、HTMLのコードを汚すことなく装飾を適用することができます。
なお、検索エンジンはCSSである疑似要素をコンテンツの中身として見ていないため、SEOを気にせず表現できます。
擬似要素には、**::before**と**::after**があります。
他にもありますが、今回はこの２つを紹介していきます！！！

#「::before」「::after」
###[書き方] 
タグ名やクラス名、id名などの後に::beforeや::afterをつけます。
その後にプロパティと値を記述します。

````CSS
.right::before{
  content: '『';
  color: blue;
}

.right::after{
  content: '』';
  color: blue;
}
````

###[beforeとafterの違い]
**::before**
要素の直前に内容を追加。

**::after**
要素の直後に内容を追加。


###[注意点]
**content: ‘’プロパティの使用。**
‘’の中には挿入したい文字や画像などを入れます。
contentは空でもOKです！ただし、content:''の指定を忘れると、疑似要素が全く表示されなくなるので注意して下さい！
rails g modelをしたら「FATAL: Listen error...」が出たので、その時の対処法

今回初投稿という事もあり、色々と不慣れで見にくいとは思いますが、暖かい目で見てください。

タイトル通り、今回rails g modelをした所「FATAL: Listen error: unable to monitor directories for changes.」というエラーが発生したため備忘録として残します。

#現在のrails環境のバージョン
Ruby on Rails バージョン: 6.1.4
vagrant 2.2.17

```ruby:エラーした時の状況
$ rails g model Hogehoge hoge:hoge hoge:hoge
```
をした所

```ruby:エラー文
FATAL: Listen error: unable to monitor directories for changes.
Visit https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers for info on how to fix this.
```
というのが発生しました。

google先生で訳し、簡潔で言うと
・ディレクトリの変更を監視することができません。
・なので記載した、サイトにアクセスして、このエラーを修正してください。
　　→https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers

このサイトにアクセスしてコマンドを実行すれば、大丈夫です。

#エラーの原因
エラーが出た際、調べたところ「　1つの実ユーザIDに対して生成できるinotifyのインスタンスの数の上限が決まっており、その上限に達してしまった為　」だそうです。

※inotifyとはLinuxファイルやディレクトリのイベントを監視する機能です。

1つの実ユーザIDに対して生成できる最大ユーザインスタンスを確認してみましょう。

```ruby:ユーザインスタンスを確認
$ cat /proc/sys/fs/inotify/max_user_instances
1024
```
というのが出てきます。

#inotifyのインスタンス上限を変更
原因が分かったので、inotifyのインスタンスの上限を変更しましょう。

１. inotifyインスタンスの数の上限を524288に変更します。
　2. /etc/sysctl.confにその設定を追記します。
　　※　「/etc/sysctl.conf」とは、カーネルパラメータを記述する設定ファイルのことです。

```ruby:/etc/sysctl.confに追記
$ echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
```

#パラメータの設定を反映
1.「sysctl」コマンドというのを使い、先ほど追記したパラメータを読み込みます。
 ※1.　sysctlとは、ディレクトリ /proc/sys/配下のファイルに書かれたカーネルパラメータを修正するのに利用します。
※2. オプションで特定のファイルを指定しない場合は、「-p」を使い/etc/sysctl.confを読み込みます。

```ruby:カーネルパラメータを変更
$ sudo sysctl -p
```
#modelを作り直してみよう
```ruby:先程のmodelを作成
$ rails g model Hogehoge hoge:hoge hoge:hoge
```
```ruby:vagrant
Running via Spring preloader in process 2877
      invoke  active_record
      create    db/migrate/20210714052813_create_hoge.rb
      create    app/models/hoge.rb
      invoke    test_unit
      create      test/models/hoge_test.rb
      create      test/fixtures/hoge.yml
```
できました！

#まとめ
notifyのインスタンスの数の上限に達してしまったことにより、modelが作れなくなるエラーの解決を残しました。
初投稿なので見づらいかも知れませんが、暖かい目で見てください。
Node.js Express 

#【Node.js Express 】

Node.jsは、サーバーサイドとクライアントサイドの両方のプログラミングができる。
特徴は、**イベントループ**と**ノンブロッキングI/O**

##Express

**Express**：Node.jsのフレームワーク
　→ Webアプリケーションを開発するための機能を提供する。
→ 便利な機能をまとめたパッケージの1つ

このパッケージを用意するために、
**npm（Node Package Manager）**システムを使う
これには、パッケージを共有、取得する機能がある。

###インターネットから自分の環境にパッケージをインストール

```
$ npm install express
```

###インストールしたExpressを利用

パッケージの読み込み、使用するための準備が必要

```
const express = require('express');
const app = express();
```

###listenメソッド 実行

listenメソッドを用意して、.jsファイルを実行し、サーバーを起動することができる。

```
app/listen(3000);
```

ターミナルで、「node ファイル名.js」実行

```
node ファイル名.js
```

##今後

追記予定
やむを得ずAmazon Linux2×Python2

# Dockerfile
amazonlinuxのversionは「2.0.20210617.0」

```
FROM amazonlinux:2

RUN curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
RUN python2 get-pip.py
```

python2・・・元々amazonlinux:2にインストール済み
pip2・・・上記で使えるようになる
【論文要約】TextAttack: A Framework for Adversarial Attacks, Data Augmentation, and Adversarial Training in NLP [Morris+, 2020]

## はじめに
BERTのような予測精度の高い自然言語モデルであっても、入力する文の言い回しが少し変わるだけで、モデルの予測が変化してしまうことがあります。このような事例を**敵対的サンプル**と呼び、敵対的サンプルをもとにモデルの予測を変化させることを**敵対的攻撃**といいます。また、敵対的攻撃に対してモデルを頑健にする学習方法を**敵対的学習**と呼びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/37a37505-3a3d-d998-bc9d-dd0d959e1fe0.png)

## 要約

[TextAttack](https://arxiv.org/abs/2005.05909)では、**16個**の敵対的攻撃と敵対的学習手法をまとめて、`textattack`というPythonのライブラリにしています。

https://github.com/QData/TextAttack

使い方や仕組みについては、[こちらのqiitaの記事](https://qiita.com/dai335estl/items/1cf8e066869c0cc9ccb7)に詳しくまとめられています。

### 敵対的サンプルの発見
次のように敵対的サンプルを見つけてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/d8c961c2-9da4-d10c-159d-a794da5de034.png)

### データ拡張
敵対的サンプルとは限らないけど単語を類義語に変換するデータ拡張を行います。前述の[qiita記事](https://qiita.com/dai335estl/items/1cf8e066869c0cc9ccb7)の実験設定では、頑健性が向上しなかったそうです。

### 敵対的学習
敵対的サンプルを訓練データに加えます。多くの論文で、この方法で頑健性が向上したそうです。画像の敵対的学習も画像にランダムノイズを加えるのではなく、敵対的サンプルを訓練データに追加する方法を取っているので、データ拡張よりも頑健性が向上することは納得できますが、画像とテキストは違うのでなんとも言えません。


## 結果

行名は敵対的学習、列名は敵対的攻撃の種類です。
例えばtextfoolerで敵対的学習を行ったモデルに対して、pruthiという敵対的攻撃を行った場合、テストデータ全体のうち、敵対的攻撃に失敗した割合が52.60%となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/260bdea5-484b-7d5e-8680-3a7cc22fc452.png)

## おわりに
TextAttackはサクッと自然言語モデルの敵対的サンプルを探せるライブラリなので、非常に便利です。
Dockerの概要と利点


プログラミング(PHP、Laravel)を独学で学習中。
XAMPPを使って学習を進めていましたが、環境構築にはDockerを使ったほうが良いと聞いたので簡単に概要とメリットをまとめてみました。
##Dockerについて
コンテナ型仮想化技術である(？)
コンテナ：独立した仮想空間。複数のコンテナを同時に立てることができるが、お互いにアクセスできないようになっている。

OS、ライブラリ、アプリケーションがパッケージ化されていて、
さらに本番環境でも使える。

##dockerのメリット
・開発環境を簡単に用意できる。公式ドキュメントやGitHubでもDockerイメージの紹介や共有が行われており、開発者は求める環境に近いDockerイメージをダウンロードするだけで望む環境を構築できる。

・メンバー間の開発環境を統一できる。同じDockerイメージをダウンロードするだけで良い。

・テスト環境や本番環境を統一できる。同様の手順を踏めば、環境差異が極めて少ない状態で開発を行うことができる。
スイフト勉強_ユーザー定義演算子

スイフトでは、プログラマの好みに合うように演算子の役割を与えることができる。
従来存在しなかった記号を作って追加することも可能である。
これらをまとめてユーザ定義演算子と呼ぶ。
但し、=と?:はユーザ定義役割付与が不可能である。

> 既存の演算子の役割を変更し、新しい役割を追加するためには
既存の演算子が前衛（！A）なのか、中位（A+B）なのか、後衛（B？）なのかを知らなければならない。

* operator : 演算子
* 前衛演算子 : prefix 
* 中衛演算子 : infix
* 後衛演算子 : postfix
* associativity : 結合方向
* precedence : 優先順位



> ユーザ定義演算子はアスキー文字を結合して使用する。

```
/ = - + ! * % < > & | ^ ? ~
```
> また、..をユーザ定義演算子に使用可能である。
ただし、注意すべき点としては、「.」は一番前に使われてこそ演算子と認識する。

```
.+. O

+.+ -> + と.+で認識
```
> ？も含まれるが、それだけでは定義できない。
！も同じ条件で表現できる。ただし、前衛演算子は？や！で始まるユーザ定義演算子の使用が不可能である。

###電位演算子の定義と実装
1. 従来にはなかった前衛演算子を作りたい場合は演算子の定義を先にする必要がある。

2. 上記のように演算子定義を行った後、どのようなデータタイプにどのような動作をするのか関数を実装しなければならない。
前衛演算子関数を実装する際には、関数func キーワードの前にprefix キーワードを追加しなければならない。

3. 既に存在する電位演算子に機能を追加するときは、別途演算子定義をする必要はなく、重複定義すればよい。

```swift
prefix operator **

prefix func ** (value: Int) -> Int {
	return value * value
}

let a = 5;
let b = **a;
print(b) // 25

prefix func ** (value: String) -> String {
	return value+" "+value
}

let a = "a"
let b = **a
print(b) // a a
```

###後衛演算子の定義と実装
前衛演算子を定義し実装したものと変わらない。
ただし、prefixの代わりにpostfixを書けばいい。

```swift
postfix operator **
postfix func ** (value: Int) -> Int {
	return value * value
}

let a = 5;
let b = a**;
print(b) // 25
```

* 一つの被演算子に前衛演算子と後衛演算子を一行に使用すると、後衛演算子を先に演算する。

```swift
prefix operator **
prefix func ** (value: Int) -> Int {
	return value * value
}
postfix operator **
postfix func ** (value: Int) -> Int {
	return value + 3
}

let a = 5;
let b = **a**;
print(b) // 64 (8*8)
```

###中位演算子の定義と実装
* 中位演算子も同様に変わらないが、優先順位グループを明記することができる。
* 演算子優先順位グループは中位演算子にのみ使用される。 前衛演算子、後衛演算子は、結合方向及び優先順位を指定しない。
* 中位演算子を定義する際、優先順位グループを明示しないと、優先順位が最も高いdefault Precedenceグループを優先順位グループとして持つことになる。

実装する際、関数の前にinfix を別途追加しない。

```swift
import Foundation

infix operator ** : MultiplicationPrecedence

func ** (value1 : String, value2: String) -> Bool {
	return value1.contains(value2)
}

let a = "a"
let abc = "abc"
let check = abc ** a 
print(check) // true
```
Railsのenumを使ってみた

# はじめに
Railsを触っていてenumって何ってなった背景からこの記事を書いています。
間違っている点等あればご指摘いただけると助かります！

# enumとは?
enumは[列挙型]と言われるもので[列挙型]とは何かというと、プログラミング言語やデータベース管理システムなどにおけるデータ型の一つとされています。また複数の異なる定数を一つの集合として定義するものでもあります。

# どんな時にenumを使うべきか？
ここはあくまで個人的な見解なのですが状態が変化するようなものを判定させたい時などが一番使い道があるのかなと考えています。

(例)どのようなものに使うか

- 頻繁に値が更新されるような物
    - 外部から取得するようなデータなど

上記のようなものに使うと状態が変更された時に判定しやすくなるので使い勝手が良いのかなと一個人として思います。

# 参考文献
https://qiita.com/ozackiee/items/17b91e26fad58e147f2e
iOSアプリで AdMob テスト広告が表示できるまで

#iOSアプリでAdMobテスト広告が表示できるまで

##はじめに
iOSのアプリがリリースできたので、どうせなら広告でも載せようかと思い、色々調べつつやってみて、なんとかできたので、備忘録として記録します。

##前提条件

- Xcode 12.5.1
- Swift 5.4.2
- iOS 14.6
- M1 Mac mini

##手順

1. CocoaPods導入
2. AdMob申し込み
3. 支払い情報登録
4. アプリ登録
5. 広告ユニット（バナー）作成
6. CocoapodsによってプロジェクトにMobileAdsSDK導入
7. Info.plistにkey追加
8. 広告表示するView作成
9. アプリにView組み込み

##1. CocoaPods導入

ターミナルで、sudo gem install cocoapods する。→ 問題なし

##2〜5. Admob申し込みから広告ユニット作成まで

難しいところはないけれど、１つだけ引っかかったのが、「支払い情報登録」のところ。
単純にSafariだとダメでChromeだと問題なし。

##6. CocoapodsによってプロジェクトにMobileAdsSDK導入

ターミナルでプロジェクトの.xcodeprojがあるフォルダにcdする
pod init
Podfileが作られるので、編集
pod 'Google-Mobile-Ads-SDK'の１行を追加
pod install --repo-update を実行するのだが、M1 Macだとエラー発生
なので、ターミナルを右クリック→情報を見る→Rosettaを使用して開く
sudo gem install ffi（これは本当に必要だったのかは不明）
再度pod install --repo-updateを実行して正常終了。
.xcworkspaceを開く
ワーニングが出るので、言われるままに自動修正

## 7. Info.plistにkey追加

Info.plistを右クリック→Open As→Source Code
以下のkeyを追加
```html:Info.plist
    <key>GADApplicationIdentifier</key>
    <string>ca-app-pub-3940256099942544~1458002511</string>
    <key>SKAdNetworkItems</key>
      <array>
        <dict>
          <key>SKAdNetworkIdentifier</key>
          <string>cstr6suwn9.skadnetwork</string>
        </dict>
        <dict>
          <key>SKAdNetworkIdentifier</key>
          <string>p78axxw29g.skadnetwork</string>
        </dict>
      </array>
    <key>GADIsAdManagerApp</key>
    <true/>
```

##8. 広告表示するView作成

```swift:AdmobBannerViewController.swift
import SwiftUI
import UIKit
import Foundation
import GoogleMobileAds

struct AdmobBannerViewController : UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> some UIViewController {
        let view = GADBannerView(adSize: kGADAdSizeBanner)
        let viewController = UIViewController()
        view.adUnitID = "ca-app-pub-3940256099942544/2934735716"
        view.rootViewController = viewController
        view.load(GADRequest())
        viewController.view.addSubview(view)
        viewController.view.frame = CGRect(origin: .zero, size: kGADAdSizeBanner.size)
        return viewController
    }
    
    func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {}
}
```

ちなみに、最初、import GoogleMobileAdsと記述しようとしたら、GoogleUtilitiesしか出てこなくてエラーになった。
もしやと思って、一度実行してみたらGoogleMobileAdsが選択できるようになった。
まあ、CoreDataのEntityを追加しても、一度実行しないと認識されないという経験に基づきました、と。

```swift:AdmobBannerView.swift
import SwiftUI

struct AdmobBannerView: View {
    var body: some View {
        HStack {
            AdmobBannerViewController().frame(width: 320, height: 50)
        }
    }
}

struct AdmobBannerView_Previews: PreviewProvider {
    static var previews: some View {
        AdmobBannerView()
    }
}

```

##9. アプリにView組み込み

ウザくない所に組み込みましょう。

ということで、以上、めでたし、めでたし。
Apacheサーバーから複数アプリを振り分ける

Every Qiita #12
のんびり独学初学者の毎日投稿チャレンジ 12日目
今回は・・・
VirtualBoxで1つのwebサーバーでポート番号ごとにプロジェクトを切り替えるときの備忘録です。

###/etc/httpd/conf/httpd.conf
webサーバーにポート番号を宣言するファイルになります。

```terminal:httpd.conf
Listen 80
Listen 81
Listen 8080
Listen 8081
```
ここでポート番号を指定します。
ローカル側で使えない番号もあるので確認の上設定してください。

###/etc/httpd/conf.d/(任意サーバー名).conf
webサーバーで宣言したポート番号ごとにドキュメントルートを設定するファイルになります。

```terminal:(任意サーバー名).conf
<VirtualHost *:80>
ServerName （任意）.test
DocumentRoot "/var/www/html/(アプリケーションのルートパス）"

<Directory "/var/www/html/">
        Options FollowSymLinks
        AllowOverride All
        Order deny,allow
        Allow from all
</Directory>
</VirtualHost>

<VirtualHost *:8080>
ServerName （任意２）.test
DocumentRoot "/var/www/html/（アプリケーションのルートパス）"

<Directory "/var/www/html/">
        Options FollowSymLinks
        AllowOverride All
        Order deny,allow
        Allow from all
</Directory>
```
宣言したポート番号ごとにドキュメントルートを指定すればwebサーバーでアプリケーションを複数設定することができます。
まだまだ知見が浅いのでご指摘頂けると幸いです。
Couchbase .Net SDK解説：非同期プログラミング

## 概要

Couchbase .NET SDKは、`System.Threading.Tasks`名前空間のクラスを用いた「タスクベースの非同期パターン（TAP）」を使用して、るCouchbaseServerに対する非同期操作を実現します。同期操作のための固有のAPIはない代わりに、`Task.Result`メソッドを使用して、すべてのタスクをブロッキング方式で同期的に実行できます。


.Netにおける非同期プログラミング、特に「タスクベースの非同期パターン（TAP）」に関する詳しい情報は、こちらのMicrosoftのドキュメントをご確認ください。

https://docs.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern#combinators



## 実装例による解説

### Couchbase Serverへの接続

後述の全ての処理は、`Cluster`オブジェクトで接続を開始し、バケットとコレクションをオープンするところから始まります。

```csharp
var cluster = new Cluster("couchbase://localhost", new ClusterOptions()
                 .WithConnectionString("couchbase://localhost")
                 .WithCredentials(username: "user", password: "password")
                 .WithBuckets("travel-sample")
            );

var bucket = await cluster.BucketAsync("default");
var collection = bucket.DefaultCollection();
```

### `await`を使用した非同期プログラミング

`await`の利用は、非同期操作を行うための最も基本的な方法です。

```csharp
var upsertResult = await collection.UpsertAsync("doc1",new {Name = "Ted", Age = 80});
using (var getResult = await collection.GetAsync("doc1"))
{
     var person = getResult.ContentAs<dynamic>();
}
```
ここでは、例外処理は考慮していないことにご注意ください。

`GetAsync`メソッドは、`GetResult`を返します。その`GetResult`の`ContentAs`メソッドを使用して、戻り値を読み取ります。

### `Task.Result`を使用した同期プログラミング

上記で利用した同じメソッド(`UpsertAsync`, `GetAsync`)を同期的に呼び出すこともできます。その場合、次のように、`Result`プロパティを使用します。

```csharp
var upsertResult = collection.UpsertAsync("doc1",new {Name = "Ted", Age = 80}).Result;
using (var getResult = collection.GetAsync("doc1").Result)
{
     var person = getResult.ContentAs<dynamic>();
}
```

上記の同期処理と同様のことを行う別の方法は、`Task.GetAwaiter().GetResult()`のように`Awaiter`を明示的に呼び出すことです。

```csharp
var upsertResult = collection.UpsertAsync("doc1",new {Name = "Ted", Age = 80}).GetAwaiter().GetResult();
using (var getResult = collection.GetAsync("doc1").GetAwaiter().GetResult())
{
     var person = getResult.ContentAs<dynamic>();
}
```


### `Task.WhenAll`を使用して多数のタスクを同時に実行する

特定の状況では、多数のタスクの（実行順序のない）組み合わせを同時に実行したい場合があります。このようなバッチ処理を行うためには、`Task.WhenAll`を使用します。

```csharp
var tasks = new List<Task<IGetResult>>
{
    collection.GetAsync("doc1"),
    collection.GetAsync("doc2"),
    collection.GetAsync("doc3"),
    collection.GetAsync("doc4")
};

var results = await Task.WhenAll(tasks);

foreach (var getResult in results)
{
    var doc = getResult.ContentAs<dynamic>();
    //戻り値のドキュメントに対する処理
}
```

この例では、4つのドキュメントを非同期にフェッチし、全ての結果が返されるまで状態を一時停止します。次に、結果のリストをループして各ドキュメントを同期的に処理しています。

上述したように、非同期処理は、実行順序に関係のないタスクの組み合わせの実行という意味で、本質的にバッチ操作です。

下では、上とは少し異なる方法による実装例にコメントを附しています。

```csharp
// Taskリストの初期化
var tasks = new List<Task>();

// 同期的にタスクを作成し、リストに格納（これらのタスクはまだスケジュールされていません）
for (var i = 0; i <100; i++)
{
    var task = collection.GetAsync($"mykey-{i}");
    tasks.Add(task);
}

// リスト中の全てのタスクの完了を待つ
await Task.WhenAll(tasks);

// リストから順次、結果を受け取る
foreach (var task in tasks)
{
    var result = tasks.Result;
}
```

**参考情報**

[Couchbase公式ドキュメント .NET SDK　/ Advanced Data Operations / Async & React APIs](https://docs.couchbase.com/dotnet-sdk/current/howtos/concurrent-async-apis.html)
【論文要約】Is BERT Really Robust? A Strong Baseline for Natural Language Attack on Text Classification and Entailment [Jin+, 2019]

## 要約

BERTのような予測精度の高い自然言語モデルであっても、入力する文の言い回しが少し変わるだけで、モデルの予測が変化してしまうことがあります。このような事例を敵対的サンプルと呼びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/e160f72b-4237-dc83-aba0-1433d8986843.png)

この研究では、TextFoolerという敵対的サンプルを生成する手法を提案しており、既存法に比較して以下のような利点があります。

* 既存の研究よりも敵対的サンプルを見つけられる確率が上がった
* 意味的な変化を最小限にする
* 入力テキスト長に比例する時間で敵対的サンプルを探索可能

## アーキテクチャ

2つのステップで敵対的サンプルを探索します。

### Step1：重要な単語を見つける
文を構成する単語をそれぞれ抜いたときの予測結果の変動をもとに、予測において重要な単語をランキング化します。
そして、文法崩壊を避けるためにNLTKやspaCyを用いてストップワードを除去します。

### Step2：類義語に置換する
以下の条件に一致する類義語に置換します。

* 単語ベクトルのコサイン類似度が閾値より高いもの
* 品詞が同じもの
* Universal Sentence Encoder (USE) による文ベクトルのコサイン類似度が閾値より高いもの

## 結果
LSTMモデルに対する敵対的サンプル生成の結果です。
IMDBだと、敵対的サンプルの平均5.1%の単語置換によって、データセットの内99.7%の予測を変化させました。
他のデータセットでも既存法を上回る成功率となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/b55d5e83-3469-9a26-60e2-e6d5239881d1.png)


また、敵対的サンプルを訓練データに追加する「敵対的学習」によって、敵対的攻撃に頑健になることも示しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/bd5cb531-3544-2fa7-78a7-dfb34d1769d8.png)

## おわりに
非常に効率的に敵対的サンプルを生成することに成功しています。BlackBox攻撃なので、どんな自然言語モデルに対する敵対的サンプルも手軽に生成することができます。悪意を持った人に脆弱性として利用されないために、敵対的学習でモデルを頑健にすることや、敵対的サンプルそのものについて解明が進めることが必要になると思います。
Ubuntu on WSL2

Ubuntu (20.04LTS) をWSL2上にインストールする手順を説明する。
[WSL2の有効化](https://qiita.com/ichidai/items/660ec831b6bd018b7269) を先に済ませておくこと。

# UbuntuLinuxインストール
MicrosoftStoreで「Ubuntu」を検索してインストールする。
![ss432.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43130/5841a286-ed8c-624d-eacb-f15b27a89606.jpeg)

インストール後は直ちに起動させる。

起動後は数分ほど待った後、デフォルトユーザーの作成を行う。
![ss435.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43130/49270de2-b49a-cdff-1659-dc780eae3c6f.jpeg)

ユーザーアカウント入力後、更に数分ほど待つとインストールが完了する。

# WSL2で使用するよう設定
インストールしたUbuntuをWSL2で動作するよう設定する。

```powershell:PowerShell
> wsl --set-version Ubuntu-20.04 2
```

下記のように表示されればOK。

```powershell:PowerShell
> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2
```

---
以上

次の記事 > [Ubuntu初期設定](https://qiita.com/ichidai/items/8f3880b3f12197c2d6ab)
ここ5年間でPHPを主体とした開発環境の流行を調べてみた

ここ5年間でPHPを主体とした開発環境で
[【Google trends】](https://trends.google.co.jp/trends/?geo=JP)から日本・世界でどんなのがトレンドにあるのか気になったので調べて見ました。

2021年7月14日(水) 現在

毎年更新予定

#【インフラ・クラウド】
AWS/GCP/Heroku/Azure

##日本
![インフラ-japan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/1121b75c-7051-6c20-726f-9da39f31bd57.png)

##世界
![インフラ-world.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/ede66804-1c8b-983b-f5b4-edada5151cff.png)




#【仮想環境】
docker/vagrant/vmware

##日本
![仮想環境-japan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/7ac4e7dc-f6de-2cb3-b7d7-bf64d046e3c9.png)


##世界
![仮想環境-world.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/d91471c5-fae7-8cfb-afd9-4ac76073c8ea.png)

#【Webサーバ】
Apache/Nginx/IIS


##日本
![webサーバ-japan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/9c4ddac8-ed17-3279-eb3a-6bb1f614be02.png)

##世界
![webサーバ-world.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/f009e2fd-47ac-99a5-1633-51cb01a56573.png)


#【PHPフレームワーク】
Laravel/CakePHP/Symfony/ZendFramework/FuelPHP


##日本
![フレームワーク-japan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/c720b4df-01ec-941b-d0f9-846cc832a880.png)

##世界
![フレームワーク-world.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/97b2fcc6-4e73-b635-58ab-d8508a4fe792.png)


#【DB】
PostgreSQL/mysql/Oracle Database/Microsoft Access/Microsoft SQL Server

##日本
![DB-japan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/7e1eb9d8-3c65-b8fc-971a-35e85fbb1608.png)

##世界
![DB-world.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669259/87aca82a-1f8f-088a-c0cb-7e6242c989fa.png)


#最後に

Qiitaの記事にGoogletrendsのscriptを埋め込みたい。
今回は画像を張っただけなので、やり方を知って人は教えて下さい。

こんなのです。


```
  <script type="text/javascript" src="https://ssl.gstatic.com/trends_nrtr/2578_RC02/embed_loader.js"></script>
  <script type="text/javascript">
    trends.embed.renderExploreWidget("TIMESERIES", {"comparisonItem":[{"keyword":"AWS","geo":"","time":"today 5-y"},{"keyword":"GCP","geo":"","time":"today 5-y"},{"keyword":"Heroku","geo":"","time":"today 5-y"},{"keyword":"Azure","geo":"","time":"today 5-y"}],"category":0,"property":""}, {"exploreQuery":"date=today%205-y&q=AWS,GCP,Heroku,Azure","guestPath":"https://trends.google.co.jp:443/trends/embed/"});
  </script>

```
[Unity] パーティクルのパラメータのそれぞれの意味

######説明
パーティクルのパラメータの設定のそれぞれの意味一覧です。







|  パラメータ  |  説明  |
| ---- | ---- |
|  Duration  |  パーティクルの表示時間  |
|  Looping |  アニメーションを繰り返すかどうか？  |
| Prewarm  |  チェックするとアニメーション開始  |
|  Start Delay|  アニメーションが開始されるまでの待ち時間  |
| Start Lifetime | パーティクルの表示時間  |
| Start Speed | パーティクルのスピード  |
| Start Size | 一つ一つのパーティクルの大きさ  |
| Start Rotation | パーティクルの開始時の向きを指定 |
| Start Color | パーティクルの色を指定 |
| Gravity Multiplier | パーティクルに重力をかける |
| Max Particles | パーティクルの最大表示数|
useStateを変更してるのに再レンダリングされない時

ReactではuseStateの値が変更されると再レンダリングが走ります
しかし同じスコープ内で二回以上変更しても再レンダリングは一回だけです
つまりsetStateの数＝再レンダリング回数ではありません

```react
function App(){

 const [testA, setTestA] = useState("");
 const [testB, setTestB] = useState("");

//初回レンダリング時のみ実行
 useEffect(() => {
  setTestA("huga");
  setTestB("hoge");
 }, []);

 const Test = () => {
  console.log("Test");
  return <div>Test</div>;
 };

 return (
  <>
   <Test />
  </>
 );
}
```
例えばこの場合、再レンダリングは一回しかされず、Testは二回（初回レンダリングと再レンダリング）しか表示されません。
useStateを二回やっていても同じスコープ内なら再レンダリングは一回のみです。

詰まったのでメモ
Actionsクラスを使ってマウスアクション --メモ--

Actionsクラスはマウスやキーボード入力を行う。
using OpenQA.Selenium.Interactions;

#ダブルクリックする

```csharp
            IWebDriver driver = new ChromeDriver();

            try
            {

                driver.Navigate().GoToUrl("https://www.google.co.jp/");
                IWebElement searchBtn = driver.FindElement(By.LinkText("ログイン"));
                Actions actions = new Actions(driver);

                //左クリックして、ボタンを離さない。
                //actions.ClickAndHold(searchBtn).Build().Perform();

                //右クリック
                //actions.ContextClick(searchBtn).Build().Perform();

                actions.DoubleClick(searchBtn).Build().Perform();
            }
            finally
            {
                Console.ReadKey();
                driver.Quit();
            }
```

#マウスを要素に移動
Gmailの要素にマウスを移動。

```csharp
            ChromeDriver driver = new ChromeDriver();

            try
            {
                driver.Navigate().GoToUrl("https://www.google.co.jp/");    
                IWebElement gmailLink = driver.FindElement(By.LinkText("Gmail"));
                Actions actions = new Actions(driver);
                actions.MoveToElement(gmailLink).Build().Perform();
            }
            finally
            {
                Console.ReadKey();
                driver.Quit();
            }
```

#ドラッグアンドドロップは…

参考にした先で。

[参考にした記事]
 [マウスアクションの詳細](https://www.selenium.dev/documentation/ja/support_packages/mouse_and_keyboard_actions_in_detail/)
Rails Twitter認証備忘録(2021年7月)

# 最初に
まだ自分の開発がひと段落していないため、大雑把に書いています。そのうちわかりやすく書き直そうと思うので、ご容赦ください(m_ _m)

## TwitterAPI callback urls
今回はlocalで設定
![sshot 2 22.08.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697130/68a84e14-763d-2b1e-4a4e-85dd4e54fa85.png)

## gem
```ruby
gem 'omniauth-twitter'
gem "omniauth-rails_csrf_protection" #脆弱性対策のためのgemらしい
```



## omniauth.rb
initializers配下に置きます。自分は恥ずかしながらconfig配下において一日無駄にしました:sob:
どこをいじってもうまくいかないはずです:sob:
皆さんは自分のようなミスを犯さないように気をつけましょう。

```ruby
#config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
    provider :twitter, 'api_key', 'api_secret_key', callback_url: "http://127.0.0.1:3000/auth/twitter/callback"
end
```


## urlに遷移！
getだといけないみたいなのでpostのためのbuttonを好きな場所に設置

```erb
<%= button_to "Connect to Twitter" , "/auth/twitter", method: :post %>
```
twitterぽい画面が表示されてからこんなエラーが出たらOK
![sshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697130/903ba33f-9e0d-6e80-2eed-76dba24db2cf.png)








# Rails APIの場合

追加でやること

- 念の為CORS設定
- OauthのSessionをignoreする記述追加
- buttonを作る(おまけ)

## CORS設定
正直関係ない気がするけどやっていく


Gemfileの29行目あたりをコメントイン

```ruby
gem 'rack-cors'
```
bundleして,


cors.rbのコメントアウトを外す

```ruby
#config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '通信する予定のフロントのurl'#例 'http://localhost:3000'

    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end
```

## OauthのSessionをignore

これを追記しないとエラーが出るので以下を追加

```ruby
#config/application.rb
config.session_store :cookie_store, key: '_interslice_session'
config.middleware.use ActionDispatch::Cookies # Required for all session management
config.middleware.use ActionDispatch::Session::CookieStore, config.session_options
```
[参考](https://github.com/omniauth/omniauth#integrating-omniauth-into-your-rails-api)

## POSTのボタン作成

知識が浅いので、curlコマンドやpostman使ってもエラーが出るだけでフロントにPOSTボタンが欲しい。でも、まだフロント側を開発してない、だからAPIモードでもviewが欲しいって時に自分はこうしましました。


なんでもいいのでコントローラを作る

```shell
rails g controller test
```

```ruby
#app/controllers/test_controller.rb
class TestController < ActionController::Base #ActionController::Baseに変更する
   def index
   end
end
```
viewが作成されてないので自分で作ります。

```shell
mkdir app/views/test
touch app/views/test/index.html.erb
```

```erb
#app/views/test/index.html.erb
<%= button_to "Connect to Twitter" , "/auth/twitter", method: :post %>
```

最後にrouteingを設定して完了

```ruby
root to: "test#index"
```

これで問題なくボタンが表示されるはずです！
[http://localhost:3000/](http://localhost:3000/)














# 今回のポイント
- 脆弱性対策のためのgem、 omniauth-rails_csrf_protection を追記する
- リクエストはpostで.
- 自分のようなミスは犯さない.

# 参考記事&動画
- [シンプルだけど足りない部分があった記事](https://reasonable-code.com/rails-twitter-auth/)
- [参考動画](https://youtu.be/FbUWc8Vnu8Y)
- [OmniAuth脆弱性について](https://qiita.com/NT90957869/items/2a3ce18dedf93ccf2bdc)
react-rails gem と react_on_rails gem　の特徴と比較



##react-railsの特徴
・導入が容易
・サーバーサイドとフロントサイドのレンダリングを自動的に行う。
・Asset Pipelineを利用してJSXを変換する。
・ビューで、 react_componentヘルパーを使用してReactコンポーネントをレンダリングする。
・SSRに対応している。
・記事が豊富。



##react_on_railsの特徴
・react-railsに比べrailsに依存しない。
・RailsのViewからReactコンポーネントに直接プロップスを渡す。
・rails/webpackerに依存しないSSR.
・RdduxとReactRouterを組み合わせたSSR。
・Webpack, Babel, React, Redux, React-RouterなどのモダンJSスタックをRailsと密結合にならない形で導入したい状況を想定している。

##結論
どちらもSSRに対応しているが、サーバー側とフロント側をできるだけ分離させたいなら、依存が少ないreact_on_railsの方がいい。




##参考記事

https://github.com/reactjs/react-rails#related-projects


https://github.com/shakacode/react_on_rails

https://qiita.com/k-penguin-sato/items/e3cc04f787cf3254cfae

https://masaru-tech.hateblo.jp/entry/2017/08/20/235545
transforms.ToTensorのGrayScaleからRGB変換について

#概要
ToTensor()のinputは(C, W, H)じゃなくて(W, H, C)でないとダメだという話

#コード

```python
a = np.tile(np.arange(64*64).reshape(64,64), (3, 1, 1))#shape (3,64,64)
```
これをpytorchのtoTensorでtorch型に変えると

```python
from torchvision import transforms
a_tensor = trans = transforms.ToTensor()(a)
print(a_tensor.shape)
```
とすると``torch.Size([64, 3, 64])``となる、なぜ``torch.Size([3, 64, 64])``にならないんだ。。

調べてみるとToTensor()はnumpyやPIL Image(W,H,C)をTensor(C,W,H)に変換するようです。ですので

```python
a = np.tile(np.arange(64*64).reshape(64,64), (3, 1, 1)).T #shape (64,64,3)
from torchvision import transforms
a_tensor = trans = transforms.ToTensor()(a)
print(a_tensor.shape)
```
とすることで``torch.Size([3, 64, 64])``が出力されます。
初めてのQiita 記事の書き方メモ

#はじめに
テックアカデミーのプログラミング学習を終了してQiitaを自分もやってみようと思い、

色々調べ、初投稿を試みました。

Markdown記法、画像挿入など色々な機能を使って投稿してみます。

ブログなどあまり書いたことがないので文章力もないですがアドバイスありましたらお願いします！

##Qiitaのメリット

なぜQiitaを使おうと思ったのか

* ノートに手書きのメモをしていたがメンターの方にQiitaというものがあるよと言われたのがきっかけ
* 無料で使えるため
* Markdownの練習になる
* アウトプットすることで知識や勉強したことの整理ができる
* ~~就職の時に有利である~~

##投稿してみよう
添付ファイルの右上　投稿するボタンを押すと投稿できるみたいです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1761711/d052775e-0fa9-7b08-ae2c-af7aeca81902.png)

投稿するボタンクリックするとこの画面が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1761711/38a90341-4970-7f22-012d-0d6516733347.png)
1. タイトルを決める
2. 関連タグを５つまで、半角スペースで区切って載せる (例)Qiita 初心者 書き方など
3. 本文を記載する

本文のプレビューは画面右側で確認することができる
こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1761711/d80f7d65-231a-abde-00c2-b44bbf51df0f.png)

##Markdown記法の参考にしたもの
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
[良い記事を書くためのガイドライン]
(https://help.qiita.com/ja/articles/qiita-article-guideline)
他の人のQiitaを参考にする

###リンクのやり方
\[リンクテキスト](URL "タイトル")でok
\[Markdown記法 チートシート](https://....)のような感じ
Markdownのコマンドを載せたい場合、先頭に \ を入れると載せれる

###他の人のQiitaを参考にする
他の人のMarkdownを見ることができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1761711/d643ed4b-eb56-aafd-db86-f0ee4a48d354.png)
文章の最後の方に ・・・ 丸が三つ並んだアイコンがあるのでクリックすると画像のタブが表示される

###コードの書き方

```create.blade.php

@extends('layouts.app')

@section('content')

<!-- コンテンツを書く -->
<h1>メッセージ新規作成ページ</h1>

@endsection
```

バッククオート３つで囲うと書ける [```]

##投稿クリック！！
右下のQiitaに投稿を選択すると投稿できるみたい

下書き保存をすると、自分のアイコンクリックして、下書き記事をクリック。

編集したい記事のえんぴつマークをクリックして編集開始

##参考にさせていただいたサイト
[Qiitaアカウント作成方法、記事の書き方、投稿手順](https://qiita.com/predora005/items/342b50859e2aeafc39b6)

[Markdown 書き方の基本をまとめてみた](https://qiita.com/Hase-pro/items/16379a0c83f2725e3a11)

##最後に
Markdown記法になれるまでは大変だけど、これからメモしておきたい事や、気に

なることをアップしていけたらいいなと思っております。
「gatsby-plugin-sitemap」が、突然buildでこけた時の対処

お疲れ様です。

しばらくGatsbyJSの2系で、サイトを作成してました。
当然、「gatsby-plugin-sitemap」は使いますよね:grinning:。

バージョンはこんな感じで。

```js:package.json
"gatsby-plugin-sitemap": "^4.1.0",
```

で

```js:gatsby-config.js 
{
    resolve: `gatsby-plugin-sitemap`,
    options: {
        exclude:[`/draft/`],
    },
   },
```

みたいに書いてたわけです。
先日、Gatsby version: 3.4.1にアップデートして新たに別サイトを作成しました。

すると以下のエラーでbuildがこけるようになりました。
プラグインのバージョンは、"gatsby-plugin-sitemap": "^4.1.0"指定で変更ありません。

突然こけたわけでは無いのですが、心証としては「突然」なわけでして・・。
何？これ。

```
"gatsby-plugin-sitemap" threw an error while running the onPostBuild lifecycle:

Body must be a string. Received: undefined.
〜
File: node_modules/gatsby-plugin-sitemap/gatsby-node.js:40:20
```

しばらく悩みましたが、githubのissueに回答がありました。

```js:gatsby-config.js 
{
    resolve: `gatsby-plugin-sitemap`,
    options: {
        excludes:[`/draft/`],
    },
   },
```

・・・・「exclude」が「excludes」に変更になってました。

なんかね・・えぇ。
自分が悪いんですが、ぱっと流して読んでると気づかなかったので、備忘録として投稿いたしました。


う〜ん。
最近モヤモヤが増えてきたきがする・・・・Gatsby。

それでは。また。
Scriptタグの属性についてまとめ


`<script>` のタグの属性について何がどういう効果か毎度調べている気がしたので、まとめておきます。

## async
JSがレンダリングをブロッキングしないようにつける属性その1です。
HTMLパースと並列してJSを読み込みます。

読み込み、だと正確ではない部分があるので詳しく説明すると、

- JSデータのfetch通信
- JSデータの実行

の2フェーズがあり、並列に処理されるのは`JSデータのfetch通信` の部分です。
実際の実行時にはレンダリングをブロッキングするので注意が必要です。

## defer
JSがレンダリングをブロッキングしないようにつける属性その２です。
違いは読み込みタイミングで、deferは`DOMContentLoaded`イベントが走る前にJSデータが**実行**されます。
asyncとdeferの違いについては[「script タグに async / defer を付けた場合のタイミング」](https://qiita.com/phanect/items/82c85ea4b8f9c373d684)というこちらの記事がよく纏まっていてわかりやすいです。
非常にわかりやすい図がありましたので上記記事から拝借いたしました。

![https___qiita-image-store.s3.amazonaws.com_0_41297_94f6efd2-1fbd-3d2c-8f80-ad17aaac4df6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441432/62f1103b-7213-191d-d8aa-d0ae7de84413.png)



実行をパースに割り込ませるかどうかが違うので、JSの目的によって指定する属性は異なってくるでしょう。

```html
<script async>....</script>
<script defer>....</script>
```


## nomodule
ES2015がサポートされていないブラウザ(IEやレガシーブラウザなど)のみ読み込む場合はこの属性を指定します。
user-agentなどの煩雑な指定を避けることができるので、使いようによっては便利です。

```html
<script nomodule>....</script>
```

## type="module"
コードをJSモジュールとして処理します。
ES2015対応ブラウザでないと使えないので、`nomodule`とセットで使うと良いでしょう。
モジュールはモジュールなので、その振る舞いが通常のスクリプトとは異なる場面があります。

- defer属性の効果がデフォルトでついている（defer属性をつけても無視される）
- 自動で`use strict`になる
- スコープがモジュール単位のため、デフォルトのグローバル変数にアクセスできない（window省略など）
[JAVASCRIPT.INFO](https://ja.javascript.info/modules-intro)などで詳しくご確認ください。

サンプルとして、[js-cookie](https://github.com/js-cookie/js-cookie)のreadmeの例文を記載します。

```html
<script type="module" src="/path/to/js.cookie.mjs"></script>
<script nomodule defer src="/path/to/js.cookie.js"></script>
```





## 参考
[MDN scriptタグ](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script)
[MDN JavaScript modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules)
NOT NULL 制約をつけるべきカラムとは

# はじめに

---

この記事は[SQLアンチパターン](https://www.amazon.co.jp/SQL%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Bill-Karwin/dp/4873115892)の13章、フィア・オブ・ジ・アンノウンの影響を大いに受けています。またこの記事の著者はPostgreSQLをメインで使っています。

---

# なにはなくともNULLはつらい

---

値をアプリケーションで扱う場合でも、DB内のクエリで扱う場合でも、NULLというものは面倒なものです。特にクエリで扱う場合はなおさらです。

---

## 挙動が直感的ではない

```
select NULL || 'something'; 
select NULL+1; 
select NULL = 'something';
```
これらのクエリを投げると返ってくるのは全部NULLです。

---

## NULLチェックが大変
例えばNULLである可能性がある値をWHERE句の条件に組み込みたい場合、COALESCEやIS NOT NULLを使うなどの一工夫が必要になります。

---

# なんにでも NOT NULL をつけることの問題
これらを嫌ってカラムに適切にNOT NULL 制約をつけることは有効です。が適切でなかった場合次にあげていくような問題が起こりえます。そしてこれらの問題は上で述べたものよりも悪質です。テーブルの例をだして説明します。

---

以下のようなテーブルを考えます

|列|型|
|---|---|
|tweet_id|TEXT|
|summarized_at|TIMESTAMPTZ|
|retweeted_count|BIGINT|
|impressions_count|BIGINT|

これはtwitterのあるツイートのリツイート数とインプレッション数(リツイートしてくれたユーザーのフォロワーの合計値)を1時間ごとに計測し、保存しておくためのテーブルです。
retweeted_countとimpressions_countがそれぞれ独立して集計される場合、このテーブルでNOT NULL制約をつけていいカラムはどれでしょうか？

---

正解は上二つです

|列|型|NOT NULL制約|
|---|---|---|
|tweet_id|TEXT|NOT NULL|
|summarized_at|TIMESTAMPTZ|NOT NULL|
|retweeted_count|BIGINT|-|
|impressions_count|BIGINT|-|

では下二つのカラムにNOT NULL制約をつけてしまった場合、何が問題になるでしょうか?

---

これはretweeted_countとimpressions_countのどちらかの取得に失敗した時のことを考えればよいです。じっくり考えると失敗したときに入れられる数字が___なにもない___ことに気づくのではないでしょうか。

例えば

- 0: 本当に0のときと区別できなくなる
- 負数: 一日ごとの推移などを導出したいなどで、SUMなどの演算するときに邪魔になる

---

さらに言えば、今回はBIGINT型でしたが例えばTEXT型のカラムにおいて、空値用の文字を決めて使った場合でも問題があります

- 新しくプロジェクトに来た人はその代用をどう知れば良いのか？
- 代用文字で処理を分岐することはNULLチェックすることと本質的に同じではないか？
- プロジェクトにおいてNOT NULL制約そのものが信頼できなくならないか？

これらが意味することは、欠けてしまった値に入れてよいものはNULLしかないということです。

---

# NOT NULL制約をつけるべきカラム

---

上で紹介したSQLアンチパターンにはこうあります

>列にNOT NULL制約を宣言するのは、値のない列がその行にとって意味をなさない場合に限るべきです。例えば、Bugs.reported_by列には必ず値が必要です。すべてのバグは、誰かによって報告されたものだからです。しかしバグにまだ修正担当者が割り当てられていない場合はあります。このとき、欠けている値はNULLであるべきなのです。

--- 

これはつまりこのようなことではないでしょうか

___あるカラムの値が仮に欠けてしまった時に、行全体が意味をなさなくなる場合にのみ、そのカラムにNOT NULL制約をつけるべきである。___

知っているテーブル構造などを念頭に置いて考えてもらえれば、しっくりくる定義ではないでしょうか?

|列|型|NOT NULL制約|
|---|---|---|
|tweet_id|TEXT|NOT NULL|
|summarized_at|TIMESTAMPTZ|NOT NULL|
|retweeted_count|BIGINT|-|
|impressions_count|BIGINT|-|

---

ただし先ほどの定義にも落とし穴があります。以下のテーブルは、先ほどから例に出しているテーブルからimpressions_countを抜き、retweeted_countにNOT NULL制約をつけたものです。この段階では定義的にもアプリケーション的にも特に問題がないことがわかると思います。

|列|型|NOT NULL制約|
|---|---|---|NOT
|tweet_id|TEXT|NOT NULL|
|summarized_at|TIMESTAMPTZ|NOT NULL|
|retweeted_count|BIGINT|NOT NULL|

ここからimpressions_countのカラムが増えるとretweeted_countのNOT NULL制約にさっき述べたような問題が起きてしまいます。先ほどの定義に従ってつけた制約が、明日も定義に従っているとは限らないわけです。

---

# まとめ
- できればNOT NULL制約はなるべくつけたい
- NULLを他のもので代用してはいけない
- あるカラムの値が仮に欠けてしまった時に、行全体が意味をなさなくなる場合にのみ、そのカラムにNOT NULL制約をつけるべきである
- テーブルへカラムを追加することで、他のカラムのNOT NULL制約を外さないといけなくなることがある
WSL2

WSL2の有効化（インストール）について説明する。

# Windows10システム要件
- Windows 10 バージョン 1903 ビルド 18362.1049 (KB4566116適用後)
- Windows 10 バージョン 1909 ビルド 18363.1049 (KB4566116適用後)
- Windows 10 バージョン 2004 ビルド 19041 以降

スタートメニューから「設定」「システム」「バージョン情報」へ進み、「Windowsの仕様」の欄を確認する。
![ss430.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43130/28c1b0d8-e6b6-7525-1e97-0fe55fff9edf.jpeg)

# 機能の有効化

スタートメニューから「設定」を開いて「設定の検索」に「Windowsの機能」と入力。
「Windowsの機能の有効化または無効化」が候補に出るのでそれを選択する。
![ss427.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43130/065a9db2-05de-7e24-391f-bd90bc003eca.jpeg)

機能の一覧から「Linux用Windowsサブシステム」「仮想マシンプラットフォーム」にチェックを入れてOKボタンを押す。
![ss426.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43130/323799a4-b046-51b8-d38d-aa0b7ed7751a.jpeg)

機能の更新後に再起動する。

# カーネルコンポーネントの更新

https://aka.ms/wsl2kernel へアクセスして「wsl_update_x64.msi」をダウンロード、インストールする。

# WSLのデフォルト設定

PowerShellからWSLのデフォルトバージョンを「2」に設定する。

```powershell:PowerShell
> wsl --set-default-version 2
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
```

---
以上

次の記事 > [Ubuntu on WSL2](https://qiita.com/ichidai/items/f9b1bb22c639e3bc30d9)
Githubの認証を二段階にしたらpushができなくなった

Githubを利用する際、二段階認証を有効にするとpushが出来なくなりました。その際に参考にしたページを記載しておきます。
下書きのままにしていましたが、しばらくpushしていなかったレポジトリをpushしようとして今日も役に立ったの投稿します。

https://qiita.com/sayama0402/items/670b6b650ebdd8680a0b

https://qiita.com/kitoko552/items/3f45de6c876c638b690d
MySQLで SQL 0A80E90FC (1118): Row size too large (> 8126) . のエラーが発生した場合

### 実行環境
(old) mysql  Ver 14.14 Distrib 5.1.73
(new) mysql Ver 15.1 Distrib 10.3.28-MariaDB

### エラー内容
サーバーのリプレイス準備中にSQLクライアントを使用して、旧環境からエクスポートしたSQLファイルを新環境にインポートしようとしたところで発生。
エラー文は、

```
SQL 0A80E90FC (1118): Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. lE8a0F: 05306E08804606A0A80E90FC092q21�9605908B06B06F001"0D00C30C10E20FC0C90670A80E90FC04CQFA05F089P5Ck6205908B" 0AA0D70B70E70F3092q21RB906B05908B05306804C06704D07E059uery
```

### 対応方法
インポートしようとしたSQLファイルの中身を確認すると、すべてのレコードで `ROW_FORMAT=COMPACT` となっていました。
データのあるレコードだけ置換するとエラーが継続したので、一斉置換で
 `ROW_FORMAT=COMPACT` 
を
 `ROW_FORMAT=DYNAMIC`
 に変換し保存、再度インポートを実行すれば、エラーなくインポートできました。テーブル内データも確認済みです。
古い環境からSQLをインポートすると出るようです。
React で　Todo アプリ(追加機能のみ)_作ってみた。

<h1>React Todo-List App
![O#do Kg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091486/44da7956-8175-b49e-494f-fd0710ad68cd.png)
<p>ReactDom とはreactに埋め込んだコードをHTMLに変換するもの
JSX はJavaScript の中にHTMLみたいなものを描くことができる記法
Functional component 関数の形で書いていく　ものでReactの方針で決まった。
古い書き方がClass component

Todoアプリの作成

・App.jsに記述したformをコンポーネントごとに切り分け

・src/components/Form.js　Formコンポーネント作成(Todo入力部分)

・src/components/Todo.js　Todoコンポーネント作成（Todoアイテム表示部分）

・App.jsでTodoを追加できるようにする

<h2>■用語

 <h4>stateとprops、constructor<h4/>
・constructorはclassをインスタンス化した時に最初に呼ばれる処理
1番最初に処理したいものを記述する
・stateはアプリケーションの中で保存される値
jsでデータを保存しておくための箱の事

![class Form extends React Component {.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091486/6e34752a-d8fb-f6ed-dcf3-c16887498e37.png)
￼
<h4>onChange<h4/> イベントを表すpropsにはon[Event]という名前、onChangeでフォーム全体の入力値変更を検知

<h4>handlexx<h4/> イベントを処理するメソッドにはhandle[Event]という名前、イベントが発生した時に実行する関数イベントハンドラ
￼
![return (.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091486/66452f39-ffa1-544c-87fc-7fab1295869a.png)
￼


<h4>setState<h4/> stateに反映、この場合はstateのinputを指定、stateの更新
e : イベントの変数の事、イベントが渡されてくる
（jsで管理されてるので、React Developer Tools で値を確認出来る）
何か送信する処理(onSubmitなど)で、preventDefault をしないとホストリクエストが起きてしまい、画面が切り替わってします。
￼![handleChange = (e) = {.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091486/449f1166-a9f6-ff7a-c1e8-e0e15077e3a9.png)
￼


props : Reactのコンポーネントに渡す値、コンポーネントの再利用
![const { text 1 = this. props;.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091486/ac5c2a8a-f334-5e75-02d8-48303bc632a6.png)
￼
￼

配列todosのstateを作成
![constructor(props) 25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091486/13ac1930-895e-d1ef-ece1-14b67b311c2b.png)
￼
￼
Mapっていう配列を回すやつがある。配列を回して1つ1つの<Todo/>を表示していく。
配列で新しい要素を生成するときはkeyっている識別子をつけてあげなきゃいけない。Reactが管理するため。

setState　を使ってstateを更新する。
![constructor(props) 25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091486/f1c278d4-e5fe-c3bf-b9f9-4655338bb9fa.png)
￼
state配列のidとtextを取り出して、１つずつ表示
![{this.state.todos.map (({ id, text }) = (.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091486/0cb79450-5a73-f795-2ff9-eb24434523ed.png)
￼