OmniAICreator/Qiita-1.07M huggingface dataset:
githubのリポジトリ完全攻略

#githubのリポジトリとは何?

リポジトリは、プロジェクトのフォルダーのようなものです。 プロジェクトのリポジトリにはプロジェクトのすべてのファイルが含まれ、各ファイルのリビジョン履歴が保存されます。 プロジェクトの作業をリポジトリ内で議論し、管理することもできます。

参考↓
https://help.github.com/ja/github/creating-cloning-and-archiving-repositories/about-repositories

#どういうタイトルをつければいいのか?
基本的に英語でタイトルをつけます。　
自分で見返した際に何を作ったか分かるようなものが良いです。

例) git-practice, python-first-game等


#descriptionとは?
タイトルの説明です。
オプションですので必須ではないですが、後に見返した時のために書いておいた方が良いでしょう。
こちらは英語,日本語どちらでも大丈夫です。
ちなみに私は日本語で書いてます。

例) 〇〇会社のlp模写, Javascriptで〇〇作ってみた

リポジトリは、作っている作品ごとに新しくリポジトリを作成していくものです。

#どのタイミングでリポジトリを変更すれば良いのか?
リポジトリは作っているものや学習している内容が変わったら変更します。
かなり変更するので、多くなっていくものです。

#PublicとPrivate
公開するか非公開にするかの選択ですね。
書いている内容が余程重要なものではない限り、基本的に公開して問題ないです。

#プッシュしていくと
プッシュしていくと、中のファイルが更新されていきます。
追加される訳ではないのでご注意下さい。

#終わりに
githubはgitの知識も必要になってくるので初心者の方にはかなり難易度の高いものだと思います。
私自身も手間取りましたね。
gitについて初心者におすすめの書籍があるので良かったら参考にしてみて下さい↓
https://www.amazon.co.jp/%E3%82%8F%E3%81%8B%E3%81%B0%E3%81%A1%E3%82%83%E3%82%93%E3%81%A8%E5%AD%A6%E3%81%B6-Git%E4%BD%BF%E3%81%84%E6%96%B9%E5%85%A5%E9%96%80%E3%80%88GitHub%E3%80%81Bitbucket%E3%80%81SourceTree%E3%80%89-%E6%B9%8A%E5%B7%9D-%E3%81%82%E3%81%84/dp/4863542178/ref=asc_df_4863542178/?tag=jpgo-22&linkCode=df0&hvadid=295686767484&hvpos=&hvnetw=g&hvrand=16461701231400126736&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009243&hvtargid=pla-526224398321&psc=1&th=1&psc=1
Sparse Tableを知っていますか？僕は知っています。

Sparse Tableを今更学んだので、メモを兼ねて書きます。

# Sparse Tableとは
不変な数列の任意の区間に対する最小値/最大値を、前処理 $O(N\log N)$, クエリごと $O(1)$ で求めるデータ構造です。
数列の値が変わる可能性がある場合はSegmentTreeを使いましょう。SegmentTreeの記事は[こちら](https://qiita.com/ageprocpp/items/f22040a57ad25d04d199)です。

# 仕組み
すべての点を始点として、長さが2べきの区間の最小値/最大値を先に求めておきます。これが $O(N\log N)$ の前計算です。
クエリに答えるときは、区間の長さ以下で最大の2べきの値をとり、区間の前側と後ろ側にはめてそれぞれの最小値を求めます。
これで区間全体を覆うことができ、最小値が求まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550283/eb504a59-3224-0ade-f208-2ff7bde5b7c6.png)
テーブルを構築すると、こんな感じになります。
区間の長さから、それ以下の2べきを求めるのも前計算に含めておくと、クエリごとに $O(1)$ になります。

# 実装
```cpp
template<typename T>
class SparseTable {
	T** table;
	int* logtable;
public:
	SparseTable(vector<T> vec) {
		int maxlength = 0;
		while ((1 << (maxlength + 1)) <= vec.size())maxlength++;
		table = new T * [maxlength + 1];
		logtable = new int[vec.size() + 1];
		rep(i, maxlength + 1) {
			table[i] = new T[vec.size()];
			rep(j, vec.size() - (1 << i) + 1) {
				if (i)table[i][j] = min(table[i - 1][j], table[i - 1][j + (1 << (i - 1))]);
				else table[i][j] = vec[j];
			}
		}
		for (int i = 2; i <= vec.size(); i++) {
			logtable[i] = logtable[i >> 1] + 1;
		}
	}
	~SparseTable() {
		rep(i, maxlength) delete[] table[i];
		delete[] table;
		delete[] logtable;
	}
	T query(int l, int r) {
		assert(l < r);
		int length = r - l;
		return min(table[logtable[length]][l], table[logtable[length]][r - (1 << logtable[length])]);
	}
};
```
かなり雑で可読性が低いです。ごめんなさい。

# おわりに
Segment Treeのほうが自分としては書くのが楽ですが、Sparse Tableは定数倍がかなり軽いです。
Sparse Tableもぱっと書けるようにしておくといいかもしれません。（使ったことは、ありません）
コンピュータが小数点計算を間違える理由

コンピュータは2進数で理解する。
このとき1/2、1/4、1/8が各位の10進数での数値となるがこのくみあわせでは表すことができない少数がある（0.1など）

そのためコンピュータは近似値を利用し、誤差が生まれてしまう

##解決方法
###無視する
誤差が気にならないのであれば無視する
###N倍して整数にしてから計算する
ex)0.1+0.1
0.1→（１０倍）→1
1+1=2
2→（1/10倍）→0.2

（二進数では2**n倍）
(小ネタ)WSL1.0＋Ansibleのセットアップメモ

# 概要
今更ですが、WSL1.0でAnsibleを利用するときの話です。
WSLで使用するLinuxを、Windows Storeから入手できない場合の方法も含めて。
Ansibleのインストール手順は、WSL以外でも利用できる(はず)

## 環境
- Windows10(1809) ＋ WSL1.0
- ubuntu18.04
- ansible2.9.4

## WSLとは？
Windows Subsystem for Linux
ざっくりいうと、仮想マシンが無くても、Windows上でLinux環境を利用できます。
`1.0`や`2.0`で仕組みが異なったりしますが、詳細は割愛します。
ここでは`1.0`を使用します。

