OmniAICreator/Qiita-1.07M huggingface dataset:
正規分布 : ガンマ分布 (ベイズ推定)


# 記事の目的
正規分布と、分散が未知の時の共役事前分布である正規分布を使用し、Rを使ってベイズ推定を行います。
20男性の身長の分散を事後分布で推定します。
参考：[ベイズ推論による機械学習入門](https://www.amazon.co.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%83%99%E3%82%A4%E3%82%BA%E6%8E%A8%E8%AB%96%E3%81%AB%E3%82%88%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E9%A0%88%E5%B1%B1-%E6%95%A6%E5%BF%97/dp/4061538322)

# 目次
[1. モデルの説明](#1-モデルの説明)
[2. 推定する分布](#2-推定する分布)
[3. 事前分布](#3-事前分布)
[4. 事後分布](#4-事後分布)
[5. 予測分布](#5-予測分布)

#1. モデルの説明
![IMG_0184.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/b0e04951-25ef-bda6-6d99-72ca1cca7f3b.jpeg)




#2. 推定する分布
20代男性の身長は、平均が170で標準偏差が10の正規分布に従います(適当)。しかし、僕たちはそれを知りません。
この、真の分布の分散の逆数1/100=0.01を事後分布で推定します。

```R:
curve(dnorm(x, 170, 10), 100, 250, xlab="20代男性の身長", ylab="確率密度")
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/90e57ef7-13fe-8b98-8086-3e3478915a1b.png)





#3. 事前分布
事前分布として、正規分布の、分散が未知のときの共役事前分布であるガンマ分布を指定します。
データに適合しやすいように、a0, b0を小さな値で設定します。

```R:
a0 <- 1
b0 <- 1
curve(dgamma(x, a0, b0), 0, 0.1, ylim=c(0,150), 
      xlab="20代男性の身長の分散の逆数", ylab="確率密度")
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/097adbc3-976f-245d-fd68-7adc4822a927.png)


#4. 事後分布
真の分布から50個のサンプルを取って事後分布を推定します。
事後分布は緑の曲線です。0.01付近が一番出やすいと推定できています。

```R:
N <- 50
X <- rnorm(N, 170, 10)
#事後分布
u0 <- 170
a <- N/2 + a0
b <- ((X-u0) %*% (X-u0))/2 + b0
curve(dgamma(x, a, b), 0, 0.1, add=T, col="green")
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/3d591ec0-bcdd-6e32-4bb0-a78b33bef4cb.png)


#5. 予測分布
少し分散が小さく見積もられていますが、だいたい推定できています。

```R:
u.p <- u0
lambda.p <- a/b
n <- 2*a
curve(dnorm(x, 170, 10), 100, 250, ylim=c(0,0.05),xlab="20代男性の身長", ylab="確率密度")
curve(dt(x, df=n)*((1+x^2/n)^((n+1)/2))*sqrt(lambda.p)*((1+lambda.p*(1/n)*(x-u.p)^2)^(-(n+1)/2)), 100, 250,
      add=T, col="blue")
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/1a56bd22-69fe-208a-0b77-4cfafb5755a9.png)
正規分布 : 正規分布 (ベイズ推定)


# 記事の目的
正規分布と、平均が未知の時の共役事前分布である正規分布を使用し、Rを使ってベイズ推定を行います。
20代男性の身長の平均を事後分布で推定します。
参考：[ベイズ推論による機械学習入門](https://www.amazon.co.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%83%99%E3%82%A4%E3%82%BA%E6%8E%A8%E8%AB%96%E3%81%AB%E3%82%88%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E9%A0%88%E5%B1%B1-%E6%95%A6%E5%BF%97/dp/4061538322)

# 目次
[1. モデルの説明](#1-モデルの説明)
[2. 推定する分布](#2-推定する分布)
[3. 事前分布](#3-事前分布)
[4. 事後分布](#4-事後分布)
[5. 予測分布](#5-予測分布)

#1. モデルの説明
![IMG_0183.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/5f016dbe-5584-4abd-e94b-f04a1d3389f7.jpeg)


#2. 推定する分布
20代男性の身長は、平均が170で標準偏差が10の正規分布に従います(適当)。しかし、僕たちはそれを知りません。
この、真の分布の平均の170を事後分布で推定します。

```R:
curve(dnorm(x, 170, 10), 100, 250, xlab="20代男性の身長", ylab="確率密度")
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/abeae30a-ab47-defe-4c94-ecb69f77ce35.png)




#3. 事前分布
事前分布として、正規分布の、平均が未知のときの共役事前分布である正規分布を指定します。
平均が0で分散が10000の正規分布を仮定して、データに適合しやすくしています。

```R:
m0 <- 100
lambda.mu0 <- 1/50^2
curve(dnorm(x, m0, 1/sqrt(lambda.mu0)), 0, 250,
      xlab="20代男性の平均身長", ylab="確率密度", ylim=c(0,0.3))
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/ebe76cf5-955c-4b66-ca1d-bf19a6b88239.png)


#4. 事後分布
真の分布から50個のサンプルを取って事後分布を推定します。
事後分布は緑の曲線です。170付近が一番出やすいと推定できています。

```R:
#データ
N <- 50
X <- rnorm(N, 170, 10)
#事後分布
lambda0 <- 1/(10)^2
lambda <- N*lambda0 + lambda.mu0
m <- (lambda0*sum(X) + lambda.mu0*m0)/lambda
curve(dnorm(x, m, 1/sqrt(lambda)), 100, 250, add=T, col="green")
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/51b65771-bcc5-c1b3-767c-15f453cc2729.png)

#5. 予測分布
予測分布が、真の分布をうまく推定できていることが分かります。

```R:
curve(dnorm(x, 170, 10), 100, 250, xlab="20代男性の身長", ylab="確率密度")
curve(dnorm(x, m, sqrt(lambda^(-1)+lambda0^(-1))), 100, 250, add=T, col="blue")
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/04622e9b-d32b-2c8b-48b9-58ac418258a8.png)

◯SNS
・youtube
https://youtube.com/channel/UCFDyXEywtNhdtwqC3GAkYuA

・Twitter
https://twitter.com/Dken_ta
ポアソン分布 : ガンマ分布 (ベイズ推定)


# 記事の目的
ポアソン分布と、その共役事前分布のガンマ分布を使用し、Rを使ってベイズ推定を行います
ある商品Aの平均購買個数を事後分布で推定します。
参考：[ベイズ推論による機械学習入門](https://www.amazon.co.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%83%99%E3%82%A4%E3%82%BA%E6%8E%A8%E8%AB%96%E3%81%AB%E3%82%88%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E9%A0%88%E5%B1%B1-%E6%95%A6%E5%BF%97/dp/4061538322)

# 目次
[0. モデルの説明](#0-モデルの説明)
[1. ライブラリ](#1-ライブラリ)
[2. 推定する分布](#2-推定する分布)
[3. 事前分布](#3-事前分布)
[4. 事後分布](#4-事後分布)
[5. 予測分布](#5-予測分布)

#0. モデルの説明
![IMG_0182.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/408528e0-2a77-6cd7-17cc-e62bcb0d40e6.jpeg)



#1　ライブラリ
```R:
library(dplyr)
library(ggplot2)
set.seed(100)
```

#2. 推定する分布
商品Aの購買される個数は平均が15のポアソン分布に従います。しかし、僕たちはそれを知りません。
この、真の分布の平均の15を事後分布で推定します。

```R:
NULL %>% ggplot(aes(x=1:40)) + geom_bar(aes(y=dpois(1:40, 15)), stat="identity") +
  labs(x="商品Aの購買個数", y="確率密度", title="推定する分布")
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/35423cf6-052a-1185-f256-06802f63d0c1.png)




#3. 事前分布
事前分布として、ポアソン分布の共役事前分布であるガンマ分布を指定します。
データに適合しやすいように、a0, b0 は小さい値を初期値として設定します。

```R:
a0 <- 1
b0 <- 1
curve(dgamma(x, a0, b0), 0, 50 , xlab = "商品Aの平均購買個数(lambda)", ylab="確率密度", ylim=c(0,0.8))
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/f7c8d56a-70f6-022b-7ded-019c4609e734.png)



#4. 事後分布
真の分布から50個のサンプルを取って事後分布を推定します。
事後分布は緑の曲線です。50付近が一番出やすいと推定できています。

```R:
#データ
N <- 50
X <- rpois(N, 15)
#事後分布
a <- sum(X)+a0
b <- N+b0
curve(dgamma(x, a, b), 0, 50 , 
      xlab = "商品Aの平均購買個数(lambda)", ylab="確率密度", col="green", add=T)
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/02ffa63f-c3c0-42f4-6c1c-41a1a84759be.png)



#5. 予測分布
予測分布が、真の分布をうまく推定できていることが分かります。

```R:
Data <- data.frame(x=rep(1:40,2),
                   compare=rep(c("推定する分布", "予測分布"), each=40),
                   y = append(dpois(1:40, 15), dbinom(1:40, a, 1/(b+1))) )
Data %>% ggplot(aes(x=x, y=y, fill=compare)) + 
  geom_bar(stat="identity", alpha=0.7, position="identity") +
  labs(x="商品Aの購買個数", y="確率密度", title="推定する分布と予測分布の比較") +
  scale_fill_manual(values = c("black", "blue"))
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/6319dda1-d862-0c3c-f1a9-8876bccfeb34.png)
contenteditableのキャレットx,y座標を取得する。

1.選択と範囲を取得する。

```javascript
 var sel = window.getSelection();
 var range = sel.getRangeAt(0);
```

2.折りたたまれたdivを挿入。

```javascript
 var div = document.createElement('div');  div.className = "test" // class名（自由）をつけておく。
 range.insertNode(div);
```
3.div座標を取得する（ここからjQuery必要。）

```javascript
 console.log($(".test")[0].offsetTop,$(".test")[0].offsetLeft); // x,y座標が取得できた。
```

4.divを削除します。

```javascript
 $(".test").remove();
```

情報源: https://stackoverflow.com/questions/17016698/get-caret-coordinates-on-a-contenteditable-div-through-javascript
Lenovo IdeaPad Duet Chromebook に VScode を入れた話

IdeaPadはCPUがARMとかで（あまり詳しくない）VScodeがそのまま入らないみたいな話を見かけたので半分諦めていたが、やってみたらなんかできたので投稿。

※20/12/3追記：詳しそうな記事見つけたので貼っときます
https://forest.watch.impress.co.jp/docs/serial/yajiuma/1286826.html

#方法
ChromeOS用のVScodeは無いらしいので、Linux用のを使います。

1. まず、Linux(ベータ版)を有効にします。
自分は既に有効にしてしまっていたので、画像は操作後のものですが、設定（歯車アイコンのアプリ）からできます。
![Screenshot 2020-11-02 at 16.22.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/846177/f4cc0013-320e-b753-9a03-0e74a27df3ea.png)

2. VScodeのダウンロードページからダウンロード
ダウンロードページ：https://code.visualstudio.com/download
どうやら最近のバージョンからARM系のCPUにも対応してくれたようです。
画像のARM64の.debファイルをダウンロードします。
（はじめは左隣のARMのを試しましたが、次のインストールのとこでエラーしました。）
![canvas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/846177/6ae3e55a-1c1f-ccae-432d-b761641f81fe.png)

3. インストール
ダウンロードしたファイルをダブルクリックすると画像のようにLinuxでインストールするか聞かれるので、インストールします。
![Screenshot 2020-11-02 at 16.28.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/846177/cc4d9444-8658-0582-80ec-add10cf2e8d6.png)

4. 起動
インストールが完了すると、アプリ一覧のとこでLinuxアプリでひとまとめになった中にあるので、ここから起動できます。
ターミナルからも起動できます。
![canvas (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/846177/1db2f07b-e026-6a84-92c1-cdbc766c3023.png)
（最初VScode諦めてemacs使ってました。）


手順は以上ですが、例によって最初は日本語化されてなかったりするので適宜カスタマイズしてください。
あと、どうやらChromeOSの都合かショートカットキーが少し違ったりしているようです。
ターミナルのタブ？を開く操作が「Ctrl+@」ではなく「Ctrl+Shift+@」でした。この辺はこれから使いながら調べてみようと思います。
[備忘録]マクロのforeach

# はじめに

ただの備忘録です。
BoostPPとか使うの面倒くさい時にすぐ使える用

## PP_FOREACH

```haskell
#define PP_FOREACH_1(macro,e1) macro(e1)
#define PP_FOREACH_2(macro,e1,...)  macro(e1), PP_FOREACH_1(macro,__VA_ARGS__)
#define PP_FOREACH_3(macro,e1,...)  macro(e1), PP_FOREACH_2(macro,__VA_ARGS__)
#define PP_FOREACH_4(macro,e1,...)  macro(e1), PP_FOREACH_3(macro,__VA_ARGS__)
#define PP_FOREACH_5(macro,e1,...)  macro(e1), PP_FOREACH_4(macro,__VA_ARGS__)
#define PP_FOREACH_6(macro,e1,...)  macro(e1), PP_FOREACH_5(macro,__VA_ARGS__)
#define PP_FOREACH_7(macro,e1,...)  macro(e1), PP_FOREACH_6(macro,__VA_ARGS__)
#define PP_FOREACH_8(macro,e1,...)  macro(e1), PP_FOREACH_7(macro,__VA_ARGS__)
#define PP_FOREACH_9(macro,e1,...)  macro(e1), PP_FOREACH_8(macro,__VA_ARGS__)
#define PP_FOREACH_10(macro,e1,...) macro(e1), PP_FOREACH_9(macro,__VA_ARGS__)

// 必要次第追加
#define PP_GET_FOREACH(e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,NAME,...) NAME
#define PP_FOREACH(macro,...) PP_GET_FOREACH(__VA_ARGS__,PP_FOREACH_10,PP_FOREACH_9,PP_FOREACH_8,PP_FOREACH_7,PP_FOREACH_6,PP_FOREACH_5,PP_FOREACH_4,PP_FOREACH_3,PP_FOREACH_2,PP_FOR_EACH1)(macro, __VA_ARGS__)

```
ベルヌーイ分布 : ベータ分布 (ベイズ推定)


# 記事の目的
ベルヌーイ分布と、その共役事前分布のベータ分布を使用し、Rを使ってベイズ推定を行います。
ある商品Aを購買する確率を推定します。
参考：[ベイズ推論による機械学習入門](https://www.amazon.co.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%83%99%E3%82%A4%E3%82%BA%E6%8E%A8%E8%AB%96%E3%81%AB%E3%82%88%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E9%A0%88%E5%B1%B1-%E6%95%A6%E5%BF%97/dp/4061538322)

# 目次
[0. モデルの説明](#0-モデルの説明)
[1. ライブラリ](#1-ライブラリ)
[2. 推定する分布](#2-推定する分布)
[3. 事前分布](#3-事前分布)
[4. 事後分布](#4-事後分布)
[5. 予測分布](#5-予測分布)

#0. モデルの説明
![IMG_0180.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/2d29c952-ef18-aae2-f4e1-37ce1cda0282.jpeg)

#1. ライブラリ
```R:
library(dplyr)
library(ggplot2)
set.seed(100)
```


#2. 推定する分布
ある顧客が商品Aを購入する真の確率は0.8ですが、僕たちはそれを知りません。
この、真の確率0.8を事後分布で推定します。

```R:
NULL %>% ggplot(aes(x = c("1", "0"), y = c(0.8, 0.2))) + 
  geom_bar(stat = "identity") + ylim(0,1) + 
  labs(x="購買する(1) / 購買しない(0)", y="確率", title="推定する分布") +
  scale_x_discrete(limits=c("1", "0")) 
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/768cb283-3646-bfbe-8bad-bb5dddda9b2d.png)



#3. 事前分布
事前分布として、ベルヌーイ分布の共役事前分布であるベータ分布を指定します。
この事前分布は、商品Aを購入する確率は0.5が一番ありそうだが、あまり自信がないことを表しています。

```R:
a0 <- 2
b0 <- 2
curve(dbeta(x, a0, b0), 0,1, xlab="購買する確率", ylab="確率密度", ylim = c(0,10))
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/e00a0e7b-199c-3d04-0f07-7338eb9a639b.png)



#4. 事後分布
真の分布から100個サンプルを取って事後分布を推定します。
事後分布は緑の曲線です。0.8付近が一番出やすいと推定できています。

```R:
N <- 100
X <- rbinom(N, 1, 0.8)
a <- sum(X)
b <- N-a
curve(dbeta(x, a0+a, b0+b), 0,1, xlab="購買する確率", ylab="確率密度", add=T, col="green")
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/fd594c37-b626-d92b-ad96-52b4192e84cb.png)


#5. 予測分布
予測分布が、真の分布をうまく推定できていることが分かります。

```R:
Data <- data.frame(x=rep(c("1", "0"),2), y=c(0.8, 0.2, a/(a+b),b/(a+b)),
                   compare=rep(c("推定する分布", "予測分布"),each=2))
Data %>% ggplot(aes(x=x, y=y, fill=compare)) + 
  geom_bar(stat="identity", alpha=0.5, position="identity") +
  labs(x="購買する(1) / 購買しない(0)", y="確率密度", title="推定する分布と予測分布の比較") +
  scale_fill_manual(values = c("black", "blue")) +
  scale_x_discrete(limits=c("1", "0"))
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/bd9c4a0a-9535-f33e-839e-3f7128e4623f.png)


◯SNS
・youtube
https://youtube.com/channel/UCFDyXEywtNhdtwqC3GAkYuA

・Twitter
https://twitter.com/Dken_ta
react-hook-form Tips

## 空のForm
バックエンド用に値が必要なときなどに使えます
asにフラグメントを置くところがポイント。

```jsx
<Controller
  name={'id'}
  as={<></>}
  defaultValue={1}
/>
```

### 初期値の参照
useFormで指定した初期値を後から参照することができます。
control経由で取得。

```jsx
const methods = useForm({defaultValues: 1});
console.log(methods.control.defaultValuesRef.current) //1
```
CloudFunctionsでlinebotを動かすメモ　まだ準備までソース書いてない

#準備
CloudFunctionsでnode.jsを使おうと思うが、インラインエディタだと、npmとか出来なさそう。
つまり、そのままやるなら自力でpackage.jsonを書く必要がある。
⇒そんなめんどくさいことは嫌なので、どこかコンソールがあるところで作業しないと。

出来ればCloud上で終わらせたい。あまりPCスペックがよくないのと、どこからでもアクセスできるようにしておきたい。

どこかでソース編集（CloudFunctions）＋ライブラリのinstallなど→
ソース管理ツール（GitHub）→
CloudFunctionsへデプロイ

の流れでいこう。

１．gitHubにリポジトリを作成
２．CloudShell上から git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORY
３．ソース作成
４．デプロイ

CloudFunctionsって、サーバレスな仕組みやけど、
httpリクエストを受けたときのアクションの書き方ってどうするんやろか、また次回。


#参考サイト
[githubのクローン](https://docs.github.com/ja/free-pro-team@latest/github/creating-cloning-and-archiving-repositories/cloning-a-repository)

[QiitaLINEのEchoBotをCloudFunctionsで作ってる](https://qiita.com/matsubara0507/items/04ab3c2197aa5f68e499)
ASP .Net Core Tips - 日付入力について

#概要
ASP .NET CoreでWebアプリを作成すると、
いろいろと自動的に作られて楽なんだけど、
日時データの入力まわりをちょっと変えようと思ってやってみたら・・・うまくいかなくて・・・
いろいろ調べて試行錯誤しつつ・・・

結局、Microsoft社のdocsをちゃんと読んだら書いてあったっていう話。

#やりたかったこと
ASP .Net Core 3でDateTime型のプロパティを持つModelクラスを作成し、
「新規スキャフォールディングアイテムの追加」から
「Entity Frameworkを使用したビューがあるMVCコントローラー」項目を使って
自動的に画面を生成する。

Createのビューを表示させると、
DateTime型のプロパティに対応するinputタグには
自動的に日時を選択するピッカーが表示されるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/8a562e28-dc4f-2a17-6e77-8c9b37e7d2bb.png)

これを日付だけを選択するピッカーが表示されるようにしたい。

#方法
googleさんで検索すると、他のdatepicker/datetimepickerを導入する方法がヒットしたり。
⇒そっちじゃないんだ・・・。

ブラウザのDevToolなどを使って、該当のinputタグのtypeを調べてみると、

```html
type="datetime-local"
```
となっているので、typeがdateになるように指定すればいいのではないかと思いながら、
docsのページをあさってみると、こんなページが。
[https://docs.microsoft.com/ja-jp/aspnet/core/mvc/views/working-with-forms](https://docs.microsoft.com/ja-jp/aspnet/core/mvc/views/working-with-forms?WT.mc_id=DOP-MVP-4028478)

Modelクラスの該当プロパティに
以下のようにデータ注釈属性を指定してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/61526627-6e18-664e-a047-b3b7bf8adbc0.png)
DataTypeにDateを指定します。
DataとDateがややこしいですが（笑）。

そうすると、こんな感じに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/262a4c03-d520-eae5-4db5-fd388dbe4ee5.png)
BFFメモ

# 正式名称
Backends For Frontendsの略
https://samnewman.io/patterns/architectural/bff/

# とは
クライアントサイドに特化した機能提供を行う。
背後により特化したAPIを構える。

BFFは、クライアント端末の種類によって分ける。

### 似たもの
* MVCアーキテクチャのView
* 三層アーキテクチャのPR層

## メリット
* 多様な端末に対する対応するBFFを列挙することで個別対応する層と統一的に利用するバックエンドAPIを分離する
* UI要件におけるバックエンド要件をインタフェース化できるので、バックエンドと役割分担しつつ、バックエンドAPIをスタブ化して開発できる

アクセス端末が多種にわたるようなサービスの場合は効果があると思われる。
PC,モバイルくらいのサービスなら別に要らないと思う。

## Q:レスポンシブなサイトはBFF分割されない？
レスポンシブ化するだけで、BFF分割する要件が消えるならBFF必要案件ではないと思う。

# 採用基準
BFFは、クライアントからのリクエストプロトコルが統一的に記述できないから選択するものだと思う。
BFFはやりたくてやるものではなくて、やらざるを得ないからやるものだと思う。
何らかの理由でHTTPリクエストを発行できない特殊端末がサービス提供先にあるから対応する、とか。

# 複数のAPIを束ねたいなら
API Gatewayサービスがあるのでそちらの採用を検討する。

* GoogleのApigee 
* AWSのAmazon API Gateway
* Azure API Management

独自にBFFを作る理由がそれでもあるのか、よく検討したい。

# 事例
## Line
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87538/b816542a-d4f1-bf4a-69b4-d6f290b74fd7.png)
[実践マイクロサービス ─ コンポーネント分割やトラブル回避の考え方をLINEの導入事例に学ぶ](https://eh-career.com/engineerhub/entry/2018/10/09/110000#LINE%E3%81%A7%E3%81%AA%E3%81%9C%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%8C%E5%B0%8E%E5%85%A5%E3%81%95%E3%82%8C%E3%81%9F%E3%81%AE%E3%81%8B)
マイクロサービスの分割の事例紹介になっているが、先頭のShop-proxyとLINE STOREはBFFが別れていると見ることもできる。マイクロサービスがBFFかそうでないかは置いといて。
Qiitaへの投稿ができない際に確認すること

# はじめに
Qiitaにていつもの通り記事を投稿しようとした際、投稿ボタンを押しても投稿できない問題に直面しました。

色々調べてみたものの、解決できなく運営の方に問い合わせをして無事解決できましたのでご共有させていただきます。

# 原因
タグに「/」を使用していることが原因でした。タグで「/」が使えないという仕様を知りませんでした笑。

たしかにタグ検索した場合　https://qiita.com/tags/[タグ検索ワード]　
となるためタグ内に「/」が使えないのは当然でした。
もし、同様に躓いてしまった方がいましたらご参考にしてください。

タグで「/」が使えない旨をエラーとして表示されるよう修正してくださるとのことでしたので、そのうち修正されるかと思います！

どうしても解決できない場合は運営の方に問い合わせてみるといいかもしれません。

# 運営の方からのメッセージ
運営の方に問い合わせた際、下記のことを試してほしいと言われたのでご紹介します。

1. ブラウザのキャッシュ削除、拡張機能のオフを行った上で再度試す
2. 別のブラウザで再度試す
3. 別の回線で再度試す

上記の手順で試してだめだった場合は下記2点を送ってほしいとのこと
1. コンソールにエラーが表示されている場合は、エラーのキャプチャ
2. 環境（ブラウザとブラウザのバージョン）

また、下書きページのURLも送るといいと思います。

# まとめ
今回はQiitaへの投稿が出来ない際に確認することをご紹介させていただきました。
運営の方にはお忙しい中、とても丁寧かつ迅速な対応をしていただきました。
ありがとうございました！
Javaの基本的な日付操作

人、時間、物、金を扱うプログラムは難しくなる

そんな中で時間を扱ったのでメモ

まずJavaで日付を使用するには以下をインポートする必要がある。

```Java
import java.util.Date;
```
その後はいつものインスタンス化

```Java
//日付のインスタンス化
Date date = new Date();
```

で、今回は過去日をエラーとする処理を組むので２つの処理を入れました。
今回は日付のみで時間だけでエラーチェックするようなので以下のファイルもインポートしました。

```Java
import java.text.ParseException;
import java.text.SimpleDateFormat;
```

java.text.ParseExceptionは日付型から文字列に変更するヤツです。
java.text.SimpleDateFormatは「YYYY-MM-DD」とかに変更できるヤツです。

```Java
String nowDate = sdFormat.format(date);
```

まずは、SimpleDateFormatで現在日を取得します。
サーバーから現在日取れるのは便利ですね。


```Java
checkDate = sdFormat.parse(checkStr);
```
その後、ParseExceptionでString型をData型に変換します。
これはtry/catchでくくらないとeclipceから怒られます。

それでなんだかんだ試行錯誤してみたのがコチラ

```Java
if (date.after(checkDate)) {
  if(!nowDate.equals(checkStr)) {
    //エラーの時の処理を書く
  }
}
```

date.afterと同じ日付の時はエラーにしました。
これで「選択日 > 日付」の場合エラーになります。

PHPは型操作とかあまり気にせず組めましたが、Javaは型をキッチリ宣言して、変更するときも明示しないといけないので大変ですね。

そしてJSPに書いたHTML5ですが…

```HTML
<input type="date" name="date" required value=<%=dateStr %>>
```

日付型凄く便利ですね。

valueに値を入れたら初期値としてセットされますし。


従来なら「8桁の数字で入力してください。」とか注釈を入れたもんですが。
「YYYY-MM-DD」形式で値を飛ばしてくれるので非常に楽です。

操作する側もカレンダーが表示されて選択できますし、双方に利があって凄く便利でした。
Djangoで管理画面のユーザー名・パスワードを忘れてしまった時



Djangoを久しぶりに開いたらsuperuserのユーザー名もパスワードも忘れてしまっていたので、
コマンドたたいて確認する方法の忘備録です。


pythonコマンド立ち上げる。

```py:
>>>from django.contrib.auth.models import User
>>>users = User.objects.all()
>>>user = users[0]
>>>user
<User: 忘れていたユーザー名>
>>>user.set_password('お好きなパスワードを設定してください')
>>>user.save()
```

これで新たなパスワードが設定できるので、
管理画面からログインできるようになりました。
Ruby irbで日本語入力する / irb(main):001:0> '\U+FFE3\U+FFE3\U+FFE3\U+FFAB

# irbとは
今回は、[プロを目指す人のためのRuby入門](https://ruby-book.jnito.com/)の１章で出てきた
irbで日本語入力できるようにする工程に少してこずったので備忘録として残しておきます。

irbを使えば対話的にプログラミングを実行できます。
テキストエディタに書き込み、それをターミナルで実行する、という手順をしなくても
irb上でテキストエディタと同じ内容を書き込むだけで、手軽にRubyの動作を確認できます。

![スクリーンショット 2020-11-02 15.56.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664818/4f469988-8099-d309-4c35-304d19e6282b.png)

(図：irbでの動作確認)

#irbで日本語入力できない場合

irbを起動し、日本語入力をしてみてください。

```ruby:terminal
irb(main):001:0> '\U+FFE3\U+FFE3\U+FFE3\U+FFAB
```

このような状況になってしまっていると、日本語入力と出力ができていないです。
以下、解消法となります。

# 試してみた記事と手順

[irbで日本語が入力できなかった時の対応方法](https://qiita.com/masanarih0ri/items/2182d47b6c0207a5d9ce)
[irbで日本語入力できない、rbenvでRubyのバージョンが指定できない](https://qiita.com/kazama0119/items/f6253e308ff541ba2cf4)

上記２つを試してみたのですが、うまくいかなかったです。

つぎに、「[Macのirbで日本語入力が文字化けするときの対処法](https://reasonable-code.com/ruby-readline/)」を参考にやってみたところ、

```ruby:terminal
appurunoMacBook-Air:~ apple$ rbenv version
system (set by /Users/apple/.rbenv/version)
```

と、記事にはあるはずの「2.5.3 (set by /Users/donchan922/.rbenv/version)」がなかったので、おかしいと思い rbenv のバージョンについて調べました。

「[rbenvでrubyのバージョンを管理する](https://qiita.com/hujuu/items/3d600f2b2384c145ad12)」こちらの記事を参考に、手順を踏んでいきます。

```ruby:terminal
appurunoMacBook-Air:~ apple$ rbenv --version
rbenv 1.1.2
appurunoMacBook-Air:~ apple$ rbenv install --list
2.5.8
2.6.6
2.7.2
jruby-9.2.13.0
maglev-1.0.0
mruby-2.1.2
rbx-5.0
truffleruby-20.2.0
truffleruby+graalvm-20.2.0

appurunoMacBook-Air:~ apple$ rbenv versions
* system (set by /Users/apple/.rbenv/version)
  2.5.0
  2.5.1
  2.5.7
```

systemのほかにもバージョンが増えました！
次に下記の手順を踏み、irbを起動したら無事に日本語入力ができました。

```ruby:terminal
$ rbenv global 2.5.0
$ rbenv version
2.5.0 (set by /Users/owner/.rbenv/version)
appurunoMacBook-Air:~ apple$ irb
irb(main):001:0> 'こ'
=> "こ"

```

よかったです！

### 参考記事
[irbで日本語が入力できなかった時の対応方法](https://qiita.com/masanarih0ri/items/2182d47b6c0207a5d9ce)
[irbで日本語入力できない、rbenvでRubyのバージョンが指定できない](https://qiita.com/kazama0119/items/f6253e308ff541ba2cf4)
「[Macのirbで日本語入力が文字化けするときの対処法](https://reasonable-code.com/ruby-readline/)」
「[rbenvでrubyのバージョンを管理する](https://qiita.com/hujuu/items/3d600f2b2384c145ad12)」
OBSにATEM MiniProをFULLHD(1920×1080)で認識させる方法

<h1>■ はじめに </h1>
<h>近頃、某パンデミックの影響で配信機材需要が高くなっている影響か、Qiitaでも配信機材や配信ソフトウェアの記事を多く見かけるようになりました。<h/>

<h>今回は、今年上半期に売り切れ続出したBlackmagic Design ATEM Mini ProとYouTubeライブなどで必須ソフトウェアとも過言では無い、OBSの接続についての小技の紹介です。<h/>

<h>現状(2020年11月2日現在)OBS上のデフォルト解像度設定では、1280×720しか認識しません。今回は、ATEM Mini ProをOBSにFULLHD(1920×1080)で認識させる方法をご紹介したいと思います。 <h/>

<h1>■使用機材/ソフトウェア </h1>

<dl>
 <dt>Blackmagic Design ATEM Mini Pro</dt>
 <dd><a href="https://www.blackmagicdesign.com/jp/products/atemmini">Blackmagic Design ATEM Mini Pro</a> </dd> 
<dd>今回はATEM Mini Proを使用しますがATEM Miniシリーズであれば基本は同じかと思います。</dd>
 <dl> 
<dt>OBS (Open Broadcaster Software)</dt>
 <dd><a href="https://obsproject.com/ja">OBS</a> </dd>
<dd>今回はMac版 26.0.0-rc1(64bit)を使用しています。</dd>

<h1>■OBSでの設定</h1>

<h>**OBSにATEM Mini Proを認識させる** <h/> 
<h>端末にUSB-CケーブルでATEM Mini Pro(以下ATEM)を接続します。<h/>
<h>端末のOBSを起動させてソースから＋(追加ボタン)を選択、ソース選択画面から映像キャプチャデバイスを選択します。<h/> 
<h/>![00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277603/8f5c12f1-eded-9f27-925e-b8632bf22ff2.png)

<h>新規作成に適当な名前を入れてOKを押して進みます。<h/>
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277603/f15ec9f5-6ead-5104-fa40-fb6c115d0337.png)

<h>キャプチャーデバイスのプロパティが表示されますのでデバイス選択画面からBlackmagic Designを選択します。<h/>
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277603/49fdaa25-c3fd-0678-d276-6a10ce8fcd5a.png)

<h>通常のセッティングですとプリセット使用にチェックが入っており、プリセット選択画面に720Pまでしか選択できません<h/>
![スクリーンショット 2020-11-02 15.42.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277603/174c5ad5-abef-8a91-2e35-55d83b1c37f1.png)

<h>プリセットを選択してOKを押すとOBSにATEMが720Pの状態で認識されます。<h/> 

<h>**OBSにATEM Mini Proを1080Pで認識させる** <h/> 

<h>先ほどのプロパティ画面のプリセット使用にチェックを外すとプリセット選択項目がResolution選択項目に切り替わります。<h/> 

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277603/5e84c13f-01bf-eb51-9af2-c755ad5a6595.png)

<h>Resolution選択画面にATEM Mini Pro適合解像度の1920×1080が表示されるので選択します。<h/> 

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277603/5ba7998e-be99-fbfa-daad-4bdd7bc4e628.png)

<h>また、フレームレートも30に設定してOKを押します。 <h/> 

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277603/aa3df18f-870b-e2ad-ba10-ff6f4518846d.png)

![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277603/771500fd-ee6d-d4e5-c760-f14763c66652.png)


<h>これでATEM Mini Proの映像がOBSにFullHDで表示されるようになりました。<h/> 

<h1>■ まとめ </h1>
OBSやATEM Miniはオンライン配信にはマストアイテムといっていい機材ですがOBSはオープンソースの為、マニュアル等情報が乏しく、ATEM側は機器との接続以降のマニュアルがケースバイケースの印象です。

これからもちまちまと小技を公開できればと思います。

<h1>■ 参考文献 </h1>

1. <a href="https://rental.pandastudio.tv/blog/atemminipro_introduction-2-2-2/">ATEM Mini OBSでYouTubeLiveを配信する方法の解説ビデオを公開）</a> </dd>

2. <a href="https://www.s-ichiryuu.com/gaget/2020-0618-1600/#OBSATEM_Mini">【詳細解説】Atem Mini と OBS Studio を使ってYouTubeライブ配信ができるまで</a> </dd>
Amazon SES でプライベートサブネット内からメールを送信する際の注意点(2020年11月時点)

## はじめに

DX 技術本部 の yu-yama です。
ややハマりしたので、同じ楔を踏む人が減ることを祈り、UP します。

## TL;DR
AWS SDKではなく、[SMTP インターフェイス](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-using-smtp-programmatically.html)を使用して送信しましょう。
2020年11月現在、 AWS SDK の Amazon SES API を用いて Amazon SES のメールを送信することはできません。

## Amazon SES が東京リージョンにきました
![sesmail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534812/85281b20-8064-72b3-c332-ff38b3f943f2.png)
[Amazon SES 東京リージョン対応のお知らせ \| Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/amazon-ses-tokyo/)
2020年7月、Amazon SES が東京リージョンに対応しました。
対応したことで、VPC エンドポイントを作成し、プライベートサブネット内からメールが送れるようになりました。

## Amazon SES を使用してメールを送る方法は 2 種類ある

1. SMTP を使用する方法
    - [SMTP を使用して Amazon SES から E メールを送信する \- Amazon Simple Email Service](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-an-email-using-smtp.html)

1. AWS SDK を使用する方法
    - [AWS SDK を使用して Amazon SES から E メールを送信する \- Amazon Simple Email Service](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-an-email-using-sdk.html)

## 現在 AWS SDK から Amazon SES API 越しには送れない

-   AWS に問い合わせて理解できたのですが、現在 **VPC エンドポイントを作成できるのは SMTP エンドポイントのみ。** 
    AWS SDK は API エンドポイントを用いてメールを送信しており、 **SES API エンドポイントは VPC エンドポイントに対応していません。**

# 最後に

プライベートサブネットから Amazon SES を用いてメールを送るときは、

1. VPC エンドポイント(サービス名:com.amazonaws.ap-northeast-1.email-smtp)を作成する
1. [Amazon SES SMTP 認証情報](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/smtp-credentials.html)を取得する
1. 上記認証情報を利用して、[E メールを送信する](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-using-smtp-programmatically.html)

   の流れで送りましょう。

はやく API エンドポイント対応してくれ～
『できるAccess2019』活用編

#活用編振り返り
『できるAccess2019』全て完了しました。

後半の活用編の内容は下記の通りでした。

活用編
第1章：リレーショナルデータベースを作成する
第2章：入力効率がいいフォームを作成する
第3章：クエリで複雑な条件を指定する
第4章：レポートを自由にレイアウトする
第5章：マクロを使ってメニューを作成する

「レポートとマクロは軽視で大丈夫」「実際に業務でレポートはまず使わない」「結果をCSVで吐き出して、それをエクセルで見やすくグラフ化する事の方が多い」とワロ先生より教えていただいていたので、4章のレポートはさらう程度にしました。5章のマクロについては、自動化のボタンを作るのが楽しそうで興味があったので、普通にやってみました。CSVで吐き出すことについては、付録に「AccessのデータをExcelに取り込むには」というコーナーがあったものの、本書では触れられていませんでした。

#『できるAccess2019』感想
Access。9月にワロさんに教えていただいて、初めてその存在を知りました。少し調べて、Excelとの違いをザクッと把握し、何だか便利なものなのねと思ったものの、その詳細はまだ理解できていませんでした。
本書に取り組んだことでAccessがデータベースを扱うソフトだということがわかり、その基本的な操作方法を知る事ができました。

事前に『マンガでわかるデータベース』『スッキリわかるSQL入門~』を読んでリレーショナルデータベースの概要をざっくりと把握していたので、大きくつまずかずに進められました。が、データベースの知識がゼロだったら、私は本書を進めることがもっとキツかっただろうなと思います。

先に2冊でざっくりと全体像を見たからこそ、テーブル、クエリ、短いテキスト/長いテキスト、ワイルドカード...等が出てきても、「あ、あの関数のことかな」とか、「これはAccessだとAccess自身のフォーマットである日本語から選択しているけれど、あの関数のことだろうな」とか、ぼやっとでも認識することができました。また、本書では触れられていませんでしたがAccessのSQLビューで、SQLの実際の使い方を少しかいま見ることができました。

いきなり本書から入ってもなんとなく理解できたでしょうし、Accessの操作方法を覚えることはできたと思います。が、その後どのみちデータベースやSQLの基本を学ぶ必要はあったと思います。先にデータベースの基本を学んでからAccessを学べて良かったです。

#次は
Udemyの動画2本
・[【ここから始める】アクセス基礎コース アクセスの初心者でも安心このコースからAccessを始めよう！](https://www.udemy.com/course/access-v/)
・[誰でもわかるMicrosoft Access 2019](https://www.udemy.com/course/access-2019/)
を視聴して、Accessの総復習をします。
その後、Accessで年賀状の宛名印刷をしてみます。


#参考
・『できるAccess2019』インプレス（書籍）

#進捗記録
2020/9/15：データベースの学習スタート
2020/9/15～9/21：『マンガでわかるデータベース』オーム社 6章中1～4章（Qiita記事2本）
2020/9/22～10/9：『スッキリわかるSQL入門第2版ドリル222問付き！』インプレス 12章中1～9章（Qiita記事3本）
2020/10/19～11/2：『できるAccess2019』インプレス (Qiita記事2本)
Ruby の sum は地味にすごい話

# はじめに
速い速いと評判の`sum`が本当に速かった話
# 今回のお題
*[AtCoder Beginner Contest B - Trapezoid Sum](https://atcoder.jp/contests/abc181/tasks/abc181_b)*
<font color="gray">Difficulty: 27</font>

今回のテーマ、等差数列の和

題意としては、普通に加算すると`TLE`するので、等差数列の和の公式

```math
S=n(a+b)/2
```
を使いましょうというもの。
# inject(TLE)
```ruby.rb
n = gets.to_i
sum = 0
n.times do
  a, b = gets.split.map(&:to_i)
  sum += (a..b).inject(:+)
end
puts sum
```
見事に`TLE`
# sum(AC)
```ruby.rb
n = gets.to_i
sum = 0
n.times do
  a, b = gets.split.map(&:to_i)
  sum += (a..b).sum
end
puts sum
```
普通に通ります。
`range`の`sum`は内部的に、等差数列の和の公式を使っていると思われます~~（適当）~~
どうやら本当だった様子。
コメント欄を参照願います。

||Ruby(inject)|Ruby(sum)|
|:--:|:--:|:--:|
|コード長 (Byte)|110|103|
|実行時間 (ms)|TLE|135|
|メモリ (KB)|14344|14392|
# まとめ
+ ABC 181 B を解いた
+ sum は速かった
React Hooksの活用

なにやらコードをシンプルにして記述ができる方法があるらしいのでそれを学んでいきましょう
#hookって何
* クラスの機能を`Function Component`で使える様になる
* 後方互換なので、後付けから導入しても、今までの機能に支障がない

基本的にはこんな感じ

じゃあなんで使うのかというと、`Class Component`は少しややこしくて、`Function Component`でシンプルにコーティングしたいからっていうのがあるんです

`Class component`は`this`の使い方とか`state`の扱い方とか難しいらしいんですよね
また、ライフサイクルメソッドを使う時も、いちいち`componentDidMount()`とか`componentWillUnmount()`とかを別に分けて記述しなければならないんですよね
でも一つのライフサイクルなんだから一つにまとめたいじゃないですか

それを可能にするのが`hook`なんです！！

#useState()を使う
じゃあhookをどうやって使うのかというと、、

```
import React, {useState} from 'react';
```
こいつを記述してuseStateメソッドを使える様にする
そして宣言

```
const [state変数名, state変更関数名] = useState(state初期値);
```

あとは　JSX内で使うだけですねーー

```
<input type = "checkbox" checked = {state関数名} id = "check" onClick = {() => state変更関数名(渡す値) }/>
```

こんな感じ

いちいち`this`を記述して、これなに？？ってならなくなるのは良いことですねーーー
どんどんシンプルな記述をマスターしていきたいですねーーーー
【ざっくり解説】pluckメソッドと結婚したい

突然ですが…

①あなたの身近にいる「とてつもなく仕事ができる同僚」を思い浮かべてください。
②あなたの「奥様」。あるいは「理想的な女性（男性）」を思い浮かべてください。

その二人をmergeしたようなメソッド。とてつもなく仕事ができて、なおかつ朗らかで柔らかい。それこそが今回ご紹介する「pluck（プラック）メソッド」なのです。

(…すみません真面目にやります)


## 概要
この記事は、

1.pluckとはどのようなメソッドなのか
2.pluckはどのような場面で使えるのか

について解説を行うものです。
（※すでにpluckメソッドを使いこなしている方にとっては、この記事は無益です。）

## pluckとはどのようなメソッドなのか

結論、__「あるカラムの値を配列で取得する」__メソッドです。

テーブルを例に解説します。

### usersテーブル（ id, name, age ）

|  id  |    name   |  age  |
|:----:|:---------:|:-----:| 
|  1   |  ken      |   21  |
|  2   | takuya    |   22  |
|  3   | masato    |   29  |
|  4   | kouta     |   24  |
|  5   | hirokatsu |   23  |
|  6   | yuuhei    |   28  |
|  7   | takumi    |   25  |
|  8   | akihito   |   26  |

例えばこのようなテーブルがあった場合、pluckメソッドを使うことで、

```rb:users_controller.rb
@users = User.pluck(:id)

# 以下出力結果 
@users = [1, 2, 3, 4, 5, 6, 7, 8]
```

このように、__モデル名.pluck(カラム名)__とすることで、そのカラムの中身を配列として取得することができました。

さらには、第二引数を指定することもできて…

```rb:users_controller.rb
@users = User.pluck(:id, :name) #第二引数にnameを指定

# 以下出力結果 
@users = [ [1, "ken"],[2, "takuya"],[3, "masato"],[4, "kouta"],
[5, "hirokatsu"],[6, "yuuhei"],[7, "takumi"],[8, "akihito"] ]
```
このように複数の引数を渡して、配列で取得することも可能です。
第三引数、第四引数を渡しても同様に配列で取得します。

ちなみに配列なので、取得方法は多少変わりますが、

```rb:users_controller.rb
@users = User.pluck(:id, :name) #第二引数にnameを指定


@users[0][1] = "ken" #最初の配列 [1,"ken"] の2番目の要素なので　"ken"　を取得  
@users[3][0] = 1  #4番目の配列[4,"kouta"] の1番目の要素なので 1 を取得
```

のように、中身を取得することができます。




## pluckメソッドを使うとできること

では、pluckメソッドを使うとどんなことができるのでしょうか？

### あるカラムに特定のレコードが存在するか調べることができる
例えば、「Userモデルの中に24歳のデータがあるか調べたい」場合、

```rb:users_controller.rb
User.where(age: 24).exists?
# => true
```
上のようにすると取得できますが、pluckメソッドを使うと

```rb:users_controller.rb
User.pluck(:age).include?(24)
# => true
```
このような式で取得することができます。
__「…いやどっちでもよくね？」__と思われるかもしれませんが、この2つなら私はpluckを使います。理由は次で説明しますね。



### データの取得速度が向上する
先ほどの2つの式は、一見すると結果は同じに見えます。
しかし、行われている処理や、取得しているデータの数は全く違います。

```rb:users_controller.rb
User.where(age: 24).exists?
```
↓　この時発行されるクエリ（SQLに対する命令）がこちらです　↓

```sql:MySQL
User Exists? (0.6ms)  SELECT 1 AS one FROM `users` WHERE `users`.`age` = 24 LIMIT 1
=> true
```
それでは、pluckメソッドを使うとどうなるのでしょうか？

```rb:users_controller.rb
User.pluck(:age).include?(24)
```
↓　発行されるクエリ（SQLに対する命令）がこちら　↓

```sql:MySQL
(0.5ms)  SELECT `users`.`age` FROM `users`
=> true
```

明らかに短いのがお分かりでしょうか？
処理にかかる時間も、0.1ミリ秒違います。

前者では、「24歳のユーザーが存在するかどうか」を調べているのに対し、
後者は「ユーザーの年齢の中に24歳のデータがあるかどうか」を調べています。

つまりpluckを用いることで、
__必要なカラムのみを取得できるため、クエリが短くなり、処理が早くなる__ということです。

データが増えれば増えるほど、処理速度の差は開きます。
「ポートフォリオを作ったけど、なんだか処理がもっさりしてるな…」という方は、データ取得の記述を見直してみてはいかがでしょうか？

##まとめ

①pluckメソッドは、__「あるカラムの値を配列で取得する」__メソッド
②pluckを使うことで、場合によっては無駄なクエリの発行を押さえ、__処理速度が向上する__

少しでもpluckメソッドの良さが伝わっていれば幸いです…
最後までご覧いただき、ありがとうございました。
【Android】ActionBarでハマったこと

# importが違った
`ActionBar bar = getSupportActionBar();`
で、赤い波線が出てエラーが出てしまっていた。
警告を読めばわかることだが、原因はimportしているActionBarが違っていたでした。

* NG

```java
import android.app.ActionBar;
```

* OK

```java
import androidx.appcompat.app.ActionBar;
```

# ActionBarの文字の色を変更する方法
```xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ...
    <item name="actionBarStyle">@style/CustomActionBar</item>
</style>

<style name="CustomActionBar" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
    <item name="titleTextStyle">@style/CustomActionBarTitleStyle</item>
    
</style>

<style name="CustomActionBarTitleStyle" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
    <item name="backgroundColor">@color/teal_700</item>
    <item name="android:textColor">@color/teal_200</item>
</style>
```

## でも、まだハマっています…

しかし、上記のやり方では、Themeが
`<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar">` の場合だと、文字の色は変わらなかった。

Themeは変えたくない場合、どうすれば良いのだろう。
styleでがんばる方法がなかったら、ActionBar.setCustomView()するのでしょうか？
【Laravel】送信したメールの開封検知をする

Laravelから送信したメールが既読されたかどうか、開封検知機能を実装します。

# 注意点
メールを受け取った側のメーラーアプリが**HTMLメールを受信できることが前提**です。逆に言えばHTMLを受け取れない場合、自動でテキストメールに変換してしまう場合等は開封検知ができません。

また、この方法では開封されたかどうか正確に検知することができません。実際には開封していないのに「開封した」と判断するパターンや、開封したのに検知することができないパターンなどがあります。

# 仕様
「1x1の透明な画像をHTMLメールに埋め込む」ことで開封検知をします。
1x1画像用のルーティングを用意し、そのURLにアクセスがあった場合にDBに記録する、という形とします。

# 動作環境
・PHP 7.4.11
・MySQL 8.0.21
・Laravel Framework 8.10.0

全てローカルで動作させます

# 実装
### .envファイルの修正
メールのドライバはsmtpでmailtrapを使用します。

```Env:.env
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=[mailtrapで指定された値]
MAIL_PASSWORD=[mailtrapで指定された値]
MAIL_ENCRYPTION=tls
```

### ログ保存用のモデル作成
```
$ php artisan make:model Log -m
Model created successfully.
Created Migration: xxxx_xx_xx_xxxxxx_create_logs_table
```

```PHP:xxxx_xx_xx_xxxxxx_create_logs_table.php
class CreateLogsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('logs', function (Blueprint $table) {
            $table->id();
            $table->string('user_agent');
            $table->string('ip_address');
            $table->timestamps();
        });
    }
~~省略~~
```

- ログ保存用のモデル「Log」はユーザーエージェントとIPアドレスをカラムとしてもたせます

```PHP:Log.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Log extends Model
{
    use HasFactory;

    protected $guarded = ['id'];
}

```

### 開封検知用ルーティングを定義
```PHP:web.php
use App\Http\Controllers\OpenLogController;

Route::get('images', [OpenLogController::class, 'openMail'])->name('open_mail');
```

### 開封検知のコントローラー作成
```
$ php artisan make:controlle OpenLogController
Controller created successfully.
```

```PHP:OpenLogController.php
<?php

namespace App\Http\Controllers;

use App\Models\Log;
use Illuminate\Http\Request;

class OpenLogController extends Controller
{
    public function openMail(Request $request)
    {
        // リクエストからUAとIPアドレスを取得して保存
        Log::create([
            'user_agent' => $request->userAgent(),
            'ip_address' => $request->ip(),
        ]);

        // 透明な1x1のpng画像をクライアントへ返却
        return response(base64_decode("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQI12NgYAAAAAMAASDVlMcAAAAASUVORK5CYII="))
            ->header('Content-type', 'image/png');
    }
}
```

透明な1x1のpng画像の点は[nanowebさん](https://qiita.com/nanoweb)の[こちらの記事](https://qiita.com/nanoweb/items/b702c2b0ae698cb6c6f4)を参考にさせていただきました。

### メール送信用のルーティングを追記
```PHP:web.php
Route::get('send', function () {
    Mail::send('mails.hello', function ($message) {
        $message->to('john@johndoe.com', 'John Doe');
        $message->subject('Subject');
    });

    return "メール送信完了";
});
```

### メールテンプレートの作成
```PHP:resources/views/mails/hello.php
<h1>テストメール</h1>
<img src="{{ route('open_mail')}}" alt="">
```

- imgタグのsrc属性に開封検知用のルーティングを設定。開封時にログを取得、その後に1x1の透明なpngを返却しています

### テスト
`php artisan serve`でビルトインサーバーを起動してlocalhost:8000/sendにアクセスすると、メール送信に数秒秒かかったのちに「メール送信完了」と表示されます。

mailtrap側に届いているメールを開くとDBにLogが保存されているはずです。

以上、HappyなLaravelライフを🎉
TypeScriptのSnippet集

## オブジェクトのユニオン型からkeyを抽出する
```ts
type KeysOfUnion<T> = T extends any ? keyof T : never;
```
```ts:使用例
type ObjType1 = {key1: string, key2: string};
type ObjType2 = {key3: string};

type ObjType = ObjType1 | ObjType2;
type ObjTypeKey = KeysOfUnion<ObjType>; // "key1" | "key2" | "key3"
```
#### 参考
https://stackoverflow.com/questions/49401866/all-possible-keys-of-an-union-type

## Generic型のMapped Types
Generic型に型引数を指定したUnion型を作る

```ts
type ValueType = "a" | "b";
type ObjType<T extends ValueType> = {value: T};

type ObjMappedType = {[key in ValueType]: ObjType<key>;}[ValueType];
// ObjType<"a"> | ObjType<"b">
```
#### 参考
https://github.com/Microsoft/TypeScript/issues/27272
サーブレット/JSPでWebアプリケーションを作るまで（その１）

#はじめに
プログラミング言語（Java）を勉強してきた約1年を振り返っていきたいと思います。
勉強するにあたって、目標にしたのがWebアプリケーションの作成です。
###Webアプリケーションの仕組み
Webアプリケーションの仕組みについて以下にまとめました。
![スクリーンショット 2020-11-02 131507.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603568/5c093bbc-7808-0c55-d597-b40308dfc90d.png)
厳密にはもっと細かいのですが、大まかにはこういった仕組みで出来ています
上記のアプリケーションサーバを作成するにあたってJavaだけでなく、データベース（SQL）、
サーブレット/JSP、HTML/CSSという技術を学びました。
#学習言語と流れ

Webアプリケーション開発の為に学習してきたプログラミング言語、流れは以下の通りです。
![スクリーンショット 2020-10-30 072205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603568/7f12bc02-d9a4-4ab7-4081-5e562cba68dc.png)
##SQL
まず始めに勉強したのがSQLです。
SQLは大量のデータ（ユーザー情報や商品情報、動画など）を扱うためのデータベースを管理、操作を行うときに使われる「データベース言語」。簡単に言うとデータベースへの命令文です。


データベース（リレーショナルデータベース）はイメージとしてExcelが近いと思います。
![スクリーンショット 2020-10-30 164449.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603568/b9936b34-5785-2020-e992-2aeb85f00f88.png)
データベースはテーブル（Excelのsheetのような感覚）を作成し、1つのテーブルごとに、「ID」「名前」「年齢」など関連性のある一連のデータがそれぞれ格納されます。
![スクリーンショット 2020-10-30 165441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603568/58cd9803-ec4e-f133-5909-de808cf6313d.png)
主な命令部は4つです。
1、テーブルを作る（CREATE）
2、情報の検索（READ）
3、情報の入力、更新（UPDATE）
4、情報の削除（DELETE）
簡単な命令文を覚えることがメインなのでサクサク勉強できました。

データベース使うメリットとして
・自動でデータの関連付け、分析が出来る
・同時アクセスしてもデータが壊さず共有可能
・不正なデータをブロックバックアップできる
等のメリットが得られます。
##Java
SQLの次にJavaの基礎について参考書を見ながら勉強しました。
Javaはサーバーを作るために必要な言語で後に記述するサーブレットにも用いります。
勉強してきた内容についてはまた、詳しく記事にしていきたいと思います。
##HTML/CSS
実際にPCやスマホで見る画面作成の為、HTMLとCSSについて勉強しました。
HTMLは文章や画像、リンクをを構成するもので、CSSはHTMLに飾りをつけるためのものととらえていただければと思います。

例えば以下のようなHTMLだけだと

```html
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>top page</title>
<link rel="stylesheet" href="@{/css/stylesheet.css}" type="text/css">
</head>
<body>
	<h1>見出し</h1>
	<p>本文</p>
</body>
</html>
```
![スクリーンショット 2020-11-02 144023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603568/7d490bda-ef21-760e-ff65-0e6593d56958.png)
上記の様にbodyと書かれている間が表示されます。
現在はHTMLのみのため黒い文字のみが表示されますが、ここにCSSを加えると

```css
h1 {
	color: red;
}

p {
	color: blue;
}
```
![スクリーンショット 2020-11-02 144402.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603568/eb104fc3-e4e6-e9a8-f8b5-f32ec17b53a3.png)
h1（見出し）の文字を赤色に、p（本文）の文字を青色にするに変更しました。
文字の色を変える以外にも背景に色を付けたり画像にしたり、表示する場所を
左右に寄せたりなど装飾を施すことが出来るようになります。
##サーブレット/JSP
簡単に言うとJSPは画面、サーブレットはサーバーと考えていただければと思います。

JSPはHTMLの中にJavaのコードを埋め込んだものです。ブラウザからURLで
サーブレットを呼び出して、要求を受けたサーブレットはJSPを用いて
必要な画面を作成しブラウザに返します。

ではなぜ、JSPがHTMLにJavaのコードを埋め込む必要があるのかというと
例えばショッピングサイトで毎回同じ商品が表示されるわけではなく、
新商品や目玉商品などが表示されると思います。あれはサーブレット（サーバー）が
データベース内にある今月発売の新商品などを見つけてきて、JSP内にあるJavaの
コードでリストとして画面を作成してブラウザに返しているからです。

#次回予告
今回はサーブレット/JSPを扱ううえで必要な用語等をまとめました。
次回一つひとつ掘り下げていきたいと思います。
【Anaconda3】よく使うコマンド まとめ

#はじめに
よく使うAnaconda3コマンドのまとめです．

# 仮想環境の切り替え
```
$ conda activate <name> # 有効化
$ conda deactivate      # 無効化
```

# 仮想環境の一覧を表示
```
$ conda info -e
$ conda info --envs
```

# 仮想環境の作成
```
$ conda create -n <name>
$ conda create -n <name> python=<version>
$ conda create -n <name> python=<version> <library>=<version>
```
\<name\>という名前の仮想環境を作成する．
\<version\>は省略可．指定されていない場合，最新のバージョンがインストールされる．

# 仮想環境の削除
```
$ conda remove -n <name> --all
```
【AWS】S3使用に関する設定

#前提条件
ActiveStrageを使用して画像保存を行っている。
よって、上記を使用して問題なく動作していることを確認した後に実装を行うとスムーズ。

#Gem
```
gem "aws-sdk-s3", require: false
```
#保存先の指定
以下の内容に変更。

```config/environments/development.rb
config.active_storage.service = :amazon
```

```config/storage.yml
test:
 service: Disk
 root: <%= Rails.root.join("tmp/storage") %>

local:
 service: Disk
 root: <%= Rails.root.join("storage") %>

amazon: #　コメントアウトを外す
 service: S3
 access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
 secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
 region: ap-northeast-1
 bucket: バケット名
```

#環境変数の設定
以下の環境変数を記述。

AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY

```
% vim ~/.zshrc
```

記述後、以下のコマンドで適用。

```	
% source ~/.zshrc
```

#本番環境への適用
##保存先の指定
```config/environments/production.rb
config.active_storage.service = :amazon
```
##本番サーバー上で前段の環境変数を設定
Swift5 - スワイプでtableViewのセル削除


##実装
```swift

    //スワイプでセル削除
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
            
        if editingStyle == UITableViewCell.EditingStyle.delete {
             //itemArrayの配列変数は変更する
                itemArray.remove(at: indexPath.row)
                tableView.deleteRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic)
            
        }
    }
```

##参考記事

https://qiita.com/Lulu34/items/b0c88d1e1163d50f743b
CentOS 7にdevtoolset-6をインストールする手順

#背景
CentOS7(7.8.2003)では、devtoolset-6のサポートが切れており、
以下の手順ではインストールできません。
https://www.softwarecollections.org/en/scls/rhscl/devtoolset-6/

#インストール方法
ひとまず以下の方法でインストールできました。
(もう少しシンプルな方法があると思ふ。)

```
# yum -y install centos-release-scl

# Fix as devtoolset-6 not in CentOS 7.7 mirrors
sed -i 's/7/7.6.1810/g; s|^#\s*\(baseurl=http://\)mirror|\1vault|g; /mirrorlist/d' /etc/yum.repos.d/CentOS-SCLo-*.repo

# yum install -y devtoolset-6
```

#参考URL
thnx :)
https://groups.google.com/g/vfx-platform-discuss/c/_-_CPw1fD3c?pli=1
MacOSでのバッククォートの入力方法

#はじめに
キータで記事を書くに当たって、コード挿入する際に必要な**バッククォート「 ` 」**の出し方について調べたので、忘備録として残しておきます。
JISキーボード、USキーボードどちらも記述しておきます。

#MacOSでのバッククォートの出し方

##JISキーボード
JISキーボードでは

**「Sihft + @」**

でバッククォート「`」が入力できます

##USキーボード

USキーボードでは

**「option + ~」**

でバッククォートが入力できます。

#参考
https://ex1.m-yabe.com/archives/3656
Sql Developer の設定

こちら参考になりました。
http://ichannel.tokyo/technoracle/sqldeveloper%E3%81%AE%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%83%97%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9%EF%BC%88%E8%A8%AD%E5%AE%9A%EF%BC%8910%E9%81%B8/1224/

追加
tabキーを4 スペースとして設定する

![tab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189035/08848048-56e7-2413-5622-1f9d442783ad.png)
【PostgreSQL】 could not connect to server: No such file or directory  Is the server running locally and accepting  connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"

# はじめに
久しぶりにローカル環境で Rails を起動しようとするとタイトルに書いた PostgreSQL のエラーが出て仕事ができず困ったのでその時のメモです。

## Railsを起動しようとすると以下のエラーが発生

~~~
$ rails s
...(中略)...
psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?
~~~

## 以下いろいろ試した記録

###  1. PostgreSQLにログインできるか試してみる

やはり同じエラーが発生

~~~
$ psql posrgres
...(中略)...
psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?
~~~

結果 → ×

### 2. PostgreSQLを再起動してみる

~~~
$ brew services restart postgresql@11 
~~~

結果 → ×

### 3. データディレクトリを削除してみる

( **注: データが消えます** )

~~~
$ rm -rf /usr/local/var/postgres
~~~

結果 → ×

### 4.  PostgreSQLをアンインストール→インストールしてみる
アンインストール

~~~
brew uninstall --force postgresql@11
~~~
インストール

~~~
brew install postgresql@11
~~~

結果 → PostgreSQL にはログインできるようになったが、`rails server`, `rails db:create`, `rails db:migrate` などを実行するとタイトルと同じエラーがまだ出る

~~~
psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?
~~~

### 5. リンクをつけてみる

エラー文に書かれていたファイルにソケットファイルのリンクを付与

~~~
$sudo mkdir /var/pgsql_socket/
$sudo ln -s /private/tmp/.s.PGSQL.5432 /var/pgsql_socket
~~~ 

`rails db:create`を再実行

結果 → 失敗したが、エラー文が変わった

~~~
dyld: lazy symbol binding failed: Symbol not found: _PQresultMemorySize
  Referenced from: /Users/dev/.rvm/gems/ruby-2.5.7/gems/pg-1.2.2/lib/pg_ext.bundle
  Expected in: /usr/lib/libpq.5.dylib

dyld: Symbol not found: _PQresultMemorySize
  Referenced from: /Users/dev/.rvm/gems/ruby-2.5.7/gems/pg-1.2.2/lib/pg_ext.bundle
  Expected in: /usr/lib/libpq.5.dylib

~~~

### 6. PostgreSQLのgemを再インストール

Gemfile から gem 'pg' をコメントアウトし `bundle update`
→ gem 'pg' アンコメントして `bundle install`

`rails db:create`を実行

結果 → 成功!

`rails db:migrate` `rails server` も通るようになった

# おわりに

原因はいまだにわかっておらず、上記で試したことのうち何が幸いして直ったのかは不明です...
Railsを起動してない間に brew で色々とインストールをしていたのでその影響かなとは考えています。

時間ができればまたこのあたりの仕組みを見直そうと思います。


#### 参考記事
**postgresqlでDBが作れなかったのを解決(してもらった)**
https://haayaaa.hatenablog.com/entry/2019/01/23/111745

**Homebrew でインストールした postgresql に接続できないときの原因と対処法**
https://blog.kyanny.me/entry/2015/01/16/024304

**"/var/pgsql_socket/.s.PGSQL.5432"?**
https://ameblo.jp/soft3133/entry-11466406890.html
Composer 2.0が遅すぎてつらい

Composer 2.0が2020-10-24にリリースされました。
[Composer 2.0 is now available!](https://blog.packagist.com/composer-2-0-is-now-available/)

## 2.0に移行する前に実測しましょう

巷では「速くなった」「1.xの高速可テクニックはもはや不要」などの声を見かけますが、移行は実測してからをお薦めします。

自分の環境では、原因が不明ですが高速可した1.xよりもかなり遅くなるケースにあたりました。

## よく見かけるベンチマーク
以下のコマンドの実行時間で、1.xと2.0の速度差を確かめている記事があり、自分の環境でもこれは2.0で速くなってました。

```
$ time composer create-project --prefer-dist laravel/laravel blog

1.10.13:
real    1m34.422s
user    0m16.097s
sys     0m10.081s

2.0.4:
real    0m18.347s
user    0m4.733s
sys     0m2.417s

※ composer clear-cacheは毎回行っています
```

## 自分の環境で実測すると･･･

自分が担当しているとあるプロジェクトのcomposer.json(インストールするパッケージは18個)を使って実行時間を計測すると、原因不明ですが2.0はかなり時間がかかりました。
計測は5回やりましたが、大体実行時間は同じです。

```
1.10.13:
real    1m8.685s
user    0m5.916s
sys     0m3.414s

1.10.13 + packagist.jp:
real    0m46.346s
user    0m6.596s
sys     0m3.473s

1.10.13 + packagist.jp + hirak/prestissimo
real    0m16.150s
user    0m4.603s
sys     0m2.550s

2.0:
real    1m15.536s  <-- 遅い!!!
user    0m2.793s
sys     0m1.505s
```

`-vvv`をつけて実行しても原因がわからず、現時点での移行は見合わせています。
gitリポジトリの設定に関する備忘録 (SSH鍵設定・git config)

# 前書き

最近PCを切り替える作業があり、使い始めの頃に設定したgitやssh周りの内容を忘れてしまっていました。。。
またPC切り替えがありそうな予感がするので、備忘録として残しておきます。

## SSHの設定

複数のgitリポジトリにsshで接続する必要があったので、ホストを分けられるようにしてます。

```config:.ssh/config
Host github.com # サブアカウント
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/sub_id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes

Host bitbucket.org # 個人アカウント
  HostName bitbucket.org
  User git
  Port 22
  IdentityFile ~/.ssh/id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
```

## git config

globalとlocalでアカウントの設定を変える

```config:.git/config
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[user]
	name = お名前
	email = メールアドレス

[remote "origin"]
	url = git@bitbucket.org:hoge/project.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master
```
macOS(Catalina)にRstanをインストールする

# はじめに
MacOS(Catalina)におけるRStanの入れ方をまとめました。

### 環境
macOS Catalina 10.15.7
R version 3.6.1 (2019-07-05)
RStudio version 1.1.456

# 事前準備
- V8をインストール
  > ターミナルを起動し、v8をインストール。
  > 他にも足りないものがあるかもしれないが、現在の環境ではこれだけ。 
  >
  > ```
  > brew install v8
  > ```


- gfortranのインストール  
  > [githubのページ](https://github.com/fxcoudert/gfortran-for-macOS/releases)から```gfortran-10.2-Catalina.dmg```をダウンロードし、右クリックで```このアプリケーションで開く```-```インストーラ(デフォルト)```から手順に従ってインストールをする。これを入れないと次のR toolchainをうまくインストールできない。

- R toolchainのインストール
  > [githubのページ](https://github.com/rmacoslib/r-macos-rtools/releases/tag/v4.0.0)から```macos-rtool-4.0.0.pkg```をダウンロードし、gfortranのインストールと同じ手順でインストール。

- **PCの再起動をする**

# RStanのインストール
- RStudioを開きます。コンソールで以下を実行
  
  > C++ toolchainをインストール。
  > 
  > ```
  > install.packages("Rcpp", repos = "https://rcppcore.github.io/drat")
# improve the estimation speed of the mode
dotR <- file.path(Sys.getenv("HOME"), ".R")
if (!file.exists(dotR)) dir.create(dotR)
M <- file.path(dotR, "Makevars")
if (!file.exists(M)) file.create(M)
cat("\nCXX14FLAGS += -O3 -mtune=native -arch x86_64 -ftemplate-depth-256",
    file = M, sep = "\n", append = FALSE)
  > ```

- RStanが既に入っている場合への対策として、以下をコンソールで実行

  > ```
  >remove.packages("rstan")
if (file.exists(".RData")) file.remove(".RData")
  > ```

- **RStudioを再起動**
- 次をコンソールで実行
  
  > インストール時の設定をする。
  > 
  > ```
  > Sys.setenv(MAKEFLAGS = "-j4") # four cores used
  > ```

- RStanをインストール

  > ```
  > install.packages("rstan", repos = "https://cloud.r-project.org/", dependencies = TRUE)
  > ```

# RStanの動作確認
- RStanをインポート

  > ```
  > library(rstan)
  > ```
  > 無事に入っていればrstanのVersionが3行目で表示される

# 参考文献
- https://github.com/rmacoslib/r-macos-rtools#how-do-i-use-the-installer
- https://github.com/stan-dev/rstan/wiki/Installing-RStan-from-source-on-a-Mac
- https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started-(Japanese)