OmniAICreator/Qiita-1.07M huggingface dataset:
Python3で二分探索

#授業だる&注意

アルゴリズムの授業で二分探索を書かされたので、Python3にて実装。
下の配列に対して破壊(要素の消去)を行なっているため、実際に使う際にはデータのコピーをして実行するか、left,rightなどの変数を用いて条件を変更した方が良さそう。
それと関数化したほうが便利よねって思ったけど、Pythonはinを用いれば検索できるし、アルゴリズムの練習でコード化しただけだし別にいいやってなりました、はい。

#ソースの解説

適当なlistを用意し、それを昇順にソートする。
探したい数値をsa_numに格納。
探索時に何度処理をしたかを数えるためにcntを使用。endは終了条件、sucは成功したかどうかのフラグとして使用。
endが0なら繰り返す
要素が1ならその要素だけ調べれば終わりなのでend = 1としてフラグ立てる。
そうでないなら、中央値を取得する。
中央値と探したい値が一致しなければ、中央値と探したい値の大小比較を行う。中央値の方が大きければ、探したい値は0からindexまで。つまり配列の右側(index~最後まで)は要らないので、スライスを用いて削除。逆に中央値より小さければ左側を削除。
もし、配列の要素数が1になってしまったら、その要素を取り出して探したい数値と比較する。探したい数値が見つからなければ終わり。


```Python3

lis = [15,23,25,601,65,87,9,103,15,30,11,13]
lis.sort()

sa_num = 25

cnt = 0
end = 0
suc = 0

while end == 0:

    cnt += 1

    print(lis)

    if len(lis) != 1:

        index = int(len(lis) / 2)

        if lis[index] == sa_num:

            print('suc' + str(sa_num))
            end = 1

        elif lis[index] > sa_num:

            del lis[index:]

        elif lis[index] < sa_num:

            del lis[0:index]

    else:

        if lis[0] == sa_num:

            print(sa_num)
            end = 1

        else:

            print('見つかりませんでした。')
            suc = 1
            end = 1

if suc != 1:

    print(str(cnt) + '回目の探索で見つかりました。')

else:

    print(str(cnt) + '回探索をしましたが見つかりませんでした。')
tensorflowのインポートエラー

# エラー内容
```sh
Using TensorFlow backend.
Traceback (most recent call last):
  File "C:\Python37\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 58, in <module>
    from tensorflow.python.pywrap_tensorflow_internal import *
  File "C:\Python37\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 28, in <module>
    _pywrap_tensorflow_internal = swig_import_helper()
  File "C:\Python37\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow_internal', fp, pathname, description)
  File "C:\Python37\lib\imp.py", line 242, in load_module
    return load_dynamic(name, filename, file)
  File "C:\Python37\lib\imp.py", line 342, in load_dynamic
    return _load(spec)
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
```

# 解決方法
```sh:tensorflowをダウングレードすればOK。
pip install tensorflow==2.0.0
```

こちらを参考にしました：https://github.com/tensorflow/tensorflow/issues/22512

英語のエラーメッセージだと、`ImportError: DLL load failed: The specified module could not be found.`になるみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/14d175bf-b27b-bb04-48a9-a6966e142ba9.png)
【nodebrew × Mac】nodebrew入れるときにnodeのPATHが通らない話（マカー向け）

#nodeのPATHが通らない

・.bashrcにはPATHをとおす記述を書く
・.bash_profileには毎回起動時にbashrcを読み込む記述を書く
上記二点は済なのに
.bashrcをコマンド叩いて毎回読み込ませないといけない地獄から抜け出せなかったので何かと思ったら
bashではなくzshを使っていたらしい。。

http://pixelbeat.jp/bash_profile_not_working/ を参考に
~/.zprofile に ~/.bash_profile と同じ内容を追記したら直りました。

ありがとうございました！
APIで取ってきた画像をVueでbackground-imageを指定する

Vue.jsでbackground-imageを指定する

APIで取得してきたものをhtml内でなんとか指定したいっていう感じ

諦めてimgタグでレイアウト整えようとしたところで解決したので、感動した。


vueなどで普段から書いているフロントエンドエンジニアたちにとってこの書き方ができるかできないかで生涯年収が2倍違うと言っても過言。


```index.vue
<template>
  <div :style="{backgroundImage: 'url(' + img[img.length-1].img_url + ')'}">
    HelloWorld!
  </div>
</template>

<script>
export default {
  async asyncData() {
    return await axios
      .get('/api/img/get_img')
      .then(res => {
        return {
         img: res.data.details.img
        }
      })
      .catch(error => {
        // throw error;
      });
  },
}
</script>
【JavaScript】関数の書き方

##従来の形（他言語でもよくみる形）
```
//パターン１
function example(){
  //処理
}
```

##定数名で宣言する形
```
//パターン２
const example = function(){
  //処理
}
```

##アロー関数（ES6）
```

//パターン３
const example = () => {
  //処理
}
```

推奨されているのは、**アロー関数**みたいです。
マテリアルデザインのフローティングボタンを置く

ただフローティングボタンを設置するだけの記事で, 自分のブログから引っ張ってきたものです.
https://wally-ngm.hatenablog.com/entry/2020/06/04/001624

そもそもマテリアルデザインって何って感じだったんですが, Android開発しやすいようにGoogleから出てる公式なライブラリで, これ使えばアニメーションや画面を作るのが楽になるよっていうやつです.

Android Developerの公式よりはgithubのほうが情報をみつけやすかったです.
https://github.com/material-components/material-components-android/blob/master/docs/getting-started.md


#### 1. マテリアルデザインのライブラリを追加

まずはマテリアルデザインのライブラリをモジュールのbuild.gradleに追加します.

```build.gradle
dependencies {
    // ...
    implementation 'com.google.android.material:material:<version>'
    // ...
  }
```

バージョンはgithubのreleaseから見れます. 2020年6月3日現在では `1.2.0-beta01` が最新でした.
https://github.com/material-components/material-components-android/releases


#### 2. ボタンに表示するアイコンをimport
ご自身の好きなアイコンをimportしてあげても大丈夫ですが, `Vector Asset`っていう便利なものを使ってみます.