## WSL機能のインストール
`Windowsの機能の有効化または無効化`またはPowerShellから実施します。
詳細は、こちら[^1]を参照ください。
[^1]: [Windows 10でLinuxプログラムを利用可能にするWSLをインストールする（バージョン1803以降対応版）](https://www.atmarkit.co.jp/ait/articles/1608/08/news039.html)

## WSLで使用するLinux(ubuntu)のインストール
ここでは、サイドローディング[^2]によるインストールを行います。
[^2]: [Windowsストアを経由しないアプリの導入方法](https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-8.1-and-8/hh832040(v=ws.11)?redirectedfrom=MSDN#what-is-sideloading-does-the-windows-store-allow-it)
　
1.インストール用イメージ(ubuntu)のダウンロード
2.PowerShellを起動し、下記コマンドを実行

```PowerShell:PowerShell
Add-AppxPackage <1.でダウンロードしたファイル>
```
3.Windowsのスタートメニューから、「ubuntu」を起動
4.ウィザードに従い、ユーザとパスワードを入力
　ユーザとパスワードは、任意(例えばhogeとか)でOKです。
　※ユーザ名:「admin」はNGでした。

## WSLの初期設定
この記事[^3]を参考に設定
[^3]: [WSL(ubuntu18.04)の初期設定](https://qiita.com/misosiru6655/items/218246c17d95fd12f5fb)

1. まずはOS更新
※社内Proxy経由では、`/etc/profile`の最後尾あたりにプロキシ情報を書き込み、`source /etc/profile`を実行しておけば大丈夫。`sudo`で外部に通信するときは、`-E`をお忘れなく。

```bash:/etc/profile
$ sudo vi /etc/profile

～/etc/profileの最後尾に以下を追記～
export http_proxy=http://<IPアドレス>:<ポート>
export https_proxy=http://<IPアドレス>:<ポート>
export HTTP_PROXY=http://<IPアドレス>:<ポート>
export HTTPS_PROXY=http://<IPアドレス>:<ポート>
export no_proxy=<自身のIPアドレス>

～vi 終了後、設定を反映～
$source /etc/profile
```

2. アップデートは以下の感じ。

```bash:bash
$ cd /etc/apt
$ sudo sed -i.bak -e "s/http:\/\/archive\.ubuntu\.com/http:\/\/jp\.archive\.ubuntu\.com/g"  sources.list
$ sudo apt upgrade -y && sudo apt dist-upgrade -y && sudo apt autoremove -y
```
## Ansibleのインストール

1. curlでpipインストール

```bash:bash
$ cd ~
$ sudo apt install python3-distutils -y
$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ sudo -EH python3 get-pip.py
```

2. pipでAnsibleをインストール

```bash:bash
$ sudo -EH pip install --upgrade pip
$ sudo -EH pip install ansible
$ sudo -EH pip install pywinrm ※AnsibleでWindowsを操作する場合に必要なモジュール
```

3. インストール結果を確認

```bash
$ ansible --version
  config file = None
  configured module search path = ['/home/hoge/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.6/dist-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.6.9 (default, Nov  7 2019, 10:44:02) [GCC 8.3.0]

```

Configファイルがないので、必要に応じて、適当に作成、またはどこかから持ってくる。
(無くても動作するので、時間のある時に調査予定です。)

これで、Ansible+Windowsの環境構築自動化に向けた第一歩が踏み出せるかも？
SSL化したらサブドメインにアクセスできない時の対策

ドメインで証明書を作りSSL対応したときに、サブドメインがSSL証明書作っていないためにエラーとなり、アクセスできなくなった時の対応です。

.htaccessファイルを、次のように書くと良いです。

```
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^◯◯SUB◯◯\.ドメイン\.com$
RewriteRule (.*) https://www.ドメイン/サブドメインのディレクトリ/$1 [R=301,L]
</IfModule>
```

```
RewriteCond %{HTTP_HOST} ^◯◯SUB◯◯\.ドメイン\.com$
```
◯◯SUB◯◯の部分に、サブドメインを記載します。
ドメインは、ルートのドメインです。
.com＄は、ドメインが.comなので指定しました。
実際のドメインに合わせて、書き換えてください。

```
RewriteRule (.*) https://www.ドメイン/サブドメインのディレクトリ/$1 [R=301,L]
```
SSL化している前提なので、https://と書いています。
この続きで、ルートのドメインから、サブドメインのフォルダ名まで書きます。
$1は、そのまま記載してください。

R=３０１,Lは、301リダイレクトするという意味です。

ルートドメイン直下に、サブドメインのフォルダがある場合に、この方法は、有効だと思います。
基本情報技術者　マネジメント系　第1章 プロジェクトマネジメント②



# ②結合、スコープ、タイム


## プロジェクト結合マネジメント

ステークホルダの要求などからプロジェクト全体を最適化することです。
関わるプロセスは基礎の最後にあった、五つのプロセス全てです。

### SOW (Statement Of Work)
作業範囲記述書

### プロジェクト憲章
プロジェクト存在を正式承認する文書です。


### プロジェクトマネジメント計画書
実施・管理に関する方針、方法をまとめた文書です。

## プロジェクトスコープマネジメント
関わるプロセスは計画プロセスと監視コントロールプロセスです。

作業範囲のことをスコープといいます。


## WBS(Work Breakdown Structure)
作業をトップダウンで抽出し、階層構造で表した物

## プロジェクトタイムマネジメント
関わるプロセスは計画プロセスと監視コントロールプロセスです。

要はスケジュール管理です。

アクティビティという手順を詳細化した物を定義化します。


## ガントチャート、マイルストーンチャート
月単位でのスケジュール管理に用いる図です。

### ガントチャート
作業ごとに、開始時期と終了時期を棒グラフ状に記述する図です。

### マイルストーンチャート
ガントチャートにマイルストーン(作業の区切り)を記述した図です。

## アローダイアグラム
日単位のスケジュール計画に用います。

PERTを用いて作業日数を確認します。

クリティカルパス(余裕日程のない作業順序)など確認します。
二進数での剰余計算

メモリーやディスクには1Bit単位では記録できない1Byte（8Bit）が必要

# シフト演算
コンピュータは剰余計算を行うためにシフト演算というものを行なっている。
シフト演算には左シフト（掛け算）と右シフト（割り算）がある

##左シフト（掛け算）
桁を左に移動する（下の例では2桁）
桁から溢れた分はなくなり、新しくできた部分に部分に0を入れる

|0|0|1|0|1|0|1|1|||
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|↑LOST|↑LOST|↓|↓|↓|↓|↓|↓|↓NEW|↓NEW|
|||1|0|1|0|1|1|0|0|

左シフト２だった場合は4倍になる（47→188になっているのがわかる）  
例えば5倍にしたいなら[元の数値の左シフト2（4倍）]と[元の数値（1倍）]をたす

##右シフト（割り算）
論理右シフトと算術右シフトで対応が異なる

###論理シフト
シフト対象が正の数である場合行う  

桁を右に移動する（下の例では2桁）
桁から溢れた分はなくなり、新しくできた部分に部分に0を入れる

|||0|0|1|0|1|0|0|0|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|↓NEW|↓NEW|↓|↓|↓|↓|↓|↓|↑LOST|↑LOST|
|0|0|0|0|1|0|1|0|||

（72→18）

###算術シフト
シフト対象が負の数である場合行う  
桁を右に移動する（下の例では2桁）
桁から溢れた分はなくなり、新しくできた部分に部分に1を入れる

|||1|1|1|1|0|1|0|0|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|↓NEW|↓NEW|↓|↓|↓|↓|↓|↓|↑LOST|↑LOST|
|1|1|1|1|1|1|0|1|||

（-12→-3）

マイナスの値の表現については補数で検索

##参考
プログラムはなぜ動くのか（矢沢久雄）日経BP社
Vue.js + Docker Compose で ホットリロードしながら開発する環境をつくる

# はじめに

個人の開発用に Vue.js の動作環境を Docker に移行してみたら、とても捗ったのでメモがてら投稿します。

# 手順

**前提**

- Vue.js のプロジェクトはできている
- `npm run serve` で、 Vue.js が立ち上がるように設定されている

## 1. Dockerfile を作成

プロジェクトの直下に作成します。

``` Dockerfile
FROM node:lts-alpine

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 8080

CMD ["npm", "run", "serve"]
```

これで、 Vue.js を動作させる Docker Image を作成することができます。

## 2. docker-compose.yml を作成

こちらもプロジェクト直下に作成します。

``` docker-compose.yml
version: "3"
services:
  app:
    container_name: web
    build: 
      context: .
      dockerfile: Dockerfile
    ports:
        - 8080:8080
    volumes: 
        - .:/app
```

`volues` でプロジェクトを Docker コンテナにマウントさせることで、 `npm run serve` の Hot Road が利くようになります。 

## 起動する

プロジェクト直下で下記コマンドを実行します。

``` bash
docker-compose up
```

`localhost:8080` へアクセスすると、 Vue.js が起動しているのが確認できると思います。


# 終わりに

Dockerはありがたいですね。
少しでもあなたの為になれば幸いです。
【UiPath】手動でロボットを「停止」してもFinallyは実行されるというお話

## 概要
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/91f4948e-c4c1-2bad-a7a8-da8449b1dd67.jpeg)
UiPathでロボット実行中に「停止」を押したときの動きのお話です。
TryCatchブロック内で「停止」した場合、Finallyブロック内のアクティビティが実行された後に止まるようです。
停止を押したのに止まらない！と焦らないよう気を付けましょう。

## 検証
検証してみます。
以下のワークフローで、待機（Delay）のところで停止させると…。
![シーケンス.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/b8b9e8b0-8017-d5c5-f831-5fb203373ba9.jpeg)

こうなります。
![ログ1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/ea8e6f9f-3fed-cb64-1dcf-9ecb29e12330.jpeg)

停止する前のところに加えて、Finally内も実行されていますね。
TerminateWorkflowのようにその場で止まるわけではないということになります。

### 補足：TerminateWorkflowの場合
待機のところを<b>ワークフローを終了（TerminateWorkflow）</b>に変えて実行してみます。
![ログ2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/66cba958-09b4-972a-1be5-43c5b0d82fe6.jpeg)

Catch内もFinally内も実行されていません。
こちらは正にその場で止まるという動き。

### 補足２：Throwの場合
同じく待機のところを<b>スロー（Throw）</b>に変えて実行してみます。
![ログ3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/4c639c44-3a5d-19d6-db2a-aedabccebb7f.jpeg)

Catch内⇒Finally内⇒TryCatchブロック外と実行されています。
こちらはお馴染みの動きですね。

## 動作環境
UiPath 2019.9.2 Community Edition
AESで暗号化されたWindows ChromeのCookieを復号する【python】

## 概要
WindowsのChromeは v80以降、ブラウザcookieの暗号化にAESを使用するようになった。

（Linux、 macOSのChromeブラウザのcookieについてはここでは触れない。以下「cookie」は、Windows用 Chromeブラウザのcookieを指すものとする）

以前は、DPAPI Windows API（crypt32.dllのCryptUnprotectData）を使用して暗号化されていたが、新方式で暗号化されたcookieは旧方式では復号できない。

Windows Chromeのcookieファイルの中身を直接読み取ってWebサービスにログインするようなアプリは、今回の変更の影響を受けている。（例：ニコ生コメントビューア）

AESで暗号化されているcookieの復号手順の概要を下記に示す。

## Windows ChromeのCookiesファイルの場所
デフォルトでは下記（以前と変わらない）
```%userprofile%\AppData\Local\Google\Chrome\User Data\default\Cookies```
（プロファイルの移動をしたり、Windowsの再インストールやgoogleアカウントの変更等をした場合は変わる）


## AESで暗号化されているcookieの識別

暗号化cookieデータの先頭が「0x01 00 00 00」→ DPAPIで暗号化されたcookie

暗号化cookieデータの先頭が「v10」 → AESで暗号化されたcookie

## 復号に必要なもの
復号には鍵（key）だけでなく、nonceと呼ばれる値が必要になる。

## nonceの位置・長さ
nonceは、各暗号化cookieデータの先頭からプレフィクス3バイト（'v10'）を除いた4バイト目以降12バイトをそのまま用いる。

## encrypted_key(暗号化された鍵)の格納場所
デフォルトでは、keyはエンコード・暗号化されて下記の`Local State`ファイル内に格納されている。
```%userprofile%\AppData\Local\Google\Chrome\User Data\Local State```

Local Stateの中身はJSONフォーマットになっている。
この中の["os_crypt"]->["encrypted_key"]　に暗号化された鍵データが格納されている。

![aes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334771/08836cce-45b6-9f5d-88f3-1c2f07ff418a.png)


##  keyの復号

1. JSON（Local Stateファイル）から取り出したencrypted_keyの値をBASE64でデコードする。
2. デコードしたデータの先頭5バイト（プレフィクス`'DPAPI'`）を除去する。
3. 2のデータをさらにDPAPIで復号する。
DPAPIによる復号は旧方式と同じcrypt32.dllのCryptUnprotectDataを用いればよい。

得られたkeyの長さは256bit（32バイト）のはずである。

これで、cookieの復号に必要となるkeyが復号できた。


## cookieデータの復号
暗号化されたcookieデータの最初の15バイト（'v10'+nonce 12bytes）を除いた部分を、上記で得られたnonceとkeyを用いて256bit AES-GCM で復号する。

さらに、復号されたデータの末尾16バイトを取り除く。

## pythonによる実装

https://github.com/taizan-hokuto/chrome_cookie
AES-GCMのためにcryptographyライブラリを使用しています。
cryptographyが入っていない場合は、`pip install cryptography` を行ってください。
python 3.7.4
Chrome バージョン: 80.0.3987.87（Official Build） （64 ビット）で動作確認。

#### 参考にしたもの
browsercookiejar (regen100)
https://github.com/regen100/browsercookiejar

AES GCM example in python and go (sumanmukherjee03)
https://gist.github.com/sumanmukherjee03/dd16d6c732a1055b6af97daba484809d

A little tool to play with Windows security (gentilkiwi)
https://github.com/gentilkiwi/mimikatz
Office365 MFAの選択肢（モバイル アプリによる通知）

# Office365 MFAの選択肢（モバイル アプリによる通知）
Azure Active Directory Premium P1/P2が不要
Microsoft Authenticatorをスマホに入れておく必要がある
Azure Active Directory 管理センター側でMFAを有効にしときましょう

## 設定時の画面
1. Office365にログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/b0f53364-7cee-713b-3f79-0ef6e2be7ade.png)


2. パスワード入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/076be36d-8d13-95cb-206b-553d2aa13404.png)

