OmniAICreator/Qiita-1.07M huggingface dataset:
サーバエンジニアにも、わかりやすく機械学習の教師あり学習（Supervised Learning）を理解してみた2

## パーセプトロン

パーセプトロンとは、アルゴリズムであり、古のものであり、
機械学習を学ぶ上で知っておいたほうがいいことになります。

### 単純パーセプトロン

例えば、人気フォロワーを算出するようにします。
その際の指標をyoutubeのチャンネル登録数、twitterのフォロワー数するとしましょう。

例えば、

| ユーザ名 | チャンネル登録数 | 人気(ある場合1) |
| --- | --- | --- |
| aaa | 50 | 0|
| bbb | 10000 | 0|
| ccc | 100000 | 1|
| ddd | 90000 | 0|
| eee | 120000 | 1|

| ユーザ名 | twフォロワー数 | 人気(ある場合1) |
| --- | --- | --- |
| aaa | 100 | 0|
| bbb | 10 | 0|
| ccc | 7000 | 1|
| ddd | 150000 | 1|
| eee | 90000 | 1|


この場合、◯がcccさんとeeeさんなので、だいたい以下のような境界で人気化どうかがわかるようになります
![スクリーンショット 2020-05-21 11.20.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87607/5a9af48c-a188-91af-7482-8c4fb2411323.png)


どちらも人気があれば、人気と見なすことにします。
上記で言えば、
cccさんとeeeさんが人気ということになります。

この場合、境界を作ることによって、人気か不人気かわかるようになっています。
<img width="518" alt="スクリーンショット 2020-05-21 11.22.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87607/520788f7-f533-719b-a0a9-0e6a521c86de.png">

この区分け実際のプログラムで作るには、w=重みづけ、theta=バイアス（傾き加減）
をだいたい値で調整し、0,1で割り振れるようにします（図で言うと◯×）
チャンネル数 = w1 = 1.6
twフォロワー数 = w2 = 0.11
そして、その0,1の閾値を160500としましょう
ん、、どうやってこの値を求めたかですが、
適当にあたりをつけていくしかありません。
まずは、tmpの値を求めて、それが、0にくるのか1なのかを
判定できる。閾値を仮で設定し、もしそれが正しくなければ
w1,w2,thetaを微調整していく感じです。
この手作業が大変なのは、パーセプトロンの大変なところでもあります。

```
def AND_famous(x1,x2):
    w1 = 1.6
    w2 = 0.11
    theta = 160500
    tmp = w1*x1 + w2*x2
    
    if tmp <= theta:
        y = 0
    else:
        y = 1
    return y

print(AND_famous(50,100))
print(AND_famous(10000,10))
print(AND_famous(100000,7000))
print(AND_famous(90000,150000))
print(AND_famous(120000,90000))

//console結果
0
0
1
0
1
```

単純パーセプトロンでは、直線一つでグループ分けできる分類を分けることができます。

### 多層パーセプトロン

上記の場合にできないケースがあります。例えば、こんな結果だったらどうしますか？

1芸のみ秀でている人を判定します（2芸は含まない）
判定基準は、どちらかが当てはまれば天才(XOR)とします
参考）
https://wwws.kobe-c.ac.jp/deguchi/sc180/logic/gate.html
https://the01.jp/p0004619/

| ユーザ名 | テストの点数（3,4が正常） | 才能(ありの場合1) |
| --- | --- | --- |
| aaa | 3 | 0|
| bbb | 70 | 0|
| ccc | 92 | 1|
| ddd | 6 | 0|
| eee | 97 | 0|

| ユーザ名 | 絵画の能力値（100最大） | 才能(ありの場合1) |
| --- | --- | --- |
| aaa | 100 | 1|
| bbb | 40 | 0|
| ccc | 98 | 1|
| ddd | 92 | 1|
| eee | 70 | 0|


この場合、どちらかのみ秀でているのは、
aaa,ddd,eee になります。図にすると以下になります

![スクリーンショット 2020-05-21 1.12.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87607/08757ecd-f826-93b3-a435-35f1f2790ff1.png)


上の図を見て、○とxで分類しにいくなぁと思うと思います。
実際にグルーピングの線を引くとこんな感じになります。
これは、今回はプログラムは出しませんが、単純パーセプトロンを連結させることにより実現が可能であるとだけ覚えておくと良いでしょう

<img width="472" alt="スクリーンショット 2020-05-21 1.23.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87607/0104667d-3945-753c-d49f-0b3004ac969f.png">


まとめると、
単純パーセプトロンは直線で0,1の境界線を引くことができる
多重パーセプトロンは曲線で0,1の境界線を引くことができる、ただし単純パーセプトロンを組み合わせられるものだけに限る
になります。

では、パーセプトロンで全てができるのかというとそうではありません。
例えば、

- 境界が閉じているもの
- 境界が複数あるもの
- 境界が曲がっているもの（xorとかでは表せないもの）
などがあるので、それをできるようにしようということで、
進化系の方法がパーセプトロン以降出てきたというのがこれまでの歴史の流れになります。




## おまけ

図形はこんな感じでかけます
多重パーセプトロンの図


```
import matplotlib.pyplot as plt

#plt.plot(x3)

plt.plot(3,100,marker='o')
plt.plot(70,40,marker='x')
plt.plot(92,98,marker='x')
plt.plot(6,92,marker='o')
plt.plot(97,70,marker='o')
```
physicsBodyが動作しない

プログラミング初心者です。2Dゲームを作るために、「Sprite Kitで始める2Dゲームプログラミング」という練習本を使っているのですが、早くもつまずいてしまいました。


physicsBodyが動作しません。以下、コードです。

import Foundation
import SpriteKit

class GameScene2 :SKScene{

    override func didMove(to view: SKView){
        
        //下方向に重力を追
        self.physicsWorld.gravity = CGVector(dx: 0.0, dy: -2.0)
   
        //背景スプライトの追加
        let background = SKSpriteNode(imageNamed: "background")
        background.position = CGPoint(x: self.size.width*0.5, y:self.size.height*0.5)
        background.size = self.size
        
        self.addChild(background)
        
 
        self.fallNagoyaSpecialty()
    }

//名古屋名物を落下させる
func fallNagoyaSpecialty(){
    let texture = SKTexture(imageNamed: "0")
    let sprite = SKSpriteNode(texture: texture)
    sprite.position = CGPoint(x: self.size.width*0.5, y: self.size.height*0.5)
    sprite.size = CGSize(width: texture.size().width*0.5, height:texture.size().height*0.5)
    
    //テクスチャからPhysicsBodyを追加
    sprite.physicsBody = SKPhysicsBody(texture: texture, size: sprite.size)

    
    self.addChild(sprite)

    }


}

このコードを実行すると、

HelpNagoyaSpecialty[30954:820080] PhysicsBody: Could not create physics body.

というエラーが出てしまい、spriteが落下してきません。どうしたらいいですか？上級者の方々、お教え願います。
Pipe経由で処理を呼び出す

AngularでPipeを経由して処理を呼び出しその結果を表示する方法

例えば、HTML内で配列を処理する際にある条件に合致するものしか対象としないようにする。

item.model.ts

```
export class ItemModel {
  status : boolean;
  value : string;
}
```

sample.component.html

```
<!-- listの中でstatusがtrueのものを対象とする -->
<div *ngFor="let item of list | callback : filter">{{item.value}}</div>
```

sample.component.ts

```
export class SampleComponent {
  // データ一覧
  list : ItemModel[];

  /**
   * Pipeを経由して呼び出される関数
   */
  filter(item : ItemModel) : boolean {
    //statusがtrueのもののみ対象とする
    return item.status;
  }
}
```

callback.pipe.ts

```
import { Pipe , PipeTranform } from '@angular/core';

@Pipe( {
  name: 'callback',
  pure: false
} )
export class CallbackPipe implements PipeTransform {
  transform( items: any[], callback: (item : any ) => boolean ): any {
    if (!items || !callback ) {
      return items;
    }
    return items.filter( item => callback( item ) );
  }
}
```
c++のMakefileチュートリアル

## Makefileとは？
bashコマンド＋DSL(独自言語)でc++のビルドが記述されているファイル

## 基本的な例
まずは、Hello Worldから初めてみよう。
$ touch Makefile
したら以下を記述する。

```
say_hello:
  echo "Hello World"
```

スペースの代わりにタブを使わないとエラーになる。

次にmakeコマンドを実行する。
$ make

Hello Worldと表示されれば成功だ。

## targetとは？

上の例では、say_helloは関数名のように振舞う。
say_helloのような関数名をtargetと呼び。
echo "Hello World"のように処理本体ををrecipeと呼ぶ。

## ＠echo
＠なしのechoを使って、echo "hello"とすると
echo "hello"
"hello"
と二重に表示させる。
これを防ぐためにechoの代わりに、@echoを使う。

## 実例
次に、generateとcleanターゲットをMakefileに加えよう。