Projectのディレクトリツリーのところ(Android Studioの左側のところw)で右クリックして New => Vector Asset
![メニュー](https://cdn-ak.f.st-hatena.com/images/fotolife/u/ustrgm/20200603/20200603235530.png)

こんな画面がでてきます
![設定画面](https://cdn-ak.f.st-hatena.com/images/fotolife/u/ustrgm/20200603/20200603235607.png)

Clip Artの右側にあるボタンをクリックすると好きなアイコンを選べます.
！[アイコン選択](https://cdn-ak.f.st-hatena.com/images/fotolife/u/ustrgm/20200603/20200603235719.png)
あとはアイコンを選んで大きさや色, 透明度を設定して Next => import場所を設定してFinishです.
import先はデフォルトの `main/drawable` で今回は進めます.

#### 3. FloatingButtonを設置

設置したいlayoutファイルにxmlを書きます.

```
 <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end|bottom"
            android:layout_margin="16dp"
            android:contentDescription="@string/fab_content_desc"
            app:srcCompat="@drawable/ic_home" />
```

上記のは最低限の記述です. 色を変えたりRippleをつけたいと思います. そんなときは公式サイトを見てみると書いてます.
https://material.io/develop/android/components/floating-action-button/

背景色とrippleをつけてみました.

```
 <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end|bottom"
            android:layout_margin="16dp"
            android:contentDescription="@string/fab_content_desc"
            app:srcCompat="@drawable/ic_home"
            app:backgroundTint="@color/colorPrimary"
            app:rippleColor="@color/primaryLight" />
```

こんな感じになります
![結果](https://cdn-ak.f.st-hatena.com/images/fotolife/u/ustrgm/20200604/20200604001845.png)

ソースコードはこちらにおいてあります.
今後も勉強のために色々実装して更新し続けて行こうと思います.
[https://github.com/WallyNegima/android_practice:embed:cite]
Docker初心者がDockerfileを使ってalpineのDockerイメージをビルドする

# Dockerfile

```dockerfile:qiita&nbsp;Dockerfile
FROM alpine:3.12.0

LABEL version="1.0"
LABEL description="Dockerfile test at alpine"
```

# 前提
docker for mac を起動しておくこと

# ディレクトリ
DockerFileTest
＞Dockerfile

# コマンド
mac:terminal

```terminal:qiita&nbsp;terminal
cd DockerfileTest
docker build .
```
※build . でDockerfileTestディレクトリ内からDockerfileを探し、その中で定義されているイメージをビルドします。
コンテナ生成は行われません。
BottomNavigationViewの個々のアイコンサイズを変える


# 背景
一括でアイコンサイズを整える場合は、XML上にてBottomNavigationに対して
`app:itemIconSize="XXdp"`
を指定すれば問題ないが、アイコンごとにサイズがばらばらだったりして個々にサイズを指定したい場合にどうするか

# 環境
```gradle
implementation 'com.google.android.material:material:1.2.0-alpha03'
```

# 実装
```kotlin
private fun fixAllIconSize() {
    // ※1
    val menuView = navView.getChildAt(0) as BottomNavigationMenuView
    // ※2
    0.until(menuView.childCount).forEach { index ->
        // ※3
        val icon = menuView.getChildAt(index).findViewById<ImageView>(com.google.android.material.R.id.icon)
        val displayMetrics = resources.displayMetrics
        // ※4
        val layoutParams = (icon.layoutParams).apply {
            when (index) {
                // 例えば一番左のアイコンのサイズを変えたい
                0 -> {
                    width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 28f, displayMetrics).toInt()
                    height = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 18f, displayMetrics).toInt()
                    }
                else -> {
                    width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24f, displayMetrics).toInt()
                    height = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24f, displayMetrics).toInt()
                }
            }
        }
        icon.layoutParams = layoutParams
    }
}
```

# 説明

* ※1: `navView`は`BottomNavigationView`のこと
* ※2: `menuView.childCount`でボトムナビに設定しているアイコンの数(=メニューアイテムの数)がとれる
* ※3: 個々のアイコンのindexが左から順に0,1,2...となっているため、それぞれのImageViewを取得してあげる
* ※4: ImageViewのLayoutParamsを取得し、width, heightを調整する


以上です
Firefoxで表示崩れする（FlexBox）

少し前から、Firefoxだけ表示崩れしてます。
という報告を受けていたのですが、ずっとなにか忙しかったのと、アクセスみるといるかいないかくらいだったので、ずっと放置していました。←

しかし、新しく追加したページの崩れ方が内容が読めない程度の崩れ方だったので、解決方法を調べた。

結果、10分で解決(ﾟдﾟ)
早く修正してあげればよかった。。

方法も簡単、要素の検証して、はみ出しているものに、

```css
.hamidashi_yoko{
  min-width: 0;
}
.hamidashi_tate{
  min-height: 0;
}
```

とするだけ。

参考画像をつくろうとも思いましたが、下記参考サイトの画像をみていただければと・・
しかし、なぜこの仕様になっているのか・・


## 参考サイト

https://www.gwtcenter.com/min-height-required-on-firefox-flexbox
http://var.blog.jp/archives/78954090.html
https://qiita.com/ituki_b/items/3c66972a16d4c944b164
CircleCIに新しいDockerイメージ cimg が使えるようになったらしい！

# cimgとは
CircleCIの次世代convenience imageとして新しいDockerイメージが登場しておりました。
より***安定性とキャッシュ効率***について考えられています。

詳細はこちらのリンクを確認ください。
https://circleci.com/blog/announcing-our-next-generation-convenience-images-smaller-faster-more-deterministic/

## 登場したわけ
「circleci/node」はnodeのDockerfile＋CircleCIのライブラリ？で構成されています。
そのため、nodeに破壊的な変更が加わると「circleci/node」がうまく起動しないことが発生しました。
それを防ぐために登場したものが***cimg***のイメージです。
※間違っていましたらご指摘お願いします

# 検証
どれくらいキャッシュ効率がいいのか試してみました。
各Nodeのイメージを使用するまでのpull時間を計測します。
（circleci側でキャッシュしているだろうという前提）

- build-node
    - Dockerイメージ：Node
- build-circleci_node
    - Dockerイメージ：circleci/node
- build-cimg_node
    - Dockerイメージ：cimg/node

## 検証結果
数回実施しましたが平均的に以下のような結果になりました。


<img width="344" alt="スクリーンショット 2020-06-04 9.08.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626120/7e93b65e-b56c-2f36-66b7-29fbd44af7d7.png">

# まとめ
「circleci/node」,「cimg/node」ともに早すぎてこれ以上差がつかないのかもしれない!?
登場したわけを聞いた時、今後の利用はcimg系の利用が必須ではないかなと思い、この記事を書きました。
こちらの情報(cimg)は[CircleCIのユーザーコミュニティイベント](https://circleci.connpass.com/)で初めて聞きましたので、機会があればまた参加して色々聞いてみようかなー
皆さんもぜひこちらに参加してみてください。

では、よいCI/CDライフを！！

# 検証に利用したソース
ちなみに、検証に使用したソースはこちらです。

```yaml:config.yml
version: 2
jobs:
  build-cimg_node:
    docker:
      - image: cimg/node:12.16
    steps:
      - checkout
      - run: node --version
  build-circleci_node:
    docker:
      - image: circleci/node:12.16
    steps:
      - checkout
      - run: node --version
  build-node:
    docker:
      - image: node:12.16
    steps:
      - checkout
      - run: node --version
workflows:
  version: 2
  build_and_test:
    jobs:
      - build-cimg_node
      - build-circleci_node
      - build-node
```
Citrix Virtual Apps/Desktopsを浅く学んでみた

##前置き
Citrix System社といえば、テレワークを実現できる製品の会社！
その程度の知識の私ですが、コロナのこともあり、
インフラエンジニアたるもの、もっと何者なのか知っておくべきだと思い始めたので、浅く勉強しました。

今回浅く学んだ製品はこちら！
* Citrix Virtual Apps(XenAppの方が馴染みのある人がいるかも)
* Citrix Virtual Desktops(XenDesktopの方が馴染みのある人がいるかも)

##どんなもの？
よく製品の理解でお世話になっているネットワールドさんの説明を抜き出してみました。
→[引用元](https://www.networld.co.jp/product/citrix/technical_guide/vdi/)

###Citrix Virtual Apps
>Windowsアプリケーションとデスクトップのリモート操作環境を提供します。デスクトップのOSは、サーバーOSまたはクライアントOSを選択可能です。

>公開方法：
>1つのOS環境を、1人のユーザが占有して利用、または複数のOS環境を複数のユーザで共有して利用します。部門単位など、個別の要望に合せたデスクトップ環境の提供が可能です。 また、仮想環境に公開するアプリケーションの制限が少なく柔軟性が高いことも特徴です。

###Citrix Virtual Desktop
>Windowsアプリケーションとデスクトップのリモート操作環境を提供します。デスクトップのOSは、サーバーOSまたはクライアントOSを選択可能です。

>公開方法：
1つのOS環境を、1人のユーザが占有して利用、または複数のOS環境を複数のユーザで共有して利用します。部門単位など、個別の要望に合せたデスクトップ環境の提供が可能です。 また、仮想環境に公開するアプリケーションの制限が少なく柔軟性が高いことも特徴です。


この説明を見て、私が思ったことは、*あれ？RDSと似てね？*です。
また、appsとDesktopの起動方法を見ていると、ブラウザ開いてそっから起動って、
RDSの公開アプリとめっちゃ似てる！？
ちょこっとCitrix Virtual Appsのドキュメントを見た時に、RDSのCALライセンスが必要とも書いてた。そうするとCitrix使うと倍に金かかるんでは？と思った。

###RDSとの違いって？
##Citrix Virtual AppsとRDSの違い
[参考：Citrix XenApp 選択のポイント（日立製作所）](http://www.hitachi.co.jp/Prod/comp/soft1/citrix/doc/citrix_xenapp_usecase.pdf)
RDSと動作原理とかそう大差はない。むしろ、Citrixは補完や拡張する感じ。
決定的に違う点はCitrix独自のICAプロトコルにより、RDPよりもより快適に使える。
ICAプロトコルについては理解追いついていないので書けませんが、[こちらのネットワールドさんの説明](https://www.networld.co.jp/product/citrix/technical_guide/vdi/)をご覧ください。


##Citrix Virtual DesktopsとRDSの違い

[参考1:インフラエンジニアの雑記](https://int-infra.hatenablog.com/entry/2016/07/05/204117)
[参考２:XenDesktopとは？XenAppとの違いをわかりやすく解説(Lakeside)](https://www.lakesidesoftware.com/jp/blog/difference-xendesktop-xenapp)

クライアントに配信する方法は大きく二つあり、
**VDI方式**と**RDS方式**がある。

* VDI方式
VDIとは、ユーザーごとに仮想化環境をまるっと作ってあげる、すなわちOS環境を一個一個作ってあげる。
なのでそれなりのスペックが必要そう。

* RDS方式
一つのサーバーをユーザーが共有して使う。
だから、アプリとかはサーバに入ってないと使えない。

Citrix Virtual DesktopsはVDI方式です。
なので、RDSとは動作も仕様も全く違うのです。




と、ここまで調べて力尽きてしまったので、今回はここまでにします。
RDSとの違いを調べただけだけど、メモリもCPUも低い私の脳にはちょうどいい長さ。
では、もっと調べたらまた更新しますー
【Chrome】「Provisional headers are shown」と表示され通信ができない場合の原因と対策

こちらを参考にさせていただきました。
>[【Chrome DevTools】「Provisional headers are shown」が表示される原因と対策](https://did2memo.net/2017/01/23/chrome-devtools-provisional-headers-are-shown/)


#原因
キャッシュからファイルを取得していたため、通信が行われていなかった。

#対策
キャッシュを利用しない設定をする。
<img width="245" alt="スクリーンショット 2020-06-04 12.59.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136271/1f46dd00-bbd5-5264-367e-638bb19f4693.png">
`Disable cache`にチェックを入れてキャッシュの利用を無効化することで解決しました。
Azure Static Web Appsに骨董品のMiddlemanで作られたページをデプロイしてみた

# はじめに

---

## 前置き

この記事はスライド形式で公開することを前提とするため、箇条書き中心になっております。

なお、この見解は私個人の見解で、所属する会社の見解とは一致しないことをご承知ください。

---

## 自己紹介

[このあたり](https://huideyeren.info/author/)を見ていただけると助かります。

- 就職氷河期(1981年)生まれの
- 多分カウボーイエンジニア
- [アパレル系の特例子会社でC#開発やってます](http://sazaby-league-hr.co.jp/voice/a.html)
- そのほかいろんな事やってます
    - PyCon JPのスタッフも……
    - 同人サークル「恢徳堂」主筆など物書きも

---

## 主に使う「武器」

- C#
    - でもASP.NET Coreは実務では使えていない
- SQL
    - Transact-SQLメイン
- JavaScript/TypeScript
- Python
- Ruby
- テキスト

---

# さて本題に入ります

---

## [Azure Static Web Apps](https://azure.microsoft.com/ja-jp/services/app-service/static/)

- Build 2020でアナウンスされた新サービス
- 静的なWebサイトとAPIを公開出来る
    - 静的ページの方はCDN使っているらしい
    - APIはAzure FunctionsでJavaScript
        - LinuxのNode.jsで動いているらしい
- GitHub Actionsと **密接に** 結びついたデプロイ
- JAMstackのほか、HugoやJekyllなどにも対応

---

## [Middleman](https://middlemanapp.com/jp/)

- Ruby製静的サイトジェネレーター
- Railsわかる人なら使いやすい
- 現在のバージョンは4.3.6
    - ただし私のページではver.4系にバージョンアップ出来ていない
- [自社のページ](http://sazaby-league-hr.co.jp/)でも使っている

---

## [私のページ](https://huideyeren.info/)

- **骨董品** のMiddlemanを使って作られている
    - サポートの終わったver.3系
    - 更新もあまりされていない
- テンプレートは[5t111111/middleman-blog-drops-template](https://github.com/5t111111/middleman-blog-drops-template)の色を変えて使用
    - このテンプレート、私が使ったときはNode.jsはFont Awesomeを取ってくるのに使用するのみだった
        - 今ではbabelを使っている模様

---

## ホスティングにどこを使っているの？

- 現状は[Netlify](https://www.netlify.com/)でホストしている
    - ビルドはNetlifyのCI/CD環境を使用
    - 設定もYAMLいらず
        - コマンドを指定するのみ
        - しかもAzure Static Web Appsより速い
- もともとはGitHub Pagesでデプロイしていた
    - ビルドはローカル
- これを機にAzure Static Web Appsも試そう
    - だけど一筋縄ではいかない

---

## Azure Static Web Appsの設定

詳しくは[MS公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/static-web-apps/getting-started?tabs=vanilla-javascript)参照。

これ、GitHub Actionsほぼそのまま。

1. AzureポータルでAzure Static Web Appsを作成
2. サブスクリプションと名前、リージョンを決める
3. GitHubアカウントとAzureアカウントを連携する
4. GitHubリポジトリを連携する

---

## Azure Static Web Appsのビルド設定

私は以下の設定を採用

| 設定項目 | 値 |
|:------:|:--:|
| App location | `/` |
| Api location | 今回は入力しない |
| App artifact location | `build` |

その後、リポジトリに追加されたYAMLを編集する。

---

## YAMLの編集

YAMLの内容は[GitHubの当該ファイルのページ](https://github.com/huideyeren/huideyeren.github.io/blob/develop/.github/workflows/azure-static-web-apps-black-water-01753d000.yml)を参照。

ポイントは以下の通り。

1. RubyとNode.jsのセットアップを追加。
2. ビルドタスクを追加
3. デプロイタスクをデプロイのみ行う方法に変更

だが、Netlifyでは動くのにGitHubでは動かない！

---

## どこがまずかったのか

1. Font Awesome 4.7.0になぜかスクリーンリーダー向けの増えていたため
2. `package.json`に`npm run build`の設定がなかった

---

## 対処

1. Font Awesomeをver.5系のFree版にアップデート
2. `npm run build`の設定を追加
    - ただし **何もしない**
    - ビルドはデプロイ前に行う形とする

---

## その結果

[実際にAzure Static Web Appsにデプロイできました！](https://black-water-01753d000.azurestaticapps.net)

ただしデプロイはNetlifyの方が速かったです。

なので、今後もNetlifyで運用を続ける予定です。

---

## そういえばリニューアルは？

[PyCon JP 2019](https://pycon.jp/2019/)で発表したCMS + JAMstack化は現在頓挫中です。

余裕ができたらこちらの方も計画を進めます。

---

# ご清聴ありがとうございました
laravel フォルダの中身を一覧取得

laravelを使って、指定したフォルダの一覧を表示したい。
ファイルを resources 以下に置けば非公開になる。

今回は /resources/sass/ のファイル一覧を取得する。


```HogeController.php

$path= resource_path('sass');///var/www/html/mama-rich.net/resources/sass

$files = \File::files($path);

foreach ($files as $v) {
    
    print_r($v->getfileName());//app.scss
    print_r($v->getpathName());///var/www/html/mama-rich.net/resources/sass/app.scss


}

```

以上
Google Colab で head コマンドを実行するときは気をつけたほうがいい

ことの発端はこれ。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">$ cat &lt;input.txt&gt; | tee &lt;output.txt&gt; | head<br><br>したら output.txt の出力が途中で途切れてしまうのだけど、head プロセスが終了すると tee も途中で死んでしまうのだっけ？？？</p>&mdash; hoto (@hoto17296) <a href="https://twitter.com/hoto17296/status/1268358041008656384?ref_src=twsrc%5Etfw">June 4, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

調べたところこの問題は Google Colab のコマンド実行でしか再現せず、別の Linux 上の Jupyter Lab などでは問題なく実行できた。

## 問題の再現
簡単に問題を再現するには、以下のコマンドを実行する。
(※ Google Colab のセルでコマンドを実行するために冒頭に `!` をつけている)

```
! ping 127.0.0.1 | head -n 5
```

出力はこうなる。

```
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.036 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.033 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.037 ms
```

head コマンドで指定した5行分が出力されたのちに、セルのステータスが「実行完了」になる。
つまり、**ping コマンドが途中で終了している**。

Jupyter Lab などで同じことをやると、head が途中で終了するので出力が5行で止まるのは同じだが、セルの実行は完了しない。
つまり、ping コマンドは裏で動き続けている。

## なにに気をつけるべきか
```
! command_1 | command_2
```

Google Colab でこのようなパイプで繋いだ複数のコマンドを実行するとき、**最後のコマンド (command_2) のプロセスが終了した時点でセル全体の実行が終了する (command_1 も終了する)**、ということ。

冒頭の例のように

```
! ... | tee <file> | head
```

などと書いていると、head プロセスが終了した時点で tee プロセスの処理も途中で打ち切られてしまうため、ファイルへの出力が途切れてしまうことになる。 `Broken pipe` のようなエラーメッセージも表示してくれないので気付きにくい。

この挙動に関して「Google Colab はこういう仕様なので...」という詳細をご存知の方がいたらコメントいただけるとありがたい。
【備忘録】ブラウザで音声認識する

ブラウザに内蔵のAPIで音声認識する場合。
パラメータで認識中の途中結果を取得したり、連続で認識するといった変更はあるけど、とりあえず日本語の設定のみ。

# 検証環境
* Google Chrome バージョン: 81.0.4044.138

# ソースコード

```html:html
<button id='start'>開始</button>
```

```javascript:javascript
const start  = document.getElementById('start');

SpeechRecognition = webkitSpeechRecognition || SpeechRecognition;

const recognition = new SpeechRecognition();
recognition.lang = 'ja-JP';

recognition.onresult = (event) => {
  console.log(event.results[0][0].transcript);
}

start.onclick = (event) => {
  recognition.start();
};
```
VScode で自作python ライブラリのインテリセンスを動かす。

## 概要
numpy とかpandas とか、関数を書こうとするとVScode先生が関数名を補完してくれて、サクサクかけますよね、、
この補完機能のこと、```インテリセンス``` って言うらしいです、知らんかった、（恥）

しかしながら自作のpythonライブラリをsetuptoolなどで作ったとして、
これってどうやってVScodeにインテリセンスを使ってもらえるのか、、？

勝手にはインテリセンスは調教されてくれません。


## やり方

### ビルド、ライブラリ群のところにインストール
setup.py　を使ってライブラリをビルドするときに、使っているpythonが参照しているライブラリ群の中に自作ライブラリも置いてもらうには？
このコマンドでしたね、

```bash
python setup.py install
```

これでビルド+参照先にシェアドオブジェクトファイルを置いてくれますね。

### python の場所を調べる

自分の実行しているpython がどこにあるのか調べます。```which``` コマンドですね。

```bash
which python
```

### site-packages の場所を調べる

ここで、ビルドされたライブラリがどこに置かれてるのかはこのコマンドで調べます。

```bash
python -c "import site; print (site.getsitepackages())"
```
フォルダ名は```site-packages``` へのパスになってるはずです。
このコマンドの出力として出てきたパスの中に、たくさんライブラリたちが入ってますね。


### VScode の settings.json を編集
ここから、VScodeのインテリセンスを発動するために、```settings.json```を開きます。
開き方は、```F1```を押して、```setting``` とか検索すると出てきます。

そして、これを追記

```settings.json
{

    "python.autoComplete.extraPaths":[
        "<あなたのsite-packagesへのパス>"
    ],
    "python.pythonPath": "<あなたのpythonのパス>"

}
```

これを設定して、一回VScodeを再起動しましょう。

すると、、

インテリセンスが自作ライブラリでも発動します！！！！！

すばらしい、、、！！！



これで快適になったのだった。


おわり。
RustでAtCoder ABC169 のCを解く

https://qiita.com/mod_poppo/items/910b5fb9303baf864bf7

こちらを参考に有理数を用いてACした回答。

# 問題

https://atcoder.jp/contests/abc169/tasks/abc169_c

# 依存クレート

```toml
# Cargo.toml

[dependencies]
num-rational = "=0.2.4" # 有理数サポート
text_io = "=0.1.8" # 入出力サポート
```

# 回答

```rust
use std::str::FromStr;
use num_rational::Rational64;
use text_io::read;

fn main() {
    let a: i64 = read!();
    let b: String = read!();

    // Aを有理数に変換
    let ratio_a = Rational64::new_raw(a, 1);

    // "."の前後で文字列分割する
    // 例 "1.23" => ["1", "23"]
    let bs: Vec<&str> = b.split(".").collect::<Vec<&str>>();
    let b1 = i64::from_str(bs[0]).unwrap();
    let b2 = i64::from_str(bs[1]).unwrap();

    // Bを有理数に変換
    // 例: 5.67 => 5/1 + 23/100 として計算
    let ratio_b = Rational64::new_raw(b1, 1) + Rational64::new_raw(b2, 100);

    // AとBを掛け算して出力
    let ratio_res: Rational64 = ratio_a * ratio_b;
    println!("{}", ratio_res.numer() / ratio_res.denom());
}
```
Fireworksを今更入手する方法（Adobe CC）

## 途方に暮れる事態

某プロジェクトのデザイン業務中にそれは発生した。

**「デザインの元データがFireworksのデータしかない・・・」**

Fireworksかぁ・・・昔は使ったなぁ・・・
最初はMacromedia製で、Flashなんかと共に買収されたっけ・・・
あれはあれで使いやすい面もあった気がするなぁ・・・

そんな思い出が走馬灯のように駆け巡るのもつかの間、ふと我に返る。さて困った。

Fireworksなんて最近全く見かけないし、使ってる人も（私の周りでは聞いた限り）いない。
じゃあ諦めて見た目を似せたデータを１から作る？トレース？~~うゎめんどくs~~
Fireworksて今買えるの？amazonさんで検索・・・買い切り版が売ってなくもないけど結構高い・・・

てか、Adobeに買収されたけど、Fireworksって今ダウンロードできるの？確か開発中止してたはずだけど。。
わずかな期待を胸に、adobeのデスクトップアプリでアプリ一覧を見てみる。

■未インストールのアプリ一覧
<img width="1246" alt="スクリーンショット 2020-06-04 10.18.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/66d6ddb3-a2c4-b738-a14f-1f43ef43fcc4.png">

・・・見当たらず。

<img width="1247" alt="スクリーンショット 2020-06-04 10.19.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/9b9957a8-251c-700b-89ba-a5c0a352b447.png">

試しに検索してみても出てこない。
さあどうしよう。。

AE、Animate、イラレ、フォトショくらいしか普段使わない私は、この時知らなかった。
こんな入手方法があるなんて。

## Adobe CCでFireworksを入手する方法

■デスクトップアプリ右上の「環境設定」を押す
![スクリーンショット-2020-06-04-10.22.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/8756c522-e09d-5e6d-501f-638efe762a89.png)

■ポップアップが表示されるので、「アプリ」を選ぶ
![スクリーンショット-2020-06-04-10.22.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/aafc99c0-1669-8548-eec2-61a917785897.png)

■「古いアプリを表示」をonに
![スクリーンショット-2020-06-04-10.23.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/d6bc36fc-fa17-62ee-ca55-c263c207b9a8.png)

すると・・・

<img width="1247" alt="スクリーンショット 2020-06-04 10.23.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590293/935716cb-2760-25a4-b250-ed7e4289a237.png">

全てのアプリに「Fireworks」「が表示された！！！

インストールボタンを押し、無事に入手完了。

## あとがき
まさか、今更Fireworksが必要になる事があるとは思わなかった・・・
【Laravel】EloquentORMで任意のカラム（要素）にセットした際に自動的に加工＆セットする。（ミューテタ）

メモとして残します。

LaravelのEloquentORMを用いてデータの取得、保存をすると思います。
今回は保存する際に任意のカラムをセットしたら、その際に自動的に値の加工してもらうようにプログラムします。（＝ミューテタの定義）
#■やり方
任意のカラム（要素）にミューテタを仕込みたいモデルに下記の例のようにメソッドを追記。

```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Hoge extends Model
{
    public function setカラム名Attribute($value)
    {
        //$valueにセットしたときの値が入っている。
        $this->attributes['カラム名'] = $value ?? 'hogehoge'; 
    }
}
```
上記の例では要素にセットされた値がNullの場合は、`hogehoge`という文字列をセットしました。

ミューテタを定義する利点としては、
モデル呼び出し元で同じような処理を記述する必要がなくなります。
どんな場合も共通して加工してセットしたいという場合に役に立ちます。
Cognos DMRモデルのレポートでFrom-Toの期間範囲選択の実装

#Cognos DMRモデルのレポートでFrom-Toの期間範囲選択の実装
以下のようなイメージの、開始(From)～完了(To)を範囲指定するレポートは、Relationalモデルでのレポートであれば、詳細フィルターにbetweenを使用すれば簡単ですが、DMRモデルではどのように実装するかの簡単なメモです。
<img width="380" alt="001.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/a7a7abe0-d92d-cf51-acbe-4ffe9bc18ef3.png">

#DMRモデルでの実装方法
スライサーの場合、以下のように記載して実装します。

```html
intersect(lastPeriods(-9999,[販売].[時間].[時間].[月]->?pFrom?),lastPeriods(9999,[販売].[時間].[時間].[月]->?pTo?))
```

<img width="550" alt="002.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/233f9289-e405-94fd-796c-2f3216fa7fb3.png">

エッジに置くデータアイテム「月」を同様に記載しても実装可能です。
<img width="644" alt="003.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/27f30471-ff72-f5c9-5c26-7d9d08992b7b.png">

#参考情報
**How to create a date range based on the multidimensional data in report**
https://www.ibm.com/support/pages/how-create-date-range-based-multidimensional-data-report
Laravelのコントローラ をコピって使ってたら死んだ！

Laravelのマイグレーションファイルやコントローラ などは、コマンドで作るのも面倒なのでコピーして作ってました。

作っている内に最適化できることに気づいて、古いコントローラ をコピーして名前を変えてバックアップようとして残し、新しいコントローラ に移管することを試みました。

しかし、なぜか名前を変えたはずの古いコントローラ を読んでしまう。。
「消えろや！」と、いっそ消してしまったら、「見つかりません」エラーが出てサービスが利用不能に。。


https://qol-kk.com/wp2/blog/2018/11/23/post-943/

ありがとう先輩方。。

composerにキャッシュ的に記録されていて、それを読んで振り分けている的な動きだったのですね。。

composer dump-autoload

こちらのコマンドで、即解決。
[UE4] Widgetのレイヤー管理


対象Ver：UE4.25.0
#1. レイヤーとZOrder
　Widgetは基本的に後から追加されたものを優先して表示(重なっている場合は優先して)表示します。複数のWidgetが同一階層にある場合はこのルールが適用されますが、Canvas Panelを利用することで描画順に関係無く指定のWidgetを優先して表示するようなことも可能です。これはWidget同士の深度情報を管理するための値(ZOrder)によって制御することもできます。

[[APIドキュメント] UCanvasPanelSlot] (https://docs.unrealengine.com/en-US/API/Runtime/UMG/Components/UCanvasPanelSlot/index.html
User Widget：UGameViewportClient::ViewportOverlayWidget)
[[APIドキュメント] UGameViewportClient](https://docs.unrealengine.com/en-US/API/Runtime/Engine/Engine/UGameViewportClient/index.html)

　Widgetを表示する時は `AddToViewport()`を利用するように、Viewportが最終的にそれらのWidgetを登録して管理します。最初に追加され®他時に `UGameViewportClient::AddViewportWidgetContent`を実行してTreeに登録します。Widgetを削除する際には `RemoveFromParent()`を利用して `UGameViewportClient::RemoveViewportWidgetContent`から取り除かれます。それらのWidgetは最終的にレベルの遷移時などに `UGameViewportClient::RemoveAllViewportWidgets`から纏めて破棄されます。

以下は同一レイヤーにあるWidgetとZOrderの関連性を示した図です。

1UserWidget内でOverlayのZOrderの違い ：左は全て0なので後から追加したWidgetが上にくる、右は後から追加したWidgetのZOrderが小さいので先に追加したWidgetが前面に来るケース
![2020-06-04_11h50_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/1dc2ace1-2193-965d-3366-6a0174af6f65.png)

UserWidget同士のZOrderの違い ：左は全て0なので後から追加したUser Widgetが上にくる、右は上記のケースと同じで先に追加したWidgetが前面に来るケース
![2020-06-04_11h50_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/ecf1ce5c-1e46-a7bd-d860-2f7dcc61d954.png)

#2. ZOrderの指定と変更
　ZOrderを変更する事で簡単に描画順番を変更することが可能です。ただしそれらを指定/変更するには以下のような制約があります。

・User Widget
動的な変更は提供していません。AddToViewportで生成時か、Designer上での指定のみです。
・Widget
動的な変更はCanvas SlotからSetZOrderで可能、静的な変更はDesigner上での指定が可能です。

![2020-06-04_12h02_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101019/ff15a4e5-d411-6a47-0ab7-733a3d94d88b.png)


動的にUser Widgetの変更する方法についてはデフォルトではありませんが、以下のブログのやり方が参考になるかと思います。
[https://sunghwanpark.github.io/unreal/30/](https://sunghwanpark.github.io/unreal/30/)
お名前メールライトとRoute53を連携する

お名前メールライトとRoute53の連携をするときに、ちょっとハマったので、メモ。

#前提
- お名前ドットコムでドメインを取得した
- WebアプリケーションはAWSのS3に静的ホスティング
- DNSはRoute53を使用
- 同じドメインで、お名前メールライトを使用している

#現象
お名前ドットコムのDNS設定で、Route53のNSを設定。
Webサイトは見れるが、メールの受信ができない。送信ができる。

#解決方法
Route53にMXレコードを追加して、mx〇〇.gmoserver.jpに転送するようにする。
mx〇〇.gmoserver.jpという情報が全く見当たらず、苦労した。。

#参考
[Route53のMXレコード登録](https://blog.apar.jp/web/656/)

この記事に助けられました。
[お名前メールライトと、Route53の連携](https://sekaiokaeru.com/onamae-mail)
ansibleでローカルのキーペアを作る

```
- hosts: all
  tasks:
    - local_action:
        module: stat
        path: "{{ lookup('env', 'HOME') }}/.ssh/id_rsa"
      run_once: yes
      register: stat_id_rsa
    - local_action:
        module: openssh_keypair
        path: "{{ lookup('env', 'HOME') }}/.ssh/id_rsa"
      run_once: yes
      when: not stat_id_rsa.stat.exists
```
クラウド初心者のAWS入門(第9回)

# 第9回 NATゲートウェイの構築
今回はプライベートサブネット上のインスタンスが、インターネットから必要な情報を取得できるようにするため、NATゲートウェイを作成していきたいと思います。

なお、NATゲートウェイは**作成した瞬間から課金されるため**、使用しない時は削除推奨です。

|![システム構成図_第9回目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/c50ec548-ddc0-b339-9be0-7372d927b97d.png)
|:-:|

NATの必要性を、今までやったことを振り返りながら、以下に記載させていただきます。

* インターネットゲートウェイをVPC(10.0.0.0/16)に割り当てた。
* パブリックサブネットのデフォルトゲートウェイに、インターネットゲートウェイを指定した。
* プライベートサブネットは、内部向け通信(10.0.2.0/24)しかルートテーブルに設定してない(デフォ)。
* なので、プライベートサブネットからは、直接インターネットに接続ができない状態。
* でも、パッチやらソフトウェアをインターネットから持ってくるのが面倒。

NATゲートウェイの機能は現実世界のものと同じで、自宅のiPadやps4のIPアドレスをインターネット接続用アドレスに変換してくれるルータと相違なさそうです。

## NATゲートウェイの作成
まずは、NATゲートウェイを作成します。
VPCダッシュボードから「NATゲートウェイ」を選択して、「NATゲートウェイの作成」です。

|<img width="1142" alt="スクリーンショット 2020-06-03 11.29.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/62806376-5dda-3237-6f50-91aafe36314e.png">
|:-:|

設定項目としては以下となります。

* 割り当てるサブネットの設定
  - NATをパブリックサブネットに作成しますので該当のものを選びます。
* Elastic IPの新規作成
  - 固定IPを新規作成します。「新しいEIPの作成」を選択します。

|<img width="1279" alt="img 2020-06-03 20.55.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/2bd5425d-54e2-8e43-9bdd-a27754a70eb1.png">
|:-:|

作成が完了したら、そのまま「ルートテーブルの編集」を選択して、プライベートサブネットからNATゲートウェイへのルーティングを設定します。

プライベートサブネットに割り当てられているルートテーブルを選択して、「ルート」タブから「ルートの編集」です。

<details>
<summary>ルートテーブルの確認</summary>
「プライベートサブネット」の「ルートテーブル」タブから確認できます。
<dlv>
<img width="549" alt="img 2020-06-03 21.14.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/949fde99-4dc1-9fdb-f03f-ca88880a010e.png">
</dlv>
</details>

内部通信(10.0.0.0/16)以外の通信(0.0.0.0/0)は、NATゲートウェイに飛ばすルートテーブルを設定します。

|<img width="1286" alt="img 2020-06-03 21.13.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/048c9896-b19a-cb47-9183-124d28c172ff.png">
|:-:|

これでNATゲートウェイの作成は完了です。
次回、実際にDBソフトをインストールして、動作を確認したいと思います。

**NATゲートウェイは存在するだけで課金されます、少ない手順で作成できるので、削除→使用の都度再作成が良いです**

### 参考文献
[Amazon Web Services 基礎からのネットワーク&サーバー構築](https://shop.nikkeibp.co.jp/front/commodity/0000/231260/)
【Rails】turbolinksを無効化する方法

# 開発環境

・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# 完全に無効化する方法

# 1.`Gem`を無効化

```ruby:Gemfile
# コメントアウトする
# gem 'turbolinks', '~> 5'
```

```terminal:ターミナル
$ bundle update
```

# 2.`application.js`を編集

`=`を削除する。

```javascript:application.js
// 変更前
//= require turbolinks　

// 変更後
// require turbolinks　
```

# 3. `application.html.slim`を編集

`'data-turbolinks-track': 'reload'`を削除する。

```slim:application.html.slim
/ 変更前
= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload'
= javascript_include_tag 'application', 'data-turbolinks-track': 'reload'

/ 変更後
= stylesheet_link_tag    'application', media: 'all'
= javascript_include_tag 'application'
```

# 部分的に無効化する方法

### 1.JavaScriptを編集する方法

**①`~.js`ファイルの場合**

```javascript:~.js
$(document).on('turbolinks:load', function() {
  // turbolinksを無効化したい処理
});
```

**②`~.coffee`ファイルの場合**

```coffeescript:~.coffee
$(document).on 'turbolinks:load', -> 
  # turbolinksを無効化したい処理
```

### 2.リンクを編集する方法

**①link_toに属性を追加する場合**

```slim:~html.slim
= link_to '', root_path, 'data-turbolinks': false
```

**②divで囲う場合**

```slim:~html.slim
div data-turbolinks='false'
  = link_to '', root_path
```
【統計学の考え方】副作用と臨床試験【統計検定準1級】

# はじめに
　統計検定準一級の過去問(2019年)を解いていて、統計学のアイデアが詰まっていて面白いなぁと改めて感じた問題がありました。そこで、その問題の内容を使って統計学の考え方を紹介しようというのがこの記事の目的になります。もし興味がありましたら是非ご覧になってくださいね。問3の問題です。

# 副作用の発生確率
　薬には、副作用がつきものですよね。もちろん副作用の度合いはたくさんありますが、ここでは0.1%未満の発生確率であれば許容できるような、そんな副作用だったとしましょう。さて、「0.1%未満の確率でしかこの副作用は発生しない」というためには、どれくらい薬の臨床試験を行う必要があるのでしょうか？

　すっごく普通に考えてみると、こういう発想になるのでしょうか。

「1000回試してみて、一度も発生しなければ確率0.1%未満でしょ？」

　でもこれよくよく考えてみると誤った考え方です。なぜなら、「**実施した1000回の臨床試験(標本)の中にたまたま1回も副作用が含まれなかっただけ**」かもしれないからです。逆に言えば、「確実に副作用の発生確率が0.1%未満だ」と主張するのはそもそも不可能ということになります。臨床試験を1億回やったって10億回やったって「たまたま0.1%未満の発生確率だったかも」って言えちゃいますからね。**世界中の人全員で試さない限り100%正しいなんていう主張はできません**。しかし当然ですが、世界中の人全員で試すのであれば臨床試験の意味がありませんね。一体どうすればいいのでしょうか。

# 統計学の発想
　そこで、統計学では「100%こうだ」という主張はせずに、確率の概念を使って「◯◯%の確率でこうだ」という主張をすることを考えます。統計学では多くの場合、〇〇%には95%という確率を用いるケースが多いです。そこでここでも同じように、「**95%の確率で、この副作用の発生確率は0.1%未満である**」という主張を行うことを考えてみましょう。さてこの主張であれば、**十分な回数の臨床試験を行い、一人も発症者がいなければ**良さそうです。では、一体何回の臨床試験を行えばこういう主張が可能なのでしょうか。

# 数学を使ったモデリング
　この章では実際にこれを計算によって確かめてみましょう。この副作用が発生する確率を $p$ とします。すると、副作用が発生しない確率は $1-p$ と表現されますね。次に、この臨床試験を受ける人の数を $n$ で表現することにしましょう。すると、この $n$ 人全員で副作用が発生しない確率($X_p$) は以下のように求められます。

```math
X_p = \underbrace{(1-p)\times(1-p)\times\cdots\times (1-p)}_{n\ \small{\mbox{個}}} = (1-p)^n
```

逆に言えば、少なくとも一人で副作用が発生する確率($Y_p$)は

```math
\begin{align}
Y_p &= 1-X_p  \\
&= 1 - (1-p)^n
\end{align}
```
となります。ここで、(我々がもともと示したかったこととは異なりますが) 仮に副作用の発生確率が 0.1%、すなわち $p=0.001$ であるとしましょう。統計学ではこのように、「示したいと思っていないことを最初に仮定する」ことを良くします。こうした仮定は**帰無仮説**と呼ばれます。すると、$n$ 回の臨床試験で少なくとも一人の副作用が確認される確率($Y_{0.001}$)は

```math
Y_{0.001} = 1- (1-0.001)^n
```
となりますね。つまり、臨床試験の回数 $n$ が変われば、「副作用の発生確率が0.1%であったときに、副作用が少なくとも一人に観察される確率」も変わります。これを図にしてみるとこんな形になります。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641580/c5dd630d-b56f-113a-dc86-3fb2b692b890.png)

当たり前といえば当たり前ですが、$n$ が増えれば増えるほど副作用が確認される確率も大きくなっていき、100%に限りなく近づくようになります。逆に言えば、どんなに試行回数を増やしても100%になることはありません。
　さてこの「副作用発生確率が0.1%の下で、少なくとも一人副作用が発生される確率がちょうど95%」となるような $n$ を $n^* $ としてみましょう。この $n^* $ は図にすれば以下の交点のX座標で求められます。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641580/5a3c255f-3bb4-0140-ed4f-dcf6bdcec029.png)



実際に計算すると、$n^*=3000$ ぐらいになります [^1]。 

[^1]: 本来この問題の出題の意図は、この $n^*$ の値を自然対数の近似 $\log(1-\epsilon) \approx \epsilon$ を使って求めてみてください、という趣旨のものでした。興味がある方は是非挑戦してみてください。

ここで、以下のように考えてみましょう。

$n^*(=3000)$ 回の臨床試験を行って、副作用が一度も確認されない
→ 95%の確率で観察されるはずのことが起きないことを意味
→ そういえばこの「95%」という確率は、$p=0.001$ という前提で計算されていた
→ この前提がおかしいんじゃ？副作用が発生する確率は0.001より低いんじゃないの？

というように、示したかったものではない前提 ($p=0.001$) を確率的に評価して否定することにより、結局我々が示したかった $p<0.001$ を主張することができるようになります。まさに、**確実にそうとは言えないけど、95%ぐらいの確率で $p<0.001$ だと主張できる**わけですね。

# 終わりに
　2020年6月現在、新型コロナウイルスに対する新薬の開発及び実用化に向けて急ピッチで作業が進められています。新薬には副作用が発生するリスクがありますので、検証が必要になります。「副作用が1000人に1人未満でしか起きないことを95%の信頼度で主張したい」となった時、実は3000回もの臨床試験が必要になるというのは実に大変なことだなぁと思いました。
　こうした、実社会に近い問題を考えることを通じて、統計学に興味を持って貰える人が増えたら嬉しいです😃！最後までお読みくださり有難うございました！
[sequelize-cli] typescriptで使いたい！

sequelizeを使う時はcliでマイグレーションすることが多いと思いますが、出力されるファイルはjsです。イケてないですね（諸説）

sequelize-cli-typescript という素晴らしいモジュールもありますが、最終更新が2年前なので惜しいです。

## とりあえず model を作成する

```
npx sequelize-cli init


こうなる
 |- models
 |- migrations
 |- seeders
 |- config
```

```
npx sequelize-cli model:generate --name member --attributes name:string --underscored
```

id, name を持つ member モデルが作成されます。ついでにindex.jsも。

```js
'use strict';
module.exports = (sequelize, DataTypes) => {
  const member = sequelize.define('member', {
    name: DataTypes.STRING
  }, {
    underscored: true,
  });
  member.associate = function(models) {
    // associations can be defined here
  };
  return member;
};
```

オプション
- underscored: 自動生成の `created_at`・`updated_at` がスネークケースになります。



## 型定義をつける

公式documentの [typescript](https://sequelize.org/master/manual/typescript.html) を読むと、

- class
- .define

のどちらかを使う必要がありそうです。生成されたものが define なので、それに合わせた型定義ファイルを作成します。

```
階層

models
 |- index.js
 |- member.js
 |- index.d.ts <-作成
```

```ts
import { Model, BuildOptions } from 'sequelize';

/* モデルの数作成する */
interface MemberModel extends Model {
    readonly id: number;
    name: string;
    readonly created_at: date;
    readonly updated_at: date;
}

type MemberModelStatic = typeof Model & {
    new (values?: object, options?: BuildOptions): MemberModel;
}
/* --------------- */

interface DBModel {
    member: MemberModelStatic;
}

declare const db: DBModel;
export = db;
```

こうすることで、index.js で `module.exports` されている db に型定義がつきます。

※ `DBModel` のキーはモデル名と同一にする必要があります。


## 使う

`find` や `create` などの補完が出てくれます。

![スクリーンショット 2020-06-04 11.40.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286025/015cb991-6935-bfe8-af46-deaa866a3e28.png)


ただし、`find` 系の返り値が `any` になります。（死）  
嫌な人は class の書き方か、typeorm を使おう。
DapperでのIN句（fsharp）

# Summary

DapperでIN句

メモ書き

## Sql

```sql
(
  CASE
    WHEN (@LenFoo = 0 ) THEN
      true
    ELSE
      tbl.AAA IN @Foo
  END
)
```

or

```sql
((tbl.AAA in @Foo) or (@LenFoo = 0)
```

## fsharp

```fsharp
{|
  Foo = foo
  LenFoo = List.length( foo )
|}
|> fun x -> con.Execute(sql,x) |> ignor
```

## foo list の中身
```
[]
["aaa"]
```

## ref
https://github.com/StackExchange/Dapper#list-support
https://stackoverflow.com/questions/18690395/check-null-for-list-parameter-in-dapper
MATLABのクラス外からPublic Functionを呼び出す書き方 2通り

# MATLABで特定のクラスのPublic Functionを外から呼び出す方法

問題設定：
`ABC`というクラスに`abcplot`というパブリック関数を作ったとする（引数は`x,y`）。
他のプログラムからこの`abcplot`を呼びたい。

## 手法１：ドット表記を用いた書き方

見慣れた書き方ではこう書けます。観測した範囲ではこれでも動きます。

```matlab

obj = ABC
obj.abcplot(x,y)
```

## 手法２：関数にクラスオブジェクトを渡す書き方

一方，MATLABのドキュメントでは以下の書き方で説明されている場合があります。


```matlab
obj = ABC
abcplot(obj,x,y)
```

~~ええ…この書き方が何故嬉しいのか，他の関数と区別しづらくないのか全くわかりません。誰か教えて下さい。~~

[メソッドの呼び出し](https://jp.mathworks.com/help/matlab/matlab_oop/method-invocation.html)の箇所で説明されていました。このobjの部分に複数のクラスを与えてその中から関数を検索させることができるようです。

ただ，ドット表記の方が呼びたい関数を正確に呼べるとも説明されています。

### 所感：なぜ手法２が少し優先して説明されているのか？

なんとなくMATLAB側は手法２を優先させている節があります。上記の説明でも最初に手法２を提示していますし，以下の説明や質疑でもそれとなく手法２を推しているように思えます。

- [Q&A](https://jp.mathworks.com/matlabcentral/answers/380026-how-do-i-properly-call-a-public-function-within-an-app-designer-generated-class)
- [App designerのコールバックの説明](https://jp.mathworks.com/help/matlab/creating_guis/creating-multiwindow-apps-in-app-designer.html)の「メイン アプリへの情報の返送」

手法間の違いは少しわかりましたが何か他の意図でもあるのでしょうか？他の言語でも似たような文化があれば気になります。
【注意喚起】取引先として要注意な人物を見抜く方法

# 背景

私は小さいときから「お人好し」と言われるような人間で、過去に何度も不快なことに遭遇してきました。

不快なことには色々(詐欺被害にあう直前に助けられたことも！)ありますが、そういったことをする人物には共通している特徴があるのでまとめてみました。

ITエンジニアとして「フリーランス」を目指す人が増えているようです。独立すると直接取引する機会が増えてきます。そういった時に悲惨な目にあわないようにという老婆心です。参考になれば幸いです。

(コメント欄で、みなさんのノウハウも教えて頂けると嬉しいです。もしくは注意喚起タグをつけて記事投稿とか？)

# 要注意人物の特徴とは？

**自己顕示欲**が強く、**利己的**で、**自制心が弱い**人が該当します。

表現を変えると、自身のプライドを満たす「**誇れる何か**」が確立されておらず、**自信が無い**、**自我が満たされていない**とも言えます。

このような人は約束を守りませんし、平気で無茶ぶりしてきます。

取引先なら支払いを受けられない、部下だと横領されるとか。

次は、このような人物を見抜く方法です。

# 要注意人物を見抜く方法は？

## 外観編

以下は要注意です。３０歳を超えて該当する場合は相当危険だと思います。

| 外観 | 表しているもの | 備考 |
|:--|:--|:--|
| 茶髪  | 自己顕示欲の強さ  | 自己が確立されていない  |
| これみよがしに金のアクセサリ(ブレスレット・ネックレス)  | 自己顕示欲の強さ  |   |
| 小太り・肥満  | 自制心が弱い  |   |

なお、若いうちは「自分探し」していて、その一環で「外観で違いを出したくなる」ことがあります。
実際、私も２０代前半は、茶髪で、金の太いネックレスして、真っ赤なスーツを着て、いきがってましたので。汗

ので若い人であれば上記の特徴で全てを判断することはできません。(小太りはやばいかも。)

## 発言編

以下は要注意です。こちらは若い人でも危険です。これらを裏返すと「信頼できる人」の見分け方になります。

- 自慢が多い/大きく見せたがる
    - しかも自分でなく知り合いや上司の自慢
- 前任者や自社社員の悪口を言う。感謝や尊敬がない
- 部下に横柄   
- 偉い人や仕事をくれる人の前では卑屈。裏では「あの人は何もわかってない」と手のひら返し

## 質問してみる

前述した「発言」は、雑談しないとわかりません。お茶したり、飲み会の時に、以下のように話をふってみて反応を見ます。

- 御社の◯◯さんって、凄いですね！
- 御社の◯◯さんはどんな方ですか？
- 前任の会社さんはどのような感じだったんですか？何か不満があったのですか？

## 要注意人物でなくても気をつけること

要注意人物でなくても、気をつけたほうがよいケースもあります。

具体的には以下のような会社です

- システム開発やアプリケーション開発の経験が初めての会社
- 過去のプロジェクトの話を聞くと失敗ばかりという会社

システムやアプリケーションの開発プロジェクトは、容易に失敗します。

失敗の原因の大半は「**技術力不足**」ではありません。
多くは「**要件が決まらない。**」もしくは「**開発中に何度も仕様変更や追加要件が発生する**」ことに起因します。
この問題の根本原因はざっくりと言えば「**発注側の能力不足**」です。

開発プロジェクト経験がない会社さんはもちろん、失敗を繰り返している会社さんにもこの能力が欠けています。

「良識のある担当者」であっても、そのプロジェクトが失敗する可能性は高いので気をつけましょう。

なお、上述したようなリスク(=仕様変更や追加の扱いや費用負担)を**契約**に含めて、適切に**プロジェクトマネジメント**(変更管理を実施)することによって被害を軽減することはできますが、それでも「プロジェクトそのものが楽しくない」のでやはり最初から取引しないことをおすすめします。

**「失敗」の定義**

```
【プロジェクトの失敗】工期・納期、品質、予算のいずれかもしくは複数・全てを満たせない。
【受注者にとっての失敗】妥当な対価を得られない。工期遅延により他の収益機会を失う。多大なストレス。
```


# その他の注意喚起系の記事

- [【見積依頼のさばき方】Webサイト制作会社から依頼される機能開発の「予算感」がかなり違っていたので、丁寧に説明してみた](https://qiita.com/s-katsumata/items/7dc9e256cf7cfd0fef8b)
- [【注意喚起】予約機能付きホームページもしくはシステムの選び方／悪質商法被害にあわないためのチェックポイント](https://qiita.com/s-katsumata/items/29e068f32c6660ffc8e8)
- [【注意喚起】[MLM勧誘]j-tech.dev エンジニア特化ヘッドハンターを名乗る山本彩 からのアポイントメール](https://qiita.com/s-katsumata/items/952f564fd2820eb4b282)
Numpy

このページでは次の設定が既に行われているものとして説明を進めます。

```python
import numpy as np
```

# N-d array
以下の説明では、次に定義する配列を使いまわします（接頭辞`na`はNdArrayのつもりです）。

```python
na_0 = np.array([])
na_1 = np.array([1,1,1,1,1])
na_2 = np.array([2,2,2,2,2])
na_3 = np.array([3,3,3,3,3])
```

## 追加・削除
留意点は`numpy`の追加・削除メソッドは、非破壊なので__代入__する必要がある。

### append

```python
na_1 = np.append(na_1, na_2)
print(na_1)
# array([1, 1, 1, 1, 1, 2, 2, 2, 2, 2])

na_1 = np.append(na_1, na_3)
print(na_1)
# array([1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3])
```

### vstack
```python
na_1 = np.vstack((na_1, na_2))
print(na_1)
# array([[1, 1, 1, 1, 1],
#        [2, 2, 2, 2, 2]])

na_1 = np.vstack((na_1, na_3))
print(na_1)
# array([[1, 1, 1, 1, 1],
#        [2, 2, 2, 2, 2],
#        [3, 3, 3, 3, 3]])
```

## 評価
### 空かどうか

```python
>>> na_0 = np.array([])
>>> na_0.size == 0
True
```
Vimで編集中のバッファを別のタブに移動したい

# 背景

Vimでタブを使うこと自体賛否両論ありそうだが、自分は大体以下の流れでよく使う。

- 編集し始める
- 関連ファイルをsplitで開き続ける
- ウィンドウが小さくて文字が見えなくなる
- 仕方ないので <kbd>C-w</kbd> <kbd>T</kbd> でファイルを別タブに開く(全画面になるのでうれしい)

かなり雑にタブを開くので、タブがいくつあるか、どのタブになにが入っているかは把握していない。
`:set showtabline=0` と設定する程度にタブに関心がない。

計画性がないため「やっぱりこのバッファはこっちのタブに移して、このファイルとsplitで並べて編集したい」とか事後で思うことが頻繁にある。
そこで表題の「編集中のバッファを他のタブに移したい」が発生する。

# 困った

Vim標準のコマンドだと編集中のバッファを他のタブに移すのは、意外とスムーズにはできないことが分かった。インターネット上で紹介されているやり方をみると以下のようなものがあった。

- 事前にsplitしてから <kbd>C-w</kbd> <kbd>T</kbd> する
    - たしかにそうすれば後から開き直したくなることはないが、そもそもそこまで計画性がないのが問題
    - また新たに開かれたタブに旧タブ内のバッファを移したい時など、柔軟に対応できない
- 開きたいときに `:b` コマンドで都度開く
    - ファイル名に関心がないため、パッとファイル名をタイプできない
    - そもそもパッと出てきたとしても、それなりに手間である
    - 未保存のバッファも散らかす癖があり、それらはファイル名で指定できない
- タブをマージするプラグインを使う
    - タブに関心がないため、どのタブをマージすればいいかを指定できない
    - またユースケースとしては、タブの内一部の「バッファを移動したい」ことが多く、「タブをマージする」というアクションとは微妙に一致しない

どれも自分のやりたいこととは異なり、困った。

# 困りに対する対応

自分のニーズが特殊なようなので、結局プラグインを作った。
https://github.com/gitusp/yanked-buffer

設計としてはかなりシンプルで、以下のようになっている:

- 既存のウィンドウを閉じるコマンド(<kbd>C-w</kbd> <kbd>q</kbd>)を拡張し、隠されたバッファの `bufnr` を記憶しておくようにする
- ↑で記憶した `bufnr` を開くコマンドを提供する(<kbd>C-w</kbd> <kbd>Q</kbd>が空いてたので、自分はそれに割り当てている)

結果バッファの操作が快適になり、より計画性が不要になった。
副次的ではあるが、間違ってウィンドウを閉じてしまった時とかにも復元が楽になった。
JavaでAWS S3オブジェクトの削除

AWS SDK for Javaを利用して、S3オブジェクトの削除ができます。

#1つのオブジェクトの削除
bucket名とオブジェクトキーを指定すれば、指定オブジェクトの削除ができます。

``` Java
try {
    final AmazonS3 s3 = new AmazonS3Client();
    s3.deleteObject(bucket_name, object_key);
} catch (AmazonServiceException e) {
    e.printStackTrace();
}
```
#指定フォルダーにある全てのオブジェクトの削除
bucket名とフォルダー名を指定すれば、指定フォルダーにある全てのオブジェクトの削除ができます。

``` Java
try {
    final AmazonS3 s3 = new AmazonS3Client();
　　ObjectListing objListing = s3.listObjects(bucket_name,folder_nm);
    List<S3ObjectSummary> objList = objListing.getObjectSummaries();
    for (S3ObjectSummary obj : objList) {
         s3.deleteObject(bucket_name, obj.getKey());
    }
} catch (AmazonServiceException e) {
    e.printStackTrace();
}
```
s3.listObjectsは以下のようなポリシー設定は必要。

```yaml
PolicyDocument:
      Version: 2012-10-17
      Statement:
        - Effect: Allow
          Action: "s3:*"
          Resource:
            - "arn:aws:s3:::bucket-test-01"
            - "arn:aws:s3:::bucket-test-01/*"
```
【Rails】Google Mapに複数マーカーを表示し、クリックしたら吹き出しを出す方法

# 目標

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579893/840e85eb-bf4a-e9b6-56da-1bcd16818230.gif)

# 開発環境

・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# 前提

下記実装済み。

・[Slim導入](https://qiita.com/matsubishi5/items/b639ffddecc626856039)
・[ログイン機能実装](https://qiita.com/matsubishi5/items/5bd8fdd45af955cf137d)
・[Google Map表示](https://qiita.com/matsubishi5/items/196fa1941da2152b6d5d)
・[Gocoding APIで緯度経度を算出](https://qiita.com/matsubishi5/items/1b784dbbe5f1c336ac70)

# 実装

### 1.コントローラーを編集

```ruby:users_controller.rb
def index
  @users = User.all
  gon.users = User.all
end
```

### 2.ビューを編集

```slim:users/index.html.slim
#map style='height: 500px; width: 500px;'

- google_api = "https://maps.googleapis.com/maps/api/js?key=#{ ENV['GOOGLE_MAP_API'] }&callback=initMap".html_safe
script{ async src=google_api }

javascript:

  let map;
  let marker = []; // マーカーを複数表示させたいので、配列化
  let infoWindow = []; // 吹き出しを複数表示させたいので、配列化
  let markerData = gon.users; // コントローラーで定義したインスタンス変数を変数に代入

  function initMap() {
    geocoder = new google.maps.Geocoder()

    map = new google.maps.Map(document.getElementById('map'), {
      center: { lat: 35.6585, lng: 139.7486 }, // 東京タワーを中心に表示させている
      zoom: 12,
    });

    // 繰り返し処理でマーカーと吹き出しを複数表示させる
    for (var i = 0; i < markerData.length; i++) {
      let id = markerData[i]['id']

      // 各地点の緯度経度を算出
      markerLatLng = new google.maps.LatLng({
        lat: markerData[i]['latitude'],
        lng: markerData[i]['longitude']
      });

      // 各地点のマーカーを作成
      marker[i] = new google.maps.Marker({
        position: markerLatLng,
        map: map
      });

      // 各地点の吹き出しを作成
      infoWindow[i] = new google.maps.InfoWindow({
        // 吹き出しの内容
        content: markerData[i]['address']
      });

      // マーカーにクリックイベントを追加
      markerEvent(i);
    }
  }

  // マーカーをクリックしたら吹き出しを表示
  function markerEvent(i) {
    marker[i].addListener('click', function () {
      infoWindow[i].open(map, marker[i]);
    });
  }
```

吹き出しの内容ををリンクにしたい場合は下記の様に記述する。

```javascript:
// 各ユーザーのIDを変数化
let id = markerData[i]['id']

infoWindow[i] = new google.maps.InfoWindow({
  // <a>タグでリンクを作成
  content: `<a href='/users/${ id }'>${ markerData[i]['address'] }</a>`
});
```

# 注意

`turbolinks`を無効化しないと地図が切り替わらないので、必ず無効化しておきましょう。

[turbolinksを無効化する方法](https://qiita.com/matsubishi5/items/c4c8a5df03ae630ae534)
Unity IAPは公式APIドキュメントがないので課金処理は自前ネイティブ実装がいいかも

# まとめ
- https://docs.unity3d.com/Manual/UnityIAP.html
- マニュアルはある。しかしAPIについての最新の説明は存在しないので自己責任でやるしかない。
- 自分でネイティブ連携するのが最強

# 現状
- https://forum.unity.com/threads/where-has-unity-iap-scripting-reference-gone.660454/
    - Where Has Unity Iap Scripting Reference Gone?(Unity IAPのスクリプトリファレンスどこにやった？)

-https://forum.unity.com/threads/where-has-unity-iap-scripting-reference-gone.660454/#post-4543948

> Understood on the concern. As we are moving more towards Package Manager, we've had to adjust our documentation work flow, and it's still a work in progress. It is something we are actively working on, apologies on the inconvenience.
> JeffDUnity3D, May 15, 2019
> (今作業中です(2019/05/15))

つまり1年以上放置されてるわけで Unity 2018.3 以降は最新の情報を得る手段がありません。つまりLTS基準で考えると2018版から現在までドキュメントのないものを雰囲気で実装してるわけでAppleやらGoogleやらの方でPurchasing APIに変更やら機能追加やらが入ったときにちゃんと追従されるかも怪しい気がします。
[nuxt x firebase] IE11で 'Headers' is undefined と出る

# 状況

### 環境
- Nuxt 2.10.2
- firebase 6.4.0


Nuxt x firebase で開発していて、IE11で functions（`onCall関数`）を叩いた時にエラーが出た。

```javascript
const getUser = functions.httpsCallable('getUser');
getUser();
```

# エラー内容

```
Unhandled promise rejection ReferenceError: 'Headers' は定義されていません。
// もしくは 'Headers' is undefined
```
とブラウザのコンソールに出る。


# 原因
firebaseのバージョン
5.11.1までは動作するが、6.0.0から動作しない

IE11がfetch対応していないのが問題
https://stackoverflow.com/questions/47534859/headers-is-undefined-in-ie11

6.0.0からはplyfillが必要みたい
https://firebase.google.com/support/guides/environments_js-sdk?hl=ja#suggested-polyfills

`@babel/preset-env`を入れて見たけどうまくいかない
https://github.com/babel/babel/issues/9160

# 解決

以下のようにすることで、6.0.0以降でもIE11で動作するようになります。
（正攻法かどうかは分かりません）

#### `whatwg-fetch`をインストール

```
$ npm install whatwg-fetch
```

#### pluginファイルを作成する
```plugins/polyfill.ts
import 'whatwg-fetch';
```

#### configで読み込む
```nuxt.config.ts
plugins: [
  '@/plugins/polyfill'
],
```
Spring Security 5 で OAuth2をつかう。


[前回](https://qiita.com/ryotaro76/items/6c8405fada7a6fead7cc)、Spring Securityをやってみましたが、今回は、OAuth2をやってみたいと思います。
GoogleやFacebookで認証することになりますが、今回はGoogleでやってみます。

## 環境

Eclipse Version: 2019-03 (4.11.0)
Java 11
Spring Boot 2.1.5
Spring Security 5.1.5

## 前準備
[Google Cloud Platformのコンソール](https://console.cloud.google.com/projectselector2/home/dashboard)で必要な情報を設定します。

下の画面が表示されたら、「作成」のリンクをクリックしてください。
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/3ccea3fe-ae2a-69df-be99-205dc3befe9d.png)

下の入力画面が表示されるのでプロジェクト名を適当につけて「作成」を押下
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/a818f887-80d8-c96c-83bd-8be0be742255.png)

作成が終わったら、メニューの「APIとサービス」 -> 「認証情報」を選択
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/891be3d2-4545-73c7-9727-74ff4fabb5f0.png)

下の画面が表示されたら、OAuth同意画面の設定を選択

必要な情報を下の画面に入力し「保存」を押下する
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/4e517da6-2062-70de-6a2a-16c605f8c2e3.png)

- アプリケーションの種類 … 「内部」を選択
- アプリケーション名 …「Sample」を入力

下の画面が表示されたら、「認証情報の作成」 -> 「OAuthクライアントID」を選択
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/af72ff59-ceac-42e5-d384-ad39d9b8d177.png)

下の画面が表示されるので、必要な情報を入力し、「作成」を押下する
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/f3c8d164-fe56-7677-7548-e43103f5462f.png)

- アプリケーションの種類 … Webアプリケーション
- 承認済みのリダイレクトURL … http://localhost:8080/login/oauth2/code/google

作成が終わると、以下の画面が表示されるので、クライアントIDと、クライアントシークレットを控えておく。
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/eef9af48-d33d-55f4-8926-48956646b8b0.png)

## 新規プロジェクトを作成する

- Eclipseを起動する
- ファイル > 新規 > プロジェクトを選択
- ウィザードで、「Spring スターター・プロジェクト」を選択
-「次へ」を押下
- 名前は適当設定、Javaバージョン「11」、「Gradle」を選択し「次へ」を押下
- 「DevTools」「セキュリティー」「Web」「Thymleaf」「OAuth2クライアント」を選択し、「完了」を押下