OmniAICreator/Qiita-1.07M huggingface dataset:
新世代Javaプログラミングガイドの紹介（Java 12編）

この記事は[新世代Javaプログラミングガイドの紹介（Java 11編）](https://qiita.com/kazsharp/items/d572c69b8c68e8ff4754)の続きです。

##Java 12での変更点
Java 12では以下の2つについて書かれています。

* switch 式
* JDK 12のその他の改良点

##switch 式
switch式はJava 12の正式な機能ではありません。
それどころかJava 13でも正式でなくJava 14からの正式な機能となります。
本ではプレビュー機能を使う方法としてコンパイル時や実行時に `--enable-preview` オプションを指定するよう解説されていますが、今はJava 14もリリースされているので、Java 14を使うならオプションなしで実行できます。
正直、今まであまりswitchを使ってこなかったのですが、今回のswitch式を使うと完結に安全なコードが書けるケースが増えるのではと思っています。
今までのswitchは何が問題だったのか、switch式でそれがどう改善されたのか、本ではサンプルコードとともにわかりやすく解説されています。

## JDK 12のその他の改良点
その他の改良点では以下の項目につい説明されています。

* Shenandoah GC: 一時停止が短い GC
* マイクロベンチマーク・スイート
* 仮想マシン（Java Virtual Machine: JVM）定数 API
* AArch64 版の一本化
* デフォルトの CDS アーカイブ
* G1用の中止可能な混在コレクション
* 未使用のコミットメモリの G1 からの迅速な返却

例に漏れず簡単な解説のみとなっていますが、そのような中で「デフォルトの CDS アーカイブ」については少し多めの解説となっています。しかもCDSに関してはJava 10の「AppCDS アプリケーション・クラスデータ共有」で詳しく解説されているにも関わらずです。
これは著者がこの機能について「ぜひ使ってほしい」との思いがあるからではないでしょうか。本意はわかりませんが、私はそのように感じました。
また、GCについての改良が常に行われているんだなとの印象も感じた内容でした。

以上、新世代Javaプログラミングガイドの紹介（Java 12編）でした。
Python Install 方法【Mac編】- Homebrewを使おう！

pythonを勉強している初心者です。
この記事は学習の目的として記録中です。
なので、参考にできる記事とか内容が間違ってたらコメントをよろしくお願いします。

# 開発環境
OS : macOS Catalina
Version : 10.15.3

# XcodeをInstall
- [App Store Installページ](https://apps.apple.com/jp/app/xcode/id497799835?mt=12&ign-mpt=uo%3D4)
- ターミナルを開き、👇コマンド入力。

```
$ xcode-select --install
```

# HomebrewをInstall
```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

# 問題なくInstallされたか確認
```
$ brew help
(command not foundのメッセージの場合は失敗)
または
$ brew doctor
Your system is ready to brew.
(成功の場合は☝️メッセージが表示)
```

# Python3 Install
```
$ brew install python3
```

# Python Version確認
```
$ python --version
Python 3.9.0
```
【Vuetify】 theme利用時の背景色を変更する


##概要
* 環境<br >
Nuxt.js+Vuetify
* やりたいこと<br >
ページ背景色の変更
* ここで書くこと<br >
無理やりだが背景色変更はできたので、そのやり方を書く。<br >
綺麗なやり方を後日追記する（したい）。

##結論
assets配下に main.css を作成して以下記入。

```code:css
.v-application--wrap {
  background-color: rgb(160, 235, 150);
}
```

Vuetifyのthemeを上書きできず大分苦しんだが、今回はcssで無理やり実現させた。
scssで綺麗に上書きするような方法があるらしいので後日それを試してみる。
AlertViewを表示する(ダイアログ的なやつ)

ボタンを押した時に下から出てくるやつを表示するコード

<img width="311" alt="スクリーンショット 2020-03-29 18.42.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/5e6894a9-310d-47d5-0fed-13ed82dade95.png">

<img width="305" alt="スクリーンショット 2020-03-29 18.42.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397180/257f9cb6-fc78-7407-6368-307f206a82b7.png">



```Swift:ViewController.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    private func popUp() {
        let alertController = UIAlertController(title: "確認", message: "本当に実行しますか", preferredStyle: .actionSheet)
        
        let yesAction = UIAlertAction(title: "はい", style: .default, handler: nil)
        alertController.addAction(yesAction)
        
        let noAction = UIAlertAction(title: "いいえ", style: .default, handler: nil)
        alertController.addAction(noAction)
        
        let cancelAction = UIAlertAction(title: "キャンセル", style: .cancel, handler: nil)
        alertController.addAction(cancelAction)
 
        present(alertController, animated: true, completion: nil)
    }
    
    @IBAction func doButtonTap(_ sender: Any) {
        popUp()
    }
}
```

#### 豆知識
comd + shift + l(エル)
でlibraryを表示できる。
【写像】銃殺刑に例える全射と単射

※不適切な表現が苦手な方はお帰りください。
不適切であることは重々承知の上、こんなにわかりやすい例え方が他にない気がしたので公開したまでです。
というかそんなことを言い出したら「死刑囚のパラドックス」とか「3人囚問題」とかどうなるんですか？

# 1. 集合とは
写像の前に集合について説明させてください。
集合とは、物の集まりです。別に数字や記号である必要はありません。
例えば**拘置所の牢屋は死刑囚の集合**といえますし、
**拘置所の職員室(?)は看守の集合**といえます。

# 2. 写像とは
写像とは、ある集合Aの要素から別の集合Bの要素へ向かう矢印のことです。
例えば看守の集合から死刑囚の集合へ向かう矢印の例として、「一斉射撃による銃殺刑執行に用いられる銃の弾丸」が挙げられます。
**「一斉射撃において」看守が死刑囚を撃つ場合の弾丸は、看守から死刑囚への写像**であるといえます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/3915b037-c121-bdec-9901-01a538934891.png)
図. 写像の例
## 2-1. 写像ではない例
看守は上官の掛け声などを合図として一斉射撃にて死刑囚を撃ちます。**看守は必ず最低1人を撃ちます**。
したがって、**一人の看守は高々一人の死刑囚しか撃てません**。
次の図のようなものは写像といえません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/ea4329ea-26eb-5e40-601f-6b0fa57813b4.png)
図. 写像といえない例。撃っていない看守がいるし、一人で何人も撃っている看守もいる

## 2-2. 全射とは
**全射とは、「全」員「射」殺すること**です。生き残る死刑囚はいないということです。銃殺刑は基本的に全射です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/595318e0-be4e-0fa6-0c54-1ce4708aced6.png)
図. 全射の例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/3017f790-4183-e181-f8b1-8d3a5bc1c8d0.png)
図. 全射ではない写像の例

## 2-3. 単射とは
**単射とは、「単」独で「射」殺することです**。

実際の銃殺刑はほとんど単射ではありません。つまり、複数人の看守が一人の死刑囚を撃ちます。こうすることで、誰の弾が当たったのかわからなくなります。こうすることで看守たちはそれぞれ「私が殺したわけではない」と自分に言い聞かせることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/87e00fae-1aa8-45d0-c10a-8fcd7cf4ab6d.png)
図. 単射の例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/80d87009-9620-7d36-e208-74e94122fff5.png)

図. 単射でない写像の例

## 2-4. 全単射とは
**全単射とは、全射かつ単射であること**です。
死刑囚の中に生き残ることのできる者は一人もいないし、看守もみな「私があいつを...」とわかってしまっている状態です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/735b89c9-00d4-b2b9-db41-4bb611a833c2.png)
図. 全単射な銃殺刑の例(1049～1982年 竜宮の国。囚人らは執行直前にオットー(写真左)による恩赦を受ける)

要は看守一人が囚人一人を1対1で担当して処刑し(単射)、かつそれで全員を処刑できる(全射)ような状態です。

## 2-5. 逆写像

実は、**全単射であることと、逆写像が言えることって同値**です。

**写像を「看守が死刑囚を射殺すること」とするとき、逆写像は、「死刑囚が看守を射殺すること」**です。
撃つ撃たれるの関係をひっくり返すわけです。

全射でない場合、生き残る死刑囚がいるわけでして、
逆写像を考えよう(＝撃つ撃たれるの関係をひっくり返そう)とすると「撃たない者がいる」ことになってしまい、
写像の定義を満たさなくなってしまいます。
また、単射でない場合、一人の死刑囚が同時に複数人の看守を撃つこととなり、これも写像の定義に反します。

つまり、**「なぜ全単射でないと逆写像が言えないのか」の答えは、「そんな風に写像を定義しちゃったから」**に他なりません。
snmpをインターネット越しに使う

自宅をipv6化したら、ipv4でインターネット公開されるポートが限られている。wellknown-portは公開できないので、naptで対応する。

- インターネットには、標準以外のPORTで開放する
- ルータでnaptして、内部では標準のPORTを使う

# snmpwalk(requset & response)
## 内部(snmpwalk:any) → 外部(snmpd:161)
外部VPSに向かって、udp/161でSNMP-requestを送る。outboundなので、得意な点はない。

```bash:
# snmpwalk -v2c -cpublic 外部VPS.jp .1 
....
```

## 外部(snmpwalk:any) → GW-NAPT(xxxx:161) → 内部(snmpd:161)
内部に向かってSNMP-requestを送る。GWに向かってxxxx/udpで送信し、GW-NAPTで161/udpに変換し宛先のサーバへ送る。

```bash:
# snmpwalk -v2c -cpublic udp:GWアドレス.jp:xxxx .1 
    GWアドレス:xxxx -> 192.168.0.xx:161  # GW-NAPT
....
```

# snmptrap(trap & catch)
## 内部(snmptrap:any) → 外部(snmptrapd:162)
外部VPSに向かって、udp/16２でSNMP-requestを送る。outboundなので、得意な点はない。

```bash:
# snmptrap -v2c -cpublic 外部VPS.jp '' systemStats 1 s "TEST TRAP" 
```
　
## 外部(snmptrap:any) → GW-NAPT(xxxx:162) → 内部(snmptrapd:162)
内部に向かってSNMP-TRAPを送る。GWに向かってxxxx/udpで送信し、GW-NAPTで162/udpに変換し宛先のサーバへ送る。

````bash:
# snmptrap -v2c -cpublic udp:GWアドレス.jp:xxxx '' systemStats 1 s "TEST TRAP"  
    GWアドレス:xxxx -> 192.168.0.xx:162  # GW-NAPT
```
深層学習／シグモイド関数の誤差逆伝播

#1.はじめに
　シグモイド関数の誤差逆伝播についてまとめる

#2.シグモイド関数の微分
　シグモイ度関数の微分は、美しくシンプルな形をしている。

**sigmoid関数：**

```math
sigmoid(x) = \frac{1}{1+e^{-x}}
```

**sigmoid関数の微分：**

```math
sigmoid'(x) = \frac{1}{1+e^{-x}} * ( 1 - \frac{1}{1+e^{-x}})
```

#3.シグモイド関数のコード
　従って、シグモイド関数の誤差逆伝播コードも以下の様にシンプルとなる。

```python
Class Sigmoid(object):
   def __init__(self, x):
       self.x = x

   def forward(self):
       y = 1.0 / (1.0 + np.exp(- self.x))
       self.y = y
       return y
   
   def backward(self, grad_to_y):
       grad_to_x = grad_to_y * self.y * (1.0 - self.y)
       return grad_to_x
```
【自分用】最短経路問題メモ

# 最短経路問題で使用するアルゴリズム

* BFS
  * 計算量：O(N)
  * 使用用途：辺のコストが全て１のとき
* ダイクストラ
  * 計算量：O(MlongM)
  * 使用用途：辺のコストが違うとき
* ワーシャルフロイド
  * 計算量：O(N**2)
  * 使用用途：密なグラフ（点が少なく辺が多い）で全点間の距離を求めるとき
  * 特徴：点間の総コストが計算できる、実装が軽い
* ベルマンフォード
  * 計算量：O(NM）
  * 使用用途：負のコストの辺があるとき

※基本的にはBFSもしくはダイクストラでOK
# 問題一覧
# 回答
製薬企業研究者ゆきやのR記事まとめ

# はじめに

私がQiitaに投稿したRに関する記事のまとめです。
今後もRに関する記事を追加していくごとに、こちらのまとめも更新していきます。


# 初級編

## 環境構築

- [RとRStudioのインストール](https://qiita.com/yukiya285/items/d7d605e25e148093d35b)
- [データサイエンスで用いるパッケージのインストール](https://qiita.com/yukiya285/items/f6bfdd9a32d1efe7e533)


## 基本的な文法・構文

- [R言語の基本的な記述ルール](https://qiita.com/yukiya285/items/afaf2badd96307f2615e)
- [変数](https://qiita.com/yukiya285/items/9df88b64e4fae026a56d)
- [演算子](https://qiita.com/yukiya285/items/c57e95a44e7d8981511d)
- [データ構造](https://qiita.com/yukiya285/items/7585f9ee8975cb092cfa)
- [制御文](https://qiita.com/yukiya285/items/811d34e9a2e21e4aae5d)
- [関数](https://qiita.com/yukiya285/items/97fe79b24bc47b1fef6c)


# 中級編

## 基本的な文法・構文

- [変数とデータ型](https://qiita.com/yukiya285/items/4e69857e967a6fc06bcb)
- [データ構造](https://qiita.com/yukiya285/items/32a8c05f908b68beb14f)
- [条件分岐](https://qiita.com/yukiya285/items/7926a0380ba4dce14351)
- [反復処理](https://qiita.com/yukiya285/items/4d87b2ecb38153e9787a)
- [関数](https://qiita.com/yukiya285/items/492b695ed7146e83ebe2)


# まとめ

私が今まで投稿したR関連の記事について、「初級編」、「中級編」に分けてまとめてみました。
今後、「上級編」の記事も投稿予定です。

# 参考資料・リンク

[プログラミング言語Rとは？統計分析に強い？](https://pharma-engineer.com/basic-programming/r-summary/)
MySQLのエラーでDjangoアプリがローカルで実行できなくなったときの話


久しぶりにDjangoのアプリケーションを立ち上げようと以下のコマンドを打ったところ
 `python.manage.py runserver` 
こんなエラーが。前は動いてたはずなのに何故
`django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 111] Connection refused)")`

## MySQLの起動確認
```
$ mysql.server start
Starting MySQL
.... * The server quit without updating PID file (/home/linuxbrew/.linuxbrew/var/mysql/***.pid).
```
**PIDファイル**とは，Linux上であるサービスが起動したときに作成されるファイルで，プロセス番号が割り振られているらしい．サービスが動いているかどうかの判断基準になる．
***は端末名

## 空のPIDファイルを作ってみる
```
$ touch /home/linuxbrew/.linuxbrew/var/mysql/***.pid

$ mysql.server restart
 * MySQL server PID file could not be found!
Starting MySQL
.rm: cannot remove '/tmp/mysql.sock': Operation not permitted
2020-03-20T18:09:18.611443Z mysqld_safe Fatal error: Can't remove the socket file:
/tmp/mysql.sock.
Please remove the file manually and start /home/linuxbrew/.linuxbrew/Cellar/mysql/8.0.18_1/bin/mysqld_safe again;
mysqld daemon not started
 * The server quit without updating PID file (/home/linuxbrew/.linuxbrew/var/mysql/***.pid).
```

## /tmp/mysql.sock削除＆再チャレンジ
```console
$ sudo rm /tmp/mysql.sock
$ touch /home/linuxbrew/.linuxbrew/var/mysql/***.pid
$ mysql.server restart
 * MySQL server PID file could not be found!
Starting MySQL
... *
$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.18 Homebrew

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```

通った！
日本語フィールド名の扱いについて

自分の地元のことを調べてみようと思って
[県内の最新感染動向](http://www.pref.kanagawa.jp/osirase/1369/)から[新型コロナウイルス感染症対策　陽性患者数及び陽性患者の属性データ](http://www.pref.kanagawa.jp/osirase/1369/)のページの[データ](http://www.pref.kanagawa.jp/osirase/1369/data/csv/patient.csv)をダウンロードしてみたところ
文字コードがSJIS:sweat:excel便利ですよね
nkfに通して `nkf -w patient.csv > patient.csv`でなんとかしたがフィールド名が日本語

```
| inputlookup patient.csv
| stats count by "居住地"
| rex field="居住地" mode=sed "s/神奈川県//"
| rex field="居住地" mode=sed "s/保健福祉事務所管内/市/"
| rex field="居住地" mode=sed "s/保健所管内//"
| eval featureId=case('居住地'="横浜市","横浜市中区",'居住地'="川崎市","川崎市幸区",'居住地'="相模原市","相模原市中央区",'居住地'="","県",true(),'居住地')
| fields - 居住地
| geom geo_kanagawa
```
このクエリーとみてもらえれば分かる通り

- eval: `'(シングルコーテーション)`
- rex: `"(ダブルコーテーション)`
- その他: そのまま

というめんどくさい結果に
Splunkで扱う場合、UTF-8は必須だし、そのあといろいろと`'"`が必要があるので、持ってきた段階でフィールド名を変更したほうがいいと思います。
Python Install 方法【Mac編】

pythonを勉強している初心者です。
この記事は学習の目的として記録中です。
なので、参考にできる記事とか内容が間違ってたらコメントをよろしくお願いします。

# 開発環境
OS : macOS Catalina
Version : 10.15.3

# Download
[Downloadページへ](https://www.python.org/downloads/)
<img width="1765" alt="スクリーンショット 2020-03-29 17.59.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586473/a12c76cb-ed12-4fa4-6802-7f0f840dcf5d.png">
Download Python 3.8.2をクリック。

# Install
<img width="496" alt="スクリーンショット 2020-03-29 18.06.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586473/45b10839-b78c-74fc-1583-11b966dca871.png">
1. ファイルをOpen!
2.「続ける」ボタンを〜
※許諾への同意を求められたら、「同意する」ボタンを選択！
3.「〜 was successfully installed.」メッセージが表示されたら問題なし！

# SSL証明書Install
Python3.6以降はSSL証明書のInstallが必要。
1. アプリケーションOpen。
2. Python 3.xフォルダOpen。
3. 「Install Certificates.command」をダブルクリック。
※インストールを行う。

# 実行方法
```
$ python3
または
$ python3.X
```

# 参考記事
[macOS環境のPython](https://www.python.jp/install/macos/index.html)
Visual Studio Code の Markdown 拡張便利機能まとめ

Qiita Blog や GitHub の README など、Markdown 形式で記事を書くこと多くなりました。Markdown 形式のドキュメントを書く際に便利なツールは色々ありますが、私が気に入っているのは「Visual Studio Code」の「Markdown Editor」と「Markdown Shortcuts」を組み合わせて使う方法です。

#追加機能のインストール
以下のリンクから、二つの機能をインストールします。Visual Studio Code から直接インストールしてももちろん大丈夫です。
[Markdown Editor](https://marketplace.visualstudio.com/items?itemName=MadsKristensen.MarkdownEditor)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/9039491b-77fd-a0e1-76c3-975fbbd35ddf.png)
[Markdown Shortcuts](https://marketplace.visualstudio.com/items?itemName=mdickin.markdown-shortcuts)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/0c2afed9-0ae2-5c78-50e0-2a704bce888d.png)

#便利なショートカット機能 3 選
二つの追加機能をインストールすると様々なショートカット機能を使用しますが、個人的に素晴らしく便利だと思っている機能を紹介します。

##プレビューページ表示/タブ切り替え

>プレビューの表示 : `Ctrl` + `Shift` + `v`
タブの切り替え : `Ctrl` + `Tab`

これはかなり使用します。Visual Studio Code の Markdown Editor をインストールすると Markdown のプレビューをみることが出来ます。プレビューを開いたあとはタブ切り替えをしながら編集します。
![test01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/b44c936b-192d-a5bc-86cc-50d96395d723.gif)

##URLs を生成ショートカット
URL リンクを作成する際には `[]` や `()` を入力しなくてはいけないので、ちょっとめんどくさいです。そこで Markdown Shortcuts のショートカットを使用します。

>リンクを設定するテキストを選択し、`Ctrl` + `L`

![test02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/3cb17ade-3f1c-ee54-3a10-6e3906c4796c.gif)

サクッとテキストを囲ってくれるので非常に便利です。

##Bullet Point の生成ショートカット
Bullet Point を入れるためには、`*` を使用していましたが、複数を一気に Bullet にする際は結構手間です。これも Markdown Shortcut のショートカットで解消できます。

>Bullet にしたい範囲を選択し、`Ctrl` + `M` , `Ctrl` + `B`

![test03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/687ee214-0408-7646-bfd9-f5d0e5b10b3e.gif)

これで複数行を纏めて Bullet にできました。

##その他のショートカット
その他ショートカットは以下の様なものがあります。

Name | Description | Default key binding
-----|-------------|--------------------
md-shortcut.showCommandPalette | Display all commands | ctrl+M ctrl+M
md-shortcut.toggleBold | Make **bold** | ctrl+B
md-shortcut.toggleItalic | Make _italic_ | ctrl+I
md-shortcut.toggleStrikethrough | Make ~~strikethrough~~ | 
md-shortcut.toggleLink | Make [a hyperlink](www.example.org) | ctrl+L
md-shortcut.toggleImage | Make an image ![](image_url.png) | ctrl+shift+L
md-shortcut.toggleCodeBlock | Make ```a code block``` | ctrl+M ctrl+C
md-shortcut.toggleInlineCode | Make `inline code` | ctrl+M ctrl+I
md-shortcut.toggleBullets | Make * bullet point | ctrl+M ctrl+B
md-shortcut.toggleNumbers | Make 1. numbered list | ctrl+M ctrl+1
md-shortcut.toggleCheckboxes | Make - [ ] check list (Github flavored markdown) | ctrl+M ctrl+X
md-shortcut.toggleTitleH1 | Toggle # H1 title | 
md-shortcut.toggleTitleH2 | Toggle ## H2 title | 
md-shortcut.toggleTitleH3 | Toggle ### H3 title | 
md-shortcut.toggleTitleH4 | Toggle #### H4 title | 
md-shortcut.toggleTitleH5 | Toggle ##### H5 title | 
md-shortcut.toggleTitleH6 | Toggle ###### H6 title | 
md-shortcut.addTable | Add Tabular values | 
md-shortcut.addTableWithHeader | Add Tabular values with header | 

参考情報 : [Markdown Shorcut](https://marketplace.visualstudio.com/items?itemName=mdickin.markdown-shortcuts)

Qiita Blog の下書き用に是非使ってみてください！
プログラミング初心者がgitでつまずいた。英語の意味を調べて、専門用語を深く理解しました。

gitについて１から復習してみました。




# Git 

gitは、プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムである。

要は、複数人で開発するときに、誰がどれをいじったのか分からなくてグチャグチャになるのを防止するためのシステムのことなんだなーてことか。よし。


#Github

これはgitを扱うためのツールのことですな。

っと書き始めてたら、最強に分かりやすく説明している記事を見つけてしまいました。



こちらを読めば完璧。

https://qiita.com/nnahito/items/e546b27f73e7be131d4e


でも疑問点が二つ湧いてくる。

##pullとbranchって一緒じゃね？あと、pushとmargeって一緒じゃね？

すごい調べたけど、概念が違うっぽい

branchとmargeは、masterから枝分かれを作ったり、合体したりする行為

pullとpushはそれを包括して取ってきたり送ったりするからconflictが起こりやすい。
「30日でできる！OS自作入門」二日目(helloos3〜helloos5)をUbuntu18.04/NASMで作る

#はじめに
[「30日でできる！OS自作入門」一日目](https://qiita.com/furble/items/85d95908440c3605dda1)の続きです。


#環境
```bash
$ uname -a
Linux furble 5.3.0-42-generic #34~18.04.1-Ubuntu SMP Fri Feb 28 13:42:26 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
$ nasm -v
NASM version 2.13.02
$ qemu-system-i386 --version
QEMU emulator version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.23)
Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers
```
#helloos3
前回と同じく、RESBをTIMES命令に書き換えます。
そして

```bash
$ nasm helloos.asm -o helloos.img -l helloos.lst
$ qemu-system-i386 -drive file=helloos.img,format=raw,if=floppy
```
でqemuが起動しますが、失敗しました。
調べると、[こちらのサイト](https://qiita.com/pollenjp/items/d15fce401bccd37e8059)によると、
TIMES	0x7dfe-(\$-\$\$) DB 0
を
TIMES	0x7dfe-0x7c00-(\$-$$) DB 0
つまりファイルの先頭で指定したORG 0x7c00を更に引くことでエラーが直りました。この理由はよく分かってません...

```diff
$ diff -u projects/02_day/helloos3/helloos.nas tolset/helloos3/helloos.asm
--- projects/02_day/helloos3/helloos.nas	2020-03-25 17:15:30.931931307 +0900
+++ tolset/helloos3/helloos.asm	2020-03-29 17:23:34.191854689 +0900
@@ -24,7 +24,7 @@
 		DD		0xffffffff		; たぶんボリュームシリアル番号
 		DB		"HELLO-OS   "	; ディスクの名前（11バイト）
 		DB		"FAT12   "		; フォーマットの名前（8バイト）
-		RESB	18				; とりあえず18バイトあけておく
+		TIMES	18	DB 0			; とりあえず18バイトあけておく
 
 ; プログラム本体
@@ -55,13 +55,13 @@
 		DB		0x0a			; 改行
 		DB		0
 
-		RESB	0x7dfe-$		; 0x7dfeまでを0x00で埋める命令
+		TIMES	0x7dfe-0x7c00-($-$$) DB 0	; 0x7dfeまでを0x00で埋める命令
 
 		DB		0x55, 0xaa
 
 ; 以下はブートセクタ以外の部分の記述 
 		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
-		RESB	4600
+		TIMES	4600 DB 0
 		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
-		RESB	1469432
+		TIMES	1469432 DB 0
```

#helloos4
helloos5と被るので省略。

#helloos5
ipl.asmの変更点はhelloos3と同じです。
Makefileの中にある

```Makefile
helloos.img : ipl.bin Makefile
	../z_tools/edimg.exe   imgin:../z_tools/fdimg0at.tek \
		wbinimg src:ipl.bin len:512 from:0 to:0   imgout:helloos.img
```
が何をやっているかよく分かりませんが、[先ほどのサイト](https://qiita.com/pollenjp/items/d15fce401bccd37e8059)のMakefileを見ると単にimgファイルにipl.binの中身をコピーしているだけのようです。

```:Makefile
# ファイル生成規則
ipl.bin : ipl.asm Makefile
	nasm ipl.asm -o ipl.bin -l ipl.lst

helloos.img : ipl.bin Makefile
	cat ipl.bin > helloos.img

img :
	make -r helloos.img

asm :
	make -r ipl.bin

run :
	make img
	qemu-system-i386 -drive file=helloos.img,format=raw,if=floppy
```
これで、make runするだけでqemuの起動までできるようになりました。

先人の残した情報のおかげで進められてます。自力でやっていたら詰んでましたね...圧倒的感謝...
ZEIT NowでFlaskをデプロイする

[NOW](https://zeit.co)を使ってPython(Flask)をどうさせようとしたら苦戦した。公式ドキュメントも見づらいので改めてまとめる。

# Flaskを最低限動かす

Flaskを動かすだけならこれで動作する。now.jsonの builds が重要なポイント。

```index.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def index():
    return "hello"
```

```requirements.txt
flask==1.0.2
```

```now.json
{
    "version": 2,
    "builds": [{ "src": "index.py", "use": "@now/python" }]
}
```

# 複数のルーティングに対応する

## 問題点

index.pyに `/hello` を処理するルーティングを追加したとする。

```index.py
from flask import Flask
app = Flask(__name__)


@app.route("/")
def index():
    return "hello"

@app.route("/hello")
def world():
    return "world"
```

### 404になっている様子

この状態でデプロイして `/hello` にアクセスすると404になってしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38967/1c178f32-0789-ce68-7aaa-4731709d739d.png)

### now.jsonにroutesを追加し回避する

適切に処理するためには、now.jsonを編集し、routesを追加する。これで、どんなリクエストでもwsgiのrootで処理されるようになる。

```now.json
{
    "version": 2,
    "builds": [{ "src": "index.py", "use": "@now/python" }],
    "routes": [{ "src": "/.*", "dest": "/" }]
}
```

### 正常にリクエストをさばけている様子

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38967/c7817090-b154-ecc0-132e-d32345de3f5f.png)

### すべてのパスをFlaskが処理するようになっている様子

routesを追加したため、存在しないパスへリクエストが来ると必ずFlask経由で処理される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38967/5ed114c0-9875-e6b1-fb90-23b2baf9fc9f.png)

### 404ページをカスタマイズする

[Flaskの公式ドキュメントのカスタムエラーページ](https://flask.palletsprojects.com/en/1.1.x/patterns/errorpages/#returning-api-errors-as-json)を見てカスタマイズできる

```index.py
from flask import Flask, jsonify
app = Flask(__name__)

@app.route("/")
def index():
    return "hello"

@app.route("/hello")
def world():
    return "world"

@app.errorhandler(404)
def resource_not_found(e):
    return jsonify(error=str(e)), 404
```

### 様子

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38967/8e1fa67c-212f-e141-e880-35406fb408f3.png)
【Python】(自分用メモ) メタクラスとメタプログラミング

# クラス (or クラス宣言) は第一級オブジェクト

参考:

- https://note.crohaco.net/2016/python-metaclass/
- https://qiita.com/fujimisakari/items/0d4786dd9ddeed4eb702

クラスを宣言するということは、type クラスのインスタンスを作成していることと等価。

```text
 class C: ... ≡ C = type('C', ...)
```

# クラス生成のカスタマイズ

参考:

- https://qiita.com/pashango2/items/fadc77c8db21c8fd9367
 
この、type インスタンス生成をカスタマイズするのが `metaclass` 指定。メタクラス `M` を `type` のサブクラスとして宣言し、 `__new__` メソッドをオーバーライドすることにより、あるクラス宣言時のクラス生成をカスタマイズできる:

```python
class C(metaclass=M): ...
```

すべてのクラス生成時に強制的に `M` を適用することはできないと推測している [要調査]。

# インスタンス生成のカスタマイズ

参考:

- https://qiita.com/FGtatsuro/items/49f907a809e53b874b18

インスタンス生成のカスタマイズはクラスの `__new__` および `__init__` を定義 (オーバーライド) して行う。
特に、`__new__` をカスタマイズすることにより、生成が意図されたクラス (`c = C(...)` の `C`) 以外のクラスインスタンスを生成して返す事が可能になる。これは例えばファクトリクラスの実装に使える。
一方、御存知の通り、`__init__` は生成されたインスタンスの初期化 (プロパティの設定など) に使用される。

# 未調査: `__prepare__`

今度調べる。
Jetson NanoのSDカードを拡張する

ダウンロードしたイメージはSDカードの容量をフルに活用していない場合があるので、コマンドにてパーティションを拡張する。ラズパイではraspi-configを呼び出してGUIでできますが今のところコマンドでやる方法です。

ディスク空き容量を調べる
```
$df -h
```

対象のパーティションを削除する
```
$sudo fdisk /dev/mmcblk0
```

パーティションテーブルを表示
```
コマンドpを入力
```

パーティションを削除する
```
コマンドdを入力
```

削除はパーティション番号は１
```
パーティションナンバーは１
```

新しいパーティションを作成

```
コマンドnを入力
```
新しいパーティション番号は１
```
パーティションナンバーは１
```
パーティションの変更を保存して終了する

```
コマンドwを入力
```

再起動します。
```
$sudo reboot
```

セクターサイズが最大化できずエラーが出る場合は、
一旦、fdiskを停止して、partedをインストールして
```
sudo parted /dev/mmcblk0
```


変更前のディスク容量が表示されて１００％と入力する。
```
etson@nano-4gb-jp461:~$ sudo parted /dev/mmcblk0
GNU Parted 3.2
Using /dev/mmcblk0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p                                                                
Warning: Not all of the space available to /dev/mmcblk0 appears to be used, you can fix the GPT to use all of the
space (an extra 125001728 blocks) or continue with the current setting? 
Fix/Ignore? fix                                                           
Model: SD SR128 (sd/mmc)
Disk /dev/mmcblk0: 128GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
 2      1049kB  1180kB  131kB                TBC
 3      2097kB  2556kB  459kB                RP1
 4      3146kB  3736kB  590kB                EBT
 5      4194kB  4260kB  65.5kB               WB0
 6      5243kB  5439kB  197kB                BPF
 7      6291kB  6685kB  393kB                BPF-DTB
 8      7340kB  7406kB  65.5kB               FX
 9      8389kB  8847kB  459kB                TOS
10      9437kB  9896kB  459kB                DTB
11      10.5MB  11.3MB  786kB                LNX
12      11.5MB  11.6MB  65.5kB               EKS
13      12.6MB  12.8MB  197kB                BMP
14      13.6MB  13.8MB  131kB                RP4
 1      14.7MB  63.9GB  63.8GB  ext4         APP

(parted) resizepart 1
Warning: Partition /dev/mmcblk0p1 is being used. Are you sure you want to continue?
Yes/No? Yes                                                               
                                        
End?  [63.9GB]? 100%                                                      
(parted) q                                                                
Information: You may need to update /etc/fstab.

```
再び、fdiskで実行するする。


ディスク空き容量を調べる
```
$df -h
```

パーティション変更の後、ファイルシステムのサイズを拡張する
```
$sudo resize2fs /dev/mmcblk0p1
```

空き容量が増えたのか確認する。
```
$df -h
```
callback形式refってちょっときになるやつをやってみる

# 概要
React hooksのドキュメントを眺めていたら、ちょっと気ななるuseRefの使い方が書かれていた。
いつどんな状況で使えるのかも含めて書いていく。

https://ja.reactjs.org/docs/hooks-faq.html#how-can-i-measure-a-dom-node

# なにをしたいやつか
リファレンスを見ている限り、refで指定しているコンポーネントがマウントされたタイミングで実行できる関数をrefに書くことができるように見えた。

```jsx
export default function App() {
  const callbackref = useCallback(() => console.log("appのref"), []);
  return <div ref={callbackref} className="App" />;
}

// appのref 
```

# 再レンダリングされたとき
再レンダリングされたときは、もう一回関数が実行されるか試してみる。
予想：実行される

```jsx
export default function App() {
  // 再レンダリング用
  const [state, setState] = useState(false);
  const toggleState = useCallback(() => setState(!state), [state]);
  console.log({ state });

  const callbackref = useCallback(() => console.log("appのref"), []);
  return (
    <div ref={callbackref} className="App">
      <button onClick={toggleState}>toggle</button>
    </div>
  );
}
```

![Mar-28-2020 23-43-33.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160041/315d4222-ae57-0c8b-c0f1-a055d1908f92.gif)

予想と違って、初回のレンダリングときだけ処理されるようだ。

# 子ノードにも持たせてみる
子のノードにもcallbackrefを渡したときはどんな順番で処理されるのか見てみる
予想：親→子の順番

```jsx
export default function App() {
  // 再レンダリング用
  const [state, setState] = useState(false);
  const toggleState = useCallback(() => setState(!state), [state]);
  console.log({ state });

  const callbackref = useCallback((node) => console.log(node), []);
  return (
    <div ref={callbackref} className="pearent">
      <div ref={callbackref} className="child" />
      <button onClick={toggleState}>toggle</button>
    </div>
  );
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160041/fc154947-adda-d250-121d-65a26f5b7557.png)

これも予想とは違い、子→親の順番で処理された。
これはの順番もあるかもだけど、レンダリング処理が終わった順番から処理されるのかもしれない。

# useEffectと比べて
useEffectの処理との順番を見る
予想：子→親→useEffect

```jsx
export default function App() {
  // 再レンダリング用
  const [state, setState] = useState(false);
  const toggleState = useCallback(() => setState(!state), [state]);
  
  useEffect(() => {
    console.log('useEffect');
  }, []);

  const callbackref = useCallback((node) => console.log(node), []);
  return (
    <div ref={callbackref} className="pearent">
      <div ref={callbackref} className="child" />
      <button onClick={toggleState}>toggle</button>
    </div>
  );
}

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160041/8929184e-8dd0-12ee-a693-987a8666ede8.png)

これは予想通り、最後にuseEffectの処理が来た。

# ここまででわかったこと
最初に述べたように、書くrefのノードがマウントされたあとにだけ処理されるようだ。

今まで、ノードに対して直接処理をしたい場合はuseEffectに書いていたんだが、これを使えば、useEffectを書かずとも、そのノードのrefに書いてあげればうまく動いてくれることがわかった。

# 使いみち

そして使いみちだけど、正直なにも思いつかないｗ
ライブラリ作るときとか、ちょっとこったUI作ったりするときは使うのかもしれないが、ちょっと考えつかない。。。

もしこんなので使ってるよみたいなのがあったら教えてほしいです。
WireGuardで「ping: sendmsg: Required key not available」と出たときの対処法

WireGuardを設定していざ疎通をチェックしようとした場合、
以下のようにエラーになることがある。

```
[root@myhost ~]# ping 10.244.0.4                                                                  
PING 10.244.0.4 (10.244.0.4) 56(84) bytes of data.
From 192.168.210.253 icmp_seq=1 Destination Host Unreachable
ping: sendmsg: Required key not available
From 192.168.210.253 icmp_seq=2 Destination Host Unreachable
ping: sendmsg: Required key not available
^C
--- 10.244.0.4 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1001ms
```

これはWireGuardのAllowed IPsに送り先のアドレスがないために起こっている。
AllowedIPsに必要なアドレス空間を追加して対処する。

```diff:wg0.conf
[Peer]
PublicKey = XXXXXXXXXXX...
- AllowedIPs = 192.168.192.0/18
+ AllowedIPs = 192.168.192.0/18,10.244.0.0/16
```

これによって、相手側から送り返されるpongパケットが正常にWireGuardによって処理される。

```
[root@myhost ~]# ping 10.244.0.4                                                                  
PING 10.244.0.4 (10.244.0.4) 56(84) bytes of data.
64 bytes from 10.244.0.4: icmp_seq=1 ttl=63 time=7.43 ms
64 bytes from 10.244.0.4: icmp_seq=2 ttl=63 time=7.21 ms
```
改行コードを含む文字列から改行コードを取り除いて一行の文字列を取得する

タイトルどおりです
忘れがちなのでメモ

```
let a = "hogehoge\fugafuga"
```

このような文字列をもつ定数があったとしてこれを二行から改行コード(\n)を取り除いて一行の文字列に変換します

```
// 改行コードを取り除いて、取り除いた後にくっつけて一行にする
a.dfdfa.components(separatedBy: .newlines).joined()
```


# 参考
https://qiita.com/Yokemura/items/0beac5be04118c4a9774
VRChat に自作アバターやワールドをアップロードする(メモ)

外部記事へのリンク集です。

# 準備

VRChat に VRchat のアカウント（Steam のではなく）でログインして、ユーザレベルを Visitor から New User に上げておく。VRChat 内で他の人がいるワールドに 20 か所くらい行って、フレンドを数人作って、滞在時間が24時間ほど経過したら New User になれる（かも）。

Unity のバージョンは 2017.4.28f1 を使います。2018 以降のバージョンでは VRC の SDK が正常に動作しません。

VRCのSDKは下記から取得可能です。
- https://www.vrchat.com/download/sdk

# アバター関連

- 自作のVRMをアップロード：https://qiita.com/100/items/7315fe3a7eb75732ae43
- VRoid Studio のデータをアップロード：https://shinrinmusic.com/vroid-vrchat-avatar-upload/

unitypackage のように、完成品をアップロードする場合は、下記の手順でいけます。

- 空のシーンを作って、asset をプロジェクトに追加する。
- モデルの prefab をシーンの 0,0,0 に配置する
- prefab に Add Component で VRC_avatarDescriptor を追加する（これ重要）
- unity 上の VRC Control panel でアップロードする。

詳細は上記リンク先を参照のこと。

- 外部シェーダーを使う場合は、モデルより先に読み込ませておく。
- Dynamic Bone のような asset を使用する場合も先に読ませておく。

# ワールド関連

- https://kato-robotics.hatenablog.com/entry/2018/08/16/003204#VRCWorld%E3%82%92Hierarchy%E3%81%B8

0,0,0 の地点には地面を作っておく。ワールドに入った時に、0,0,0 の地点に出現するため、その位置に地面がないと、無限に落下することになります。

# VR アプリ開発

- https://kan-kikuchi.hatenablog.com/entry/Unity_VIVE_Getting_Started

Unity に Steam VR plugin (asset) を読み込む。VR の通常のアプリ開発の場合、Unity のバージョンは最新版でOK。

アプリを起動する前に、Steam VR を起動しておく必要があります。アプリを起動すると、Steam VR のホーム画面からいきなりアプリの画面に切り替わります。アプリの起動は PC でマウスやキーボードを使って実行する必要があります。Virtual Desktop や OCR Toolkit などの使用を推奨。

上の方法で Oculus Quest + Oculus link と Valve index のどちらでも動くプログラムを書けました。
【UE4】メッシュの当たり判定を自分で作る方法 Collision【UnrealEngine】



棚のメッシュの中に何かオブジェクトを配置しようと思ったのですが、自動でメッシュを覆うような四角の当たり判定が作られていてゲームを起動すると中に配置したオブジェクトが当たり判定によって弾かれ、オブジェクトを棚の中に置けない問題が起こりました。

その問題を解決する方法を今回も画像まみれで解説していきます。


手順1.当たり判定を変更したいメッシュをクリックしてスタティックメッシュウィンドウを開く
----------------------------------------------

![shelf.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/4b98d378-def9-45e0-3f44-d30400fba9c3.png)
#####読み込んだメッシュをダブルクリックする

手順2.当たり判定を可視化する為に↓の項目をチェック
----------------------------------------------
![collison表示.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/a73eec50-ad74-e624-a8a4-50dd6e3dcdb9.gif)
緑色の線が当たり判定です。


手順3.コリジョンの欄から追加したい当たり判定を選択
----------------------------------------------
![addboxcollison.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/40884c6b-e559-867a-5957-0c5ed6e52da9.gif)

今回当たり判定を作ける棚は全てボックスの当たり判定を足していくだけで上手くいきそうです。
追加してはスケールを合わせ位置を調整して。。を繰り返していきます。




結果
---------------
![iikanji.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/8ed3abd6-2cf5-9040-e4c7-fb8407842b89.png)
![shelf3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/de30f4b2-7f1d-a187-acdb-674d6ab45141.png)

ゲーム実行時にしっかり棚に物が置けるようになりました。

--------------
参考サイト　https://docs.unrealengine.com/ja/Engine/Content/Types/StaticMeshes/HowTo/SettingCollision/index.html
iOSのWebViewをMacでデバッグする 

# はじめに
以前Webブラウザー作っていた時、一番困ったのが「Safariで動くのにこのブラウザーでは動かない！！」というお問い合わせでした。
そんな時、お世話になった"Webインスペクタ"の使い方を記事にすることで、誰か救われたらいいなーと思い書くことにしました。

# 必要なもの
* Mac端末(当時Yosemiteでやってたので、それなりに古くても大丈夫だと思います)
* iOS端末(当時iOS 8でやってた記憶があるので、それ以降ならできます)
* MacとiOSを接続する設備(MacによってはUSB typeCしかないので変換アダプタだったり必要かと)


# 手順
1.iOSの[設定]アプリでSafariのWebインスペクタを有効化
![Webインスペクタ有効.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96952/63868b3b-6595-44b1-5f3b-71423effc23f.png)

2.MacのSafariで「開発」メニューを表示する
![開発メニュー有効.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96952/48081608-168d-a512-ad35-a426874d6f22.png)

3.MacとiOS端末を接続して、Mac Safariの開発メニューを表示すると・・・
![開発メニュー表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96952/13aba6a8-888d-9aeb-119a-96c62aad2f24.png)

こんな感じで表示されます！！！
今回はSafariを例に出していますが、UIWebView/WKWebViewでコンテンツ表示しているアプリはリストアップされます。その際はDebugビルドしたアプリでご利用くださいね！(Releaseビルドしたアプリは表示されません)

# 例
例えば、qiita.comを選んで、Webインスペクタの要素タブでヘッダーの部分を選択すると、iOS端末側で該当箇所にスモークがかかり、示してくれます。
![Webインスペクタ例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96952/6a164285-2c22-83ff-8b7a-c57aa4c791a9.png)

その他にも、

* デバッガタブでJavaScriptにブレークポイント張ってステップ実行
* コンソールログ確認
* ネットワークタブで、発生した通信の確認
* ストレージタブで記録されてるCookieの確認

などなど、いろいろなことができるようになります。

# なぜか表示されない・・・そんな時
* 開発メニュー内に接続したiOS端末が表示されない<br>
  →MacのSafariを開いた状態でiOS端末を接続した時、うまく行かないケースが私の手元で何度か見られたので、その時はMacのSafariを再起動してみてください。私の手元では解消しました。<br>
（iOS端末の再接続では解決せず)
<br><br>
* 開発メニューで接続したiOS端末は表示されたが、アプリが表示されない<br>
  →Debugビルドしたアプリを使ってますか？(Releaseビルドしたアプリは表示されません)
CSSのプロパティを自動で並べ替える方法

複数人で開発をしていると

- marginとpaddingってどちらを先に書けば良いだろう？
- position指定ってtop -> right -> bottom -> leftの順が良いのかな？

などの話が出ることはありませんか？

自分は結構質問されるのですが、個人的にはカスケーディングがスタイルに影響を与えない場面ではどんな順番でも良いと思っています。

しかし、ルールがあればミスが減り、レビューがしやすくなるのも事実。

というわけで自動でプロパティの並び順を変更できる設定を作っていきましょう。

## Prettierのインストール

```
yarn add prettier -D
```

まず初めにPrettierをインストールします。
Prettierはコードフォーマッターで、予め指定したルールに沿ってコードを整形してくれます。

## stylelintのインストール

```
yarn add stylelint -D
```

次にstylelintをインストールします。
stylelintはリンターで、CSSやSCSSなどのエラー回避や書式の統一に役立ちます。

## stylelint-config-prettierのインストールと設定

```
yarn add stylelint-config-prettier -D
```

```json:.stylelintrc
{
  "extends": ["stylelint-config-prettier"]
}
```

stylelint-config-prettierはPrettierと競合するルールをオフにしてくれます。
ルールが競合するとお互いがお互いをエラー/書式のミスとして認識しておかしなことになってしまうためインストールが必要です。

## stylelint-prettierのインストールと設定

```
yarn add stylelint-prettier -D
```

```json:.stylelintrc
{
  "extends": ["stylelint-config-prettier"],
  "plugins": ["stylelint-prettier"],
  "rules": {
    "prettier/prettier": true
  }
}
```

stylelint-prettierはPrettierをstylelintのルールとして実行し、エラーを教えてくれたり修正したりに使います。
`.stylelintrc`の中でプラグインの有効化とルールの追加をします。

なお、stylelint-prettierをインストールしたからとPrettierやstylelintが自動でインストールされるわけではありません。
そのため前の項で手動でインストールを行っています。

また、上記の`.stylelintrc`は実は次のように短く書けます。

```json:.stylelintrc
{
  "extends": ["stylelint-prettier/recommended"]
}
```

`stylelint-prettier/recommended`が

1. `stylelint-config-prettier`をextend
1. `stylelint-prettier`プラグインを有効化
1. `prettier/prettier`ルールを有効化

してくれるためです。

## stylelint-orderのインストールと設定

```
yarn add stylelint-order -D
```

```json:.stylelintrc
{
  "extends": ["stylelint-prettier/recommended"],
  "plugins": ["stylelint-order"],
  "rules": {
    "order/properties-alphabetical-order": true
  }
}
```

stylelint-orderはその名の通りプロパティの並び順ルールについてのパッケージです。
並び順は色々なルールがあるようですが、自分は一番明快だろうとアルファベット順を選択しました。

## 準備完了、あとはコマンドを叩くだけ

```
yarn run stylelint '**/*.css' --fix
```

上記のようなコマンドを叩くとCSSの並び順を修正してくれます。
`'**/*.css'`の部分はこの書き方だと全てのCSSファイルへの修正が走りますが、具体的に`'src/style/somepage.css'`のようにしてもOKです。

## 補足

実際にstylelintを使う場面ではほぼ間違いなく[stylelint-config-standard](https://github.com/stylelint/stylelint-config-standard)など土台となるルールセットも一緒に使うと思いますが今回は割愛しています。

## リンク一覧

- https://prettier.io/
- https://stylelint.io/
- https://github.com/prettier/stylelint-prettier
- https://github.com/prettier/stylelint-config-prettier
- https://www.npmjs.com/package/stylelint-order
webにあるzip fileをpandasに読み込ませる

ローカルにzipをダウンロード -> 解凍 -> pandasに読み込ませるより、
メモリに積まれたままdataframeに落としたかったためのメモ

webにこんなurlがありました
https://www.stats.govt.nz/assets/Uploads/Electronic-card-transactions/Electronic-card-transactions-February-2020/Download-data/electronic-card-transactions-february-2020-csv.zip

```python
import requests
import zipfile
import io
import pandas as pd

# url
url = "https://www.stats.govt.nz/assets/Uploads/Electronic-card-transactions/Electronic-card-transactions-February-2020/Download-data/electronic-card-transactions-february-2020-csv.zip"

# 取得
res = requests.get(url)
# 解凍
z = zipfile.ZipFile(io.BytesIO(res.content))
# 確認
z.namelist() 
# 出力結果
# ['electronic-card-transactions-Feb-2020-csv-tables.csv']

# csvをバイナリで読み込み
with z.open(z.namelist()[0], 'r') as myfile:
    binaryCSV = myfile.read()

# DataFrame
df = pd.read_csv(io.BytesIO(binaryCSV), encoding='utf-8') # 日本語の場合はencoding='sjis'

# 確認
df.head()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202660/2c78bb65-9aa1-b715-feb2-1e11e459c838.png)
UserDefaultsのキーを管理

同じKey名を設定したつもりでもtypoしてしまっていてKeyに期待結果が入ってないなんてことはあるので
enumで管理するにはどうすればいいかまとめておこうと思いましたが当然すでにまとめられていたのでその記事のリンクを貼って終わりにします

http://glassonion.hatenablog.com/entry/2016/12/07/140529

これみて自分もとりあえず必要な分だけ作りました

```
enum UserDefaultsSettings: String {
    case hogehoge

    func set(value: Any) {
        UserDefaults.standard.set(value, forKey: rawValue)
    }

    func object() -> Any? {
        return UserDefaults.standard.object(forKey: rawValue)
    }
    
    // 該当のKeyに対応するvalueがnilじゃないか
    func hasValue() -> Bool {
        return self.object() != nil
    }
}

```


あとはUserDefaultsを使って色々なところで値を保存したりしていると使用する場所が散らばって値の変化を追いづらくなるみたいなのでその辺もあとで調べながらまとめていきたい
DataStoreみたいなところで実際のset,object等のUserDefautlsの処理をまとめておけばいい気もするけど


## 追記
UserDefaultsの仕組み
https://qiita.com/TheAtlasEngine/items/d29eba3e01f51c5906ea
https://hajihaji-lemon.com/smartphone/swift/nsuserdefaults/
vueコンポーネント内でsassを使用するときにディープセレクタを指定する方法

vue コンポーネント内の style を scss にして、その中でディープセレクタを使用したかったのですが、 `>>>` を使用すると動かなかったので、調べた内容についてまとめました。

```vue
<style lang="scss" scoped>
// ここで >>> を使いたい！
>>> .hoge {
// 
}
</style>
```

## ディープセレクタについて
> scoped スタイルのセレクタを "deep" にしたい、つまり子コンポーネントに及ぼしたい場合は、>>> コンビネータを使用することができます


## `::v-deep` を使用する
vue-loaderの[ディープセレクタ](https://vue-loader-v14.vuejs.org/ja/features/scoped-css.html#%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF)に下記の記載がありました。
> SASS のようないくつかのプリプロセッサは、>>> を適切に解析できないかもしれません。そのようなケースでは /deep/ コンビネータを代わりに使用することができます。それは、>>> のエイリアスで、全く同じような動作します。

ただ、下記の issue によると、実際には `/deep/` を使用すると chrome で warning が出るそうで、 `::v-deep` を使用するのが良いようです。実際に試したところ、warning ではなくて error が出ました。
https://github.com/vuejs/vue-loader/issues/913

```vue
<style lang="scss" scoped>
// >>> をそのまま ::v-deep に変更するだけでOK
::v-deep .hoge {
// 
}
</style>
```

## `::v-deep` の具体例
`::v-deep` を使う具体例をみたい場合には、こちらのPRで `/deep/` から `::v-deep` へ変更を行なっているため、参考になると思います。
https://github.com/aeternity/aepp-base/pull/1347/files

## ドキュメントの修正状況

ドキュメントの修正に関しては、変更の提案の issue はあがっていたので、そのうち修正されると思います。
[Remove /deep/ from documentation for future releases for Deep Selectors](https://github.com/vuejs/vue-loader/issues/1652)
README　データベース設計

マークダウンで記述します。
自分の勉強用でメモします。
初学者の方は参考にしてください。

以下のようなテーブルを作成したとします。


##usersテーブル　　　
|Column|Type|Options|
|------|----|-------|
|name|string|null: false, add_index: true|
|email|string|null: false, unique: true|
|password|string|null: false|
|password confirmation|string|null: false|



##意味を下記に記述した。

↓↓したのusersテーブルはテーブル名を記述する。
usersテーブル　これはコメントアウトする。

↓↓ここはテンプレートで大丈夫です。　　
|Column|Type|Options|
|------|----|-------|



##|❶name|❷string|❸null: false, ❹add_index: true|


##❶name
❶nameはカラム名。
そのカラムの名前。

## ❷string
❷stringはデータ型です。
種類は以下のようにあります。

string 文字列型
text テキスト（不定長文字列）型
integer 整数型
float 浮動小数点数型
decimal 固定長整数型
datetime 日時型
timestamp タイムスタンプ型
time 時刻型
date 日付型
binary バイナリ文字列型
boolean 真偽値型
references 他のテーブルへの外部キーの定義、_id が付いた整数などがあります。

##❸null: false 

❸null: false カラムにnullを許可しない
カラムのオプションです！！
NULLとは（空の値）のこと。
（null false制約など）
以下があります。

❹Usersテーブルのnameカラムにindexを張ることで、アルファベット順にnameを並べ替え検索しやすいようにしてくれます。


null: false カラムにnullを許可しない
unique: true　カラムに同じ値を許可しない
foreign_key: true　他のテーブルへの外部キー制約をつける　indexも自動付与
default: "oooooo"　カラムに値が設定されなかった場合にデフォルトで格納される値を設定。
limit: 50　データ型の最大幅を指定。
対象となるデータ型は文字列タイプはstring型とtext型の2つ、数値タイプはinteger型とbinary型の2つ。
precision: 10, scale: 5 指定することで精度(最大桁数)とスケール(小数点以下の桁数)を指定。
対象となるデータ型は文字列タイプはdecimal型。


##以下同様です。
|❶email|❷string|❸null: false, ❹unique: true|
❶email＝カラム名
❷string＝文字列型
❸null: false＝カラムにnullを許可しない
NULLとは（空の値）空欄のこと！！！
❹unique: true＝同じアドレスはダメということ。



##アソシエーション
対象を1つ持っているなら、has_one

has_oneは自分のテーブルが対象テーブルを1つ持っている(複数持たない)場合に使います。対象テーブル側に自分のidのカラムがある場合に使います。
対象を複数持っているなら、has_many

has_manyは自分のテーブルが対象テーブルを複数もつ場合に使います。対象テーブル側に自分のidのカラムがある場合に使います。
自分が対象に所属しているなら、belongs_to

belongs_toは、自分のテーブルが対象テーブルのレコードに所属する(対象テーブルのidカラムがある)場合に使います。
[python] 画像ファイル名を連番に変える

# やりたいこと
画像のファイル名を連番に変える。
[変更前]
a.jpg
b.jpg
c.jpg
[変更後]
0001.jpg
0002.jpg
0003.jpg

#準備
・pythonは既にインストールしている前提
・名前を連番にしたい画像を任意のフォルダ（今回はimage）に集める

# コードを作成
```python
import os
import glob

files = glob.glob('image/*')

for idx, f in enumerate(files):
    ftitle, fext = os.path.splitext(f)
    os.rename(f, format(idx, '04d')+fext)
```

1.imageフォルダ内の画像の名前を取得

```
files = glob.glob('image/*')
```

2.画像分だけ名前変更処理を繰り返す

```
for idx, f in enumerate(files):
```
enumrateによりidxには数字が入り、forで繰り返すたびに数字が１ずつ繰り上がります。

3.ファイル名を分解

```
ftitle, fext = os.path.splitext(f)
```
ftitle：ファイル名　ftext：拡張子
例えば、a.jpgならftitleには「a」、ftextには「.jpg」が入ります。

4.ファイル名を変更

```
os.rename(f, format(idx, '04d')+fext)
```
<前のページ 　次のページ>の実装

#前後のレコードを取得して、前後ページ移動する
# はじめに
よくブログなどで見る、
<前のページ 　次のページ>
でページ遷移をする機能を現在制作中のプロダクトに実装します。
調べた内容を極力シンプルにまとめました。

プロダクトは個人間取引を行うもので、今回実装するものは
商品を見ていくときの利便性を向上させるものです。
今回は出品された商品の詳細を表示するページに前後のリンクを実装します。
特にカラム別に分けることなく、全てのレコードを新着順で並べて前後していきます。
# 狙い

出品された順にページを前後するリンクを実装します。
<前のページ 　次のページ>
といった表示で、ページ遷移をします。



# 実装
今回はitems_controllerのshowアクションにて行います。
まず商品の情報を取得します。

``` app/controllers/itmes_controller.rb
def show
  @item = Item.find(params[:id])
end
```



次にitemモデルにて、メソッドを定義します。
where,order,firstメソッドを用いてpreviousメソッドとnextメソッドを定義して使用します。

```app/models/item.rb
def previous 
  Item.where("id < ?", self.id).order("id DESC").first 
end 

def next 
  Item.where("id > ?", self.id).order("id ASC").first 
end
```
whereメソッド
https://railsguides.jp/active_record_querying.html#%E6%9D%A1%E4%BB%B6

orderメソッド
https://railsguides.jp/active_record_querying.html#%E4%B8%A6%E3%81%B3%E9%A0%86

firstメソッド
https://railsguides.jp/active_record_querying.html#first



ビューは以下の通りです。
最初の前のレコードと最後の次のそれは存在しないので条件分岐で分けましょう。


```app/views/items/show.html.haml
- if @item.next.present?
  = link_to "次のページ>", item_path(@item.next)
     
- if @item.previous.present?
  = link_to "<前のページ", item_path(@item.previous)
```
拡張機能　blank?　present?
https://railsguides.jp/active_support_core_extensions.html#blank-questionmark%E3%81%A8present-questionmark

実際の実装では商品の名前を表示させたので以下のようにしました。
また、itemテーブルにnameカラムを設定しています。

```app/views/items/show.html.haml
- if @item.next.present?
  = link_to item_path(@item.next) do
    <
    = @item.next.name
     
- if @item.previous.present?
  = link_to item_path(@item.previous) do
    = @item.previous.name
    >
```
※途中にある<>は<前のページ　次のページ>、の両端に置いてあるものです。特に指定はありません。

# 完成例
<img width="718" alt="スクリーンショット 2020-03-29 16.21.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591903/a2db06ea-e49b-334e-519e-83c7f52eb2a7.png">
前後の商品の名前が表示され、実際にリンクを実装できました。

#おわりに
今回はテーブルにある全てのレコードの新着順で前後ページのリンクを実装しました。
ユーザー別、グループ別など持っている属性のまとまりの中で実装されている方がいらっしゃたのでリンクを載せておきます。
また参考にさせていただいた記事の作成者の方々、感謝申し上げます。
ありがとうございました。

# 参考リンク
https://qiita.com/hrtkmztn/items/df09584cfc621699532c
こちらはグループ内で投稿されたもので実装されてます。
アソシエーションや変数などに手を加える必要があるようです。
それぞれのユーザーが出品した商品一覧の前後を遷移するリンクを試作しましたが、実装できました。

https://easyramble.com/active-record-prev-next.html
previous, nextメソッドの実装に取り入れました。

https://www.for-engineer.life/entry/get-record/
こちらもよくまとめられています。
新世代Javaプログラミングガイドの紹介（Java 11編）

この記事は[新世代Javaプログラミングガイドの紹介（Java 10編）](https://qiita.com/kazsharp/items/b75773ff77a0900fa5b7)の続きです。

##Java 11での変更点
Java 11では以下の6つについて書かれています。

* ラムダパラメータのローカル変数構文
* Epsilon GC ― ガベージコレクタの改良
* HTTP クライアント API
* ZGC － 低遅延化とスケーラビリティの改善
* フライトレコーダとミッションコントロール
* JDK 11 のその他の改良点

###ラムダパラメータのローカル変数構文
Java 11でLambda式のパラメータでvarが使えるようになりました。
というと「あれ？ Lambda式のパラメータは元々型宣言はなくてもよかったんじゃ？」と思う人もいるかもしれません。
確かにLambda式では

```java
(int age) -> x > 100;
(age) -> x > 100;
x -> x > 100;
```

のような記述ができ、1番目以外は型の指定を省略しています。
そしてパラメータでvarが使えるということは

```java
(var age) -> x > 100;
```

のような書き方ができるとういうことです。
ちなみにvarを使った場合

```java
var age -> x > 100;
```

のように `()` を省略することはできません。
先ほどの例ではvarを使うことのメリットはありませんが、varを使えることで *型宣言をせずに* アノテーションを付与することができるようになります。
つまり

```java
@Nullable var name -> name.length() > 32;
```

のような記述ができるということです。varが使えない場合、具体的な型宣言をせずにアノテーションを使うことはできませんでした。
本ではこのような話について詳しく説明されています。

###Epsilon GC ― ガベージコレクタの改良
Epsilon GCとは「ガベージコレクトしない GC」です。
なんか矛盾したものに感じますが、Epsilon GCはメモリを開放しいので、アプリケーションがヒープメモリを使いつくすとJVMは皆さんご存じの `OutOfMemoryError` で終了します。
こんなEpsilon GCですが有用ないくつかの場面があります。

###HTTP クライアント API
Java 9で非標準のライブラリとして登場し、Java 10で修正が行われさらにJava 11で標準化されたHTTP クライアント APIについて詳しく説明されています。
Javaには1.1の時代からHttpURLConnectionクラスというのがありましたが、なぜ新たなHTTPライブラリの開発に至ったのかという解説から各クラスのメソッド一覧、具体的なコード例のサンプルまで初歩的な内容から具体的にかなり詳しく解説されています。
普段HTTP クライアントを使った開発を行っていない開発者にもわかりやすい内容となっていると思います。

###ZGC － 低遅延化とスケーラビリティの改善
Java 11ぽの実験的なGCとしてリリースされたZGC（Z ガベージコレクタ）についての説明です。
アプリケーションの遅延が10ミリを超えないことを約束したZGCの特徴やその仕組み、実際にZGCを使用するにあたってのコマンド例、オプションについて解説されています。

###フライトレコーダとミッションコントロール
高性能で低オーバーヘッドなプロファイラでJVMに組み込まれているJFR（Java フライトレコーダ）と、JFFが記録したデータの解析のためのツールであるJMC（Java ミッションコントロール）について、チュートリアル的に実際に使用する例を使って解説されています。
アプリケーションがクラッシュしたり予想外の動作をしている時に、原因調査のためにこれら知識が役立つでしょう。

###JDK 11 のその他の改良点
その他の改良点については以下の項目について説明されています。

* ネストに基づくアクセス制御
* 動的クラスファイル定数
* AArch64 イントリンシックの改善
* Java EE と CORBA モジュールの削除
* Curve25519 と Curve448 での鍵合意（Key agreement）
* Unicode 10
* ChaCha20 と Poly1305 の暗号アルゴリズム
* 単一ファイルソースコードのプログラム起動
* TLS 1.3
* Nashorn JavaScriptエンジンの廃止
* pack200 ツールと APIの廃止

どれも簡単に解説されているだけですが、単一ファイルソースコードのプログラム起動など（IDEを使わない場合に特に）便利な機能については知っておいたほうと思います。

以上、新世代Javaプログラミングガイドの紹介（Java 11編）でした。
javascriptで数値をカンマ区切りにする



# 数値をカンマ区切りにする 
もうあれこれ悩まない！数値にカンマをつけるたった一つの方法

```javascript
<%= new Intl.NumberFormat('ja-JP', {maximumSignificantDigits: 3}).format(item.price) %>円

```


オプションもたくさんありますのでcurrency対応がとても楽になりますね。
ほとんどのサイトではIntlのためにbabelを使う必要はありません。
（＊対応したいブラウザが古い場合は必要になります）

## 参考
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat
3/29 備忘録 (deep-learning with python)

個人的にデータサイエンスの訓練に取り組んでいく中で、新しく触れた技術の復習、備忘録、アウトプットとして本記事を書いていく。
なるべく自分の言葉で表現できるように心がけていきたい。
誰かに向けた記事ではないのでご勘弁を。

## pandasのapply関数。

```python:qiita.py

df[column]apply(lambda x: x + 'sample')
```
データフレームの対象とする列の要素に対して、引数の中身の関数を適用させた、新たなデータフレームを作成する。
また、関数の中のxは、もとのデータフレームの中にある要素が入れられる。
今回は、列を指定することで、seriesオブジェクトに対して適応する形となった。


## pandasデータフレームの、任意の範囲の列を取り出す方法。
結論、python配列のスライスの要領で取り出すことができる。
これは、pandas データフレームオブジェクトの、loc,iloc属性を使う。
行、列の名前で引っ張ってくるときはloc属性、番号で引っ張ってくる時はiloc属性を使用する。

```python:qiita.py

df.loc[:, :column2]
>>dfの、全ての行、最初からcolumn2列までを含めた列の要素を取得している。
```
なお、pandasのスライスは、端っこの要素を含むようである。

## pandasのデータフレームを、numpy配列に変換する。
には、.valuesを最後に着けてやると良い。

```python:qiita.py

df.values
```
これで、numpy配列に変換してくれる。kerasのモデルに放り込むときは、こういった処理が必要である。

##データフレームの列を使って、for文でループさせることができる

```python:qiita.py

for item in df[column_1]:
    .....
```
しかし、できるにはできるが、あまり良い方法では無いのかもしれない。普通にpandasの備え付け関数を使ったほうが良さそうである。


## re.split関数

文字列を分割することができるre.split()関数。第一引数に分割する区切り文字を、リストの中に入れ、クォーテーションで囲む。第二引数は分割する対象の文字列。

```python:qiita.py

bunsyo = '吾輩.は猫_であ/る。'
re.split('[/._]', bunsyo)
```
Splunkで相関係数を計算する

# はじめに
Splunkを使ってデータ分析する時のメリットの一つに、様々な種類のデータから相関分析できるというのがあります。

たとえば、WebサーバのアクセスログとロードバランサのアクセスログをSplunkに取り込むことで、どちらにボトルネックが発生しているのか分析することができます。
※実際のボトルネック特定には他に原因となる要素がたくさん考えられますが、ここではあくまで例としてお考えください。

ところで、異なる2種類のデータがどの程度相関しているのか？ということを統計学的に表す指標として相関係数というのがあります。
この相関係数は以下の数式で計算することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170600/666202c0-e981-e233-3963-3d970e3ba307.png)
[参考サイト:相関係数の意味と求め方 - 公式と計算例](https://sci-pursuit.com/math/statistics/correlation-coefficient.html)

この相関係数に関してSplunkでは専用のコマンド[correlate](https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Correlate)
があるようですが、今回、数式に従って計算してみました。
※今回はサーチ文だけで実現してみます。

# Splunkを使った相関係数のサーチ例

以下のサーチ文は、mainインデックスに入っているデータのamountフィールドの月ごとの合計と件数の相関係数を計算する例になります。

``` ruby:相関係数を計算するサーチ文の例
index="main" amount="*" 
| eval i=Case(
    date_month="january","01",
    date_month="february","02",
    date_month="march","03",
    date_month="april","04",
    date_month="may","05",
    date_month="june","06",
    date_month="july","07",
    date_month="august","08",
    date_month="september","09",
    date_month="october","10",
    date_month="november","11",
    date_month="december","12"
    ) ```月を数値に変換する``` 
| stats count(amount) as x, sum(amount) as y by i ```月ごとの合計を計算する``` 
| eventstats 
    avg(x) as avg_x,varp(x) as varp_x,stdevp(x) as stdev_x,
    avg(y) as avg_y,varp(y) as varp_y,stdevp(y) as stdev_y
    ```xとyのそれぞれの平均,母分散,母標準偏差を計算する。avg:平均、varp:母分散、stdevp:⺟標準偏差``` 
| eval 
    avg_x=round(avg_x,2),varp_x=round(varp_x,2),stdev_x=round(stdev_x,2),
    avg_y=round(avg_y,2),varp_y=round(varp_y,2),stdev_y=round(stdev_y,2) ```四捨五入する``` 
| eval dev_x=x-avg_x,dev_y=y-avg_y ```dev:xとyのそれぞれの偏差を計算する```,
    cov_tmp=round(dev_x*dev_y,2) 
| eventstats avg(cov_tmp) as cov ```cov:xとyの共分散を計算する``` 
| eval cov=round(cov,2) ```四捨五入する```,
    cor_r=round(cov/(stdev_x * stdev_y),2) ```cor_r:xとyの相関係数を計算する```
```

## ※補足(マクロについて)
※上記サーチ文に書かれているマクロはSplunk8.1.0以上のバージョンでのみ使用できます。

# 結果の見方
算出された相関係数に応じて、2種類のデータがどの程度相関しているか判断することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170600/382009a2-4913-ff44-0931-d4c2ae054072.png)

# 他の実現方法について
今回はSplunkの標準機能のみで相関計算の公式に従った形でサーチ文を作ってみました。
numpyなどのライブラリを用いたカスタムコマンドを作ったり、別途外部Add-Onを入れることで計算する方法もあると思います。※
もっと上手い計算方法があればぜひご意見お願いします！

※特にデータ量が多い時eventstatsコマンドの処理に時間がかかりそう。

# 参考サイト
[相関係数の意味と求め方 - 公式と計算例](https://sci-pursuit.com/math/statistics/correlation-coefficient.html)