```

say_hello:
        @echo "Hello World"

generate:
        @echo "Creating empty text files..."
        touch file-{1..10}.txt

clean:
        @echo "Cleaning up..."
        rm *.txt
```

ターミナルに
$ make
と打つと、先頭のsay_helloのみが実行される。

Makefileは先頭のターゲットをdefault targetと呼ぶ。
generateを実行したい場合
$ make generate
のようにmakeの後ろにtargetを渡す必要がある。

.DEFAULT_GOALを設定する事でdefault targetを変更する事が出来る。

Makefileの先頭に、以下を加えよう。

```
.DEFAULT_GOAL := generate
```

makeを実行すると、generateが実行される。
$ make

```
Creating empty text files...
touch file-{1..10}.txt
```

## 複数のターゲットを一度に実行する

targetの後ろに、targetをスペース区切りで渡すことで、複数のtargetをまとめて実行出来る。
ここではallというtarget名だけど、名前はなんでも良い。

```
all: say_hello generate

say_hello:
        @echo "Hello World"

generate:
        @echo "Creating empty text files..."
        touch file-{1..10}.txt

clean:
        @echo "Cleaning up..."
        rm *.txt
```

$ make all
Hello World
Creating empty text files...
ファイルが作成される。

say_helloと、generateをまとめて実行出来た。

## phony target

makeを実行する前に、特定のphony targetを実行させよう。.PHONYを加える事で、ファイルが既に存在しているかいつファイルが作られたかなどを気にする事なくmakeが実行可能になる。

## 特定のtargetを実行する。

$ make clean
Cleaning up…
rm *.txt

## 変数
makefileでは変数を定義出来る。
定義した定数は
${}
で使用する事が出来る。

```
HELLO = Hello

hello:
  echo ${HELLO}
```

お分かりのとおり、このレシピは、ターミナルに以下を打ち込むのと一緒だ。
gcc hello.c -o hello

以下のように、変数に値を再代入すると、無限ループが発生してしまう。

CC = gcc
CC = ${CC}

all:
    @echo ${CC}
```

これを防ぐには、:=オペレーターを使用する。

CC := gcc
CC := ${CC}

all:
    @echo ${CC}

## 実践的なMakefileの例

```
# Usage:
# make        # compile all binary
# make clean  # remove ALL binaries and objects

.PHONY = all clean

CC = gcc                        # compiler to use

LINKERFLAG = -lm

SRCS := foo.c
BINS := foo

all: foo

foo: foo.o
        @echo "Checking.."
        gcc -lm foo.o -o foo

foo.o: foo.c
        @echo "Creating object.."
        gcc -c foo.c

clean:
        @echo "Cleaning up..."
        rm -rvf foo.o foo
```

## 参考
https://opensource.com/article/18/8/what-how-makefile
[Cloud Pub/Sub]メッセージのサンプル

### メッセージのサンプル
https://cloud.google.com/pubsub/docs/push#receiving_push_messages

```
{
    "message": {
          "attributes": {
                      "key": "value",
                      "key2": "value2"
          },
          "data": "SGVsbG8gQ2xvdWQgUHViL1N1YiEgSGVyZSBpcyBteSBtZXNzYWdlIQ==",
          "messageId": "136969346945",
          "publishTime": "2020"
    },
    "subscription": "projects/myproject/subscriptions/mysubscription"
}
```
Windows Terminal の設定(settings.json)を複数の PC で共有する方法 (OneDrive の場合)

[5/19 に GA となった Windows Terminal 1.0](https://devblogs.microsoft.com/commandline/windows-terminal-1-0/) の設定は
`%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json`
に保存されています。

複数の Windows PC を持っていると共有させるのが面倒、ということで `settings.json` を共有する方法です。

## 仕組み

* ファイル同期ツール
* シンボリックリンク

この二つを利用します。今回、ファイル同期ツールには OneDrive を利用していますが、Dropbox でも box でもできるでしょう。

## 論よりコード (OneDrive の場合)

現状の settings.json を OneDrive フォルダにコピーします。一般ユーザ権限の cmd で OK です。

```:一般ユーザcmd
copy %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json %OneDriveConsumer%
```

その後、Windows Terminal で参照されている settings.json を削除した後に `mklink` でシンボリックリンクを作ります。管理者権限 cmd で実行します。

```:管理者cmd
del /F %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
mklink %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json %OneDriveConsumer%\settings.json
```

※ 最初の `del` は `mklink` が失敗するのを避けるためです。本当に消しちゃっていいかは確認してください。
※ `%OneDriveConsumer%` 環境変数の展開時に空白文字が入っている場合 (例えばユーザ名に空白が入ってる等) は、適宜ダブルクォーテーションを付けたりしてください。

### 解説

シンボリックリンクを使うことで本体を別のところに移動しています。Linux 等の OS ではよくやる技ですね。
Windows Terminal は素直に `%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json` を参照してくれるので実現できています。

### 注意

settings.json は更新されたタイミングでファイル同期ツールによって同期されます。要するに上書きされちゃう恐れがあるので、更新する PC は1つの方がいいかもしれませんね。

## あとがき

settings.json の設定自体は [Windows Terminal 1.0 のカスタマイズで役に立った情報源 (2020年5月)](https://qiita.com/ma2shita/items/19fe6dd71185613d09ed) をご覧ください。

ところで `%OneDriveConsumer%` 環境変数で 自分の OneDrive 管理下のパスが参照できるとは思わなかったです。([OneDriveの環境変数を活用する](https://news.mynavi.jp/article/win10tips-360/))便利。

settings.json は `%OneDriveConsumer%\AppData\Roaming\WindowsTerminal\settings.json` とかに置くのが正解なのかな？

EoT
STIについて、少し理解できた人が記事を書いてみた

## はじめに
Rails最近頑張ってます。:clap:
ここ知らなかったってところや自分的に知識がまだ浅いなと思う部分をQiitaにまとめていきたいと思います！
まだまだな部分が多いですが、すこしでも皆様の理解の助けになれたら、嬉しいです。

## STIって？
単一テーブル継承といって、一つのテーブル(親にあたるもの)から継承して、新しいテーブル(子にあたるもの)を作りましょう！！みたいな考え方です。親のテーブルに含まれるカラムなども引き継がれるので、同じ部分を子クラスで定義しなくてよくなるので、手間も減るし、わかりやすくなるので、利点が多いですね！子クラスで、カラムを新たに追加することもできるので、割と簡単に拡張?もできます。

## どんな時に、使うと便利？？
似たような(ほぼ同じような機能を持つ)モデルがたくさんあるときに、1つ1つに対して、カラムの定義などを行わなくてよくなるので、モデルがたくさんあるときに、使うと、便利かもしれません。

## 構造的にどうなってるの？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416392/d75ff88d-3779-9bc3-3f12-c1cd6bbbd11a.png)


こんな感じです。１つのクラスを継承して、子クラスを生成します。子クラスでは、`親クラスで持っているもの+自クラスで定義したもの`を持つことができます。

## 作り方について
1. まず、親クラスの生成をします。
`bundle exec rails g model Tweet`を実行して、マイグレーションファイルの中に、クラスに持たせる要素などの値を書き込んで、
 `bundle exec rails db:migrate`を実行します。

2. 子クラスについては、モデルファイルのおいてあるフォルダに`モデル名.rb`で新しくファイルを新規作成して、親を継承するように設定します。


```親クラス.rb
class Tweet < ApplicationRecord
  validates :content, length: { maximum: 140 }
  belongs_to :user
  has_many :retweets
  belongs_to :reply, foreign_key: :reply_id, class_name: 'Tweet' ,optional: true
  has_many :replies, foreign_key: :reply_id, class_name: 'Tweet'
  has_many :likes
end

```


```子クラス.rb
class TweetImage < Tweet
  has_one :image, foreign_key: :tweet_id
  accepts_nested_attributes_for :image, allow_destroy: true
end

