OmniAICreator/Qiita-1.07M huggingface dataset:
二値分類問題に有効！マンホイットニーU検定による特徴量選択

本記事では、二値分類問題に応用できる、連続値を取る説明変数のうちどの説明変数が特徴として有効であるか知りたい場合に有用なマンホイットニーのU検定、通称「U検定」について説明します。

論よりコード、まずはPythonコードはこちら。

#Pythonコード

```python
from scipy import stats
import pandas as pd

# カラムとp値を保持
feature_list = pd.DataFrame()

# 同一のカラムを持つdf1, df2があるとする
df1 = ....
df2 = ....

# カラム１つごとに確認
for col in df1.columns:
  # ２つの連続値を比べる
  statistics, pvalue = stats.mannwhitneyu(df1[col], df2[col])
  # 出力例：) MannwhitneyuResult(statistic=49.0, pvalue=4.8490227224570924e-17)

  # p値とカラム名をリストに保存
  feature_list = feature_list.append(pd.DataFrame({'column':col, 'value':pvalue}, index=[len(feature_list)]))

# p値が小さいものから表示（小さいものほど度合いが高い）
print(feature_list.sort_values('value'))
```

# U検定とは
> マン－ホイットニーのＵ検定
独立した２組の標本が属している母集団の分布が等しいかどうかを検定するノンパラメトリック手法。
[[11.1]　マン－ホイットニーのＵ検定](http://www2.hak.hokkyodai.ac.jp/fukuda/lecture/SocialLinguistics/html/12nonpara.html#shagen1)

つまり、正規分布しない（ノンパラメトリック）と思われる２つの分布に対して差があるかどうかを測るものであり、p値が小さいほど「2 群の母代表値に差がある」と言えます。
これを用いて一定のp値以上のものを特徴量として取捨選択すると、結果、効率的に特徴量を選択することができます。

# Irisデータによるサンプル
ここからはirisデータを使ってp値とそのデータを可視化したものを確認します。
なお今回２値分類として話を進めるため、比較する品種をvirginicaとversicolorに絞ります。

```python:
import seaborn as sns
from scipy import stats
import numpy as np
import pandas as pd

# seabornのirisデータセットを読み込み
iris = sns.load_dataset('iris') 

# カラムとp値を保持
feature_list = pd.DataFrame()

# カラム１つごとに確認
for col in iris.columns:
  # virginicaとversicolorの各カラムの分布の差を調べる（U検定）
  statistics, pvalue = stats.mannwhitneyu(iris[iris['species'] == 'virginica'][col], iris[iris['species'] == 'versicolor'][col])

  # p値とカラム名をリストに保存
  feature_list = feature_list.append(pd.DataFrame({'column':col, 'pvalue':pvalue}, index=[len(feature_list)]))

# p値が小さいものから表示（小さいものほど度合いが高い）
print(feature_list.sort_values('pvalue', ascending=False))
```
 
 
　
実行の結果、feature_listに入った結果は以下のようになりました。
　　

```python
	column	        value
2	petal_length	4.566772e-17
3	petal_width		4.849023e-17
0	sepal_length	2.934503e-07
1	sepal_width		2.286071e-03
```
　　
petal_lengthという属性値が一番p値が小さくなり、sepal_widthという属性値が一番p値が大きくなりました。では、ヒストグラムとして書き出してみるとこの違いはどう見えるでしょうか。

## petal_lengthの場合
![1937c84c8a4add57a6ca3e19d95f918a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729252/94d69244-4183-325f-ff09-10d0599d460c.png)
[fig.1] irisデータのpetal_lengthをヒストグラムで可視化（正規化済み）

p値も十分に小さいことから、差があると言える状態でしたが、可視化してみるとかなり差があるように見受けられます（重複する部分も大分小さい）。 分類に有効な特徴として使えそうですね。
 
では、一番大きかったsepal_widthはどうでしょうか。

## sepal_widthの場合
![a2c91bea84724443ded37fe0a58f6625.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729252/dcfa79d4-dde7-9453-32e4-e79a29dce318.png)
[fig.2] irisデータのsepal_widthをヒストグラムで可視化（正規化済み）


p値が0.0022〜ということでよく使われる0.05よりも小さいことから差があると言えますが、先ほどのpetal_lengthの方と比べて大分大きいことからもわかるように、あまり差があるようには見えません。重なっている部分も多いですね。



こういった説明変数を特徴として使ってもあまり精度に寄与しないでしょう。

場合によっては使わない方が精度が出る場合もあります。

# まとめ

U検定による分類問題に有効な特徴量の選択に関してお話しさせていただきました。

U検定はノンパラメトリック（正規分布していないと思われる分布に使える/していてもそれほど変わらない結果が得られる）手法です。正規分布するとわかっている場合はt検定が相応しいです。


#宣伝
ブログでデータサイエンス・統計にまつわる初心者目線のブログを書いています。
[とあるデータサイエンティストのブログ]
(https://an-engineer-note.com)

良ければお立ち寄りください。

それでは！
SQLcl 21.2 のステータスバー機能を試す

SQLclはOracle Databaseに対するコマンドライン・インターフェースです。基本的にはOracle DatabaseやOracle Database Clientにまれますが、SQL*Plusと異なり、独自にバージョンアップが行われています。本記事ではバージョンアップされたSQLcl 21.2のステータスバー機能を試します。

# セットアップ
SQLclはZipファイル形式で提供されています。[このページ](https://www.oracle.com/tools/downloads/sqlcl-downloads.html)からダウンロードします。任意のディレクトリに展開し、sqlcl/binディレクトリをパスに追加すれば使えます。
インストール・パスを${ORACLE_HOME}/binよりも前に指定します。

```
$ unzip sqlcl-21.2.0.174.2245.zip
$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/oracle/sqlcl/bin:/u01/app/oracle/product/19.0.0/dbhome_1/bin:/home/oracle/.local/bin:/home/oracle/bin
$ which sql
~/sqlcl/bin/sql
$ sql -V

SQLcl: Release 21.2.0.0 Production Build: 21.2.0.174.2245
$
```

sql -Vコマンドを実行して、「SQLcl: Release 21.2.0.0」が出力されればインストール完了です。

# ステータスバー
ステータスバーの設定方法や設定できる値について説明します。

##  使い方
SQLclプロンプトから SET STATUSBAR ONコマンドを実行すると、ターミナル最下行にステータスバーが出力されます。SET STATUSBAR OFFコマンドで削除できます。

![Statusbar](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/4697f92b-04a0-ba4d-8be0-6372093d6294.png)

現在の状況と使い方はSHOW STATUSBARコマンドで出力できます。

```
SQL> SHOW STATUSBAR
STATUS BAR: on
Used components:
        EDITMODE               Displays the current edit mode, emacs, vicmd or viins.
        LINECOL                Displays the current line and column numbers.
        USERNAME               Displays the name of the currently connected database user.
        DBID                   Displays the id of the currently connected database.
Unused components:
        CURSOR                 Displays the current character position within the edit buffer.
        CWD                    Displays the Current Working Directory.
        ENCODING               Displays the local encoding set.
        GIT                    Displays the git branch containing the Current Working Directory.
        JAVA                   Displays the running Java version.
        TIMING                 Displays the elapsed time for the most recent database command.
        TXN                    Displays whether there are pending database changes that need a commit or rollback.
Default components:
        EDITMODE
        LINECOL
        USERNAME
        DBID
```
## 指定できる値
SET STATUSBARコマンドには以下の動作を指定できます。

|設定|説明|
|:---|:---|
|ON|ステータスバーを表示します|
|OFF|ステータスバーを削除します|
|DEFAULT|デフォルト設定でステータスバーを表示します|
|ADD {コンポーネント}|表示するコンポーネントを追加します|
|REMOVE {コンポーネント}|削除するコンポーネントを指定します|

表示できるコンポーネントは以下の通りです。

|コンポーネント|説明|例|デフォルト？|
|:---|:---|:---|:---|
|EDITMODE|エディットモード（emacs,vicmd,viins）|viins|Yes|
|LINECOL|行列番号| 1\:1 | Yes|
|USERNAME|接続ユーザー名|SCOTT|Yes|
|DBID|接続データベース名|pdb1|Yes|
|CURSOR|カーソル位置|3|No|
|CWD|カレント・ディレクトリ|/home/oracle|No|
|ENCODING|クライアント言語|UTF-8|No|
|GIT|カレント・ディレクトリにGitブランチがあるか|None|No|
|JAVA|Javaバージョン|1.8.0_28|No|
|TIMING|コマンド実行時間|00:00:01.017|No|
|TXN|トランザクション実行中か|Changes Pending|No|

コンポーネントDBIDはオンライン・マニュアル上では「Displays the id of the currently connected database.」となっていますが、データベースID（V\$DATABASE.DBID）ではなく、データベース名（またはPDB名）が出力されます。

# マニュアル
SQLcl 21.2の[マニュアル](https://docs.oracle.com/en/database/oracle/sql-developer-command-line/21.2/index.html)にはこの機能についての説明がありません。古いバージョンのリファレンス・マニュアルでも見つけられなかったため、いつから使えるようになったのかは正確にはわかっていません。
testflightでアップロードしたものが消えてしまう問題

#flutterで作成したアプリをtestflightにアップロードしたものが消えてしまう

#アップロード直後
バージョン1.0.0と認識されている模様。（ただし中身は空白）

![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/832092/ad6deca3-9461-5558-049f-4bde2485327c.png)

#数分経って再リロードしてみると。。
アップロードしたものが消えてしまう。

![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/832092/b7369cd5-e754-1702-92ee-fe35fa830e2c.png)


#解決策
ビルド内容に問題があると、Appleよりメールが届くようになっております。（メールに気付けていませんでした。。）
私の場合は、「Info.plistへの記述が足りないよ」との指摘を受けており、修正して再度アップロードしたところ、無事解決しました。
1-13.デフォルトの引数値

まずは下記の問題を御覧ください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1533043/c66b7bf3-1058-43a9-7a53-2f5772c996ef.png)

私は`f(7)`を出力するのでは？と思いましたがそれは間違いです。
正解は`6`を出力します。なぜでしょうか？

---

実はこれはデフォルト引数という仕組みで、引数を省略可能なのです。
呼び出しする度に値が再評価されることはないので、
ミュータブルなオブジェクトをデフォルト引数とすると、一見おかしな挙動を招きます。pythonにおける一種のバグです。
#順を追って解説
問題を再掲示します。

```python 
i = 5
i = 6

def f(arg = i):
    i = 7
    print(arg)

i = 8
i = 9

f()
```
注目するのは、３行目の「def f(arg=i):」で定義している「arg=i」。

引数「arg」に、値「i」を定義している。

次に注目するのは、１行目の「i = 6」。

３行目で関数を定義したとき、変数 i には値:6が格納されていた。

これによって、関数num()を定義した時、関数num()オブジェクトがキーワード引数 arg = i = 6 を保持することになる。

結果、関数実行時に引数を渡さなくてもエラーにはならないし、4行目でi = 7を定義しても関数実行時には arg = 6で実行される。

---

#ではどのように解釈して覚えるべきだろうか
・キーワード引数はイミュータブルである。そのため一度指定した`def f(arg = i):`は変更されないのだ。これは私の持論であるため鵜呑みにしないでほしい。

デフォルト値は、関数が定義された時点で、関数を 定義している 側のスコープ (scope) で評価されるのだ。

https://docs.python.org/ja/3/faq/programming.html#:~:text=%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%80%82-,%E3%81%AA%E3%81%9C%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E9%96%93%E3%81%A7%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E5%80%A4%E3%81%8C%E5%85%B1%E6%9C%89%E3%81%95%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F,-%C2%B6

https://docs.python.org/ja/3/tutorial/controlflow.html#default-argument-values

この記事は上記のチュートリアルを参考にしました。
NiFi で S3フォルダからファイルを取得し、HDFSに保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133516/0c6d74a4-875a-a4dd-1de2-f5750c552ffe.png)

# 1: ListS3



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133516/620d787a-e247-9301-ed4f-37726312884c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133516/df9bd2b6-7a28-06e4-86e2-8f286d78c1bb.png)

# 2: FetchS3Object
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133516/ddd7ec40-e140-cae5-75ac-f65b31bb164a.png)