3. 次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/04d1c33a-3bcf-6890-639a-70a10c65c076.png)

4. 追加セキュリティの確認
今回は「確認のための通知を受け取る」を選択して進める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/9f520b84-c19d-1f95-4e75-c4e7d3010fae.png)

5. 画面の指示に従って、スマホ画面を操作（QRコードを読み取るのが楽かも）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/19cef344-52f4-c898-45e8-80463983e58e.png)

6. スマホ画面にアカウントが追加されたら次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/085f9212-7d56-c0d7-c76c-6c3d50fd2b0d.png)

7. 「通知と確認コード用にモバイルアプリが構成されました。」となれば次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/74d080bf-c778-5fb8-4da2-1810e4d519db.png)

8. スマホ画面に通知が出ているので承認
 - PC画面側
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/be4ab42a-c1fe-9f47-ac76-cd3bb5c06ae0.png)
 - スマホ画面側<br>
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/73004eb4-51e7-0d15-9197-b00808e66c4a.png)
 - 操作遅いと再試行しろとメッセージが…
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/f27a9934-1c85-4f1f-939b-a49cf37c3ace.png)

9. 完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/67f1a25c-6381-70a7-36d1-8922909df935.png)
星5段階評価プルダウンメニューの作成手順

星5段階評価プルダウンメニューを導入したのでその手順をメモします

# configディレクトリ下にデータをつくる

```php:score.php
<?php
  return array(
    '1' => '⭐️',
    '2' => '⭐️⭐️',
    '3' => '⭐️⭐️⭐️',
    '4' => '⭐️⭐️⭐️⭐️',
    '5' => '⭐️⭐️⭐️⭐️⭐️',
  );
?>
```

# ビューでプルダウンを表示する

```php:create.blade.php
<select type="text" name="review">
    @foreach(config('score') as $key => $score)
        <option value="{{ $key }}">{{ $score }}</option>
    @endforeach
</select>
```

# プルダウンで選択して送信したデータを取得する

## viewの記述(if文を使用する場合)
```php:detail.blade.php
    @if (取得したいデータ == 1)
        <p>{{ '⭐️' }}</p>
    @elseif (取得したいデータ == 2)
        <p>{{ '⭐️⭐️' }}</p>
    @elseif (取得したいデータ == 3)
        <p>{{ '⭐️⭐️⭐️' }}</p>
    @elseif (取得したいデータ == 4)
        <p>{{ '⭐️⭐️⭐️⭐️' }}</p>
    @elseif (取得したいデータ == 5)
        <p>{{ '⭐️⭐️⭐️⭐️⭐️' }}</p>
    @endif
```

## viewの記述(switch文を使用する場合)

```php:detail.blade.php
@switch (取得したいデータ)
    @case (1)
        <p>{{ '⭐️' }}</p>
        @break
    @case (2)
        <p>{{ '⭐️⭐️' }}</p>
        @break
    @case (3)
        <p>{{ '⭐️⭐️⭐️' }}</p>
        @break
    @case (4)
       <p>{{ '⭐️⭐️⭐️⭐️' }}</p>
        @break
    @case (5)
        <p>{{ '⭐️⭐️⭐️⭐️⭐️' }}</p>
        @break
@endswitch
```

## viewの記述(1行で済ませたい場合)

```php:detail.blade.php
{{ config('score')[取得したいデータ] }}
```