```

※クラス名のあとの部分に気をつけましょう！！
親クラスは`ApplicationRecord`になっていますが、子クラスの方は、モデルを継承して作るので、`親クラスのモデル名`を入れなければ、なりません。

## さいごに
最後まで、読んでいただきありがとうございます。
まだまだ、説明下手ですが少しでもみなさんに伝わりやすい記事をかけるように、努力していきたいと思います！
インデントスタイルの空白文字について

# 問題点
これまで vi でタブ文字の表示をさせていたが、Python の場合はタブ文字を使っていると具合が悪い。
（Python は半角スペース）
インデントの視覚化を vi プラグインである[vim-indent-guides](https://github.com/nathanaelkane/vim-indent-guides) に切り替えてみたが、これまでのタブスペースだと邪魔な感じがする。
これまで、特に気にすること無く「タブスペース」を使ってきたが、ちょっと気になったので「インデントの空白文字」についての考査検討をしてみる。

# 概要
インデントスタイルの空白文字で使われるのは概ね以下。

- タブスペース（\t）
- 半角スペース 2 字
- 半角スペース 4 字
- 半角スペース 8 字

## タブスペース（\t）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221128/6fc258eb-84de-1e6c-be8a-fd6839949ee7.png)

### 評価
[vim-indent-guides](https://github.com/nathanaelkane/vim-indent-guides) を使うと主張が激しいため見辛い。
しかし、タブスペース 1 文字である為、ソースファイルは当然小さくなる。
ファイルサイズの大きさを抑えられるというのはとても大きなメリットであるが、エディタによって表示が変わるのは微妙。
但し、これは（ソースそのものへの変更無しに）エディタの設定で表示を好みの形に変更が出来るというメリットでもある。

---

## 半角スペース 2 字
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221128/eeb402e0-cc49-4cfd-5df2-349ec2284dd4.png)

### 評価
ちょっとつんのめり過ぎて見辛い。
修正する場合は２文字なので楽な気がする。

---

## 半角スペース 4 字
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221128/563b1d6f-4b6d-33ad-6b3b-6eaf1d30c4d6.png)

### 評価
[vim-indent-guides](https://github.com/nathanaelkane/vim-indent-guides) を使うと、恐らく半角スペースを使うことが前提なのだろう、と思えるほどにスッキリしてかっこいい。
とてもバランスが良く見える。
好みの問題もあるが。


---

## 半角スペース 8 字
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221128/8e6d991d-6c43-a5d7-c325-9ab225b5b4e9.png)

### 評価
間延びしすぎな感じがする。
見辛いという程でもないが、ネストを深くした場合に右に行き過ぎて見辛くなる。
GitLab のデフォルトのスタイルなので、ひょっとして今はこれが標準なのか？
ただ、8 文字も使うので流石にソースファイルのサイズが気になってくる。


# 結論
`半角スペース 4 字` を使ってみる。
自分にとっては、これが一番見やすかったので。
Raspberry Pi の Proxy Server 利用環境設定

# 固定IPアドレス設定 #
## GUI環境で設定 ##
右上のアイコンで右クリック「Wireless & Wired Network Settings」を開く
Configure:interface eth0 など使用するネットワークを選択
固定IPアドレスなどネットワーク情報を記入して適用する
IPアドレスは ***.***.***.***/** という形式なので
サブネットマスクから計算して記入
計算サイトが便利
https://note.cman.jp/network/subnetmask.cgi
設定ができたら再起動

# 各種設定ファイル　作成・追記 #
### apt.conf の編集・新規作成 ###
ターミナルを開いて

```terminal
sudo mousepad /etc/apt/apt.conf
```


エディタで以下を記述して保存

```terminal
Acquire::http::proxy "http://プロキシサーバー名:ポート番号/";
Acquire::https::proxy "https://プロキシサーバー名:ポート番号/";
Acquire::ftp::proxy "ftp://プロキシサーバー名:ポート番号/";
Acquire::socks::proxy "socks://プロキシサーバー名:ポート番号/";
```
### /etc/environment の編集・新規作成 ###
ターミナルを開いて

```terminal
sudo mousepad /etc/environment
```
エディタで以下を記述して保存

```terminal
http_proxy=http://プロキシサーバー名:ポート番号/
https_proxy=http://プロキシサーバー名:ポート番号/
ftp_proxy=http://プロキシサーバー名:ポート番号/
```
### .bashrc の編集・新規作成
ターミナルを開いて

```terminal
mousepad .bashrc
```
エディタで以下を記述して保存

```terminal
export http_proxy=http://プロキシサーバー名:ポート番号/
export https_proxy=http://プロキシサーバー名:ポート番号/
export ftp_proxy=http://プロキシサーバー名:ポート番号/
```
### ブラウザの起動　###
ターミナルを開いて

```terminal
chromium-browser &
```
で開くとプロキシ情報が有効となります
一度この状態で開いて、Proxy関連の拡張機能をインストールすれば、メニューから開いてもProxyを利用できます。


---

### 参考サイト ###
1. https://note.cman.jp/network/subnetmask.cgi
2. https://raspibb.blogspot.com/2015/04/proxy.html
【Solidity】Remix環境をローカルフォルダと同期させる

# はじめに
Solidityでスマートコントラクトを開発する際に便利なブラウザ開発環境のRemixですが、
ローカルのフォルダを同期するためには少しややこしい手順を踏まなければいけないのでメモしておきます。

# 環境
Mac OS X 10.8.5
node v11.14.0
npm 6.7.0
*Python 2.7.16

# 手順
## 1.remixdのインストール

```
npm install -g remixd
```

## 2.公式がホスティングしているIDEで起動

``` 
remixd -s <同期させたいフォルダの絶対パス> --remix-ide https://remix.ethereum.org
```

ブラウザで https://remix.ethereum.org にアクセスし、
Plugin ManagerからRemixdをActiveにする。

## 3.ローカルのファイルを開く
FILE EXPLORERSに手順２で指定したフォルダが表示されていたら成功です。
Pythonで統計解析

pythonで統計の学習をはじめました。
![スクリーンショット 2020-05-21 10.49.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26564/2e7928fe-2284-1f7e-6f29-83fef6116b58.png)


![スクリーンショット 2020-05-21 10.27.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26564/cce8c456-3d78-3f39-e7ab-49e9e1b1ed6c.png)

こんな感じのデータです。

# やりたいこと
- 名義変数の基本統計と表の作成
- Sexの”F"のカウント表示方法
- 連続変数統計の小数点以下の表示は小数点以下２桁くらいでいい


# 困っていること
- df.describe()では、最頻値"M"は表示されるが、それ以外は表示されない。Sexでは"F"のカウントはない
- 連続変数の統計量で、平均とか小数点以下6けた表示。

# やったこと
![スクリーンショット 2020-05-21 10.33.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26564/cc29e45e-a3ff-0c13-f7fe-87e9a29b6969.png)
![スクリーンショット 2020-05-21 10.39.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26564/f3190a86-b8cd-2011-b3b4-de8c25b66137.png)
![スクリーンショット 2020-05-21 10.47.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26564/ddb924ec-d7f1-7904-9524-f614392e947c.png)
RubyでJWTトークンを検証する

AWS Cognitoのウェブトークンの検証を実施したときのメモです。

[JSON ウェブトークンの検証 \- Amazon Cognito](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html)

Cognitoではユーザプールごとに検証用のJWKセットをダウンロードできます

`https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json `

#### 使用するGem

##### jwt
[jwt/ruby\-jwt: A ruby implementation of the RFC 7519 OAuth JSON Web Token \(JWT\) standard\.](https://github.com/jwt/ruby-jwt)

通常のJWTトークンのデコードに使用

##### json-jwt

[nov/json\-jwt: JSON Web Token and its family \(JSON Web Signature, JSON Web Encryption and JSON Web Key\) in Ruby](https://github.com/nov/json-jwt)

パブリック JSON ウェブキー (JWK) から公開鍵を作成するために使用

#### 実装

```ruby
# JWKセットをダウンロード
uri = "https://cognito-idp.ap-northeast-1.amazonaws.com/example/.well-known/jwks.json"
response = Net::HTTP.get_response(URI.parse(uri))
jwks = JSON.parse(response.body)

# JWTを検証無しでデコード
token = JWT.decode(jwt, nil, false)

# JWKセットの中からkidが一致するものを取得
jwk = jwks["keys"].find { |obj| obj["kid"] == token[1]["kid"] }

# 公開鍵を作成
public_key = JSON::JWK.new(jwk).to_key

# 公開鍵を利用してデコード 検証が不正の場合は例外となる
JSON::JWT.decode(jwt, public_key)
```

参考になりましたら LGTM お願いします
Excelで範囲選択をした後にコントロールキーを押すと出てくる邪魔なヤツの消し方

# Issue
Excelで、セルを選択した後にコントロールキーを押すと出てくるメニューが邪魔。
# Solution
範囲選択した状態でコントロールを押すと現れるメニューの名前は「クイック分析」である。

クイック分析を非表示にする方法は、Excelのオプション→全般→ユーザー インターフェイスのオプションの中の「選択時にクイック分析オプションを表示する(Q)」のチェックボックスをオフにする→「OK」ボタンを押下することでExcelのオプションを閉じる。

#備考
Excel:Microsoft Office 365 ProPlus
OS:Windows 10
AR Quick Lookで3DモデルをAR表示する

AR Quick Lookを使用すると、iOSのSafariで3DモデルをAR表示することができます。

[Quick Lookギャラリー \- 拡張現実 \- Apple Developer](https://developer.apple.com/jp/augmented-reality/quick-look/)

AR Quick LookではUSDZ形式の3Dモデルが必要になります。USDZ形式以外の3DモデルをUSDZファイルに変換するには上のリンク先のページ下部にある「Reality Converter」と「USDZツール」のどちらかを使用します。

Reality ConverterはGUIアプリで、USDZ形式以外の3Dモデルをアプリにドラッグ＆ドロップしてメニューからExportするだけでUSDZファイルを生成することができます。

USDZツールを使用する方法も解説します。2020年5月20日現在の最新版である`USD Python 0.64`をダウンロードして、含まれているパッケージをインストールします。インストールするとアプリケーションフォルダに`usdpython`というフォルダが作られます。この中にある`USD.command`をクリックするとターミナルが開きます。そこで以下のようにすると、適当な3DファイルをUSDZ形式のファイルに変換できます。`usdzconvert`には多数のオプションがあり`usdzconvert -h`で確認できます。

```
$ cd /Applications/usdpython/usdzconvert
$ ./usdzconvert ~/sample.obj ~/sample.usdz
```

作成したUSDZファイルをAR Quick Lookで表示するには、以下のようにリンクを貼るだけです。iOSのSafariでリンクをクリックするとARで表示することができます。

```html
<a rel="ar" href="/sample.usdz">
  <img src="/sample.jpg">