# 3: File rename

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133516/c31a0791-2477-0bba-7a39-e5718102da6c.png)


# 4: Save file to HDFS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133516/141f36e6-5ad6-9d58-2616-041e500ddd90.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133516/4281ba8e-202d-77c4-4a7b-e86c2eff1bff.png)
java：ラムダ式について

# ラムダ式について

ラムダ式はメソッドを変数のように扱える特徴があります。
関数型インタフェース（抽象メソッドを一つのみ含むインタフェース）を匿名クラスを使用する場合より、短いコードで記述することができます。

こちら streamAPI を理解するためには必須の知識になるため、備忘録を兼ねてまとめました。

まず、匿名クラスを用いる場合と、ラムダ式を用いる場合を比較してみます。

## 匿名クラスを使用する場合

```java:匿名クラス
// 関数型インタフェース宣言
interface SampleInterface {
  public String methodA(String word);
}

public class Sample {

  public static void main(String[] args) {
    // 匿名クラス
    SampleInterface si = new SampleInterface(){
      @Override
      public String methodA(String word) {
        return "Hello" + word;
      }
    };

    System.out.println(si.methodA("yamada")); // -> Hello yamada
  }
}
```

匿名クラスを使用する場合は以下の手順になる

1. 関数型インタフェース宣言（自作する場合）
1. 匿名クラスインスタンス化（関数型インタフェースの抽象メソッドをオーバーライド）
1. メソッドコールでオーバライドした処理を実行

ラムダ式を使用して、記述を省略してみましょう

## ラムダ式を使用する場合

ラムダ式の文法は下記のとおりです。（省略パターンがいくつもありますが、基礎文法を表記します）

```
(引数) -> {処理;};
```
※ }の直後に；を記述します。
~~これは、ラムダ式は関数を宣言しているのではなく、関数を変数に代入している「式」のため、末尾に；が必要だと解釈しています。~~
こちら、ご指摘いただきました。
｝後の；はラムダ式の一部ではなく、文の終端記号になります。

引数は関数がインタフェースで定義した抽象メソッドの引数と同じ型になります（変数名は任意）

```java:ラムダ式
// 関数型インタフェース宣言
interface SampleInterface {
  public String methodA(String word);
}

public class Sample {

  public static void main(String[] args) {

    // ラムダ式（変数にメソッドを代入しているイメージ）
    SampleInterface si = (String word) -> {return "Hello" + word;};
    System.out.println(si.methodA("yamada")); // -> Hello yamada
  }
}
```

匿名クラスを使用したときと比較して記述がシンプルになりましたね。
ここから更に省略できます。

## 引数部の省略

関数型インタフェースは、抽象メソッドが 1 つなので、型を推論することができるので省略できます

```java:引数部分の型省略
(word) -> {return "Hello" + word;};
```

※型を省略するときはすべて省略しなければエラーになります（一部の省略は不可です）

さらに引数が一つしかない場合については（）すら省略可能です。

```java:引数部分の型省略
word -> {return "Hello" + word;};
```

引数が無い場合は()を省略することはできません。

```java
() -> {処理;};
```

## 処理部の省略

ラムダ式の処理が 1 行しかない場合は return と｛ ｝を省略できます。

```java:省略前
(word) -> {return "Hello" + word;};
```

このコードが

```java:省略後
(word) -> "Hello" + word;
```

このように省略できます。

## 省略パターンまとめ

引数部についての省略

- 型を省略できる（関数型インタフェースはメソッドが１つなので推論できるため）
- 引数が一つの場合、（ ）も省略可能

処理部についての省略

- 処理が 1 行の場合、retun と｛ ｝を省略できる


次回は、streamAPIについてまとめたいと思います。
Macのspotlightが動かなかった時の備忘録

System PreferenceのGUIからやる方法や、`mdutil -E /`をいくら試してもダメだったがこのリンク先ので動いた。

https://discussions.apple.com/thread/8051299

まず現象としては、プリインストール以外のアプリが全く検索結果に出てこない。Chessとか出てくるのにSafariすら出てこない。

`mdutil -Ea`をすると以下のように

```
~ $ sudo mdutil -Ea
/:
	Indexing enabled.
/System/Volumes/Data:
2021-07-04 16:37:10.351 mdutil[12226:104306] mdutil disabling Spotlight: /System/Volumes/Data -> kMDConfigSearchLevelFSSearchOnly
	Indexing disabled.
```

`/System/Volumes/Data`を見てみると要するにドライブのルートなので、つまり何もインデックス対象になっていないことがわかる。

で、冒頭のリンク先にあった方法を試してみる。

```
sudo mdutil -Ea
sudo mdutil -ai off
sudo mdutil -ai on
```

以下が実際に実行した時のログ。最後の`sudo mdutil -ai on`を実行したときに`/System/Volumes/Data`のインデクシングが有効になったのがわかる。

```
~ $ sudo mdutil -Eav
/:
	Indexing enabled.
/System/Volumes/Data:
2021-07-04 16:37:13.272 mdutil[12246:104460] mdutil disabling Spotlight: /System/Volumes/Data -> kMDConfigSearchLevelFSSearchOnly
	Indexing disabled.

~ $ sudo mdutil -ai off
/:
2021-07-04 16:37:25.028 mdutil[12271:104756] mdutil disabling Spotlight: / -> kMDConfigSearchLevelFSSearchOnly
	Indexing disabled.
/System/Volumes/Data:
2021-07-04 16:37:25.097 mdutil[12271:104756] mdutil disabling Spotlight: /System/Volumes/Data -> kMDConfigSearchLevelFSSearchOnly
	Indexing disabled.

~ $ sudo mdutil -ai on
/:
	Indexing enabled.
/System/Volumes/Data:
	Indexing enabled.

```

実際、この後アプリがちゃんと検索できるようになった。
流体計算などのコーディングで気を付けること


# はじめに

いつもFotranで流体力学計算（初期値から始めてその時間発展）をしているものです。今回はそういう用途のプログラムのコーディングで僕が気をつけていることを紹介します。共同研究者に見せるために公開しますが、ちょっと内容が不足しているように思うので、加筆の予定です。

# 縦に見て、きれいに揃うようにする
コードをデバッグするとき、縦にコードをみていくことが多いです。その時変数の文字数がそろっているとデバッグしやすくなります。