# 参考
- [Laravelでプルダウンメニューを作ってみた。(忘備録）](https://qiita.com/takumines/items/1346b251062ad638612b)
Visual Studio CordにおけるGitのスタッシュ設定について

Visual Studio Cord(以下VSC)におけるGitのスタッシュ設定手順についてメモします。

まず、スタッシュ（一時退避）とはプルしたい、ブランチを切り替えたい場合に、データをコミットするまでもない修正途中のソースなどを一時的に退避したい場合に使う機能です。

手順はGitタブを開いてソース管理右上野３点リーダーをクリックし、一時退避を選択します。
<img width="1222" alt="スクリーンショット 2020-02-11 20.46.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578250/543bdf39-b5b6-fe48-b8f9-955ad71ed8de.png">

その後、一時退避メッセージを入力。
<img width="1222" alt="スクリーンショット 2020-02-11 20.46.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578250/9b7c8c94-fb99-4728-44b8-7b6c4ea73a1a.png">

修正中の内容が回避されます。
<img width="1222" alt="スクリーンショット 2020-02-11 20.47.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578250/aa28d0ac-2271-4ddc-cf27-c930f0b9dbd3.png">

このタイミングでプルやブランチ切り替えしたいは実施します。
これらが終わったら、スタッシュを戻します。

スタッシュを戻す場合は「最新の一時退避内容を適用して削除」を選択します。
<img width="1222" alt="回避適用して削除.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578250/93cf4421-931e-dc1f-2cd1-8a1c0d37bd2b.png">

元に戻りました。ここから修正を完了させてプルリクエスト、プッシュまで進めれば完了です。
<img width="1222" alt="最後.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578250/bfb2b804-d45a-2475-5f87-54ee8878080a.png">

ちなみにこのように記事作成してアウトプットすることで、段違いで記憶の定着が図れます。
皆様も是非アウトプットしていきましょう。

この記事が参考になれば幸甚です。
rust-analyzer on Visual Studio Marketplace

## 導入
![alt](https://user-images.githubusercontent.com/1711539/72443316-5a79f280-37ae-11ea-858f-035209ece2dd.png)
Rust のより良い IDE サポートを目指して開発が進められていた [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=matklad.rust-analyzer) が、Visual Studio Marketplace で公開されました 🎉
rust-analyzer は [Rust (rls)](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust) よりも強力にコード補完してくれるので、Rust コーディングがかなり捗ります。

Windows 10, Ubuntu on WSL (Remote WSL), Linux Mint の3つの環境上で Visual Studio Code にインストールしてみましたが、自動的に ra_lsp_server をダウンロードしてくれることを確認しました。いままでは自分でビルドする必要がありましたが、かなり導入が簡単になりましたね。

ra_lsp_server がインストールされる場所が変更されたので、旧バーションはアンインストールしてからインストールした方が良いかもしれません。私は旧バージョンの rust-analyzer extension と`~/.cargo/bin/`の中の ra_lsp_server を削除してからインストールし直しました。

## 設定
rust-analyzer の欠点はめっちゃリソース（CPU, メモリ）喰います。私は CPU が ATOM で、メモリ 2GB のポンコツノート PC で rust-analyzer を使用していますが、actix-web、diesel 辺りを使ってプログラム組んでいると rust-analyzer がリソース喰いまくって Default 設定では重すぎてまともに動きません。なので下記の設定で運用しています。非力な PC で使われる方は試してみてはどうでしょうか。

```json:settings.json
"rust-analyzer.lruCapacity": 64,
"rust-analyzer.enableEnhancedTyping": false,
```
Office365 MFAの選択肢（モバイル アプリからの確認コード）

# Office365 MFAの選択肢（モバイル アプリからの確認コード）
Azure Active Directory Premium P1/P2が不要
Microsoft Authenticatorをスマホに入れておく必要がある
Azure Active Directory 管理センター側でMFAを有効にしときましょう

## 設定時の画面
1. Office365にログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/b0f53364-7cee-713b-3f79-0ef6e2be7ade.png)


2. パスワード入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/076be36d-8d13-95cb-206b-553d2aa13404.png)

3. 次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/04d1c33a-3bcf-6890-639a-70a10c65c076.png)

4. 追加セキュリティの確認
今回は「確認コードを使用する」を選択して進める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/9f520b84-c19d-1f95-4e75-c4e7d3010fae.png)

5. 画面の指示に従って、スマホ画面を操作（QRコードを読み取るのが楽かも）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/19cef344-52f4-c898-45e8-80463983e58e.png)

6. スマホ画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/2f87b341-3613-3464-d710-7b6be9ddc0e8.png)



7. 「通知と確認コード用にモバイルアプリが構成されました。」となれば次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/74d080bf-c778-5fb8-4da2-1810e4d519db.png)

8. スマホ画面に出ている確認コードを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/bf955e15-d518-f024-fab7-52b4cab92d52.png)

9. 完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/f20433f0-7d60-75f5-b013-236a766eb456.png)
CSSぴえんチャレンジ

#CSSぴえんチャレンジって何？
正確には「HTMLとCSSでぴえんの絵文字を再現できるか」というチャレンジを勝手に作って勝手にやりました。

ぴえんの絵文字がわからない？チャレンジ結果をご覧ください。

#チャレンジ結果

<p class="codepen" data-height="412" data-theme-id="default" data-default-tab="css,result" data-user="rorome15nikomu" data-slug-hash="wvaaXax" 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="pien">
  <span>See the Pen <a href="https://codepen.io/rorome15nikomu/pen/wvaaXax">
  pien</a> by niko (<a href="https://codepen.io/rorome15nikomu">@rorome15nikomu</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>



＿人人人人人人人人人人＿
＞　これがぴえんだ！　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y￣


※こちらはオリジナルのぴえん絵文字です。

#おわりに
皆さまも息抜きや力試しに#CSSぴえんチャレンジやってみてはいかがでしょうか?

もっとクオリティの高いぴえんができたら#CSSぴえんチャレンジでツイートしてください！
全力でリツイート＆いいねします。

私のTwitterは[こちら](https://twitter.com/Rorome15Nikomu)。

お付き合いいただきありがとうございました！
[MySQL]インデックスと本の索引の違いについて

#この投稿の経緯
インデックスはDBの初学者に、本の「索引」という２文字で説明されることが多い。
私も、その説明で何となく理解したつもりになっていたが、よくよく考えてみると「索引」ではインデックスを正確に理解することはできない気がしてきた（無知の知）。
「索引」と「インデックス」の2つを比較しながら頭の整理をしたメモ書き的な内容です。
認識が違っていましたら、コメントお待ちしております。
ここでは本の索引は「索引」、DBのインデックスは「インデックス」と呼びます。

#索引
###索引とは
引用元
https://www.weblio.jp/content/%E3%81%95%E3%81%8F%E3%81%84%E3%82%93
>ある書物に載っている項目・人名・用語などを書き出して五十音順などに並べ、その所在ページなどを示した表。インデックス。

- 本でいうページにあたるものが主キー
- 索引の項目は1項目単位で表現

「大陸の生態系」みたいな本の索引のイメージです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553550/db684c61-8846-8163-453f-f4cca258a376.png)

#インデックス
###インデックスとは

- インデックスの種類
    - インデックスのない状態:　ページの順番がバラバラな本でしょうか？
    - クラスタインデックス:　本自身（「キー：ページ、値：本文」、一意のキーが連番で昇順に並んでいる）です
    - セカンダリインデックス:　索引です ※ALTERで作成するインデックスはこちらのことです
        - 単一列インデックス
            - 本の索引に近い（1項目単位の項目と該当する主キー(ページ)だけを持っている）のはこっち
        - カバリングインデックス　本の索引とは異なる(複数項目を組み合わせた単位の項目と該当する主キー(ページ)及び取得するべき全ての値を持っている)
            - 複合インデックス(予め組み合わせを作っておく)
            - インデックスマージ（複数の単一列インデックスがクエリ実行の際に合体、オーバーヘッドあり）

continentテーブルです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553550/ed862029-ad7b-31c6-f79c-2bf7ee60eac0.png)

カバリングインデックスの定義だとこうなります
```alter table continent add index (name, animal, fruit);
```
#まとめ
索引は項目一つに対して一つまたは、複数のページを参照させるもの。
インデックスは、項目一つまたは、複数の項目の組み合わせに対して一つの主キーを参照させるもの。

インデックスについて調べるとクラスタインデックスとセカンダリインデックスを明示することなく単にインデックスと記載している記事、参考書が多くそこを理解するのに結構苦労しました。
インデックスが効いている言われるときのインデックスはセカンダリインデックスです。
セカンダリの中でもカバリングインデックスは取得項目を全てセカンダリインデックスのリーフブロックに保持しているので、わざわざクラスタインデックスを見に行かなくてよいので検索件数が減り検索が早いです。
索引で例えるなら、索引を見れば本文の内容までわかってしまうといったことでしょうか？
ちなみにフルインデックススキャンとは~~クラスタインデックス~~セカンダリインデックスのリーフブロックを全て見てるので検索が遅いです。

この様に頭をインデックスと索引の違いを整理すると、「索引」という例えは結構無理があるのかなと思いました。
とはいえ、「索引」の例えは良いアプローチだと思いますので、人に説明するときは、誤解の内容に「索引」という例えを使っていこうと思います。
Go mapのkeyにインターフェースを使う場合に気をつけるべきこと

小ネタです。

## GoのMapのkey


goはmapの初期化時以下のように「keyの型」と「valueの型」を両方宣言しますが、

```go
m := make(map[string]string)
```

この「keyの型」には当然interface(空interface含む)を指定することもできる。

```go
m := make(map[io.Reader]string)   // これとか
m := make(map[interface{}]string) // これ
```

このような場合、実際に値を入れるときに型が違えば当然keyも違う。


要するにこういうことです

```go
type dog int
type cat int

m := make(map[interface{}]string)
m[dog(1)] = "dog dayo"
m[cat(1)] = "cat dayo"

fmt.Printf("%v", m) // map[1:dog dayo 1:cat dayo] 
// 拡張int同士、同じ数字だがkeyは違う

```

同じintを拡張したdog,cat型ですが、keyの見た目は数字の1で重複しているのに
型が違うので上書きではなく新規登録になっていますね。

structで全く新しい型を作った場合は「まぁそうだろうな」と直感でわかりますが、
同じintを拡張した型同士でもしっかりと別型として扱われます。