</a>
```

[AR Quick Lookを使ったモデルのプレビュー \- 日本語ドキュメント \- Apple Developer](https://developer.apple.com/jp/documentation/arkit/previewing_a_model_with_ar_quick_look/)
userを削除した際に紐づいたtweetを同時に削除する方法

某プログラミングスクールに約３ヶ月通い今回はその時に学習した事を書きます！！

今回はブログアプリを作成した際に、userを削除し紐づいたtweetも同時に削除する方法を書きます。

# dependent: :destory
dependent: :destoryとはuserを削除した際に紐づいたtweetも同時に削除してくれる機能で、これのおかげでuserを削除してもtweetだけが残るといった事を回避できます:point_up_tone2:

# 実装

```user.rb
Class User < ApplicationRecord
  has_many :tweets, dependent: :destroy
end
```

```tweet.rb
Class Tweet < ApplicationRecord
  belongs_to :user
end
```

上記の記述でuserを削除した際に紐づいたtweetも削除する様になりました。

# 注意点
tweetモデル側にdependent: :destroyを記述するとtweetを削除した際に紐づいたuserが削除されてしまいますので注意して下さい！！

最後まで見て頂きありがとうございます！！

この記事が少しでも参考になれば嬉しいです:pray_tone2:
新しくgitを設定するときのやつ

完全に自分用です

#自分のアカウントにリポジトリを作成
ここで設定するのはリポジトリ名くらいでとりあえず良い
https://github.com/...のアドレスを次で使うので念頭に
#cdへ
```
cd awesomeapp
```
#次にgit初期化
```
git init
```
#これでいける
```
git add .
git commit -m "なんちゃら"
git remote add origin https://github.com/...
git push master origin
```
#二回目からは
```
git status
git add .
git commit -m "なんちゃら"
git push origin master
```
でいける
北陽電機 URG-04LX-UG01 mac コンソールで通信してみた

#北陽電機　測域センサをmac コンソールで通信
測域センサをROSなどを使って使用することが一般的になっているが、動作チェックをしたくて、SCIP2.0（シリアル通信ベース）やってみようとしたら、ハマった。
なんとか通信チェックができたので、関連記事などを　まとめておく.

# 手順
- ひとつめのターミナル１を開く

```
[terminal:1]
sudo stty -f /dev/cu.usbmodem14101 raw 19200
cat /dev/cu.usbmodem14101 
```
- ふたつめのターミナルを開く

```
[terminal:2]
cat - > /dev/cu.usbmodem14101  
```
以下は、このふたつめのターミナル２にSCIP2.0のコマンドなどを打ち込むとひとつめのターミナル１に返答がかえってきた。
例えば、以下のようにターミナル２に入力すると

```
[terminal:2]
SPIC2.0
```

ターミナル１には以下のような返答が帰ってきた。

```
[terminal:1]
SPIC2.0
0Ee

```

同様に、一箇所だけスキャンするコマンドをターミナル２から送信すると

```
[terminal:2]
MD0384038400001
```
やったー！

```
[terminal:1]
MD0384038400001
00P

MD0384038400000
99b
8C?6`
00e5

```

やった〜！
ひさしぶりに、かなり、うれしい！

#ハマった原因
- tty.usb*** ではなく cu.ubs***　で接続する

#参考になったサイト
- [macOSでcat, echoでシリアル通信する](https://qiita.com/miminashi/items/4028eb2365cc23efa02d)

#関連サイト
- [測域センサのためのコマンドインタフェース“SCIP 2.1”](http://www.roboken.esys.tsukuba.ac.jp/~ohya/pdf/RSJ2008-IIJ.pdf)
- [移動ロボットの行動プログラミング](https://openspur.org/~atsushi.w/jikken/task-3.html)

#著者の関連ページ
- [理科好き集まれ♪マイクロビット実習【動画】](https://www.youtube.com/playlist?list=PLPKfPNY87vSjT09zAArgdIY1ahqJUB5jL)
- [簡単マイコン教室 micro:bit 大好き！おっちゃん先生のホームページ](https://qiita.com/tmdoi/items/61be444e1879912aa2a5)
- [Qiita Home](https://qiita.com/tmdoi)
Your user profile does not allow you to perform this actionエラー

Dataiku DSSを有償ライセンスに切り替えたところ
[LAB]>[New]>[CREATE]ボタンで以下のエラー。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/883390d7-ca2d-1931-1da9-f486f68f4efc.png)

Your user profile does not allow you to perform this actionと言われてしまいました。

自分のprofileを設定していなかったので以下のように設定したところ無事にCREATEできました。
[Administration]>[Security]
 自身のユーザーのProfileをData Scientistに変更。

ただしDataiku社との契約によってData Scientistの数には上限あると思いますのでご注意ください。

以上。
VB2017でVLC



# VB.NET2017 上の VLC で動画再生する方法
以下のコードで再生されます

        AxVLCPlugin21.playlist.add(New Uri("C:\SampleData\Pexels Videos 1234163.mp4").AbsoluteUri)
        AxVLCPlugin21.playlist.play()

# 環境
- Windows10 Ver-1903
- Visual Studio Community 2017
 - .NET Framework 4.5 (__4.5以上でないと動作しません__)
 - Any CPU
- VLC 2.2.5.1 x32
 - __Ver3ではうまくいきませんでした__
 - 実行環境にもインストールが必要です

# 準備
VLCのインストールは「推奨インストール」のままでＯＫです。プラグインも一緒にインストールされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483166/01fc9eb0-64f2-f020-866d-eda150601e83.png)
VisualStudio2017を起動し、ファイル→新規作成→プロジェクトを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483166/846d0f8b-fcab-49fd-a159-c5f5f7adfe20.png)
Windowsﾃﾞｽｸﾄｯﾌﾟ→Windowsフォームアプリケーションを選択、今回フレームワークは .NET Framework 4.5 を選択しました。
.NET Framework 4 では動作しませんでした。
.NET Framework 4.5で作成し .NET Framework 4 に変更し、さらに .NET Framework 4.5 に戻しても動作しませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483166/b8d3f73a-77c8-78e4-cae1-019c0a52ec24.png)
ツールボックス(どこでも)で__右クリック__し「アイテムの選択」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483166/cc800650-91b2-f720-f41d-7acecb21753d.png)
COMコンポーネントの[VLC ActiveX Plugin and IE Web Plugin v2]にチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483166/ab52fd02-2752-ac38-8b67-6c795cf76056.png)
ツールボックスに VLC が出てきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483166/eca530d8-9e17-ee95-cfac-b22f1d507d53.png)
以上でVLCを使う準備はできました。
(この時点でVLCを選択しているので、そのままフォームに貼り付けできます)

# 開発
ツールボックスからVLCを選択し、フォームに貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483166/eca530d8-9e17-ee95-cfac-b22f1d507d53.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483166/b1df8662-133e-511f-020d-1d8b191638ac.png)

コードを記述

```vb:Form1.vb
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AxVLCPlugin21.playlist.add(New Uri("C:\SampleData\Pexels Videos 1234163.mp4").AbsoluteUri)
        AxVLCPlugin21.playlist.play()
    End Sub
End Class
```
実行画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483166/8b021f54-cca7-e1cf-0bfd-749f47e7c043.png)

# 備考
今回の動画データは下記の無料動画サイトから取得しました。
https://www.pexels.com/ja-jp/video/1234163/
ログインしていないユーザーをnewやeditページに遷移しない様にする方法

# 今回のやりたい事は
ログインしていないユーザーは、index,showページのみ遷移できて、newページやeditページに遷移しようとすると強制的にindexページに遷移されるようにします。


# 方法
以下の処理を行うことで、ユーザーがログインしていない状態でindex,showページ以外に遷移しようとすると、強制的にindexページに遷移されるようになります。

```controller.rb

class PracticeController < ApplicationController
  before_action :move_to_index, except: [:index, :show]

  ---省略---

  private

  def  move_to_index
    redirect_to action: :index unless user_signed_in?
  end
```

# 説明

コントローラー内で繰り返し使用されるコードは、private以下でメソッド化します。

最後まで見て頂きありがとうございます！！