以下では`n`個の変数がある3次元のテーブル(`i,j,k`)の補間をしています。例えばテーブルから`i`方向について`i`と`i+1`の間の`ri`:`1-ri`の位置にある値を取り出したいときを考えています。`j`,`k`についても同様です。こういうのは書き間違いが生じやすいのですが、以下のように書いておけば書き間違いに気がつきやすいです。

```Fortran:
      y(1:n) = (1.-ri)*( (1.-rj)*( (1.-rk)*x(1:n,k  ,j  ,i  )
     &       +                         rk *x(1:n,k+1,j  ,i  ) )
     &       +               rj *( (1.-rk)*x(1:n,k  ,j+1,i  )
     &       +                         rk *x(1:n,k+1,j+1,i  ) ) )
     &       +     ri *( (1.-rj)*( (1.-rk)*x(1:n,k  ,j  ,i+1)
     &       +                         rk *x(1:n,k+1,j  ,i+1) )
     &       +               rj *( (1.-rk)*x(1:n,k  ,j+1,i+1)
     &       +                         rk *x(1:n,k+1,j+1,i+1) ) )
```

# 似た変数は同じ文字数にする
コードを縦に見ると良いですよという話を続けます。以下のコードのほうが、

```Fortran:
 va(i,j,k) = fa(i,j,k)*dt
 vb(i,j,k) = fb(i,j,k)*dt
 vc(i,j,k) = fc(i,j,k)*dt
```
以下のものより読みやすいでしょう。

```Fortran:
 vone(i,j,k) = fone(i,j,k)*dt
 vtwo(i,j,k) = ftwo(i,j,k)*dt
 vthree(i,j,k) = fthree(i,j,k)*dt
```

文字数が違う場合にはしょうがなく配列の引数や()、=の位置を合わせるとよいと思います。ただ、行の始まる位置（インデント）には意味があることが多いのに、それを無視することになるので次善の策です。

```Fortran:
   vone(i,j,k) =   fone(i,j,k)*dt
   vtwo(i,j,k) =   ftwo(i,j,k)*dt
 vthree(i,j,k) = fthree(i,j,k)*dt
```

# 変数をnamespaceにまとめる
物理の計算をしているとエネルギーを`e`、フラックスを`f`とかの変数で置きたくなりますが、いろんなエネルギー、いろんなフラックスがあるし、そうでない用途で`e`,`f`を使いたくなるときもあります。こういうよく使う変数の名前の被りをさけるために`namespace`を使いましょう。　`Fortran`では`module`です。

僕は流体力学の計算をよくしているのですが、そのようにある座標系の中で場が時間発展していく場合を想定します。その場合以下の3つを違うnamespaceにまとめると良いです。
- 場の変数（密度とか速度）
- 座標系（各点の位置とか体積）
- 物理定数等
場の変数と座標系を分けるのは，サブルーチンの中で場の変数をコピーしたような似た変数が現れることがあるので、そのときに座標系は使うけど場の変数は使わないことがあり得ます。例えば以下のようにRunge Kutta（の最初の部分）を考えます。

```Fortran:
call func(rho,v,drho1,dv1)
rho1(:,:,:) = rho(:,:,:) + drho1(:,:,:) * dt
 v1 (:,:,:) =   v(:,:,:) +   dv1(:,:,:) * dt
call func(rho1,v1,drho2,dv2)
```

この`func`の中では座標系は使いますが、場の変数はコピーしたものが使われます。そういう時のために場の変数と座標系を分けておいたほうが良いです。

# メインループの中身を簡潔にする
メインプログラムはそのプログラムで何をしているの概要が分かるように書くのが良いです。あとで例を追加します。


