OmniAICreator/Qiita-1.07M huggingface dataset:
laradocker構築

##初めてdockerlaravelを構築したのでその手順をまとめた

###1.Laradock取得

```
$mkdir ~/my_docker
$cd ~/my_docker
$git clone https://github.com/laradock/laradock.git
```

###2.Laradockの設置ファイル修正

```
$cd Laradock
$cp env-example .env
$cp mysql/docker-entrypoint-initdb.d/createdb.sql.example mysql/docker-entrypoint-initdb.d/createdb.sql
```

```:.env
//修正することで別プロジェクトで競合を防ぐ
-DATA_PATH_HOST=~/.laradock/data
+DATA_PATH_HOST=~/.laradock/my_docker_project/data

//こちらも競合を防ぐ
-COMPOSE_PROJECT_NAME=laradock
+COMPOSE_PROJECT_NAME=my_docker-laradock

-MYSQL_VERSION=latest
+MYSQL_VERSION=5.7
```

###3.Laradockビルド・アクセス

```
$cd ~/my_docker/laradock
$docker-compose build workspace ngnix mysql redis
$docker-compose up -d ngnix mysql redis
```
立ち上がればworksqaceサーバへアクセス

```
$docker-compose exec workspace bash
```

###4.Laravel・yarnインストール
workspaceサーバ内で書きコマンドを実行

```
$ composer create-project laravel/laravel --prefer-dist laravel //laravelインストール。プロジェクト名laravel
$cd laravel
$yarn install  //yarnインストール
```

###5.Laravel設定ファイル修正
laradocker内の.envファイルと合わせる
こちらはlaravelの.envファイル

```.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
```

###6.ブラウザアクセス

hosts修正

```
$sudo vi /private/etc/hosts
```

```:private/etc/hosts
+127.0.01 my_docker.com
```

####アクセス
ブラウザで　http://my_docker.com へアクセスしlaravelが表示されれば完了
LAN内のRaspberry Piを探す方法

LAN内のRaspberry Piを探す簡単な方法。pingするとIPアドレスが見つかります。

```
ping raspberrypi.local
```

LAN内のコンピューター一覧を調べる方法。

```
arp -a
```

一度見つかったら、MACアドレスを控えておくと、次回よりIPアドレスが変わっても、どれがRaspberry Piか分かりますね。
ローカル環境でMysqlWorkbenchに接続する