この記事が少しでも参考になれば嬉しいです:pray_tone2:
クリックした際に、「ⅴ」の向きを変更する方法

```html
<section>
      <h1 id="one">&nbsp; メニュー1</h1>
       <ul class="menu" id="open-menu">
             <li>中身1</li>
             <li>中身2</li>
             <li>中身3</li>
        </ul>
    </section>

```

ulなどは、関係ない要素だが、日常で使う場合はアコーディオンメニューなどで
使うことが多いと予想されるため記載

続いてCSS

```css
/* 記号＞ */
section > h1::before {
  content: '';
  width: 4px;
  height: 4px;
  border: 0;
  border-right: 2px solid black;
  border-bottom: 2px solid black;
  transform: rotate(45deg); 
  position: absolute;
  margin-top: 15px;
}
/* クリックした際に上向きにする */
.up::before {
  content: '';
  width: 4px;
  height: 4px;
  border: 0;
  border-right: 2px solid black;
  border-bottom: 2px solid black;
  transform: rotate(-135deg); 
  position: absolute;
  margin-top: 15px;
}

```

まず、疑似要素で＞の記号を作る。
その後、jsでクリックした際に、section > h1::beforeに.up::beforeが
つくようなCSSを用意する。

```js
const clickone = document.getElementById('one');
clickone.addEventListener('click', ()=>{
  clickone.classList.toggle('up');
});
```

まず、h1要素を取得して、そのh1(clickone)をクリックした場合に
.up::beforeがCSSにつくようにする
金融予測ラベリング応用編：　トリプルバリア戦略