# 参考文献
- [Fortranをコーディングする際に気をつけていること](https://qiita.com/implicit_none/items/9164c4d35d84e6e77f29)
：Fortranのコードの書き方に関することはこの記事が参考になります。
- [C++を使って数値計算をしている学部生へのアドバイス](https://qiita.com/shohirose/items/d06213fe28b6ba56b012)：C++の場合はこちらを参照のこと。
C言語　__attribute__((destructor))を使用したメモリリークチェック

## 関数属性を使ったデバッグ方法

`__attribute__((destructor))`を使用して、属性を付与します。
デストラクタ属性により、main（）が完了した後、またはexit（）が呼び出された後、関数が自動的に呼び出されます。

## コードと使用方法

以下のコードを記述したファイルを別途作成し、コンパイル時に巻き込んで、実行します。

リークがある場合は、標準エラー出力とleaksoutというファイルにエラーログが出力されます。

```c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

__attribute__((destructor))
void	destructor(void)
{
	int		status;
	char	buf[50];

	snprintf(buf, 50, "leaks %d &> leaksout", getpid());
	status = system(buf);
	if (status)
	{
		write(2, "leak!!!\n", 8);
		system("cat leaksout >/dev/stderr");
		exit(1);
	}
}
```

以下のようにして、宣言と定義を分けて書くこともできます。

```c
void end(void)__attribute__((destructor));

void end(void)
{
    system("leaks pipex");
}
```

## 参考

[Function Attributes - Using the GNU Compiler Collection (GCC)](https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Function-Attributes.html)
Vercelを使ってLINE Botを永続化する

本記事はこちら↓を参考に実施しています。
まずは「1.2」の項目を行なっていただきたいです。
「3. デプロイ」から仕様が変更されています。
＊Vercelはnow時代から仕様がちょくちょく変わる、とのことです。

https://qiita.com/n0bisuke/items/a5f49193fa68f28a7f25

Vercelを使うのが初めての方は、下記記事を参考に試行運転してもよいかもしれません。
＊今回はドメイン取得は不要です。

https://qiita.com/n0bisuke/items/901154531ea14f978bd4



では、プロジェクトのルート(package.jsonがある階層)に戻り、 `vercel` コマンドを実行します。

`https://<アプリ名>.vercel.app`というURLを取得できますが、
LINE Bot作成ではこのURLを開いてもエラー表示がされてしまいます。


ですが、これで問題ないはずです。
＊LINE仕様に作成したファイルなのでWeb上では開くことができないのだと思われます。


取得したURLを、
LINE Developer 　> messaging API設定 > Webhook URLの編集
にて、`https://<アプリ名>.vercel.app/webhook`というURLを設定します。

これでLINE Botを永続化できていると思われます。
WordCloudで長めの文章の世界を感じて遊んでみる（あいみょんの歌詞で遊んだときとの違いについて）

###はじめに

https://qiita.com/azumabashi/items/04968df239f2dd614de5

をやってみたので、今度は長い文章の場合の場合にどのようなチューニングが必要なのかを考えながら遊んでみます。
青空文庫から大和古寺風物詩（亀井勝一郎）と古寺巡礼（和辻哲郎）を探してそれぞれをフラットなテキストファイルにして保存しておきます。

https://www.aozora.gr.jp/

###大和古寺風物詩

```
import wordcloud
import matplotlib.pyplot as plt
import MeCab

bun = ""
with open('亀井勝一郎_大和古寺風物詩.txt') as f:
    for line in f.readlines():
        bun = bun + line.strip() 
wc = wordcloud.WordCloud(width=1000, height=600, background_color="white",
                        font_path=r"C:\windows\Fonts\meiryo.ttc",
                        stopwords=["し", "の", "いる", "もの", "こと", "する", "よう", "い", "れ", "さ", "これ","それ", "ある", "なっ", "ところ", "なる", "られ", "あっ", "あり", "れる"])
tagger = MeCab.Tagger()
word_kaiseki = tagger.parse(bun)
lines = word_kaiseki.split('\n')
selected = []
for line in lines:
    feature = line.split('\t')
    if len(feature) == 2:
        info = feature[1].split(',')
        hinshi = info[0]
        if hinshi in ('名詞', '形容詞', '動詞'):
            selected.append(feature[0])
wc.generate(" ".join(selected))
plt.imshow(wc)
plt.axis("off")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/9630c19b-9ae7-35d5-3033-d91b70611617.png)

###古寺巡礼
```
import wordcloud
import matplotlib.pyplot as plt
import MeCab

bun = ""
with open('和辻哲郎_古寺巡礼.txt') as f:
    for line in f.readlines():
        bun = bun + line.strip() 
wc = wordcloud.WordCloud(width=1000, height=600, background_color="white",
                        font_path=r"C:\windows\Fonts\meiryo.ttc",
                        stopwords=["の", "もの", "こと", "ある", "それ", "いる", "し", "する", "よう", "これ", "い", "あっ", "ない", "れ", "そこ"])
tagger = MeCab.Tagger()
word_kaiseki = tagger.parse(bun)
lines = word_kaiseki.split('\n')
selected = []
for line in lines:
    feature = line.split('\t')
    if len(feature) == 2:
        info = feature[1].split(',')
        hinshi = info[0]
        if hinshi in ('名詞', '形容詞', '動詞'):
            selected.append(feature[0])
wc.generate(" ".join(selected))
plt.imshow(wc)
plt.axis("off")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/6dc7eed4-b1ac-d056-42d4-770e64a70ddc.png)


##やってみて
亀井勝一郎と和辻哲郎、二人の着眼点の違いが浮き彫りになって見えてくる。
このままでもけっこういい感じだけれど、品詞を細分類の粒度で抽出するともっとシンプルになるかもしれない。
enebularでherokupostgres その5

#概要

enebularでherokupostgresに繋いでみた。
api設計してみた。

#方針

|task|アクション|get/post|in|out|
|:--|:--|:--|:--|:--|
|1|一件取得|post|form|json|
|2|一件取得|post|json|json|
|3|新規|post|form|json|
|4|新規|post|json|json|
|5|修正|post|form|json|
|6|修正|post|json|json|
|7|削除|post|form|json|
|8|削除|post|json|json|
|9|全件取得|get|-|json|
|10|全件取得|get|-|html|



以上。
syntax errorは奥が深い

```ruby
syntax error, unexpected tLABEL, expecting '='
```
結論から申し上げるとメソッドの引数のカッコとメソッド名の間には余計な空白を入れないようにという意味。
syntax errorのエラー文の一部にこのよう記述が。
syntax errorといえば構文エラーと言われていることが一般的で
スペルミス、　endの数が違う、,や:が抜けているなどが多い。

しかし今回のsyntax errorはそのどれも見直しても解決せず...
そこで一度固定概念を捨てもう一度エラー文の内容と向き合うことに。
すると冒頭で触れたエラー文がどうも気になった。

そこでGoogle先生のお力をお借りし調べてみると
結論で申し上げた内容が出てきて自身の記述の空白になっているところを全て詰めてみると
無事エラー解決！！

やはりいろんな切り口からエラーと向き合うことの大切さを痛感した。
enebularでherokupostgres その4

#概要

enebularでherokupostgresに繋いでみた。
データーベース設計してみた。

#ユーザー管理

```
create table users(
	email varchar UNIQUE NOT NULL,
	encrypted_password varchar NOT NULL,
	reset_password_token varchar,
	reset_password_sent_at datetime,
	remember_created_at datetime,
	name varchar,
	user_id integer,
	introduction text,
	profile_image_id varchar,
	created_at datetime NOT NULL,
	updated_at datetime NOT NULL,
);
```

#アセット機能

```
create table books(
	title varchar,
	body text,
	user_id integer,
	created_at datetime NOT NULL,
	updated_at datetime NOT NULL,
);
```

#いいね機能

```
create table favorites(
	user_id integer,
	book_id integer,
	created_at datetime NOT NULL,
	updated_at datetime NOT NULL,
);
```


#コメント機能

```
create table book_comments(
	comment text,
	user_id integer,
	book_id integer,
	created_at datetime NOT NULL,
	updated_at datetime NOT NULL,
);
```

#フォロー機能

```
create table relationships(
	follower_id integer,
	followed_id integer,
	created_at datetime NOT NULL,
	updated_at datetime NOT NULL,
);
```


#アドレス機能

```
create table adrresses(
	user_id integer,
	target_user_id integer,
	created_at datetime NOT NULL,
	updated_at datetime NOT NULL,
);
```

#メール機能

```
create table mail(
	from_user_id integer,
	to_user_id integer,
	title varchar,
	body text,
	created_at datetime NOT NULL,
	updated_at datetime NOT NULL,
);
```

#チャット機能

```
create table caht_rooms(
	created_at datetime NOT NULL,
	updated_at datetime NOT NULL,
);

create table chat_room_users(
	chat_room_id integer,
	user_id integer,
	created_at datetime NOT NULL,
	updated_at datetime NOT NULL,
);

create table chat_messages(
	chat_room_id integer,
	user_id integer,
	body text,
	created_at datetime NOT NULL,
	updated_at datetime NOT NULL,
);
```

#ポイント機能

```
create table point(
	name varchar,
	user_id integer,
	point integer,
);

```

以上。
pyplot・seabornをインポートしたときに応答がない問題

# はじめに
python3にて、matplotlib.pyplotおよびseabornをインポートしようとしたところ、エラー等が出ないうえに、出力も応答しないといった状況が発生しました。
#環境
wsl2
Ubuntu 20.04.2
GUI - VcXsrv

#やったこと
こちらのサイトにおける、**VcXsrvの自動起動設定**および**WSL上のディスプレイの設定**のセクションを参考にしてwsl環境でのディスプレイ設定を行いました。ありがとうございます。
https://qiita.com/ryoi084/items/0dff11134592d0bb895c

VcXsrvのPC起動時の自動起動方法については説明を割愛します。


wsl環境下でのディスプレイ設定を行うにあったって、コマンドプロンプトを起動し、`ipconfig`コマンドを実行、イーサネット(wsl)のIPv4アドレスをコピーします。


`~/.bashrc`に以下のように加筆していきます。aaa~dddには`ipconfig`にてコピーしたIPアドレスが入ります。


```shell:.bashrc
export DISPLAY=aaa.bbb.ccc.ddd:0
```


そして、wslを再起動、ここまでやってみました。
#依然としてトラブルが起こったが解決した
以上のことをやってみましたが、解決できるとき・できないときがありました。

コマンドにて`export DISPLAY=aaa.bbb.ccc.ddd:0`と実行したときに解決できたので、おそらく起動時のDISPLAYのアドレス設定に間違った値が入っているのではないかと考えました。


そこで、wslを再起動し、`printenv DISPLAY`でDISPLAYのパスを確認したところ、


```
8.8.8.8:0
```


このように表示されました。原因がわかりました。

以前、wslのプロキシ設定の際、DNSサーバーの設定でうまくいかなかったとき、とりあえず`/etc/resolv.conf`をgoogleのDNSを用いて`nameserver 8.8.8.8`にしておりました。

どういう理由かわかりませんが、この`/etc/resolv.conf`を参照してDISPLAYを設定していたため、VcXsrvへのパスが通らなかったと予想されます。

ということで、`/etc/resolv.conf`を以下のように直しました。


```/etc/resolv.conf
nameserver aaa.bbb.ccc.ddd
```


wslを再起動し、再度python3にてmatplotlib.pyplotおよびseabornをインポートしたところ、安定して応答がみられました。

以上で今回のトラブルとその解決方法でした。
模擬試験履歴(Udemy講座付属第2回の初回受験)


## 結果

![2021-07-04_22h27_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/199e64d0-3f1f-6cff-6c82-d8298d90bc9b.png)

2問選択形式で3択から絞れないパターンが多かった。
あと前回と合わせてRoute53、CloudFront、Lambda、Kinesis辺りが苦手なのを確認した。

## 復習

### ユーザー数増加に対応するためのアーキテクチャ構造

A. 負荷分散処理のためにELB及びRoute53での加重ルーティングを採用する

### EBSボリュームの選択

Q. 大規模ビックデータ向けの処理が多数発生する場合は？

A. 低レイテンシーを優先するならプロビジョンド、コスト最適化であるならスループット最適化HDD

### S3のストレージオプションの罠

Standard-IAは処理中のデータの一時的な保存場所には不適切。
ユースケースで言えば例えばある画像データをリサイズするとか高解像度にするなどの処理を加える際、元データを一時的に保存して作業が完了すれば元データは削除するというケースになるわけだが、作業中は元データにアクセスし続けることになるので、IAは向かないということなのだろう。
ちなみにRSSは非推奨なのでこの場合はStandardを選ぶのが正解。

### EC2インスタンス間のネットワーク遅延を少なくしたい

A. プレイスメントグループを設定する。

プレイスメントグループは単一のAZ内のインスタンスによる論理的なグループ。
EC2インスタンス間でのネットワーク待機時間の短縮、スループット性能の向上を期待したい場合はこれを選択する。
この場合、インスタンスタイプは拡張ネットワーキングをサポートするものを選択する。

### 特定のサービスへのアクセスに限定したい

Q. 例えばEC2インスタンスのアクセスを特定のS3バケットへのアクセスのみに限定したい場合はどうする？

A. EC2インスタンス側でIAMロール(ポリシー)を設定する

このように**アクセスを限定させたい方のサービス**でポリシーを設定する。
逆にS3からのアクセスを特定のEC2インスタンスに限定したい場合はバケットポリシーを設定する。

### EC2インスタンスに対してELBを設定し行うヘルスチェックについて

以下3つを使い分ける。

- インスタンスが正常かどうか……TCPヘルスチェック
- トランスポート層(TCP/UDP)が正常かどうか……UDP/TCPヘルスチェック
- アプリケーションの稼働が正常かどうか……HTTPヘルスチェック

### SQSってキューに優先順位つけることできるの？

A. 優先度付きキューを使えば設定したキューの処理のアクセス優先度を高くすることができる

### VPCにおいたEC2インスタンスがインターネットからアクセスできない

A.以下の4点を確認する

- インターネットゲートウェイがサブネットに設置されているか？
- ネットワークACLでアクセス許可しているか？
- セキュリティグループでアクセス許可しているか？
- インスタンスにパブリックIPアドレスは付与されているか？

### ECSを利用したDockerアプリケーションを構築した場合、DynamoDBへの権限付与は？

A.ECSタスクに直接DynamoDBへのアクセス権限をIAMロールで付与する。

例えば読み取り処理を許可したいなら読み取り権限を付与したロールをタスクに付与する。
従来はEC2コンテナインスタンスに付与だったが、この場合だとタスク別にロールを付与することができない(正確にはこの場合にロールに付与するポリシーはコンテナ、同一クラスタが実行するすべてのタスクへの権限を含んだものになる。例えば、S3へのアクセスは別のタスクに付与されるべきなのに、DynamoDBアクセスのタスクにも結果的に付与されてしまう)。
現在は、タスクごとにロールを付与できるようになったことで必要十分の権限の付与ができるようになった。

### Auto Scalingの設定順序

**AMIは必須**

1. AMIの準備
2. 起動テンプレート作成(ここでAMIのIDが必要)
3. Auto Scalingグループを設定する

### EBSのデータ保持に関して、最もデータの回復性が高くかつ即時復旧可能な方法は？

A. ミラーリング

### EC2インスタンスから接続できて、数百万IOPSかつ一貫したミリ秒未満のレイテンシーの高速パフォーマンスを実行でき、多数のデータ転送に耐えられるストレージは？

A. Amazon FSx for Windows

### ログ解析等で膨大なデータを蓄積した上で、後続のデータ解析を処理するためには？

A. Kinesis FirehoseでS3へのログ配信を行い、S3で蓄積しつつその後ログの解析処理を実行させる

ちなみに、リアルタイム性が必要ならDynamoDBにDAXクラスターを準備するという手段もある。
深層学習

#入力層～中間層
#活性化関数
#出力層
#勾配降下法
#誤差逆伝播法
#勾配消失問題
#学習率最適化手法
#過学習
次元削減で対応する
#畳み込みニューラルネットワークの概念
#最新のCNN
MacBookのステッカーを家の不織布マスクで綺麗に剥がす誰でもできる簡単な方法！！

## TL;DR
不織布マスクでこする

---

驚くほど簡単に取れたのでご紹介します。
つるつるですつるつるさらさら
## 必要なもの
- [x] ステッカーが貼ってあるMacBook
- [x] 食器用洗剤(私はJOYを使いました)
- [x] 使い捨ての不織布マスク <= これがすごいです:bangbang:
- [x] 水
- [x] ティッシュ

### 1. まずは自力でステッカーを剥がす
爪を犠牲にするか、プラスチックのカードを使って剥がせるところまで剥がします。
### 2. 洗剤を塗る
食器用洗剤を、糊が残ってしまったところにぬりぬりして1分ほど待ちます。
### 3. ごしごしする
マスクの真ん中の一部分に食器用洗剤をつけて(半透明になるくらい)、糊が残っているところをマスクの真ん中の部分を使って擦ります。
糊の形によって攻めやすいところが違うので、円を描くようにこすります。
### 4. すすぐ
あわあわのままだとべとべとでぬるぬるなのでじゃーしてふきふきします。
水分が天面から垂れては故障する可能性があるため、側面などを拭けるティッシュも近くに用意しておくとｱﾝｼﾝ!(´▽｀)
水をティッシュに含ませMacBook上に伸ばして、乾いたティッシュで拭き取ります。
水分を拭きとったティッシュのにおいを嗅いで、洗剤の匂いがしなくなったら完了です:grey_exclamation:
macOS BigSurでアイコンを書き換える

>注: この記事ではmacOSの一部を書き換える、大変危険な行為を行います。リスクを理解し、全て自分で対処できる方のみ自己責任で行なってください。筆者は一切の責任を負いません。

ターミナルで```/System/Applications/```をrootで開き、該当アプリをデスクトップなどにコピー。
右クリックして情報を見る→左上のアイコン欄にコピペ→名前を適宜変更してからアプリケーションフォルダに戻す。Info.plistなども同じ方法でできるかも。

アイコン取得の元ファイルを見るだけなら
```sudo open /System/Applications/xxx.app/Contents/Resources/```
Parallels Desktopを使いMacBook Air M1チップ搭載機でPower BI Desktopを動かす（準備編）

※Parallels DesktopとPreviewのARM版Windows10のインストール手順はこちらを参考にさせて頂きました。

https://qiita.com/segavvy/items/306bd6574a42c35d860c

##インストールと起動まで確認

ARMアーキテクチャ採用のApple M1チップ搭載のMacBook Airの懸念点は、Boot Campを使えないことでした。
Windowsが起動できす、Power BI Desktopが使えない不安があったからです。

Parallels Desktop 16 for MacがM1に対応したと知りましたが、M1で動くWindows Insider PreviewのARM版Windows10上でPower BI Desktopが稼働するという情報は得られませんでした。

https://www.parallels.com/jp/pd/general/

https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewARM64

試しました。
日本語入力ができず、その対処に想定以上に手間どりました。
結果、まだ日本語入力ができないのですが、その手順はスキップしました。
Power BI Desktopがインストールでき、起動することろまでは確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/e910a447-58a0-dbe9-22d9-f35bb4d60e75.png)

