OmniAICreator/Qiita-1.07M huggingface dataset:
億劫なエクセルの操作を自動化する



[ZOZOテクノロジーズ #5 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/zozo_tech5)の記事です。
昨日は @saitoryuji さんの「[新卒エンジニアがチーム開発でGitHubを使うときに気を付けていること（レビュアー編）](https://qiita.com/saitoryuji/items/dd29cd8e72bdcb6b9c1b)」でした。

本記事は過去に書いた[Go言語でエクセルデータから情報を読み取る](https://qiita.com/ikeponsu/items/34a8ded9a6306c3b6468)の記事を最新の情報に更新したものです。

# はじめに
みなさんは普段業務でエクセルは使っていますか？

自分自身業務で触ることはほとんど無くなってきましたが、業界や現場によっては、昔からのやり方が残っていたり、仕事上のPC環境的に使わなければいけなかったりと、いろいろ事情があると思います。
特にアパレル業界では中国とのやり取りもあり、使う機会が多いみたいです。

その為、人の手で行うには億劫なエクセル作業をサラッと自動化できたらと思い本記事を書きました。

VBAで自動化するのも良いですが、外部サービスとの連携や、運用のしやすさからプログラムで自動化するのも良いのではないかなと思います。

![1E12FB26-8A5C-46BB-8B52-554AA424A15F.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/402cce30-5bfb-3af1-a17d-e0b5095b1ade.png)


# ファイルの読み込み
実行ファイルがあるフォルダの直下にdataフォルダを用意し、入力に使用します。
今回はエクセルの拡張子を２種類読み込んでいます。


```Go
// ファイルパスを取得
func getPath() []string {

	appPath, _ := os.Getwd()
	dataPath := filepath.Join(appPath, "data")
	path := filepath.Join(dataPath, "*.xlsx")
	f, _ := filepath.Glob(path)
	files := f

	path = filepath.Join(dataPath, "*.xlsm")
	f, _ = filepath.Glob(path)
	files = append(files, f...)

	return files
}
```

# エクセルファイルの読み込み

```Go
// エクセル読み込み
excelFile, err := excel.InputFile(file)

// エクセルエラー
if err != nil {
	log.Fatal("excel error exit")
	return err
}
```
# シートの読み込み

```Go
// 全シート分ルートを回す
for _, sheet := range excelFile.Sheet {

	// シートが見つからない
	if sheet == nil {
		log.Fatal("failur open sheet.", RPASheetKey)
		return nil
	}

	// シート名が該当したら（この場合は含まれていたら）
	if strings.Contains(sheet.Name, "シート名") {
        // 処理をする
    }
}

```

# セルの参照

```Go
// すべてのセルを左上から順番に参照する場合
// 行ごとに処理
for _, rowValue := range sheet.Rows {
	// 列ごとに処理
	for _, colVal := range rowValue.Cells {
		println(colVal.Value)
	}
}

// 列、行番号を指定してセルを参照する場合
// 行ごとに処理
for rowKey, rowValue := range sheet.Rows {
	// 参照したいセルがある列
	if rowKey == "任意の行番号" {
		// 列ごとに処理
		for colKey, colVal := range rowValue.Cells {
			// 参照したいセルがある行
			if colKey == "任意の列番号" {
				println(colVal.Value)
			}
		}
	}
}

// セルの値から判断したい場合
// 行ごとに処理
for _, rowValue := range sheet.Rows {
		// 列ごとに処理
		for _, colVal := range rowValue.Cells {
			// 参照したいセルがある行
			if colVal.Value == "検索対象のキーワード" {
				println(colVal.Value)
			}
		}
	}
}
```

# エクセルファイルの作成、書き込み

```Go
// エクセルの作成
excelFile := xlsx.NewFile()
// シートの追加
sheet, err := excelFile.AddSheet("NewSheet")
if err != nil {
	fmt.Printf(err.Error())
}
// セルの追加
row = sheet.AddRow()
cell = row.AddCell()
cell.Value = "セルに書き込みたい内容"
// ファイルの保存
err = excelFile.Save("任意のファイル名")
if err != nil {
	fmt.Printf(err.Error())
}
```

# さいごに
C#とかでも同じ様なライブラリがありますが、言語的なハードルを感じる方にはGo言語の方が使いやすいかもしれませんね。

[ZOZOテクノロジーズ #5 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/zozo_tech5) 明日は @meganekids さんが、涙なしでは見れない記事を書いて下さるようです。めちゃくちゃ楽しみです。
個人的観測範囲内で補足できたQt関連書籍の紹介

#今年もこの日がやってきた・・・
もう1年経ってしまった・・・
ということで、引き続き宴会部長に指名されたにも関わらず忘年会の手配すらできない状態になってしまっている宴会部長です。
本当はもうちょい何か作ってみた的なネタを書こうと思ってたんだけど、まったくもってそんなことをする時間がないぐらい今年はなんだか本職がごった返していて、いろいろ手が付けられてない(甘え

という事でネタがない上に本業がいろいろ込み入っていてこのエントリーも全然「遅刻」なんだけど、最近諸事情により日本Qtユーザー会のウェブサイトが更新できない状況が続いているので、ユーザー会のサイトで紹介されていないQt関連書籍の情報を観測範囲内で集めてみた。

#[「Qt Quick」アプリケーション開発 (I・O BOOKS)](https://www.amazon.co.jp/dp/4777520609/)
(株)SRAの方々が書かれた本なんだとか。
![「Qt Quick」アプリケーション開発 (I・O BOOKS)](https://images-na.ssl-images-amazon.com/images/I/41%2BXQgfN74L._SX350_BO1,204,203,200_.jpg)

#[始める！Qt for WebAssembly](https://booth.pm/ja/items/1561219)
おなじみ！~~ロリアヤネ~~理音伊織先生の薄い(?)本。Qt for WebAssemblyとは、Qtのライブラリを活用したWebアプリ開発をサポートするツールっぽい。まだ頭の部分をザザっと斜め読みしただけなんだけど、後でサンプルコードを追いながらなんか書いてみようかな・・・
![始める！Qt for WebAssembly](https://booth.pximg.net/48d0f687-6442-4b33-83da-2de0c72f5a1b/i/1561219/68ee88cc-6476-406a-bf90-89cc7b3bb16d_base_resized.jpg)

#[Qt5/C++入門 マルチプラットフォーム開発を始めよう](https://booth.pm/ja/items/1042093)
主としてC++を使ったプログラミングについて書かれてるっぽいけど、冒頭ではQtCreatorの解説とかも入っててこれから書くぞーってヒトには優しい一冊なのかもしれない。ちなみにおいらはC++のコードがほとんど書けないのでそれ以上の良さがあまり表現できない残念なヒトなのです(何
![Qt5/C++入門 マルチプラットフォーム開発を始めよう](https://booth.pximg.net/7287bb46-6dfb-43c3-94bd-827bc1141389/i/1042093/cc65554f-b40c-49ef-b189-69a19d9e9398_base_resized.jpg)

#[Qt 3D を使ってみよう](https://booth.pm/ja/items/1574684)
Qt 3Dに特化した一冊。絵を書くところから始まって、それを立体にしていってと、順を追って書かれていてとても親切。ただ、おいらの場合そもそも絵心が足りなくてね・・・普通の立方体とかのレベルまではなんとかなるんですが(笑)
![Qt 3D を使ってみよう](https://booth.pximg.net/b65deb01-ea4d-44c9-aba0-d8fa65ece8d5/i/1574684/94dc6cfe-2f2d-4b82-960c-4f38f9bcec87_base_resized.jpg)

#[PythonでGUIをつくろう〜はじめてのQt for Python〜](https://booth.pm/ja/items/1030838)
QtQml/QtQuickを中心にアプリを書くならばバックエンドはJavaScriptって選択肢になるところなんだろうけど、"Qt for Python"を使ってPythonのアプリにQtのGUIを被せていこう・・・って話で合ってるよね？？
ちなみにおいらPython書けないので、これを期にPythonを勉強すべきなのか・・・!?
![PythonでGUIをつくろう〜はじめてのQt for Python〜](https://booth.pximg.net/39c04b76-81dc-467b-b1d6-0b7b32f61e00/i/1030838/91d05af0-16b6-452e-85f7-2ee1fb97f65d_base_resized.jpg)

#[はじめてのQt カンタン! 多言語 対応のアプリをつくろう](https://booth.pm/ja/items/1311049)
Qtは「マルチプラットフォーム」というところが強い部分だけど、それだけじゃなくて「マルチランゲージ」という点でも優れた特徴を持っている。ってことで、「多言語化」てところに焦点を絞った一冊。
![はじめてのQt カンタン! 多言語 対応のアプリをつくろう](https://booth.pximg.net/39c04b76-81dc-467b-b1d6-0b7b32f61e00/i/1311049/8a4ce8c8-4631-407c-958d-b4c626248989_base_resized.jpg)

#[QtでAndroidアプリを作ろう](https://booth.pm/ja/items/1565906)
おいらも過去の記事でAndroid用アプリを試したりしているけど、JNIとかJavaとの連携などを含めて書かれた一冊。おいらは何か作るとしてもSailfishOSが対象なことが多い訳なんだけど、ついこのあいだWindowsPhoneが息を引き取ったりして、ちょっとこの本読みながらAndroidでもなんかしてみるかなーと思いつつ、全然時間が取れなくてこんな記事を書いている始末(ぉぃ
![QtでAndroidアプリを作ろう](https://booth.pximg.net/7287bb46-6dfb-43c3-94bd-827bc1141389/i/1565906/2e80fe4d-b3da-473a-9300-86b7aa4f058a_base_resized.jpg)

#最後に・・・
他にも紹介できてないのがありそうなので、「こんなのもあるよ」ってのがあったらおしえろくださいよろしくおねがい。
あ、一番上の紙しか流通してない本を除いて、今回紹介するにあたって2冊目から下はすべて（電子版だけど）購入させていただきました。m(_ _)m
時間が取れたら（取れるのか？）ゆっくり読んで次のチャレンジにつなげていこう。
あと、来年こそはもう少しマトモなエントリーを書こう。。。。
Pythonista 3のテーマをMonokai風にする（テーマの自作方法）

Pythonista 3でMonokaiを使おうとしたけど見つからなかったので自分で作ってみました。

#テーマの設定の場所

1. 左サイドバーの右下の歯車を押すとSettingsが開きます。
1. 一番上のGENERALのThemeからThemesが開きます。
1. 右上の+を押すことでEdit Themeが開き、現在の配色をベースに自由に変更できます。

#Edit Theme（編集画面）

- 色はカラーパレットから選択できるほか、左上の色見本を押すとカラーコードを直接記入できます。
- シンタックスハイライトでは太字、斜体、下線を選択できます。
- 右上のDoneの左のアイコンからURL Schemeを生成できます。

#作ってみた
[ここをからインストールできます。](https://tinyurl.com/yx34axem)

<details><summary>URL Schemeそのものはここから確認できます。</summary><div>

```
pythonista3://?action=add-theme&theme-data=eNqdVktz4jAMvvMrmOyVzCSBktBbd4Fb97Cz94yTiOCNYzGOMy3b6X9fvyiY8mg2OmHps6RPksXbaDwOJLzKvAMGpaTIc0m5DMaP42BtvmBibEiRF6RsaoE9r4w6WWmx6oqIJm9gXyARRitFDx9ASSUDg_lhPothlEPO-7YAYXTZahFlTteVuINOH7-pn9oBlp0UlNfHM3VaIkMLXs2X39NZYBTvE4spGem6K_bfNps0i1MfoCJqPHvNTFhBiYJoagxSpQ9Cx37mDCvwsEe2whO3WaRlFgWTY0yCgwgFqWhvok28exWpL2g5vZDGepHM08SPZCfwjyqlh9ggl2En964MBbLKB21B-ed1GA-DGYor2FwJ72m-SlyLDOWTSsJoeSsaZ-GhNihaIuX1PnEFyCIfpzML77s8NfuE_z_CpwMJ30LZFPjqp3dyqAfvIiKskMNN2EeZDpaf7pKkvjsfHM9LeZzxSy2yymL1yPhV7Hl5uO9S09t36SyyrrmQ4bHuC_Nl0e1m1G9MA9hL_3ZnheJ2n18scDKswIfc7w6V3389Zarr7xA3ny8XqzPiWqx6BgOYLrFtgcsriPQhjR9OJv4LMzv8XVdPbcGwbNTFRMhhk654JT2TX0l45FDqKRfny2-60GKXlc2R_jUpxpFdex9LdLlI4_WJ4Ya0lO2N7hk4w_AX1D0jwi1SG16um9MRoCVwcfgLOE2yJLGqupcSVJRqVbh1On3S4tYp7Ijp39w8tA6s5LCJC0HE_laOcquGmBPKTl3M4tlslvkBnIW41GItOGmt62fk2BA6_o0tCoEv45-03kprpGgD0ak_DJQwW8aETKPpPBi9_wPDjTRK
```

</div></details>

UIの配色は標準のTomorrow Nightを用いていますが、Monokaiに合わせて`Tint Color`を`#f99157`から`#fd971f`に変更しました。（ほとんど変わってない）

シンタックスハイライトの区分がそこまで多くないので忠実には再現できていません。たとえば、

- `#f92672`を指定したのは`Keyword`だけですが、`import` `def` `for` `in` `print`などが一括で変更されています。
-  演算子はハイライトできません。

#他の自作テーマ
自分で調べた範囲では3つしかなかったので全て紹介します。他にあればぜひ教えて下さい。

|テーマ|説明|
|:---:|:---|
|[WWDC '16](http://omz-software.com/pythonista/wwdc16_theme/)|Pythonistaの開発元のomz:softwareが作成|
|[Dracula](https://draculatheme.com/pythonista/)|本家Dracula作者のZeno Rocha氏が作成|
|[Atom-inspired](https://forum.omz-software.com/topic/3655/atom-one-dark-inspired-theme-for-pythonista)|投稿の一番下の`Theme.`がリンク|

#おまけ
##URLスキームの貼り付け方
普通にリンクを貼るとQiita側で削除されるので[TinyURL](https://tinyurl.com/)で圧縮したものを貼り付けています。
##Pythonistaのアイコンの色を変更する
Themes（テーマ選択画面）の右下のApp Icon...からアイコンの色を変更できます。
##サンプルコード
設定画面で画面で表示されるコードを写経してみました。他のエディタにコピペすればテーマを自作する助けになるかもしれません。

```python:colortest.py
# Themes（テーマ選択画面）のもの

from random import sample

def main():
  # Request a name and suffle the letters:
  name = input('Enter your name: ')
  for i in range(100):
    print(''.join(sample(name), len(name)))

if __name__ == '__main__':
  main()

# Edit Theme（配色設定画面）のもの

#coding: utf-8
from random import shuffle

def main():
  '''Shuffle the entered name 10 times'''
  name = input('Name: ')
  chars = list(name)
  for i in range(10):
    shuffle(chars)
    print(''.join(chars))

# クラスとデコレータがなかったので追加

@hogehoge
class Foo():
  def __init__(self, bar):
    self.bar = bar
```
RailsにBootstrapを導入する

記事はたくさんあるのに、どの記事も微妙に書かれていることが違ったりして割とハマったので、自分がうまく行った方法をメモ。

Rails：`5.2.4`
Ruby：`2.6.5`

##gemを入れる
`bootstrap`、`jquery-rails`の2つのgemを導入します。

```Gemfile:Gemfile
gem 'bootstrap'
gem 'jquery-rails'
```
```terminal
$ bundle install
```

##application.scssを編集
まず、`app/assets/stylesheets/application.css`の拡張子を`scss`に変更します。

次にファイル内の以下の2行を削除します。

```app/assets/stylesheets/application.scss
*= require_tree
*= require_self
```
最後に、以下の記述を書き込みます。

```app/assets/stylesheets/application.scss
@import "bootstrap";
```

##application.jsを編集
app/assets/javascripts/application.jsに以下の内容を追記します。

```app/assets/javascripts/application.js
//= require jquery3
//= require popper
//= require bootstrap-sprockets
```

設定は以上になります。
AssetPilelineの仕組みがいまいちわかっていないので、今後調べて行こうと思います。

##参考
[BootstrapをRailsに導入してみよう！徹底解説！](https://tech-boost.jp/magazine/Programming-languages/ruby/1073142)
[Rails 使用するCSSを指定する](https://keruuweb.com/rails-%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8Bcss%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B/)
ESXiでVLANを構築した時のメモ

#目次
- はじめに
- 前提事項
- VLANの作成
- トランクポートの設定
- アクセスポートの設定
- EtherChannelの設定
- PortChannelの設定
- おわりに

#はじめに

最近ESXi を設計・構築するお仕事があり，その中でVLAN を設定しないといけない状況に当たりました．（詳しくは別記事で書く予定）
スイッチの設定はあまり経験がないのと，前回の経験が１年くらい前だったこともあり，結構はまったので備忘録として記事にしています．
自分の環境では，実行できましたが，まだまだ知識不足の点あると思いますので，誤っている点，改善したほうが良い点あればコメントいただけると幸いです．

概要は以下の通りです．ここでは，Catalyst スイッチの設定のみを記述します．

![構築環境.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438083/9ffdb191-bf04-e38c-c799-3cea3ebd1f85.png)


#前提事項
- 設定するポートは結線済みであり，リンクアップしている
  ※リンクアップしていないと，設定が確認できないものもあるため
- 今回設定する設定以外はスイッチに設定はされていない
- スイッチはCatalyst である．ほかのスイッチでは，一部実行コマンドが足りない場合がある．（トランクポートの設定のときなど）
- スイッチと作業PCはコンソールケーブル等で接続され，操作可能である

#VLANの作成
まずは，設定するVLAN を作成します．

```sh:実行コマンド
        > enable
        # configure terminal
(config)# vlan X, Y
```

VLAN XとYが作成できた．

#トランクポートの設定
タグVLAN の対象のポートにトランクポートを設定する．トランクポートは，複数のVLAN に所属するポートのことである．（今回はVLAN は一つだけど，増やしたりすることも可能）

```sh:実行コマンド
                 > enable
                 # configure terminal
         (config)# interface range fa0/5 - 6
(config-if-range)# switchport trunk encapsulation dot1q
(config-if-range)# switchport mode trunk
(config-if-range)# no shutdown
(config-if-range)# switchport trunk allowed vlan X
```
ポート5と6にトランクポートが設定できた．

トランクポートの設定ができたかを確認する．

```sh:実行コマンド
# show vlan brief
```

詳しい出力結果は省略する．
トランクポートは上記コマンドでは表示されないため，設定されたポートが見えなければ設定はされている．
次に，指定したVLAN に所属しているかを確認する．

```sh:実行コマンド
# show interfaces fa0/5 - 6 trunk
```

```sh:出力結果例
Port    Vlans allowed on trunk
Fa0/5    X

Port    Vlans allowed on trunk
Fa0/6    X
```

他にもいろいろ出力されるが，その他の結果は省略する．
指定したVLAN が確認できればよい．

#EtherChannelの設定
ポート5と6を対象にLGA を設定するため，まずはEtherChannelを設定する．

```sh:実行コマンド
                 > enable
                 # configure terminal
         (config)# interface range fa0/5 - 6
(config-if-range)# channel-group 1 mode on
```
ポートチャネル番号1のポートチャネルが設定できた．

#PortChannelの設定
次にPortChannel の設定をする．この設定をしないと，トランクポートが機能しない．（自分はこのあたりを当時適当に考えていたため，はまった）

```sh:実行コマンド
                 > enable
                 # configure terminal
         (config)# interface port-channel 1
      (config-if)# switchport trunk allowed vlan X
      (config-if)# switchport mode trunk
```

ここまで設定できたら，LGA が設定されているかを確認する．

```sh:実行コマンド
# show etherchannel summary
```

以下のような出力が表示されればよい．
Dが表示されていると，どこかで設定が誤っていたり，物理的に障害があるなどの理由で疎通ができない．

```sh:出力結果例
Group  Port-channel  Protocol  Port
------+--------------+---------+-------------------
1       Po1(SU)         LACP     Fa0/5(P) Fa0/6(P)
```

#アクセスポートの設定
最後にアクセスポートの設定を行う．

```sh:実行コマンド
                 > enable
                 # configure terminal
         (config)# interface range fa0/7 - 10
(config-if-range)# switchport mode access
(config-if-range)# switchport access vlan Y
(config-if-range)# no shutdown
```

アクセスポートの設定がされたかを確認する．
アクセスポートの確認は，トランクポートとは異なり，リンクアップしていなくても確認できる．

```sh:実行コマンド
# show vlan brief
```

```sh:出力結果例
VLAN  Status  Ports
----  ------- -----------------------------
Y      active  Fa0/7, Fa0/8, Fa0/9, Fa0/10
```

# おわりに
大事なのは，実際に接続が確認できることなので，他にもアクセスポートを作ってESXiホストに接続を確認してみたり，vmkpingで疎通を確認したりした．結果として，無事に疎通確認できて一安心だった．
スイッチの設定は慣れているとどの設定が足りないとか，接続できない理由が分かるが，知らないと「え，なんで接続できないの？」という疑問しか思い浮かばないので，Catalyst購入したりして普段から慣れておこうと思った．
特徴量 予測 統計 python

勉強のアウトプットとして書いているので間違ってる部分があるかもしれないです。お気軽にコメントして下さい。今回は[予測 統計 (実践編 重回帰) python
Python](https://qiita.com/banana19980702/items/50b6f0d1e69597f70385)でやった重回帰の精度をさらに上げていきます。結論として、予測精度を上げるために必要なことは「<b>特徴量</b>」です。今回はその特徴量について扱っていきます。

#内容
・特徴量とは
・特徴量を用いた予測精度を上げる方法
・データ加工

#特徴量とは
特徴量とは説明変数のことです。機械学習の世界では説明変数よりも特徴量ということが多いです。分析精度をあげるためには特徴量は欠かせません。

#予測精度を上げる方法
特徴量を用いた、予測精度を上げる方法として以下の二点があります。
①特徴量を作る
②特徴量を選ぶ
##特徴量を作る
特徴量を作るとは一体どういうことでしょうか。それは、<b>与えられたデータや外部データを加工して、新たな特徴量を作っていく</b>ことです。例えば、回帰では平均や標準偏差を作ったり、分類では20代だけのデータを集計したりすることです。これをすることにより無駄なデータを省くことができるので予測精度を上げることができます。

##特徴量を選ぶ
これはとても過不足なく特徴量を選んでいくことです。特徴量を選ぶ方法として以下の三点があります。
①単変量解析
②モデルベース選択
③反復選択
###単変量解析
これは目的変数と説明変数が一対一の関係で解析して行くことです。いわば、単回帰分析のことです。例として、分散分析があげられます。
###モデルベース選択
作るモデルにおいて特徴量の重要度を算出する方法です。
###反復選択
特徴量を増やしたり、減らしたりして予測精度を上げていきます。例としてステップワイズ方があげれらます。

#データ加工
予測精度を上げるうえで大切なのは特徴量について考えることを説明していきました。ここでは実際に特徴量を加工するのかを説明してきます。特徴量の選択についてはいろいろ方法があるので後日記事を書いていきます。

##便利な関数
データを加工するうえで便利な関数があります。今回は以下の二点を紹介します。
・split関数
・apply関数

###split関数
これは文字列を分割する関数です。引数には分割したい文字を代入するとその文字を除外して文字列を分割します。

###apply関数
これはデータの各値に数値を当てはめる関数です。データ加工では引数に無名関数(lambda関数)を指定することで簡単に数値を加工することができます。

###コード
実際にどういう風にこれらの関数を使うか説明していきます。
例えば、dateという列に「2019-12-12」という風に日付を表す文字列が入っているとします。これをyearという列に年だけ入れたいとき以下のように書きます。

```python
df["year"] = df["date"].apply(lambda x: x.split("-")[0])
```
yarnは`package.json`という名前のディレクトリがあるとエラーになる

## 発生するエラー

```sh
~ ❯❯❯ yarn help
yarn info v1.21.1
Error: EISDIR: illegal operation on a directory, read
    at Object.readSync (fs.js:498:3)
    at tryReadSync (fs.js:332:20)
    at Object.readFileSync (fs.js:369:19)
```

## 再現手順

```sh
cd $HOME
mkdir package.json
yarn help
# => Error: EISDIR: illegal operation on a directory, read
#     at Object.readSync (fs.js:498:3)
#     at tryReadSync (fs.js:332:20)
#     at Object.readFileSync (fs.js:369:19)
```

## 原因

- `package.json` は常にファイルであると想定して動くため
    - `yarn info` などは カレントディレクトリの `package.json` を読みにいき、見つけたらそのまま `fs.ReadFyleSync()` に渡してる
    - https://github.com/yarnpkg/yarn/blob/master/src/cli/index.js#L471-L475
    - ファイルなら渡すとかにしてくれるとよかったのだが。。。

## なんでpackage.jsonという名前のディレクトリを作ってしまったか

```sh
docker run -w /root --rm -v `pwd`/package.json:/tmp -it --entrypoint /bin/sh node:10.15.1
```

volumeマウントはディレクトリのみでファイルはNGというのを理解せずに`docker run -v`を実行しホストOS側に作ってしまっていた
Skaffoldのprofile機能を使って環境ごとに動作を変える

Skaffoldの[profile機能](https://skaffold.dev/docs/environment/profiles/)を使えば、profileごとに設定を上書くことができます。
たとえば、開発環境とプロダクション環境へのデプロイの仕方を変えることができます。

実際の例を見てみましょう。
例えば以下のようなskaffold.yamlがあったとします。

```yaml:skaffold.yaml
apiVersion: skaffold/v1
kind: Config
build:
  artifacts:
  - image: sample-image
deploy:
  kustomize:
    path: kubernetes/overlays/dev
```

kustomizeのpathとしてdevを指定していますが、これをproductionを指定したい場合、profile機能を使うとスマートにできます。

```yaml:skaffold.yaml
apiVersion: skaffold/v1
kind: Config
build:
  artifacts:
  - image: sample-image

profiles:
- name: dev
  deploy:
    kustomize:
      path: kubernetes/overlays/dev
- name: production
  deploy:
    kustomize:
      path: kubernetes/overlays/production
```
このように書くと、dev環境へデプロイしたい場合は、

```bash
$ skaffold run -p dev
```
prod環境へデプロイしたい場合は、

```bash
$ skaffold run -p production
```
というように設定を切り替えることができます。
profile機能が行っているのは**設定の上書き**なので上記のdeploy以外にもbuild内容も変更が可能です。
[profile機能のexamples](https://github.com/GoogleContainerTools/skaffold/tree/master/examples/profiles)をみるとよく分かるかと思います。

また`Activation`というprofileの自動切り替え機能もあります。
Activationを使うと
kubecontextや環境変数、skaffoldコマンド(dev/run/build/deploy)によって、profileを自動で切り替えてくれます。

```yaml
build:
  artifacts:
  - image: sample-image

profiles:
- name: local
  activation:
    - kubeContext: minikube
      command: dev
  deploy:
    kustomize:
      path: kubernetes/overlays/local
- name: dev
  activation:
    - env: ENV=dev
  deploy:
    kustomize:
      path: kubernetes/overlays/dev
- name: production
  activation:
    - env: ENV=production
  deploy:
    kustomize:
      path: kubernetes/overlays/production
```

例えば上記の場合、

- kubeContextがminikubeで、skaffold devコマンドを実行した場合、local profileが使用される
- ENV=devという環境変数があれば、dev profileが使用される
- ENV=productionという環境変数があれば、production profileが使用される

といった具合です。
うまく使えば-pオプションにいちいち指定しなくてよくなるので大変便利ですね。
3gpファイルをmp3やmp4に変換したいという話

# はじめに
昔ウォークマンを使っていた際に，x-アプリというソフトでCDから音楽データをダウンロードしていたのですが，データがすべて**".3gp"形式**で記録されていました．
最近になって，音楽データをGoogle Play Musicに移そうとした際に，3gpではダメだと発覚！

これはいけない！
なんとか無料で変換したい！

と思って色々試したので，書きます．
(いや，ストリーミングに移行しろよ！という話ですねw)

# 手法1 フリーソフトを使う
フリーソフトとしては，
・オンラインで変換してくれるもの
・ソフトをDLして使うもの
の2つの分けられます．
ただ，前者に関しては，ファイル1つ1つのアップロードが必要な場合が多いので，後者を今回は選びます．
ご紹介するのは，**real player**というソフトを使です．(詳細：https://jp.real.com/)
高級な変換をしないのであればこちらで十分です．

ただし，エラーが起きて変換できない場合もあります．
検証していないのでなんともいえませんが，登録されている歌手などの情報に，ウムラウトやアクセント付きのアルファベットが入っているとエラーがでる可能性があります．

# 手法2 MATLAB/Python3
やること自体は簡単です．**元ファイルを読み込んで配列データを取得→形式を定めて配列データを保存**という流れです．
例えばmatlabだとこのように書けます．

``` change_files.m
load_name = "aaa.3gp"
save_name = "aaa.mp4"
[y,Fs] = audioread(load_name); %読み込み
audiowrite(save_name,y,Fs); %書き出し
```
たったこれだけ！簡単ですね．注意すべきは，Matlabの`audiowrite`はmp3には変換できません．
(そもそも有料ソフトのMatlabをこんなことに利用するのはクレイジーですね)

Pythonを使う場合も，環境構築をした上で，同様のプロセスを踏めばOKのはずです．
ただ，3gpを読み込めるかどうか，私は未調査です．


# 手法3 ffmpeg
**ffmpeg**はコマンドラインから動画等の編集ができるフリーソフトです．
Ubuntuなどでは，`sudo apt install ffmpeg`でインストールできます．
(こちらを参照　https://www.komee.org/entry/2018/10/30/120000)


変換方法はいたってシンプル．

``` shell
ffmpeg -i in.3gp -c:a libmp3lame output.mp3
```
(こちらを参照 https://superuser.com/questions/230538/how-to-convert-3gp-audio-file-to-mp3)

これを実行するために，下記のようなshell scriptを作りました．
ディレクトリ構成としては，
[アーティスト名ディレクトリ]
　- [アルバム名ディレクトリ1]
　- [アルバム名ディレクトリ2]
　…
という構成です．

``` change_files.sh
IFS_BACK="$IFS"
IFS=$'\n'#空白区切りではなく，改行区切りにする
dirpath="/mnt/c/Users/user_name/Music/Music Center/artist_name/"
dirs=`find "$dirpath" -maxdepth 1 -type d`
for dir in ${dirs}#アルバム名のディレクトリのパスを取得
do
    cd $dir
    for file in *.3gp #3gpのファイルのみに適用する
    do
        name=${file%.*}
        output="$name.mp3"
        ffmpeg -i "$file" -c:a libmp3lame "$output"
        #echo "$file"
        #echo "$name"
        #echo "$output"
    done
done
```

((注))音楽ファイルはたまに変な文字列が使われています．場合によっては上記プログラムで処理しきれない場合があります．ご注意下さい．少なくとも，私はこれで変換できました．
【11日目】トランザクションサポートデータベース実装

# まえがき
今回はトランザクションをCOMMITした場合に、ローカルデータ領域に積み上がっているクエリの実行履歴を、どのように共有データ領域へ反映するかについて考えます。その前に机上で整理したらすごくわかりやすくなったので、変更操作と共有データ領域とローカルデータ領域について再度まとめます。

## 共有データ領域とローカルデータ領域の遷移
トランザクションを開始した時の初期状態として、[りんご,100円]と[みかん,80円]を持つテーブルを考える。上段4段は共有データ領域のキーバリューストアと、カラムインデックステーブル2つの状態を表す。下段はローカルデータ領域のキーバリューストアとカラムインデックスに対応するテーブルの状態を表す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/16caf8d6-56b5-5913-ba91-47f6e7be2d85.png)
このテーブルに対して、[ぶどう,300円]を挿入し、りんごの値段を120円に上げ、みかんの行を削除する、という操作を順に行う。クエリIDをそれぞれ0001,0002,0003とする。

### INSERT
[ぶどう,300円]を挿入したときの状態は下記になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/424ef6fc-75e3-ee66-5190-408a7f7dffa4.png)
このとき、共有データとローカルデータをマージすると、下記のように見えるはずである。（この時点でトランザクションをCOMMITした場合は、共有データ領域はこうなる、という仮想状態。このトランザクション内でSELECTした場合は、この仮想状態を参照する。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/528f6f3a-1c51-7a64-f817-ba3a6089c8c7.png)

### UPDATE
上記のマージテーブルを今のテーブルの状態と見て、りんごの値段を120円に値上げする。ローカルデータ領域の最下段にクエリID:0002の行が追加された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/106bfbb2-22b8-2e69-8c0b-3b464709083b.png)
このとき仮想マージテーブルはクエリID:0001と0002合わせて下記になるはずである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/834c8ee6-0c62-4cd7-0109-d5f973ec47e1.png)

### DELETE
最後に、この仮想状態から[みかん, 80円]の行を削除する。ローカルデータ領域の最下段にクエリID:0003が追加された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/5be3c63c-0b66-4a33-90e8-027013803a01.png)
この時、マージテーブルは下記のようになるはずである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/53252ca3-7e9d-b097-c3f4-6efc9b7a3bb5.png)

## COMMIT時の挙動
今回の本題である、COMMIT時の挙動であるが、共有データ領域を仮想マージテーブルと同じ状態にしてあげれば良い、ということになる。上記では各操作後、仮想マージテーブルはこうなる、と記載しただけだが正確には次のような処理が必要になる。

### INSERT
キーバリューストアについては行追加する操作になる。
カラムインデックスについては、追加するレコードのカラム値が、すでに存在しているかしていないかによって処理が変わる。もし、カラム値が既存でないならば、カラムインデックスのテーブルに対して行追加の操作になる。一方、既存であるならば、カラム値が保持するオブジェクトIDのリストに対して、追加するレコードのオブジェクトIDを追加する処理となる。例えば、初期状態として、100円のフルーツが1つ入っているテーブルに、さらに別の100円のフルーツを追加した場合は下記のようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/3ceb42ff-c3fe-e4ad-4228-2deeab83db9f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201287/45c11b1d-53cc-0902-2f18-7117561710d8.png)

### DELETE
説明の都合上、先にDELETEのパターンを説明する。
キーバリューストアは、対象を行削除すれば良い。
カラムインデックスについては、削除するレコードのカラム値が、すでに存在しているかしていないかによって処理が変わる（INSERTの逆のイメージ）。すなわち、削除するレコードのカラム値が既存でない場合、カラムインデックスから行削除すればよい。カラム値が既存の場合、そのカラム値が保持するオブジェクトIDリストから削除するレコードのオブジェクトIDを削除すれば良い。

### UPDATE
さて、UPDATEの場合について。
キーバリューストアは更新後の値でそのまま更新してあげればよい。
カラムインデックスについては、値の変更があるカラムインデックスに対してのみ、変更前の値が持つオブジェクトIDを削除し、変更後の値が持つオブジェクトIDを挿入する必要がある。つまり、上のDELETEとINSERTの処理を組み合わせてあげれば良い。

# まとめ
よし、実装するぞー。。
Djangoシグナルハンドラの使い所

この記事は[gumi Inc. Advent Calendar 2019](https://qiita.com/advent-calendar/2019/gumi)の12/14の記事です。

### シグナルとは

何らかのイベントが発生した場合に、同時実行している他のプロセスに通知を送り、受信したプロセスは通知に応じた関数を実行するシグナルという仕組みがあります。
UNIXなどでは例外や強制終了といったイベントをキャッチして実行中のプロセスに割り込んで停止するというようなことに使われますが、Djangoフレームワークのシグナルは基本的にメインスレッド内でしか通信しないため、アプリケーション中の特定のイベントをキャッチして後続の処理に繋げる目的で使われます。

Djangoフレームワークでは以下の種類のシグナルがサポートされています。
HTTPリクエストやレコードの保存等の直前直後に呼び出されることから、共通処理を実装するのに向いています。

| 種類 | コールタイミング | 内容 |
|:-----------------|------------------:|:------------------:|
| request_started | HTTPリクエスト処理の開始時 | 特になし |
| request_finished | HTTPリクエスト処理の終了時 | 特になし |
| pre_save    | インスタンスのsave()実行直前 | 保存予定のインスタンス  |
| post_save   | インスタンスのsave()直後   | 保存の完了したインスタンス |
| pre_delete  | インスタンスのdelete()実行直前 | 削除予定のインスタンス  |
| post_delete | インスタンスのdelete()実行直後 | 削除の完了したインスタンス |


### request_started
DjangoのアプリケーションがHTTPリクエストを受け付けた時に呼び出されるシグナルです。
受け取り方としてはデコレータで後続処理を行う関数をラップするか、signal.connectの引数で後続処理の関数を呼び出す方法があります。

```python
from django.core.signals import request_started

@receiver(request_started)
def do_something(**kwargs):
    ...
```

```python
from django.core import signals

signals.request_started.connect(do_something)
```

引数のsenderにHTTPリクエストを処理するハンドラークラスを受け取ります。
本来であればアプリケーションのコードを汚すことなくこの仕組みを利用してリクエストログの出力等に使いたいところですが、残念ながらシグナル自体はHTTPリクエストの情報を受け取らないので出来ません。
リクエスト毎に初期化したいローカルキャッシュのトリガー等に使う感じでしょうか。

### request_finished
こちらはクライアントにレスポンスを返す直前に呼ばれるシグナルです。
request_started同様にHTTPリクエストの情報を受け取らないので用途は良しなに。


### pre_save
Djangoのモデルインスタンスのsave()メソッド実行直前に呼び出されるシグナルです。
senderにインスタンスのクラスを、instanceに保存直前のインスタンスを保持するので事前処理のようなものをモデルクラス毎に書かずとも実装することが出来ます。

##### 例) トランザクションの中で実行されているか確認
```python
from django.db.models.signals import pre_save
from django.db import transaction


@receiver(pre_save, **kwargs)
def is_in_transaction(**kwargs):
    if not transaction.is_managed():
        raise Exception()
```

尚、レシーバのsenderの引数に特定のクラスを指定することで、そのクラスからのシグナルのみ選択的に受信することが出来ます。

```python
@receiver(pre_save, sender=User, **kwargs)
(do something)
```


#### post_save
こちらはDjangoモデルインスタンスのsave()メソッドの実行直後に呼び出されるシグナルです。
同じくsenderにクラスを、instanceにsave()後のインスタンスを受け取るので、ログや通知などの事後処理を行うのに便利です。

##### 例) save()した結果をログに出力

```python
import logging
from django.db.models.signals import post_save


@receiver(post_save, **kwargs)
def query_log(instance, **kwargs):
    modified_ref = dict()
    for field in instance._meta.fields:
        modified_ref[field.name] = getattr(instance, field.name)
    
    logger.getLogger(instance.__class__.__name__)
    logger.info(modifed_ref)
```
USB PDが流行りそうなので、ちょっと書いてみました。

#はじめに
USB PDと言えば、USB Type-Cのコネクタです。12/10位のニュースで、新しいiPhoneがLightningケーブルからさよならするそうです。それに代わるものとして、USB Type-Cが採用されるとの事で、スマホアクセサリー界隈が、ざわつくことが予想されます。

きっと、この流れは組み込み界隈にも落ちてくるかなと思っております。

そこで、USB Type-C®︎を使ったUSB PD®︎についてざっくり備忘録的な感じで、書いてみます。

#USB PDの仕様
これまでUSB Type-Aで5Vを給電していたシステムからUSB Type-CのPower Deliveryをサポートすることで、20V/5Aつまり100Wまでの電力を扱えることになります。

USB PDは、5V/9V/12V/15V/20Vの電圧から最大5Aまでの電流を流したり、受けたり出来る仕様なのですが、Programmable Power Supplyという仕組みであれば、扱いたい電圧が3.3Vから21Vまで可変できる仕様になっています。

この電源のSource及びSinkのどちらにもなるDRP(Dual Role Power)という機能も搭載する機器も増えています。

※DRP機器は、モバイルバッテリーなどが該当します。充電もできるし、チャージャーにもなります。


この仕組みを使って、もっと色々な回路が構成出来ないかと思案しています。

##こんな使い方はどうだろうか？その1
###ロボット用の電力
ロボットと言っても軽めのものを想定しています。これまで、バイクなどのバッテリーを積んだりしていたケースがあるところにUSB PDを、使ってみるのはどうでしょうか？

バイクのバッテリーを、入手するより家電量販店で大容量のモバイルバッテリーを入手する方が遥かに簡単です。

##こんな使い方はどうだろうか？その2
###アダプタの代替品
DCアダプタは、非常に便利な給電方法の１つです。これに置き換わるものを探す方が大変なのかもしれません。そんなレッドオーシャンに、あえてUSB PDを突っ込んでみたいです。
電圧が可変できるタイプのアダプタなら、用途も色々。Nゲージのパワーパックの電圧ソースとして、使ってみたくなりませんか？

##こんな使い方はどうだろうか？その3
###電力が必要なSoCを扱う場合
最近のSoCは、AIのエンジンを搭載していたりFPGAを搭載したり、電圧は低くても電流が必要なケースは、結構ありそうです。そこで、USB PDを使うことで、システムにあった電源周りを構成することができそうです。

このように様々な可能性を秘めているUSB PDですが、高速インターフェイス系の規格にもUSB PDをサポートが必須になりつつあります。

ThunderboltかDisplayPortであるとかHDMIども、USB Type-Cの物理層を使いつつ、各々のプロトコルと電源を通す仕組みになりつつあります。
最新規格であるUSB4.0も走り始めています。

##コンプライアンステストについて
USBは規格ものなので、コンプライアンステストが存在します。USB PDのロゴ認定プログラムも存在します。

USBの、コンプライアンステストには、ベンダー情報ファイルを用意する必要があります。
認証テストラボへ提出して、認定試験を行なってもらいます。

通すか通さないかは置いておいて、試験規格のドキュメントに目は通しておいた方がいいかもしれません。無料で入手できます。

USB IFへのリンク
https://www.usb.org/documents

###参考：USB PDテスター
USB PD用のコンプライアンステストができるテスターがあるそうです。

GRL-USB-PD-C2
https://graniteriverlabs.com/usb-pd-c2/

これを使うと、コンプライアンステストができるようなので、試させてもらいました。

こんな感じ。

![IMG_6748.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427043/482829be-c98e-844c-8bbc-a63d8e8e3a84.jpeg)

USB PDのチャージャーの例です。テストが自動でできます。
イラレから画像を書き出す

イラレでweb用の画像を書き出す方法をまとめます。
機能が多すぎて、簡単なことをするのも一苦労です。

##jpg、png
1. 画像を作成
2. アートボードツール（Shift + O）で画像をクリック
3. Command + Shift + Option + S

##svg
1. 画像を作成
2. アートボードツール（Shift + O）で画像をクリック
3. Cmd + Opt + E
4. テキストエディタで開いて、不要なコード（空のタグなど）が含まれていれば削除
paizaでkernel開発 その5

#概要

paizaでkernel開発やってみる。
kernel の定義をきっちりしてみる。

#kernel 定義

カーネルとは、OS（オペレーティングシステム）の中核で、CPUやメモリなどのハードウェアを直接コントロールするためのソフトウェアである。

 - code32で、書かれてる。
 - elf形式である。
 - multiboot_headerがある。

以上。
rails sがうまくいかない時の対応

`rails s`でサーバーを立ち上げた後、`Ctrl + C`で終了せずにターミナルを終了しちゃったりすると、次回起動時に以下のようなエラーが発生します。

```terminal
$ rails s
=> Booting Puma
=> Rails 5.0.4 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
A server is already running. Check プロジェクト名/tmp/pids/server.pid.
Exiting
```

##対処方法
```zsh
$ kill $(cat tmp/pids/puma.pid)
```
or

```terminal
$ lsof -ni tcp:3000 #or lsof -i:3000
COMMAND   PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby    77464 d0ne1s   20u  IPv4 0xe8bde147dfa7a793      0t0  TCP 127.0.0.1:hbci (LISTEN)
ruby    77464 d0ne1s   22u  IPv6 0xe8bde147d9f527d3      0t0  TCP [::1]:hbci (LISTEN)

$ kill -9 77464
```

`lsof`：オープンしているファイルを一覧表示するコマンド
`-n`：IPアドレスを表示する（名前解決しない）
`-i`：ポート番号やプロトコルを指定する

`kill`：プロセスを終了する
`-9`：強制終了

##参考
[Rails sのプロセスが切れない時](https://qiita.com/motty93/items/d22c1eb8f5128f8cd7f8)
[【 lsof 】コマンド――オープンしているファイルを一覧表示する](https://www.atmarkit.co.jp/ait/articles/1904/18/news033.html)
React　まとめ②

Reactアプリケーションはelement(要素)という構成ブロックにより構成されています。
コンポーネントは要素によって構成されたものです。
コンポーネントを使うことにより、UIを部品に分割し分離させることができます。

コンポーネントはpropsと呼ばれる任意の値を受け取り、画面上に表示すべきものを返すReaxt要素を返します。

```jsx
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}
```

これはpropsで受け取ったnameを表示させる関数コンポーネントです。

```jsx
class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}
```

これは等価なコードです、classコンポーネントを使う際はextends React.Componentを記載して下さい。
またファイル冒頭にimport React, { Component } from 'react';を書くことも必要です。

```jsx
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

const element = <Welcome name="Sara" />;
ReactDOM.render(
  element,
  document.getElementById('root')
);
```

このコードではelementと定義された要素を引数としてReactDOM.renderが呼び出されます。
そのあとelementに代入されたwelcomeコンポーネントを呼び出し、その時propsとしてname=’Sara’が渡されます。
その後ReactDOMが<h1>Hello, Sara</h1>になるようDOMを更新します。

Reactでは

```
<welcome />はDOMタグ
<Welcome />はコンポーネント
と認識されることを覚えておきましょう。
```

```jsx
class App extends React.Component {
  render() {
    return (
      <div>
        <h1>Hello World</h1>
      </div>
    );
  }
}
```

これはclassコンポーネントですが、特徴として内部にプライベート状態（state）をもたせたり、
生成状況によって呼び出されるライフサイクルメソッドを持っています。
主に親コンポーネントとして使用し関数コンポーネントで作った子コンポーネントに、保持している値を伝える親玉のような存在と言えるでしょう。


```jsx
const App = (props) => {
  return (
    <div>
      <h1>Hello World</h1>
    </div>
    <h2>Hello React</h2>
  );
};
```

これは同レベルのReact　Elementがあるためエラーになります。

```jsx
const App = (props) => {
  return (
    <div>
      <h1>Hello World</h1>
      <h2>Hello React</h2>
    </div>
  );
};
```

とdivタグで囲ってあげましょう。

```jsx
// 親コンポーネント
class Parent extends React.Component {
  //superは必須です
  constructor(props) {
    super(props);
    this.state = {
      value1: 'foo',
      value2: [ 'bar', 'baz' ],
    };
  }
  render() {
    return (
      <div>
        <Child1 data={this.state.value1} />
        <Child2 data={this.state.value2} />
      </div>
    );
  }
}

// Functionalコンポーネントで受け取る場合
const Child1 = (props) => (
  <div>
    {props.data}
  </div>
);

// Classコンポーネントで受け取る場合
class Child2 extends React.Component {
  render() {
    return (
      <div>
        {this.props.data}
      </div>
    );
  }
}
```

親で独自の名前を付けて子に流していく流れですね。
クラスコンポーネント間でも受け取ることができます。

viewで発生したイベントハンドラはクラスコンポーネントのメソッドで設定して下さい。
その際はキャメルケースで書く必要があります。
またコールバック関数として実行する際にthisが機能するようconstructor()内でthisをbindしておく必要があります。
これはjavascriptにまつわる話題です。


```jsx
ReactDom.render(
  <App />,
  document.querySelector('.content')
);
```

これは冒頭紹介したコードです、深掘りしていきましょう。
親コンポーネント（App.js）のrender()メソッドで返されたレンダリングの実態は仮想DOMと呼ばれるものです。仮想DOMではブラウザで表示できないので生のDOMに変換する必要があるのですが、そこでこのコードが活躍します。
第一引数に親コンポーネント、第二引数にhtmlで表示・挿入する部分を渡しています。
「IOWN構想」を読んで ～ デジタルツインと何が違う？

先月出版された[「IOWN構想 ―インターネットの先へ」](https://www.amazon.co.jp/IOWN%E6%A7%8B%E6%83%B3-%E2%80%95%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E5%85%88%E3%81%B8-%E6%BE%A4%E7%94%B0-%E7%B4%94/dp/4757103913)という本を読みました。デジタルツインとは異なるデジタルツインコンピューティングという新しいキーワードも出てきていて、これは勉強しておくべきだなと思いました。

IOWNとは？
---
私が説明を書くよりも引用した方が分かりやすそうですね。

まず、IOWNとは何か？
> 「ＩＯＷＮ」（アイオン：Innovative Optical & Wireless Network）は、ＮＴＴがパートナーの方々と共にめざしたい未来の世界を実現するための基盤　（p.ⅰ）

そして、いつ実現するものなのか？
> 「情報環境＝場」、すなわち仕組みを実現する手段の1つとして私たちはＩＯＷＮ（アイオン：Innovative Optical & Wireless Network）構想を提唱し、2030年の実現を目指して活動を開始した。（p.008）

何で構成されているのか？
> ＩＯＷＮ構想では、これまでの情報通信システムを変革し、現状のＩＣＴ技術の限界を超えた新たな情報通信基盤の実現をめざす。それを、光技術による「オールフォトニクス・ネットワーク」と、そのうえに構築されるリアルタイムで分析やフィードバックを行う「デジタルツインコンピューティング」、さらにはそれらの処理を全体最適に調和させてリソース配分を行い、必要な情報をネットワーク内に流通させる仕組みである「コグニティブ・ファウンデーション」により実現したいと考えている」（p.008）

・・・とのことで、次の3要素で構成されるようです。

- オールフォトニクス・ネットワーク
- デジタルツインコンピューティング
- コグニティブ・ファウンデーション


デジタルツインコンピューティングとは？
---
さて、ここでIOWNのいうデジタルツインコンピューティング（DTC）とは、従来から知られているデジタルツインとは異なる概念だそうです。引き続き、引用します。
> 「デジタルツインコンピューティング」（ＤＴＣ）は、現実世界を構成するモノやヒトなどをサイバー空間上にリアルに再現するとともに、それらを組み合わせた高度なシミュレーションを可能とする技術を指す。アメリカ国防総省国防高等研究計画局（ＤＡＲＰＡ）による造語である「デジタルツイン」は、現実世界の現象を計算機上で再現する、いわゆる「デジタルの双子をつくる」という考え方だが、これをベースとしながら、その組み合わせと適用範囲をさらに拡張したコンピューティングの概念である。（p.022）

他の説明も見てみます。
> ＤＴＣは、これまでのデジタルツインの概念を発展させ、多様なデジタルツインを掛け合わせて様々な演算を行うことにより、実世界の「再現」を超えたデジタルツイン同士のインタラクションをサイバー空間上で自由自在に行ことをめざす。（p.039-040）

***多様なデジタルツインを掛け合わせて様々な演算を行う***というとこが重要そうですね。この事例として、「未来都市のデザイン」や「ヒトを含めた実社会の未来予測」が書かれていました。

デジタルツインだって、まだそんなに成功事例を聞いたことないのですが、IOWNによって示されているのはその先にあるデジタルツインコンピューティングという概念でした。この分野を引き続きウォッチしていきたいと思います。
Webpackについて学んだことメモ

## 目次
1. Webpackとは
2. Webpackを使用するメリット
3. Webpackの使い方

## 今回の学習のゴール
- Webpackとは何か、何ができるかを知る
- 実際の使い方について知る

## 1. Webpackとは
- 複数のファイルを１つにまとめてくれるもの
- [webpack - GitHub](https://github.com/webpack/webpack)よると
>webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.

- モジュールバンドラーとはモジュールをひとまとめにするツール
    -  CSSやJavaScript、画像などWebコンテンツを構成するあらゆるファイル(アセット)やリソースを変換したりパッケージ化したりすることができる
    - モジュールバンドラーを使用するとJavaScriptコード内のrequireを辿って必要なファイルを連結してくれる
        - requireはもともとNode.jsのモジュール化の仕組みであり、JavaScriptにはコードをモジュール化してそれを必要な際に呼び出して使用するような仕組みが存在しないが、モジュールバンドラーを使用すれば依存関係を解決しブラウザ上でも利用できるようになる
- コマンドラインツールで作成されたAngular、React、Vueのプロジェクトには標準採用されている

## 2. Webpackを使用するメリット
- 一般的にWebページは、HTMLやJavaScript、CSS、画像など、複数のファイルから構成され、ファイルの数が多くなると、構成ファイルの依存性を正しく管理することが難しくなるが、Webpackを使用すればWebページを構成するファイルの依存性を自動的に処理してまとめてくれる
    - 依存関係が一目瞭然となるのでコードが読みやすくなる
    - 保守性が高くなる
    - コードを他プロジェクトに転用しやすくなる
- JavaScriptだけでなく、CSSや画像のファイルもバンドルできる

## 3. Webpackの使い方
- webpackをインストール

```console
$ npm install --save-dev webpack
```
- package.jsonの設定
    - npm run buildコマンドでwebpackが実行できるようになる

```json
"scripts": {
  "build": "webpack"
}
```
- webpackの設定ファイルwebpack.config.jsを作成

```javascript:webpack.config.js
const path = require('path');    // 引数にモジュール名を指定しモジュールを読み込む pathはNode.jsに標準モジュール（ファイルやディレクトリのパスを操作できるようになる）

module.exports = {
  entry: './path/to/my/entry/file.js',    // エントリポイントを指定 エントリポイントは依存する他のモジュールとライブラリウィ把握する
  output:{
    path: path.resolve(__dirname, 'dist'),    // path.resolve関数で絶対パスに変換 ルートディレクトリを表す__dirname（定数）の後に出力先を指定
    filename: "bundle.js"    // 出力するファイル名を指定
  }
};
```

- webpackをnpmコマンドで実行

```console
$ npm run build
```

## webpack-dev-serverを使用した開発
- webpack-dev-serverはwebpackで利用できる開発用のWebサーバー
    - スクリプトを書き換えるたびにWebページを更新できるので効率よく開発することができる

- webpack-dev-serverのインストール

```console
$ npm install --save-dev webpack-dev-server
```
- サーバーを立ち上げる

```console
$ webpack-dev-server
```
- package.jsonの設定
    - npm run startコマンドでwebpackが実行できるようになる

```json
"scripts": {
  "start": "webpack-dev-server"
}
```
- webpack.config.jsにサーバーの設定を記述

```javascript:devserver/webpack.config.js
module.exports = {
  //...
  devServer: {
    open: true,    // 起動時にブラウザーを開く
    contentBase: path.join(__dirname, 'dist'),   // バンドルファイルの出力先と同一にする サーバの起点となる
    port: 3000   // ポート番号 省略した場合8080
    }
}
```
- webpack-dev-serverを実行

```console
$ npm run start
```

### 参照
- [webpack - GitHub](https://github.com/webpack/webpack)
- [Concepts | webpack](https://webpack.js.org/concepts/)
- [Webページの構成ファイルをまとめる、モジュールバンドラー「webpack」入門](https://codezine.jp/article/detail/10408)
vuetifyをlaravelに入れる

#vuetifyとは

[公式サイト](https://vuetifyjs.com/ja/introduction/why-vuetify)では、全てのユーザーにリッチなWeb開発体験をお届けする、**「one of the most popular JavaScript frameworks in the world」**であると謳っている。
定期的なupdateやサポートも行っている模様。

他のvue.jsフレームワークとの比較の表が下記。なかなか魅力的なライブラリであるように思えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338175/044c37ce-1147-7a14-1d04-497994825c3b.png)

まんまと公式の謳い文句にのせられた感じはしますが、それじゃ使ってみようじゃないかと思い、自身の勉強用に作成したwebアプリに導入してみました。(laravel+vue+docker)

##導入方法

閑話休題、本題の導入方法ですが、基本公式ページのやり方に沿えば簡単にインストールできますが、備忘録も兼ねて下記に手順を記載します。
（＊ちなみに私の環境はlaravel6.6.2です。）

1.npmでvuetifyをダウンロード

```
npm install vuetify

npm install sass sass-loader fibers deepmerge -D
```

2.src/resources/js/app.jsに下記を追加

```src/resources/js/app.js
import Vuetify from 'vuetify';
import 'vuetify/dist/vuetify.min.css';
Vue.use(Vuetify);

const app = new Vue({
    el: '#app',  
    vuetify: new Vuetify()
});
```

これだけです。

試しに、Example-component内に、公式にある[cards]コンポーネントをサンプルのまま導入してみます。

```src/resources/js/components/ExampleComponent.vue
<v-app>
<template>
  <v-card
    class="mx-auto"
    max-width="400"
  >
    <v-img
      class="white--text align-end"
      height="200px"
      src="https://cdn.vuetifyjs.com/images/cards/docks.jpg"
    >
      <v-card-title>Top 10 Australian beaches</v-card-title>
    </v-img>

    <v-card-subtitle class="pb-0">Number 10</v-card-subtitle>

    <v-card-text class="text--primary">
      <div>Whitehaven Beach</div>

      <div>Whitsunday Island, Whitsunday Islands</div>
    </v-card-text>

    <v-card-actions>
      <v-btn
        color="orange"
        text
      >
        Share
      </v-btn>

      <v-btn
        color="orange"
        text
      >
        Explore
      </v-btn>
    </v-card-actions>
  </v-card>
</v-app>
</template>
```
うっかり創業者のコードを上書きしない技術

この記事は [SmartHR Advent Calendar 2019](https://qiita.com/advent-calendar/2019/smarthr) 14日目の記事です。

# はじめに

私は 3人目あるいは 4人目のエンジニアとして、 2016年2月に SmartHR に入社しました。
あれから約4年、[今となっては順調に権限移譲の進んでいる](https://blog.shojimiyata.com/entry/2019/12/03/132635) SmartHR ですが、当時は正社員が 7人しかおらず、全社員が様々な仕事を行う小さな企業でした。
当然エンジニアである副社長の @kakipo はプロダクトコードを書いていますし、非エンジニアである @miyasho88 も SmartHR にコードを書いては PR を投げていました。

**社長による PR**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36620/ce499961-a6c1-5fea-e716-cc514f0c9e3c.png)

こういった、創業者がコードに込めた思いというのはとても重要であり、おいそれと上書きしてよいものではありません。
この記事では、入社から 4年弱の期間、私がいかにして創業者のコードを上書きしないで済んだのか、その方法をお伝えします。

# うっかり上書きしないために

さて、では実際にどのようにしてコードの上書きを避けるのか説明します。その答えはいたって簡単で、 Git Hook にスクリプトを仕込むことで解決します。
commit する際に修正箇所の最終編集者を確認、創業者として指定したアカウント名が変更に含まれている場合はエラーを出して commit を中止する、という流れになります。
このスクリプトを実行するためには、創業者が commit に利用したアカウント名がわかる必要がありますので、それはなんとかして手に入れてください。

なお、本記事で扱うコードはほぼデフォルトの macOS Catalina 上でのみ動作を確認しておりますので、そのほかの環境では正常に動作しない可能性がありますのでご了承ください。

# 処理の流れ

スクリプト内で行われる処理の流れとしては以下のようになります。

1. git hook の pre-commit でスクリプトが実行されます
2. git diff から変更のあった行を取得します
3. git blame を使って変更のあった行を誰が書いているのか確認します
4. 指定したユーザ名が含まれる行を変更している場合にはメッセージを出力して git commit を中止します

# コード

プロダクト直下から `.git/hook/pre-commit` に以下のコードを追記します

```sh
BOSS_NAMES=YOUR_BOSS_NAME # カンマ区切りで複数指定可能です
file_names=(`git diff --cached --name-only`)

for file in ${file_names[@]}; do
    git_diffs=(`git --no-pager diff --cached --no-ext-diff -U1000000 ${file} | $(cd $(dirname $0) && pwd)/diff-lines.sh | grep -E "^[^\"].*\:[0-9]+\:\-"`)

    for git_diff in ${git_diffs[@]}; do
        line=(`echo ${git_diff//:/ }`)
        origin=`git blame -L${line[1]},+1 HEAD^ ${file} | awk '{print $2}' | sed -e 's/^(\(.*\)/\1/'`

        if [[ ${BOSS_NAMES} == *${origin}* ]]; then
            echo "You will overwrite ${origin}'s code in *****:${line[1]}"
            is_boss_exist=true
        fi
    done
done

if [ "${is_boss_exist}" ]; then
    echo "Commit aborted."
    exit 1
fi
```

なお、ここでは簡単のために、 [gitで変更ファイルの差分行番号を取得するには？ \- どこでも見れるメモ帳](http://ni66ling.hatenadiary.jp/entry/2015/04/25/153114) で書かれているコードをお借りして行番号を取得しています

そのため、上記のブログで使われている `diff-lines.sh` を `.git/hook` ディレクトリに保存し、 `chmod +x .git/hook` として実行権限を付与する必要があります

# 実際の動作

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36620/05735596-041b-0a19-6ade-fc73b21b0355.gif)

ちゃんと abort されましたね :tada:
どこで誰のコードを消したり上書きしようとしているか一目瞭然です。便利。

# 最後に

今回はうっかり創業者のコードを上書きしないために Git Hook を使ってコミットを中断させました。
しかし、動画作成のためにいろいろと探してみたのですが、 社長のコードはほぼ残っておらず、結果的として 2015年に作られた 12番目の PullRequest をチェックアウトすることとなりました。 ~~とても残念です~~ 
いつの間にか大量に書き換えていた事実に驚愕です。

記憶があれば、来年は _おまえは今まで書き換えた創業者のコードをおぼえているのか？_ をお送りいたします。

明日じゃなくて来年です。みなさま良いお年を！

# 参考

- [gitで変更ファイルの差分行番号を取得するには？ \- どこでも見れるメモ帳](http://ni66ling.hatenadiary.jp/entry/2015/04/25/153114)
【QA】検証の見積もりについて

# 概要

QAとしてソフトウェア開発の品質保証を経験する中で、「見積もり」についての考え方をまとめた。

なお、基本的な説明がない限りは、日本のWeb業界（アジャイル開発）に対する品質管理を想定した記述とする。
Web業界に関わらず、見積もりについて様々な意見やご指摘等を頂けたら嬉しい。


# 見積もりとは？

見積もりについての代表的な指標といえば、PMBOKの見積もり種別が一般的かと思うが、

- 超概算見積もり：−50%、+100%
- 概算見積もり　：−25%、+50%
- 確定見積もり　：−5%、+10%  
  *※計画の立ちあ上がりから各見積もりが作成され、右側の数値は実績との予実差に対する許容範囲となる。*

ソフトウェア開発における「見積もり」においては、PMBOKの見積もり種別を少しカスタマイズした、下記の種別が適していると考えている。

- 超概算見積もり：−50%、+100%
- 概算見積もり　：**−30%、+50%**
- **詳細見積もり　：−10% 、+20%**

カスタマイズを行なった理由は、

1. 5%の計算が面倒
2. ソフトウェア開発では他業界より見積もりからの変動が大きいため
3. 20%以内の増加なら平均２時間程度の残業、少人数の追加アサインでリカバリ可能な範囲のため

により、見積もり精度の範囲を調整している。

また、ソフトウェア開発においては確定見積もりとはあまり聞かず、詳細見積もりが最終的な見積もりとして作成されているケースが多いため名称も詳細見積もりと変更している。

# 見積もりの目的

なぜ見積もりが必要なのか？なんのために見積もりを行うのか？
見積もりを作成する理由や、作成した見積もりをどのように活用するのかについても筆者の考えを共有する。

1. スケジュール、予算の計画立案のため
   一般的な目的であり、あまり認識がずれる部分ではないので割愛する。

2. ##### 進捗状況の確認のため
   現時点の実績から開発完了までの見込みが、見積もり予実差の許容内に収まっているかを確認することが進捗状況を判断する１つの指標となる。
   大切なことは、見積もりの予実差内に収めようとするのではなく、見積もりの計画から大きな差異を発生させている原因を明確にすることだ。その原因が解決できるのであれば良いが、解決が見込めない場合は早期に再見積もりや再計画を検討する必要がある。

2. ##### 振り返りの指標
   一案件の検証が完了した時点で、見積もりを一つの基準として振り返りを行うことができる。
   この場合に、見積もりの予実差の許容内に収まったらOKで、収まっていないければNGとして分析を行ってもあまり意味がない。（個人の見積もり精度の向上に対しては意味はあるが、、、）

　　振り返りで必要な分析とは、

   **【予実差が許容外の場合】**

   - 余日差が発生した原因や問題は何か？
   - 見積もり時点でなぜ考慮ができなかったのか？
   - 問題をなぜ防げなかったのか？（どうすれば防げていたか？）
   - 問題の検知タイミングが適切だったか？
   - 検知したタイミングで適切な対応がされていたか？

   **【予実差が許容内の場合】**

   - 計画通りに進めるために、不適切な対応を行っていなかったか？
   - 期間や費用に過度なバッファがなかったか？
   - より改善するための余地はないか？
   
　　の観点で、プロジェクトが適切に運用されていたかを分析する。

   

# 各見積もりについて

各見積もりについても筆者の考えをまとめた。

### 超概算見積もり

企画の立ち上げ段階で頭出しとして受けた情報から、リーダーや担当者が過去の検証実績や案件の知見から大まかに見積もりを行う。基本的には超概算見積もり文書として作成することはなく、案件管理のガントチャートやアサイン管理表などに暫定工数として計画値として記載を行うケースが多い。

### 概算見積もり

要件定義書やPRDなどのドキュメントから見積もりを行い、テスト計画書としてドキュメントも作成する。この段階である程度の検証観点や検証スコープの大枠を企画／開発側と調整を行う。

概算見積もりでは検証対象の機能や画面などで分類し、更に工数規模で複数のグループに分けることで、工数規模ごとの工数見積もりを出せばグループに含まれる機能や画面の数との掛け算で工数を算出することができる。
概算見積もりの時点で細かい検証内容に落とし込んでから見積もりを行なっても、開発方法や仕様変更などによって再見積もりが必要となり工数がかかってしまうが、ロジックによる計算で概算見積もりを算出する方法であれば、計算するグループの数や係数を変更するだけですぐに再見積もりが可能となる。

設計期間と検証期間のそれぞれで実現可能なスケジュール、アサイン状況かを見積もりから判断する。検証期間に余裕がない場合は、開発スケジュールの遅延が致命的となるため、開発スケジュールをどの程度の頻度で把握する必要があるかも事前に調整しておくとスケジュールの調整が行いやすくなる。

### 詳細見積もり

検証観点や検証スコープが明確となり、テスト設計が可能な段階になったら詳細見積もりを行い、詳細見積もり文書としてドキュメントを作成する。

詳細見積もりでは検証観点を洗い出し、観点ごとに実施方法を考慮して検証工数の見積もりを行う。同じ観点でも機能や画面ごとに検証工数は変わってくるため、概算見積もりのグループ分けなども参考に各検証観点の工数は調整する必要がある。

詳細見積もりの工数をベースに、設計、検証実施の進捗状況を確認していくことになるため、検証スケジュールの区切りで余日差の工数感が把握しやすいように、ある程度機能や検証観点等で項目書を分けて見積もり工数をまとめるなど、設計や実行の進め方を考慮した見積もりの仕方が重要となる。


# まとめ

見積もりは作成したら完了ではなく、開発状況に合わせてスケジュールの調整やアサインの調整などを、開発フェーズの見積もり段階に合わせて調整を行い、余日差が見積もりの許容範囲を超える場合は再見積もりや時フェーズでの見積もりを調整する必要がある。
精度の高い見積もりを心がける事は必要だが、重要な事は開発進捗や状況に合わせて適切なタイミングでスケジュールやアサインを調整することと、最終的には詳細見積もりの余日差−10%〜＋20%の対応に柔軟に対応できる体制を整える事だ。
ベイズの定理の計算をグラフでイメージする

> ※この記事は、ベイズの定理に出てくるそれぞれの確率分布を幾何的にイメージしたときの筆者の脳内であって、数学的に厳密ではありません。
しかし個人的意見ですが、この記事のように数式にフリガナを振るようなことも理解を深めることに役立つと思います。

# ベイズの定理

```math
p(C_k|x) = \frac{p(x|C_k)p(C_k)}{p(x)}
```

　**ベイズの定理**を使って**事後確率** $p(C_k|x)$を求める過程を、**尤度**（クラス別密度） $p(x|C_k)$、**生起確率**（入力データの分布） $p(x)$のグラフを使ってイメージしたい。この記事では $k=1, 2$ で2クラス判別をする場合を考える。また、事前確率は $p(C_1) = p(C_2) = \frac{1}{2}$ とする。

# 尤度（クラス別密度）
尤度 $p(x|C_k)$ は以下のような分布をしていると設定する。
![尤度.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488916/e76c7d72-e41f-f9b3-debb-2067c81dbd31.png)
尤度は正規分布のような単純な分布ではなく複雑な分布を取り得るため、正確に尤度の分布を知るには大量のデータが必要になる。

# 生起確率(入力データの分布)
生起確率 $p(x)$ は
$$ p(x) = \sum_k p(x|C_k)p(C_k) = \sum_k p(x, C_k) $$
のように周辺化することで求められるから、下のグラフのようになる。
![生起確率.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488916/539e3da4-df7f-eba2-b09d-56f9bc15459b.png)

## 識別モデルと生成モデル（余談）
生起確率 $p(x)$ は $k$ に依存しない、つまり全クラス共通の係数であるから、クラス間の事後確率の大小のみを比較したい場合はわざわざ計算する必要がない。クラスの識別（分類）のみを目的とするなら余分な計算量となる。
しかし、$p(x)$ の意味を考えてみると、これは入力データの分布、つまりデータがどのように生じたかを表す分布と解釈できる。最近人気の架空のデータを生じさせる生成モデルは、この入力データの分布をもとにデータを出力している。

# 事後確率

$$ 事後確率 = \frac{尤度}{生起確率} \times 事前確率 $$
事後確率は上式で求められる。ちなみに、尤度と生起確率を、この記事中のグラフの色で置き換えると下のようになる。

$$ 緑 = \frac{赤}{紫} \times 事前確率 , 橙 = \frac{青}{紫} \times 事前確率 $$

実際に緑と橙を計算したものをプロットすると下のようになる。
![事後確率.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488916/672c51f6-bf1a-a206-cf50-4869e2238217.png)

先ほどの生起確率（紫）のグラフとこの事後確率（橙、緑）のグラフを一緒に眺めると、赤と紫がほぼ重なっている部分は緑がほぼ $1$ で一定になっていて、赤と紫がだんだん離れ始めると緑も下がり始める。

また、2つのグラフを同じ平面上にプロットすると下のようになる。
![拮抗.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488916/a5e2d682-cb7f-2840-418a-9c55f39268ae.png)
尤度（赤、青）が拮抗してる点で事後確率（橙、緑）は $\frac{1}{2}$ になる。つまり、尤度が一致したり近い値をとると、モデルはほぼランダムに識別する。
このような識別のもとになる確率を知ることができれば、確率が低い時に機械による判断を避けて人間に判断を委ねたりすることができる。（リジェクト）
MySQL コマンド一覧　メモ

##mysql 新規データベース作成
```
mysql> create user ユーザー名 IDENTIFIED BY 'パスワード';
```
##データベース作成
```
mysql>CREATE DATABASE test_db;
```
##ユーザー権限付与
```
grant all privileges on プロジェクト名.* to 'ユーザー名';
```
##データベースの中身をみるコマンド
```
mysql> show databases;
```

##テーブル一覧表示
```
mysql> show tables from プロジェクト名;
```

##テーブルの確認
```
mysql> describe テーブル名;
```

##テーブルの削除
```
mysql> drop table 削除したいテーブル名;
```

##テーブルにある見えてるレコードを全消去(以前消したデータの表面しか消せてないため、idは残る)
```
mysql> delete table cart_items;
```

## テーブルのレコード全てを全消去する(表面上消せていたものも含め)
```
mysql> truncate table cart_items;
```

##MySQLで外部キーの制約があるテーブルをtruncateする方法
```
Cannot truncate a table referenced in a foreign key constraint ・・・
```
このようなエラーが発生する時は一時的に外部キーの制約を外して対応します。

```
mysql> set foreign_key_checks = 0;
mysql> truncate table cart_items;
mysql> set foreign_key_checks = 1;
```

##指定したテーブルの全レコードの確認
```
mysql> select * from テーブル名;
```

##データベースの特定レコードのみ抽出
```
mysql> select name, email from users;
```

##データベースの特定レコードにWhere句で条件を付けて抽出
```
mysql> select * from users where id <= 1;

//=を使えば当然idが1のレコードを抽出
mysql> select * from users where id = 1;
```
##複合条件andを使ってidが3以上で、なおかつ、nameがhogehogeのものを抽出
```
select * from user where id >= 3 and name = ‘hogehoge’;
```
##複合条件orを使ってidが3以上、または、nameがhogehogeのものを抽出
```
select * from user where id >= 3 or name = ‘hogehoge’;
```
##あいまい検索（like, %, _）idが3以上で、nameの頭文字が「ho」の人」を取得したいとき
```
select * from user where id >= 3 and username  like ‘ho%’;
//「%」はho に続く任意の0以上の文字列をあらわし、「_」はho に続く任意の1文字をあらわします。
```
##ORDER BYを使って商品の価格が高い順に並び替え(itemsテーブルのamountカラムを使っています)
```
select * from items order by amount desc;
//ascは昇順でデフォルトのため入力しなくてもかまわない
//descは降順、入力必須
```
###特定のカラムのみ抽出
```
SELECT DISTINCT item_id, image_path FROM item_photos;
```
###mysqlでgroup BY
```
SELECT MIN(id), item_id, MIN(image_path)  FROM item_photos GROUP BY item_id;
```
![aacd780ee04a2263853426332a37f55e[1].png](https://gyazo.com/351c34f8f151179b93a3b3ece72f4f7c.png)
ゴルフ特有の動きの特徴点をオブジェクト検出で捉える

[前回](https://qiita.com/Chishiki/items/313b90431f1844120b07)、オブジェクト検出で追加学習を行い、ゴルファーとゴルフボールだけを追い掛けるモデルを作成しました。
しかし、ゴルフのフォームのチェックをAIを使って実施するには、画像からゴルフスイングの動きを捉えることが必要です。

##良いスイングとは何か？
誰に聞いても明確な答えが得られませんでした。人それぞれ体格や目標が違うから、見てみないとわからない、と。ではなぜ「レッスンプロ」という人が存在するのか？レッスンプロは人のゴルフスイングを見て、無意識に形を認識・分類し、独自の視点で良い点や矯正方法が思い浮かぶのだと思います。

これと同じことをAIに実行させるには、画像に写っている人物からゴルフのスイングを検出し、特徴点を把握して動きを捉える必要があります。さらに、おおよそこういう動きや角度なら「良いスイング」「ダメなスイング」と定義付ける必要もあります。

##特徴点を検出する
TensorflowJSには、[Posenet](https://github.com/tensorflow/tfjs-models/tree/master/posenet)という姿勢推定AIがありますが、ゴルフの場合、どうしてもクラブヘッドの位置を捉えなければならないため、また、特に後方からスイング撮影するとPosenetでは検出出来ない部位があり、Posenetは使えません。
なので、後方からのアドレス画像に限定し、頭、腰、右足、グリップ、クラブヘッド、ボールを認識出来るよう、オブジェクト検出で追加学習を行いました。
学習用アノテーション部位は以下の通りです。いろいろなトッププロ１００名の後方からのアドレス画像を使ってアノテーション化し、学習を行いました。
![スクリーンショット 2019-11-30 10.50.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74852/568b4437-cdc8-d780-df56-24af31847dfc.png)

##精度が上がらない原因
特徴点が悪いのか、そもそも部位の選択の仕方が悪いのか、精度が50%をなかなか超えません。
いろいろ試行錯誤の結果、オブジェクト検出をやっている人には常識なのかもしれませんが、対象となる人物画像やアノテーション部位の縦横サイズ大きさに大きく影響します。
つまり、人物引き気味の画像とアップ気味の画像が混在するアノテーションでは別のものとして認識するようで、なるべく画像の縦横幅を同じにし、映っている人物の大きさが同じになるよう選別し、学習実行すると90%を超える精度が出始めました。エポック数は14,000でした。学習に使っていない後方画像もしっかり認識しました。
以下の画像は、未学習写真です。
![スクリーンショット 2019-12-14 12.16.01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74852/d07ab9ea-f76f-5f65-71a8-5f394e0fe41a.jpeg)

##TensorflowJSに変換
ここまで出来上がったところで、モデルをJavascriptに変換します。[前回苦慮](https://qiita.com/Chishiki/items/313b90431f1844120b07#%E5%BC%95%E6%95%B0%E5%80%A4%E3%81%8C%E9%81%95%E3%81%A3%E3%81%A6%E3%82%8B)した部分です。
Pythonよりも慣れていること、即WEBサービスとして使ってもらえること、がJavascriptを利用する理由です。


##特徴点
四角形で囲められれば、あとは中心点を求めて点を描画するだけです。線で繋げてみます。
Javascript・Canvasの操作はお手の物です。
![スクリーンショット 2019-12-14 12.34.14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74852/24330fd2-b0ad-b685-d454-23c54cef140d.jpeg)

さらに１００名分の特徴点を取得し、見て取れる角度の平均や標準偏差・相関を算出し、閾を設定すれば、良いアドレスのモデルは出来そうな気がします。

さらにこれら座標から算出出来るバランス感、分類を行い、自分のアドレスと比較、矯正方法を示唆してくれそうです。

今後連続写真を使えば、スイング全体の良し悪し判断出来るかも。
予測 統計 (実践編 重回帰) python

勉強のアウトプットして書いてるのでもしかしたら間違えてる部分もあるかもしれないのでお気軽にコメントして下さい。今回は[予測 統計(実践編 単回帰) Python](https://qiita.com/banana19980702/items/8e6179216f9d8a115bc2)の続きで、さらに予測精度を上げていきます。

#内容
・重回帰分析とは
・ダミー変数とは
・重回帰のモデリング方法

##重回帰分析とは
重回帰分析と単回帰分析の違いは、説明変数が複数なのか一つなのかの違いだけです。重回帰分析の方が目的変数を説明する事象(説明変数)が増えるので予測精度が上がります。しかし、説明変数が多すぎると過学習になっていしまい逆に予測精度が下がってしまうことがあります。よって、説明変数の選択が重回帰においてはとても大切なことです。

##ダミー変数とは
ダミー変数とは天気のような数値であらわせないものをすうちで表すことです。これは重回帰においてとても重要な要素になります。pythonではダミー変数化できる関数が用意されています。以下のようにすれば数値に変換することができます。

```python
pd.get_dummies("ダミー変数化したい変数")
```

##重回帰のモデリング方法
重回帰におけるモデリングは単回帰とほとんど変わりません。代入する説明変数が増えるだけです。コードを書く量も単回帰よりも少ないかもしれません。実際にコードを見てみましょう。(欠損値は修正済)

```python
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
#現行のブラウザに表示
%matplotlib inline 
from sklearn.linear_model import LinearRegression as LR

#過去データ
train = pd.read_csv("train.csv")
#予測データ
test = pd.read_csv("test.csv") 
#予測値をいれるためのデータ
sample = pd.read_csv("sample.csv")

#説明変数を代入
#数値データは除外して実行してくれます。
trainX = pd.get_dummies(train[["列名1","列名2",...,"列名n"]])
testX = pd.get_dummies(test[["列名1","列名2",...,"列名n"]])

#目的変数の代入
y = train["列名"]

#回帰モデルの変数を作成
model = LR()

#重回帰モデルの作成
model.fit(trainX,y)

```