どうも、KOです。
今回は[こちらの本](https://www.amazon.co.jp/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%8A%E3%83%B3%E3%82%B9%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E2%80%95%E9%87%91%E8%9E%8D%E5%B8%82%E5%A0%B4%E5%88%86%E6%9E%90%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%B7%B5-%E3%83%9E%E3%83%AB%E3%82%B3%E3%82%B9%E3%83%BB%E3%83%AD%E3%83%9A%E3%82%B9%E3%83%BB%E3%83%87%E3%83%BB%E3%83%97%E3%83%A9%E3%83%89-ebook/dp/B0834XJQTY)に紹介されているラベリング手法**トリプルバリア法**を実装していきたいと思います。

# トリプルバリア法とは
![Horizon based barrier.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562670/d96d265c-7073-0a7c-7a11-0430559d579d.png)

取引開始時刻を$t$としたときに、3つの条件を決めます。

- 利益確定幅
- 損切幅
- 最大保有期間

上の図のようになりますが、3つのバリアが出来ることから、トリプルバリアという名前がつきました。

# データセット

1949年からの日経平均株価の終値を使用します。

<table border="1" class="dataframe">  <thead>    <tr style="text-align: right;">      <th></th>      <th>close</th>    </tr>    <tr>      <th>DATE</th>      <th></th>    </tr>  </thead>  <tbody>    <tr>      <th>1949-05-16</th>      <td>176.21</td>    </tr>    <tr>      <th>1949-05-17</th>      <td>174.80</td>    </tr>    <tr>      <th>1949-05-18</th>      <td>172.53</td>    </tr>    <tr>      <th>1949-05-19</th>      <td>171.34</td>    </tr>    <tr>      <th>1949-05-20</th>      <td>169.20</td>    </tr>  </tbody></table>

# 実装

今回は利益確定を2%,損失を1%として、最大保有期間を5日とします。
もし5日間ほとんど値段が動かなかった場合は、5日目の終値で決済することにします。

```python
take_profit = 0.02
stop_loss = 0.01
max_holding_period = 5

prices = df["close"].values
label = [0]*len(prices)

for n in range(len(prices)-max_holding_period):
    outcome = 0
    for m in range(1, max_holding_period):
        if prices[n+m]/prices[n] > 1+take_profit:
            outcome = take_profit
            break
        if prices[n+m]/prices[n] < 1-stop_loss:
            outcome = -stop_loss
            break
    if outcome == 0:
        outcome = prices[n+m]/prices[n]-1
    label[n] = outcome
labels = pd.DataFrame(label, index=df.index, columns=["bin"])
labels
```

<table border="1" class="dataframe">  <thead>    <tr style="text-align: right;">      <th></th>      <th>bin</th>    </tr>    <tr>      <th>DATE</th>      <th></th>    </tr>  </thead>  <tbody>    <tr>      <th>1949-05-16</th>      <td>-0.01</td>    </tr>    <tr>      <th>1949-05-17</th>      <td>-0.01</td>    </tr>    <tr>      <th>1949-05-18</th>      <td>-0.01</td>    </tr>    <tr>      <th>1949-05-19</th>      <td>-0.01</td>    </tr>    <tr>      <th>1949-05-20</th>      <td>0.02</td>    </tr>  </tbody></table>

# 対インデックス比較
![triple_barrier_label.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562670/91dd5ee6-7686-ce47-3fa4-f88038fa1b8d.png)


今回は複利で行う。また、戦略としては毎日資産の20%を賭け、前章の戦略で清算する。
戦後からバブル自体までの上昇トレンドでもそうだが、バブル崩壊でもほとんど損をせずに勝ち続けている。
もちろん、これは取引コストやスリッページを無視しているため、実際に運用する際のパフォーマンス自体はこれよりは悪くなるのだが、バブル崩壊後の局面でも損をせずに利益を出し続けているのはすごいことだと思う。
基本的に3パラメーターを最適化することによって、より良い戦略にすることも出来ると思う。

# 結果
今回はトリプルバリア法に関する紹介をしたが、皆さんもパラメーターを色々と弄ったり、最適化してみてはいかがでしょうか？
python smtplibでメール送れず困ったときはコマンドライン


smtplib で繋がらないとき、プログラムだとステータスがわかりにくい。 
こういうとき、python cli を使うとレスポンスが表示されて何をすれば良いのかすぐわかって解決する。

```
$ python3

import smtplib
import ssl
from email.mime.text import MIMEText

port = 465
jp = 'iso-2022-jp'
smtp_server = "SMTPサーバ.どこか"
sender_email = 'メール@アドレス'
password = "**********"
receiver_emails = 'だれかの@メールアドレス'

message = 'hello world'
msg = MIMEText(message, jp)
msg['Subject'] = "お知らせ"
msg['From'] = sender_email
msg['To'] = receiver_emails

server = smtplib.SMTP_SSL(smtp_server, port)

server.ehlo()
>> (250, b'xxx(SMTPサーバ）xxxxxxxx\nAUTH LOGIN CRAM-MD5 PLAIN\nAUTH=LOGIN CRAM-MD5 PLAIN\nPIPELINING\n8BITMIME')
# AUTH LOIN とあるのでログインすればいいのでは？！！ 

server.login(sender_email, password)
>> (235, b'ok, go ahead (#2.0.0)')

server.sendmail(sender_email, receiver_emails, msg.as_string())
>> {}
```

これでメールが送信されている。　receiver_emailsについてはリストで渡せば複数の人にメールを出せる。
ORACLE：列の追加・削除・変更

## 列の追加
**ALTER TABLE Table名 ADD column**

例）table_Aに下記の2種類のカラムを追加
　column_1：VARCHAR2(200 byte)型で、NOT NULL制約を付与
　column_2：NUMBER型で有効数字3桁

```
ALTER TABLE table_A ADD (
    column_1 VARCHAR2(200 byte) NOT NULL ,
    column_2 NUMBER(*,0)
);
```

※NUMBER型の補足
**NUMBER (precision, scale)**

・任意で**precision（精度。全体の桁数）**と**スケール（小数点以下の桁数）**が指定可能。
例）NUMBER(*,0)
　精度：38（最大値）
　スケール：整数

## カラムの削除
**ALTER TABLE Table名 DROP**

例）table_Aからcolumn_1, column_2を削除

```
ALTER TABLE table_A DROP (
    column_1, column_2
)
```

## 列名の変更
```
ALTER TABLE テーブル名 RENAME COLUMN 変更前 TO 変更後;
```

## データ型変更
```
ALTER TABLE テーブル MODIFY (列の定義);
例：
ALTER TABLE table1 MODIFY (CODE VARCHAR2(10));
ALTER TABLE table2 MODIFY (CODE NUMBER);
```
インフラ用語まとめ

#はじめに
【この記事を書いたきっかけ】
AWSでデプロイを行ったが用語の理解が甘かったので、自分でまとめていつでも振り返ることができるようにする為。


##IPアドレス
`「IPアドレス(Internet Protocol Address)」`は、インターネット接続中のコンピュータの識別をする番号のことで、いわばインターネット上の住所のこと。
インターネット間のデータのやりとりは、IPアドレスを使って行われている。
インターネットで使われるIPアドレスは世界中に一つしかない。

##ドメイン
`「ドメイン」`はIPアドレスをわかりやすい名前にしたもの。
「aaa.com」や「aaa.site」など
ドメインもIPアドレスと同じく世界中に一つしかない。

ドメインはIPアドレスをわかりやすい名前にしたものなので、コンピュータ同士の接続にはIPアドレスが必要。
ドメイン名をIPアドレスに変換する仕組みを<b>`「DNS(Domein Nama System)」`</b>という。


##Webサーバ
「サーバ」はサービスを提供するコンピュータのこと。
Webサイトの表示に使うサーバのことをWebサーバという。

##「物理サーバ」と「仮装サーバ」
サーバには<b>「物理サーバ」</b>と<b>「仮装サーバ」</b>の2つに分けられる。
「物理サーバ」・・・実体のハードウェア1台に1つのサーバを構築する。
「仮装サーバ」・・・実体のハードウェア内に複数のサーバを構築できる。

##OS
`「OS(Operating System)」`はコンピュータを動かす為に必要なソフトウェア。
ユーザー(利用者)とコンピュータ、アプリケーションの仲介の役割を担っている。

<例>
・ユーザーがキーボードで文字を打った際に、ブラウザ(画面上)に表示できる
・アプリケーションで書いたプログラムを実行

##ソフトウエア
`ソフトウエア`はコンピュータを動かすプログラムのこと。

##ミドルウェア
`ミドルウェア`はOSとアプリケーションの中間に位置し、OS上で動作するソフトウェア。
ミドルウェアではOSの機能を拡張したり、アプリケーションの共通機能や処理を提供する。
これによって、アプリケーションを作らなくても、Webサービスやデータベースサービスなどの汎用的な機能を利用できる。

##ミドルウェアの種類
####Webサーバソフト
「Webサーバソフト」はWebサービスの通信を行う。
ユーザーのWebブラウザから送られてくるリクエストに対し、HTMLや画像などWebページを構成するコンテンツを送信する。
【例】Apache、Nginx、IIS


####データベース管理ソフト
「データベース管理ソフト」は、データの保存や検索を行う。
データを管理し、このデータベースに送られたリクエストに対して、データの作成や更新、削除、データ返信の処理を行う。
【例】MySQL、Oracle、Postgres

####メールサーバソフト
「メールサーバソフト」は、電子メールの受信や送信を行う。
【例】Postfix、Sendmail

##アプリケーション
`アプリケーション`はコンピュータでユーザーの用途や業務に応じて作成したプログラム。

OSはコンピュータのそのものの稼働に必要なソフトウエアだが、アプリケーションはユーザーがコンピュータに何らかの処理をさせる為、任意で作成される。

アプリケーションはプログラミング言語(Ruby・Java)で書かれているのが特徴。

##クラウドコンピューティング
`「クラウドコンピューティング（cloud computing）」`は、従来はPCにインストールして使っていたハードウェアやソフトウェアを、ネットワークを通じて利用できる方式。

これにより、ネットワーク上にあるコンピューティングシステム（サーバやストレージ、データベース、ネットワーク、ソフトウェア、分析など）を必要に応じて利用できる。

![infra-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607423/1c6effc6-b120-2ee4-b204-d544fa494e4f.png)
画像引用：https://www.pinterest.jp/pin/331647960036774735/

####オンプレミス
全ての環境を自分で構築し、運用する。
代表的なサービス：クラウドサービスではない

####laas（Infrastructure as a Service）
イァースまたはアイアースと読む。
ハードウェア部分、ネットワーク部分をクラウドサービスとして提供。
代表的なサービス：`AWS EC2、GCP GCE`

####Paas（Platform as a Service）
パースと読む。
OSまでの環境、OS上でアプリケーションを動かす環境をクラウドサービスとして提供。
代表的なサービス：`HEROKU、Salesforce`

####Saas（Software as a Service）
サースと読む。
アプリケーション、アプリケーション内のデータすべてクラウドサービスとして提供。
代表的なサービス：`iCloud、Slack、Gmail`
QtDesigner の作る .py でメインウインドウから ダイアログを呼び出して値を受けとるまで

備忘録かつ添削をお願いしたく。
.uiから pyside2-uic で生成される .py ファイル2つで、メインウインドウからダイアログを呼び出して値を受けとるまで。
setupUi利用の例として別な場面でも使えるのではと思います。

メインウインドウ側

```python:main.py
#当該部分のみ
from dia import Ui_Dialog #ダイアログ側呼び込み

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
 
#メイン側のsetupUiの中で、自身の持ち物としてQDialogを作り、ダイアログ側に渡してsetupUiしてもらう

        self.Dialog = QtWidgets.QDialog()
        sub = Ui_Dialog()
        sub.setupUi(self.Dialog)

#ダイアログ利用する場面で呼び出す
    def opendialog(self):
        result = self.Dialog.exec_()
        t = self.Dialog.findChild(QtWidgets.QLineEdit,"hogeLineEdit")
        print(result)
        print( t.text())
```

ダイアログ側

```python:dia.py

#setGeometry関係カットしてあります

class Ui_Dialog(object):
    def setupUi(self, Dialog):

        Dialog.setObjectName("Dialog")

        self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)

        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName("buttonBox")
        self.lineEdit = QtWidgets.QLineEdit(Dialog)
        self.lineEdit.setObjectName("hogeLineEdit")

        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), Dialog.accept)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), Dialog.reject)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
```
なんだかUiクラスの意味と使い方もつかめたように思います。
【Ruby on Rails】 　NO FILEのmigrationファイル削除する





##削除の流れ（まとめ）
1、マイグレーションファイルを復活

2、復活したマイグレーションファイルにRailsのバージョンを記載

3、マイグレーションファイルをdown statusに変更

4、マイグレーションファイルを削除

5、完了

詳細を以下に記載します。






##状況確認（ターミナル）

```
% bundle exec rails db:migrate:status                     


省略
   up     20200514113847  Add sessions table
   up     20200514143503  Change item buyer id to not null
   up     20200515081250  ********** NO FILE **********
   up     20200516055352  Rename size column to items
  down    20200516063953  Rename condition column to items
  down    20200516074758  Rename postage payer column to items
```




##ファイル復元（ターミナル）
ターミナルにてstatusコマンドで確認したIDを元に、以下を記述します。


```
% vim db/migrate/20200515081250_tmp.rb  
```
vimファイルに以下をコピペします。
 （　i で挿入モード　→　以下をコピぺ　→　escで挿入モード終了　→　：wq　で保存終了）
 
 
 

```
class Tmp < ActiveRecord::Migration
  def change
  end
end
```


この時点でdown statusに変更しようとすると

```
% bundle exec rails db:migrate:down VERSION=20200515081250
```


エラーが起きます。


```
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for:
```

##復活したマイグレーションファイルにRailsのバージョンを記載
原因はマイグレーションファイルがrailsのバージョンに対応していないことが原因のようです。
バージョンを記述します。

```ruby:20200515081250_tmp.rb
class Tmp < ActiveRecord::Migration[5.2] #⬅︎[5.2]を追加
  def change
  end
end
```

##マイグレーションファイルをdown statusに変更（ターミナル）

```
% bundle exec rails db:migrate:down VERSION=20200515081250
```




ターミナルにてdownされているか確認

```
% bundle exec rails db:migrate:status                     

省略
   up     20200514113847  Add sessions table
   up     20200514143503  Change item buyer id to not null
  down    20200515081250  Tmp
   up     20200516055352  Rename size column to items
  down    20200516063953  Rename condition column to items
  down    20200516074758  Rename postage payer column to items
  down    20200516090645  Rename prefecture code column to items
  down    20200516101833  Add preparation day id to items
```

##削除

```
% rm -rf db/migrate/20200515081250_tmp.rb 
```

消去出来ているかステータスを確認します。

```
 % bundle exec rails db:migrate:status 
```


消去出来ています。

```
up     20200514113847  Add sessions table
   up     20200514143503  Change item buyer id to not null
   up     20200516055352  Rename size column to items
  down    20200516063953  Rename condition column to items
  down    20200516074758  Rename postage payer column to items
  down    20200516090645  Rename prefecture code column to items
  down    20200516101833  Add preparation day id to items
```
golang 戻り値が関数の時の初期化的な流れ

# 関数が戻り値の時に、どういう流れで初期化されているのか確認してみた

#### 関数を返す前までの準備はされた上で、関数が戻り値として帰る。その戻った関数が実行されるのは、それが実行される時（わかりにくい表現だなぁ）

``` closure.go
package main                                                                                       

import "fmt"

func intSeq() func() int {
    i := 0
    fmt.Println("init")
    return func() int {
        i += 1
        return i
    }   
}

func main() {
    fmt.Println("before init")
    nextInt := intSeq()
    fmt.Println("after init")

    fmt.Println(nextInt())
    fmt.Println(nextInt())
    fmt.Println(nextInt())
    newInts := intSeq()
    fmt.Println(newInts())
}      
```
結果

```
before init
init
after init
1
2
3
init
1
```
画面サイズに合わせてパーツの大きさを変える（初心者向け）

こんにちは。プログラミング初心者兼Swift初心者です。

storyboardのオートレイアウトで画面サイズが変わっても、部品の位置はある程度決めることができますが、大きさを変えることができないので「小さい画面だとキツキツ、大きい画面だと余白ができる」なんてことがありました。
そこで画面サイズを元にして、動的に部品サイズを変更することができたのでコードを載せておきます。

```Swift
    //今回はImageViewの大きさを変更します
    @IBOutlet weak var imageView: UIImageView!
    //画面サイズを取得
    let screenSize = UIScreen.main.bounds.size

    override func viewDidLoad() {
        super.viewDidLoad()

        //imageViewの横幅を画面サイズの80%にする
        let ivWidth = screenSize.width * 0.8
        //imageViewの縦幅は横幅の0.666....倍
        let ivHeight = ivWidth * 0.66
        //あとから左右中央にするのでy座標と大きさをここで決める
        imageView.frame = CGRect(x: 0,
                                 y: screenSize.height / 6,
                                 width: ivWidth,
                                 height: ivHeight)
        //左右中央に指定
        imageView.center.x = screenSize.width / 2
    }
```
簡略化するためにUIImageViewのアスペクト比や画面サイズを元に定数で書いていますが、変数に格納したほうがいいですね笑
Qiita投稿時のテンプレート

# 概要
Qiita投稿時の私的テンプレートです[^1]。
気に入った方はご自由にどうぞ〜！


# 目次
 - [セクション1](#セクション1)
 - [セクション2](#セクション2)
    - [セクション2.1](#セクション21)
    - [セクション2.2](#セクション22)
       - [セクション2.2.1](#セクション2.2.1)
 - [セクション3](#セクション3)


# セクション1
セクション1です。

```console
$ pwd
```

```shell-session
$ pwd
/Users/[ユーザ名]
```

```Hello.py
print("Hello world")
```


# セクション2
セクション2です。

## サブセクション2.1
サブセクション2.1です。

## サブセクション2.2
サブセクション2.2です。

### サブサブセクション2.2.1
サブサブセクション2.2.1です。

### サブサブセクション2.2.2
サブサブセクション2.2.2です。


# セクション3
セクション3です。

## サブセクション3.1
サブセクション3.1です。

### サブサブセクション3.1.1
サブサブセクション3.1.1です。

### サブサブセクション3.1.2
サブサブセクション3.1.2です。

## サブセクション3.2
サブセクション3.2です。


# おわりに
こんな感じですかね〜


# 参考
あればここに書きましょう。↓こんな感じで

 - [初めてのPython ~環境構築編~](https://qiita.com/kuroitu/items/f632e5c1f7445280fa9a)


[^1]: 注釈1です。
［Googleパスワードマネージャー］Googleアカウントのセキュリティ性を向上させてみた。

つい先日までは不正ログインをされても金銭的に被害を受けるわけじゃないしと思って同じパスワードを200アカウントぐらい使いまわしてたのですがAWSやGCPなどのクラウドサービスを運用するのに**クラウド破産**が怖くなったので2日ほど時間を割いて全部のパスワードを変更してきました。

## パスワードマネージャーの選定

- セキュリティ性が高い
- クラウドベース(紛失防止)
- サービスが終了しずらい
- 利便性が高い
- 無料

これら全てを叶えてくれるのが**Googleパスワードマネージャー**だったので迷わず決めました。設定項目の地味な場所にあるのですが個人的に最高峰のパスワードマネージャーだと思います。最悪浮気したくなってもパスワードのエクスポート機能があるので

ごちゃごちゃしていなくてシンプルデザインな上に右クリックでパスワードの自動生成ができて自動入力もでき変に拡張機能を導入しなくてもChromeブラウザで標準装備されているので気に入りました。

## 他のパスワードマネージャー

[List of password managers(Wikipedia)](https://en.wikipedia.org/wiki/List_of_password_managers)

一応他のパスワードマネージャーも見てみたのですが私はほとんどのパスワードはブラウザから入力するのが当たり前なので**Googleパスワードマネージャー**以外ありえませんでした(洗脳)

## Googleアカウントの死守

本格的にGoogleパスワードマネージャーを運用するなら今まで以上に死ぬ気でメインのGoogleアカウントを守らないといけ無くなるので以下の項目は必ず設定しましょう。

### 再設定用のメールアドレスと電話番号
Googleとの意思疎通を取れる大事な連絡手段なので設定しましょう。私の場合サブのメールアドレスはヤフーメールにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535916/53bed678-ef28-70f6-171e-f863662f4388.png)

### 二段階認証(Google Authenticator)
[ここ](https://myaccount.google.com/security)からオンにできるので是非しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535916/a0e0c233-387e-330c-2229-4b9fbca704ef.png)



### バックアップコード(マスタキー)
この二段階認証は基本的にスマホありきの設定なのでスマホを紛失したりするとGoogleアカウントが実質ロックされます。忘れずバックアップコードを印刷して発行しましょう。印刷するとちょうどバックアップコードの部分がクレジットカードぐらいの大きさになるで私は数字のところだけ切り抜いてハードタイプのカードケースに入れて保護して財布に入れて保管してます。あと私の場合もう一枚自宅で補完しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535916/25dfecad-24fe-044d-6c6d-1b4913b66aab.png)


### その他
私の場合Googleアカウント本体のパスワードも変更しました。
【AWS】そもそもAWSとは？

# はじめに
現在、AWSソリューションアーキテクトアソシエイト(AWS-SAA)の資格取得を目指しています。
その中でAWSの概要について学びました。
今回は、そもそもAWSとは何か？ということについてアウトプットしていきたいと思います。

# そもそもAWSとは？

**「Amazon Web Services」**の略になります。
代表的なパブリッククラウドサービスになります。

他にも代表的なパブリッククラウドは、AzureやGCP(Google Cloud Platform)があります。

「AWS」はAmazonの関連企業です。
最初は、Amazon自身のインフラ基盤を支えるために作られました。
その後に、自社ではなく他社にもインフラ基盤を貸し出そうという考えでスタートしたのが**「AWS」**です。

# リージョン/アベイラビリティーゾーン/エッジロケーション

## アベイラビリティーゾーン

**互いに近くに立地しているデータセンターの集まりになります。**

一言でいうと、地域内のデータセンターになります。


各アベイラビリティーゾーンは、火災や地震などの火災、電力やネットワークの障害が発生した場合にも、
他のアベイラビリティーゾーンに影響がない場所に立地しています。

**※住所は非公開**

## リージョン

**アベイラビリティーゾーンを地域ごとにグループ分けしたものになります。**

一言でいうと、地域のことになります。

日本であれば、東京リージョンと大阪リージョンがあります。


## エッジロケーション

**コンテンツキャッシュ、DNSサービス、セキュリティの機能を提供しているロケーションになります。**
リージョンよりも数が多く、100箇所以上に配置されています。

リージョンやアベイラビリティゾーンとは全く別のデータセンターになります。

# アベイラビリティーゾーンとリージョンを図で表す

![図.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/4db7c635-646f-8471-4a93-f3e02d336863.jpeg)


東京リージョンならば、その中にデータセンター群がこちらの図のように存在するという形になります。



# 参考

[この１冊で合格！　AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集](https://www.amazon.co.jp/gp/product/B07VFFX6V1/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)

[AWSとは何か？サービス例やメリットをわかりやすく解説！](https://udemy.benesse.co.jp/development/web/what-is-aws.html)

[AWSにおける リージョン、AZ、エッジの違い](https://awsjp.com/AWS/hikaku/Region-AZ-Edge.html)
Laravel7をGCP Google App EngineへデプロイしてDBマイグレーションしてプロモートする

# やりたいこと

- デプロイとDBマイグレーションとプロモート(サイト公開)をコマンドで実行したい

# ソース

### composer.json

- `composer gcloud-deploy` コマンドを登録する
- `chmod 744 gcloud-deploy.bash ` で実行権限を付与しておく

```json
    "scripts": {
        "gcloud-deploy": [
            "./gcloud-deploy.bash"
        ],
```

### gcloud-deploy.bash
- jsonのパースに[jq](https://stedolan.github.io/jq/)を使うのでインストールしておくこと

```bash
#!/bin/bash
#set -eu

# proxy実行しているかチェックする
proxyCommand="cloud_sql_proxy -instances=foo-bar-apps:asia-northeast1:foo-bar-mysql=tcp:3306"
ps auxww|grep "$proxyCommand"|grep -v grep
if [ "$?" = "1" ];then
    echo "You must run proxy to do db migrate."
    echo ""
    echo $proxyCommand
    echo ""
    exit 1
fi

npm run prod

# DBマイグレーションはlocalで実行しproxy経由でproductionに接続されるので
# 設定ファイルを.env.productionからコピーする
# 現在使用中の.envはバックアップしておく
rand=$RANDOM && cp .env .env.backup.$rand && cp .env.production .env
message=`php artisan migrate --pretend`
cp .env.backup.$rand .env

# DBマイグレーションが必要かチェックする
if [ "$message" = "Nothing to migrate." ]; then
    # DBマイグレーションが不要なら通常のデプロイ
    echo "Youd don't need to do db migrate."
    echo "Laravel artisan said: $message"
    gcloud app deploy --quiet --project=foo-bar --verbosity=info
else
    # DBマイグレーションが必要ならデプロイオプションで--no-promote(公開しない)
    echo "Youd need to do db migrate."
    echo "Laravel artisan said: $message"
    gcloud app deploy --quiet --project=foo-bar --verbosity=info --no-promote --format=json | tee gcloud-version.json

    # DBマイグレーションする
    rand=$RANDOM && cp .env .env.backup.$rand && cp .env.production .env
    php artisan migrate --force
    cp .env.backup.$rand .env

    # --promote(公開する)
    appVersion=`jq -r '.versions[0].id' gcloud-version.json`
    gcloud app deploy --promote --quiet --version=$appVersion
fi
```

### .gcloudignore

```
gcloud-version.json
.env.backup.*
```

# ほか

- コマンドひとつで実行できるようにはなったが課題はある
 - `.env.production`と`.env.local`の管理したくない
 - というか、現在使用中の.envを上書きされたくない...
- マイグレーションの必要がないなら通常の`gcloud app deploy`を実行したい 
 - `migrate --pretend`を判定して分岐してみた
- デバッグ用にdeploy.logとか出力するとsha mismatchエラーでbuildがコケた
 - `.gcloudignore`に追加すると解決したような気がする

```
Step #0 - "fetcher": Failed to fetch gs://staging.foo-bar-hoge.appspot.com/xxxx, will no longer retry: fetching "gs://staging.foo-bar-hoge.appspot.com/xxxx" with timeout 1h0m0s to temp file "/workspace/.download/xxxx": deploy.log SHA mismatch, got "xxxx", want "xxxx"
```



# 参考

- [Run Laravel on Google App Engine standard environment](https://cloud.google.com/community/tutorials/run-laravel-on-appengine-standard?hl=ja)
- [Laravel5.5をGoogle App Engineで動かす](https://qiita.com/fullkawa/items/4d6b080385de5523835c)
- [Laravel6をGoogle App Engineで動かす](https://qiita.com/kiyc/items/d86da4e5753220c121b9)
初心者によるプログラミング学習ログ 322日目

#100日チャレンジの322日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
322日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>322日目 1.5h<br>・架空LP模写11日目1.5h（<a href="https://twitter.com/ririru_123?ref_src=twsrc%5Etfw">@ririru_123</a>）<br>・架空LP模写：お問い合わせ部分を作成<br><br>累計時間にして14時間ぐらいか・・・<br>スマホ版いまだ完成せずだわｗ<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1263203769812004864?ref_src=twsrc%5Etfw">May 20, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【Golang】http.ClientにRoot CAを読み込ませる

RootCAs が nil だと普通にPCの証明書を取りに行っちゃうのでRoot CAをハードコードする

これでBurp Suiteとかを使った中間者攻撃を対策できる・・・ハズ

```main.go
	ca := `-----BEGIN CERTIFICATE-----
読み込ませる Root CA の中身
-----END CERTIFICATE-----`
	caCertPool := x509.NewCertPool()
	caCertPool.AppendCertsFromPEM([]byte(ca))

	c := &http.Client{
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{
				RootCAs:      caCertPool,
			},
		},
	}
```
PRML　演習問題 2.17 （基本）

## 問題
> (2.43)の多変量ガウス分布を考える。精度行列（逆共分散行列）$\mathbf{\Sigma^{-1}}$を対称行列と反対称行列（歪対称行列）の和の形で書くと、反対称行列の項がガウス分布の指数部分には現れなくなるため、一般性を失うことなく精度行列は対称であるとしてよいことを示せ。


## 多変量ガウス分布
**多変量ガウス分布**は、多変量正規分布（Multivariate normal distribution）のことです。
確率変数 $\{X}$ について、変数が $\mathrm{x}$ という１個の場合、$\mathrm{x}$ が従う正規分布は

```math
\begin{align*}
\mathcal{N}\left(x | \mu, \sigma^{2}\right)=\frac{1}{\left(2 \pi \sigma^{2}\right)^{1 / 2}} \exp \left\{-\frac{1}{2 \sigma^{2}}(x-\mu)^{2}\right\}
\tag{2.42}
\end{align*}
```

になります。
また、$\mathbf{ x } ^ \mathrm { T }=\left(x_{1}, x_{2}, \ldots, x_{D}\right)$という $\{D}$ 次元ベクトル$\mathbf{ x }$が従う多変量正規分布は

```math
\begin{align*}
\mathcal{N}(\mathbf{x} | \boldsymbol{\mu}, \mathbf{\Sigma})=\frac{1}{(2 \pi)^{D / 2}} \frac{1}{|\mathbf{\Sigma}|^{1 / 2}} \exp \left\{-\frac{1}{2}(\mathbf{x}-\boldsymbol{\mu})^{\mathrm{T}} \mathbf{\Sigma}^{-1}(\mathbf{x}-\boldsymbol{\mu})\right\}
\tag{2.43}
\end{align*}
```

と書けます。ただし、$\boldsymbol{\mu}$ は $\{D}$ 次元の平均ベクトル、$\boldsymbol{\Sigma}$ は $\{ D \times D}$ の共分散行列、そして $|\mathbf{\Sigma}|$ は $\mathbf{\Sigma}$ の行列式を表すこととします。

## 方針
ここでは、任意の行列 $\mathbf{M}$ が、対称行列 $\mathbf{S}$ と反対称行列 $\mathbf{A}$ を用いて

```math
\begin {align*}
\mathbf {M} = \mathbf{S + A}
\end{align*}
```
と表されることに着目します。（比較的簡単に証明できます）
これを用いて、精度行列$\mathbf{\Sigma}^{-1}$を対称行列と反対称行列の和の形に分解した上で、ガウス分布の変数 $\{x}$ に依存する部分（二次形式）に含まれる行列が、対称行列のみによって表されることを示します。

## 解答
任意の行列 $\mathbf{M}$ について、$\mathbf{M}$ を表す対称行列 $\mathbf{S}$ と反対称行列 $\mathbf{A}$ を用いて、
$\mathbf{M=S+A}$ と表される時、（ $\mathbf{S=S^{t}}$ 、$\mathbf{A=-A^{t}}$ ）

$\{s_{ij}}$ = $\{s_{ji}}$
$\{a_{ij}}$ = $\{-a_{ji}}$

よって、

$\{m_{ij}}$ = $\{s_{ij}}$ + $\{a_{ij}}$
$\{m_{ji}}$ = $\{s_{ji}}$ + $\{a_{ji}}$ =$\{s_{ij}}$ - $\{a_{ij}}$

上記２式の辺々の加法と減法により、
$\{s_{ij}}$ = $(\{m_{ij} + \{m_{ji}}})/2$
$\{a_{ij}}$ = $(\{m_{ij} - \{m_{ji}}})/2$

よって、精度行列 $\mathbf{\Sigma^{-1}}$ について、$\mathbf{M}$ =  $\mathbf{\Sigma^{-1}}$ とすると、ガウス分布の二次形式の部分は、

```math
\begin{align*}
(\mathbf{x}-\boldsymbol{\mu})^{\top} \mathbf{M}(\mathbf{x}-\boldsymbol{\mu})=\sum_{i=1}^{D} \sum_{j=1}^{D}\left(x_{i}-\mu_{i}\right) m_{i j}\left(x_{j}-\mu_{j}\right)
\end{align*}
```

と表せる。

$x_{i}-\mu_{i}=y_{i}$　とおき、上記の二次形式を展開した式に代入すると、

```math
\begin{align*}
\sum_{i=1}^{D} \sum_{j=1}^{D} y_{i}\left(s_{i j}+a_{i j}\right) y_{j}
& =\sum_{i=1}^{D} \sum_{j=1}^{D}\left(y_{i} y_{j} s_{i j}+y_{i} y_{i} a_{i j}\right) \\
& =\sum_{i=1}^{D} \sum_{j=1}^{D} y_{i} y_{j} s_{i j}+\sum_{i=1}^{D} \sum_{j=1}^{D} y_{i} y_{j}\left(\frac{m_{ij}-m_{j i}}{2}\right) \\
& =(\mathbf{x}-\boldsymbol{\mu})^{\top} \mathbf{S}(\mathbf{x}-\boldsymbol{\mu})+\frac{1}{2} [ \sum_{i=1}^{D} \sum_{j=1}^{D} y_{i} y_{j} m_{i j}-\sum_{i=1}^{D} \sum_{j=1}^{D} \ y_{j} y_{i} \ m_{j i}] \\

& = (\mathbf{x}-\boldsymbol{\mu})^{\top} \mathbf{S}(\mathbf{x}-\boldsymbol{\mu})
\end{align*}
```

よって、題意は証明された。