OmniAICreator/Qiita-1.07M huggingface dataset:
venv+pipでポータブルな環境を構築する

# はじめに
* Pythonのプロジェクトはある意味環境そのものなので、普通にシステムにpipで入れまくっていると、移植するときに何が必要かわからなくなって大変。
* そこで、Python標準で用意されているvenvとpipを使って、仮想環境を作りましょう。

## 記事の流れ
実際にプロジェクトを作る。その時にvenvを使って環境をシステムから切り離しておく。

次に実際に別の仮想環境へ移植してみる。

# venvで仮想環境を作る
## venvとは
venvはPython標準の仮想環境。

https://docs.python.org/ja/3/library/venv.html

PythonにはほかにもVirtualenvやらpyenvやらいろいろあるが、venvは公式が推しているという点で強い。

## 仮想環境構築
まず適当にプロジェクトのディレクトリを作る。ここでは```project1```とでもしておく。

次に```project1```へ入り、次のコマンドを実行する。

```
python -m venv test_env
```

ここで```test_env```は好きな名前にする。うまくいくと```project1/test_env```というディレクトリができる。

## 仮想環境に入る
このとき仮想環境は作られるが、まだ有効になっていないので有効化する。シェルセッションを立ち上げて最初は必ず入る必要がある（そうしなければシステムの環境がそのまま使われる）。

test_envの中にある```Script```に仮想環境を有効化するコードがある。

```
# bash
Scripts/acrivate

# windows(コマンドプロンプト)
.\Scripts\activate.bat

# windows(Powershell)
.\Scripts\Activate.ps1
```

Powershellの場合、デフォルトではExecution-Policyでブロックされるので、適切に変更する。

うまく有効化されると、プロンプトが下記のようになる。

```
(test_env) user@host:/path/to/project1 $ 
```

## 環境をいじっていく
といってもpipが使える。pipでガシガシ入れていく。たとえばtensorflowの1.13.1[^1]を入れてみる。ちなみにGPU版の```tensorflow-gpu```も特に問題なく入れることができる。

```
pip install tensorflow==1.13.1
```

そのあと、```pip list```してみると、下記のようにインストールされたライブラリが表示される。

<details><summary>pip listの結果</summary><div>

```
Package              Version
-------------------- -------
absl-py              0.8.1
astor                0.8.0
gast                 0.3.2
grpcio               1.24.3
h5py                 2.10.0
Keras-Applications   1.0.8
Keras-Preprocessing  1.1.0
Markdown             3.1.1
mock                 3.0.5
numpy                1.17.3
pip                  19.3.1
protobuf             3.10.0
setuptools           39.0.1
six                  1.12.0
tensorboard          1.13.1
tensorflow           1.13.1
tensorflow-estimator 1.13.0
termcolor            1.1.0
Werkzeug             0.16.0
wheel                0.33.6
```

</div>

[^1]: Tensorflowは最近メジャーアップデートがあり、Tensorflow 2.0がリリースされた。しかしTensorflow 1.x.xシリーズのコードをそのまま回すとうまくいかないこともあるので、システムをアップデートするのは結構勇気がいる。「既存の環境を変えたくないけどTensorflow2.0を試してみたいなあ」といったときに、venvを使えば共存させてインストールすることができる。

## 仮想環境から出る
シェルに応じて、Scripts以下のdeactivateという名前のスクリプトを実行する。

Powershellの場合、単に「deactivate」と唱えるだけでよい。

# 環境を移植する
ここから、仮想環境の真骨頂である移植に入る。

## requirements.txtの作成
移植元の環境で次のコマンドを唱える。

```
pip freeze > requirements.txt
```

やっていることは単純で、インストールされたライブラリとバージョンの一覧を```pip freeze```で出力し、それをパイプでrequirements.txtに書き込んでいるだけである[^2]。pip freezeとpip listの違いは下記。
https://note.nkmk.me/python-pip-list-freeze/

[^2]: 当然システムでもpip freezeはできる。しかしそのプロジェクトで使っていないライブラリも全部出てくるので、余計なものも紛れ込んでしまう。

## requirements.txtからインストール
新しい環境へrequirements.txtをコピーする。そしてpipで次を唱える。

```
pip install -r requirements.txt
```

すると、pip freezeで出力されたライブラリがすべてインストールされ、**移植は完了する**（Python関係については）。

# まとめ
venvを使えば、requirements.txtだけで移植できる環境を作ることができる。


# windowsでできない（未解決）
windowsでやると、たまに下のような症状が出る。

* Activateを実行してもプロンプトが変わらない
* pipがエラーで終了する。```python -m pip```で実行するとNot foundが返る。pythonを立ち上げてpathを見ると、仮想環境のpipへパスが通っていない

pythonpathを手動設定したりしてみたがうまくいかない。

力技で、ディレクトリを別の場所に切りなおして、作ったコードをコピーしてやり直すとうまくいった。
 
いい対処方法や不具合情報を知っている人がいたら教えてください。
OutSystemsのDecimalToInteger, TextToIntegerの挙動を調べてみた

# やったこと
OutSystemsのDecimalToInteger, TextToIntegerの挙動を調べてみました。

# きっかけ
Twitterで、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">あのあの <a href="https://t.co/yVje5JQ8E5">pic.twitter.com/yVje5JQ8E5</a></p>&mdash; kakiraちゃん (@kakira9618) <a href="https://twitter.com/kakira9618/status/1187280166961078272?ref_src=twsrc%5Etfw">October 24, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

を見かけて、OutSystemsのDecimalToInteger, TextToIntegerはどのような変換をするんだろうと思ったためです。

# 利用したOutSystemsのバージョン
* サーバー：Version 11.0.212.0
* Service Studio：11.6.2

# 結果

|Action|入力|出力|補足|
|---|---|---|---|
|DecimalToInteger|2|2||
||1.1|1||
||1.5|2|四捨五入されている|
||1.9|2|四捨五入されている|
||.1|0||
||0.000001|0|Twitterのケースは問題なし|
||0.0000001|0|Twitterのケースは問題なし|
||+1.1|1||
||-1.1|-1||
||4/3|-|Decimal expected!エラーになった|
||1,234|-|Decimal expected!エラーになった *1|
||1.23e+3|-|Decimal expected!エラーになった|
||1.23e-3|-|Decimal expected!エラーになった|
||0x3C1|-|Decimal expected!エラーになった|
|TextToInteger|2|2||
||1.1|0|小数を受け付けない模様|
||1.5|0|小数を受け付けない模様|
||1.9|0|小数を受け付けない模様|
||.1|0|小数を受け付けない模様|
||0.000001|0|小数を受け付けない模様|
||0.0000001|0|小数を受け付けない模様|
||+1.1|0|小数を受け付けない模様|
||-1.1|0|小数を受け付けない模様|
||4/3|0|分数もダメ|
||1,234|0|カンマが入っていてもダメ|
||1.23e+3|0|指数表記もダメ|
||1.23e-3|0|指数表記もダメ|
||0x3C1|0|16進数もダメ|

DecimalToIntegerは普通の小数（1.1など）を入力とするときは想定通り動作しました。ただし、カンマ区切り（1,234）、指数表記（1.23e+3）、16進数（0x3C1）はエラーになってしまいました。

TextToIntegerに関してはほぼ全滅でした。そこで`DecimalToInteger(TextToDecimal)`に変更したところDecimalToIntegerと似たような挙動となりました。ただし、4/3などを入力したときにDecimal expected!エラーではなく0を出力するという点が異なります。

# 想定外の挙動を示したものについてもう少し補足