## はじめに
自分用の備忘録として書きました．
ほぼ，[MySQLWorkbench を Vagrant + VirtualBox 上の MySQL と繋ぐ方法](https://qiita.com/colorrabbit/items/e3867d0d57d18f703580)と同じです．

## 接続方法
vagrant upした状態で，
```$ vagrant ssh-config```

```
Host homestead
  HostName 127.0.0.1
  User vagrant
  Port 2222
  …
  IdentityFile /Users/…/Private_key
  …
```

MySQLWorkbenchを起動して，
Database -> Connect Database
(もしくは、MySQL Connections 画面の + を押下(こちらからやると接続する際の設定が保存されるのでおすすめ))

|項目|設定内容|
|:-:|:-:|
|Connection Name|Connectionの＋から追加した場合は名前をつける|
|Connection Method|Standard TCP/IP over SSH|
|SSH Hostname|127.0.0.1:2222|
|SSH Username|vagrant|
|SSH Key File|上記IdentityFileのパス|
|MySQL Hostname|127.0.0.1|
|MySQL Server Port|3306|
|Username|root|

OKを押下

## 参考文献
[MySQLWorkbench を Vagrant + VirtualBox 上の MySQL と繋ぐ方法](https://qiita.com/colorrabbit/items/e3867d0d57d18f703580)
[vagrantでLaravelの開発環境構築](https://walking-succession-falls.com/vagrant%E3%81%A7laravel%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89/)
colaboratoryで、githubのサンプルコードをダウンロードした話。

colaboratoryで、githubのサンプルコードをダウンロードした話。

[ゼロから作るDeepLearning]を読んでいました。

サンプルコードが、githubにありました。

https://github.com/oreilly-japan/deep-learning-from-scratch

ローカルでは正常にダウンロードできました。

サンプルコードをcolabortoryでダウンロードする方法が分かったので記録しておきます。

!wget --no-check-certificate https://github.com/oreilly-japan/deep-learning-from-scratch/tarball/master

!tar xvf master

ls -l


---
謝辞）
下記の記事を参考にしました。ありがとうございました。
https://howpon.com/4081


ーーー
下記で、「ゼロから作るDeepLearnig」の読書会をしています。
無料オンラインです。
https://engineeringskype.connpass.com/
競技プログラミングでTLEのときに高速化できるアルゴリズム

暇があるときに更新する、競プロをやっているときに気づいたことの備忘録

## Level1

#### 累積和
配列の部分和を求め比較する必要がある際、一回づつ部分和を求めるのではなく、前項(i項まで)の和にi+1の項を加えてそこから部分和の範囲を考慮したほうが早い。例上記が正解、下記だとTLEになる。

``` python:ABC_D_Dice_in_Line.py 
for i in range(k, len(p)):
    saveSum = saveSum + p[i] - p[i - k]
    if saveSum > M:
        M = saveSum

```

``` python:ABC_D_Dice_in_Line.py 
for i in range(len(p) - k + 1):
    # 一回づつlistの和を求めているから計算量が多い
    savesum = sum(p[i:i + k])
    if savesum > M:
        M = savesum

```

#### itertools
あとで書く
ASCII（アスキー）コード表

自分用のアスキーコード表のメモです。

# ASCII（アスキー）の構成

| コード範囲  | 内容            |
|:-----------|:---------------|
| 0x00 - 0x1F | 制御文字        |
| 0x20        | 半角スペース    |
| 0x21 - 0x7E | 図形文字        |
| 0x7F        | 制御文字（DEL） |

# ASCII（アスキー）コード表

|      |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |  9   |   A   |   B   |  C   |  D   |  E   |  F   |
| :--: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :--: | :---: | :---: | :--: | :--: | :--: | :--: |
| **0x00** | *NUL* | *SOH* | *STX* | *ETX* | *EOT* | *ENQ* | *ACK* | *BEL* | *BS*  | *HT* | *LF*  | *VT*  | *FF* | *CR* | *SO* | *SI* |
| **0x10** | *DLE* | *DC1* | *DC2* | *DC3* | *DC4* | *NAK* | *SYN* | *ETB* | *CAN* | *EM* | *SUB* | *ESC* | *FS* | *GS* | *RS* | *US* |
| **0x20** | *SP*  |   !   |   "   |   #   |   $   |   %   |   &   |   '   |   (   |  )   |   *   |   +   |  ,   |  -   |  .   |  /   |
| **0x30** |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |  9   |   :   |   ;   |  <   |  =   |  >   |  ?   |
| **0x40** |   @   |   A   |   B   |   C   |   D   |   E   |   F   |   G   |   H   |  I   |   J   |   K   |  L   |  M   |  N   |  O   |
| **0x50** |   P   |   Q   |   R   |   S   |   T   |   U   |   V   |   W   |   X   |  Y   |   Z   |   [   |  \   |  ]   |  ^   |  _   |
| **0x60** |   `   |   a   |   b   |   c   |   d   |   e   |   f   |   g   |   h   |  i   |   j   |   k   |  l   |  m   |  n   |  o   |
| **0x70** |   p   |   q   |   r   |   s   |   t   |   u   |   v   |   w   |   x   |  y   |   z   |   {   |  &#x7C;  |  }   |  ~   | *DEL*  |
manpageをgrepして探す

# Linuxコマンドが思い出せないとき

コマンドがどうしても思い出せないときがあります。
manpageのキーワードだけ覚えているとき、下のコマンドを使います。

```sh
$ man -K -w -W keyword
```
自分は面倒なのでスクリプトファイル ~/bin/mangrep にして使用しています。

```sh
#!/bin/bash
man -K -w -W $*
```

```sh
$ mangrep performance
/usr/share/man/ja/man1/nmap.1.gz
/usr/share/man/ja/man1/dig.1.gz
/usr/share/man/ja/man1/dnskeygen.1.gz
/usr/share/man/ja/man1/dnsquery.1.gz
:
```

# あと良く使うコマンド

```sh
$ apropos
```
面倒なのでalias a=aproposとして、

```sh
$ a printf
asprintf (3)         - 文字列を割り当ててそれに出力する
dprintf (3)          - ファイルディスクリプターに文字出力する
fprintf (3)          - 指定された書式に変換して出力を行う
fwprintf (3)         - ワイド文字を フォーマットして出力する
:
```
のように使います。


# 参考文献

- 本ページで紹介した以外にいろいろ探すコマンドが紹介されておりました。https://qiita.com/nab/items/fbb89fe462a5eaba1fa0

以上
poetryでrequirements.txtからパッケージをインストールしたい

# 概要
既存プロジェクトでのパッケージ管理をrequirements.txtで行っていたが、そのパッケージをそのままpoetryでinstallする際のメモ
poetryではrequirements.txtから直接インストールはできない

# 解決方法

poetry環境ではない場合はまずinitしておく

```
poetry init
```

requirements.txtの中身をfor文で回し、一つずつpoetry addしていく

```
for package in $(cat requirements.txt); do   poetry add "${package}"; done
```

# 参考
https://github.com/python-poetry/poetry/issues/46
少し古い環境向けにNVDEC/NVENCを有効にしたffmpeg をビルドする

わけあって少し古い環境でNVDEC/NVENCを有効にしたffmpegを使いたくなったのですが、ビルドで一苦労あったのでメモを残します。
ubuntu 16.04 でNvidia のVideo Codec SDKが8.0.14 です。

## NVDEC/NVENCを有効にしたffmpegのビルド

このページを参考にビルドします。
[NVENCを使ったHWEncode環境](https://qiita.com/yamakenjp/items/7474f210efd82bb28490)

ffmpeg は n4.2.2 を使いました。
古い環境でもビルドできました。

## 実行時にエラー

しかし、ハードウェアデコーダを使用しようとするとエラーになります。

```
[h264_cuvid @ 0x556348eb94c0] Cannot load cuvidGetDecodeStatus
[h264_cuvid @ 0x556348eb94c0] Failed loading nvcuvid.
```

このエラーメッセージでググるとこのページがヒットしました。全く同じ症状。
[compiling ffmpeg with nvidia/cuda failed loading nvcuvid](https://stackoverflow.com/questions/51833519/compiling-ffmpeg-with-nvidia-cuda-failed-loading-nvcuvid/51853945)

> Linux needed a "396.24 or newer driver". And only CUDA toolkit 9.2 at least, supports this driver version.

と書いてあり、ドライバをアップデートする方法が紹介されています。
ぐぬぬ。ubuntu 16.04 のままでは新しいドライバが入らない。これまでか ...

## まだあきらめるのは早い

`cuvidGetDecodeStatus` がどこで使われいるのかを探すと、これはビルド時にインストールした`nv-codec-headers`の中のインクルードファイルにつきあたります。
`nv-codec-headers`はgitリポジトリで提供されているので、変更履歴をさかのぼることができます。
そうすると、Video Codec SDKがまだ8.0.x の頃のものもあるじゃないですか！
履歴を見ると`cuvidGetDecodeStatus`というのはSDK8.1から追加されたこともわかります。

SDK8.0のブランチをcheckout してインクルードヘッダをインストールしなおして、ffmpeg を再度ビルドしました。
すると実行時エラーは解消して、NVDEC/NVENCを有効にしたffmpeg を無事使えるようになりました。
めでたしめでたし。 w

使い方
[NVIDIA FFmpeg Transcoding Guide](https://devblogs.nvidia.com/nvidia-ffmpeg-transcoding-guide/)
開発環境、テスト環境、本番環境って何？雑にメモ


３つの環境が用意されているよ

例えば、herokuにpushする場合は、本番環境を使用しているみたい


こいつらは、RAILS_ENVという環境変数を用いて動作モードを切り替えられる


例えば、コマンドプロンプトで普通に指令を送る場合は、開発環境に送っている。

じゃあ「本番環境」を指定して実行したい時は、、、

このコードを記述すればおk

RAILS_ENV=production
主にUiPathユーザー向けのIF演算子の話

# 要約
IF文の動作、ショートサーキット（短絡評価）の話。（←この文字を見て「あー」と思った人は読まなくて大丈夫だと思います）


# IF演算子（と、IIF演算子）
## UiPath・VB.NETの場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552763/08b6bf59-bf06-b931-1188-2b20c78ce6d4.png)

たとえばこんなWorkflowを想定してみます。
Bに0が入っているので、IF文では「B = 0」はTrueと評価され、結果として「Bが0です」と表示されます。

__でもこれ、IFを「関数」と理解すると、本当はおかしいんだぜ？__

何故かというと、プログラミングや数学などで言うところの関数は、その内側が先に評価（計算）されないと成り立たないからです。

たとえば、消費税額を計算する、という関数を考えてみます。入力値 i に、10%を掛けるのを「消費税関数」としましょう。（税率が後から変更とかそういう話は枝葉末節なので省略）

さて、100円と200円の品物を買い、消費税額を計算するのは、

    消費税関数(100 + 200)

になります。ここで考えてほしいのは、関数の内側では渡されたのが「100 + 200」であるのか、「300」であるのか、あるいは「値に300が入っている変数x」であるのかは関係ないことです。これが関数の動作の大前提となります。

では翻って、上記のIF文はどうか。

    IF(B = 0, "Bが0です", (A / B).ToString())

これをマトモに関数として評価すると、「B = 0かどうか（真偽値）」と「"Bが0です" という文字列」と「A / Bを計算して文字列にする（ToString）」の3つが、IFという関数に渡されることになります。
が、__それをバカ正直に実行すると、上記のケースではBは0なので、3つ目の引数を計算する段階で0除算が発生して例外が出ないとおかしい__ことになります。

つまり、VB.NETのIF関数は、実は関数としてはかなりイレギュラーな振る舞いをしているのです。

## ExcelのIF関数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552763/9d9a122a-fce3-f16d-a0c7-e399666171b0.png)
これもVB.NETと同じ動作でした。必要ない側の関数、呼ばれません。（本稿を書く前は違うと思ってた、申し訳ない）

## Excel VBAのIIF関数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552763/eb88d97a-fea4-7117-6aa1-0220b5fda748.png)

こちらは正しく「関数」なので、IIFの最初の引数の値がTrueになる場合でも、False側の式も評価されます。なので上記のように「絶対呼ばれないルート」でも、実行時に0除算エラーが発生します。

# つまり

これを覚えておけばOK

| - |IF(IIF)関数の条件部に該当しない式 |
|---|---|
|VB.NET IF関数 |評価されない |
|Excel IF関数 |評価されない |
|VBA IIF関数 |__評価される__ |


# 余談：短絡評価の話

当たり前の話ですが、

    A or B or C

の条件判断で、AがTrueであれば、その時点で上記の条件はTrueになります。つまりBやCの値がどうであろうと変わらず、それを判断する必要がないことになります。そこで、(言語|実行環境)によっては、上記のようなケースで、式全体が確定したら、不要な部分は評価を行わない（実行しない）ことがあります。これを__短絡評価__と呼びます。ただし、通常これが適用されるのは演算子に対してであり、関数の引数ではありません。

VB.NETのIF文はというと、.NET Frameworkの仕様上、C#（言語）との整合性をとる必要があり、C#を含むC系列の言語では所謂「三項演算子」で同じような表記をするため、そちらの動作にあわせたものと思います。Excelは知らん。

VB.NETの

    IF(A = B, C, D)

は、C系列の言語だと、

    A == B ? C : D

と記載します。こちらは関数ではなく演算子なので、短絡評価を適用できる、ということですね。

更に余談で、VB.NETには、 And とか、 Or という演算子がありますが、これらは__短絡評価はしない__仕様になっています。
かわりに、 AndAlso とか OrElse というのがあり、こちらは短絡評価をしてくれます。

すなわち、XがBoolean型だとして、

    True Or X

のときは、Xが評価されますが、

    True OrElse X

では、OrElseより前がTrueなので全体としてTrueになることが確定されるため、Xは評価されません。


このあたりの評価方式や考え方は、UiPathでのワークフロー構築にも当然役に立ちますので、覚えておいて損はないと思います！
Remdesivir drug development tracking

## Open data analysis

[Open-science-for-unexpected-discovery](https://qiita.com/karaage0703/items/0e24f332dcda7d7730b5)

[Heuristically-confidenced-semantic-drug-repositioning-without-data-for-quick-remedy(In early phase)](https://youtu.be/U1FFC35Shqs)

Virus-assembly-analysis-and-synthetic-cell-technology

Unobservable-microscopic-dynamics-simulation

## Simulation of pandemics

[Infection-control](https://youtu.be/gxAaO2rsdIs)

[Pre-discussed-pandemics](https://youtu.be/6Af6b_wyiwI)

[Time-series-infection-vizualization](https://youtu.be/FZBksVxMqsg)

## Corona-virus-culture & vaccine, antibody assay

[First-report-from-australia](https://youtu.be/Of91YVbYbgw)

## Whole-genome-sequencing

GridION-and-necessity-of-sequencing-performance

Transcriptome-analysis(or-prediction)-and-target-protein-determination

## Diagnosing corona-virus infection

[RT-PCR](https://www.cdc.gov/coronavirus/2019-ncov/lab/index.html)

## Basic-drug-engineering

[Drug-engineering](https://youtu.be/ya3AdrfKYzc)

## Main-protease-simulation

[Main-protease-simulation](https://youtu.be/Jt-tsKQ7leI)

## Docking-simulation-with-generative-modeling

[Drug-finding-to-antagonize-activity-site-with-generative-modeling](https://youtu.be/EVoZMRmtBkY)

Gao W, Coley CW. The Synthesizability of Molecules Proposed by Generative Models [published online ahead of print, 2020 Apr 6]. J Chem Inf Model. 2020;10.1021/acs.jcim.0c00174. doi:10.1021/acs.jcim.0c00174

## Drug-candidate-synthesis & drug-repositioning

[Drug-repositioning-research-for-covid-19](https://en.m.wikipedia.org/wiki/COVID-19_drug_repurposing_research)

[Remdesivir-synthesis](https://www.acsh.org/news/2020/03/26/problem-remdesivir-making-it-14665)


## Preclinical-trial

Spike-protein-injection(vaccination)-to-the-mice-and-survival-analysis

[Immune-system-type-identification-with-latent-time](https://youtu.be/Gb5rEY3LIVc)

Immunohistochemistry-for-easy-virus-localization-identification

[Linking-ct-or-xray-dataset-to-ihc-dataset-with-mice-for-transfer-learning-to-human](https://github.com/ieee8023/covid-chestxray-dataset)

[Systematic-xray-dataset-handling](https://qiita.com/Teru_3/items/80cecd138860fbd0c924)

Calculation-of-HED-and-lethal-dose

[Drug-administration-design](https://www.chemotherapy.or.jp/journal/jjc/050tokubetsu/050tokubetsu0074.pdf)

Optimization-of-drug-carrier-to-the-lung

## Clinical-trial

[Remdesivir-clinical-trial-information-platform](https://www.gilead.com/purpose/advancing-global-health/covid-19/remdesivir-clinical-trials)

Patient-blood-plasma-injection-or-remdesivir-decision(Effective-pattern-analysis)

### PhaseI

### PhaseII

### PhaseⅢ

[PhaseⅢ-clinical-trial-has-already-started](https://www.gilead.co.jp/-/media/japan/pdfs/press-releases/02-27-2020/remdesivir-covid-19-trials_200227.pdf?la=ja-jp&hash=F910B49F73E16D0AF34399978BD1CA96)

<time datetime=“2020-09-10”>

## Approval

[Pfizer’s-vaccine-approved-in-British](https://youtu.be/d-nQT5DHmNM)

<time datetime=“2020-12-02”>
jQuery内でAngularの関数を使用する

```typescript
...
hoge: String;
...

$('#hoge').on('change', function(event) {
     this.hoge = 'fugafuga';
  });
```
この場合、関数が共有されないか、エラーが発生します。
#解決策

<b>アロー関数</b>(```() => {}```)を使用します。

```typescript
...
hoge: String;
...

$('#hoge').on('change', (event) => {
     this.hoge = 'fugafuga';
  });
```
Kinx ライブラリ - Integer

# Integer

## はじめに

**「見た目は JavaScript、頭脳(中身)は Ruby、（安定感は AC/DC）」** でお届けしているスクリプト言語 [Kinx](https://github.com/Kray-G/kinx)。言語はライブラリが命。ということでライブラリの使い方編。 

> [リポジトリ(https://github.com/Kray-G/kinx)](https://github.com/Kray-G/kinx) のほうの説明を "Looks like JavaScript, feels like Ruby, and it is the script language fitting in C programmers." に変えてみた。意味的には例の名探偵のオマージュですが、英語の表現は違っていてオリジナルです。

今回は Integer です。

* 参考
    * 最初の動機 ... [スクリプト言語 KINX（ご紹介）](https://qiita.com/Kray-G/items/ca08b6fb40d15dd0ec76)
        * 個別記事へのリンクは全てここに集約してあります。
    * リポジトリ ... [https://github.com/Kray-G/kinx](https://github.com/Kray-G/kinx)
        * Pull Request 等お待ちしております。 

Integer オブジェクトに括り付いたメソッドは特殊メソッドで、整数値に直接作用させることができる。特殊メソッド、および特殊オブジェクトに関する詳細は [Kinx ライブラリ - String](https://qiita.com/Kray-G/items/54aea3dec37fe395d9df) を参照してください。

## Integer 特殊オブジェクト

Integer オブジェクトに対して関数定義する例は以下の通り。

```javascript
Integer.times100 = function(value) {
    return value * 100;
};
var val = 100.times100();
System.println(val);
```

実行してみよう。

```
10000
```

レシーバーが第 1 引数に来ます。

## Integer

### 組み込み特殊メソッド

|              メソッド              |                                                      意味                                                       |
| ---------------------------------- | --------------------------------------------------------------------------------------------------------------- |
| Integer.times(val, callback)       | i = 0 ～ (val - 1) の範囲として、`callback` があれば `callback(i)`　の結果で、無ければ i で配列を作成して返す。 |
| Integer.upto(val, max, callback)   | i = val ～ max の範囲で引数として `callback(i)` を呼ぶ。                                                        |
| Integer.downto(val, min, callback) | i = min ～ val の範囲で引数として `callback(i)` を呼ぶ。                                                        |
| Integer.toString(val, base)        | `val` を文字列に変換する。`base` は 10 と 16 のみサポート。                                                     |
| Integer.toDouble(val)              | `val` を Double に変換する。                                                                                    |

### Math オブジェクト・メソッド

Integer オブジェクトには Math オブジェクトと同じ特殊メソッドが存在する。詳細は以下を参照。

* [Kinx ライブラリ - Math](https://qiita.com/Kray-G/items/be251d0a3c0bcaa5ba79)

具体例で書くと、例えば以下のように書ける。

```javascript
var a = 2.pow(10);     // Math.pow(2, 10) と同じ  => 1024
var b = (-10).abs();   // Math.abs(-10)   と同じ  => 10
```

単項マイナス(`-`)は関数呼び出しより優先順位が低いため、カッコで括る必要があることに注意。

### 特殊オペレーター

#### 単項 `*` オペレーター

単項 `*` オペレーターを整数値に適用した場合、文字コードに対応した文字列（1 文字）を返す。

```javascript
var a = *97;  // => "a"
```

ちなみに逆変換（`*a`）は元に戻らない。文字列に対する単項 `*` オペレーターは配列になるため、上記例で `*a` とすると `[97]` と配列となることに注意。単独で文字コードを得るには、`a[0]` とする。

## おわりに

Integer に特殊メソッドがあることでグッと Ruby っぽい感じがしてますが気のせいですかね。`2.pow(10)` とか書けるのが結構感慨深いなー。

[ここ](https://docs.ruby-lang.org/ja/latest/class/Integer.html) 見ながら、今サポートしてないメソッドとかサポートしてみようかなー、と。

ではまた次回。
Laravel でファサードを禁止されたときにすること

## はじめに

Laravel はアーキテクチャの自由度が高い点でユニークなフレームワークに思う。

しかしチームで開発する上では、実装者によって書き方やアーキテクチャが変わりやすい点もある。

加えて MVC アーキテクチャだけではモデルやコントローラが太りやすい。

そんななか弊社で「DIに基づいた設計を行う」「ファーサードの使用は違法」とする「設計勧告案」が登場した。

でもあまり順守されていないように思うので、私の理解を書く。


## なぜ DI か

ファサードは簡単に使える。

> 自分で取り込んだり、設定したりする必要があり、長くて覚えにくいクラス名を使わずに、Laravelの機能を簡素で覚えやすい文法で使ってもらえます。その上に、PHPの動的メソッドのユニークな使用方法のおかげで、簡単にテストができます。
https://readouble.com/laravel/6.x/ja/facades.html#when-to-use-facades

DI なら同じテスタビリティで、
クラスの依存関係を明示して、「大きなコンストラクタの視覚的なフィードバック」を得られる。

> ファサードの一番の危険性は、クラスの責任範囲の暴走です。ファサードはとても簡単に使用でき依存注入も必要ないため、簡単にクラスが成長し続ける結果、一つのクラスで多くのファサードが使われます。依存注入を使用すればクラスが大きくなりすぎることに伴う、大きなコンストラクタの視覚的なフィードバックにより、この危険性は抑制されます。
https://readouble.com/laravel/6.x/ja/facades.html#facades-vs-dependency-injection

依存関係が増えてコンストラクタが大きくなったら、クラスをわけるサイン。
またはコンストラクタに小さく収まる単位にクラスの責任範囲をわけるとも言える。

### ヘルパは？

ヘルパもファサードと同じ利点・欠点を持ち、同様に禁止されると考える。


## どう使うか

ファサードとクラスなら公式に対応表があります。

https://laravel.com/docs/6.x/facades#facade-class-reference


### Carbon

`Illuminate\Support\DateFactory` が使えます。
`Carbon\Carbon`, `Carbon\CarbonImmutable` と異なり、デフォルトの実装を順守してどちらかを返します。

### ヘルパ

ソースコードを見て必要なクラスを探す。

https://github.com/laravel/framework/blob/6.x/src/Illuminate/Support/helpers.php
https://github.com/laravel/framework/blob/6.x/src/Illuminate/Foundation/helpers.php

~~わかりづらいのであとで対応表を書くかもしれない。~~
対応表を書きました。
[Laravel 6.x ヘルパ DI クラス一覧 - Qiita](https://qiita.com/mikankari/items/45bdfb52f0c941e45830)


## おわりに

DI を使うことでクラスの依存関係を明示し、適度な責任範囲を保てる。

統一的に使われれば、ビジネスロジックを集約でき、よりメンテナンスしやすくなると思われる。
Nuxt.js+Vuetify+Contentfulでブログを作ってみた。

## 概要

ブログサイトを作ってみました。

[chobilog](https://chobilog.netlify.com/)

Nuxt.jsでプロジェクトを作成。
UIコンポーネントはVuetifyとほんとにちょっとだけVuesaxを使いました。(併用できるのかの実験を兼ねて。結果できました。)
記事はContentfulにマークダウン記述で作成。
APIで取得してHTML変換して表示しています。
デプロイ先はNetlifyです。

### 完成品

PCトップ画面

![PC完成①](//images.ctfassets.net/2gx73djcqnhz/4wy8zwO1eQu1Ig26BKi8dP/602aa7a0cb70f7b1352baabe36feb614/26.jpg)

PC記事画面

![PC画面②](//images.ctfassets.net/2gx73djcqnhz/5OGa6Gz5PgSAmiTzAIHWVd/fb825e59d7ad860d57d5bc90c0741e7b/27.jpg)

スマホトップ画面

![スマホ画面①](//images.ctfassets.net/2gx73djcqnhz/uBi2MvJemH8b30s4rVjyM/75a49b3bdc9a0bab0a0039cd28de63aa/28.jpg)

スマホ記事画面

![スマホ画面②](//images.ctfassets.net/2gx73djcqnhz/5rFHRwrWvgbiFYHmW1eh87/0e4f269be9be0c09d7d63062684f3a39/29.jpg)


<a id="index2"></a>

## 動機

最近WordPressにハマってよくブログを書いているのですが、
あまりにも自分のためだけの備忘録的日記と化してしまっていました。笑
少しは誰かの役に立てるような情報を僕なりに頑張って発信するブログを別で作りたいなと思い作りました。(未経験エンジニアの情報なんて役に立たないだろとかそういう突込みはしないでください。。。笑)

<a id="index3"></a>

## 学び

ブログ作成を通じて沢山のことを学ぶことができました。
- Vue.jsの基礎(データバインディングも初めて実装&理解)
- Nuxt.jsの基礎(SSR)
- Markdown記法(markdownitの実装)
- Font Awesomeの実装
- Vuetifyの実装(VUesaxとの併用)
- 公式ドキュメント(英文でも逃げずに)を読む大切さ
- ブログデザイン(WordPressのテーマとかよくできているなと思いました。)
- ESLint便利だけどたまに邪魔になる(初心者だからですきっと。。。)
- CSS設計(楽で使いがちだったインライン記述をやめる。)
- Flexboxの利用

<a id="index4"></a>

## おわりに

引き続きこのブログサイトは記事書きながら、追加・微修正していく予定です。

また、作る過程は僕の日記的ブログに書いてますので省きました。
気になる！って方はぜひ覗いてみてください。

[個人ブログ](http://chobimusic.com/)

次はLaravel+Vue.jsでポートフォリオを作りたいなと思います。
Vue.js最初は難しかったけど今とても楽しい◎
初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）NameSpace 編

# 背景
個人的にインフラの知識以上にこれからのアプリケーションが動く環境を作ってデプロイしたりしてこれからの知識を身に着けたい。そしてより一層、自分の知識のアップデートをしたいと思いました。

その中でこの本に出会い、これから少しずつやったことを残し、未来の自分への手紙としてもあり、見つめ直せればと思いました。

# 引用や参考と今回の自分の勉強用の書籍の紹介
[技術評論社『Kubernetes実践入門』のサンプルコード](https://github.com/kubernetes-practical-guide/examples)
[Kubernetes実践入門 プロダクションレディなコンテナ＆アプリケーションの作り方](https://gihyo.jp/book/2019/978-4-297-10438-2)
![](http://image.gihyo.co.jp/assets/images/cover/2019/9784297104382.jpg)


# 実際の学びについて

書籍を読みながら、章ごとに少しずつ進めていきたいと思います。
GitHub のソースコードも使いながら学んで行きたいと思います。

## 勉強開始

ここから namespace を学んでいきます。

- https://github.com/kubernetes-practical-guide/examples/tree/master/ch1.3.1

```yaml:my-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: my-namespace #オブジェクト名 (1)
```

## コマンド郡
### namespace を検索 
```
$ kubectl get ns
NAME              STATUS   AGE
default           Active   25d
docker            Active   25d
kube-node-lease   Active   25d
kube-public       Active   25d
kube-system       Active   25d
```

### NameSpace のマニュフェストファイルを適用する
```
$ kubectl apply -f my-namespace.yaml
namespace/my-namespace created
```

### namespace を検索 

```
$ kubectl get ns
NAME              STATUS   AGE
default           Active   25d
docker            Active   25d
kube-node-lease   Active   25d
kube-public       Active   25d
kube-system       Active   25d
my-namespace      Active   6s
```

指定した Namespace が作成されることを確認できた
【Node.js】複数のファイルパスをオブジェクトでの階層表現に変換する

# 経緯
Node.jsのfsを使って特定のディレクトリの中身をファイルパスにて取得した際に、ディレクトリの階層と互換性のあるオブジェクトに変換したかった。

# 結論
```index.js
const data = [
  '/public/aaa/1.file',
  '/public/aaa/2.file',
  '/public/bbb/1.file',
  '/public/ccc/1.file',
  '/public/ccc/2.file',
  '/public/ccc/3.file',
  '/public/ddd/1.file'
];

const output = {};
let current;

for (const path of data) {
    current = output;
    for (const segment of path.split('/')) {
        if (segment !== '') {
            if (!(segment in current)) {
                current[segment] = {};
            }
            current = current[segment];
        }
    }
}

console.log(output);

/* 実行結果
{ public:
   { 
     aaa: { '1.file': {}, '2.file': {} },
     bbb: { '1.file': {} },
     ccc: { '1.file': {}, '2.file': {}, '3.file': {} },
     ddd: { '1.file': {} } 
   } 
}
*/
```
あとは取得した結果から

子要素に値が入っていたらディレクトリ
子要素に値が入っていなかったらファイル

と認識して分岐させれば色々使えると思う。
Pythonで毎日AtCoder #29

### はじめに
[前回](https://qiita.com/taxfree_python/items/74513681aa0284050ddb)
おすすめの問題があったらコメントやtwitterでリプ飛して欲しいです。
### #29
[問題](https://atcoder.jp/contests/abc158/tasks/abc158_d)

**考えたこと**
最初は普通に実装(reverseマシマシ)していましたが、reverseはコストが高いのでうまく処理してあげる必要がある。文字を追加するのは先端か末尾の二つなのでdequeを使うことができる。また、逐一reverseしなくても前後のラベルを作ってreverseのたびに反転させればよい。

```python
from collections import deque

s = deque(input())
q = int(input())
query = [input().split() for _ in range(q)]

reverse = False #前後を判定する
for i in query:
    if len(i) == 1:
        if reverse:
            reverse = False
        else:
            reverse = True
    else:
        if reverse:
            if i[1] == '1':
                s.append(i[2])
            else:
                s.appendleft(i[2]) #先端にappend
        else:
            if i[1] == '1':
                s.appendleft(i[2]) #先端にappend
            else:
                s.append(i[2])
if reverse: #reverseが有効ならsを逆にしなければならない
    s = reversed(s)
    s = ''.join(s)
    print(s)
else:
    s = ''.join(s)
    print(s)
```
reverseの真偽はもっとうまく処理できると思います。

### まとめ
文字列の操作は遅いことを学びました。今回の様に操作する場所が決っている問題は、strよりもlistとかdequeを使った方が良いらしい。ではまた。おやすみなさい。
【Pyro】確率的プログラミング言語Pyroによる統計モデリング① ~Pyroとは~

# はじめに
本シリーズでは，確率的プログラミング言語Pyroを用いて統計モデリングを行う方法について，いくつかの例題を交えながら紹介していきます．
例題には，書籍「[実践Data Scienceシリーズ RとStanではじめるベイズ統計モデリングによるデータ分析入門](https://www.amazon.co.jp/dp/B07WFD5RFS)」(KS情報科学専門書)に登場する例題を採用します．この本では題名の通りRとStanを用いてベイズモデリングを行っていますが，本シリーズでは同じ例題をPyroを用いて解いていきたいと思います．コーディングを通じて統計モデリングへの理解を深めるとともに，実データにもPyroを用いた柔軟なモデリングを適用できるようになることを目的として執筆します．統計モデリングそのものについての詳しい解説は書籍や他の記事に譲り，本記事では実装をメインに書きます．
読者としては．以下に当てはまるような人を想定しています．

- Pythonの基本的な使い方がわかる人
- ベイズ統計モデリングの基本を理解している人
- 柔軟かつスケーラブルな統計モデリングを行いたい人
- Pytorchユーザ

本記事はそのシリーズの第1回として，Pyroの概要および次回以降のモデリングを実装していく上での基本的なメソッドを説明していきます．

# Pyroとは
**Pyro** は[Uber AI Labs](https://www.uber.com/jp/ja/uberai/)が開発したPythonで書かれた確率的プログラミング言語の一つです． バックエンドにはPytorchを採用しており，もちろんGPUを利用できます．[公式サイト](https://pyro.ai/)に書いてあることを意訳すると，Pyroを使う利点は以下の通りです．
> - 汎用性: あらゆる計算可能な確率分布を表現できる．
> - スケーラビリイティ: (並列計算を用いることで)大きなデータセットにも対応可能．
> - 最小限: コードの複雑性を可能な限り落としているので挙動を把握しやすい(?)
> - 柔軟性: 処理の自動化もできるし，カスタムもできる．  

特に，GPUを利用可能なフレームワークの特長として，大きなデータセットに対しても実用的な時間で計算できるという利点(=スケーラビリティー)は注目すべきポイントです．他にGPUを利用できる確率的プログラミング言語にはEdward2などがありますが，PytorchユーザにはPyroの方が使いやすいでしょう．

# Pyroのインストール
公式リファレンスにある通り，pipを用いて以下のコマンドでインストールできます．

```shell
pip install pyro-ppl
```

# Pyroの基本メソッド
Pyroには統計モデリングを実装するための根幹となるメソッドが用意されていますが，その中で最も基本的な`pyro.sample`および`pyro.plate`について本稿で紹介します．これらは，確率分布からのサンプリングを容易に記述できるメソッドです．
## 1. 確率分布に従うサンプリング`pyro.sample`
統計モデリングのフレームワークとして欠かせないのが，確率分布に従うサンプリングです． Pyroでは多くの確率分布(正規分布，二項分布，ポアソン分布，...)が用意されており，
`pyro.sample(<識別名>, <確率分布>)`
という記述により指定した確率分布から標本を抽出することができます．
以下のコードは，標準正規分布から10万個のi.i.dなサンプルを抽出し，確認のために抽出した標本の分布を可視化するものです．

```python
import matplotlib.pyplot as plt
import pyro
import pyro.distributions as dist # distにはPyroで利用できる確率分布が実装されている

# for文でサンプリングを実行
samples = []
for _ in range(100000):
    # 標準正規分布から1つのサンプルを抽出
    a_sample = pyro.sample("a_sample", dist.Normal(0, 1)) # 標準正規分布より
    samples.append(a_sample)

# 可視化
plt.hist(samples, bins=50)
plt.title("標準正規分布からの標本分布(n=10万)", fontsize=16)
```
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304444/6fb3ebcd-91c4-a269-f6a9-841b61ccfc09.png)
適切に標準正規分布からサンプリングされていることが確認できます．
これでも良いのですが，Pyroではよりシンプルな書き方により同様の標本を得ることができます．

## 2. ベクトルとして取得することを宣言`pyro.plate`
統計モデリングを行うにあたっては特定の確率分布から多数の独立なサンプルを抽出することは非常に頻繁に行われます．`1`のようにfor文で記述すると記述・処理の両面において非効率です．
そこで便利なのが，`pyro.plate`です．
`pyro.plate(<コンテクスト名>, <サンプルサイズ>)`
によって宣言されたコンテクスト内でpyro.sampleによるサンプリングを行うと，ベクトルとしてサンプルを得られます．以下はその実装です．

```python
# pyro.plateを用いてベクトルとして取得する場合
with pyro.plate("plate", size=100000):
    samples = pyro.sample("samples", dist.Normal(0, 1))

plt.hist(samples, bins=50)
plt.title("標準正規分布からサンプリングした標本分布(n=10万)", fontsize=16)
```
結果は上図と同様になるはずです．

`pyro.sample`,`pyro.plate`を用いることにより，確率分布からサンプリングを行うことができるようになりました．統計モデリングを行うためには他にも不可欠な機能がありますが，それらは次回以降に実例を交えながら随時説明してまいります．

## まとめ
本稿では，主に以下の2つの点についての紹介を行いました．
- Pyroの概要や利点
- 確率分布からサンプリングを行う`pyro.sample`，`pyro.plate`
冒頭でも述べた通り，次回からは書籍「[実践Data Scienceシリーズ RとStanではじめるベイズ統計モデリングによるデータ分析入門](https://www.amazon.co.jp/dp/B07WFD5RFS)」(KS情報科学専門書)に準拠し，書籍で紹介されている例題をPyroで再現する形で進めていきます．
次回は第3部第2章「単回帰モデル」を扱います．
コロナ対策エンジニア～1日30分の在宅勤務・テレワークのオンライン勉強会～（2020年4月）

先日、[「コロナ対策エンジニア～ みんなでCOVID-19ウイルスと戦おう～」](https://qiita.com/gomasa/items/a5565eb2d4e659978330)
という記事を記載させて頂きましたが、明日からその勉強会が始まります。

[connpass](https://connpass.com/)の[「コロナ対策エンジニア」](https://power-covid19.connpass.com/)のグループで参加者募集していますが、
オンライン開催ですので、誰でも参加可能です。

毎回12時15分からの30分間開催され、お昼休憩時間に見ることが可能です。

#オンライン勉強会の内容について
勉強会の最新の内容は以下の通りです。
SlackやLineなども勉強会の対象となりました。

■2020年4月08日（水） 12:15 - 12:45
　[Microsoft Teamsを使った在宅勤務Tips](https://power-covid19.connpass.com/event/172150/)

■ 2020年4月09日（木）12:15 - 12:45
　[30分でランチ勉強！完全初心者向け、今日から使えるSlackの使い方ガイド](https://power-covid19.connpass.com/event/172523/)

■2020年4月10日（金） 12:15 - 12:45
　[ZOOMを使ったリモートワーク技](https://power-covid19.connpass.com/event/172165/)

■2020年4月13日（月） 12:15 - 12:45
　[Microsoft Power Appsでリモート出退勤管理アプリを作る](https://power-covid19.connpass.com/event/172167/)

■2020年4月15日（水） 12:15 - 12:45
 [Microsoft Power Automateで健康状態報告フローを作る](https://power-covid19.connpass.com/event/172166/)

■2020年4月16日（木） 12:15 - 12:45
 [30分でランチ勉強！みんなが楽々使えるビジネス版 LINE で、テレワークでも楽しくコミュケーション](https://power-covid19.connpass.com/event/172645/)


#私の考える勉強会の意義について
安倍首相が緊急事態宣言をされて、これまで以上に人との接触を避ける必要があります。
当然、テレワークを活用する職場が更に増えることは確実です。
ただ、多くの人がテレワークに戸惑いや不便さを感じているのが現実であり、
テレワークに関するツールの使い方が分からず苦労している方もいると思います。

そんな中で、ツールの活用方法を吸収できる勉強会は非常に意味があると感じます。
比較的技術に明るいエンジニアである私たちが、勉強会に参加して知識を蓄え、
情報展開することで、助かる人がいるかもしれません。

情報展開する人が増えれば増えるほど、情報にたどり着く人も増えます。
結果として、多くの人が、テレワークを通じて
不便を感じる状態が緩和できればと考えています。

私は、こういった状況では、
「できるだけ、普段の活動状況を継続する」
ことが重要だと思っています。
テレワークをはじめとするIT技術を使って、
自宅でも会社に出社するのと同じ状況を作り出す。

お客様ともテレビ会議等を実施して、サポートを継続する。
今までのサービスをできるだけ持続する工夫をする。
その為に知恵を絞る。
それが、大切だと思います。

その為には自分たちや自分たちの会社だけが、それを実現するのではなく、
社会全体がそういった状況にならなければいけないと思います。

この勉強会が、会社や個人の利益ではなく、
社会を持続するための助け合いの活動に繋がれば嬉しいと思います。
MACでARM系マイコンを開発する方法1

# Introduction
現在においても組み込みソフトウェア開発はWindowsで行うのが定石ではないだろうか。
開発行為において環境がWindowsしか想定していないというのは枚挙に暇がない。
組み込み系ではさらにその傾向が顕著と言える。

故にMacで組み込みソフトウェア開発と言えば、それはすなわち苦行を意味する。
トライ＆エラーの結果行き着いた物を紹介する。

## 方針
1．IDEであること。
　　GCCをmakeして・・・とか、OpenOCDで書き込んで・・・とか、しんどい。
　　開発環境を作るのが趣味ならばあえて止めはしないが、苦行である。
　　無料ではないが、金で時間を買う。
2．デバッガが使えること
　　仕事ではリアルタイムトレースが可能になりつつある時代である。
　　こんな時代にUARTを使ってチマチマやっていたら発狂する。

## 前提条件
PC環境　　　　　macOS Catalina
対象マイコン　　ARM系(STM32)
開発言語　　　　C/C++
費用　　　　　　なるべく安く
デバッガ　　　　通常のICEデバッグ相当（ブレークポイント・メモリ/レジスタ操作）

## 当方環境
開発環境　　　CrossWorks for ARM([Rowley Assosiates](https://www.rowley.co.uk/arm/index.htm))
評価マイコン　STM32F411(Nucleo-F411RE)
↑NucleoボードはSWEデバッガ相当の回路が内蔵されているため便利である。

## CrossWorks for ARM入手方法
直販で購入可能である。
英語でやりとりが厳しい人は→国内代理店[ソリトンウェーブ](http://solitonwave.shop)

以降は直販前提で記述

# ライセンス
・Shared Developer ($2250)
・Named Developer ($1500)
・Educational Workstation License ($300)
・Personal Non-Commercial License ($150)
　個人で非商用であればコレ一択である。

#購入手順
1. Rowley Associatesのトップ画面から[購入画面](https://sites.fastspring.com/rowley/product/crossworksforarm)にいく。
![buying.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615272/d3966497-ae0e-9970-4cae-1d144639fb04.png)

2. Persolal~を選択し文中に[click hear]をたたくと、こんな感じの絵が出てくる。
![スクリーンショット 2020-04-07 21.20.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615272/12f2e6a8-25e1-6884-ca9e-7a608cb602ba.png)

3. [2]はいわゆる誓約書である。コレを印刷し、署名して、スキャンしたデータをメール添付して送信する。
　　送信先：enquiries@rowley.co.uk

4. [3]が完了したら[1]のウェブサイトから購入手続きを行う。

# Cross Connectって何よ
早い話がJTAG/SWDデバッガ。
[これ](https://www.olimex.com/Products/ARM/JTAG/ARM-USB-OCD/)とかなりそっくり。（微妙に違うけど）
多分OlimexのOEM品と思われる。

マイコンを部品として買って、基板作って実装して・・・と言うことをやる人は買って損はない。
最近のマイコンボードはJTAG/SWDデバッガは元々オンボードの場合が多いので、基板作らない人には無用の長物。
CrossWorksはJ-link等に互換性あるので、これらを持っている人には必要はない。

#トラブル
2019/11　CrossWorks for ARMとCrossConnectをセットで買った。
2019/12　3週間ほど経ってもCrossConnectが送られてこない。
2019/12　sales@rowley.co.uk にメールで「まだ届かねーよ？送った？」と言う意味のメールを送る。
2019/12　メール回答「まだ送ってなかった。ゴメン。送るから住所教えて」とHenry Beck（担当者かな）から回答
2020/1　　現品到着

もしトライされて、ブツが届かないときは問い合わせてみましょう。
機械学習で避けて通れない（と思っている）ベイズの定理を頑張って理解しようとした

#はじめに

　機械学習をしっかりと理解するうえでは、避けて通れない（と思っている）ベイズの定理について、私が理解したものをまとめます。
　表現や定義に誤りがありましたら、ご指摘頂けると幸甚です。

　今回の要点

+ 客観確率と主観確率を理解する
+ ベイズの定理を理解する
+ 機械学習とベイズ統計学の関係
+ ベイズの定理をもう一例で理解する




##客観確率と主観確率を理解する

　ベイズの定理について進める前に、確率について振り返ります。確率には、***客観確率と主観確率***があります。
　客観確率とは、**「Ｑ：０～９までの数字が書かれたカード１０枚から１枚引いたときに０の数字が出る確率は？Ａ：$\frac {1}{10}$」**といったものです。つまり客観的に出る確率が決まっている確率になります。

　一方、主観確率とは、**「Ｑ：電車に乗っているときに、隣に座っている人が風邪を引いている確率は？」**というような確率を指します。極端な例となりました。しかし、これが主観的な確率になります。
　今回の例では、「風邪を引いている」か「風邪を引いていない」の２通り考えられます。初めは何も情報がないため、50％と前提を置きます。これを**事前確率（prior probability）**と呼びます。
　一方、隣の人がマスクを着けていたことが分かりましたので、70％と前提を変えたとします。これを、**事後確率（posterior probability）**と呼びます。
　そして、最後に実際に隣の人に聞いてみた結果、風邪ではないという事実になりました。
　本人の否定により、確率を６０％に設定しなおします。ここでは、質問を行ったのでその事前が７０％、事後確率が６０％となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567823/eb40d18f-b7e1-6994-a879-8fd763798c1c.png)


　たとえ話が長くなりましたが、情報が入るたびに確率を更新していく考え方がベイズ統計学にあります。これは、所謂学習能力があることになるため、機械学習の考え方にリンクします。

##ベイズの定理とは

　さて、ベイズの定理についてです。以下の式をベイズの定理と呼びます。

```math
P(X|Y) = \frac{P(Y|X)P(X)}{P(Y)}\\

\\\\

P(X|Y) :事象Yが起こった状況下で事象Xが起こる確率（事後確率）\\
P(X)：事象Xが起こる確率（事前確率）\\
P(Y)：事象Yが起こる確率\\
P(Y|X):事象Xが起こった状況下で事象Yが起こる確率\\
```

なんだかよくわからないので、先ほどの例で説明します。

```math

事後確率　＝　事前確率　×　\frac {隣の人が風邪の場合、マスクをしている確率} {一般的にマスクをしている確率}

```
という式で表すことになります。



##機械学習とベイズ統計学の関係
　
　機械学習ではコンピュータを用いて膨大なデータから法則性を見つけさせます。そして、それを利用して将来を予測します。
　そこでは、**新しい傾向や特徴がみられたら法則を学習させて新しい予測モデルとします。この新しい前提でモデルを作る考え方にベイズ統計学が適用されます。**

　機械学習の応用範囲は非常に幅広く使われています。
　特に、マーケティングの領域においては人々の行動や考え方といった定量的に議論することが（物理現象などを扱う領域よりも）相対的に難しいです。
　従って、予測するモデルには柔軟に最新の情報を反映させていくことが求められます。この時に、**事前確率を事後確率に置き換えて分析する柔軟な分析が役に立ちます**。

　

##ベイズの定理をもう一例で理解する

　最後にもう一例でベイズの定理の理解を深めたいと思います。コロナ関連で非常にタイムリーな例になります。おそらく実際のコロナウィルスでも同様のことが検討されているのでしょう。

問題例：日本人の0.01%が罹患している病気について考えます。検査は実際に病気に罹患している人が陽性と判定される確率が95%、逆に罹患していない人が陰性と判定される確率は80%となっています。さて、 ある人がこの病気の検査を受けて陽性という判定を受けた時、本当にこの病気に罹患している確率はいくらでしょうか。

という問題です。検査で陽性となる事象を$A$、陰性となる事象を$A^c$(余事象)、実際に病気に罹患している事象を$B1$、罹患していない事象を$B2$とします。すると、求めたい確率は$P(B1|A)$となります。
問題例からそれぞれの確率は下記になります。

+ 病気に罹患している確率：$P(B1) = 0.0001$
+ 病気に罹患していない確率：$P(B2) = 1-0.0001 = 0.9999$
+ 実際に罹患している人が検査で陽性となる確率：$P(A|B1) = 0.95$
+ 実際に罹患していない人が検査で陰性となる確率：$P(A^c|B2)=0.80$
+ 実際に罹患していない人が検査で陽性となる確率：$P(A|B2)=1-0.8=0.20$

さて、ベイズの定理に当てはめるとこうなります。



```math
\begin{align}
P(B1|A) &= \frac{P(A|B1)P(B1)}{P(B1)P(A|B1)+P(B2)P(A|B2)}\\
& =\frac{0.0001×0.95}{0.0001×0.95+0.9999×0.20}\\
& = 0.000475 = 0.0475％
\end{align}

```
となります。従って、これだけ確率が少ないことから陽性が出ても基本的に気を病む必要はないのでしょう。上記の$P(A|B2)$のような罹患していない人が陽性となることを偽陽性（ぎようせい）と呼びます。しかし、**検査を受ける人は通常その病気特有の症状がある人であることが多いため、実際の確率はもっと高くなると思います。前提が大事になることが分かります。**

　また、**日本人のうち0.01％しか罹患していない前提である**ことが大事になります。つまり、この前提は罹患者は減りも増えもしないということです。
　今のコロナウイルスのように、罹患者が増え続けている状況ではこの考え方を扱うのは注意する必要があることが分かります。主観確率を扱うことの難しさがここにあるのではと私は思いました。





#おわりに
　
　ベイズ統計学の入り口であるベイズの定理について学びました。考え方含め、具体例を丁寧に理解しようとしないと説明が難しい内容だと思いました。
　引き続き、理解を深めたいと思います。


今回参考にさせて頂いたＵＲＬです。
https://bellcurve.jp/statistics/course/#step01-010
WindowsからGCPにSSH接続する

GCPのCompute EngineにSSH接続する方法です。AWSのEC2インスタンスにSSH接続するよりも、複雑でした。
# 前提条件
・WSLやcygwinにより、Linux環境を使うことができる
・gcloudがインストールされている。
# SSH認証鍵の作成
 Linuxであれば以下のコマンドを用いることでSSHの公開鍵・秘密鍵のペアを作成することができる。作成する場所はローカルのPCでも、GCEインスタンス上でもどちらでもよい。

```console
$ ssh-keygen -t rsa -f ~/.ssh/your-key-name -C your-name
Enter passphrase (empty for no passphrase):    #Input passphrase
Enter same passphrase again: #Input passphrase again

```
~/.sshフォルダ内にyour-key-name(秘密鍵)とyour-key-name.pub(公開鍵)が作成される

# OS ログイン機能の有効化
GCPのメタデータページ([こちら](https://cloud.google.com/compute/docs/instances/managing-instance-access?hl=ja)を参照)に移動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323398/e9735695-aae8-ceb8-79cd-be9aa60cc6aa.png)

画像のようにメタデータが存在していない場合は「メタデータを追加」をクリックし、
キー「enable-oslogin」の値を「True」として入力、保存する。保存後は以下のように表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323398/40cc15e9-ef00-8b6e-0c3d-fe262c4e6bec.png)
OSログインが有効化された。

# 作成した公開鍵を自分のアカウントに追加する
os-loginを有効化したことにより、作成した公開鍵を自分のアカウントに追加することができる。ローカルPCで以下のコマンドを入力すると追加される。

```console
$ gcloud compute os-login ssh-keys add --key-file ~\.ssh\your-key-name.pub
```

以上でローカルPCから、GCEにSSH接続する準備が整った。

#　認証情報の確認
接続を行う前に認証情報を確認するために、以下のコマンドを入力する

```console
$ gcloud compute os-login describe-profile
```
「username」がSSH接続の再使用するユーザー名

# SSH接続を行う
以下のコマンドを入力する

```console
$ ssh -i ~\.ssh\your-key-name username@your-ip-host
Enter passphrase for key 'C:\Users\user\.ssh\your-key-name':
```

```console
$ ssh -i ~\.ssh\your-key-name username@your-ip-host
Enter passphrase for key 'C:\Users\user\.ssh\your-key-name':
Linux api-server 4.9.0-12-amd64 #1 SMP Debian 4.9.210-1 (2020-01-20) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
```
接続完了!!

#　終わりに

~/.sshフォルダ内に「config」という名前のファイルを作成し、接続する際の必要情報を記入しておくことで、ipアドレスや秘密鍵のパスといった情報をいちいち入力しないでよくなるため楽になる。
例:

```
Host hogehoge
  HostName your-ip-address
  User your-username
  IdentityFile ~/.ssh/your-key-name
```
と、configファイルに追記した場合、

```console
$ ssh hogehoge
```
で接続が可能になる。
googleスプレッドシートのPDF化を楽にするブックマークレット

googleスプレッドシートをPDF化するときの自分用設定をブックマークレット化してみました。

```javascript
javascript:(function(){const current = location.href;if (current.match(/^.+docs\.google\.com\/spreadsheets\/d\//)) {const m = current.match(/^.+\/d\/(.+)\/edit#gid=(.+)$/);const printUrl = `https://docs.google.com/spreadsheets/d/${m[1]}/export?exportFormat=pdf&format=pdf&size=A4&portrait=false&sheetnames=false&printtitle=false&fitw=true&pagenumbers=false&gridlines=false&top_margin=0.75&bottom_margin=0.75&left_margin=0.25&right_margin=0.25&horizontal_alignment=LEFT&vertical_alignment=TOP&fzr=false&gid=${m[2]}`;window.open(printUrl);}})()
```

下記のように各種パラメータを設定しています。

+ `exportFormat=pdf` `format=pdf` PDF形式
+ `size=A4` A4サイズ
+ `portrait=false` 横向き印刷
+ `sheetnames=false` シート名を印刷しない
+ `printtitle=false` タイトルを印刷しない
+ `fitw=true` 幅に揃える
+ `pagenumbers=false` ページ番号を表示しない
+ `gridlines=false` グリッド線を印刷しない
+ `top_margin=0.75` `bottom_margin=0.75` 上下余白0.75インチ（プリセットの余白「狭」）
+ `left_margin=0.25` `right_margin=0.25`左右余白0.25インチ（プリセットの余白「狭」）
+ `horizontal_alignment=LEFT` `vertical_alignment=TOP` 左上寄せ
+ `fzr=false` 固定行を表示しない



## コード
```javascript
(function(){
    const current = location.href;
    if (current.match(/^.+docs\.google\.com\/spreadsheets\/d\//)) {
        const m = current.match(/^.+\/d\/(.+)\/edit#gid=(.+)$/);
        const printUrl = `https://docs.google.com/spreadsheets/d/${m[1]}/export?exportFormat=pdf&format=pdf&size=A4&portrait=false&sheetnames=false&printtitle=false&fitw=true&pagenumbers=false&gridlines=false&top_margin=0.75&bottom_margin=0.75&left_margin=0.25&right_margin=0.25&horizontal_alignment=LEFT&vertical_alignment=TOP&fzr=false&gid=${m[2]}`;
        window.open(printUrl);
    }
})()
```
サーバーレスライブラリbrefを使い、素のPHPでHello world

ちょっと素のPHPが欲しいときがあったら、以下のようにさくっとデプロイできます。


```bash
# プロジェクト作成 https://github.com/umihico/bref-demo/commit/0269a62
$ mkdir bref-demo
$ cd bref-demo
$ serverless create --template aws-nodejs --name bref-demo
# brefインストール https://github.com/umihico/bref-demo/commit/2143b4e
$ composer require bref/bref
```

本命のPHPファイルを追加し、serverless.ymlを設定します。[0e8c61d](https://github.com/umihico/bref-demo/commit/0e8c61d)

```diff:index.php
+ <?php
+ 
+ require __DIR__ . '/vendor/autoload.php';
+ 
+ lambda(function ($event) {
+     return [
+         'headers' => [
+             'Content-Type' => 'text/html'
+         ],
+         'statusCode' => 200,
+         'body' => '<html><!doctype html><head></head><body><h1>Go Serverless v1.0! Your function executed successfully!</h1></html>',
+     ];
+ });
```

```diff:serverless.yml
 provider:
   name: aws
-  runtime: nodejs12.x
+  runtime: provided
+
+plugins:
+  - ./vendor/bref/bref

 functions:
   hello:
-    handler: handler.hello
-#    The following are a few example events you can configure
-#    NOTE: Please make sure to change your handler code to work with those events
-#    Check the event documentation for details
-#    events:
-#      - http:
-#          path: users/create
-#          method: get
+    handler: index.php
+    timeout: 28
+    layers:
+      - ${bref:layer.php-73-fpm}
+    events:
+      - http: 'ANY /'
+      - http: 'ANY /{proxy+}'
 #      - websocket: $connect
```

`serverless deploy`で発行されたURLにアクセスしてみると、
![スクリーンショット 2020-04-06 13.55.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256466/260e4820-e375-2973-dd88-ada166d0da9a.png)
ちゃんとHTMLが描写されていますね。jsonを返したい場合はこうです。[66df3a](https://github.com/umihico/bref-demo/commit/66df3a)

```diff
 
 lambda(function ($event) {
-    return [
-        'headers' => [
-            'Content-Type' => 'text/html'
-        ],
-        'statusCode' => 200,
-        'body' => '<html><!doctype html><head></head><body><h1>Go Serverless v1.0! Your function executed successfully!</h1></html>',
-    ];
+   return [
+       'headers' => [
+           'Content-Type' => "application/json",
+       ],
+       'statusCode' => 200,
+       'body' => json_encode(['json_key' => 'json_value']),
+   ];
 });

```

参考

- https://github.com/brefphp/bref/blob/master/docs/runtimes/function.md
- https://500.keboola.com/php-serverless-application-in-aws-part-1-4dd0ad1fd69b
Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 課題作成(マークシート方式)

関連記事は[**「Microsoft Teams の授業での活用」**](https://qiita.com/hisaho/items/12837a169bd6f1d90d5c)をご参照ください。

# はじめに

本記事では、Microsoft Teams を活用して授業を実施するための方法を解説いたします。
今回は **「課題の作成(マークシート方式)」**について説明します。

# Microsoft Foams を使ったマークシート方式のテストの作成

- Teams の **[課題]** をクリックし、**[作成]** から**[クイズ]**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/76756724-1a2c-f092-879f-bf1de224ccc8.png)
- **[新しいフォーム]**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/4122eac2-147a-3085-288d-e2220da9efa7.png)
- **[新しいクイズ]**　をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/3b59745e-fbe3-d577-394f-be334cb50a59.png)
- **[無題のクイズ]**をクリックし、作成するクイズに名前を付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/f4b9e06a-7aaa-a5ba-7c7b-ab103b779f1b.png)
- [航空大学校の入学試験の過去問題](http://www.kouku-dai.ac.jp/nyuusi/kakomonannnai.htm)を参照し、テストを作っていきたいと思います。**[新規追加]**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/bdc7d685-14a0-f983-4ec4-510a0817fb62.png)
- マークシート方式のテストなので、**[選択肢]**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/64d46852-d4ed-c8b8-a070-c504c1d4dec1.png)
- **[質問]**に問題を入れ、選択肢に回答を入れていきます。正解の選択肢にチェックを入れ、点数を設定し、必須をONにします。次の質問を作成するときには**[新規作成]**をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/d2e46c1f-4708-537d-6bc8-ae04717b85bd.png)
- このように画像を入れることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/bd42eed1-9f7d-e8eb-191a-25a59879cb34.png)
- 問題がすべて作成できてたら、Teamsに戻ります。
- Teams の **[課題]** をクリックし、**[作成]** から**[クイズ]**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/76756724-1a2c-f092-879f-bf1de224ccc8.png)
- 先ほど作成したフォームが現れますので、フォームを選択して**[次へ]**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/71cd6c27-e48e-31a9-8a5d-3df19bc741e0.png)
- **[割り当てるユーザー]**、**[提出期日]** を設定したら、**[割り当てる]**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/fb928fd2-d8f9-7e7f-494d-52686f7ddc63.png)
- これで、マークシート方式のテストの作成は完了です。
[Android] 母艦からコマンドラインでパッケージを管理する

最近パッケージの管理方法が変わったみたいなのでまとめてみた。

# 事前準備(端末のシェルへのアクセス

## `adb`のインストール

Arch Linuxなら`android-tools`をインストールする。

```shell
$ sudo pacman -S android-tools
```

## 端末を開発者モードにする

例えば[こちら](https://qiita.com/knakamigawa/items/5b8bd2793920b517bf25)を参照

## 母艦からシェルにアクセスする

[公式ドキュメント](https://developer.android.com/studio/command-line/adb?hl=JA)を参照。
AndroidデバイスをUSBでコンピュータに接続し以下のコマンドを実行する。
途中で端末に「リモートアクセスを許可しますか?」と表示されるためOKを押す必要がある。

```shell
$ adb devices
$ # 接続されている端末のシリアル番号が表示される
$ adb -s シリアル番号 shell
```

もしくは以下のように直接コマンドを実行することもできる。(下の例では使用できるコマンドの一覧を表示)

```shell
$ adb -s シリアル番号 shell ls /system/bin
```

# パッケージマネージャ

`pm` および `cmd package`コマンドを使うことになります。


# 例

## Google Playからインストールしたパッケージの一覧を取得する

```shell
adb -s シリアル番号 shell cmd package list packages -i | sed -ne '/installer=com\.android\.vending/p' | sed -e 's/^package:\(.*\)  installer=.*$/\1/'
```

## パッケージをインストールさせるためにGoogle Playを開く

```shell
adb -s シリアル番号 shell am start-activity 'market://details?id=パッケージ名'
```
クロスサイトリクエストフォージェリ(CSRF)の対策

##クロスサイトリクエストフォージェリ(CSRF)
Webサイトにスクリプトや自動転送（HTTPリダイレクト）を仕込むことによって、利用者に意図せず別のWebサイト上で何らかの操作（掲示板への書き込みや銀行口座への送金など）を行わせる攻撃手法のことをいいます。
CSRFの脆弱性が存在すると以下のような被害を被る可能性があります。
①利用者のアカウントによる物品の購入
②利用者の退会処理
③利用者のアカウントによる掲示板への書き込み
④利用者のパスワードやメールアドレスが変更
CSRF脆弱性の影響は「重要な処理」の悪用に限られるため、CSRFの脆弱性を個人情報の取得等に用いることはできません。
###CSRFの攻撃例
例えば、利用者が罠サイトを閲覧することによってパスワードが変更されてしまう場合
①利用者がexample.jpにログインしている
②攻撃者は罠を作成
③利用者が罠を閲覧する
④罠のJavaScriptによる、被害者のブラウザ上で攻撃対象サイトに対し、新しいパスワードabcdefがPOSTメソッドにより送信される
⑤パスワードが変更される
##CSRFの対策
CSRF攻撃を防ぐには、「重要な処理」に対するリクエストが利用者の意図によるものかどうかを確認することが必要になります。
このためCSRF対策が以下の2点です。
①CSRF対策の必要なページを区別する
②正規利用者の意図したリクエストを区別できるように実装する
###CSRF対策の必要なページを区別する
CSRF対策はすべてのページに行う必要はありません。対策に必要なページは、他のサイトから勝手に実行されては困るようなページです。例えば、ECサイトの物品購入ページや、パスワード変更など個人情報の編集確定画面などです。
CSRFの対策としては、まず実装するWebアプリケーションのどのページに脆弱性対策が必要なのか設計段階で明らかにすることです。
例えば、機能一覧を紙に記入し、CSRFの対策が必要なページを色分けすると良いと思います。
商品ページ=>認証=>カートに追加=>購入確認=>購入確定
この中だと最後の購入確定がCSRFの対策が必要です。
###正規利用者の意図したリクエストを区別できるように実装
CSRF対策で必要なことは、正規利用者の意図したリクエストなのかどうかということです。
意図したリクエストとは、利用者が対象のアプリケーション上で「実行」ボタンなどを押して、「重要な処理」のリクエストを発行することです。
正規のリクエストかどうかを判断する方法は3種類あります。
①秘密情報の埋め込み
②パスワードの再入力
③Refererのチェック
###秘密情報の埋め込み
登録画面や注文確定画面などのCSRF攻撃への対策が必要なページに対して、第三者の不正利用者が知り得ない秘密情報を要求するようにすれば、不正リクエストによる重要な処理が実行されることはありません。このような目的で使用される秘密情報のことをトークンといいます。
###パスワードの再入力
こちらは文字通り重要な処理が確定する前に、再度パスワードを入力してもらいます。これはCSRF対策の他にも物品の購入などに先立って、利用者の意思の念押しをしたり、共用のPCにおいて正規の利用者以外の利用者が、重要な処理を実行するのを防いだりする効果があります。
CSRFの攻撃例として、とりあげたパスワード変更ページにも現在のパスワードを再入力させることによりCSRF攻撃を防ぐことが可能です。
###RailsでのCSRF対策方法
Rails側できちんと対策を行ってくれています。基本的には開発者はなにもしなくても大丈夫です。
例として、RailsでのCSRF対策

```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception   #追加部分

  before_action :configure_permitted_parameters, if: :devise_controller?

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :nickname
  end
end
```
protect_from_forgery with: :exception
これがRailsアプリケーション内でCSRF対策を行うというという命令になります。こちらをすべてのコントローラの親であるapplication_controller.rbに記述することによって、その子コントローラすべてに先ほど説明したようなCSRF対策をRails側で行ってくれます。
具体的には、まずサイトのHTMLに一意のトークンを埋め込みます。これと同じトークンを、セッションcookie(クッキー)にも保存しています。ユーザーがPOSTリクエストを送信すると、HTMLに埋められているCSRFトークンも一緒に送信されます。あとは、サーバ側でページのトークンとセッション内のトークンを比較し、両者が一致することを確認したらリクエストを受け付けます。
Illuminate\Auth\AuthenticationException: Unauthenticated.というエラーについて

laravelのバージョンが5.5からunauthenticatedメソッドの場所が変わったから。
https://teratail.com/questions/97310

私はhandler.phpに

```php:handler.php
 protected function unauthenticated($request, AuthenticationException $exception) 
     { 
         return $request->expectsJson() 
                     ? response()->json(['message' => 'Unauthenticated.'], 401) 
                     : redirect()->guest(route('login')); 
     } 
```
と書きました
以下参考↓
https://github.com/laravel/framework/commit/11b0de0485632d5712f7fb59071a4acbc4af2bdc
authのgroupでlogoutをrouteに設定した時

routesでauthの中で以下のようにlogoutを設定した

```php:web.php
Route::group(['namespace' => 'auth'], function(){
    Route::get('/logout','LoginController@logout')->name('logout');
});
```

その時発生したエラーがこちら

```
local.ERROR: Class 'App\Http\Controllers\Auth\Auth' not found
```

調べるとissueに上がっていた↓
https://github.com/jayminpanchal/laravel-multiauth/issues/4

LoginControllerにこちらを追加すればOK

```php:LoginController.php
use Illuminate\Support\Facades\Auth;
```
gRPC: prototoolからbufへの道 ~ vol. 1 ~

# gRPC: prototoolからbufへの道 ~ vol. 1 ~

## Bufとは
Protobufが技術的なメリットの良い選択になるだけでなく、非常に使いやすく決定が簡単になることです

## 機能
- 自動ファイル検出
  - prototoolとは違い、任意に指定も可能
- 正確なlintとbreaking checkersの構成が選択可能になる
  -  lint: 40 breaking checkers: 50
- エラー出力はどのエディターでも簡単に解析可能
- コンパイルの高速化
  - protoc: 4.3sに対して ４コアでbuf: 0.8s
- protocのプロトコルプラグインとして使用

## Buf CLIツール

### サポートされている機能
- 優れたAPI設計の選択と構造を強制するリンター
- ソースコードまたはワイヤレベルでの互換性を強制する重大な変更検出器
- FileDescriptorSetsの拡張機能であるイメージを生成する構成可能なファイルビルダー

### インストール方法

```
brew tap bufbuild/buf
brew install buf
```

使い方は次回紹介します
Fedora Silverblue に VMWare Workstation を入れる

[/usr を overlay fs を使って rw 状態にしておく前提](https://qiita.com/Mercury/items/4031cbe5df2c80daa9b1)で、


```
	    mv /etc/vmware-installer /tmp
```

って感じで、もし既存のものがあれば /etc/vmware-installer を無い事にして、

```
	    <ほにゃらら>.bundle -I --custom
```

って叩いて、 VMWare Workstation のインストーラーを実行して、
全部デフォルトでインストールして、

```
	    vmware-modconfig --install-all --console
```

で、モジュール再 build して、

```
/etc/init.d/vmware restart
```


で使えるようになりますです。

/usr を overlay fs にする記事で書いた mount の発行は、この /etc/init.d/vmware の冒頭部に入れると良いです。