さすがにinterface{}ほどゆるいkeyを使うことってないかもしれないですが、
(というか殆どの場合keyはintやstringといったプリミティブ型だと思いますが)
一応このような仕様になってますよということで。
Win10でlinux操作

WSL(Windows Subsystem for Linux)を使用することで、Win10環境でlinux環境が作成できます。

#Windowsの設定変更
control.exeを起動(コントロールパネルを開いても同じです)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/c298b0b7-74ec-451e-a3a0-f2816006c839.png)

↓
linux用windowsサブシステム　にチェックを入れる
(すでに私の環境では有効化しているので、チェックが入っていますが、デフォルトではチェックが入っていないと思います)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/8de3c40a-d3a3-8884-4976-52ccf43a1e26.png)
OS再起動を促されるので、従う

#linuxのインストール

再起動後、スタートメニューから、MicroSoftStore(ストア)を開き、
検索タブにlinuxを入力し、好きなディストリビューションをインストール
(すでに私の環境にはubuntuがインストールされていますので、インストール済みと表示されています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/5675aac6-1ddf-243a-ae60-6c5cfe1438bf.png)
以降、ubuntuをインストールした時の操作になります。他のディストリビューションの場合、適宜操作の変更があるかもしれません。

#linuxの起動
スタートメニュー -> ubuntuを起動
起動後、Installing, this may take a few minutes...が表示されます
数分待ったあと、ユーザ名とパスワードを入力します
(ユーザ名にadminはダメだったみたいです。。ww)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201580/0b45afbe-df50-b39f-97a1-0840b3789dc4.png)

これで環境作成が完了!!
あとはユーザ作ったり、Webサーバ立てたり色々やってみましょう
コンストラクタやデストラクタ内では決して仮想関数を呼び出さないようにしよう - Effective C++ 第3版 9項-

#　はじめに

Effective C++ 第3版の9項 44ページから勉強していきます。
今回は、「コンストラクタやデストラクタ内では決して仮想関数を呼び出さないようにしよう」についです。

# Effective C++ 第3版 - 9項　コンストラクタやデストラクタ内では決して仮想関数を呼び出さないようにしよう -

## 前置き

今回は、コンストラクタやデストラクタ内で仮想関数を呼び出してはいけない理由について勉強していきます。

## 今回の勉強内容

### デストラクタでの例外

今回は、Baseという基底クラスとBaseを継承したChildというクラスを扱います。
また、Baseは、printLogという仮想関数を保持しています。
以下に、2つのクラスを示します。

### 

```cpp
class Base {
 public:
  Base() { printLog(); };
  ~Base(){};
  virtual void printLog() { std::cout << "Base :  printLog()" << std::endl; };
};

class Child : public Base {
 public:
  Child(){};
  ~Child(){};
  void printLog() { std::cout << "Child :  printLog()" << std::endl; }
};
```

ここで、次のようにChildクラスのオブジェクトの生成したときの処理について見ていきます。

```cpp
Child ch;
```

```:実行結果
Base :  printLog()
```

これによって、Childのコンストラクタが呼ばれます。
しかし、その前に基底クラスであるBaseのコンストラクタが呼び出されます。
派生クラスのオブジェクトを生成するときには、その基底クラスの部分が先に生成されることになっているからです。

今回、作成したBaseのコンストラクタでは、仮想関数の printLog() を呼び出しています。
ここで呼ばれるprintLog()は、実行結果からも分かるように、ChildのprintLog()ではなく、BaseのprintLog()になります。
生成されているオブジェクトは、Childであるにもかかわらず、BaseのprintLog()が呼ばれるようになります。

これは、基底クラスのコンストラクタが呼び出されている間は、仮想関数は決して派生クラスのものにならないからです。
また、その間は、オブジェクトも基底クラスのものとして扱われます。

オブジェクトの破棄についても同様のことが言えます。
「派生クラス」のデストラクタが実行されると、まず、「派生クラス」の部分が破棄され、その次に「基底クラス」のデストラクタが実行され、「基底クラス」の部分が破棄されます。
そのため、基底クラスのデストラクタ内で仮想関数を呼んだ場合、呼ばれるのは、基底クラスの仮想関数が呼ばれます。

このような理由から、コンストラクタやデストラクタ内では、仮想関数を呼び出さないようにする必要があります。

## サンプルコード

以下に、勉強で使用したコードを示します。

```cpp
#include <iostream>

class Base {
 public:
  Base() { printLog(); };
  ~Base(){};
  virtual void printLog() { std::cout << "Base :  printLog()" << std::endl; };
  /*
 private:
  void         init() { printLog(); }*/
};

class Child : public Base {
 public:
  Child(){};
  ~Child(){};
  void printLog() { std::cout << "Child :  printLog()" << std::endl; }
};

int main() {
  std::cout << "" << std::endl;
  Child ch;
  ch.printLog();
}
```

## 実行結果

```:実行結果

Base :  printLog()
Child :  printLog()

```

## まとめ

今回は、コンストラクタやデストラクタ内で仮想関数を呼んではいけない理由について学びました。

### 覚えておくこと

- オブジェクト生成や破棄の間に仮想関数を呼び出してはいけない。
- そのような呼び出しで実行されるのは、オブジェクトの生成や破棄の途中のオブジェクトの型になる。

## メモ

Baseのコンストラクタ内で仮想関数であるprintLog()を呼ばずに、Childのコンストラクタ内で printLog()を呼んだ場合
→　普通にChildのprintLog()が呼ばれた。


## 参考文献

[1] https://www.amazon.co.jp/gp/product/4621066099/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i0
[Kaggle] やってみる - 目次

# tldr

Kaggleをやってみます。

# 目標
2020年にQiitaで50記事 :thumbsup: 

# 目次