* 国によってはカンマを小数点として利用します。そのため、カンマ区切りの数字を扱えないのはまずいのでは？と思い検索したところ、[同じように困っている人がいました](https://www.outsystems.com/forums/discussion/44368/decimal-separator-environment-configuration/)。DateFormatはService Centerから選べるのにDecimalやCurrencyが選べないのは不便だよねという意見があり、これを改善しようとするアイディアがあったのでいいねしておきました
* 指数表記に関しては、[こちら](https://www.outsystems.com/forums/discussion/37304/why-os-field-numeric-we-can-input-character-e/)には扱えるような会話がありますが、色々試したもののやはり扱えませんでした。どなたが方法をご存知の方がいれば教えて頂きたいです
* 16進数についてはやはりデフォルトでは扱えないようでForgeのComponentを使うとよさそうです
    * [Hex To Int, Int To Hex](https://www.outsystems.com/forge/component-overview/1175/hex-to-int-int-to-hex)
    * [Hex Conversion](https://www.outsystems.com/forge/component-overview/5548/hex-conversion)

# まとめ
* 普通の小数の表記（1.1など）をする分にはDecimalToIntegerは直感的に使える（四捨五入する点は注意）
* カンマを区切り文字とする場合（1,234など）、指数表記（1.23e+3など）、16進数（0x3C1など）はDecimalToIntegerは使えないため、個別の対応が必要
【Salesforce】フローのコアアクション「メールを送信」で送信者のアドレスが反映されない

タイトルの通り、プロセスの自動化 > フローのコアアクション「メールを送信」で送信者アドレスに入力しているのに反映されない件のメモです。

## やりたかった事＆実際の動作
組織のメールアドレスを送信者に設定したかったが、実際にはフロー実装者のアドレスがFromになっていた。

## 問題点
送信者タイプを"OrgWideEmailAddress"にしないとダメらしいです。

以下に記載されていました。
⇒[フローコアアクション: メールを送信](https://help.salesforce.com/articleView?id=flow_ref_elements_actions_sendemail.htm&type=5)

## 具体的にやった事
※<b>送信者にしたいアドレスを組織のアドレスに登録していること</b>が前提です。
1. 送信者タイプに"OrgWideEmailAddress"(直値)と入力
2. 送信者のアドレスにアドレスを直接入力

例：
送信者タイプ：OrgWideEmailAddress
送信者のアドレス：example@hogehoge.com

送信者タイプにはレコードとか変数がセットできますが、このケースでは直接"OrgWideEmailAddress"と入力すればOKなようです

そうしたら組織のアドレスで対応付けられている表示名がメールのFromに反映されました。
エンジニアリング組織論への招待を読んで

職場の先輩に進められ、下記本を読みました。
良本だったのと自分の備忘のためにも投稿します。

1.書籍の紹介
---
mixi一期生の広木さんが書いた書籍。現在は「株式会社レクター取締役」。

https://www.amazon.co.jp/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E7%B5%84%E7%B9%94%E8%AB%96%E3%81%B8%E3%81%AE%E6%8B%9B%E5%BE%85-%EF%BD%9E%E4%B8%8D%E7%A2%BA%E5%AE%9F%E6%80%A7%E3%81%AB%E5%90%91%E3%81%8D%E5%90%88%E3%81%86%E6%80%9D%E8%80%83%E3%81%A8%E7%B5%84%E7%B9%94%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0-%E5%BA%83%E6%9C%A8-%E5%A4%A7%E5%9C%B0-ebook/dp/B079TLW41L


※Qitaにも著者の紹介議事があったので掲載
https://qiita.com/hirokidaichi/items/1faf7a57cc55562a15e1


2.読もうと思った理由
---
1. 前述の通り先輩の紹介
2. 基幹システム刷新の企画フェーズに参画していたのだが、中々うまくいかず。。
　そんな中で割と共感できそうな部分が多かった。


3. 書籍の要約
---

** Chapter 1　思考のリファクタリング **

* 思考の違いによる不確実性（エントロピー）から発生する様々な事象（プロジェクト初期の不確実性やコミュニケーションコスト、認知の歪み、ベーコンの４つのイドラ、情報の非対称性）を紹介。  
　→エンジニアリングとは以下のエントロピーを下げることと定義
　　・不確実性（エントロピー）
　　　未来：環境不確実性
　　　　　方法不確実性
　　　　　目的不確実性
　　　他人：通信不確実性（環境不確実性を増大させる）
* 論理的思考を、1.演繹的思考、2.帰納的思考、3. 仮説思考、と紹介。
* ロジックツリーとシステム思考→つまりシステムとは全体から捉えらこと（全体論的思考）
* 問題解決より問題発見のほうが難しい
　→全体の問題性を整理すれば問題は解決すると紹介

** Chapter 2　メンタリングの技術 **
* 傾聴・可視化・リフレーミング
* アクノレッジメントの段階
　１．存在承認
　２．行動承認
　３．結果承認

** Chapter 3　アジャイルなチームの原理 **
* プロジェクトマネージとプロダクトマネージャーの関心事の違い
　プロジェクトマネージャー：コストと納期、プロジェクト期間、方法論、
　プロダクトマネージャー：プロダクトの目的、マーケット
* アジャイルソフトウェア宣言の重要性
　個人と対話
　動くソフトウェア
　顧客との協調
　変化への対応

** Chapter 4　学習するチームと不確実性マネジメント **
* エージェンシースラック：依頼された人は管理されないとウソをつきだす。
→見積もりやスプリント
* リーンキャンバスによる仮説の作り方

** Chapter 5　技術組織の力学とアーキテクチャ ** 
* 権限と責任の委譲、デリゲーションポーカー、
→技術負債とコンウェイの法則


4. 所感
---
個人的には前半の思考のリファクタリングが響いた。プロジェクトだけでなく一般生活でもあるある。
* 人は立場や目的が異なる中それぞれ意見するのでよく衝突するが、システム思考で全体を捉えて、情報を整理すると問題が解決する、
* 仮説思考からの論理展開、論理的思考の盲点：人は正しく事実を認知できないなど
　イドラ：種族・洞窟・市場・劇場
　認知の歪み：ゼロイチ思考、一般化のしすぎ、すべき思考（大学生だから就職しないと。。）、レッテル貼り、結論の飛躍、感情の理由付け
などなど

あとはアジャイルもちょうどしてたので響く。

思考を整理するための知識としてとても面白い本でした。How to本というよりも読み物という印象でした。
postgresでmediawiki

#はじめに
　今まで、sqliteでmediawikiを運用していたのだが、なんか遅くなってきて、postgresに変更したときのトラブル顛末。あまりpostgreのデータがないのでとりあえず。

##2021/11/21の追記
　うまくいっていたつもりだが、1.30->1.35へのupgradeでトラブル中である。どうも、postgresのuserはmwuserというテーブルになっているので、maintenance/update.phpがきちんとpostgreをサポートしているのかが怪しい。まあこのトラブルを克服したのであれば、また新規ページを追加するが、その日が来るのかはあやしい。(と思ったがけっこうpostgreには関係ありませんでした)[mediawikiのupgradeのトラブル解決](https://qiita.com/hawaii_hahaha/items/58d40d02dfe7d691edb1)

#移行のパス
  - postgreで新規にmediawikiをインストールする
  - 
　- 旧のsqlite側で
`php maintenance\dumpBackup.php backup.xml`
  - 新のpostgre側で
`php maintenance\importDUmp.php < backup.xml`
 ということで大丈夫でした。

#経緯１
　sqliteのdumpでsqlを出力し、postgreにこのsqlを読み込もうとさせたのだが
まず、これがだめ。
　sqliteではautoincrementとかあるが、postgreはserialというデータにしないと
あかんとか、sqliteのblobをbyteaにするとかしてもあまりうまくいかない。

　pgloaderも試してみたが、うまく動かなかった

#経緯２
 そもそも、mediawikiにはuserというtableがあるのだが、これがpostgreでは予約語
であかん。そのために、localSettings.phpにはpostgre用に
 `$wgDBmwschema`というのがあって、スキーマでこれを設定したdatabaseを作成しておく
必要がある。
<pre>
create database mywiki;
create schema mw;
</pre>
とかにして、これをインストール時に設定するというのがpostgreを使うときのノウハウである。

#
SalaesforceのDataloaderで日付を条件にExportしたらエラーになった

タイトルの通りの上手くいかなかったので、備忘録としてまとめておきます。

## やったこと
DataloaderのStep3 Edit your Queryで以下のように取得しようとしました。

```
Select Id, Name, email__c FROM Sample_Object__c WHERE date__c = 2019/10/31 
```

## 結果
こんなエラーが出ました
<pre>
sample_object__c WHERE date__c=2019/10/31
                        ^
ERROR at Row:1:Column:77
unexpected token:'/'</pre>

## いけなかった点
Dataloaderの日付型では"/"は受け付けていないようです。
Salesforceの画面ではできるのにね…

## 修正点
そんな訳でこんな感じで書けば動きます。

```
Select Id, Name, email__c FROM Sample_Object__c WHERE date__c = 2019-10-31 
```

変更箇所
"2019/10/31" ⇒ "2019-10-31"

些細なことで手間取ると悔しいですよね…
JavaScriptのコールバック関数

JavaScriptのコールバック関数についてのメモです。

コールバック関数とは、`ある関数の引数`に渡される`関数`のことです。
Java Scriptはソースコードを上から順番に実行してくれる訳ではありません。
意図した順番に処理を実行するために使われるのが`コールバック関数`です。

コードは全て[プレイグラウンド](https://www.katacoda.com/courses/nodejs/playground)で実行できますので、試してみてください。

# コールバック関数を使わない場合

hello,byeの順番に出力したいのですが、
次のようなソースコードだとbye=>helloの順に出力されてしまいます。

```javascript
//1秒待ってhelloと出力する関数の定義
function hello() {
   setTimeout(() => {
      console.log('hello')
   }, 1000);
}
//byeと出力する関数の定義
function bye(){
  console.log('bye');
}
//処理の実行
aisatsu();
function aisatsu() {
   hello();
   bye();
}
```
出力結果

```javascript
bye
hello
```

# コールバック関数を使った場合

では、hello=>byeの順番に出力するためにコールバック関数を使ってみましょう。
byeの関数をhelloのコールバック関数として渡しています。

byeの関数の書き方も変わってますね。byeの関数をそのまま渡すのではなく、一度変数に入れるようにしました。
アロー関数の書き方については、[こちら](https://qiita.com/maruuuuu/items/157df0abbf01b30d790c)を見てみてください。

```javascript
//1秒待ってhelloと出力する関数の定義
//コールバック関数でbyeを渡す
function hello(callback) {
   setTimeout(() => {
      console.log('hello');
      callback(); //ここでコールバック関数のbyeを実行
   }, 1000);
}

//byeと出力する関数の定義を変数byeに入れる
const bye = () =>
  console.log('bye');
  
//処理の実行
hello(bye);
```
出力結果

```javascript
hello
bye
```
hello、byeの順番で出力できましたね。

## (参考)setTimeout関数　
次の場合は1秒後に処理が実行されます。

```javascript
setTimeout(() => {
   //処理
}, 1000);
```
Google Colbでmatplotlibを使ってみる。

# GoogleColaboratoryでますます楽しい
ディープラーニングを始めたこともあり、もっぱら戦場がこっちに移った。
Cloud開発環境ってどうなん？って感じだったがめちゃくちゃ快適だった。
これさえあれば、何もいらない。

# でも今回はColbratoryの話じゃない
始め方とかから書いたほうがいいかと思ったけど、それはおいおい書いていくことにする。早く書かないと忘れるなコレは。
そのうちここにリンクつけて追記することにします。

# matplotlibを使って写真を描写しよう
これをやる経緯としてはディープラーニングの過程で写真を表示させようとしたからです。
割と苦戦して半日くらいかかってしまった。
では、以下よりアウトプットです。


# 単フォルダより複数枚の写真をグラフに描写する
文字にすると難しそうだが、みんなやってるから…苦戦した自分が悔しい。
なお、表示させたのはうちの犬です。ぽーちゃんです。


#### 1 | まずは兎にも角にもパス通します。<br>
※GoogleDriveにデータあるのが前提です。<br>　別にローカルから上げてもいいけどね…

```py
from google.colab import drive
drive.mount('/content/drive')
input_dir="写真が入っているフォルダのパス"
```
<br>
#### 2 | 対象が参照出来ているか確認<br>
※GoogleDrive、ちょっとしたタイムラグがあったりする。せっかちな人こそちゃんと確認してね。あと、「.jpg」に特に意味はありません。なんとなく「.jpg」

```py
import os
import glob
# このセルを実行して保存したjpgファイルが参照できているか確認
l = glob.glob(input_dir+'/*.jpg')
print(l)
```

<br>
#### 3 | これでひとまず出来ました。<br>
matplotlibは探すとけっこうみなさん丁寧に書いてくれています。
俺もこだわらなければここまではあっさりできました。<br>（こだわって半日ならいいかw）

```py
## Main | 単一フォルダ/複数画像の表示

import matplotlib.pyplot as plt
from keras.preprocessing import image
from keras.preprocessing.image import ImageDataGenerator
from PIL import Image
import glob
import random

## 1 | 画像が格納されているフォルダを指定

files=glob.glob(input_dir + '/*.jpg')
cnt=len(files) 

## 2 | 出力画像/配置設定(なんとなくランダム配置にしてみる)
figrand=random.sample(files, cnt)
col=5
row=cnt//col
cols=col*3
rows=row*4
dpis=100

## 3 | 各画像表示サイズ
fig = plt.figure(figsize=(cols,rows), dpi=dpis)

## 4 | 画像表示
for i, img in enumerate(figrand):
  plot_num=i+1
  ax=fig.add_subplot(row, col, plot_num)
  ac=os.path.basename(img)
  ax.set_title(ac)
  img=Image.open(img)
  plt.imshow(img)
```
<img width="837" alt="2019-10-27.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493685/b62f8797-f683-4375-be25-a59f79dcac53.jpeg">

はい、かわいい。
<br>
#### 4 | 今回は使ってないけどメモ<br>
写真じゃなくて、npyとかから画像出力するなら
コード最終行のこれを

```これ.py
plt.imshow(img)
```

こっちにすると

```こっち.py
plt.imshow(np.asarray(img))
```

良いらしい。
もし配列からやるときは追記してみますね。
今回はすいません。

<br>
#### 5 | ひとまず今回はここまで
次回は「複数フォルダより複数枚の写真をグラフに描写する」
※じつはやりたかったのはこっち
dockerを使ったlaravelでの「Connection refused」エラー


##趣旨
Connection refusedでdatabaseが繋がらない状況だったのでその対処をまとめました。

##内容

以下を実行したところ、、

```
# php artisan migrate
```

Connection refusedのエラーをよく見るとlaravelの.env設定とdocker-composeの設定があっていないのではとの仮説

```

   Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = database and table_name = migrations and table_type = 'BASE TABLE')

  at /var/www/html/laravel/vendor/laravel/framework/src/Illuminate/Database/Connection.php:665
    661|         // If an exception occurs when attempting to run a query, we'll format the error
    662|         // message to include the bindings with SQL, which will make this exception a
    663|         // lot more helpful to the developer instead of just the database's errors.
    664|         catch (Exception $e) {
  > 665|             throw new QueryException(
    666|                 $query, $this->prepareBindings($bindings), $e
    667|             );
    668|         }
    669| 

  Exception trace:

  1   PDOException::("SQLSTATE[HY000] [2002] Connection refused")
      /var/www/html/laravel/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=database", "root", "password", [])
      /var/www/html/laravel/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  Please use the argument -v to see more details.
```

docker-compose.ymlを確認します。

```docker-compose.yml
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: [データベースの名前]
      MYSQL_USER: [データベースのユーザ名]
      MYSQL_PASSWORD: [データベースのパスワード名]
      MYSQL_ROOT_PASSWORD: [データベースのパスワード名]
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
```



laravelの中に置いている.envはdocker-compose.ymlで定義した名に合わせます。
一般的にPORTはmysqlなら3306で。
＜公式＞
https://readouble.com/laravel/5.4/ja/homestead.html

```html:.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=[docker-composeで定義したデータベース名]
DB_USERNAME=[docker-composeで定義したユーザ名]
DB_PASSWORD=[docker-composeで定義したパスワード名]
```

DB_HOSTはdocker-compose.ymlで「mysql」と命名していたので、「mysql」としてますが、「db」などで命名している場合はDB_HOST=dbにしてください。
docker-composeでリスタートします。

```
 $ docker-compose restart
```

コンテナに入り、ご自身が作成したlaravelのルートファイルで再度php artisan migrateをします。

```
 $ docker-compose exec app bash

# ls
docker	docker-compose.yml  laravel

# cd laravel

# php artisan migrate
```

できました！！！

```
# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.11 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.04 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.03 seconds)
```
Web系職種のキャリアパス（Webエンジニア、Webデザイナー他）まとめ

Web業界のキャリアパスについて調べたこと、考えたことをここにまとめます（随時更新）

# Webデザイナーのキャリアパス

UXベン図に基づく3方向（ビジネス、デザイン、テクノロジー）のキャリアパス

* ビジネス：Webディレクター
* デザイン：UI/UXデザイナー
* テクノロジー：フロントエンドエンジニア

自分はフロントエンドエンジニアを目指す！！

※参考：[Webデザイナーに必要なスキルと代表的な7つのキャリアパス](https://www.i-ryo.com/entry/2019/03/17/152938)

# Webデザイナーの求人件数（都道府県別）

indeedの求人情報からWeb系職種の例として、webデザイナーの求人件数をグラフ化した。いかに東京に一極集中しているかがわかる。（Webエンジニアなども同じ状況と思われる）

※参考：[【indeed】Webデザイナー求人件数を都道府県別に調べてグラフにした（2019年3月版）](https://www.i-ryo.com/entry/2019/03/20/084337)

# Web系職種別スキル集計

indeedの求人情報からWeb系職種別にスキルを集計してグラフ化してみた。対象職種は下記。

* Webデザイナー
* Webディレクター
* UI/UXデザイナー
* フロントエンドエンジニア
* サーバサイドエンジニア

※参考：[【indeed】職種別スキル集計：Webデザイナー、Webディレクター、UI/UXデザイナー、フロントエンドエンジニア、サーバサイドエンジニア（2019年3月）](https://www.i-ryo.com/entry/2019/03/27/084453)

# Webエンジニアの技術キーワード集計

indeedの求人情報からフロントエンド〜バックエンドの技術キーワードをジャンル毎に集計してグラフ化した。

* Web業界全体
  * デザインアプリ
  * テキストエディタ
  * Webマーケ
  * 言語
* フロントエンド
  * テンプレートエンジン
  * CSSフレームワーク
  * AltCSS
  * SPA
  * AltJS
  * リッチコンテンツ
  * ゲームライブラリ
  * モバイル対策
  * ハイブリッドアプリ
* バックエンド
  * サーバサイドFW
  * CMS
  * EC
  * DB接続
  * webサーバ
  * Git
  * クラウド
  * 仮想環境
  * ネイティブアプリ
  * ゲームエンジン

※参考：[【indeed】Web業界（フロントエンド〜サーバサイド）技術キーワード別の求人件数（2019年4月）](https://www.i-ryo.com/entry/2019/04/02/132702)

# Webエンジニアの位置付け（総務省資料）

日本の産業界の中でWebエンジニアはどのような位置付けにあるのかを知りたくなり、総務省の資料を調べてみた。

※参考：[WebエンジニアやWeb業界の日本産業界での位置付け（総務省資料より）](https://www.i-ryo.com/entry/2019/08/13/074435)
郵便番号から住所の入力補完システムを作ろう

郵便番号の入力を得て、都道府県から字名を出力するsomethingを作りました。
ネットショッピングをする際、住所の欄で郵便番号を入力すると字名まで入力補完してくれるシステムがありますが、それがどのように動いているのか気になったので書いてみました。
使用したDBや言語は既存のものと異なりますが、似た動作をしたらOKとします。

#使用したもの
・ Terminal
・ python 3.6.1
・ pandas 0.24.2
・ sqlite3 2.6.0 (モジュールのバージョン)
・ SQLite3 3.24.0 (SQLite3のバージョン)

# 注意
Terminalからpythonを実行していたり、SQLite3を実行していたり、pythonのファイルを書いていたりしているので何を使って実行をしているか間違えないように気をつけてください。

# 完成までの手順
Step 0. CSVファイルをダウンロードする。
Step 1. CSVを整える。
Step 2. データベースを作る。
Step 3. pythonでテーブルからデータを取得する。

完成！

#作ってみよう
## Step 0. CSVファイルをダウンロードする。
[リンク](https://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html)から全国一括のものをダウンロードしてください。
ダウンロードしたCSVの文字コードがShift-JISとなっているのでUTF-8に変換してください。
.read_csvの時点でエンコーディングをしても構いません。

## Step 1. CSVを整える。
カラム名の追加と不要な列の削除をします。
カラムは郵便番号と漢字の都道府県,市区町村,字名のみを使用します。
インタプリタを使用したパターンと
*私の開発環境ではpyenvを使用しているのでpythonで3系が起動されますが、pyenvを使用してない方はpython3でインタプリタを起動してください。

### Terminalからインタプリタを使うやり方

```python:terminal
$ python
>>> import pandas as pd
>>> df = pd.read_csv('KEN_ALL.CSV', header=None)
>>> df = df.drop([0,1,3,4,5,9,10,11,12,13,14],axis=1)
>>> df.columns = ['郵便番号','都道府県','市区町村','字名']
>>> df.to_csv('output.csv')
>>> quit()
```

### pythonファイルを書くやり方
最後にpythonファイルを実行してください。

```python:shaping.py
import pandas as pd

df = pd.read_csv('KEN_ALL.CSV', header=None)
df = df.drop([0,1,3,4,5,9,10,11,12,13,14],axis=1)
df.columns = ['郵便番号','都道府県','市区町村','字名']
df.to_csv('output.csv')
```

## Step 2. データベースを作る。
CSVをテーブルにインポートしてデータベース化します。

```terminal:terminal
$ sqlite3 postal_code.sqlite3
sqlite> .mode csv
sqlite> .import output.csv postal_code
sqlite> SELECT * FROM postal_code; -- インポートされたかの確認ができます。
sqlite> .exit
```

## Step 3. pythonでテーブルからデータを取得する。
作成したテーブルをpythonから検索して、マッチしたデータを取得します。
input()で郵便番号の入力を受け、データベースに検索をかけ、結果を表示します。

```python:postal_code_completion.py
import sqlite3

print('\n郵便番号から住所を検索します。')
while True:
    flag = 0
    postal_code = input('郵便番号を入力してください。　*ハイフン不要 -> ')
    while True:
        ask = input('{}でよろしいですか？ y or n -> '.format(postal_code))
        if ask == 'y':
            flag = 1
            break
        elif ask == 'n':
            break
    if flag == 1:
        break

conn = sqlite3.connect('postal_code.sqlite3')
c = conn.cursor()
c.execute('SELECT * FROM postal_code WHERE 郵便番号={}'.format(postal_code))
re = c.fetchone()
conn.close()

if re == None:
    print('\n入力された郵便番号はデータベースに存在しません。\n')
else:
    print('''\n郵便番号とデータベースがマッチしました。
----------------------------------------
都道府県：{}
市区町村：{}
字名：{}
----------------------------------------\n'''.format(re[2],re[3],re[4]))
```

## 完成
terminalからpostal_code_completion.pyを実行してみてください。

```terminal:terminal
$ python postal_code_completion.py 
```
ハイフン無しで郵便番号を入力すると、データベースを参照して字名までの住所が表示されます。
郵便番号によっては、「以下に掲載がない場合」と表示されるのでその場合の条件分岐を実装してもいいと思います。

# 感想
今回は既存のシステムに似たものを書きましたが、車輪の再発明は開発面では無駄とは言え、学ぶ面においてはとても大事だと思っています。
身の回りにあるものの実装にチャレンジしてみるのも楽しいなと思いました。
Unity玉転がしチュートリアル 3-2.Pick Up オブジェクトの収集

# この記事の対象者
* Unity入門したい人
* 最初の一歩が踏み出せない人

# OSとか環境とか

* Windows 10 Pro
* macOS Mojave
* Unity 2019.2.8f1
* Rider 2019.2.2

# 補足
* 公式動画にて利用しているのはMacなので、Windowsユーザーはある程度脳内変換して見る事
* 筆者はWindows、Macの両方の環境で確認。Ubuntuとかでは検証してない。
* 基本Unityは英語メニューで利用
* 間違いがあったらツッコミ大歓迎

# 公式

https://learn.unity.com/tutorial/collecting-scoring-and-building-the-game#5c7f8529edbc2a002053b789

## アイテムの取得

アイテムとプレイヤーが衝突したとき取得する処理を行う

長らく非表示だったプレイヤーオブジェクトを可視化する

PlayerController.csを開き、OnTriggerEnterメソッドで衝突判定を実装する

## タグの設定

オブジェクトにTag名をつけて判別する為、準備を行う


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/d1e7ea47-3094-ebbf-71e5-2099c4f16e8b.png)


現在は「Untagged」になっているので、タグを追加して付与する
Add Tag より「Pick Up」タグを追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/ed7daa72-5377-bdfa-7bdf-4cb99e59b533.png)

これでプロジェクトに新たにタグが作成されたので、Pick UpのPrefabに対してタグを設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/9d9b7fd8-4a02-4f79-6d55-8547587737e6.png)



Prefabを利用しているので、ゲーム内の12個のPick Upオブジェクトにも同様のタグが付与される


Colliderに対してトリガーを設定し、衝突検出をOnTriggerEnterメソッドで検出出来るようにする
※何故トリガーを設定する必要があるかは公式動画の9:51～11:51ぐらいまでを見る必要あり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/7029c7b5-e864-cf81-ae46-74be08dbe4d1.png)



PlayerController.csに衝突判定用のコードを追加する

```PlayerController.cs
private void OnTriggerEnter(Collider other)
{
    if (other.gameObject.CompareTag("Pick Up"))
    {
        other.gameObject.SetActive(false);            
    }
}
```

このままプレイした際に、しっかりプレイヤーとアイテムが衝突した際にアイテムが非表示になる

しかし、問題点がありUnityは特性上静的Colliderについて領域情報のキャッシュを保持している
本来ならば、静的なのでキャッシュ情報は再計算等が必要なくなるのでとても良いが今回はアイテムが回転するので
毎回キャッシュするのは非常に無駄

ColliderとRigidbodyの両方があるゲームオブジェクトは全て動的と見なされるのでRigidbodyを追加
追加すると動的Colliderとして認識されるが、重力を感じるようになるので床をすり抜けてしまう

その為にIs Kinematicにチェックを付けてオブジェクトを物理演算の影響を受けない様にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/41de2472-97d1-22f8-a438-8fa121a67e04.png)
医療機器エンジニアから業界未経験でプログラマに転職した話

#はじめに
この記事は沖縄生まれ沖縄育ちの筆者が、医療機器エンジニアから名古屋のIT企業に転職した話です。

#転職成功までの流れ
**沖縄で退職　→　2ヵ月待機　→　名古屋引っ越し　→　2ヶ月で転職成功**

#経歴
筆者は沖縄生まれ沖縄育ち。

高校　→　工業高校(電気電子系)

大学　→　職業訓練校(電気電子系)

高校時代から電気電子に関心があり、勉強をしていました。
大学も職業訓練校(短大のようなシステム)で実践的であり即戦力になれる能力を磨いていました。

大学の就職活動で、医療機器の修理、メンテナンスをしている企業とご縁があり新卒で入社しました。

そちらの会社では、1年8ヵ月お世話になりました。
退職した理由としては、同じような作業を繰り返す業務が自分に合わなかったことが大きな理由です。
他には、これからの働き方を自分で選べるような仕事をしたいという理由もありました。

#退職後の話
転職活動の基本としては、

**転職先を見つけて退職**

が普通というかスタンダードな方法ですが、
私の場合は

**退職　→　引っ越し　→　転職活動　→　転職**

という流れになりました。。。

これはおすすめできない方法ですし、今後転職するようなことがあれば私はしません。(笑)

今回の場合は、私が転職に対して知識が浅かったことが大きな要因ですが、
沖縄に住んでいる状態で名古屋で転職活動は難しいという判断でした。

なので、
沖縄に住んでいる間はハローワークへ通い、雇用保険の手続きなどを行っていました。

#退職してわかったこと
まず、雇用保険のシステムをはじめて理解しました！(筆者が勉強不足なだけです)

雇用保険に入っていると退職後に**失業手当**を受け取れます。
(様々な条件を満たしている必要があります)

失業手当はざっくり解説すると、就職活動をしていれば毎月アルバイト代ほどの手当を受け取れます。
実際、手当の金額は前職の給料から計算されるので人それぞれです。

また、この失業手当は支給開始前に就職が決まれば、**再就職手当**として
一括で受け取ったりできます！

**私は早めに転職が成功したので、再就職手当を受け取りました！**

ここで話した内容はかなりざっくり書いているので
詳しく知りたい方は調べてみてください。

#転職した話

現在、名古屋の自社開発企業に入社して半年ほどです。

この会社に出会ったのはリクナビNEXTです。

第一印象としては面白そうな会社だなと思いました。
また、学生時代にプログラミング経験もあったので面接を受けてみました。

実際に話してみると、とても雰囲気が良く、自社開発にも携われるということで
私の理想とマッチした部分が多かったので入社を決めました。

現在は客先常駐で修行中ではありますが、
会社の雰囲気は非常に良く、環境、業務どちらでも満足しています。

まだ小規模の会社ではありますが、これから規模を大きくしていく過程に携われることは
良い経験になると思っています。

#最後に

今回の記事は転職についてでした。

この記事で私の会社が気になった方も居るかもしれませんが、
まだ、会社名は公開していないので、今後公開した時にHPを観ていただけるとありがたいです。
ピボットテーブルを配置したExcelファイルを処理する

##目的
C#のアプリで、ピボットテーブルを配置した既存のExcelファイル（対象ファイル）にデータを追加し、保存する。

##失敗例
- ClosedXMLでは、対象ファイルを読み込んで、データを追加後、保存しようとすると、時間がかかりすぎる。現時点では、ピボットテーブルがあるファイルのClosedXMLでの処理は難がある。
- C1.WPF.Excelでは、ピボットテーブルが保存後、利用できなくなる（処理できない）。
- Microsoft.Office.Interop.Excelを利用して、対象ファイルを開き、データを追加し、保存するのはOKだが、データの追加に時間がかかりすぎる。

##解決策
1. ClosedXMLで追加するデータを作成し、一端、xlsxとして保存する（データソース）。
2. 次に、Interop.Excelを利用して、対象ファイルと、データソースを開き、データソースから、対象ファイルに、データをコピーする。（RangeからRangeへコピー）

##考え
データのコピーは、対象ファイル上のExcel VBAでコピーを行っても良いだろう。
日本語プログラミング言語「プロデル」でMNISTの分類をやる

一層のニューラルネットワーク（？）でMNISTの分類をしたいと思います。

## MNISTデータの前処理

MNISTのデータは，バイナリ形式なので，これを読み取るための種類を作ります。バイナリのフォーマットは，[MNISTのウェブページ](http://yann.lecun.com/exdb/mnist/)の一番下に書かれています。

プロデルでバイナリデータを読み込む上で注意しないといけないのは，バイナリ関連の手順がすべて保護機能になっている点です。セキュリティ関連の歴史的経緯から，開発者登録をしないとこの機能が使えません。登録は[このページから](https://rdr.utopiat.net/dev/usage.html)一瞬でできます。

まず，読み取ったバイトデータを32ビット整数に変換する手順を作ります。

```プロデル:MNIST.rdr
【バイト：配列】を整数化する手順
	【出力：整数】
	バイトの個数回，【カウンタ】にカウントして繰り返す
		出力は，出力＋バイト（カウンタ）×256^（バイトの個数-カウンタ）
	繰り返し終わり
	出力を返す。
終わり
```

ビッグエンディアンであると書かれているので，このような処理になりました。

次に，この手順を使ってデータを読み込んでいきます。ファイルの最初の4バイトがマジックナンバーとなっており，2049の場合はラベルデータ，2051の場合は画像データです。

ラベルのデータは，one-hotベクトルにする必要があるので，そのようにしています。

```プロデル:MNIST.rdr
MNIST読取器とは
	【MNIST】は，バイナリファイルを作ったもの。
	はじめ（ファイル）の手順
		MNISTへファイルを読み取り専用で開く。
		マジックナンバーは，｛［MNISTから読み取ったもの］，［MNISTから読み取ったもの］，［MNISTから読み取ったもの］，［MNISTから読み取ったもの］｝を整数化したもの。
		【データ数】は，｛［MNISTから読み取ったもの］，［MNISTから読み取ったもの］，［MNISTから読み取ったもの］，［MNISTから読み取ったもの］｝を整数化したもの。
		もしマジックナンバーが2049なら　’ラベル
			データは，行列（データ数，10）を作ったもの。
			データ数回，【現在行】にカウントして繰り返す
				【添字】は，MNISTから読み取ったもの＋1。
				【一行】は，｛0，0，0，0，0，0，0，0，0，0｝。
				一行（添字）は，1。
				データの中身（現在行）は，一行。
			繰り返し終わり
		他でもしマジックナンバーが2051なら　’画像
			【画像サイズ】は，（｛［MNISTから読み取ったもの］，［MNISTから読み取ったもの］，［MNISTから読み取ったもの］，［MNISTから読み取ったもの］｝を整数化したもの）×（｛［MNISTから読み取ったもの］，［MNISTから読み取ったもの］，［MNISTから読み取ったもの］，［MNISTから読み取ったもの］｝を整数化したもの）。
			データは，行列（データ数，画像サイズ）を作ったもの。
			データ数回，【現在行】にカウントして繰り返す
				【画像一つ】は，｛｝。
				画像サイズ回，【カウンタ】にカウントして繰り返す
					画像一つ（カウンタ）は，MNISTから読み取ったもの。
				繰り返し終わり
				データの中身（現在行）は，画像一つ。
			繰り返し終わり
		もし終わり
	終わり
終わり
```

これでMNISTのデータを読み込めるようになりました。

## 学習をする

学習データが60000個もあるので，インタプリタだとデータの読み込みだけで10分以上かかります（当然コンピュータの性能によります）。従って，コンパイルしてから実行することをオススメします。

```プロデル:MNIST_NN.rdr
バッチサイズは，100。
反復数は，60000。
学習率は，0.02。

（反復数÷バッチサイズ）回，【カウンタ】にカウントして繰り返す
	ミニバッチデータの中身は，訓練データのデータの中身の（（カウンタ-1）×バッチサイズ＋1）番目からバッチサイズ個切り出したもの。
	ミニバッチラベルの中身は，訓練ラベルのデータの中身の（（カウンタ-1）×バッチサイズ＋1）番目からバッチサイズ個切り出したもの。
	勾配は，ネットワークでミニバッチラベルが正解でミニバッチデータにおける勾配を計算したもの。
	勾配の個数回，【キー】にカウントして繰り返す
		ネットワークのパラメータ（キー）から，学習率を勾配（キー）に全部かけたものを破壊的に引く。
	繰り返し終わり
	「［カウンタ］/［反復数÷バッチサイズ］」を表示。
	ネットワークでミニバッチラベルが正解でミニバッチデータにおける損失を計算したものを表示。
繰り返し終わり
```

今回はデータが多いので，100個ずつのミニバッチを作っています。

ちなみに，損失の計算にもそこそこ時間がかかるので，表示しないという選択もあるかもしれません。

学習には1時間半くらいかかりました（Xeon E3-1505M v5 2.80GHz）。

## 推定をする

評価用データも10000個あるので，結構かかります。

```プロデル:MNIST_NN.rdr
推定結果は，［ネットワークで［評価データのデータ］から推定したもの］が最大値となる添字を転置したもの。
評価ラベルのデータが最大値となる添字を転置したもので推定結果を比較したものを表示。
```

## 出力

途中省略しています。

```
PS C:\*****> .\MNIST_NN.exe
評価用ラベルの読み込み完了
評価用データの読み込み完了
訓練ラベルの読み込み完了
訓練データの読み込み完了
1/600
18.7430426599258
2/600
17.2233298105334
3/600
13.6773555012828
4/600
13.6773554545378
5/600
15.1970616161542
（略）
595/600
3.54598104376164
596/600
2.27955924241463
597/600
4.55911848483926
598/600
3.54598104376164
599/600
-1.00000008273537E-11
600/600
1.01313744106761
0.8311
```

ということで，正解率83.1%でした。意外と線形でも正解率出るものですね。MNISTのウェブページには，線形分類器のエラーレートが12%と書かれているので，ぼちぼちではないかと思います。
Laravelを習得するためにやったことまとめ（随時更新）

Webアプリをゼロから作りたい。PHPフレームワーク「Laravel」の習得のためにいろいろやってみているこをとここにまとめます。随時更新します！

PHPついてはこちら
※参考：[ネイティブPHPいろいろやってみたシリーズまとめ（随時更新）](https://qiita.com/i-ryo/items/f202ef81980932905732)

# Laravelインストール

MAMPのローカル環境にインストールしてLaravelの初期画面「白い画面」を出してみた

※参考：[Laravel元年！インストールしてMAMP環境で白い画面出す！！](https://www.i-ryo.com/entry/2019/05/02/234213)

# /publicをルート変更してHello world

Laravelの初期設定ではパスが「/public」になっているのでそれをルート（/）に変更する。そしてLaravelのファイル構成を調べてページを表示しているファイルを修正して「Hello world」を表示！

※参考：[Laravelの/publicをルートに変更しHello worldする](https://www.i-ryo.com/entry/2019/05/06/231710)

# MAMP環境からHerokuにデプロイ

MAMPのローカル環境からHerokuにデプロイするために調べたこと、やったこと

※参考：[LaravelをMAMP環境からHerokuにデプロイするためにやったこと調べたこと](https://www.i-ryo.com/entry/2019/05/16/222005)

# ルーティングファイルに直書き

ルーティングファイル（Routresディレクトリのweb.php）にページ情報を直書きして、いくつかの動的なページを作ってみた

※参考：[【Laravel】ルーティングファイル（routesディレクトリのweb.php）にページを直書きしてみる](https://www.i-ryo.com/entry/2019/06/05/080241)

# MVCのコントローラ（C）

MVCアーキテクチャのコントローラ（C）を理解するために実際にコントローラを作ってみる。

※参考：[【Laravel】MVCのコントローラ（C）ことはじめ（3年B組金八先生を表示する！）](https://www.i-ryo.com/entry/2019/06/13/215724)
ウィンドウサイズ変えた後に stty を設定する

シリアル (UART等でも) 接続した場合、SIGWINCH が届かないのでウィンドウサイズを変更したときに画面がおかしくなることがある。それを直すための `bash` スクリプト。
手動で `stty cols ${COL} rows ${ROW}` と叩くのと一緒。
`xterm` が入っていると `reset` コマンドで済むらしいですが。

```bash:winch_
#!/bin/bash

# カーソル位置を保存
echo -ne '\e7'

SAVE_STTY=$(stty -g)
stty raw -echo min 0

# (x,y)=(999,999) へカーソルを移動、現在位置を表示する
echo -ne '\e[999;999H\e[6n'
IFS=';' read -rd R -a POSITION
stty ${SAVE_STTY}

# 出力をパース
ROW=${POSITION[0]:2}
COL=${POSITION[1]}

# カーソル位置を復旧
echo -ne '\e8'

# 端末を設定して表示する
stty cols ${COL} rows ${ROW}
stty size
```
エスケープシーケンスを出力してる echo 文 3つは一度に出力しても変わりません。
read をなんとかしたら sh で動きそうなんだけどなぁ。


putty で UART 接続すると速度を手打ちしないといけないので、カンニング用に。
110, 300, 600, 1200, 2400, 4800, 9600,
14400, 19200, 38400,
57600, 115200, 230400,
460800, 921600
`stty 1200` で速度を設定、`stty speed` で現在の速度を表示。


参照：
Arch Linux/[シリアルコンソール](https://wiki.archlinux.jp/index.php/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB)
[ANSIエスケープコード](https://www.mm2d.net/main/prog/c/console-02.html)

おまけ：ウィンドウタイトルを変更するには
```printf "\033P\033]0;`uname -n`:`tty`\007\033\\"```
こんな感じ。
C++のwstringをファイルに書き込む。読み込む。

#まずは免責です。
自分は仕様を完全に把握していないので場当たり的なコードを書くことがたくさんあります。

#何をしたか。
std::wstringをVC2019上で読み書きするコードを書きました。文字コードは選択できるようにしてありますが、自分は詳しくないです。
なるべく汎用に書くようにしました。

#余談
Windowsでアドベンチャーゲームのシステムを組もうと思ったのですが、どうしても日本語を扱わざるを得ないので、そのコードを検索して書きました。
2バイト以上の文字の扱いが解らないので2バイト固定で書くことにしたのです。
正直手抜きです。Orz

#コード
```C++:Source.cpp
#include <iostream>
#include <fstream>
#include <string>

//dev on VS2019.

bool wstringSave(const std::wstring& Name, const std::wstring& In,std::string Locale="Japanese") {
	std::wofstream fs(Name);

	if (!fs.is_open()) return false;

	auto Loc = std::locale(Locale.c_str());
	auto L = fs.imbue(Loc);

	fs << In << std::endl;//Write.

	fs.imbue(L);//念のため

	return true;
}

std::wstring wstringLoad(const std::wstring& Name,std::string Locale="Japanese") {

	std::wifstream fs(Name);

	if (!fs.is_open()) return {};

	auto Loc = std::locale(Locale.c_str());
	auto L = fs.imbue(Loc);

	std::wstring Line;

	std::getline(fs, Line);//read.
	
	fs.imbue(L);//念のため

	return Line;
}

int main() {

	std::wstring Path = L"Hoge_Moge_Hage.txt";
	std::wstring Data = L"日本語";

	std::string  L = "Japanese";

#if 0
	std::cout<<"Write to file."<<std::endl
	wstringSave(Path, Data,L);
#else
	auto Loc = std::wcout.imbue(std::locale(L));
	std::wcout << L"Read from File." << std::endl;
	std::wstring S = wstringLoad(Path, L);
	std::wcout << S << std::endl;
	std::wcout.imbue(Loc);
#endif

	std::wcout << L"Program End." << std::endl;

	return 0;
}

```
#スクリーンショット
![mess.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509227/85464a30-c559-5227-3b9c-92135107efa5.png)
JavaScriptの関数の書き方沢山ありすぎ問題

JavaScript、関数の書き方沢山ありすぎませんか？
コールバック関数で関数に関数を渡したりする関係で、どんどん省略形が誕生していったとのことですが・・。

[アロー関数 \- JavaScript \| MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions)のサイトを元に、少しずつ理解した時のメモです。
コードは全て[プレイグラウンド](https://www.katacoda.com/courses/nodejs/playground)で実行できますので、試してみてください。

まずは基本形です。

```javascript
//関数の定義
let hello = function(name) {
 return('hello! ' + name) //処理内容
}
//処理の実行
console.log(hello('takashi')); 
```
アロー関数という`=>`を引数の後ろに書くことで、`function`が省略できます。

```javascript
//関数の定義
let hello = (name) => {
 return('hello! ' + name) //処理内容
}
//処理の実行
console.log(hello('takashi')); 
```
そして、更に省略できます。

 * 関数の{}の中に1文しかない場合、`中括弧{}`もいりません。
 * return文の場合、`return`も省略可能です。

```javascript
//関数の定義
let hello = (name) => 'hello! ' + name //処理内容
//処理の実行
console.log(hello('takashi')); 
```

更にスッキリさせます。

* 引数が 1 つしかない場合、丸括弧 () の使用は任意です。

```javascript
//関数の定義
let hello = name => 'hello! ' + name //処理内容
//処理の実行
console.log(hello('takashi')); 
```

逆に、引数がない場合、丸括弧を書かねばいけません:

```javascript
//関数の定義
let hello = () => 'hello! ' + 'takashi' //処理内容
//処理の実行
console.log(hello());
```

以上です。
プログラミング初学者がオブジェクト指向について調べてみた（Rubyによる記述例あり）

#概要
プログラミング学習を始めて5ヶ月になりますが、オブジェクト指向についていまひとつ理解できていないのでまとめてみました。(環境：MacOS X yosemite / ruby 2.0.0p481)

#ご注意点
ご覧頂きありがとうございます。
初学者のため、内容について確実に正しいものでない可能性があります。
申し訳ございませんが、その点につきましてご了承ください！！

#wikipediaには...
オブジェクト指向（オブジェクトしこう、英: object-oriented）は、ソフトウェア工学理論の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。元々は特定のプログラミング・パラダイムを説明する為に考案された言葉だった。object-oriented programmingのように修飾語として用いられるのが常であり、それ単体で扱われる事はない漠然とした設計構想でもある。（wikipedia抜粋）

初学者の自分にとってはしっくりこなかったので、オブジェクト指向がどのようなものか、具体的なコードをみて理解していこうと思います。

#オブジェクト指向でコードをかく理由
時代の流れ等にあわせて、アプリのメンテナンスは定期的に行う必要がありますが、
その際の**コードの変更に対して、柔軟に対応しやすくする**という目的においてオブジェクト指向プログラミングが活躍します。

具体的に使用する場面としては、**同じようなデータが複数存在するとき**に使用します。


#どのように行うか
データに対する**共通の処理をまとめて定義**しておき、必要な時に呼び出してデータを作成します。

#具体的には
１）クラスで型を作成
２）クラスの中にメソッド（アクション）を作成
３）クラスに基づいたデータ（インスタンス）を作成

#Rubyにおける記述例
####１）クラスで型を作成
```
class Swimmer
end
```
####２）クラスの中にメソッド（アクション）を作成
```
class Swimmer

　#@nameに引数を渡す
  def initialize(name)
    @name = name
  end

　#文字を出力する
  def swim
    puts "#{@name}が泳いでいます"
  end

end
```

####３）クラスに基づいたデータ（インスタンス）を作成
```
#インスタンスを作成する配列を作成
race = [
  Swimmer.new("トム"),
  Swimmer.new("ジョン"),
  Swimmer.new("コニー"),
  Swimmer.new("田中さん"),
  Swimmer.new("キム"),
]

#配列から1番目と4番目を取り出し
puts race[0].swim
puts race[3].swim
```

####実行結果
```
トムが泳いでいます

田中さんが泳いでいます
```

#オブジェクト指向に関わる単語
#####クラス
変数と関数をまとめたもの。ここに固有のデータを埋め込んでインスタンス（オブジェクト）を作成する。
#####メソッド
クラスが持っている処理のこと。
#####インスタンス（オブジェクト）
クラスを使って作成されたデータ。


#まとめ
・オブジェクト指向は、よく使われる部分を型として定義しておくプログラミング手法のこと。
・クラスで型を作成し、その型をnewメソッドで作成してできたものがインスタンス（オブジェクト）。
・クラスに対して、固有のデータ（プロパティ）を当てはめて、インスタンス（オブジェクト）を作成する。

#参考サイト
以下のページを参考にさせていただきました！
https://qiita.com/kansiho/items/13b5e9a32ddfc9bea01c
https://crowdtech.jp/blog/?p=2751
http://jsstudy.hatenablog.com/entry/2017/03/10/172049
macOSでbashからzshに移行したらSDKMANで入れたJDKが見つからなかった時の対策

# bashからzshへ
macOS Catalinaからデフォルトのシェルがbashからzshに変更されました。

僕はHomebrewで別途bashをインストールしていたので、OSアップデートをしてもbashから変更されませんでした。

ただ、物は試しだと思い、マニュアルでzshに変更してみました。

# Javaが無いだと！？
しかし、そうするとMavenとか使ったときにJavaが無いよとか言われます。

```bash:エラーメッセージ
$ mvn clean package
Unable to find any JVMs matching version "(null)".
No Java runtime present, try --request to install.
No Java runtime present, requesting install.
```

ダイアログでも「"java"コマンドラインツールを使用するには、JDKをインストールする必要があります」と言われます。
<img width="422" alt="スクリーンショット 2019-10-27 17.26.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58650/4e158c96-7420-4f43-34bc-72a7eb1c585a.png">

JDKは、bashを使っていた頃にSDKMANを使って入れています。bashのころは問題なく使えていました。

# 対策
bashのときにSDKMANをインストールした際、~/.bash_profileの最後尾に下記の記述が追加されています。

```bash:~/.bash_profile

#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
export SDKMAN_DIR="/Users/ユーザー名/.sdkman"
[[ -s "/Users/ユーザー名/.sdkman/bin/sdkman-init.sh" ]] && source "/Users/ユーザー名/.sdkman/bin/sdkman-init.sh"
```

> `ユーザー名` の部分は、ご自分のユーザー名に置き換えてください

この記述をコピーして~/.zshrcの最後尾に追加すると、問題が解消されました！
Dockerのoverlay2でbasesizeを変更する

# 概要
Dockerで可変サイズを利用する際は、basesizeより大きくないといけない。(不正確）
なので、basesizeを引き下げる・

# 環境
- Ubuntu 18.04
- XFS
- grubでpquota、qquotaを有効化済み

# 前提
/var/lib/dockerを消さないといけない（データが消える)



# 手順
つまり以下のコマンドということです。
```
$ sudo dockerd -s overlay2 --storage-opt overlay2.size=0.1G
```

```
vi /lib/systemd/system/docker.service

systemctl daemon-reload
```

```yaml:/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -s overlay2 --storage-opt overlay2.size=0.1G
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3

# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity

# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes

# kill only the docker process, not all processes in the cgroup
KillMode=process

[Install]
WantedBy=multi-user.target
```
# 参考
https://docs.docker.com/engine/reference/commandline/dockerd/
Androidでコードからviewを追加する

##何の記事？
Activityの表示内容を表示するたびに書き換えたい。
そんなときにkotlin上でviewを生成して追加する方法を紹介します。
やり方自体はjavaでも同様にできるはずです。

##具体的な方法
ここでは、LinearLayoutにviewを追加していく例で説明します。
まずは外側のLinearLayoutを用意します。

```xml:sample_activity.xml
        <LinearLayout
            android:id="@+id/sampleLinear"
            android:layout_width="wrap_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            >

        </LinearLayout>
```
このLinearLayoutの中にviewを追加していきます。
idは`sampleLinear`です。

まずは`sampleLinear`のインスタンスを取得します。
ここでは、EditTextを追加してみようと思います。

```kotlin:SampleActivity.kt
    val wrapContent = ViewGroup.LayoutParams.WRAP_CONTENT

    val linearLayout = view.findViewById<LinearLayout>(R.id.sampleLinear)
    val editText = EditText(applicationContext)

    linearLayout.addView(edit, LinearLayout.LayoutParams(wrapContent,wrapContent))

```

これで、以下と同じものが追加できたことになります。

```xml
<EditText
    android:width="wrap_content"
    android:height="wrap_content" />
```

viewに他のパラメータを設定したいときは、取得したviewのインスタンスにそれらを追加することができます。
以下では、複数行入力を可能にするEditTextのパラメータを設定しています。

```kotlin:SampleActivity.kt
    val editText = EditText(applicationContext)
    editText.setRawInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE)

```

Buttonを実装し、onClickListener内でこれを実装すると、
ボタンを押すたびにviewが追加される画面を作ることができます。

```kotlin:SampleActivity.kt
    val addButton = Button(mContext)
    addButton.setOnClickListener {
        val editText = EditText(applicationContext)

        linearLayout.addView(editText, LinearLayout.LayoutParams(MP,WC))
    }

```
UIColorとcolor assetとSwiftUIのColorを一緒に使う

SwiftUIではUIColorは使いません。

UIKitではUIColorを使います。

別の手段で作るとしても、色の定義は１つにしたいものです。

ということで、それぞれのcolorの利用方法を確認し、
両方で利用出来るようにするには何が一番いいかなを考えてみたいなと思います。

またついでにダークモードの対応も考えてみることにします。

## UIKitのUIColor

本当色々あると思いますが、ある程度効率がよく、ライブラリーなど使わないとすると下記のような方法が思い浮かびます。

- UIColorにextensionをはやす
- Color Assetを定義したものを使う

## SwiftUIのColor
こちらは実績はないのであくまでこうすればいいだろうというものにはなりますが、基本UIColorとそんなに変わらないと思っております。
なので基本方針は同じ

- Colorにextension生やす
- Color Assetを定義したものを使う

``` swift
Color("myBlack")
```

- google検索してなにか他に精製方法はないか確認する

## SwiftUIとColorの相互の変換
### UIColorからColorを求める
``` swift
Color(UIColor.red)
```
### ColorからUIColorを求める

``` swift
extension UIColor {
    var color: Color {
        return Color(self)
    }
}
```

### enumにする
``` swift
enum MyColor {
    case black
    
    var name: String {
        switch self {
        case .black: return "myBlack"
        }
    }
    var color: Color {
        return Color(name)
    }
    var uiColor: UIColor? {
        return UIColor(named: name)
    }
}
```

swift enumは色々な活用方法があって好きです。
iOS11以上であれば、color assetが使えるので上のようにとても簡単な方法で色の定義をすることができます。
color assetを利用すると簡単にダークモードの対応もできるのでおすすめです。

もしcolor assetが使えない場合は

``` swift
enum MyColor {
    case black
    // dark modeの対応
    private func light(_ light: UIColor, dark: UIColor) -> UIColor {
        if #available(iOS 13, *) {
            return UIColor { (traitCollection: UITraitCollection) -> UIColor in
                switch traitCollection.userInterfaceStyle {
                case .unspecified, .light:
                    return light
                case .dark:
                    return dark
                @unknown default:
                    return light
                }
            }
        } else {
            return light
        }
    }
    
    // ここで色を定義
    var uiColor: UIColor {
        switch self {
        case .black:
            return light(UIColor(red: 1, green: 0, blue: 0.5, alpha: 1),
                         dark: UIColor(red: 1, green: 1, blue: 0.5, alpha: 1))
        }
    }

    // color
    var color: Color {
        return Color(uiColor)
    }
}
```

という形で定義することもおすすめします。

では、また！
MacでVSCodeを使って簡単に差分抽出を行う方法

#はじめに
例えばテーブルのカラムの更新前と更新後の中身がどう変わったかなどちょっとした文字列の差分を目視でなくツールで確認したい時ってありますよね？
そういう時WindowsだとWinMergeとか使ってやってたんですけどMacだと何だろうなと思って今、使ってる方法があるので共有します。。。

#必要なもの
###VSCode
これだけです。

#やり方
今回は単純な文字列比較を行おうと思います。
#####aaaという文字列とbbbという文字列を比較します。

<img width="1436" alt="スクリーンショット 2019-10-27 17.12.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343885/93cecd28-08d6-b6dd-b2f6-3d70aca82109.png">

<img width="1436" alt="スクリーンショット 2019-10-27 17.12.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343885/6e89a836-494d-faa7-b01c-48cbd117fb8d.png">

それぞれaaaという文字列bbbという文字列が書いてあるファイルを作ります。
後は、このファイルを比較するだけです。
**command + shift + P**でコマンドパレットを開きます。

<img width="1436" alt="スクリーンショット 2019-10-27 17.19.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343885/853962da-b2ef-5f2a-6bbd-01017a6ceb8e.png">

一番上のFile: Compare Active File With...を選択します。

<img width="1436" alt="スクリーンショット 2019-10-27 17.22.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343885/d6e65e8a-ea89-cfbe-f03b-47271d5fa195.png">

今、比較元として選択されているのはUntitled-1(最近開いたものって書かれているもの)なので比較先のUntitled-2を選択します。

<img width="1436" alt="スクリーンショット 2019-10-27 17.23.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343885/6bd08f5e-a607-4f85-1a6b-fce38a67c83a.png">

こんな感じで簡単に差分を抽出することができます！！

#参考

[Macでサクっと使えるDiffツール【３選】](http://imneo.blog.shinobi.jp/macbook/mac%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8Bdiff%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E6%8E%A2%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F)
WordPressについて色々やってみたことのまとめ（随時更新）

WordPressについて、色々やってみたことをここにまとめています。（随時更新です！）

WodrPressの基本についてはこちら
※参考：[【WordPress、PHP、SQL文】Webデザイナーでもわかるサーバサイドの基本まとめ！（6記事）](https://qiita.com/i-ryo/items/578efecb5a6af0fcff34)

# サイト公開後の簡易テスト環境

ローンチ前はサイト全体を検索非対称などの処理ができるが、ローンチ後に思う存分更新の検証ができないか考えた。固定ページを作って非公開にして、その中でいろいろ試してみる。

※参考：[ローンチ後のWordPressサイトの中にテスト環境を作る](https://www.i-ryo.com/entry/2018/05/08/011435)

# Smart Custom Fieldsとブロック

愛用しているプラグイン「Smart Custom Fields」のカスタムフィールドがGutenbergのブロックと共存できるか検証。（共存可能！使い分け方も）

※参考：[Smart Custom Fieldsの繰り返し（グループ）機能の出力タグ一覧](https://www.i-ryo.com/entry/2018/12/05/210617)

# All-in-One WP MigrationとDeMomentSomTres Export

サイト全体を移行するプラグイン「All-in-One WP Migration」と投稿のみなど一部分だけを以降するプラグイン「DeMomentSomTres Export」の違いのまとめ。

※参考：[【WordPress】All-in-One WP Migration（全移行）とDeMomentSomTres Export（一部移行）の違い](https://www.i-ryo.com/entry/2019/03/10/191049)

# Gutenbergのブロック（ノーコード）

Gutenbergのブロック機能が結構充実しているので、これを使うとコードを1行も書かずにペライチページが作れるのではないか、と思い試してみた。ノーコードグならCMSをペライチにも使うメリットがあるかも！

※参考：[【WordPress】Gutenbergでコードを1行も書かずにペライチページを作る！](https://www.i-ryo.com/entry/2019/04/10/130412)

# ダッシュボードだけでCSS、JSをカスタマイズ

WordPressのダッシュボードだけでテーマファイルをいじらずにCSSとJSをどこまで変えられるか検証。

※参考：[WordPressのCSSやJSをテーマのphpファイルをいじらずにダッシュボードだけでカスタマイズする方法](https://www.i-ryo.com/entry/2019/07/05/002657)
[機械学習]決定木について分かりやすくまとめてみる①～理論編～

#はじめに
今回は、決定木の理論についてまとめていきます。

お付き合い頂ければ幸いです。

#決定木について

##決定木の概要
決定木の可視化すると以下のようになります。

今回はirisデータセットによる分類を`scikit-learn`の`export_graphviz`を用いて可視化しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/8caed2cf-dafd-e1a2-60ff-220b97c20bcb.png)

決定木とは、上の画像のようにデータをある条件に従って分割することにより、データの分類または回帰のモデルを作成するアルゴリズムです。分類を行う分類木と回帰を行う回帰木を総称して決定木と呼びます。

かなりシンプルなアルゴリズムのため、他の複雑なアルゴリズムと比較すると精度は出にくい傾向にあります。

しかし、モデルの解釈性が非常に高いです。

モデルの見た目が上の図のように木のように見えることから、決定木と呼ばれています。

代表的なアルゴリズムに`CART`や`C5.0`などがあります。

アルゴリズムについては[こちら](http://halharahal.com/?page_id=1734)の記事を参考にしてください。

ここでは、ニクラス分類を繰り返し行う`CART`のアルゴリズムを取り扱っていきます。

##決定木の基準について
ここまでで決定木のおおよその概要をつかめたと思います。

ここでは、分類木と回帰木の枝分かれの基準について考えていきます。
###分類木の基準
それでは、分類木はどのような判断基準に従って枝分かれさせていくのかを考えていきましょう。

結論から書くと、分類は`不純度`が最小になるような分割をする、という基準に基づいて特徴量や閾値を決めています。

`不純度`とはどれくらい多くのクラスが混じりあっているかを数値にしたもので、`誤分類率`や`ジニ指数`、`交差エントロピー誤差`を用いて表されます。一つのノードに一つのクラスの観測地がある状態のとき、不純度は0になります。

###回帰木の基準
回帰木は、平均二乗誤差で表されるコスト関数を定義し、そのコスト関数の重み付き和が最小となるように特徴量や閾値を選択します。

#数式について
##分類木
不純度を数式を用いて表してみましょう。以下の図について考えます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/81eb99e8-4c2a-df21-6e23-068682d965c7.png)

$N_m$個の観測値を持つ領域$R_m$におけるクラスkの観測値の割合を以下のように定義します。

```math
\hat{p}_{mk} = \frac{1}{N_m} \sum_{x_i\in R_m}^{}I(y_i = k)
```

図の上から三番目の段に注目します。mは領域の番号を表しており、m=1で`gini=0.168`の領域を表し、m=2で`gini=0.043`の領域を表しています。kはクラスラベルを表していて、今回は`value`の部分の左からクラス１、クラス２、クラス３と定義しています。

数式にすると難しそうですが、実際に計算すると以下のようになります。

```math
\hat{p}_{11} = \frac{0}{54} \quad \hat{p}_{12} = \frac{49}{54}  \quad \hat{p}_{13} = \frac{5}{54} 
```

なんとなく数式の意味が理解できたでしょうか。

この$\hat{p}$を用いて、以下の三つの関数で不純度を表現します。

####誤分類率
```math
\frac{1}{N_m} \sum_{x_i\in R_m}^{}I(y_i \neq k(m)) = 1-\hat{p}_{mk}
```

####ジニ指数
```math
1 - \sum_{k=1}^{K}\hat{p}_{mk}
```

####交差エントロピー誤差
```math
-\sum_{k=1}^{K}\hat{p}_{mk}log\hat{p}_{mk}
```

`sklearn`で標準で用いる不純度の関数はジニ指数になっているので、実際にジニ指数を計算してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/da6f793a-e187-8422-b10b-b1e62a49f4ab.png)

三段目の不純度をジニ指数を用いて計算します。

左の`gini=0.168`のノードのジニ指数は以下の式になりますね。

```math
1 - (\frac{0}{54})^2 - (\frac{49}{54})^2 - (\frac{5}{54})^2 = 0.168
```

当然答えは0.168になります。上の式がsklearnが内部で行っている計算式になります。ついでに右の`gini=0.043`のノードの計算も行いましょう。

```math
1 - (\frac{0}{46})^2 - (\frac{1}{46})^2 - (\frac{45}{46})^2 = 0.043
```

こちらも一致しましたね。それでは、それぞれのにデータの重みをかけることで全体の不純度を計算しましょう。以下の式になります。

```math
\frac{54}{100} ×0.168 + \frac{46}{100} ×0.043 = 0.111
```

これで全体の不純度が導出できました。決定木はこの不純度を小さくするような特徴量や閾値を選択することにより、モデルを構築しています。

##回帰木
回帰木において、コスト関数を以下のように定義します。

```math
\hat{c}_m = \frac{1}{N_m}\sum_{x_i \in R_m}^{}y_i\\
Q_m(T) = \frac{1}{N_m} \sum_{x_i \in R_m}(y_i - \hat{c}_m)^2
```

$\hat{c}_m$がそのノードに含まれる観測値の平均を表しているので、コスト関数は平均二乗誤差となります。

このコスト関数はそれぞれのノードについて計算されるため、そのコスト関数の重み付き和が最小となるように特徴量や閾値を設定します。

##終わりに
今回の記事はここまでになります。

お付き合い頂きありがとうございました。

よろしければ次回の記事もご覧ください。

[[機械学習]決定木について分かりやすくまとめてみる②～実装編～](https://qiita.com/renesisu727/items/3731e338d1a5a74a1fb3)