とりあえずここまでとし（ここまで進めて使えない機能がぞろぞろ出てくるとショックなので）、後日各種機能が使えるかを確認することにしました。

**了**
visual studio for mac でhttps開発証明を有効にする方法

結論、下記参照リンク通りに実行すればOK
https://docs.microsoft.com/ja-jp/aspnet/core/security/enforcing-ssl?view=aspnetcore-5.0&tabs=visual-studio#trust-the-aspnet-core-https-development-certificate-on-windows-and-macos

visual studioの実行を一度止めて再実行すると解決



ただ、上記結果に行き着くまでに色々間違えた。

コマンド実行時に「dotnetがキーチェーンに含まれるキー　〜」というダイアログが繰り返し表示され、解決方法を間違えた。

PCログインパスワードを入力したが再度ダイアログが表示されるため、
別のパスワードか？と思ってしまった私は、色々と調べて最終的にxcodeまでインストールしてしまった。

ただそれでも解決はできず、ネットで原因をさらに調べたところ、
パスワードはやはりPCログイン用で合っており、
別のプログラムが実行されたため、再度表示されただけだった。
ダイアログ内の「常に許可」を選択したら表示されなくなった。
ページ内ナビゲーションの現在地の表示は IntersectionObserver を使うと良さそう

ここ最近、ウェブページ内ナビゲーションの現在地の表示（カレント表示）を実装する時は [IntersectionObserver](https://developer.mozilla.org/ja/docs/Web/API/Intersection_Observer_API) を使っています。
以前はスクロールイベントで位置を取って計算していましたが、 IntersectionObserver を使った方が簡単に実装できる上、パフォーマンスの観点でも良いとのことなので、使い方をメモしておきます。

サンプルのデモは[こちら](https://jsfiddle.net/minojiro/6uwd0mqe/17/)

## サンプルの解説

```html
<div class="nav">
  <ul>
    <li><a class="navBtn" href="#section1">section1</a></li>
    <li><a class="navBtn" href="#section2">section2</a></li>
    <li><a class="navBtn" href="#section3">section3</a></li>
  </ul>
</div>

<div id="section1" class="section">section1</div>
<div id="section2" class="section">section2</div>
<div id="section3" class="section">section3</div>
```

```js
const ACTIVE_CLASS_NAME = 'active';
const buttons = document.querySelectorAll('.navBtn');

buttons.forEach(button => {
  const target = document.querySelector(button.getAttribute('href'));
  const observer = new IntersectionObserver(([{isIntersecting}]) => {
    if (isIntersecting) {
      buttons.forEach(el => el.classList.remove(ACTIVE_CLASS_NAME));
      button.classList.add(ACTIVE_CLASS_NAME);
    }
  });
  observer.observe(target);
})
```

1. それぞれのナビのボタンの `href` 属性から、ターゲットの要素（この例だと #section1, #section2, #section3）を取得します。
2. `new IntersectionObserver` でコンストラクターを呼び出し、オブザーバーを作成します。
3. オブザーバーのコールバックとして、ボタンの現在地の表示を切り替える処理を渡します。このコールバックは、画面内にターゲットが見えるようになった時と、見えなくなった時の両方で呼ばれます。見えるようになった時のみに処理が走るように、 [`isIntersecting`](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserverEntry/isIntersecting) を条件に加えます。
3. あとは、監視するターゲット要素を与えてあげるだけです！

ちなみに、どの時点で画面に入ったとするかのタイミング（しきい値）なども、オプションで自由度高くコントロールできてとても便利です。

以上！
【AtCoder】ABC208をPython3で解説

ABC208の解説。

https://atcoder.jp/contests/abc208

## A - Rolling Dice
### 解説 

1-6まで書かれた6面サイコロを$A$回振ったとき、でた目の合計が$B$になるのかという問題。

例えば、サイコロを2回振ったとき、$B$が11ならば、$6+5=11$で成立する。しかし、$B$が13ならば、足しても最大12にしかならない。

つまり、サイコロを2回振ったときに表せる合計値は、$2 = 1+1 \leq B \leq 6+6 = 12$の範囲にある数値である。これを定式化すると、$A \leq B \leq A \times 6$となる。

### コード
```python
a, b = map(int, input().split())

if a <= b and b <= a*6:
    print('Yes')
else:
    print('No')
```

## B - Factorial Yen Coin
### 解説 
$1!$円、$2!$円、$3!$円、...、$10!$円の硬貨を用いて、$P$円の商品をお釣りが出ないようにして、最小の枚数で支払うという問題。
なお、条件として、硬貨を何枚か使えば、必ず1通りはちょうどの金額になるように設定されている。

最小の枚数で支払うということは、**できるだけ金額が大きい硬貨を使うべきである。**

例えば、現実世界において、100円ショップで最小の枚数で支払おうとするならば、100円玉1つと10円玉1つの計2枚が最小の枚数である。もちろん現実世界では、1000円札を出すこともできるが、今回はおつりがでないようにしなければならない。

では、おつりがでないようにするにはどうすればよいか。それは、**商品の値段から、その値段を超えない最大の硬貨の金額を引き続けることである。**

例えば先程の例で説明すると、110円の商品に対して、まず10000円札を検討する。10000円は110円よりも大きく、おつりがでるので、これはスキップする。同様に5000円札、1000円札、500円玉もスキップされる。そして、100円玉は110円よりも小さい、つまり、おつりがでないので、$110-100=10$となり、残りが10円に入れ替わる。50円玉を検討しても、お釣りが出てしまうので、同様に10円玉を検討して、ちょうどの金額となる。

これを同様に高橋王国の硬貨に対して行えばよい。

### コード
```python
from math import factorial

p = int(input())
ans = 0

for i in range(10, 0, -1):
    while p >= factorial(i):
        p -= factorial(i)
        ans += 1

print(ans)
```

## C - Fair Candy Distribution
### 解説 

$N \geq K$ならば、全員にお菓子を配る。お菓子$K'$が$N$以上になれば、国民番号が早い人からお菓子を配っていくという問題である。

まず、$N \geq K$だが、これは$K$を$N$で割ってあげると、ひとりあたりのお菓子の個数が求められる。（全員同じ数）これは、$K // N$でかんたんに求められる。

この値を辞書に保存しておく。```alist```に対して、ループを回し、該当するkeyにvalueである、ひとりあたりの個数を入れていく。

どうやって国民番号が早いか認識するかというと、```sort```するのが一番手っ取り早い。$K$を$N$割って求めた、あまりのお菓子をひとつずつ分けていく。つまり、```sort```したリストの先頭【あまり】番目までの値のリストを作成し、これを辞書に参照して、辞書内で新しく作ったリストの数値が見つかれば、1を足すという仕組みである。


### コード
```python
N, K = map(int, input().split())
alist = list(map(int, input().split()))

d = {}

total = K//N
rest = K % N

for a in alist:
    d[a] = total

sort_alist = sorted(alist)
sort_alist_lead = sort_alist[:rest]

for sal in sort_alist_lead:
    d[sal] += 1

for dv in d.values():
    print(dv)
```

## 編集後記

なるはやで解説書いたので眠いです。おやすみなさい。
【M1 mac】Android Studioでインストールしたエミュレータが応答しない

ハマったのでメモ。

## インストール作業

- ↓の記事を参考にエミュレータのインストール作業。ただし、作業時点ではsystem-imageのRelease Name “R”がなかったので "S"を選択。
- 参考: https://applech2.com/archives/20210407-avd-manager-can-download-apple-silicon-android-emulator.html
- インストール完了、エミュレータ起動を確認。
  - エミュレータ上で開発者オプションがオフだったのでオンに。


## つまづき状況

- エミュレータを起動してもandroid上のプルダウンメニューでエミュレータを選択できない
- runボタンを押してみても `No Connected Devices Found`
- adb devicesを確認してみるとemulator offlineとなっている。うーん。

```
$ adb devices
List of devices attached
emulator-5554   offline
```

## 解決方法

- AVD Managerからダウンロードしたsystem-imageがRelease Name "S"のrevision: 3となっているが、このリビジョンが壊れているらしい？(末尾の記事を参照)
- 最新リビジョンから、revision: 2にダウングレードすると解決。
- ダウングレード手順:
  - `~/Library/Android/sdk/system-images/android-S/google_apis`内を下記のファイルで置換
  - https://dl.google.com/android/repository/sys-img/google_apis_playstore/arm64-v8a-S_r02-darwin.zip


## 参考
https://stackoverflow.com/questions/67230200/emulator-appearing-offline-on-m1-mac-after-the-last-update-of-arm64-v8a#answer-67261231
M5Stackシリーズでシリアル通信（送信・受信）

## M5Stackとシリアル通信

M5StackはESP32というWiFiもBluetoothも使える優れモノチップが搭載されている為、「通信はネット・リモート経由で！Bluetoothで！」といったところに走ってしまいがちですが、結局バッテリーが小さい等の都合で母体に繋げて動作させる場合は、**「USB（給電＋シリアル通信）」**って解もあっていいと思います。

といっても、M5Stackでシリアル通信って当たり前すぎて逆に詳しく書かれていないのかなと感じまして、こちらに残しておきたいと思います。

## シリアル通信確認方法

1. ツール＞シリアルモニタでシリアルモニタが開きます。（予め通信ポートは設定しておく）
![スクリーンショット 2021-07-05 000921.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65983/c6c51f54-139f-451f-c852-f1272fdd1f5f.png)

2. ウィンドウの上部に文字列を入力し、EnterでPCから送信（M5Stackは受信）、下部にM5Stackから送信されたデータが受信されます。
![スクリーンショット 2021-07-05 001616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65983/8a8177b6-fe85-ffc1-a95e-64636f6259ce.png)

## 通信方法

では、Arduinoでは良く書かれている手法（のちょっとアレンジを加えたやり方）をご紹介。
その前にArduinoと異なるポイントとして

- `Serial.begin();`は書かない。（既にライブラリ側で開いているのでエラーになります）
- Stringオブジェクトの`replace()`関数等は戻り値ではなくそのものの値が反映される。

注意点でした。

## 送信

送信は簡単です。

```cpp
  // text = 
  Serial.println(text);
```

`text` に文字列をセットします。

## 受信

受信は少し工夫しています。待ち受けないといけないのでloop内に実装します。

```cpp:loop()内に実装
  if (Serial.available()) {
    String text = Serial.readStringUntil(0x0a);
    if (text.length() > 0 && text.startsWith("*")) {
      text.trim();
      text.replace("*","");
      // = text
    }
  }  
```

`改行(LF)`のキャラクターまで受信を待つ仕組みになっています。
もう一つのやり方(readString)だと、1行につき文字列が送られるのを１秒待つことになります。
１秒の数字は変えられますが、じゃあどこまで減らせるかと考えると、終了文字列を決めてその文字列がやってきたら即次の処理に移せた方が理想かと思われます。

`"*"`の文字列で始まったときの処理はloop関数内にて待機させる際に、重複して読み込まれてしまう可能性があります。重複２回目のデータは不完全な文字列となるので、リードエラーを防ぐ為に実施しています。

という事で、結果シリアル通信でPCから送信する（M5Stack側で受信される）データは

```
*blahblahblah<改行>
```

という感じになります。結果(`text`の値)は`blahblahblah`がセットされますが、上記の例ではもちろんデータ内に`*`の文字列が使えなくなります。
使いたい場合はプログラムの文字列を別なものに変えると良いでしょう。

## 実際に通信してみて

- １度に通信できる文字列は詳しく計測していませんが、150～160文字ぐらいの様です。
- 上記の手法だと、待ち受け時間が短縮される為、実装処理に時間をかけなければ、高速にデータやり取りができると思います。
[メモ]twitch api 使い始めまで

#twitch API利用開始の流れ
## 公式ドキュメント
これが最初で https://dev.twitch.tv/docs/api
こっちが認証周り https://dev.twitch.tv/docs/authentication

## 手順
1.https://dev.twitch.tv/console/apps でクライアントIDとシークレットを取得（※1）
2.アクセストークン取得

```
curl  -X POST 'https://id.twitch.tv/oauth2/token
?client_id=【クライアントID】
&client_secret=【シークレット】
&grant_type=client_credentials　(これは固定）
&scope=user:edit' (https://dev.twitch.tv/docs/authentication/#scopes ここ参照)

{"access_token":"アクセストークン","expires_in":XXXXXX,"scope":["user:edit"],"token_type":"bearer"}
```

3.お試しリクエスト
Fortniteの配信者情報を取得

```
% curl -H 'Client-ID: 【クライアントID】' \
-H 'Authorization: Bearer 【アクセストークン】' \
-X GET 'https://api.twitch.tv/helix/streams?game_id=33214'

{"data":・・・なんかめっちゃ長いのズラズラ}%
```
AtCoder Beginner Contest 208 参戦記

# AtCoder Beginner Contest 208 参戦記

## [ABC208A - Rolling Dice](https://atcoder.jp/contests/abc208/tasks/abc208_a)

1分半で突破. 最小値は1のゾロ目、最大値は6のゾロ目なので、その範囲かをチェックすればいい.

```python
A, B = map(int, input().split())

if A <= B <= 6 * A:
    print('Yes')
else:
    print('No')
```

## [ABC208B - Factorial Yen Coin](https://atcoder.jp/contests/abc208/tasks/abc208_b)

6分で突破. n! は (n-1)! の倍数なので、大きい硬貨が使えるときに、小さい硬貨を使ったほうが枚数が少なくなるパターンはない. なので大きい硬貨から順に使えるかチェックしていけばいい.

```python
P = int(input())

x = 3628800  # 10!
y = 10

result = 0
while P != 0:
    n = P // x
    if n != 0:
        result += n
        P -= n * x
    x //= y
    y -= 1
print(result)
```

## [ABC208C - Fair Candy Distribution](https://atcoder.jp/contests/abc208/tasks/abc208_c)

6分半で突破. KをNで割った余り人だけ1個余分にもらえる. インデックスと値の組を値でソートすれば、どの人が余分にもらえるか分かる.

```python
N, K, *a = map(int, open(0).read().split())

result = [K // N] * N
for i, _ in sorted(enumerate(a), key=lambda x: x[1])[:K % N]:
    result[i] += 1
print(*result, sep='\n')
```
文字列類似度　備忘録

# 文字列類似度

編集距離アルゴリズムを使った処理を作っているが
少し疲れてきたので気分転換にもっとお手軽に類似度を計算できる処理を少し考えてみたので
メモとして残しておく。

定義量少ないのを優先した実装であり、別に早くはないし、編集距離とはちょっと違う結果になるが
さくっと類似度を取得したいといった場面に有効かとおもう。

## pythonの場合
```python
from collections import Counter
def similar(a, b):
    lensum = float(len(a) + len(b))
    ca, cb = Counter(a), Counter(b)
    dist = sum(((cb - ca) + (ca - cb)).values())
    return (lensum - dist) / lensum
```

## C++の場合
```c++
template <typename T, typename U>
double similar(T* a, std::size_t A, U* b, std::size_t B) {
    std::size_t dist, lensum, i, j;
    lensum = dist = A + B;

    std::unordered_multiset<U, through_hash> map;
    for(i = 0; i < B; i++)
        map.emplace(b[i]);

    for(j = 0; j < A; j++) {
        T key = a[j];
        if(map.count(key)) {
            map.erase(key);
            ----dist;
        }
    }
    return (double)(lensum - dist) / lensum;
}

```

# もう一つのアプローチ
　ビットパラレルのアルゴリズムを学ぶ中で、思いついたもう一つのアプローチ。
　上のsimilarよりも5倍ぐらい速く、編集距離の結果に近い。
　Python3の整数ビット数に制限がないと初めて知った。fem
　Pythonだとちょい速くなったかもぐらいだけど、
　C++の生配列とlog2の部分を若干工夫してやるとメッチャ速かった。

```python
import math
from collections import defaultdict

def similar2(a, b):
    A = len(a)
    B = len(b)
    if A > B:
        return distance(b, a)

    ## ここまで前裁き。
    fp = defaultdict(int) # 長い方の文字 bを検索のために保存しておくストレージ
    lensum = dist = A + B # 両方の文字合計からスタートし、一致を見つけたら減算し残ったものが編集距離
    
    i = j = 0
    for y, bi in enumerate(b):
        fp[bi] |= 1 << y ## myers1999のアルゴリズム、、

    while(i < A and j < B):
        ai = a[i]
        
        if(ai == b[j]): # 一致
            dist -= 2
        else: # 不一致なんだけど
            trb = fp[ai] >> j #前方に一致するものあったか
            if(trb):
                dist -= 2 # あったら先読みして一致
                j += int(math.log2(trb & -trb)) # 一致したところまで早送りして次の周回へ
        
        i += 1
        j += 1
    
    return (lensum - dist) / lensum
```
エンジニアの名刺を自作してみた（初投稿）

初投稿です！よろしくお願いします！
認識違い等あるかもしれませんが、悪気はないのでやんわりとご指摘いただければと思います。

# 作成の動機
- フリーランスエンジニアに興味があって、これから人脈を拡げていこうと思ってる時に、名刺があったほうが人と繋がりやすいかなと思ったため。
- 自分の会社で名刺をもらってなくて、時々人から名刺を求められた時に出せないのがなんとなく歯がゆかったため。
- オリジナルの名刺とか作ったらかっこいいかなと思ったため。

# 作成の手順
- 画像編集ソフトを選ぶ
- 名刺データを作成
- 名刺データを印刷できるフォーマットで保存(jpeg等）
- 印刷方法を選ぶ
- 印刷

# 各手順の詳細
- 画像編集ソフトを選ぶ
    - 自分は普段からLinuxのPCを使っているので、「名刺 作成 Linux」とかで検索して上位に出てきたこちらのソフト(EdrawMax)を使いました。（Windows, Mac, Linuxに対応しています）
        - https://www.edrawsoft.com/jp/business-card.html
    - ただ、後で述べるように有償版でないと実用に耐えないので、無料で作成できるツールがあればそれでもいいと思います。
    - 個人的には操作性が気に入って仕上がりも満足だったので、（少し値が張りますが）有償版を購入しました。
- 名刺データを作成
    - 画像編集ソフトを使った名刺作成に慣れていない場合は、最初はテンプレートを使ったほうがいいと思います。無償版のEdrawMax用のテンプレートは[こちら](https://www.edrawsoft.com/jp/business-card-templates.html)からダウンロードできます。
- 名刺データを印刷できるフォーマットで保存(jpeg等）
    - EdrawMaxでは、「名前をつけて保存」で保存するファイルの保存形式を変えてあげればOKです。ただし、無償版だとエクスポートの際に試用版であることを示すグリッド線が全体に入ってしまうので、印刷前に必ず有償版に切り替える必要があります。
- 印刷方法を選ぶ
    - 最近ではコンビニでも名刺を印刷できるサービスがあります
        - https://mymeishi.net/
    - ただ、写真用紙に印刷する形なので、個人的には名刺っぽさが損なわれてしまう感じがして、あまりおすすめはしないです。あくまで急に名刺が必要になった時の応急処置的な方法として考えておくべきかなと。
    - 自分はラクスルを使いましたが、100枚で500円とかなので気軽なノリで注文できました。（こういうのって業務用だからもっとするのかと思いきや）
        - https://raksul.com/businesscard/
- 印刷
    - ここの手順は業者によると思います。
    - ラクスルの場合、先に決済してから入稿する形になるので注意が必要です。
    - 特に急ぎでない場合も、受付から３営業日〜５営業日程度で出荷されます。

# 名刺に何を書くか
- ここは人それぞれだと思いますが、そもそも名刺に何を求めるかを考えるのが出発点になるんじゃないかと思います。
    - 個人的には、以下の３点で考えました。
        - 最低条件として、自分と連絡が取れるようになること→連絡先など
        - 名刺を渡す相手は普通初対面なので、話の糸口になること→趣味など
        - 仕事をもらえる可能性が大きくなること→業務経験など
- 大まかな方向性が決まったら、次に、具体的に名刺に載せる情報を考えます。情報量が多すぎてももらった相手が面食らってしまう可能性があるので、極力シンプルになるよう、厳選します。この時、片面印刷にするか、両面印刷にするかも検討します。上記３点を軸にする場合、それなりの情報量になってしまうので、両面印刷がいいと思います。
- 最後に、配置を考えます。両面印刷の場合、どの面にどの情報を載せるかを考えます。
    - 自分の場合は、原則として変更されない基本的な情報を表面に、しばしば変更される可能性がある情報を裏面に配置しました。こうすることで、年月が経って情報が古くなってしまった場合にも、裏面だけ変更すればいいという魂胆です。

# 名刺を自作してみて思ったこと
- 名刺のデザインってすごく難しそうな印象がありましたが、テンプレートを使ったら思ったよりずっと簡単にできました。
- サイズとかもわからなかったし、テンプレートがお手本みたいになって、中身の文章変えたり、図形の色を変えたりすれば良くなったので、はかどりました。
- 慣れてくれば自分でもデザインできるようになると思いますが、最初は真似から入るのがいいですね。
- 作ってるうちにだんだん楽しくなっていくので、自作はおすすめです。たぶん集中してやれば２日くらいである程度満足いくレベルの名刺ができるんじゃないかと。
Laravel Mix コンパイル時のOS通知を無効にするには

Laravelでアプリ開発していると、必ずといっていいほど、`Laravel Mix`にお世話になります。この `Laravel Mix` というのは、`resources` フォルダに入っているCSSとJavaScriptをコンパイルして圧縮しちゃう便利なパッケージです。

今回は、`npm run dev` とコマンドで打って`Laravel Mix` 実行後のOS通知を無効化する便利な書き方があったのでご紹介。

```js:普通のwebpack.mix.js
mix.js('resources/js/app.js', 'public/js').postCss('resources/css/app.css', 'public/css', [
    require('postcss-import'),
    require('tailwindcss'),
    require('autoprefixer'),
]);
```

だいたい、素のLaravelとBreezeをインストールした後だと、↑のようになっていると思います。`disableNotifications` メソッドを加えることで `Laravel MIX` のOS通知を無効化することが可能です。

```js:通知を無効化するwebpack.mix.js
mix.js('resources/js/app.js', 'public/js').postCss('resources/css/app.css', 'public/css', [
    require('postcss-import'),
    require('tailwindcss'),
    require('autoprefixer'),
]).disableNotifications(); // 追加したメソッド
```

この様に `disableNotifications` メソッドを加えることで、通知の有無を制御することが可能になります。`run dev watch` などを利用して、頻繁にコンパイル作業をするかたは、是非使ってみると良いメソッドだと思います。

参考：https://readouble.com/laravel/8.x/ja/mix.html
機械学習向けのデータ分割法４種

# はじめに
機械学習のモデルを生成する際は、所持するデータを以下の２種（または３種）にきちんと分割して訓練及びテストを行う必要があります。

・訓練データ（Training data）
（・検証用データ（Validation data））
・テストデータ（Test data）

訓練データにテストデータが混じっていると、生成したモデルの性能を正しく評価することができなくなる可能性があります。そのため、あらかじめどのようにデータの分割を行うかを決めておく必要があります。
機械学習を行うための基礎知識として、データの分割によく使用する手法を４つ紹介します。

# 目次

| 項番 | 項目 |
|:-:|:-|
| 1  | [ホールドアウト法（Hold-out）](#1-ホールドアウト法hold-out)  |
| 2  | [ランダムサブサンプリング（Random Subsampling）](#2-ランダムサブサンプリングrandom-subsampling) |
| 3  | [交差検証（Cross-validation）](#3-交差検証cross-validation) |
| 4  | [層化抽出法（Stratified Sampling）](#4-層化抽出法stratified-sampling) |

# 1. ホールドアウト法（Hold-out）
最も初歩的な分割方法。
テストのためのデータを一定量確保しておき、残りのデータを訓練に使用する。

![a1_holdout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390918/18515a6e-19f2-57e4-258a-5cb49e19e1df.png)


# 2. ランダムサブサンプリング（Random Subsampling）
ランダムにデータを抽出して訓練データセットを構築し、抽出されなかったサンプルをテストに使用する方法。
データセットの構築とテストを複数回行い、全試行の平均を最終的な評価結果として採用する。
Hold-outよりも評価結果の信頼性を高めることができる。

![a1_randomsubsampling.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390918/f6baa1fd-7629-7f36-43f1-9021b11c5a71.png)


# 3. 交差検証（Cross-validation）
① k分割交差検証（K-fold Cross-validation）

2. データを同じサイズのk個のサブセットに分割する。
2. １つのサブセットをテストとして使用し、残りを訓練として使用する検証を、サブセットの数だけ繰り返す。
2. 全試行の平均を最終的な評価結果として採用する。

全てのデータがテストに使用されるため、ランダムサブサンプリングよりも評価結果の信頼性を高めることができる。

### 10分割の場合

![a1_10foldCV.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390918/71edc945-d689-1e69-5031-05659b0b31d7.png)

② 一個抜き交差検証（Leave-one-out Cross-validation）

サンプル数と同じだけデータをサブセットに分割をする交差検証。（k分割交差検証のkをデータ数とした場合と同じ。）
計算コストはかかるが、データを最大限活用することで評価結果の信頼性を高めることができる。

![a1_leaveOneOutCV.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390918/e3834814-5473-505a-3f51-84d79405ca74.png)


# 4. 層化抽出法（Stratified Sampling）

データを分割する際に、各クラスの比率を変えずに訓練及びテスト用データセットを構築する方法。
クラス間のデータの偏りを考慮してデータセットを構築することができる。

![a1_StratifiedSampling2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390918/c3891a73-8d3b-80fd-385f-36a6380831f9.png)


# 終わりに

備忘録として、よく使用するデータ分割法を簡潔にまとめました。
また知識がアップデートされたら追記・更新します！
残プロ　第-33回　~セレクトによってフォームを制御する~

# select.valueを取得

BootStrapを使用して以下のような表を作成しました．
querySelectorでselectタグを探し，valueを取得することで条件処理を行います．
innerHTMLに代入する値は文字列なので，変数を使用する場合は+で文字列の結合を利用します．


~~~ html:
<table class='table table-striped table-responsive-sm'>
    <thead class='thead-light'>
        <tr>
            <th scope='col-lg-4'>タスク名</th>
            <th scope='col-lg-1'>期限[日]</th>
            <th scope='col-lg-1'>期限[時間]</th>
            <th scope='col-lg-4'>繰り返し</th>
            <th scope='col-lg-1'>重要度</th>
            <th scope='col-lg-1'></th>
        </tr>
    </thead>
    <tbody>
        {% for task in tasks_csv[1:] %}
        <tr id={{ task[0] }}>
            <th scope='row'>{{ task[1] }}</th>
            <td>{{ task[2] }}</td>
            <td>{{ task[3] }}</td>
            <td>{{ task[4] }}</td>
            <td>{{ task[5] }}</td>
            <td>
                <div class="form-group">
                    <select class="form-control" onchange="taskEdit();">
                        <option value="">-</option>
                        <option value="Edit">Edit</option>
                        <option value="Delete">Delete</option>
                    </select>
                </div>
            </td>
        </tr>
        {% endfor %}
    </tbody>
</table>

<script>
    let row;
    let select;
    let tasks = {{ tasks_csv|tojson }}
    let len = tasks.length

    function taskEdit(){
        for (let i=1; i<len; i++){
            row = document.getElementById(tasks[i][0]);
            select = row.querySelector("select");
            if (select.value==""){
                row.children[0].innerHTML = '<th scope="row">'+tasks[i][1]+'</th>';
                for (let j=1; j<5; j++){
                    let column = row.children[j];
                    column.innerHTML = '<td>'+tasks[i][j+1]+'</td>';
                }
            }
            else if (select.value=="Edit"){
                for (let j=0; j<5; j++){
                    let column = row.children[j];
                    column.innerHTML =　'<td><input type="text" class="form-control"></td>';
                }
            }
        }
    }
</script>

~~~
旧バージョンのUnityを導入するときの手順

## はじめに

古いバージョンのUnityで作成されたプロジェクトをUnityHubから開こうとすると、画像のような警告が出てきます。
![(masked)unity_old_version_warning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682277/bc88bcca-126d-fde9-d7aa-8f133284aafb.png)
この記事は、画像のような警告が出ているプロジェクトが開けるように、古いバージョンのUnityを導入する方を解説とした記事となります。

本記事で登場するUnityHubのバージョン(※)は以下の通りとなります。

- UnityHub : 2.4.3

※ UnityHubのバージョンは、UnityHubのウィンドウ右上の歯車ボタンから環境設定画面を開き、詳細のタブから確認できます。

## 導入手順
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682277/d5cce788-029f-bfc7-7d6c-ff5285ee414e.png)
UnityHubの「インストール」タブから、「インストール」を選択します。
![unity_select_version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682277/0956962b-6d71-5511-4e87-d61c4fd8b158.png)
「Unityバージョンを加える」というポップアップが表示されると思います。利用したいバージョンがこの中に含まれている場合はそのまま選択して次へを選択すればいいのですが、（LTS版が主のため）大体の場合はないと思います。

その場合は、「ダウンロード アーカイブ」を選択しましょう。
![unity_select_version_dl_archive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682277/8df979f5-bd12-52df-2f8a-2df62b4a8499.png)
すると、「Unity - Download Archive」というページが表示されると思います。この中から、利用したいバージョンを探して、緑色の「Unity Hub」と書かれたボタンを選択しましょう。
![add_old_version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682277/eefaaba6-193a-6bf9-ef16-c0b0481f83da.png)
ブラウザでの操作のあと、UnityHubに追加するモジュールを選択する画面が出てきます。後は、普通にUnityをインストールしたときと同じ手順で、必要なものだけを選択して、「INSTALL」を押すと、インストールが開始されます。
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682277/80fe94bb-a7d9-e420-083b-3af6984a910d.png)
使いたかった旧バージョンのUnityがインストールされました。これで過去のプロジェクトでも問題なく編集できますね。

以上、旧バージョンのUnityを導入するときの手順でした。皆様のゲーム制作のお役に立てていればうれしいです。
[Vue warn]: Error in callback for immediate watcher "data"の解決方法


つい先日Element UIを触っていた際に、ふとコンソールを開いてみると下記の画像のようなエラーが出ていました。動作自体は特に問題なさそうでした。

**Element UI**
https://element.eleme.io/#/en-US
![スクリーンショット 2021-07-04 22.53.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487348/bf2c8d74-3f2b-d7a1-8d00-952d3fe29413.png)
ちなみに使っていたのは、Element UIをベースにしたVue-admin-elementでした。

**Vue-admin-element**
ご存じない方は下記で遊べるんで見てみてください。
https://panjiachen.github.io/vue-element-admin/#/login?redirect=%2Fdashboard

原因をネット上で探すもなかなか見つからなかったのですが何とか海外の記事を見つけ解決しました。日本語の記事がなかったのでここに記載することにしました。

## 解決方法
### 状況の再現
Element UIで見つけたテーブルをVue-admin-element内でちょうど下記のように使おうとしていた時でした。

```
<template>
  <div>
    <el-table
      :data="tableData"
      style="width: 100%;margin-bottom: 20px;"
      row-key="id"
      border
      default-expand-all>
      <el-table-column
        prop="date"
        label="date"
        sortable
        width="180">
      </el-table-column>
      <el-table-column
        prop="name"
        label="Name"
        sortable
        width="180">
      </el-table-column>
    </el-table>
  </div>
</template>
<script>
  export default {
    data() {
      return {
        tableData: null
      }
    }
  }
</script>
```

テーブル内に表示するデータをAPIで取得することを想定していたので、scriptタグ内の変数tableDataを宣言する必要があるんですが（オマケ参照）、

```
data() {
  return {
    tableData: null
  }
}
```

としていました。
この時点でコンソールを見ていただくと上記画像のエラーが出ているはずです。

### 解決方法
tableDataにnullの代わりに空配列を渡すとエラーが見事消えます。

```
data() {
  return {
    tableData: []
  }
}
```

### 原因の考察
Vue-admin-element内のテーブルだとnullで動作していたのですが、Element UIページから移植したパーツではこのようなエラーが出てしまったんだと思います。

defaultで変数を宣言する際に、変数に格納されるデータの形式が配列であるとか、オブジェクトなのかとかを気にする必要があるケースが存在するのかもしれません。

注）エラー解決方法を記していてくれた元サイトなんですが、再び見つけることができなかったのでリンクが貼れませんでした。どうやってあそこにたどり着けたのかも、もはや思い出せません。


### オマケ

```
data() {
  return {
  }
}
```
なんて書くと

```
[Vue warn]: Property or method "tableData" is not defined on the instance but referenced during render
```

て怒られます。