OmniAICreator/Qiita-1.07M huggingface dataset:
頭部伝達関数を使ったデモをUnity WebGLで無理やり作った

# 作ったもの
頭部伝達関数を使って音にエフェクトをかけ、ヘッドホンから出た音が頭の外側で鳴っているような感じで再生されるデモを作りました。
また、手っ取り早く試せるようにWebGLで作成しました。
イヤホン・ヘッドホンを着けて聞いてみると、頭の周りで音が鳴っているような感じがすると思います。
# WebGLにるデモ
作ったものはこちら。
[HRTF-Demo-WebGL](https://morishift.github.io/HRTF-Demo/HRTF-Demo-WebGL/index.html)

上のリンクを開くと、下のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543172/05989ea2-32f3-6685-f5b0-9477b31663b3.png)

## 使い方
1. 画面上をタッチする。タッチと同時に音が鳴る。(大きい音がするので注意)
1. 緑の円がタッチしたところに表示される。この円はドラッグで動かせる。
1. 緑の円の動きに少し遅れて赤い円が動く。
1. 赤い円の方向に対応して鳴っている音の方向が変化する。
1. 中央黄色い円を押すとサウンドがエフェクトなしで再生される
1. 画面下側のボタンを押すと再生される音が変わる

（再生中にノイズが発生しますが仕様です。）
# ソースコード
https://github.com/morishift/HRTF-Demo
Unity 2019.4.11f1
# 実装
音に対して頭部伝達関数と呼ばれるデータ（実際には方向に対応するインパルス応答）を使って、選択した方向から音が鳴っているようなエフェクトをかけています。以下の記事がわかりやすいです。
[立体音響を動的に生成する](https://qiita.com/siy1121/items/5c8715099c4470b7e6f3)
### サウンドファイル
wavファイル、44100Hz,16bitモノラル
（サンプル曲はGaragebandで作成）
### 畳み込み計算
サウンドデータとインパルス応答との畳み込み計算をするわけですが、
定義通りの畳み込み計算をそのまま実行すると時間がかかりすぎます。
なので、[重畳加算法](https://ja.wikipedia.org/wiki/%E9%87%8D%E7%95%B3%E5%8A%A0%E7%AE%97%E6%B3%95)を使います。
### 頭部伝達関数データ
頭部伝達関数のデータとして、以下を使用しました。
元データには頭に対して上下方向の情報も含まれています。このアプリでは頭と同じ高さのデータのみを利用しています。
Bill Gardner and Keith Martin
MIT Media Lab
HRTF Measurements of a KEMAR Dummy-Head Microphone
https://sound.media.mit.edu/resources/KEMAR.html
# 無理やりなところ
Unity WebGLのサウンドに関する機能に制限があり、無理やりな事をやっています。
[WebGL でオーディオの使用](https://docs.unity3d.com/ja/2019.4/Manual/webgl-audio.html)
Unity公式でアナウンスされているように、UnityWebGLではサウンドについては一部機能しか使えません。単純に音を再生するだけなら問題ありませんが、それ以上のことをやろうとしてもあんまり上手く行きません。(別途プラグインを導入すれば解決できるのかも)
### AudioClipから波形データが取得できない
Unityではサウンドの波形データはAudioClipオブジェクトから取得できます。
しかしWebGLではそれができません。(AudioClip.GetData()が使えない。SetData()は使える。)
そのため、Unityプロジェクト内にバイナリデータとしてwavファイルを配置しておき、実行時に直接読んで波形データを取得しています。
### AudioClipのストリーミング再生ができない
AudioClipでストリーミング再生ができれば音にエフェクトを加えながら再生させることもやりやすくなります。しかし、WebGLではサポートされていません。
そのため、1秒程度のAudioClipを連続的に生成・再生しています。
一つのAudioClipで再生するサウンドデータは32分割し、その分割した断片に方向に対応するインパルス応答を畳み込むようにしました。

音の方向を選択した直後に鳴っている音が変更されず、遅れて反映されるのはこれに起因します。また、AudioClipとAudioClipのつなぎ目のところでかなり大きいノイズが発生します。


# 既存の立体音響SDK
Unityで使える立体音響SDKはすでにあります。
本気で立体音響の実装を考えるならこれらを試すのが良いと思います。
Audio Spatializer SDK
https://docs.unity3d.com/ja/current/Manual/AudioSpatializerSDK.html
Resonance Audio
https://resonance-audio.github.io/resonance-audio/develop/unity/getting-started
Effective Java(第3版)の個人的なまとめ【項目1】 コンストラクタの代わりにstaticメソッドを検討する

Effective Javaを学んだ個人的なまとめです。

#### 結論
インスタンスの生成や利用を考えるときに、コンストラクタの利用を無意識に考えるのではなく、staticファクトリメソッドも検討に入れよう。


コンストラクタを利用する場合と比較してどのようなメリットとデメリットがあるのか。

#### 👍 メリット
#####1.名前を持つことができる
コンストラクタはクラス名と同じであるため、任意の名前を持つことができない。staticメソッドの場合は、メソッドなのでその動作にあった名前をつけることができるためわかりやすい
#####2. インスタンスを生成する必要がない
キャッシュしているインスタンスの再利用をすることで不用意なインスタンスの生成を防ぎ、計算量、処理量を減らすことができる。(GoFデザインパターンのシングルトン)
#####3.任意のサブタイプのオブジェクトを返すことができる
#####4.返却するオブジェクトを入力によって変えることができる
コンストラクタと異なり、戻り値を任意に定められるため、型にあった任意のオブジェクトを返却することができる。
#####5.クラス作成時に返却されるオブジェクトのクラスがなくてもよい
ある種当たり前の話ですが、コンストラクタの存在のためにはクラスの定義が必要である。一方staticファクトリメソッドの場合はクラスが存在しなくてもよいため、柔軟な対応が可能となる。


#### 👎 デメリット
#####1. publicあるいはprotectedのコンストラクタを持たないサブクラスを作れない
ただ逆に、継承ではなく、コンポジションを使うことをプログラマに促すことができるメリットもある。
#####2. staticファクトリメソッドを見つけるのが難しい
JavaDocが目立たせてくれない。ただ、IDEや命名規則によって解決することが可能ではある。
三菱UFJ銀行サイトにPythonとSeleniumを使ってログインする

三菱UFJ銀行のサイトにPythonとSelenium使ってログインするサンプルコードを書いてみました。

※2021/02/13時点の情報です。

ポイントは以下の通りです。

- ログイン情報を、設定ファイルから取得
- SeleniumuでID、パスワードを入力
- 三菱UFJ銀行の場合、formはsubmitではないのでbutton.click()でログインする


## 環境
- Windows 10
- Python 3.8
- Selenium 3.141.0

## 全体の処理の流れと注意点
全体の処理の流れについては、下記記事に詳しく書いたのでこちらもあわせて確認してみてください。楽天銀行の例になっていますが、処理の流れは同じです。

https://qiita.com/yoshi2045/items/2fff5bf5f0fa763f7104

また、下記記事では他サイトのサンプル一覧と注意点を解説しているのでこちらも参考にしてみてください。

https://qiita.com/yoshi2045/items/a58a7fbebcb9faad3e15

## サンプルコード
```python:bank_ufj.py
#
# 三菱UFJ銀行サイトへログイン
#

import json
from selenium.webdriver import Firefox, FirefoxOptions
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

# 設定ファイルからログイン情報を取得
login_info = json.load(open("login_info.json", "r", encoding="utf-8"))

# ログインサイト名
site_name = "bank_ufj"

# ログイン画面URL
url_login = login_info[site_name]["url"]

# ユーザー名とパスワードの指定
USER = login_info[site_name]["id"]
PASS = login_info[site_name]["pass"]

# Firefoxのヘッドレスモードを有効にする
options = FirefoxOptions()
options.add_argument('--headless')

# Firefoxを起動する
browser = Firefox(options=options)

# ログイン画面取得
browser.get(url_login)

# 入力
e = browser.find_element_by_id("tx-contract-number")
e.clear()
e.send_keys(USER)
e = browser.find_element_by_id("tx-ib-password")
e.clear()
e.send_keys(PASS)

# ログイン実行
button = browser.find_element_by_class_name("gonext")
button.click()

# ページロード完了まで待機
WebDriverWait(browser, 10).until(
    EC.presence_of_element_located((By.ID, "md-allmenu"))
)

# ログインできたか確認（画面キャプチャ取る）
browser.save_screenshot("home.png")

browser.quit()
```


## ログイン情報設定ファイル
サイトURLやログイン情報（IDやパスワード）は、JSON形式のファイルに保持するようにしています。以下のサンプルでは三菱UFJ銀行と楽天証券の2サイトの情報と設定しています。

"id"と"pass"の値を書き換えればそのまま使えるはずです。

なお、このファイルだけは絶対に漏洩しないよう、管理方法に注意しましょう！

```json:login_info.json
{
  "bank_ufj": {
    "id": "1234567890",
    "pass": "password",
    "url": "https://entry11.bk.mufg.jp/ibg/dfw/APLIN/loginib/login?_TRANID=AA000_001"
  },
  "sec_rakuten": {
    "id": "1234567890",
    "pass": "password",
    "url": "https://www.rakuten-sec.co.jp/ITS/V_ACT_Login.html"
  }
}
```

## 実行後

Seleniumで動かしていると実際にログインできているのか、画面遷移できているのかが視覚的にわかりにくいですよね。

そこで動作確認のために画面キャプチャを保存しておくとよいでしょう。

```python
# ログインできたか確認（画面キャプチャ取る）
browser.save_screenshot("home.png")
```

一部ぼかしを入れていますが実際に保存された画像がこちらです。

![biz_home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459893/4e421f56-25d6-ab0e-4d5f-c12608038762.png)
えっ、margin: 0 auto;の0って要らないんですか？

## 左右中央揃えが目的なら要らない場合が多い

恐らく皆さんが`margin: 0 auto;`と記述する際、頭の中では「要素を左右中央に配置したい」と思っているのではないでしょうか？

ところがその目的であれば記事タイトルに書いたように`margin: auto;`で事足りる（場合が多い）のです。

まずは見た方が早いと思うので、下に`margin: 0 auto;`と`margin: auto;`を並べてみました。

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

ウィンドウサイズを変えて見ていただければ分かると思いますが`margin: auto;`でも問題なく左右の中央に配置されています。

## なぜ？

`margin: auto;`は`margin: auto auto auto auto;`と書いたのと同じになり、上下のmarginもauto扱いになります。

そのため、結果的に`0`を抜いても左右中央に配置されます。

参考までに[MDN Web Docsにあるmarginの仕様のリンク](https://developer.mozilla.org/ja/docs/Web/CSS/margin)を貼っておきます。

※ [コメント欄で指摘していただいた通り](https://qiita.com/xrxoxcxox/items/d69c91fee99d77951f0b#comment-7129b737ed34de7868ec)、記載内容が間違っていたため修正しました。

## 逆に、`0`が必要な場面は？

正直そんなに浮かびませんでした。

割と無理矢理ひねり出すなら

- リセット系のCSSをあてておらず、ただの`div`にもブラウザ固有のマージンがあたってしまう
- `.someClass > div { margin-top: 24px; }`などの指定があり、継承してしまうため`0`で上書きしないといけない

## じゃあ`0`ってどこから来たの？

すみません、これが分かりませんでした。
先ほど紹介したMDN Web Docsの中でも以下のように記載があります。

> 最近のブラウザーで何かを中央揃えしたい場合は、 display: flex; justify-content: center; を使用することができます。

> しかし、 IE8-9 のような古いブラウザーはフレックスボックスレイアウトに対応していないため、これは利用できません。親要素内で要素を中央揃えするのであれば、 margin: 0 auto; を使用してください。

当時のブラウザの問題だったのか、CSSの仕様が変わったのか……。

もしご存じの方がいたらコメントで教えていただけると幸いです :pray:
AWS覚書 - boto3を使ってIoT coreのエンドポイントを取得する -

IoT coreを使用するのに、クライアントからカスタムエンドポイントを取得する必要があるので、取得できるようになるまでの手順を覚書しておく。

# 必要なもののインストール
pythonへboto3と、AWSクライアント

### boto3

```zsh
pip3 install boto3
```

### AWSクライアント
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-mac.html

# キーセットの取得
まずはアクセスキーとシークレットーキーが必要

アカウントの IAM → アクセス管理 → ユーザー → アクセスキー と進む。
![スクリーンショット 2021-02-13 12.21.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235422/378ffe64-5ed6-8e58-c44f-e4bae2d08301.png)
アクセスキーを作成してシークレットキーを取得する（一度しか取得できないので紛失に注意する）。

# AWSクライアントへのキーセットの登録

```zsh
> aws configure --profile <プロファイル名(自由な名前でOK)>
AWS Access Key ID [None]: <取得したアクセスキー>
AWS Secret Access Key [None]: <取得したシークレットキー>
Default region name [None]: <デフォルトで使用したいリージョン、東京ならば「ap-northeast-1」>
Default output format [None]: json
```

プロファイルを作成したらプロファイルをデフォルト設定する

```zsh
> set AWS_DEFAULT_PROFILE= <先ほど作成したプロファイル名>
```

ちゃんとキーセットが設定されているか確認する。

```zsh
> aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************3LHQ shared-credentials-file    
secret_key     ****************vexf shared-credentials-file    
    region                us-east-2      config-file    ~/.aws/config

```

以下のファイルに、それっぽいのがあるか確認できる。

```
> cat ~/.aws/credentials
```

# IoT coreのエンドポイントを確認
Iot core → 設定 と進むとみれる。
![スクリーンショット 2021-02-13 12.40.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235422/a1346725-8f13-6854-24c8-9ef3cee4d95e.png)

# クライアントからエンドポイントの取得
pythonから取得する。

```
> python
Python 3.8.2 (default, Apr 27 2020, 13:03:04) 
[Clang 10.0.0 (clang-1000.10.44.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto3
>>> client = boto3.client('iot', region_name='ap-northeast-1')
>>> endpoint_response = client.describe_endpoint(endpointType='iot:Data-ATS')
>>> print(endpoint_response)
{'ResponseMetadata': {'RequestId': '**************', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Sat, 13 Feb 2021 03:42:30 GMT', 'content-type': 'application/json', 'content-length': '74', 'connection': 'keep-alive', 'x-amzn-requestid': '****************', 'access-control-allow-origin': '*', 'x-amz-apigw-id': '********', 'x-amzn-trace-id': 'Root=＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊'}, 'RetryAttempts': 0}, 'endpointAddress': '<ここが実際に取得したいエンドポイントになる>'}
```
整形

```
{
	"ResponseMetadata": {
		"RequestId": "**************",
		"HTTPStatusCode": 200,
		"HTTPHeaders": {
			"date": "Sat, 13 Feb 2021 03:42:30 GMT",
			"content-type": "application/json",
			"content-length": "74",
			"connection": "keep-alive",
			"x-amzn-requestid": "****************",
			"access-control-allow-origin": "*",
			"x-amz-apigw-id": "********",
			"x-amzn-trace-id": "Root=＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊"
		},
		"RetryAttempts": 0
	},
	"endpointAddress": "<ここが実際に取得したいエンドポイントになる>"
}
```
画面でみたエンドポイントと同じであるか確認する。

`boto3.client` の部分は、キーセット直接指定でも問題ない。

```
>>> client = boto3.client('iot', region_name='ap-northeast-1', aws_access_key_id='***', aws_secret_access_key='***')
```
(メモ) k3OS

## Download

* https://github.com/rancher/k3os/releases

## ISOからDISKにインストール

* k3os-amd64.iso

をダウンロードし、Virtualboxなどで起動。

![install.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/f3637d68-fe0e-1d5b-75d0-97d3cc91da8a.png)

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/38603ae3-ec99-2ddf-df90-d6abeb6722c4.png)

## DISKから起動

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/58eed12d-eb1a-5f71-53f2-f166ec27b010.png)

* user:pass = rancher:パスワードなし

![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/e11331e6-552a-bd82-2c14-c8290df94bd0.png)

![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/157d93ff-a985-437d-5027-b16dafedd712.png)

### 設定

ほかの人の記事を読むと`sudo os-config`のコマンドで設定されているが、
`os-config`コマンドはなくなったようで今は
`k3os install`コマンドで設定する様子。


### agentの追加

先ほどのserver側でtoken値を確認しておく。
`cat /var/lib/rancher/k3s/server/node-token`

また、serverのポート`6443`に接続できるようにしておく。

```
k3os install
```

でagentを選択し、先ほどの`node-token`値と、serverの`IP:6443`を指定。
M1 Macbook airにhomebrewをインストールする


## homebrewのインストール
2020/11/6からApple Silicon、Big Surに対応しているようです。

[brew公式ページ](https://brew.sh/)の手順に従ってインストール

```sh:brewのインストール
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

インストールが完了したら、下記のコマンドを実行してZshのパスにbrewを追加する。

```sh:Path通し
echo 'eval $(/opt/homebrew/bin/brew shellenv)' >> /Users/ryo/.zprofile
    eval $(/opt/homebrew/bin/brew shellenv)
```

```sh:確認
$ brew doctor
Your system is ready to brew.
```
brew doctorが実行できればOK
Practical numerical integration on NISQ devices のCanonical QAE (古典的なQAE)

# Practical numerical integration on NISQ devices

以下の論文
[Practical numerical integration on NISQ devices](https://arxiv.org/abs/2004.05739)
を確認してみます。
論文中ではCanonical QAE (古典的なQAE)とML-QAEが比較されていますが、今回はCanonical QAEを扱います。

# 数値積分の量子アルゴリズム

ここで紹介する「積分の量子状態埋め込み」の方法は、あくまで一例(上記論文の方法)で、他にもいろいろな方法があります。
ただ、積分値を振幅に埋め込んで、振幅推定で出すという流れは変わりません。

さて、単位区間$[0,1]$上の1変数関数$f(x)$の積分を求めたいとします。


<img width="400"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/f4712cfd-b5a6-806c-2486-cf8018e09b4b.png">

積分とは$x$軸と$f(x)$で囲まれる部分（緑色部分）の面積に等しいです。

いま、緑色部分を含む1辺1の正方形上に、ランダムに点を打ちます。例えば、8個打ちます。

<img width="400"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/aee0eb77-42cb-fe4b-97d6-2151a9af3626.png">

そして、緑色部分に入ったものを"hit"とみなします。この例では6個の点が"hit"しました。
>積分とは$x$軸と$f(x)$で囲まれる部分（緑色部分）の面積に等しい

という事実から、ランダムに打った点が"hit"する割合は積分値に一致するはずです。
積分値を$a$、打った点の数を$N$,hitした点の数を$N_{hit}$とすると、

<img width="300"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/29629ebd-4265-607a-32f5-16acac0f3186.png">

と計算できます。

この古典的なアイデアをベースに、$N_{hit}/N$を効率的に計算する量子アルゴリズムを考えます。
補助量子ビットを1つ持ってきて、ヒルベルト空間を2つに割ります。

<img width="400"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/0ee59299-3822-1ecf-8b10-b74672e84b58.png">


そして、点がhitであったかどうかに応じて、点を”仕分け”していきます。ここで点を量子状態に対応させています。[^1]

<img width="400"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/7f3956b1-db0d-7ddb-4566-eb6f163420ce.png">

ここで、各点に2進数で名前をつけました。点は全部で8個あったので、ラベルは3量子ビットで足りることになります。

仕分けされた量子状態は、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/6ff0e2b2-371a-d2d6-bf81-d1a4b408004d.png)

このように書けます。

ここで以下のようなベクトルを定義します。（それぞれ、補助量子ビットが 0 , 1 であるベクトルを意味しています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/b763a50e-606b-58e6-918b-014371aeb476.png)

すると、仕分けされた量子状態$|\psi \rangle$は、これらの和であって、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/34961352-f34c-6dee-b2f3-b7a646049d36.png)

このように書けます。
$|\psi_{1} \rangle$の振幅が、求めたい積分値$a$(の平方根$\sqrt{a}$)になっていることがわかります。
この振幅をQAEアルゴリズムで推定すると、古典的な方法の平方根のオラクルコール回数[^2]で計算が終わります。（量子加速）

# 具体例

$N=4$として、$N_{hit}=1$であったとします。先程と同様に、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/039ade16-06e6-6b67-155f-131fe87e3a6a.png)


となります。 $a=1/4=0.25$です。
ここで$\sqrt{a}=\sin\theta$とおいて、$\theta$の推定に帰着させることが多いです。
これは、QAEの内部で動くQPEアルゴリズムが”位相を推定する”アルゴリズムであり、このほうが見やすいからです。

QAEを用いた$a$の推定については、以下の記事にまとめています。

[Qiskit.aquaでQAE3分間クッキング](https://qiita.com/notori48/items/1165597170ad8018efb4)

上記記事の通りにやると、$a = 0.1464466 ≒ 0.25$ という答えが出てきます。ある精度での推定に成功しています。
推定精度を上げるには、QAE内部のQPEで使う補助量子ビット数を増やせばよいです。（上記は3量子ビット使った場合の結果です）
例えば補助量子ビットを7個ぐらい使うと、0.24 ぐらいにはなるようでした。
補助量子ビットを節約したい場合は、Iterative QAE などの方法があります。
こちらもqiskit.aquaに入っていますので、同様の手順で試せます。[^3]

# 結論

論文を読んで、量子回路の実装から動作確認まで出来た。

[^1]: もちろん、この操作は量子並列的に出来ないと意味がないです。
[^2]: この例だとオラクルとは量子並列的に仕分けを行う操作のことです。
[^3]: ただし、出力結果が$a$ではなく$\sqrt{a}$になっているようです。謎。
AWS Cloud9のディスク容量が足りなくなったとき

Railsチュートリアルを進めていると、Cloud9の画面上に「ディスク容量が足りないよ」的なメッセージが出てくるようになりました。
>Your environment is running out of disk space. Please free up space or resize your EBS volume

しばらく無視して進めていた（よくない癖）のですが、ついには新規ファイルの保存ができなくなり、ターミナルも無反応になってしまいました。

この状況から復旧した方法のメモです。

## まずはバックアップ
<img width="400" alt="スクリーンショット 2021-02-11 10.21.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361302/7f165851-618d-dbb0-627a-40ee079e12d6.png">
tar.gz形式でプロジェクトがダウンロードされます。
（Safariでtar.gzファイルをダウンロードすると自動で解凍されるんですね。設定でオンオフできるみたいですが）

## ターミナルを復旧
AWSが教えてくれるコマンドでストレージ容量を増やしたいのですが、私の場合ターミナルが死んでいるので、まずはそちらを直します。

バックアップができていることを確認したら、ファイルを全部削除します。
.c9フォルダに触るのはなんか怖いので残しました。
<img width="400" alt="スクリーンショット 2021-02-13 11.11.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361302/2b94a102-32ba-cec6-dd48-99fb081600d0.png">

この段階で試しに新規ターミナルを立ち上げてみましたが変わらず反応がなかったので、インスタンスを再起動します。

<img width="400" alt="スクリーンショット 2021-02-13 11.12.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361302/c14c37bc-d049-0bae-23e6-7c695fd06b34.png">
<img width="400" alt="スクリーンショット 2021-02-13 11.13.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361302/35d9b876-3d31-51e7-0749-44c5c8ff2134.png">
<img width="600" alt="スクリーンショット 2021-02-13 11.14.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361302/5ed934dc-eb10-9aa5-ee04-916520da6520.png">

これでターミナルが復活しました。一安心。


## ストレージ容量を増やす
[Moving an environment and resizing or encrypting Amazon EBS volumes - AWS Cloud9](https://docs.aws.amazon.com/cloud9/latest/user-guide/move-environment.html#move-environment-resize)
この記事の通りにresize.shを実行します。
正常に完了すると、`df`コマンドで確認したときに`/dev/xvda1`ボリュームに余裕ができているはず。

## バックアップから環境を戻す
バックアップしておいたtar.gz（もしくはtar）をアップロード。
<img width="400" alt="スクリーンショット 2021-02-13 11.44.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361302/0d007cee-db95-3906-3eb8-8710cc7e9d6c.png">

特に進捗など表示されないので、`ls -l`でファイルサイズを見てアップロードが完了したことを確認してから次に進みましょう。

アップロードしたバックアップファイルを展開します。
tar.gz形式の場合は`tar zxvf`です。

```
ubuntu:~/environment $ ls
rails-tutorial.tar  resize.sh
ubuntu:~/environment $ tar xvf rails-tutorial.tar
```

1階層ずれて展開されるので、正しい位置に移動させます。

```
ubuntu:~/environment $ mv environment/sample_app ./
```

最後に今回使ったファイルを消して復旧完了です。

```
ubuntu:~/environment $ rm rails-tutorial.tar 
ubuntu:~/environment $ rm resize.sh 
ubuntu:~/environment $ rm -r environment
```

おつかれさまでした。
duコマンドの全合計値を算出する（awk）

# duコマンドの全合計値を算出する（awk）
awk使えば合計値出せることを知ったのでメモメモ

``` sh
$ df -m | awk '{sum+=$2; print $0}  END{print "合計："sum}'
Filesystem     1M-blocks   Used Available Use% Mounted on
rootfs            227872 218097      9775  96% /
none              227872 218097      9775  96% /dev
none              227872 218097      9775  96% /run
none              227872 218097      9775  96% /run/lock
none              227872 218097      9775  96% /run/shm
none              227872 218097      9775  96% /run/user
tmpfs             227872 218097      9775  96% /sys/fs/cgroup
C:\               227872 218097      9775  96% /mnt/c
合計：1822977
```
データテーブルの連結ー縦方向2 （異なる列名を統合する場合）

テーブルとテーブルの連結には、縦方向（行が増える）と横方向（列が増える）の場合があります。
縦方向の場合は__集合__、横方向の場合は__結合__と言います。

集合には以下の３つのパターンがあります。
　和集合：複数のテーブルのレコードをすべて足す。
　積集合：複数のテーブルの共通するレコードを取り出す。
　差集合：他のテーブルと共通しないレコードを取り出す。

今回は前回 (https://qiita.com/MomonekoView/items/78f51b7385bec42d08ed) に引き続き、
和集合について、SAS プログラムと SQL をそれぞれ用いた例を紹介します。

行いたい操作は下記です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287001/6f03f3fa-001d-c0fa-e797-073b85d96aec.png)
・変数名が共通しているA列を結合。
・変数名が異なるB列とC列については、同じB列として結合。
・B列とC列など、結合される列どうしは同じデータ型である必要があります。

####① SAS プログラム

~~~sas
data table_3;
  set table_1 table_2(rename=(C=B));
run;
~~~
__<font color="Blue"> set </font>__ ステートメントで縦に重ねます。
この時、__<font color="Blue"> rename </font>__  ステートメントにより、table_2 のC列の名前をB列に変換します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287001/6f03f3fa-001d-c0fa-e797-073b85d96aec.png)

####② SQL

~~~sas 
create table table_3 as
select A, B from table_1
union all
select A, C from table_2;
~~~
SELECT文を __<font color="Blue"> union all </font>__ でつなぐと、列名を最初の SELECT 文のテーブルに合わせて連結されます。
各SELECT文での変数の順番が新しいテーブルの列名に対応し、2つ目のSELECT文の列名が最初のSELECT文の列名へ変更されます。
（この場合、table_2 の C が table_1 の B へ変更される ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287001/28d09813-f721-9db9-e067-6e4f7bc997d9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287001/6f03f3fa-001d-c0fa-e797-073b85d96aec.png)


ちなみに __<font color="Blue"> union </font>__ のみとすると、下記のように重複するデータはまとめられてから連結されます。

~~~sas 
create table table_4 as
select A, B from table_1
union
select A, C from table_2;
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287001/5e1bee97-7bf9-dc06-988c-c831eeafe1c5.png)

####関連記事
[データテーブルの連結－縦方向 1（異なる列名をそのまま残す場合）](https://qiita.com/MomonekoView/items/78f51b7385bec42d08ed)
[データテーブルの連結－縦方向 3（積集合と差集合）](https://qiita.com/MomonekoView/items/14fe790b6993c2b3dad3)
[データテーブルの連結－横方向 1（完全外部結合）](https://qiita.com/MomonekoView/items/86f124e53d372290e2a4)
[データテーブルの連結－横方向 2（内部結合）](https://qiita.com/MomonekoView/items/5d067363c506a0ab2013)
[データテーブルの連結－横方向 3（左右の外部結合）](https://qiita.com/MomonekoView/items/434d8bceab29606568e9)
[データテーブルの連結ー交差結合](https://qiita.com/MomonekoView/items/d57a2adf97b10e4549d1)
50行でちゃんと動くリマインダーアプリ「Notification-CLI」をリリースしました


50行でちゃんと動くリマインダーアプリ「[Notification-CLI](https://github.com/yuis-ice/notification-cli)」をリリースしました

以下かんたんな日本語版クイックスタートになります。

> Minimalistic Command Line Notification Application under 50 Lines

50行で実装のシンプルなコマンドラインベースのリマインダーアプリケーション。

## クイックスタート Quick Start

> This will nofity you when 2021 February 20, PM 6:00.

以下で2021年2月20日18時に通知をします。

```
./noc.js -d 2021022018 --desktop
```

> Very much minimalistic.

とてもミニマリスティック。


## インストール Installation

```
git clone https://github.com/yuis-ice/notification-cli.git
cd notification-cli
chmod 755 ./noc.js
npm i
```

## 必要環境 Requirements

- node.js v13.10.1 or higher

```
# node.js [nvm-sh/nvm](https://github.com/nvm-sh/nvm)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
bash
nvm install v13.10.1
node -v
```

## 使用例 Examples

> This will only notify you by command line console output:

コマンドライン出力で通知します。

```
./noc.js -d 2021022018
```

> The output be like:

出力はこんな感じです。

```
$ ./noc.js -d 202102120234
2021-02-12T02:33:16+09:00 Jobs started...
2021-02-12T02:33:16+09:00 You will be notified at: 2021-02-12T02:34:00+09:00
2021-02-12T02:34:00+09:00 Notified.
$
```

> You can abbreviate your seconds, minutes, hours and so on:

秒、分などを省略しても動きます。

```
./noc.js -d 2022
```

> This will notify you when PM 11:00 in the day:

その日の23時になったら通知します。

```
./noc.js -d 23 --format HH
```

> An alias makes your code much more minimalistic:

エイリアスを定義すると、よりシンプルになります。

```
alias notify="./noc.js --format MM,DD,HH" # Specifying absolute path recommended
notify -d 2,20,18
```

> This will run your command:

シェルコマンド、外部コマンドも実行できます。

```
./noc.js -d 2021022018 -c "firefox.exe sound.mp3"
```

> No logs on background be like:

バックグラウンドでマルチインスタンスに使用するのもいいですね。

```
./noc.js -d 2021022018 --desktop --hide-log --log "" &
```

> My favorite format <3

僕のお気に入り。

```
./noc.js -d 2021022018 -c "firefox.exe sound.mp3" --desktop -t "your appointment soon"
```

## コマンドラインオプション Command line Options

```
$ ./noc.js
Usage: notification-cli [options]

Options:
  -d, --date <date>             specify date to fire (e.g. "2022010100" for 2020/1/1 00:00) (default: null)     
  -f, --format <format>         specify date format (default: "YYYYMMDDHHmmss")
  -D, --desktop                 enables desktop notification
  -t, --title <text>            specify title (default: "Notification-CLI")
  -m, --message <text>          specify message (default: ":)")
  -c, --exec-command <command>  specify command to run (e.g. firefox.exe ringtone.mp3) (default: null)
  -l, --log <text>              specify console log message (default: "Notified.")
  -H, --hide-log                hide infomation logs
  -h, --help                    display help for command
```

## 一言

コードを書くよりreadmeを書く時間のほうが長くなってしまった例。

momentjsとnode-scheduleのおかげでimportやコマンドラインオプション部分を除くメインのコードはなんと10行程度で収まっています。

ソースコードを見られたら少し恥ずかしいかもしれない。対してソースコードのシンプリシティは初学者にとってそのコードを研究する敷居を低くしてくれると思うので、node.jsあるいはプログラミング初学者の人に積極的に参考にして頂ければ嬉しいと思う。
【SAA試験対策】S3のコストについて

S3のコストについて纏めました。
ポイントは以下の**3つ**だけ。


##ストレージ容量
　・どのくらいの容量を保存しているか。
　・データの利用頻度に応じて適切なストレージクラスを選択することでコストを抑えることができる。

　　S3標準とGlacierって5倍も価格が違うようです。。
　　アクセス頻度が少なくなったデータはライフサイクル管理でストレージクラスを変更するのが良い^^


##データ転送量
　・**S3→インターネット外にデータを転送する時のみ**有料。
　・S3へのデータ転送インは無料。
　・AWS同一リージョン内のサービス同士のデータ転送イン・アウトも無料。（※別リージョンの場合は有料）

##リクエストとデータ取り出し
　・GET/PUT/POST/LIST/COPYなどのリクエスト数に応じてコストが発生する。

　・GET は安い
　・PUT/POST/LIST/COPY はGETよりも高い
　・DELETE は無料

##補足
　AWS無料利用枠内であれば、S3 標準で 5 GB の Amazon S3 ストレージ、20,000 GET リクエスト、2,000 PUT、COPY、POST、あるいは LIST リクエスト、データ送信 15 GB を毎月、1 年間利用できるようです。

##参考
　[公式サイト Amazon S3 の料金](https://aws.amazon.com/jp/s3/pricing/)
lessコマンドでテキストを表示する時に行番号を表示する

## 目的

- lessコマンドでファイルを開くときに行番号を付与する方法をメモ的にまとめる

## 方法1（ファイル展開時にオプションを付ける）

- lessでファイルを開くときにオプション`-N`を使用する
- 下記のように実行する。

    ```terminal
    $ less -N ファイル名
    ```

## 方法2（ファイル展開後に設定する）

- lessを用いてファイルを展開している時に`-N`を入力し「Enter」を押下することで行番号を表示する事ができる。
Javaでファイルやディレクトリのタイムスタンプを変更したい。

Javaでファイルやディレクトリのタイムスタンプを変更したい場合`Files.setLastModifiedTime`を利用すると便利です。たとえば指定のファイルのタイムスタンプを現在時刻にしたい場合は以下のようなコードになります。

```java
FileTime now = FileTime.from(Instant.now());
Path file = Paths.get("/path/to/file");
Files.setLastModifiedTime(file, now);
```

`Files.setLastModifiedTime`の第2引数には時刻を指定します。Javaで時間や日付というと`Date`や`Calendar`や`LocalDateTime`あたりをよく利用しますが、ここでは`FileTime`というあまりなじみのないものを利用することに注意する必要があります。

__環境情報__

```
$ java -version
openjdk version "11.0.3" 2019-04-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.3+7)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.3+7, mixed mode)
$ javac -version
javac 11.0.3
```
Flutter webでHTMLかCanvasでの書き出し


Flutter web（beta）で簡単なサイトを作ったのですが、以前デプロイしたときは問題なく日本語フォントで漢字が表示されていたのに、さきほどデプロイすると中国フォントで表示されていた。

Inspecterで中身を見てみようとすると・・・、あれ？Canvas描画になっている・・・。

以前は、HTML+CSS描画になっていて、Divの中身を見れたのに・・・？

どうやら、Flutter webではビルドオプションで書き出し方法を`HTML+CSS`か`Canvas`かで選択できるらしく、デフォルトでは`auto`になっているようです（汗

そのため、Canvas描画が選択され、画像として中国系フォントで文字列が出力されていた、ということが原因のようです。

https://flutter.dev/docs/development/tools/web-renderers#examples

なるほど、以下の特徴から選択できるんですね。

- HTML書き出しの場合、DLサイズが小さくなる
- Canvas書き出しの場合、どのブラウザで見てもPixel-perfectで描画する  
（各ブラウザでズレが発生しない）

まぁ簡単なポートフォリオなのでズレは気にしないですし、HTMLで書き出した場合のSEO的なものも検証していきたいのでHTML書き出しにしました。
結果、問題は解消されました。

```sh
flutter build web --release --web-renderer html
```
Rで基礎分析結果をCSV出力①全体編

# はじめに

基礎統計量をまとめてCSVファイルで出力するコードを書く。CSVファイルで出力できれば、WindowsであればそのままExcel形式にして資料として共有することができる。データには量的変数と質的変数があるため、それぞれに対応する基礎分析を行う必要があるが、本記事ではまずどちらにも関わると考えられる「データ型」および「データの欠損数」を出力する。データは[default of credit card clients Data Set](https://archive.ics.uci.edu/ml/datasets/default+of+credit+card+clients)を扱う。
本筋とは関係ないが、上記データはxlsx形式なので一度ダウンロードしてCSV形式に変換（ファイル名もcredit.csvに変更）している。（xls形式やxlsx形式はパッケージを使えば読み込めるらしい。そのうち試してみよう。）

# データ読み込みとヘッダの準備
データを読み込んで不必要な列を削除し、ヘッダのデータフレームを準備する。

```r:readCsv.r
d <- read.csv(file="credit.csv", header=TRUE, skip=1)
d <- d[, !colnames(d) %in% c("ID") # "ID"列を削除
h <- colnames(d)                   # ヘッダ
h <- data.frame(h)
colnames(h) <- "ROWNAMES"
```

# データ型の調査
以下コードでデータ型を求める。[Rでデータ型を調べるclassについて](https://qiita.com/honda28/items/00fae43f229397702fa0)でも書いたが、列全体をclassの引数に入れてもその中でより大きいデータ型を出力してくれる。そのため、 NULL などが含まれていても（例えば数値データが1つのみ入っていて、その他データが欠損値であっても） numeric を返してくれる。欠損値が " " などの character 型の場合は本来欲しい numeric は返ってこないため、 read.csv の時点で na.strings などを用いて処理しておく必要がある。

```r:datatype.r
datatype <- array(dim=ncol(d))
for(i in 1:ncol(d)){
  datatype[i] <- class(d[,i])
}
```

# CSV形式での出力
上記で求めたデータ型と欠損数をヘッダにひもづけて出力する。

```r:export.r
h$class <- datatype
h$is.na <- apply(is.na(d), 2, sum)
h$is.not.na <- apply(!is.na(d), 2, sum)
write.csv(x=h, file="summary.csv")
```

出力結果は以下のようになる。
![summary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769545/476e1c27-16ff-701d-c556-edae36ceead4.png)

以降の記事で量的変数および質的変数の基礎分析を行って、CSV形式で出力をしていく。
チーム開発におけるコードクオリティの確保

チーム開発におけるコードクオリティの確保
================

仕事でチーム開発におけるソフトウェア品質の保ち方みたいな議論をすることがあり、そのために準備していたメモ。
個人のメモです。


前提
----------------------

* SIerと呼ばれる組織でのできごと。
* エンジニアは大半が外部リソースとして、テンポラリなリソース。
* 一部にリードエンジニアがいるが、そのリソースだけでは全てをまかなえない。
* ある意味2019年4月時点では日本の SIer の開発スタイル（ベンダーコントロールが主で、デベロッパーは調達するという考え方）としては結構スタンダード


基本方針
----------------

どんな言語であれ意識すべき内容。

* 読み物として読めるように記載する（要はイケてるかどうか）。
* 文脈、リズムを大切に。
* 仕様の日本語をそのまま言語としてかかない（アホみたいに日本語をそのままプログラミングする人たちがいる）。
* 半年後（関係がなくなってから）の自分が読めるかどうかを振り返る。
* より一般性（標準性）の高い方を採用する。外れる場合は理由を明確に。
* 処理数が最小になるように（分岐条件の順番、処理の順序など）。
  * 発生確率が高いものから記載するなど
* 同じ内容は同じように記載する。書き方にパターンを持たない。
* コードの内容を単に日本語にした内容はコメントに記載しない。コメントには仕様およびその理由を記載する。
* 障害発生時など緊迫した場面でも読み間違いがないように配慮する（否定での if 条件など）。
* 命名は英語を用いる。ただし、英語での厳密性よりも一般性が高い（理解性、浸透性）方採用する（和製英語、ドイツ語など流通次第）。
* ディスクアクセス、通信処理などは繰り返し処理では行わない。
* EoDを意識する
* テスタビリティを意識する。
  * メソッドを適切に分離するのは当たり前で、テスタビリティのために意識する。
* 役割を最小化する。
* アーキテクチャスタイルを守る
    * レイヤードアーキテクチャなのであれば、依存関係の仕方はまもるなど

Javaにおける考え方
----------------

* 世の中のコーディング規約に準拠する。
* Nullsafe を強く意識する。
* Method chaining を使う場合は、NonNULLであることが保証されている場合のみに限定する。
* コードの内容を単に日本語にした内容はコメントに記載しない。コメントには仕様およびその理由を記載する。
* lamdba式は節度を持って使う。処理速度やロギングを考慮するとlamdbaでない方が望ましい場合もある。
  * コードを1行にすることが目的ではない。読みやすくなければ意味がない。
  * 中間処理の経過表示のためなど、適切なログ出力がstreamなどはできない場合もある 
* 文脈を持つのはService以上。DAOはアクセッサなので文脈をもたない処理に徹する。ただし集積度は考慮する。
RubyonRailsでRSpecによるテストコード実行手順メモ

初Qiita投稿で緊張しますが、自分用メモなのであんまり気張らずに書くようにします。
RubyonRailsでRSpecを使ってテストコード実行するときの簡単な手順メモです。
間違ってたり足りない部分があったら適宜アップデートします。

１.　Gemfile内のどこの行でもいいので　gem 'pry-rails'　を追加する。　※たいていは一番下に追加
２.　Gemfileの　group :development, :test do　内に下記２行を追加する。
　　　gem 'rspec-rails'
　　　gem 'factory_bot_rails'　※FactoryBotを使わない場合は不要
３.　ターミナルで bundle install　を実行してGemを使えるようにする。
４.　ターミナルで rails g rspec:install　を実行してRSpecを使えるようにする。
５.　.rspecファイルに --format documentation　を追加してテストのログを見やすくする。
６.　ターミナルでrails g rspec:model [モデル名]　を実行してモデルの単体テストコード用ファイルを生成する。
７.　spec/factories/モデル名.rb　というファイルにFactoryBotで生成するデータを記述する。（要詳細化）
８.　spec/models/[モデル名]__spec.rb　に単体テストコードを書く。（要詳細化）
９.　ターミナルで　bundle exec rspec spec/models/モデル名_spec.rb　を実行する。 

要詳細化にしている部分は記載方法を詳しくメモする必要があるためまた今度・・・。
EC2上でgit pullする際の流れ

各種設定が済んでいる事が前提で、本番環境でgit pullする際の流れです。

cloud9上でプッシュまでします。

```
$ git add .
$ git commit -m "コメント"
$ git push origin ブランチ名
```

それからEC2にログイン

```
$ ssh -i ~/.ssh/practice-aws.pem ec2-user@xx.xx.xx.xx
```

practice-aws.pemはキーペア名、
xx.xx.xx.xxはパブリックIPアドレスを入力

EC2上でアプリケーションに移動してpull

```
$ cd アプリケーション名
$ git pull origin master
```

Gemfile更新

```
$ bundle install --path vendor/bundle --without test development
```

migrate更新

```
$ bundle exec rails db:migrate RAILS_ENV=production
```

assets更新

```
$ bundle exec rails assets:precompile RAILS_ENV=production
```

サーバー再起動

```
$ kill $(cat tmp/pids/puma.pid)
```

```
$ rails s -e production
```
DatabricksにてGUIでファイルをDBFSのFileStoreにアップロードするDBFS File Browser機能の紹介

## 概要
Databricksにて、GUIによりファイルを、DBFSにアップロードする方法を紹介します。
GUIでアップロードできるのは、`FileStore`というフォルダのみのようです。

特に、ストレージをマウントしないDatabricks Community Editionを利用している方におすすめです。

## 1. DBFS File Browser機能を有効する
### 1-1. Databriks Workspaceに接続後、右上にある人型のマークにある`Admin Console`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ed749eef-2439-6378-ced2-e1bc58e71122.png)


### 1-2. `Advanced`タブを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5efe5f40-fc47-9a18-b08b-0947e2a7b89b.png)

### 1-3. `DBFS File Browser`の横にある`Enabled`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a0eaa6c5-d22e-1067-99d0-eb9654ae0a74.png)

### 1-4. `DBFS File Browser: Enabled`という表記になったことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ad729961-5687-088d-2c6f-3cb2d3d186d6.png)

### 1-5. `Data`タブを選択後、`DBFS`というタブが増えていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/60c2fbe3-ed05-32a9-757e-feb2ed4773f9.png)


## 2. ファイルのアップロード
### 2-1. `Data`タブを選択後、`DBFS`というタブを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/60c2fbe3-ed05-32a9-757e-feb2ed4773f9.png)

### 2-2. `FileStore`を選択し、右クリック後、`Upload here`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/58ade2ff-6f2d-956f-ee83-9096e6a84c5a.png)

### 2-3. `Files`の領域にアップロードするファイルをドラッグします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1b5af5d9-05ae-1e88-5a2f-1f2bb1816ecc.png)

### 2-4. `Done`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/51cd17db-eadb-2e91-bda4-186467222456.png) 

### 2-5. ファイルがアップロードされていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/78df28c4-0cfd-8ba3-ba3d-f25e95646eea.png)


## 注意事項
特になし

## 参考記事

- [Databricks ファイル システム (DBFS) - Azure Databricks - Workspace | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/databricks/data/databricks-file-system#browse-dbfs-using-the-ui)
- [DBFS ファイルブラウザーを管理する-Azure Databricks - Workspace | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/databricks/administration-guide/workspace/dbfs-browser)
kaggle notebookでcudfを使えない時に見る記事


https://www.kaggle.com/cdeotte/rapids/discussion/182407 によると、
cudfを使えない理由の多くは、GPUにしていないかららしいです。
GPUに変える方法はnotebookの画面の右にあるSettingsの下のAcceleratorを変更することです。デフォルトはNoneになっているので、GPUに変えましょう。

<img width=70% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501636/4c7ed1c3-3409-2892-f4f1-683161678176.png">

そもそもcudfがGPUを用いているものらしいので、GPUにしないと動かないというのは納得できる話だと思います。
大規模なデータを扱うときは、cudfを使いましょう。ただ、KaggleのGPUは使える時間が限られている感じなので、そこは気をつけるところですね。
ActiveResourceを使ってRailsアプリ同士をAPI連携させる

ActiveResourceを使う機会があったので、使い方を備忘録として残します。

##ActiveResource とは
簡単に言うと、Railsアプリケーション同士を簡単にAPI連携させる機能です。

フロントとバックを分けて実装したい時に使います。


##バック側の実装
実装
apiモードでアプリケーションを作成しています。

```
$ rails new back --api
$ cd back
$ bin/rails g scaffold bookmark title:string url:string comment:text
$ rake db:migrate
```

起動

```
$ rails s
```

##フロント側の実装

実装

DBは使わないのでmigrationを削除しています。

```
$ rails new front
$ cd front
$ bin/rails g scaffold bookmark title:string url:string comment:text
$ rm -f db/migrate/* 
```

モデルクラス (app/models/bookmark.rb) を書き換える。
親クラスをActiveResource::Baseに変えて、連携先にhttp://localhost:3000/を指定しています。

```app/models/bookmark.rb
class Bookmark < ActiveResource::Base
  self.site = 'http://localhost:3000/'
end
```

Gemを追加。

```
Gemfile
gem ‘activeresource'
```


```
$ bundle install
# 起動
$ rails s -p 3001 #ポートは3001に指定
```

##動作確認
以上で実装、連携は完了です。

ブラウザで "http://localhost:3001/bookmarks" にアクセスして、いくつかブックマークを追加してみましょう。

<参考>
http://webos-goodies.jp/archives/how_to_use_activeresource_1.html
【AWS】S3ストレージクラスまとめ

AWSのS3にはいくつか種類（クラス）があるので、

・何があるのか
・どんな特徴があるのか
・代表的な用途

をまとめてみます。

<h1>S3とは</h1>
そもそも、S3って何なんでしょうか。

>Amazon Simple Storage Service は、インターネット用のストレージです。また、ウェブスケールのコンピューティングを開発者が簡単に利用できるよう設計されています。
[Amazon S3 とは](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Welcome.html)

AWS上のストレージサービスで、頭文字をとってS3と呼ばれているんですね。

そんなS3の特徴は以下の４つです。
・耐久性：99.999999999%(イレブンナイン)
・安価：月額1GB/約3円
・安定性：データは冗長化されて保存
・安全性：データを暗号化可能

ちなみに、アップロード可能な容量は１つのデータにつき５TBまでです。（デカすぎ）

**補足**
１オブジェクトのサイズが最大5TBで、１回のPUTオペレーションでアップ出来るオブジェクトのサイズが5GBとなります。
5GBを超える場合には、マルチパートアップロード（分割送信）を用いて並列してアップロードを行います。

<h1>S3のストレージクラス</h1>
S3には以下のストレージクラスが存在します。

・Standard（標準）
・Standard-IA（低頻度アクセス）
・One Zone-IA（１ゾーン低頻度アクセス）
・Glacier（アーカイブ）
・Glacier Deep Archive（アーカイブ）

それぞれの特徴をみていきます。

<h1>Standard</h1>
標準的なストレージクラスです。

複数のAZにまたがってデータを複製するため、耐久性が高い（99.999999999%）です。
遅延も少なく、スループットが高いので、幅広い用途に使用できます。

**代表的な用途**
・クラウドアプリケーション
・動的なウェブサイト
・コンテンツ配信
・モバイルやゲームのアプリケーション
・ビッグデータ分析

<h1>Standard-IA</h1>
アクセス頻度は低いけど、必要な時にすぐに取り出したいという用途で使用するストレージクラスです。

Standardとスペックは同様なのに安価です。
しかし、こちらはデータを取り出す際に料金がかかります。

**代表的な用途**
・長期保存
・バックアップ
・災害対策ファイルのデータストア

<h1>One Zone-IA</h1>
Standard-IAのAZが１つになったバージョンです。

Standard-IAは複数のAZにまたがってデータを保存しますが、
こちらは１つのAZ内にのみデータを保存するため、Standard-IAよりも２０％ほど安価になります。

冗長性を気にしないようなデータの保存に向いています。

**代表的な用途**
・セカンダリバックアップのコピー

<h1>Glacier</h1>
セキュア・高耐久性・低価格の三拍子が揃ったストレージクラスです。
オンプレのストレージと同等か、それより低いコストでデータの保存が可能です。

しかし、データの読み出しには数分〜数時間かかるため、長期間のデータアーカイブ用途がメインとなります。

**代表的な用途**
・メディア資産の保存
・ヘルスケア情報のアーカイブ
・規制及びコンプライアンスのアーカイブ
・科学的データのストレージ
・デジタル保存

<h1>Glacier Deep Archive</h1>
S3で最安のストレージクラスです。

１年で１回か２回しかアクセスされないようなデータの長期保存に向いています。

Glacierに保存するものよりも、よりアクセス頻度が低いものを保存するイメージです。
その分、データの読み出しにはより長い時間（１２時間以内）がかかります。

**代表的な用途**
・磁気テープの代替
・会計データ
・学籍情報

<h1>ストレージクラスの比較</h1>
それぞれの特徴をざっくり比較してみます。

|   | Standard | Standard-IA | One Zone-IA | Glacier | Glacier Deep Archive |
|:-:|:-:|:-:|:-:|:-:|:-:|
|冗長性| 高  | 高  | 低  | 高  | 高  |
| 読み出し料金  | なし  | あり  | あり  | あり  | あり  |
| 読み出し時間  | 速  | 速  | 速  | 遅 | 遅  |

もっと詳しく知りたい方は、公式を参照してくださいな。
[Amazon S3 ストレージクラス](https://aws.amazon.com/jp/s3/storage-classes/)

<h1>Intelligent-Tiering</h1>

アクセス頻度ごとに自分でストレージクラス変えないといけないの！？めんどくさ！
と思った方もいるかと思います。

そんなことはありません。ちゃんといい感じのものが用意されています。

Intelligent Tieringは、それぞれのファイルへのアクセス頻度を計測して
OneZone-IAを除く上記４つのストレージクラスへ自動的にデータを振り分けてくれます。
（手動で振り分けを設定するライフサイクルポリシーというものもありますが、今回は割愛します。）

こちらを使用することで、コスト効率を最低化することができます。

デフォルトでは、以下のようにデータを振り分けます。（アーカイブアクセス有効化時）

・データをStandardへ保存
・30日連続でアクセスされなかったものはStandard-IAへ移動
・９０日連続でアクセスされなかったものはGlacierへ移動
・上記＋１８０日連続でアクセスされなかったものはGlacier Deep Archiveへ移動

また、下層のストレージクラスへ振り分けられたデータに再度アクセスがあった際には、
自動的に高頻度のアクセス階層へ移動してくれます。

例えば、Glacierに保存されているデータにアクセスがあった場合、
GlacierからStandardへ移動してくれるなど。

データをどのぐらいの頻度で使用するかわからない場合、Intelligent-Tieringを使用するのが良いでしょう。

**代表的な用途**
・ストレージアクセスパターンが不明なデータセットの保存
・データレイクのように予測できないアクセスパターンを持つデータセットの保存

<h1>まとめ</h1>
S3を使用する際は、データの使用頻度に応じて適切なストレージクラスを選択しましょう。

<h1>参考</h1>
[Amazon S3 とは](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Welcome.html)
[Amazon S3 ストレージクラス](https://aws.amazon.com/jp/s3/storage-classes/)

<h2></h2>
この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
【初心者】AWS AutoScalingについて（ハンズオン②：オートスケーリンググループの作成） 

#はじめに

**AWS AutoScaling**・・EC2を処理負荷に合わせて、増やしたり減らしたりすることができる便利なサービス
[公式サイト](https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html"AWS AutoScaling")

こちらは前回の記事の続きとなっています。
[【初心者】AWS AutoScalingについて（ハンズオン①：起動テンプレートの作成）](https://qiita.com/AWS11077/items/47dc3da4dd185f01caef )
#ハンズオン②：オートスケーリンググループの作成

前回作成した起動テンプレートをもとにオートスケーリンググループを作成します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/ad312505-8fa4-000e-c116-3a7d9b745314.png)
EC2より「オートスケーリンググループ」を選択し、「**AutoScalingグループの作成**」を選択。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/eb1a2755-cefc-3997-ccc4-0b6e5726256f.png)
　**・Auto Scaling グループ名**：任意のグループ名
　**・起動テンプレート**：前回作成したテンプレート
　**・バージョン**：バージョン管理している場合はここでバージョンを指定

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/f7f69a26-fa5f-82fd-0101-e2eb8e8add7e.png)
　**・インスタンスの購入オプション**：費用を抑えたい場合はここでスポットインスタンスを選択することもできますが、今回は「起動テンプレートに準拠する」を選択
　**・ネットワーク VPC**：インスタンスを起動するVPC
　**・ネットワーク サブネット**：インスタンスを起動するサブネット

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/8d03793f-6582-8e7f-a2dc-6d20f36193cf.png)
　**・ロードバランシング**：アタッチするロードバランサを選択
　**・ヘルスチェック**：EC2もしくはELBが使用可能な状態になっていることチェックするかどうかを選択※実際ユーザはEC2ではなく、ELBに接続をしに行きます。そのため、ここでは**ELB**を選択
　**・その他の設定**：AutoScalingのメトリクスを有効にしたい場合は選択

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/d3680975-d26d-f5ed-61de-c9ba51320341.png)
　**・グループサイズ**：インスタンスをどのくらい増やすか減らすかを決める
　**・スケーリンググポリシー**：グループサイズの変更に合わせて、ルールを決める（例：インスタンスのCPU使用率が80%になったら、EC2 1台増加する）
　　ここがスケーリングをするうえで、1番重要！ポリシーは後から追加することができるため、ここではなしを選択
　**・インスタンスのスケールイン保護**：追加で作成されたインスタンスを削除したくない場合はチェック


![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/b212e3c9-76f7-5837-b2a1-ce60f48e6809.png)
　**・通知を追加**：インスタンスの増減があった場合に、[SNSトピック](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-create-topic.html)を使用してメール通知が必要な場合は追加

![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/aed7734f-5898-2862-e748-d7d0a51736e0.png)
　**・タグを追加**：必要に応じて、タグを追加

　　最後に確認画面で値の設定を確認し、「**AutoScalingグループを作成**」を選択

![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/caa4d881-87a0-bbf7-3a0d-ef303d5f6247.png)
　新しくAutoScalingグループが作成。
　と同時に...


![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/d86ab323-9c7d-c356-d416-c51ed1233387.png)
　新しいEC2インスタンスが起動されたことも確認できます。
　ここで1台インスタンスを停止してみると...

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/fc931750-bcd6-13bb-2f92-14901bf8f582.png)
　AutoScalingグループの「アクティビティ履歴」より1台インスタンスが停止されたこと、新しく1台インスタンスを立ち上げたことが確認できます。
　実際にインスタンスを確認すると...

![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/de397a0d-6289-1291-4073-d7f2e915da12.png)
　また新しいインスタンスが起動されていることを確認できます。
　このように事前に設定したインスタンスの数をAutoScalingが検知し、自動で調整を行ってくれます。

　オートスケーリンググループの作成はここまでになります。

#最後に

次回の記事では、[ハンズオン③：オートスケーリングポリシーの作成](https://qiita.com/AWS11077/items/3f7861591b4ae1aa00d9)を行いたいと思います。

この記事はAWS初学者を導く体系的な動画学習サービス「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
契約書っぽいcss

契約書とかの第１条とか1とか(1)とかだるいですよね。
それのcssです。

```css
h1,h2,h3{
  font-size: 1rem;
  font-weight: normal;
  padding:0;
}

h1 {
  counter-reset: section2;
  margin: 2rem 0 1rem 0;
}
h2 {
  counter-reset: section3;
    margin: 0 0 1rem 0.5rem;
    padding-left: 0.5em;
    text-indent: -1.0em;
}
h3 {
  counter-reset: section4;
    margin: 0 0 1rem 1rem;
    padding-left: 1.5em;
    text-indent: -1.5em;
}

h1::before {
  content: "第" counter(section1) "条 ";
  counter-increment: section1;
}
h2::before {
  content: counter(section2) ". ";
  counter-increment: section2;
}
h3::before {
  content: "(" counter(section3) ") ";
  counter-increment: section3;
}
```

```markdown:markdown
# 反社会的勢力の排除

## 甲及び乙は、相手方に対し、現在及び将来にわたって次の各号の事項を遵守することを確約する。

### 自らが、暴力団、暴力団員、暴力団員でなくなったときから5年を経過しない者、暴力団準構成員、暴力団関係企業、暴力団関係企業の役職員、総会屋、特殊知能犯暴力集団、その他これらに準ずる者（以下、これらを「暴力団員等」という）、暴力団員等に対して資金等を提供し、または、便宜を供与するなどの関係を有している者、暴力団員等と社会的に非難されるべき関係を有する者（以下、これらを総称して「反社会的勢力」という）ではないこと。
### 自らの役員等（業務を執行する社員、取締役、執行役もしくはこれらに準ずる者または実質的に経営を支配する者をいう）が反社会的勢力ではないこと。
### 反社会的勢力に事故の名義を利用させ、本契約を締結したものではないこと。
### 自らまたは第三者を利用して、次の行為をしないこと。

- 相手方に対し凶悪的な言動または暴力を用いる行為
- 偽計または威力を用いて相手方の業務を妨害し、または、信用を毀損する行為

```

でこんなかんじ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255465/71fdac59-a780-45c2-0dec-cfea0fe266f8.png)
部分テンプレート　collectionオプションの使い方

繰り返しの部分テンプレートを使う場合、each文でまわすか、collectionオプションを使うか2つの方法があります。


/controller

```
class Admin::StaffEventsController < ApplicationController

  def index 
    if params[:staff_member_id]
      @staff_member = StaffMember.find(params[:staff_member_id])
      @staff_events = @staff_member.staff_events.order(occurred_at: :desc)
    else
      @staff_events = StaffEvent.order(occurred_at: :desc)
    end
    @staff_events = @staff_events.page(params[:page])
  end
  
end
```

####①each文を使用するパターン
```
<% @staff_events.each do |staff_event| %>
  <%= render partial: 'staff_event', staff_event: staff_event %>
<% end %>
```



この3行は1行でまとめることができます。



####②collectionオプションを使用するパターン
```
 <%= render partial: "staff_event", collection: @staff_events %>
```

collectionにはインスタンスを指定しています。



さらに、
呼び出す部分テンプレートのviewsフォルダ内にあるフォルダ名、部分テンプレート名、部分テンプレート内で使う変数名が共通している場合はさらに簡略化して書けます。

```
<%= render @staff_events %>
```


どちらでも書けますが、
②の方が処理速度が早いため基本的には②を使用します。
【VSCode】black : pythonのfomatterを導入

<h1>背景</h1>
fomatterで有名なのがC++ならc-lang, pythonであればblack
いつも使ってるblackのインストール方法をメモ

<h1>install</h1>

blackをインストール

```
pip install black
```

pythonのextensionをinstall
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/685f42c2-5afe-6367-cae6-22c38fa9b382.png)





gedit ~/.config/Code/User/settings.jsonで以下の2行を追加する

```
"python.formatting.provider": "black",
"editor.formatOnSave": true,
```

<h1>結論</h1>
・formatterあると便利!

<h1>参考文献</h1>
VSCode: Using Black to automatically format Python
https://dev.to/adamlombard/how-to-use-the-black-python-code-formatter-in-vscode-3lo0
sympyで通過算

#概要

sympyで通過算やってみた。

#参考にしたページ

https://qiita.com/mrrclb48z/items/69c44680308709addd2d

#成果物

https://paiza.io/projects/LNtvP0CIFPMz5fnh5mFiCw

https://paiza.io/projects/INDn6f9X3yhTBzccoDetWw


以上。
Kubernetes + cert-manager + letsencrypt + ingress-nginx-controller環境構築


参考にしたサイト
https://medium.com/better-programming/how-to-expose-your-services-with-kubernetes-ingress-7f34eb6c9b5a

サンプル用のサービス作成

```yaml:simple-service.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hellok8s-deployment
  labels:
    app: hellok8s
spec:
  selector:
    matchLabels:
      app: hellok8s
  template:
    metadata:
      labels:
        app: hellok8s
    spec:
      containers:
      - name: hellok8s
        image: docker.io/rlkamradt/hellok8s:latest
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: hellok8s-service
spec:
  type: ClusterIP
  selector:
    app: hellok8s
  ports:
  - port: 8080
    targetPort: 8080
```

Ingress-nginx-controller作成

```sh
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/deploy.yaml
```

Ingress-nginx-controllerサービス情報編集

```
kubectl edit service ingress-nginx-controller -n ingress-nginx
```

```diff:
- type: NodePort
+ type: LoadBalancer
+ externalIPs:
+ - 192.168.0.xx
```

ClusterIssuerの作成
当たり前だが、ルータのポート80を対象マシン向けにポート変換指定しておかないと認証が失敗するので注意(1敗)

```yaml:letsencrypt-prod.yaml
apiVersion: cert-manager.io/v1alpha3
kind: ClusterIssuer
metadata:
  name: letsencrypt-production
spec:
  acme:
    email: yourmailaddress
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-production
    solvers:
    - http01:
        ingress:
          class: nginx
```

Ingressの作成

```yaml:simple-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer: "letsencrypt-production"
spec:
  tls:
  - hosts:
    - yourdomain
    secretName: test-tls-prod
  rules:
  - host: yourdomain
    http:
      paths:
      - path: /testpath
        backend:
          serviceName: hellok8s-service
          servicePort: 8080
```

接続確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851492/ae3cc258-ce10-f465-15db-15e97ebb9860.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851492/9b105580-ee2c-d51c-2ac0-c48a0d3d3c62.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851492/d16d5b22-e093-e194-b7d3-a5a19211fe68.png)
【Java】MapをListに変換する方法

#はじめに

本記事ではMapをListに変換する2通りの方法をアウトプットします。

#Listを直接生成する方法

```java
Map<String, String> TopBillionaires = new LinkedHashMap<>();
		TopBillionaires.put("$195bn", "Elon Musk");
		TopBillionaires.put("$185bn", "Jeff Bezos");
		TopBillionaires.put("$134bn", "Bill Gates");
		TopBillionaires.put("$102bn", "Mark Zuckerberg");
		TopBillionaires.put("$88.2bn", "Warren Buffett");
		TopBillionaires.put("$81bn", "Sergey Brin");

		List<String> keyList = new ArrayList<>(TopBillionaires.keySet());
		List<String> valueList = new ArrayList<>(TopBillionaires.values());

		System.out.println(keyList);
		System.out.println(valueList);

        //出力
        //　[$195bn, $185bn, $134bn, $102bn, $88.2bn, $81bn]
        //　[Elon Musk, Jeff Bezos, Bill Gates, Mark Zuckerberg, Warren Buffett, Sergey Brin]
```

#Streamを利用する方法
以下では、Streamの[Collect](https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Stream.html#collect-java.util.stream.Collector-)メソッドに`Collectors`クラスの`toCollection`メソッドを渡しています。
出力結果はListを直接生成する方法と同じです。

```java
Map<String, String> TopBillionaires = new LinkedHashMap<>();
		TopBillionaires.put("$195bn", "Elon Musk");
		TopBillionaires.put("$185bn", "Jeff Bezos");
		TopBillionaires.put("$134bn", "Bill Gates");
		TopBillionaires.put("$102bn", "Mark Zuckerberg");
		TopBillionaires.put("$88.2bn", "Warren Buffett");
		TopBillionaires.put("$81bn", "Sergey Brin");

        List<String> keyList = TopBillionaires.keySet().stream()
                .collect(Collectors.toCollection(ArrayList::new));
        List<String> valueList = TopBillionaires.values().stream()
                .collect(Collectors.toCollection(ArrayList::new));

        System.out.println(keyList);
        System.out.println(valueList);

        //出力
        //　[$195bn, $185bn, $134bn, $102bn, $88.2bn, $81bn]
        //　[Elon Musk, Jeff Bezos, Bill Gates, Mark Zuckerberg, Warren Buffett, Sergey Brin]
```

#参照
[Java Platform SE8 #インタフェースStream<T>](https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Stream.html#collect-java.util.stream.Collector-)