## 導入
[ep.0 - セットアップ](https://qiita.com/kentakozuka/items/ef64c93c4fb4a1f70d3b)
[ep.X - コンペの流れ](https://qiita.com/kentakozuka/items/db4fcd47a6967cd7e7bf)
[ep.1 - タイタニックでなんとなく雰囲気を掴む](https://qiita.com/kentakozuka/items/d470431739ada41d0a2e)
[ep.2 - タスク](https://qiita.com/kentakozuka/items/e064edd27ced61f535f3)
[ep.3 - データセット](https://qiita.com/kentakozuka/items/918114401f4d5ea7ef62)
[ep.3 - 評価指標](https://qiita.com/kentakozuka/items/bef0162c50c63a38c6f2)
[ep.X - 欠損値の扱い](https://qiita.com/kentakozuka/items/9e927477b4c2096af2ed)

## モデル
[ep.X - モデル](https://qiita.com/kentakozuka/items/137a5060a90cb386fbe4)
ep.X - GBDT
[ep.X - ニューラルネット](https://qiita.com/kentakozuka/items/da277a25fa3eb24bd996)
[ep.X - 線形モデル](https://qiita.com/kentakozuka/items/873ede15ee142dfca79c)
[ep.X - k近傍法](https://qiita.com/kentakozuka/items/f83a1b43f6243ac8b9c5)
[ep.X - ランダムフォレスト](https://qiita.com/kentakozuka/items/c71e82aee6224025db5d)
[ep.X - Extremely Randomized Tree (ERT)](https://qiita.com/kentakozuka/items/701d16e67279e1436bbd)
[ep.X - Regularized Greedy Forest (RGF)](https://qiita.com/kentakozuka/items/5b39b2f360600d8be180)
[ep.X - Field-aware Factorization Machine (FFM)](https://qiita.com/kentakozuka/items/75e0b26bb7cc4fdf0ce9)

## 評価
[ep.X - バリデーション](https://qiita.com/kentakozuka/items/72563b2c329ba06bd389)

## チューニング
[ep.X - パラメータチューニング](https://qiita.com/kentakozuka/items/46f0479f207117b67c47)
[ep.X - GBDTのパラメータチューニング](https://qiita.com/kentakozuka/items/0933c01669d91af58d2b)
ニューラルネットのパラメータチューニング
線形モデルのパラメータチューニング
[Kaggle] ep.0 - セットアップ

# tldr
Kaggleをやってみるにあたってのセットアップをしてみました。

目次は[こちら](https://qiita.com/kentakozuka/items/7cbb3006540d3dc9573a)

# 始める
[Kaggleのサイト](https://www.kaggle.com/)でアカウントを作成

参考図書は以下を使います。

- 「[Kaggleで勝つデータ分析の技術](https://www.amazon.co.jp/gp/product/B07YTDBC3Z/ref=ppx_yo_dt_b_d_asin_title_o02?ie=UTF8&psc=1)」


# いろんな計算をするところ
「[Google Colaboratory](https://colab.research.google.com/)」で行います。

これを使う理由としては、

- Jupyter Notebookのセットアップの必要がない
- クラウドだからどこからでも編集可能、データのロストの心配がない
- （Vimのキーバインドがある）

といった利点があります。みなさんがどうやっているのかはよくわかりませんが、いずれ調べてみます。
KaggleにもNotebookがあるのでそれでもいいかと思います。それにしようかなー。
チャットアプリでメッセージを送信しようとすると

```rb
def create
    @message = @group.messages.new(message_params)
    if @message.save
       respond_to do |format|
       format.json
      end
    else
      @messages = @group.messages.includes(:user)
      flash.now[:alert] = 'メッセージを入力してください。'
      render :index
    end
  end
```

一見問題なさそうなコード


解決したこと↓

```rb
 @message = @group.messages.new(message_params)
    if @message.save
       respond_to do |format|
      #  format.html{ redirect_to group_messages_path(@group)}
       format.json
      end
```

保存されたメッセージをフォーマットに載せるまではよかったのだが
それを表示させるjson形式がうまく表示までしてくれていなかったようで
htmlのリダイレクトにて＠groupにてパスをしてインデックス処理をしたら表示した！

しかし、本当の問題はそこではない・
jsのファイル（vsコード）が
message.js（削除済み）！！となっていた

原因は各機能のブランチをマージしていなかった！！

以上解決！！！
LaTeXエラー file ended while scanning use of \next について

$\rm\LaTeX$で生じたエラーについて記述します．

### 前提条件

|||
|:--:|:--:|
|OS|Windows10 Home 1903|
|TeX Live | version 2019|
|LaTeX| pLaTeX |

## エラーメッセージ

$\rm\LaTeX$にて文章を作成しているとき，下記のエラーに見舞われました．

```
file ended while scanning use of \next
```

## 原因

ソースコード中のコマンドのインデントの問題でした．
ソースコード中で`\begin{comment}`を使用していたのですが，エラーが発生した当初は以下のように記述していました．

```
\begin{document}
    
\section{hoge}

    \subsection{hogehoge}
    ...

    \begin{comment}
    ...
    \end{comment}

\end{docment}
```

`comment`環境を使用する場合において，以下のように修正した所エラーはなくなりました．

```
\begin{document}
    
\section{hoge}

    \subsection{hogehoge}
    ...

\begin{comment}
    ...
\end{comment}

\end{docment}
```

## 参考

https://tex.stackexchange.com/questions/225581/beamer-file-ended-while-scanning-use-of-next
時間だけわかっているときのdatetimeへの埋め込み

#概要
今回の記事は、スクレイピングしたときに時間は取得できたのでその時間に日時を足してdatetime型に変換したいときの解決策を載せたいと思います。

##解決策1
datetimeから文字列への変換

```Python
dt_now = dt.now()
time_str = dt_now.strftime('%Y/%m/%d')
```
これによって以下のような変換が可能になります。
2018-02-02 18:31:13→18/02/02
この文字列に取得した値を組み合わせてからstrptimeを使って、datetime型に変換すればよいと思います。

**しかし、私の実行環境では%dがどうしてもエラーとなってしまうので別の方法を試してみました。**

##解決策2
datetimeの分割

```Python
dt_now = dt.now()

year = int(dt_now.year)
month = int(dt_now.month)
day = int(dt_now.day)
```

これらとスクレイピングで取得した値をint型に直したものを組み合わせます。

```Python
datetime_after = dt(year,month,day,hour,minute)
```

#まとめ
根本的には%dを直すのが先決ですが、はまりそうなら解決策2を試してみてもいいかもしれません。
React hooksを試してみた

##はじめに

[現在進行形でReactを勉強中な状態](https://qiita.com/10mi8o/items/76bad290d2b2557748c4)ですが、昨年、React hooksてなんか界隈で盛り上がってた気がするなぁ、という事で、どういうものなのかキャッチアップしつつ、テキストとしても残しました。

***個人的なメモレベル***です。あしからず。。。
以下、公式ドキュメントを参考にしてます。
[フックの導入](https://ja.reactjs.org/docs/hooks-intro.html)


##Componentの簡単なおさらい

Reactのコンポーネント定義には、***クラスコンポーネント***と***関数コンポーネント***が存在します。

クラスコンポーネントは、***state(状態)を持つことが可能***で、ライフサイクルメソッドを実装できたりと、細かな描画制御に耐えうるコンポーネントを作成したいときに利用されていました。

関数コンポーネントは、Hooksを利用できるようになる前は、***state(状態)を持つことが不可能***で、渡された値をただ描画するだけのコンポーネントでした。(頑張れば、状態を制御することも出来そうですが。。。)

なので、Hooks登場以前は、コンポーネントが状態を持たないことが分かっている場合は、よりシンプルに実装できる関数コンポーネントで実装し、状態を持つ必要が出てきたタイミングで、クラスコンポーネントにリファクタして、という事が現場では行われていたのではないかと思います。

全機能を実現できるなら、最初からクラスコンポーネントで良いじゃん！...と一瞬思いましたが、アプリケーション開発で、クラスコンポーネントにメソッドを詰め込んでいく状況を想像すると、見通しが悪くなりそうだな...と感じます。

##React Hooksとは

これまでは、渡された値をただ描画するだけだった関数コンポーネントの機能を拡張してくれるのがHooksです。(クラスコンポーネントでしかstateを管理できなかったが、Hooksの登場により、関数コンポーネントでも実現できるようになった)

関数コンポーネントとは、要は、関数なので、クラスコンポーネントよりも、シンプルにかつ、Hooksの機能により状態を持たせることも出来るようになります。

では、実際に書いてみます。

まずはuseStateというメソッドをreactからインポートします。

```react:useStateをimport
import React, { useState } from 'react';
```

この`useState`は引数に初期値を与える事ができます。
useStateは何を返すのかなぁと`console.log`で確認すると、
以下の場合、数字の０と関数が入っていることが分かります。

```react:useStateの戻り値をチェック
import React, { useState } from 'react';

const App = () => {
    const state = useState(0);
    console.log({state});
};
```
![スクリーンショット 2020-02-11 19.53.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33632/3b38bd45-4b69-081b-312d-78aee570b8b0.png)
配列に初期値と関数が入ってることが分かります。
`useState`は常に二つの要素を返します。

上記を踏まえて、`useState`の記法を確認しましょう。
ES6の分割代入を使って、それぞれの要素を受け取ります。
１つ目は初期値、二つ目は初期値を操作する関数を受け取ります。


```react:useStateの記法
//もし、sizeだったらsetSizeと書きます。これは慣習的なものです。
const [count, setCount] = useState(0);
```

これで関数コンポーネントでcountのstateを操作する準備が出来ました。
以下、定番のカウントコンポーネントです。

`setCount`は、クラスコンポーネントでおなじみの`setState`と同じように、
値の状態を変更する事によって、自身のコンポーネントの再描画を指示します。
(ここではクリックイベントで状態を変えて、再描画させています)


```react:reactのチュートリアルで定番のカウントコンポーネントで検証
import React, { useState } from 'react';

const App = () => {
    
    const [count, setCount] = useState(0);

    const increment = () => setCount(count + 1); 
    const decrement = () => setCount(count - 1);

    //setCountの引数には関数も与えることができる
    //setCountの引数には現時点の状態が返ってくる。
    //その値に基づいて、複雑な処理をしたいという要件で使えるテクニック
    const increment2 = () => setCount((previousCount) => previousCount + 1)

    return(
        <>
            <h1>count: { count }</h1>
            <button onClick={ increment }>プラス１</button>
            <button onClick={ increment2 }>プラス１</button>
            <button onClick={ decrement }>マイナス１</button>
        </>
    )
}

export default App;
```

##所感
今回、ホントに基本的な部分を試してみただけですが、`useEffect`なども便利そうです。
徐々にReactも面白くなってきたかも。
CentOSのホームディレクトリを英語化する

日本語のCentOSをインストールすると、ホームディレクトリが日本語化される。

![centos_homedir_ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320660/115d0abc-da9f-2948-1665-e27d7d569e26.png)

このままだと、ターミナルで操作するときに入力をいちいち日本語に切り替える必要があり不便なため、英語化する。

# 英語化

以下のコマンドを実行

```
LANG=C xdg-user-dirs-gtk-update
```

確認画面が出たら、[Update Names]

![centos_homedir_ja2en_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320660/a66c43c8-666f-b3c7-233e-7a19a5f5bb28.png)

これで英語化される

![centos_homedir_en.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320660/810033f7-4fa8-7fcb-576c-39cc48c5ab7c.png)

# 参考にしたサイト

[CentOS7で日本語表記ディレクトリを英語表記に変更する](https://usado.jp/spdsk/2018/09/28/post-4419/)
CentOS7で/tmp に書き込めるようにする

CentOS7では、アプリケーションから /tmp ディレクトリにファイルを書き込めないので、使えるように設定する方法。

## 設定

* CentOS7では、PrivateTmpというオプションがあり、PrivateTmpがtrueの場合、/tmpではなく、/tmp/systemd-private-[UUID]/tmp/ に格納される
* PrivateTmpはデフォルトでtrueになっているため、設定を変更しないと/tmpの直下には書き込めない
* PrivateTmpオプションは、serivceごとに修正する必要がある
* 以下、httpdのPrivateTmpをfalseにする場合の設定例

```bash
# cp /usr/lib/systemd/system/httpd.service /etc/systemd/system/
# chmod 777 /etc/systemd/system/httpd.service
# vi /etc/systemd/system/httpd.service
PrivateTmp=true　→　PrivateTmp=false
# systemctl daemon-reload
```
GPU,CUDAを使ったディープラーニング実行基盤を整備する

#  概要  
なぜかは分からないが、開発に使用しているCUDAの環境が壊れており、tensorflow,keras,chainerといったのディープラーニング系フレームワークが一切使えない状況になっていた。

仕方なく再設定を行ったもののせっかくなのでメモを残すことにする。
なおnvidia-driver,CUDA,cuDNN,tensorflowの設定はバージョンによる整合性のために毎回ハマるため、組み合わせのセットをストックしておきたい。  
  
# 環境
環境は以下の組み合わせ。組み合わせが違うと正しく動作しないので注意。   

-  nvidia-driver:418 (前の環境では384で動いた)  
-  CUDA:8.0
-  cuDNN:6.0
-  tensroflow-gpu:1.3.0

なおこの記事執筆時にはtensor-flow2.0やCUDA10.0も登場しており、少し古いバージョン環境となる。tendorflowでは対応するCUDAやcuDNNも公開されているので、こちらも参考にしていただきたい。
https://www.tensorflow.org/install/source#common_installation_problems

![tensorflowgpu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573779/41a9c2ff-3d4b-fc9a-8418-4acd8c45bec0.png)


# 手順

## driverの削除
```  
$ dpkg -l | grep nvidia
$ sudo apt-get --purge remove nvidia-*
$ dpkg -l | grep cuda
$ sudo apt-get --purge remove cuda-*
```
## driverインストール
```
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt install nvidia-384     #384を指定したが418が入った
sudo shutdown  -r now
```

## CUDAインストール  

CUDAは以下で公開されているのでwgetで取得する。  
http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/

```
$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
$ sudo apt update
$ sudo apt-get install cuda-8-0
$ shutdown  -r now
```

## cuDNNインストール  

cuDNNは以下で公開されているので,直接サイトよりダウンロードする。（要登録）  
https://developer.nvidia.com/rdp/cudnn-archive
ダウンロードするのは以下３つ   

- cuDNN v6.0 Runtime Library for Ubuntu16.04 (Deb)  
- cuDNN v6.0 Developer Library for Ubuntu16.04 (Deb)  
- cuDNN v6.0 Code Samples and User Guide for Ubuntu16.04 (Deb)  

各ファイルに対して以下を実行  

```
$ sudo dpkg -i libcudnn6_6.0*+cuda8.0_amd64.deb  
$ sudo dpkg -i libcudnn6-dev_6.0*+cuda8.0_amd64.deb  
$ sudo dpkg -i libcudnn6-doc_6.0*+cuda8.0_amd64.deb  
```

## インストールの確認

```
$ cd /usr/local/cuda-8.0/bin/
$ bash cuda-install-samples-8.0.sh ~ 
$ cd ~/NVIDIA_CUDA-8.0_Samples/
$ make
$ cd bin/x86_64/linux/release   
$ ./smokeParticles
```

以下によりmakeに失敗ことがある

```
/usr/bin/ld: -lnvcuvid が見つかりません
collect2: error: ld returned 1 exit status
make[1]: *** [cudaDecodeGL] エラー 1
```

3_Imaging/cudaDecodeGL/findgllib.mkの61行目でUBUNTU_PKG_NAME = "nvidia-375"
を"nvidia-384"や "nvidia-418"に変更し、nvidia-driverと整合性を合わせることで解決した。

# その他
nvidia-driverやcudnnは数年前と比べてインストーラーが日々整備されてきており、参考サイトによってもインストール手順が違うので注意されたし。
Tkinterを使ってみる

PythonでGUIプログラムを書けるTkinterを使ってみる。

# Tkinter

PythonでGUIアプリケーションを作成できるライブラリ。Pythonに標準で入っているため、特にインストールなどはせずに使用可能。

# サンプルコード

```python
# -*- coding : utf-8 -*-
u"""
GUIプログラミングのサンプル
"""
import tkinter
from tkinter import messagebox

def button_push(event):
    u"ボタンをクリックされたときの動作"
    edit_box.delete(0, tkinter.END)

def func_check(event):
    u"チェックボックスの状態を確認して、表示する"
    global val1
    global val2
    global val3

    text = ""

    if val1.get() == True:
    	text += "項目1はチェックされています\n"
    else:
    	text += "項目1はチェックされていません\n"
    if val2.get() == True:
    	text += "項目2はチェックされています\n"
    else:
    	text += "項目2はチェックされていません\n"
    if val3.get() == True:
    	text += "項目3はチェックされています\n"
    else:
    	text += "項目3はチェックされていません\n"

    messagebox.showinfo("info", text)


if __name__ == "__main__":
    root = tkinter.Tk()
    root.title(u"GUIサンプル")
    root.geometry("400x300")

    # テキストボックス
    edit_box = tkinter.Entry(width=50)
    edit_box.insert(tkinter.END, "サンプル文字列")
    edit_box.pack()

    # ボタン
    button = tkinter.Button(text=u"消去", width=30)
    button.bind("<Button-1>", button_push)
    button.pack()
    # button.place(x=105, y=30)

    # チェックボックス
    val1 = tkinter.BooleanVar()
    val2 = tkinter.BooleanVar()
    val3 = tkinter.BooleanVar()
    val1.set(False)
    val2.set(True)
    val3.set(False)
    checkbox1 = tkinter.Checkbutton(text=u"チェック1", variable=val1)
    checkbox1.pack()
    checkbox2 = tkinter.Checkbutton(text=u"チェック2", variable=val2)
    checkbox2.pack()
    checkbox3 = tkinter.Checkbutton(text=u"チェック3", variable=val3)
    checkbox3.pack()

    # ボタン
    button2 = tkinter.Button(root, text=u"チェックボックスの取得", width=50)
    button2.bind("<Button-1>", func_check)
    button2.pack()

    tkinter.mainloop()
```

## 実行例

![1a72ae3c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320660/f3a5c65e-7838-d573-9023-4eb6c33b12cf.png)

## 参照
* [PythonのTkinterを使ってみる](https://qiita.com/nnahito/items/ad1428a30738b3d93762)
Pythonで環境変数を扱う

Pythonのコード内で環境変数を扱う方法。

``` python
import os
```

# 取得

一括取得

```python
os.environ
```

環境変数名を指定して取得 `os.environ[環境変数名]`

``` python
# 例
os.environ['PATH']
```

# 設定

この方法で設定した場合、そのPythonプログラムの中でのみ有効。システムの環境変数は書き変わらない

``` python
# os.environ[環境変数名] = パス
os.environ['NEW_KEY'] = 'test'
```
kintoneのJSカスタマイズをデバッグする方法

config-helperに[プルリクエスト](https://github.com/kintone/config-helper/pull/14/commits/4d23e81752c4b18ba103d489805579205ffbbef9)を投げました。
その時の簡易的な動作確認方法をメモします。

開発者コンソール上ではちょっとな・・・Visual Studio Codeでやりたいな、という人におすすめです。

# プルリクエストの内容
config-helperではアプリのフィールド情報を取得できますが、テーブルのフィールドかどうかが判断できません。
これを判断できるようにしました。

# 手順
## 1. アプリの作成
kintoneのアプリを作成します。
（今回はフォームにテーブルが必要なので用意しました）
JSカスタマイズにkintone-config-helper.jsを適用します。

## 2. kintone-config-helperの実行
開発者コンソールで以下のコマンドが動作することを確認します。

```javascript
KintoneConfigHelper.getFields().then(console.log);
```

こんな感じになるはずです。
![kch1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480759/b25f244d-2679-a227-f6bf-32e202139671.png)


## 3. ローカルオーバーライドを設定
Google Chromeのローカルオーバーライドを使います。
ローカルオーバーライドの詳細については[こちら]([
https://developers.google.com/web/updates/2018/01/devtools#overrides)を参考にしてください。

JSカスタマイズに設定したkintone-config-helper.jsをローカルオーバーライドします。

初めてローカルオーバーライドを使う場合は開発者コンソールで、Sourcesタブ、Overridesタブを選択します。
Select folder for overridesをクリックして、適当なローカルフォルダを選択します。
![kch5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480759/ee6c19f6-b8bf-4f5b-dd61-4dfe490f91d8.png)

開発者コンソールでkintone-config-helper.jsを探します。
（kintoneの仕様でファイル名はdownload.do?…となるようです）
右クリック、「Save for overrides」を選択します。
![kch2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480759/e82261b4-d832-4c86-0bac-541ddce66a56.png)

## 4. Visual Studio CodeでJSファイルとして認識
ローカルオーバーライドしたファイルをVisual Studio Codeで開きます。
そのままではJSファイルとして認識されません。
Visual Studio Codeの設定に以下を追記すると認識してくれます。

```json
    "files.associations": {
        "download.do*": "javascript"
    }
```

## 5. 動作確認
例えばconsole.log()を追加して保存します。
![kch3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480759/c605cad7-5162-fdb3-c990-410ba38b9f78.png)

画面をリロードして、開発者コンソールでKintoneConfigHelperを再実行するとconsole.log()が反映されています。
![kch4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480759/7dfdc2ba-8c19-5d3b-5f5b-4f36c7db8e07.png)

本当はVisual Studio CodeのDebugger for Chromeを使いたかったのですが、それはまた今度・・・
Railsで個別にCSSを適用させる方法



#結論
config/initializers/assets.rbに
'Rails.application.config.assets.precompile += %w( user.css )'
を追加することで解決した。
いろいろ調べてもわからなかったが、エラーが出たときの指示に従ったら解決したので、赤い文字がたくさん出てきても焦らずに対処すれば問題ないということがわかった。

#背景
htmlやcssの勉強は対してしていなかったものあり、デザインをいじることに抵抗があった。
そんなとき、Bootstrapが便利だと職場のエンジニアの方々からきき、デザインに全く手が回っていないサービスにBootstrapの実装を試みた。

Bootstrapをいろいろ探していると無料のテーマというのがあることを知った。
元々ワードプレスでブログを書いていたことがあったので、ワードプレスのテーマと非常に似ているなと感じた。

Bootstrapのテーマを探すとサイト丸ごとをデザインできるようなものもあったが、Bootstrapについてよくわからないし、せっかく実装したslickを使ったJQueryの動きに影響が出ても嫌なので、作ってすらいなかったログインページをまず作り、そのページにだけBootstrapのデザインを反映させようとした。

#苦悩

htmlのページにcssを読み込む方法は知っていたつもりだったが、user.scssというscssファイルの読み込みがどうしてもできずにいた。
同じcssのコードをapplication.scssに貼り付けるとサイト全体に反映されてしまうが、これだとちゃんとログイン画面もお洒落なデザインになっていた。
どうにかしてログイン画面にのみデザインを反映させたいと思い、いろいろ調べてみたが、compileがどうとか、
*= require_tree .　と*= require_selfの順番がどうとかがたくさん出てきて、困った。
諦めてteratailで質問をするためにどのようなエラーが出ているのかを確認しようと、htmlに読み込みのためのコードを書き、ブラウザで確認した。
すると
「Asset was not declared to be precompiled in production.
Add `Rails.application.config.assets.precompile += %w( user.css )` to `config/initializers/assets.rb` and restart your server」と丁寧に書いてあり、
言われた通りに丸々コピーしてassets.rbに記載したのち、リスタートするとログイン画面だけお洒落になった。
ファイルはscssなのに、なんでcssなのだろうと思いながら、scssに変更してサーバーを起動させたが、問題なく立ち上がった。cssとscssにはそんなに違いはないんだろうと勝手に解釈して終わった。なんとかうまくいってよかった。

#学び
プログラミングを初めてから作業中の癖になっていたことが２つあり、１つはエラーが出たりわからなかったりするとすぐに調べるようになったこと。もう一つがteratailで誰かに助けを求めようとすることだった。が、そもそもどんなエラーなのか、しっかり突き詰めていないと調べて出てきた解決策が自分の課題とマッチしているのか判断ができないし、teratailで質問するにしても質問された側も状況の把握がうまくできない、何よりエラーの説明に答えがある場合がある、ということを今回の経験から学んだ。
PythonでWeb開発　with TDD 1 

# Djangoの開発環境を準備と最初のテスト

## 準備したもの

前回の続き。"Test-Driven Development with Python"を参考にしながらDjangoでの開発をスタートします。
本書はテスト環境のブラウザとしてFirefoxを使うようなのでわざわざFirefoxインストールしました。

1. Djangoのインストール
2. Seleniumのインストール
3. Firefoxブラウザのインストール
4. geckodriverのインストール

## Django

書籍ではv1.12を使っていますがv3.0.3を今回は使用します。

## Selenium

書籍同様にv3(stable v3.141.0) を今回は使用します。

## Done

1. Djangoのインストール
2. Seleniumのインストール
3. Firefox用のドライバー(geckodriver)の準備
4. プロジェクトディレクトリの作成
5. 最初のテストの作成
6. 最初のテストの失敗を確認
7. DjangoでAPPのひな形を作成
8. APPの起動を確認
9. 最初のテストの成功を確認

## 振り返り
とりあえず開発するための足場を作った段階なのでまだ序の口
世界各国の時刻に変換する【時系列データ,as.POSIXct】



POSIXでtz指定する時、何を元にtz指定したらいいか分からなかった。

```r
global_day <- seq(
  as.POSIXct('1995-01-01', format='%Y-%m-%d', tz = 'Asia/Seoul'),
  as.POSIXct('2020-01-01', format='%Y-%m-%d', tz = 'Asia/Seoul'),
  60*60*24)
```

ここのListの「tz database」列に綺麗にまとまっている。
https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
macbookの日本語入力が重くなった時の対処法

# 経緯
macbookを使い始めてから1月ほど経った頃、ターミナルで色々弄り回してたらユーザー管理がよくわからないことになってしまったので、初期化した方がスッキリしていいかと思って初期化をしました。

初期化の方法はいろんなサイトに書かれていますが、
1. iCloudからsign out
2. disk utilityでdiskを消去
3. OS Xを再インストール
の手順で初期化をしました。

初期化した直後は気づかなかったんですが、日本語入力が異常に重くなっていることに気づいたので、これの対処法を調べました。ここでは実際に自分がやって上手くいった方法を備忘録を兼ねて紹介します。
# 環境
MacBook Air 2019
macOS Catalina ver. 10.15.3

# 手順
1. disk utilityでfirst aidを実行
2. 1ではどうやら解決していなかったようなので、続いてセーフモードで起動。
3. 2の後再起動をしたら日本語入力がスムーズにできるようになっていました。

# 参考リンク
## disk utility
https://support.apple.com/ja-jp/guide/disk-utility/dskutl1040/mac
## safe mode
https://support.apple.com/ja-jp/HT201262
初心者によるプログラミング学習ログ 236日目

#100日チャレンジの236日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

236日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>236日目<br>・javascript,jqueryのtodolistミニアプリ模写<br>・udemyでjavascript講座<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1226959344261984257?ref_src=twsrc%5Etfw">February 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
numpyとpandasの分散を求めるメソッドの違い

## TL;DR

numpyとpandasの分散処理をしていて、両者が一致しないのでなんで？となったのでメモを残しておきます。


## numpyとpandasのvarを求めるメソッドの結果はデフォルト値だと一致しない

簡単にrandomに生成した行列を用いてテストします。実際に一致しません。

```python
import numpy as np
import pandas as pd

X = np.random.randn(10, 10)
df = pd.DataFrame(data=X)

np.allclose(X, df.values)
# True

X_var = np.var(X, axis=1)
df_var = df.var(axis=1)

np.allclose(X_var, df_var.values)
# False
```

実際にドキュメントを調べてみると、[numpy.var](https://docs.scipy.org/doc/numpy/reference/generated/numpy.var.html)ではデフォルトが`ddof=0`なんですが、[pandas.DataFrame.var](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.var.html)だとデフォルトが`ddof=1`になっています。

デフォルト値を揃えると結果は一致します。

```python
X_var_ddof1 = np.var(X, ddof=1, axis=1)
df_var_ddof1 = df.var(axis=1)

np.allclose(X_var_ddof1, df_var_ddof1.values)
# True
```

計算結果がなんか合わないなーと思っていたら実はnumpyとpandasで微妙に違いがあったという罠。
統一してほしいものですが、もしかしたら誰かがはまっていたときのことを思ってメモを公開しておきます。