OmniAICreator/Qiita-1.07M huggingface dataset:
CSRの生成方法

アプリケーション開発やサイトを作成して実際にリリースする際にSSL化は推奨されています。
Google ChromeではSSL化していないとサイトの表示ができなくする方針みたいです。

※今は「保護されていないサイトです」みたいな感じ警告が出ます。

今回はSSL化をした後にCSRを生成して提出しなくてはいけないので
その方法を記載します


①秘密鍵の生成
2048bit の秘密鍵（ファイル名：private.key）を作成する場合

```
$ openssl genrsa -des3 -out （秘密鍵ファイル名） （キー長）
```
例

```
$ openssl genrsa -des3 -out aaa.key 2048
```
こちらを生成した際にPWの入力が求められます。
２回出てくるので設置をしましょう。

※設定したPWは絶対に忘れないようにしておきましょう

PWの設定が完了すると秘密鍵が生成されます。



②作成した秘密鍵からCSRを生成します

```
$ openssl req -new -key （秘密鍵ファイル名） -out （CSRファイル名）
```

例

```
$ openssl req -new -key aaa.key -out aaa.csr
```
上記のコード後にPWの入力を求められるので先ほど設定した秘密鍵のPWを設定しましょう。

その後、個人情報の入力画面が出てくるので入力していく。


1.国籍は日本なのでJP

```
Country Name (2 letter code) [AU]:JP
```

2.都道府県名をローマ字表記で入力

```
State or Province Name (full name) []:Tokyo
```

3.市区町村名（都道府県の1つ下のレベル）をローマ字表記で入力

```
Locality Name (eg, city) []:Chuo-Ku
```

4.サーバID申請団体の 正式英語組織名（会社名・団体名）を入力

```
Organization Name (eg, company) []:Sample inc.
```

5.部門名・部署名など、任意の判別文字列を入力

```
Organizational Unit Name (eg, section) []:Web design.
```

6.サーバIDを導入するサイトのURL（SSL接続の際のURL：FQDN）を入力


```
Common Name (eg, YOUR name) []:www.sample.com
```

ここまでは必須項目で以降のものはエンターキーで飛ばしても問題ないです。


完了したらCSRが生成されます！
ターミナルに出てこない場合は生成したディレクトリに移動して.csrファイルを
VSCなどに入れてみてください。

それをSSLの発行手続きの際にコピペで貼り付けて完了です。
TestRailでユーザーに招待メールを再送するには

## このドキュメントは
うちのQAチームでは、テストケース・テスト結果管理ツールとして[TestRail](https://www.gurock.com/testrail/)というドイツ製ツールを導入しています。
このTestRail、要件をきっちり満たしているツールなのですが、UIや使い勝手が慣れるまでちょっと辛い部分がありまして。
[ドキュメント](https://docs.testrail.techmatrix.jp/start)もあるのですが、なかなか探しにくいので、備忘録的な意味も込めて詰まった部分を残していこうと思います。

## どんな時
プロジェクトにユーザーを招待したいときに、とりあえずいろんな人招待したけど、
実際に使うまでタイムラグがあって、招待メールのリンク切れてたとき

## 招待メールの再送信
厳密に言うと「招待メール」ではないですが、
パスワード再設定メールが送信できます。

1. Admin権限が必要
2. 「Administration」→「Users & Roles」に移動
    - `https://{$domain}.testrail.io/index.php?/admin/users/overview`
3. 送信したいユーザーの「Edit」から、「Force Password Change」
<img width="800" alt="forcepasswordchange.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472334/04c2b6c6-272b-b88b-68de-a593edbb2504.jpeg">
損失関数

# 損失関数
## 二クラス分類
- 
## 多クラス分類
入力情報を元に、$n$ 種類のカテゴリ分け。出力層のノード数は $n$ 種類と同数にし、教師データはone-hotエンコーディングで、該当するカテゴリに対応するビットにだけ1を立てる。活性化関数にsoftmax関数を使用すると、確率に対応させることができる。

- categorical_crossentropy

# Reference
- http://bcl.sci.yamaguchi-u.ac.jp/~jun/notebook/keras/loss/
Rails 6 の pararell test がうまく行っていない皆様へ

# はじめに
Rails 6 でパラレルテストをやりたいけど、なんかうまくいかない、という方が読んでいただけたら参考になるかもしれないことを書いていこうと思います。

# やったこと
Headless Chrome なんかを使うシステムテストでは `PARALLEL_WORKERS=1` とすることで、並列でテストを動かすことを諦めましょう。それ以外のテストはお持ちの機材に合わせて `PARALLEL_WORKERS=$(grep processor /proc/cpuinfo | wc -l)` とでもしとけば動いてくれると思います。コードは [Github](https://github.com/seahal/qiita) にもあるので「エスパーかよ...」という方は、そっちも見ていだければと思います。

# おわりに
あんまり理解してないで、やってみたらうまくいきました。ちゃんと動く理由とか根拠とかは聞かないでください...

# 編集履歴
1. Github Actions で落ちていたので、なかったことにしてください...
2. Github Actions で動くようになりましたが、最初と全く異なる記事になりました...
Pelemay 0.0.11 で実装したカーネルベンチマーク

Pelemay 0.0.11 をリリースしました。

https://github.com/zeam-vm/pelemay/releases/tag/v0.0.11

> [New feature] Extract calculation kernel
> [New feature] `mix pelemay.bench` and `mix pelemay.nerves.bench`
> [Bug fix] Suppress error logs in case of mix test on Pelemay app

計算カーネルを分離し，`mix pelemay.bench` および `mix pelemay.nerves.bench` でカーネルの実行時間を計測して最小二乗法で出力することができます。

# x86での実行例

例えば `mix new np` の後，次のようなコードを書きます。

```elixir:mix.exs
defmodule Np.MixProject do
  use Mix.Project

  def project do
    [
      app: :np,
      version: "0.1.0",
      elixir: "~> 1.10",
      start_permanent: Mix.env() == :prod,
      deps: deps()
    ]
  end

  # Run "mix help compile.app" to learn about applications.
  def application do
    [
      extra_applications: [:logger]
    ]
  end

  # Run "mix help deps" to learn about dependencies.
  defp deps do
    [
      {:pelemay, "~> 0.0.11"}
    ]
  end
end
```

```elixir:lib/np.ex
defmodule Np do
  require Pelemay
  import Pelemay

  defpelemay do
    def map_mult_2(list) do
      list |> Enum.map(& &1 * 2)
    end
  end
end
```

ここで，`mix pelemay.bench Np` を実行すると，次のような出力結果が得られます。

```elixir
[
  [
    function: :map_elem1_mult_2_nif_driver_lsm_double,
    result: [r: 0.9918441034780148, a: 0.2963925671873642, b: 20.96983422139911]
  ],
  [
    function: :map_elem1_mult_2_nif_driver_lsm_i64,
    result: [
      r: 0.9896871109828315,
      a: 0.30485363074644567,
      b: 22.47533563729091
    ]
  ]
]
```

Clang もしくは x86 アーキテクチャで動作させた時には，$t$ を所用クロック数，$n$ をリスト長とした時に，$t = an + b$ で表されるクロック数かかるということになります。(rは相関係数)

# Nerves (target) での動作例

`mix nerves.new np` とした後，


```elixir:mix.exs
...
  defp deps do
    [
      # Dependencies for all targets
      ...
      {:pelemay, "~> 0.0.11"},
      ...
    ]
  end
...
```


```elixir:lib/np.ex
defmodule Np do
  require Pelemay
  import Pelemay

  defpelemay do
    def map_mult_2(list) do
      list |> Enum.map(& &1 * 2)
    end
  end
end
```

ここで，`mix firmware`, `mix burn` もしくは `./upload.sh` とします。

さらに，`mix pelemay.nerves.bench Np` を実行すると，次のような出力結果が得られます。

```elixir
[
  [
    function: :map_elem1_mult_2_nif_driver_lsm_double,
    result: [
      r: 0.9999701332269993,
      a: 15.135247668929917,
      b: 296.24489268939215
    ]
  ],
  [
    function: :map_elem1_mult_2_nif_driver_lsm_i64,
    result: [r: 0.9999544021113032, a: 6.791865425419216, b: 296.8161688166135]
  ]
]
```

GCC かつ Linux かつ x86 アーキテクチャでないプロセッサで動作させた時には，$t$ を所用時間(ns)，$n$ をリスト長とした時に，$t = an + b$ で表される時間かかるということになります。(rは相関係数)

バージョン 0.0.10 から 0.0.11 の変更点はこちらです。

https://github.com/zeam-vm/pelemay/compare/v0.0.10...v0.0.11

取り急ぎ，こんなところで。
Module not found: Error: Can't resolve 'tls'の解決


# エラー内容
```javascript
Module not found: Error: Can't resolve 'tls' in '/home/{ユーザ名}/ドキュメント/GoogleHomeMiniNotification/node_modules/https-proxy-agent/dist'
 @ ./node_modules/https-proxy-agent/dist/agent.js 16:30-44
 @ ./node_modules/https-proxy-agent/dist/index.js
 @ ./node_modules/gaxios/build/src/gaxios.js
 @ ./node_modules/gaxios/build/src/index.js
 @ ./node_modules/google-auth-library/build/src/transporters.js
 @ ./node_modules/google-auth-library/build/src/index.js
 @ ./node_modules/@google-cloud/pubsub/build/src/pubsub.js
 @ ./node_modules/@google-cloud/pubsub/build/src/index.js

```

# 原因
node用ライブラリを含むモジュールをクライアントサイドJS向けにビルドしたから。

# 対応
* サーバサイドアプリをビルドする認識であることを確認（サーバサイドライブラリをクライアントサイドで使おうとしていないか？）
* webpack.config.jsの`module.exports = {/*ここ*/}`内に以下を追加。  

```javascript
target: "node",
```
Module not found: Error:Can't resolve './operations_client_config'の解決

# 状況
webpackでCloud APIを利用するソースをbuildしようとした際に発声。

# エラー内容
```javascript
ERROR in ./node_modules/google-gax/build/src/operationsClient.js
Module not found: Error: Can't resolve './operations_client_config' in '/home/{ユーザ名}/ドキュメント/GoogleHomeMiniNotification/node_modules/google-gax/build/src'
 @ ./node_modules/google-gax/build/src/operationsClient.js 21:19-56
 @ ./node_modules/google-gax/build/src/index.js
 @ ./node_modules/@google-cloud/pubsub/build/src/v1/publisher_client.js
 @ ./node_modules/@google-cloud/pubsub/build/src/v1/index.js
 @ ./node_modules/@google-cloud/pubsub/build/src/index.js
 @ ./src/SpeechProcess.ts
 @ ./src/index.ts
npm ERR! code ELIFECYCLE

```

# 対応
webpack.config.jsのresolve.extensionsに`'.json'`を追加。

```json
resolve : {
    extensions : {
        '.ts', '.js', '.json'
    }
}
```
活性化関数

# 活性化関数
## 一覧表


|関数名|出力|説明|
|:--|:--|:--|
|シグモイド|[0,1]|一つの実数値を入力に取る。2値分類で使用される。|
|ロジスティック||
|ソフトマックス||入力をベクトルで受け取り、出力もベクトルで返す。多分類で使用される。|
|ランプ関数||

## シグモイド関数
入力情報は $x$ の実数値一つ、出力も定義式に従って実数値一つ。

```math
f(x)=\frac{1}{1+e^{-x}}
```

## ソフトマックス関数
入力情報は $[x_1,x_2,...,x_n]$ のベクトルを受け取り、出力は $[e^{x_1},e^{x_2},...,e^{x_n}]$ を計算する。特徴的なのは、出力要素の総和を1に規格化するところであり、各要素を $\sum_{i=1}^{n} e^{x_i}$ で規格化する。

```math
f(x_i)=\frac{e^{x_i}}{\sum_j^{n} e^{xj}}
```

## RELU関数（ランプ関数）
いきなりの躓き　rails 環境について

progateで勉強を始めました。progateにそって環境構築を進めていましたが
rails sとする際に

required)>'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sqlite3-1.3.13-x64-mingw32/lib/sqlite3.rb:6:in `require': cannot load such file -- sqlite3/sqlite3_native (LoadError)

と出て先に進めません。sqlite3がうまくDL出来ていないのでしょうか？

どなたかご教授いただけないでしょうか？

windows10使用です
【Rspec】Devise::MissingWardenエラーの解決策

##状況
Rspecのコントローラースペックを実装中に表題のエラーが発生しました。
初めて見るエラー文で戸惑ったのですが、解決策がシンプルだったため記載します。

##環境
railsを用いたアプリ開発中で、deviseを用いたユーザー登録機能を実装している。

<img width="774" alt="スクリーンショット 2020-05-09 14.07.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565338/4847b6fc-fd8f-a6a1-a135-7084b44b2a94.png">

##解決策

結論から。
エラー文には

```

 Make sure that your application is loading Devise 
and Warden as expected and that the `Warden::Manager` 
middleware is present in your middleware stack.
       If you are seeing this on one of your tests, 
ensure that your tests are either executing 
the Rails middleware stack or that your tests are using the `Devise::Test::ControllerHelpers` module to inject the `request.env['warden']` object for you.

(アプリケーションがDeviseをロードしていることを確認してください 
とWardenは期待通りであり、 `Warden :: Manager` ミドルウェアはミドルウェアスタックに存在します。        あなたのテストのいずれかでこれを見ている場合、 テストが実行されていることを確認します 
Railsミドルウェアスタック、またはテストで `Devise :: Test :: ControllerHelpers`
モジュールを使用して` request.env ['warden'] `オブジェクトを挿入すること。)

```
と記載されています。

　 に下記を記載します。

```ruby:rails_helper.rb


 config.include Devise::Test::ControllerHelpers, type: :controller
  
 config.include Devise::Test::ControllerHelpers, type: :view

(私は一番下の行に記載しました。)
```

再度rails sでサーバーを立ち上げrspecを行うと、
エラーが出ていた箇所のテストが通っていました。

##原因

ユーザー登録で使用したgem "devise"はwarden をベースにした
gemということで、ベースであるwardenのプロキシサーバーのエラーが起こり、エラー文が出ていた様子です。

プロキシサーバーとは、通常のサーバーではない代理のサーバーのような意味合いで、
今回は指定したプロキシサーバーが見つからない、ということでのエラーなのではないかと解釈しました。


##参考にさせていただいた記事


[【Rails4】Devise::MissingWarden エラーへの対処](http://ohs30359.hatenablog.com/entry/2016/07/23/094933)
[wardencommunity/warden]
(https://github.com/wardencommunity/warden/wiki)
画像認識

# Reference
- [活性化関数について](https://qiita.com/ksktkd/items/8112ecc8a2c9add501c6)
- [損失関数について](https://qiita.com/ksktkd/items/9ad8b51ffd2d39ff0e4b)

# チュートリアル
MNISTの学習データを用いて、画像認識させるニューラルネットワークの手順のまとめ。

## MNIST
「0」〜「9」の手書きの数字のデータセット。一つの数字につき$28\times28$のピクセルに分け、１ピクセル8bit 256段階の色分けが行われている。kerasの提供するAPIで簡単に読み込むことができる。

```python
>>> from keras.datasets import mnist
>>> (x_train, y_train), (x_test, y_test) = mnist.load_data()
>>> x_train[0]
array([[  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0],
・・・ (省略)
>>> y_train[0]
5
```

入力情報を、1次元の配列に変換する。

```python
>>> x_train = x_train.reshape(60000, 784)
>>> x_train[0]
array([  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
         0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
         0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
```

また、正解データをone-hotエンコーディング（ダミー変数）に変換する。最終の出力層で確率として学習値と比較するので、例えば5であれば[0,0,0,0,0,1,0,0,0,0,]という行列にする。これもkerasのAPIを使用して作ることができる。

```python
>>> y_train = keras.utils.to_categorical(y_train, 10)
>>> y_test  = keras.utils.to_categorical(y_test, 10)
```

## ニューラルネットワークモデル

- 入力層
    - MNIST1枚のピクセル28×28=784ピクセルの情報を入力情報にする。
- 隠し層
    - 何層でするか、は要チューニング
- 出力層
    - 「0」〜「9」に対応する10ノード、出力値はその数字である確率に対応する
    

# 画像認識
チュートリアルにおける簡単なコーディングを踏まえ、より実践的な画像認識に移る。最終的な挑戦目標は人物の輪郭を抽出すること。
CourseraのMachine Learningのプログラミング課題で使ったOctaveの関数と演算子

## はじめに

Couseraの[Machine Learning](https://www.coursera.org/learn/machine-learning) 講座のプログラミング課題ではOctaveという言語が使われます。ほとんどの課題は、その週で学ぶ機械学習アルゴリズムを表した数式を記述することが多いです。課題をやっている中で数式を書くことは分かっても、Octaveでの書き方が分からずに詰まったことがあったので、主な記述方法をまとめました。

## よく使った演算子

##### 行列の積（ベクトルの内積）
一番使った演算だと思います。A,Bは行列またはベクトルです。AかBかのどちらかがスカラーでも同じ演算子です。

```
C = A * B;
```
数式では次のようになります。
$$ c_{ij} = \sum_{k=1}^{m}a_{ik}b_{kj} $$



##### 行列の要素ごとの積
これもよく使ったと思います。「.」を演算子の前につけると要素ごとの演算になります。行列の積とよく似てるので、注意しないとハマるかもしれません。

```
C = A .* B;
```

数式は
$$
c_{ij} = a_{ij}  b_{ij}
$$
とか
$$
C = A \otimes B
$$
になります。（アダマール積というらしいです。）


##### 行列の要素ごとの2乗
似たような演算で要素ごとの２乗もよく使いました。

```
C = A .^ 2;
```


##### 行と列の転置
行列の積をする際に転置行列（行と列を入れ替える）ことがよくあります。

```
X';
```

```math
X = \left( \begin{array}{ccc}
1 & 2 & 3 \\
4 & 5 & 6
\end{array} \right)
```
という行列だった場合、

```math
X' = \left( \begin{array}{cc}
1 & 4 \\ 
2 & 5 \\ 
3 & 6
\end{array} \right)
```
となります。

##よく使った関数
Octave では helpコマンドで関数の使い方を調べることができます。ただ慣れるまではhelpを見てもピンと来ませんでした。使用頻度の高かった関数をどんなときに使ったのかをまとめました。

```
help [関数名]
```

##### size() 
引数に行列を指定すると、その行列のサイズを調べることができます。行列同士の積は行列サイズに注意をする必要があるので、引数のサイズや計算結果が正しいかどうか調べるために使いました。

```math
X = \left( \begin{array}{ccc}
1 & 2 & 3 \\
4 & 5 & 6
\end{array} \right)
```

のような行列の場合、サイズは(2, 3)になります。

```
X = [1 2 3; 4 5 6];
size(X)
ans =
  2  3
```


##### sum()
引数に指定した行列の合計を計算します。アルゴリズムに $ \sum $ が含まれることは多いのでよく使います。特につまづくことはないと思いますが、行毎の合計を計算する場合は、引数を指定する必要があります。

```
X = [1 2 3; 4 5 6];
%列方向の合計
sum(X) 
ans =
  5  7  9

%行方向の合計
sum(X,2) 
ans =
  6
  15

%総合計
sum(sum(X)) 
ans =  21
```

特定の値のみを集計する場合もあります。引数に条件を指定すると真の場合のみ集計します。

```
X = [1 0 0; 1 1 0; 1 1 1];
%1の合計
sum(X == 1) 
ans =
  3  2  1
```

##### mean()、std()
行列の平均、標準偏差を計算するために使います。正規化(Normalization)で使います。

```
X = [1 2 3; 4 5 6];
%平均値
mean(X) 
ans =
  2.5000  3.5000  4.5000

%標準偏差
std(X) 
ans =
  2.1213  2.1213  2.1213
```

##### exp()
指数関数です。シグモイド関数の実装で使います。

```math
g(x) = \frac{1}{1 + e^{-x}}
```

##### log()
対数関数です。ロジスティクス回帰の損失関数の実装で使います。

```math
J(\theta) = \frac{1}{m} \sum_{i=1}^{m}\left[-y^i log(h_{\theta}(x^i)) - (1-y^i) log( 1-h_{\theta}(x^i)) \right]
```

##### max()、min()
列単位の最大値・最小値を求めます。行単位のときは引数を指定する必要があります。

```
X = [1 2 3; 4 5 6];
%列方向の最大値
max(X) 
ans =
  4  5  6

%行方向の最大値
max(X,[],2) 
ans =
  3
  6
```

アルゴリズムによっては最大値そのものではなく、最大値のインデックスが必要な場合があります。max(),min()では、返り値が[値,インデックス]となります。

```
[val, index] = max(X) 
val =
  4  5  6
index =
  2  2  2
```

##よく使った行列操作
演算子と関数のみで実装できればいいんですが、課題の中には行列を操作する必要があります。最低限、知っていれば良い操作をまとめました。

##### 行列の１行目を取り除く
確か正則項を求める際、バイアス部分は計算しなくていいので、１行目を省いて計算する必要があります。

```
X = [1 2 3; 4 5 6; 7 8 9];
%２行目以降を取得する(Octaveのインデックスは1始まり)
X(2:3, : ) 
ans =
  4  5  6
  7  8  9
```

##### １行目を0に初期化
１行目を省いて取得してもいいですが、１行目を０に初期化する場合もあります。

```
X = [1 2 3; 4 5 6; 7 8 9];
%２行目以降を取得する(Octaveのインデックスは1始まり)
X(1, : ) = 0
ans =
  0  0  0
  4  5  6
  7  8  9
```

#####  Xのi行目にxベクトルを代入

```
X = [1 2 3; 4 5 6; 7 8 9];
x = [2 2 2];
%２行目にxを代入
X(2, : ) = x
ans =
  1  2  3
  2  2  2
  7  8  9
```

##### 行列の合成

バイアスを含めて行列計算するために、１列目に１を追加します。

```
X = [1 2 3; 4 5 6; 7 8 9];
one = ones(3,1);
%１列目に追加
X[one X]
ans =
  1  1  2  3
  1  2  2  2
ｓ  1  7  8  9
```
勉強の方針

「みずほ銀行システム統合、苦闘の19年史」を読んだ。

とりあえずここからヒントを探して学んでいこうと思う。

タグ通り、java, Justware, RHEL, HiRDB の勉強を進めていこうと思う。

java はノートPC でも動作可能なのでサンプルの実装やらなんやらは問題ない。

データベース系のものはAWS を借りてやってみようかな。あんまりデータはたくさん入れたくないし、動作が重くなると困る。諸事情でファンが異常回転しっぱなしなので、あんまり負荷をかけたくない。

Justware はチャンスがあれば見て盗む方針でいこう。教えてもらうことを期待しちゃダメだ。そーかぁ。指示待ち人間じゃダメって、そういうことか。

RHEL はどうしようか。このノートPCも、Macが水気でやられたからubuntuをねじ込んで動作してるわけだし、ブートは可能だと思うけど、在宅ワーク中だしなあ。連絡手段や開発環境がなくなるのは困る。機を待とう。コロナが収まったら中古のノートPCでも見に行こうかな。つか無料なの？有料ならどうしようかな。会社のやつがあれば使ってみたいけど。無料ならiso ファイルがあればLiveUSB を作って試す方針で行こう。

HiRDB は無料体験版があるらしい。データベース関連かぁ。アレか？汎用機でつかうってことかな。あるいはSaaS の一種なんかな。
、、、ググった。Paas かな、これは。AWS に近いんかな。
、、、おぉ、、、、まじかよ。やべえな。すごい会社やなホンマ。チャンスがあればやってみたいもんだな。


、、、あんまりこういうことは書かないほうがいいのかな。色々とバレそうな気がする。
、、、、、、、ま、ええか。
#PowerApps 3Dで表示(View in 3D) #01

先日、[Microsoft Business Applications Summit](https://www.microsoft.com/en-us/businessapplicationssummit) で紹介された Power Apps の Mixed Reality（以降、MR）機能を紹介しました。記事投稿後にプレビュー機能をONにすると、もう1つコントロールが追加されることに後から気づきました。今回は、その追加で気づいたコントロール「3D で表示」（View In 3D）を取り上げます。

機能としては3Dデータを表示するコントロールです。MRはスマホじゃないと動作しませんでしたが、3Dデータの表示はPCのブラウザーでも利用できました。Surface 等のタッチ画面に対応したPCであれば、シングル・ダブルタッチでグリグリと3D画像を動かすコトができますよ。

# もくじ
[事前準備](https://qiita.com/yamad365/items/48d021bca0c99418ea80)：プレビュー環境構築方法など
[View in 3D ＃01](https://qiita.com/yamad365/items/61a327bbd52c133e9233) ：概要 ***※当記事***
[View in 3D ＃02](https://qiita.com/yamad365/items/b4ca0d8a7877de183efe) ：Source指定方法
[View In 3D ＃03](https://qiita.com/yamad365/items/2621b4f122b0bfa286a4) ：ODfB+Excelで表示

# Mixed Reality と 3D を試すには
実際に Power Apps の Mixed Reality を試してみたい方は、下記の記事を参考に環境をご準備ください。また、リンク先の記事でも記載しておりますが、MR機能は記事投稿時点ではプレビュー機能になります。今後のVerUp等で変更になる可能性もありますのでご認識のうえご利用ください。

[#PowerApps の Mixed Reality（MR）機能を試してみた！](https://qiita.com/yamad365/items/48d021bca0c99418ea80)

# 参考URL
まず、3D表示も含めたMR機能全般のDocsは下記になります。末尾のリンクから各々の機能詳細へ飛ぶコトが可能です。

　■Add mixed reality components to your canvas app (Preview)
　https://docs.microsoft.com/en-us/powerapps/maker/canvas-apps/mixed-reality-overview

上記のページからもジャンプできますが、今回取り上げる「3Dで表示」の情報は下記URLから確認可能です。

　■View 3D content in canvas apps (Preview)
　https://docs.microsoft.com/en-us/powerapps/maker/canvas-apps/mixed-reality-component-view-3d

# 動作イメージ
<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> + MR View in 3D <a href="https://t.co/d3Ci17nIMU">pic.twitter.com/d3Ci17nIMU</a></p>&mdash; やま (Yama) (@yamad365) <a href="https://twitter.com/yamad365/status/1258729300972298240?ref_src=twsrc%5Etfw">May 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ドロップダウンから3Dデータの情報を選択して、[3Dで表示]コントロールへ選択された情報を表示しているだけ、です。指1本（シングルタッチ）で回転、指2本（ダブルタッチ）で拡大・縮小と回転が可能でした。

なお、利用している機種は iPhone Xs。無線LANに接続した状態ですが、3Dデータの読み込みは時間かかりますね。

# .glb 以外はサポート外？
3D画像はいくつか種類があるようで、各々の形式で拡張子が異なるようです。画像データの”.png”や”.jpg”みたいなモンですね。気になったので、Windows 10 の「ペイント3D」で指定可能な”.3mf"が表示できるか試してみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> 3D表示は .glb 以外はダメぽい <a href="https://t.co/oj0U98a04t">pic.twitter.com/oj0U98a04t</a></p>&mdash; やま (Yama) (@yamad365) <a href="https://twitter.com/yamad365/status/1258732885881663493?ref_src=twsrc%5Etfw">May 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

動画のように”.glb”拡張子のファイル以外はサポートされてないようで、表示することができません。おそらく、事前に紹介したDocsの下記部分が該当するのでしょう。

> You can set the source for 3D content as a direct URL to a .glb file

「URLで直接”.glb”拡張子の3D画像ファイルを指定するコトができるよ」ってニュアンスかと思いますが、ようは「".glb"ならURL指定が可能だぜ（他の拡張子をサポートしてるとは言ってない）」ってコトですかねぇ(;^ω^)

# 続きます
この後も[3Dで表示]を調べてみたのですが、少々”クセが強い！”と感じる部分が多々あります。なので、調べたことをまとめながら記事にしていこうと思います。

というコトで、今回はここまで。
次回は先ほど紹介した動作イメージのアプリ詳細を記事にする予定です。”.glb”拡張子のファイルをURL指定で云々に関しても取り上げる予定です。

それでは、皆さま、素晴らしい Power Platform Life を！
ZoomをAzure ADでSSOする構成にしてみた（後編）

[前編](https://qiita.com/hisssa0102/items/2c2d0a17cc8219a07563) で、SSOできる構成まで設定した。ただ、SSOするにはバニティURLが必須なので覚えてなきゃいけないし、SSOだけに制限できてるわけではないのでzoomパスワードリセットすればサインインできてしまう。

今回は、SSOしかできないよう、制限してみた。
前編の作業を終えたら、後続でこれらを設定する。

#管理されたドメインに登録する

メールやUPNで使っているドメインを、管理されているドメインとして登録する。

zoom管理者アカウントでサインインして管理者メニューの、[アカウント管理] - [アカウントプロフィール]を開き、[管理されたドメイン]から、登録。

登録した後、申請処理を行う。
DNSレコードやweb内にタグを埋め込む方法もあるけど、「手動構成」すれば、サポートの方とやり取りして登録してもらうことも可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/b9623568-c018-9232-30b8-9c399d306b49.png)

承認されるまでは「承認待ち」となり、承認されたら「認証済み」になる。手動で実施する場合は数日かかるケースもある。

#強制SSO対象に設定する

管理者メニューの[詳細][セキュリティ]を開き、[サインイン方法]から設定する。

SSOを許可、GoogleサインインとFacebookサインインをオフにする。
[ユーザーの電子メールアドレスが選択されたドメインの1つに属する場合、そのユーザーにSSOでサインインさせる]に、先ほど登録・承認されたドメインを追加する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/1e006263-521b-1c62-df98-01b7cfe3d020.png)

#設定完了

これで完了。[ZoomサインインURL](https://zoom.us/signin)でメールアドレスとパスワードを入力し、サインインをクリックするとOffice365ログイン画面にリダイレクトされるようになる。ここで入力するパスワードは1文字入力すれば何でもよくて、Zoomの正しいパスワードであれ強制でリダイレクトされるようになっている。

#注意点

このところのリモートワークの増加やオンラインセミナーの増加で、ひょっとしたら会社メールアドレスでZoomの無料アカウントを使っている人がいるかもしれない。SSO を強制する設定を行うと、そういった人であってもSSOされるようになる。ユーザー側はびっくりすること間違いなしなので、事前に周知するとかQAとか準備しておくといいかも。

セキュリティに~~口うるさい~~ルールが多い組織だったら「許可されてない SaaS、勝手にアカウント作ってたんですか？組織のセキュリティポリシー読んでますか」と返すケースがあるかもしれない。

あと、Azure AD上のユーザーの割り当てから外れていると、SSO にリダイレクトされるが、Azure ADでブロックされる。アプリケーションの割り当てユーザーは、適宜設定しましょう。




#参考
[Zoom - 管理されたドメイン]
(https://support.zoom.us/hc/ja/articles/203395207-%E7%AE%A1%E7%90%86%E3%81%95%E3%82%8C%E3%81%9F%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92)

[Zoom - Advanced security settings](https://support.zoom.us/hc/en-us/articles/360034675592-Advanced-security-settings)
※英語。最下部のSingn-in methodsに記載あり



ほかのSaaSもいくつかまとめてみました。[各種SaaSとAzure Active Directoryのシングルサインオン対応状況を調べてみた](https://qiita.com/hisssa0102/items/77f94823f6c708623694)を参照してください。
前方平均の算出（ぴよログ 睡眠時間）

#はじめに
[ぴよログのエクスポートデータを見える化する](https://qiita.com/kaji-tan/items/e1d6b4893dca8708a9ad)の続きです。
前回生成したグラフに前方平均を追記します。

#追加した部分
```python:get_array_average
def get_array_average(array, span):

    ave = 0
    ret_array = []

    for index, item in enumerate(array):
        if index <= len(array) - span:
            for i in range(span):
                ave += array[index + i]
            ret_array.append(round(ave / span, 1))
            ave = 0

    return ret_array
```

#結果
今回は10日間の前方平均を算出しています。
成長につれて睡眠時間が少なくなってきているのがよくわかります。
![20200509_135535.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545683/e30ec730-8d35-373b-0fa2-31c663e2a113.png)
railsアプリをherokuで公開する際、Gemfileでつまづいた

progateで学習した内容をアウトプットのため、作成したアプリを公開しようと思いました。
が、しかし `$bundle install` したところ、`Could not fetch specs from https://rubygems.org/`
のエラーが。

#ここまで出来ていること
・アプリ作成済み
・githubアカウント作成、リポジトリ作成済み
・herokuアカウント作成、github連携済み

#結果
PCを再起動したら無事bundle install出来ました。
Ubuntu 18.04. LTS インストールメモ

ここの所Ubuntuを何度もインストールしなおしてるので備忘録的メモです。

やりたいことはtensorflow2系でGPU使った機械学習でその準備です。

この目的の場合は2020/5/8時点ではUbuntuは18.04が無難と思われます。

Windowsとのデュアルブートですが、Ubuntuは単独のディスクにインストールします。

この時EFI用のパーティションの作成を忘れるとUEFI BIOSからブートデバイスとして出てきません

##ライブUSBの作成 (Ubuntu インストールメディア)

【参考】https://blog.mktia.com/how-to-make-ubuntu-live-usb/

私はRemixでない18.04LTSにしました

##インストール
ライブUSBを挿してPC起動。
F8キー連打でブートデバイス選択でライブUSBを選択します。

install ubuntu だったか？を選択するとリッチなインストール画面が起動します。

【参考】
https://kledgeb.blogspot.com/2018/04/ubuntu-1804-uefi-1-uefipcubuntu-1804.html

https://kledgeb.blogspot.com/2018/04/ubuntu-1804-uefi-2-uefipcubuntu-1804.html

1. 言語の選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241416/55821a6c-6a66-dc3e-46a2-0ee81b9b5e57.png)

2. キーボード配列を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241416/3085a924-6c85-9548-a6de-9065bf1705f5.png)

3. インストール内容を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241416/fc5b1603-4dcf-84df-edc2-55be90d15792.png)

4. インストール種類の選択
「それ以外」を選択しました。
「それ以外」でないインストールで目的のことができたかは忘れました。
意識的にパーティションの操作はできなかったと思いますので、単一ディスクでのデュアルブートは「それ以外」を選ぶ必要があると思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241416/798e55b5-12aa-36c6-bd13-c84da8cd9e6c.png)

5. すっからかんにしたディスクの空き領域にEFIブートパーティション作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241416/503e4a94-d51f-01b0-7c15-f7dffc47c2d6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241416/a601bc55-5abe-72e1-ca04-48da485328e2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241416/28c60b33-3cc9-d1ad-46a3-2ee5811299b4.png)

6. Ubuntuをインストールするパーティション作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241416/9ddce10b-40d6-f449-aa65-c4a315b913f1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241416/0c4ec96f-d696-219b-6f34-4fb14b1c8144.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241416/25bea7e9-661b-531a-f601-17cff978ea7f.png)

7. インストール確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241416/2fbe99ef-6d6d-c24a-12f1-dfeff9e6de19.png)

8. 地域の選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241416/a6069861-abd8-d75c-9712-c4a2703d38d4.png)

9. ユーザの登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241416/6d7c6a45-f332-d9fc-6325-d488f4902d91.png)

10. インストール・・・！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241416/7a1eaaf9-ea4a-e696-e25e-b9388c75932c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241416/bf552162-56f5-268d-9793-530c5b06e953.png)
条件は不明ですがライブUSBを抜け！という指示が出ることがありますのでその時は抜きましょう。

11. 再起動してUEFI BIOSでブートデバイスの確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241416/914e2d2d-7d49-080e-a937-d5375143f142.png)
無事にUbuntuが見えました
PMP試験に出てくる(4.3) Direct and Manage Project WorkのITTOを覚えよう

# (4.3) Direct and Manage Project Workとは
プロジェクト統合管理の7つのプロセスにある`プロジェクト作業の指揮・管理`プロセスのことである。

- [プロジェクト統合管理の7つのプロセス](https://qiita.com/Yumenoshima/items/81eab7a0000302341abd)

## (4.3) Direct and Manage Project WorkはPMBOKガイドのどこに出てくるか
PMBOKガイド`90ページ`の`4.3`に出てくるよ！

# ITTOとは
プロセスに対するインプット、ツールと技法、アウトプット(成果物)!

## (4.3) Direct and Manage Project WorkのITTOのI(インプット)
- Project management plan
    - Any component
- Project documents
    - Change log
    - Lessons learned register
    - Milestone list
    - Project communications
    - Project schedule
    - Requirements traceability matrix
    - Risk register
    - Risk report
- Approved change requests
- Enterprise environmental factors
- Organizational process assets

## (4.3) Direct and Manage Project WorkのITTOのTT(ツールと技法)
- Expert judgement
- Project management information system (PMIS)
- Meetings

## (4.3) Direct and Manage Project WorkのITTOのO(アウトプット)
- Deliverables
- Work performance data
- Issue log
- Change requests
- Project management plan updates
    - Any component
- Project documents updates
    - Activity list
    - Assumption log
    - Lessons learned register
    - Requirements documentation
    - Risk register
    - Stakeholder register
- Organizational process assets updates

# まとめ
(4.3) Direct and Manage Project WorkプロセスのITTOを覚えて、インプットとアウトプットの成果物テンプレートも押さえよう！ PMISツールも使いましょう！

----
以上
やってきたことの棚卸し(プログラミング言語でたどる)

これまでに取り組んできた言語まとめた。

言語と用途
---
**よく使うもの／使ってきたもの**
・Javascript(web ページの作成)
・TeX(卒業論文)
・Python(3)(卒業研究)
・PHP(web ページのログインフォーム作成)
・Java(Android アプリケーションの作成・基本情報処理技術者試験の対策)
・HTML(web ページの作成)
・SQL(基本情報処理技術者試験の対策・ログインフォームのデータベース管理)
・CSS(web ページの作成)

**少しさわるもの／さわってきたもの**
・Bash(ディレクトリを大量に作成したとき)
・xml(java アプリケーションを作成したとき)
・Apache(サーバーを立てたとき)
・CMake(大学の研究室でROS をさわったとき)
・C#(cs)(大学の授業)
・C++(cpp)(大学の授業)


結構かたよってんなぁ。フロント系ってかんじかな。python, MySQL はともかくとして。もっとデータベース系のことがやりたいなぁ。そっちの仕事も増えてくるだろうし。Oracle の勉強でもしようかな。

各種DBシステムの概要　RDBMSとNoSQL
(https://qiita.com/yk-nakamura/items/5022f51ffc39e4a8c412)
ここからいくつか見繕って取り組んでいこうかな。
Javascriptでtry-catch文のテスト

Javascriptでtry-catch文のテスト
（何番煎じかわかりませんが、、）

```Js:test.js
function getMonthName (mo) {
    mo=mo-1; // 月の数字を配列のインデックスに合わせる (1=Jan, 12=Dec)                                                        
    var months=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul",
                         "Aug","Sep","Oct","Nov","Dec");
    if (months[mo] != null) {
       return months[mo]
    } else {
       throw "InvalidMonthNo"
    }
}

// テスト1                                                                                                                    
console.log("Test1")
myMonth=1
try {
    monthName=getMonthName(myMonth)
    console.log(monthName)
}
catch (e) {
    monthName="unknown"
    console.log(e)
}

// テスト2                                                                                                                    
console.log("Test2")
myMonth=100
try {
    monthName=getMonthName(myMonth)
    console.log(monthName)
}
catch (e) {
    monthName="unknown"
    console.log(e)
}
```

実行

```
$ node test.js 
Test1
Jan
Test2
InvalidMonthNo
```

# finally

try,catchの後にfinallyを加えると、どちらの場合でも処理の最後に必ず実行される。

```
try {
...
}
catch (e) {
...
}
finally {
    console.log("final statement")
}
```

例えば以下の通り

```
function getMonthName (mo) {
    mo=mo-1; // 月の数字を配列のインデックスに合わせる (1=Jan, 12=Dec)                                                        
    var months=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul",
                         "Aug","Sep","Oct","Nov","Dec");
    if (months[mo] != null) {
       return months[mo]
    } else {
       throw "InvalidMonthNo"
    }
}

// テスト1                                                                                                                    
console.log("Test1")
myMonth=1
try {
	monthName=getMonthName(myMonth)
	console.log(monthName)
}
catch (e) {
    monthName="unknown"
    console.log(e)
}
finally {
    console.log("final statement")
}

// テスト2                                                                                                                    
console.log("Test2")
myMonth=100
try {
	monthName=getMonthName(myMonth)
	console.log(monthName)
}
catch (e) {
    monthName="unknown"
    console.log(e)
}
finally {
    console.log("final statement")
}
```

実行

```
$ node test.js 
Test1
Jan
final statement
Test2
InvalidMonthNo
final statement
```

# 参考
[開発者による開発者のためのリソース。try...catch 文](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Exception_Handling_Statements/try...catch_Statement)
ffmpegでB5画像をTwitterの画像サイズに合わせたい。(備忘録)

#はじめに
モバイルTwitterの画像サイズは微妙で、特に画像を三枚並べたときの一枚目にB5サイズを入れると微妙に上下が切り取られて見えます。ということで左右に余白をくっつけてちょうどよく見せることを考えました。

#こうする

`ffmpeg -i input.png  -vf "scale={{元幅}}:{{元高さ}},pad={{後幅}}:{{後高さ}}:(iw-ow)/2:(ih-oh)/2:white" output.png`

###解説
`{{元幅}}`、`{{元高さ}}`に元画像のサイズを入れます。
出力後はだいたい正方形(若干幅の方が小さい)になれば良いとのことなので
`{{後幅}}` = `{{後高さ}}` ×0.9とかで大丈夫かなと思います。

###備考
-vf: ビデオフィルターだそうです。
pad: padding(余白)だそうです。

#参考にしたページ
https://nico-lab.net/pad_with_ffmpeg/
https://www.abhachi.com/twitter-preview
【Hyperas】TypeError: 'function' object is not subscriptableの解決

# はじめに
私自身が困ったエラーだったので誰かの助けになればと思います。

```
TypeError: 'function' object is not subscriptable
```
このエラーは関数部に問題があると考えられます。
<br>
この問題を修正するためには、hyperasモジュールで追加した部分を見返しましょう。

# 環境

* MacOS
* Jupyter Notebook
* Python 3.7
* Keras Function API

# モジュールのインポート

```python
from tensorflow.keras import layers
from tensorflow.keras import Input
from hyperas.distributions import choice
from hyperas.distributions import uniform
```

# Before

```python
def create_model(X_train, y_train, X_test, y_test):
    input_tensor = Input(shape=(X_train.shape[1],))
    x = layers.Dense({{choice[128, 256, 512]}}, activation="relu", kernel_regularizer = regularizers.l2({{choice[0.01, 0.001, 0.0001]}}))(input_tensor)
    x = layers.Dropout({{uniform(0, 1)}})(x)
        :
```
これのどこが問題かお分かりでしょうか。
<br>
では次にコードを修正したAfterを表示します。

# After

```python
def create_model(X_train, y_train, X_test, y_test):
    input_tensor = Input(shape=(X_train.shape[1],))
    x = layers.Dense({{choice([128, 256, 512])}}, activation="relu", kernel_regularizer = regularizers.l2({{choice([0.01, 0.001, 0.0001])}}))(input_tensor)
    x = layers.Dropout({{uniform(0, 1)}})(x)
        :
```

{{}}のchoiceの扱い方に注目してください。

```python
{{choice[128, 256, 512]}}
{{choice([128, 256, 512])}}
```

このようにchoiceに( )をつけていないと、先程のエラーがでてしまいました。
<br>
このエラーは、

```
TypeError                                 Traceback (most recent call last)
<ipython-input-55-c060629fd2f2> in <module>
      7         max_evals=5,
      8         trials=trials,
----> 9         notebook_name="sample_notebook"
     10 )
     11 
```
このようにメイン関数内[optim.minimize( )]でエラーを指摘されるので、どこに不具合があるのか特定しづらいです。<br><br>

非常に単純なミスから招いたエラーですが、エラーコードを読んでもどこが間違っているのかわかりませんでした。

もし私と同じようなエラーが出た場合はまず、関数の表記が間違っていないか確認してみると良いと思います。

# 参考サイト
[【GitHub】TypeError: 'function' object is not subscriptable](https://github.com/maxpumperla/hyperas/issues/147)

# Keras での書き方

下記のソースコードは、先程のAfterのソースコードと同じです。<br><br>
（モデルに変換する部分は表示していないので厳密には同じとは言えませんが、モデルの構成としては同じなのでご了承お願いします。）

```python
from tensorflow.keras import models
from tensorflow.keras import layers
from tensorflow.keras import regularizers

def create_model(X_train, y_train, X_test, y_test):
    model = Sequential()
    model.add(layers.Dense({{choice([128, 256, 512])}}, activation="relu", kernel_regularizer = regularizers.l2({{choice([0.01, 0.001, 0.0001])}}), input_shape=(X_train.shape[1],))
    model.add(layers.Dropout({{uniform(0, 1)}})
           :
```
MySQLの全文検索で文字数の少ない単語や頻出単語もインデックスさせたい

MySQL5.7 で InnoDB を利用して全文検索インデックスを張った。しかし、登録されているにも関わらず、下記クエリでレコードが引っかからない。

```sql
`SELECT `entry_items`.* FROM `entry_items` WHERE MATCH(`entry_items`.`item`) AGAINST(('+get +rid +of') IN BOOLEAN MODE);`
```

調べてみると、下記のパラメータが影響しているようだ。

- `innodb_ft_min_token_size`
- `innodb_ft_server_stopword_table`

# innodb_ft_min_token_size

`innodb_ft_min_token_size`は、インデックスする最小の単語文字数を指定する。デフォルトは3文字。

- [MySQL :: MySQL 5.7 Reference Manual :: 14.15 InnoDB Startup Options and System Variables](https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_ft_min_token_size)

今回の例だと、of が2文字なのでインデックスされない。インデックスされていない文字を`+`で必須条件にしているので`select`できなかったようだ。

# innodb_ft_server_stopword_table

`innodb_ft_server_stopword_table`は、特定の単語をインデックスしないように指定する機能。

- [MySQL :: MySQL 5.7 Reference Manual :: 14.15 InnoDB Startup Options and System Variables](https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_ft_server_stopword_table)

デフォルトで指定されている単語は、`INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD`にある。

```
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD;
+-------+
| value |
+-------+
| a     |
| about |
| an    |
| are   |
| as    |
| at    |
| be    |
| by    |
| com   |
| de    |
| en    |
| for   |
| from  |
| how   |
| i     |
| in    |
| is    |
| it    |
| la    |
| of    |
| on    |
| or    |
| that  |
| the   |
| this  |
| to    |
| was   |
| what  |
| when  |
| where |
| who   |
| will  |
| with  |
| und   |
| the   |
| www   |
+-------+
36 rows in set (0.01 sec)
```

of が含まれているので、今回のケースではインデックスされない。今回は空のテーブルを作り、そのテーブルを見るように指定した。

```sql

CREATE TABLE `stopwords` (
  `value` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
```

`innodb_ft_min_token_size`と合わせて、`mysql.cnf`に書く。`innodb_ft_server_stopword_table`の development はデータベース名、stopwords はテーブル名。

```my.cnf
[mysqld]
innodb_ft_min_token_size = 1
innodb_ft_server_stopword_table = 'development/stopwords'
```

`my.cnf`を編集後、再起動して、対象のテーブルを reindex すれば検索できるようになる。
golangci-lintをTUIから操作する

## TL;DR

![golintui.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137903/47500355-f20c-1a92-16a4-f0f387df81a6.gif)
「linterの選択〜コード修正まで」を一貫して行えるTUIツールである[golintui](https://github.com/nakabonne/golintui)を作った話。

## はじめに
Go言語の好きなところは？と聞かれたら、いくつか理由がありますが「linterを作りやすいこと」は間違いなく上位に入ります。Go言語が提供する強力かつシンプルなAPIのおかげで数々のlinterが乱立しているわけですが、[golangci-lint](https://github.com/golangci/golangci-lint)を使うことでそれらをまとめて実行することが可能です。
そのgolangci-lintを直感的に扱えるTUIツールを作ったので、本記事ではそのツールの紹介をしたいと思います。


## モチベーション
以前から以下のニーズが筆者の中にありました：

- 気軽に色々なlinterを実行したい
- 解析するパッケージを気軽に選択したい
- linterから報告されたissueを一覧表示して、必要なとこだけサクッと直したい

**気軽に色々なlinterを実行したい**
golangci-lintで公式にサポートされているlinterは執筆時点でも50近くあり、それらが何をチェックしてくれるのかを全て把握するためには一定の労力を要します。挙動を見るためにはそれぞれenableしていく必要があるのですが、いちいち設定ファイルやコマンドライン引数を書き換えるのは面倒です。

**解析するパッケージを気軽に選択したい**
筆者が携わるプロジェクトでは、ビルドシステムにbazelを採用しており、構文解析以上の解析を必要とするlinterを全体に対して実行することが出来ないという悩みがありました。そこで、高度な解析を実行することが出来るパッケージだけをピックアップして実行するということを簡単に行えるUIが必要になりました。

**linterから報告されたissueを一覧表示して、必要なとこだけサクッと直したい**
定期的にコード全体の問題を直していきたいので、ローカルでターミナル上で実行していたのですが、これが面倒。肉眼で問題のある行を確認して手動でファイルを開いていく作業は耐え難いものでした。

これらの要望を叶えるために、「linterの実行〜該当ファイルを行指定して開く」を一貫して行えるTUIツールを作りました。

## クイックスタート

とりあえず触ってみたいという方は以下の手順で実行してみて下さい。

1. [お好きな方法でインストール](https://github.com/nakabonne/golintui/blob/master/README.md#installation)
1. `$ export LC_CTYPE=en_US.UTF-8`
1. `$ cd {YOUR_GO_PROJECT}`
1. `$ golintui`
1. `r`を押下してlinter実行
1. 直したいissueを選択して、`o`を押してファイルを開く

## 各パネルの使い方

### Linters
![linters.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137903/a8c821d1-5935-26c6-61f2-4f7923960e39.png)

赤枠で囲った一番左のパネルでは`Space`を押すことでlinterのenable/disbleを切り替えることが出来ます。デフォルトではカレントディレクトリで有効になっているlinterが選択されています。

注意：もし設定ファイルにて`disable-all: true`を指定している場合は、設定ファイルでenableに指定しているlinterをUI上でdisableすることは出来ません。これは、`disable-all`オプションと`disable`オプションを併用できないようにgolangci-lint側で制御されているためです。

### Source Files
![source_files.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137903/c84b9477-5d6c-407d-dc0a-d04755b582cc.png)

赤枠で囲った真ん中のパネルでは、解析する対象となるディレクトリを選択できます。選択されたディレクトリは再帰的に解析されます。何も指定しない場合はカレントディレクトリが再帰的に解析されます。つまり`./...`が渡されるということです。

ここまできたら準備OKです。`r`を押してlinterを実行してみましょう。

### Results
![results.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137903/e26f1f49-a398-b10d-6700-384aa297fe2d.png)

一番右のパネルには実行結果がlinter毎にまとめて表示されます。メッセージの上で`o`を押すと`golintui`は一時中断し、エディタでファイルを開きます。そしてエディタによっては該当の行にカーソルが移動します。
デフォルトでは環境変数`$EDITOR`に設定されているエディタコマンドを使ってファイルを開きますが、`$GOLINTUI_OPEN_COMMAND`にコマンド設定することで変更することも出来ます。例えばVSCodeユーザーの場合は：

```bash
export GOLINTUI_OPEN_COMMAND="code -r"
```

また前述したように、サポートされてるエディタの場合は該当行を指定してファイルを開きます。現在サポートされているのは以下のエディタです。もしお使いのエディタが無い場合はissueやPRを投げてもらえると都度対応します。

- vim(vi)
- emacs
- VSCode

## リポジトリ
命名: go + lint + TUI = golintui
Github: https://github.com/nakabonne/golintui

## ロードマップ
とりあえず最低限の機能を作って公開したので、もし需要がありそうだったら色々な機能強化を考えています。なのでもし使いたいと思った場合は、今記事にLGTMして頂くなりリポジトリにStarをつけて頂くなりのリアクションをして頂けると嬉しいです。

- windowsサポート
- 色々なエディタサポート
- 小さな画面でもlinterからのメッセージが読めるように、カーソル下の文字を別パネルに表示
- 各パネルで検索機能
- lintersの詳細をmodalで表示
- issueの対象行を別パネルに表示
- issueを色々な条件でまとめる
PMP試験に出てくる(4.2) Develop Project CharterのITTOを覚えよう

# (4.2) Develop Project Management Planとは
プロジェクト統合管理の7つのプロセスにある`プロジェクト管理計画の作成`プロセスのことである。

- [プロジェクト統合管理の7つのプロセス](https://qiita.com/Yumenoshima/items/81eab7a0000302341abd)

## (4.2) Develop Project Management PlanはPMBOKガイドのどこに出てくるか
PMBOKガイド`82ページ`の`4.2`に出てくるよ！

# ITTOとは
プロセスに対するインプット、ツールと技法、アウトプット(成果物)!

## (4.2) Develop Project Management PlanのITTOのI(インプット)
- Project Charter
    - テンプレート例：https://templatearchive.com/project-charter/
- Outputs from other processes
- Enterprise environmental factors
- Organizational process assets

## (4.2) Develop Project Management PlanのITTOのTT(ツールと技法)
- Expert judgement
- Data gathering
- Interpersonal and team skills
- Meetings

## (4.2) Develop Project Management PlanのITTOのO(アウトプット)
- Project management plan
    - テンプレート例：https://www.stakeholdermap.com/project-templates/project-management-plan-template.html

# まとめ
(4.2) Develop Project Management PlanプロセスのITTOを覚えて、インプットとアウトプットの成果物テンプレートも押さえよう！

----
以上
ソフトウェアテストの種類

# 何をテストするのか
プログラムは基本的に「入力、出力、計算、データ保存」の四つしか行わないのでこれをテストすれば良い

# 種類
ソフトウェアテストには大きく分けてホワイトボックステストとブラックボックステストの二種類ある

## ホワイトボックステスト
- 内部構造を分解してテストする

ー制御パステストー
制御フローの変化を全てテストする
例：あるメソッドでif文でtrueの処理とfalseだった時のその後の動きをそれぞれテストする
ーーーーーーーーー

論理構造の正しさのみテストするため、ソフトウエアのしようが間違っていることから起きるバグは発見できない
また、テストの作成に莫大な時間がかかる

## ブラックボックステスト
- メソッドやクラスなどの単位で入出力だけをテストする

サイクルが早く、テストが時間費用的に実装できないということがない
TDD（テスト駆動開発）がそれにあたる
　テストを書きそれが成功するようにコードを書いていく
　そして最後にリファクタリングする
VSCode最低限覚えること備忘録

# 基本

- コマンドパレットが開く: `⌘` + `p`
- 左側のファイル一覧的なのの開閉: `⌘` + `b`
- ファイル検索: コマンドパレットを開いて、file名を打ち込む
- ファイルを閉じる: `⌘` + `w`
- ターミナルの開閉: `⌘` + `` ` ``

# 個人のSettings

コマンドパレットを開けてから以下を打って Open Settings (JSON)を開く

```
> Preferences: Open Settings (JSON)
```

![Screen Shot 2020-05-09 at 12.57.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/435d9786-f482-b8ba-35e9-4c4766acee64.png)

この中に個人の設定が入ってるので、必要に応じて設定を入れる

例:

```
{
    "editor.formatOnPaste": true,
    "editor.formatOnType": true,
    "files.autoSave": "afterDelay",
    "editor.formatOnSave": true
}
```


# その他

## Terraform

- [Terraform](https://marketplace.visualstudio.com/items?itemName=mauve.terraform) のインストール

- lintを入れておく (mac)

    ```
    brew tap wata727/tflint
    brew install tflint
    ```

format on saveと合わせておけば、保存時にFormatかけてくれるようになって便利
【AWS】S3+CloudFrontで静的サイトをホスティング + LambdaでBASIC認証つける

何番煎じかわかりませんが備忘録兼ねて…

[前回の記事](https://qiita.com/duplicate1984/items/3a4d93a2e9bb5fcf54d1)でAmazon ConnectのCCPをカスタマイズしてWebページを作成しました。
Amazon Connect Streamsの仕様により、httpsでホスティングしなければいけないので、
パブリックアクセスを制限したS3にWebページを配置、CloudFrontを経由することでHTTPSによるアクセスを必須とします。
また、ついでにLambdaでBASIC認証を設定します。

※2020/5/13　追記
紹介している方法ではlambdaのバージョンを発行して、トリガーにcloudfrontを設定する、などやっていますが、
現在はlambdaの「アクション」から「lambda@edgeへのデプロイ」でcloudfrontのトリガー設定などをいっぺんにできます。
実装する順としてはs3→cloudfront→lambdaとすると、コンソールの移動とか少なく楽かと思います。


#まずS3とかCloudFrontってなに？
AWS初心者なのでまずここからでした。

###S3
Amazon Simple Storage Service
一言でいうとクラウドストレージサービス。安価で容量無制限、高い堅牢性を謳う。
静的Webサイトを配置して公開したり、ログファイルや諸々のデータをバックアップするなどユースケースは幅広い。
Webサイトを配信する際はCloudFrontを経由することが推奨されており、
クラウドデザインパターンの「[CDP:Cache Distributionパターン](http://aws.clouddesignpattern.org/index.php/CDP:Cache_Distribution%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)」に当てはまる。

[公式の概要](https://aws.amazon.com/jp/s3/)
[Black Beltのスライド](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-amazon-s3)

###CloudFront
コンテンツ配信ネットワークを提供するサービス？？？よくわからん。
各リージョンに配置されるS3などとは違い、物理的によりユーザに近い場所（エッジロケーション）に配置される、
キャッシュ機能を持ったプロキシのようなもの？だと思えばいい？？
ここでいうエッジロケーションはあとで出てくるLambda@EdgeのEdgeとも意味的には同じで、
CloudFrontと同様エッジに配置されCloudFrontからのトリガーにより実行されるLambda関数を指している。

っていう理解でいいですかね？

[公式の概要](https://aws.amazon.com/jp/cloudfront/)
[Black Beltのスライド](https://www.slideshare.net/AmazonWebServicesJapan/20190730-aws-black-belt-online-seminar-amazon-cloudfront)


#S3+CloudFrontによるホスティング+LambdaでBASIC認証つける
こちらの記事の通りにやればいける（説明放棄）
[Lambda + CloudFront + S3でBasic認証する](https://qiita.com/takahashi-kazuki/items/688f5f736bd76682483c)

コンソールのUIとか変わってる部分があるものの、基本は上の記事の通りでいいと思います。
今回S3に配置するのは、前回作成したWebサイト、Amazon Connect Streams APIですが、
すべてルートにフラットに置きました。だからなのか、S3で「Static website hosting」は無効のままでもアクセスできました。
エラー時のリダイレクトなどが必要になった場合には、ここを有効にする必要はありそうです。

加えて注意したいのはLambdaを作成するリージョンは「us-east-1　米国東部（バージニア北部）」にしておくことですね。
また、Lambda@Edgeでは環境変数を使用できません。自作の隠しファイルをアップロードして、それを読み込むなど、いろいろ工夫が必要になります。
一方で、Webアクセス時に必ず実行されるなどの理由でタイムアウトの制限も厳しいようです。（そもそもUXに直結するのでなるべく軽く早くすべきですが）


#実装中に思ったこと
CloudFrontのデプロイなど時間がかかるところがあって、設定と確認を何度もやっていると効率が悪くなります。
一つ一つちゃんと確認しながらやって一発で終わらせたいですね。
システムが遅いと感じた時に遅延発生してないか調べる

実務でNWの遅延を切り分けしたので記録

#構成
遠隔地の拠点が複数あり、大体同一で下記のような感じ
端末(windwos)-SW(cisco)-RT-(広域)-RT-SW-サーバー

#事象
ある端末で使っているシステムが遅い

#切り分け
###1 別の拠点の発生状況
問題なし

###2 他のSW配下の端末 
問題の拠点はRTの配下に別のSWも存在しているが、ほかのスイッチ配下のPCは遅延が発生していない

#怪しいのは
この時点で、問題の拠点の問題のRTポート以降ということがわかる。
RTの単一ポートの障害により遅延が発生している可能性は限りなく低いので、スイッチPC間に焦点を当てて調べることにした。

#調べてみる
では、どの程度の遅延が発生しているのか。
ciscoのSWにログインして、端末当てにpingを飛ばしてみる。
普通に飛ぶ。
サイズを大きくするとどうか。

```bat
ping xxx.xxx.xxx.xxx size 5000 repeat 100
```
タイムアウト。まったく飛ばない。
そこからサイズをだんだん小さくしていくと、sizeが小さくなるにつれて成功率が上がり、300byteでsuccessが98/100で200byteでようやく100/100。

#通常パケットサイズはどのくらいか
200byteではパケットは普通に飛ぶのだが、300byte以降だと失敗している。
通常のパケットサイズどのくらいなのか。
端末の設定でMTU値というのがあり、Widnwosだと下記コマンドで調べれる

```bat
C:\Users\test>netsh interface ipv4 show interfaces
Idx     Met         MTU          状態                 名前
---  ----------  ----------  ------------  ---------------------------
 19          50        1500  connected     Wi-Fi
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 20          25        1500  disconnected  ローカル エリア接続* 1
 11          65        1500  disconnected  Bluetooth ネットワーク接続
  4          25        1500  disconnected  ローカル エリア接続* 2
```
だいたいの値が1500になっていることがわかる。
これはイーサネットのパケットサイズの最大が1500だから。
（ちなみに光ファイバは4352byte）

#結果
ということで端末スイッチ間で遅延が発生していることがわかった。
どの程度遅延が発生しているかは、sizeを変えながらpingを飛ばしグラフなどにすれば見やすいかなと思う。
PMP試験に出てくる(4.1) Develop Project CharterのITTOを覚えよう

# (4.1) Develop Project Charterとは
プロジェクト統合管理の7つのプロセスにある`プロジェクト憲章の作成`プロセスのことである。

- [プロジェクト統合管理の7つのプロセス](https://qiita.com/Yumenoshima/items/81eab7a0000302341abd)

## (4.1) Develop Project CharterはPMBOKガイドのどこに出てくるか
PMBOKガイド75ページの4.1に出てくるよ！

# ITTOとは
プロセスに対するインプット、ツールと技法、アウトプット(成果物)!

## (4.1) Develop Project CharterのITTOのI(インプット)
- Business documents
    - Business case
        - テンプレート例：https://www.smartsheet.com/business-case-templates
- Agreements
- Enterprise environmental factors
- Organizational process assets

## (4.1) Develop Project CharterのITTOのTT(ツールと技法)
- Expert judgement
- Data gathering
    - Brainstorming
    - Focus groups
    - Interviews
- Interpersonal and team skills
    - Conflict management
    - Facilitation
    - Meeting management
- Meetings



## (4.1) Develop Project CharterのITTOのO(アウトプット)
- Project charter
    - [プロジェクト憲章](https://qiita.com/Yumenoshima/items/d8e0601e4519da63c43c)
    - テンプレート例：https://templatearchive.com/project-charter/
- Assumption log
    - テンプレート例： https://www.projectmanagementdocs.com/template/project-documents/assumption-log/#axzz6Luh39v5E
    - テンプレート例：https://www.stakeholdermap.com/project-templates/project-assumptions-template.html


# まとめ
(4.1) Develop Project CharterプロセスのITTOを覚えて、インプットとアウトプットの成果物テンプレートも押さえよう！

----
以上
【簡潔】HTMLのimgタグについて

##HTMLのimgタグについて

この記事ではHTMLのimgタグについて簡潔にサクッと学習することができます。

それでは見ていきましょう。

---
###【imgタグについて】
下記のようなコードがあったとします。

```index.html
<img src="img/tvxq_header.jpg">
```

これについて分解して解説します。

まず`img`ですが、このタグは終了タグを持たないので**空要素**と呼ばれたりします。

次に`src`は source の略で後に続けて画像ファイルを指定します。
今回で言う画像ファイルは`img/tvxq_header.jpg`にあたります。
次に`src`の後に`=`を続けます。
最後に続けて`"`で画像ファイルを囲んで**要素**の完成です。

`src`は**属性名**にあたり、`"img/tvxq_header.jpg"`は属性の値にあたります。
また、それら２つを合わせたものを**属性**と呼びます。
今回で言うと`src="img/tvxq_header.jpg"`にあたりますね。

以下にまとめました。↓

| src      |"img/tvxq_header.jpg"|  src="img/tvxq_header.jpg"  |
|:---------:|:--------------------:|:---------------------------:|
| 属性名    |     属性の値         |             属性             |



###【属性の値の指定】
**属性の値**の指定ですが
<img width="673" alt="vscode_img_tvxq.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516627/ccf2736c-757d-2773-b39a-57e26c3af659.png">

このようなファイルの構造だったとします。
`index.html`と同じ階層にあるのが`imgフォルダ`ですね。
`tvxq_header.jpg`は`index.html`の１つしたの階層にあることになります。
よって今回の**属性の値**は`"img/tvxq_header.jpg"`になります。

もし仮に、`imgフォルダ`が無くて`index.html`と同じ階層に`tvxq_header.jpg`があった場合は、`src="tvxq_header.jpg"`になります。


最後に今回のコードをブラウザで表示したらどうなるかを載せておきます。
<img width="804" alt="tvxq_header_screenshot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516627/848ad23f-fa34-0e62-3c34-54897ecb93e1.png">
---

記事を読んでいただいてありがとうございました。
CentOS7のSSL対応（Apache）

こすられまくっている内容とは知りつつも、導入できたのでまとめずにはいられない。

## 1. mod_sslを導入

以下のコマンドで導入します。

```bash
yum install -y mod_ssl
```

インストールできたらhttpdを再起動。

```bash
apachectl restart
```

## 2. certbotを導入

導入は公式に書いてあります。

https://certbot.eff.org/lets-encrypt/centosrhel7-apache

`certbot --apache`で、正しい入力をしているにも関わらず、以下のようなエラーが出力される場合があります。

```
Unable to find a virtual host listening on port 80 which is currently needed for Certbot to prove to the CA that you control your domain. Please add a virtual host for port 80.
```

これは仮想ポートの設定がされていないためです。

以下のサイトを参考に`/etc/httpd/conf/httpd.conf`を修正します。

https://hacknote.jp/archives/48748/

```bash
echo 'NameVirtualHost *:80

<VirtualHost *:80>
ServerAdmin root@hogehoge
DocumentRoot /var/www/html
ServerName hogehoge
</VirtualHost>' >> /etc/httpd/conf/httpd.conf
```

`hogehoge`を自分のサーバードメインに修正するのを忘れずに。

## 3. sslの設定

certbotの導入後は、`/etc/httpd/conf.d/ssl.conf`を編集する必要があります。（ここ大事）

以下のサイトを参考。

http://dotnsf.blog.jp/archives/1075580031.html

## 4. cronの設定

証明書の更新を自動化します。

ここでは毎月1日と15日の4時に証明書の更新を行うように設定します。

`/etc/crontab`を編集します。

```text
00 04 01 * * certbot renew && systemctl restart httpd
00 04 15 * * certbot renew && systemctl restart httpd
```

以上です。

お疲れさまでした。
github　VScodeを通してプルリクエストができない場合の対処法

下のURLの質問のような問題（comparing changesが出てきて、プルリクエストができない）が解決したので、まとめる。
https://teratail.com/questions/43062


<h2>はじまりは...</h2>
XAMPPが動かなくなり再インストールをしたらVScodeとGitの連携が切れており、再連携させることに。

<h2>解決法</h2>

①<h5>VScodeは新しいウィンドウを開いておく（Ctrl + Shift + N)左上のファイルから新しいウィンドウを選択。もしくは、ファイルからフォルダーを閉じる(Ctrl + K F)でも可</h5>

② ソース管理（Ctrl + Shift + G)の中にあるリポジトリのクローンを選択。

③　リポジトリURLを指定。または、リポジトリソースを選択。または、GitHubから複製でも可。


リポジトリURLってなに？という人にはこれ！
https://qiita.com/s56258/items/68e5e2c758bf77016952

④　クローンすると、クローンしたリポジトリを開きますかを開くと出てくるので、開くと押せば今まで作成していたファイルたちが現れる。

![2020-05-09 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634483/271458f9-0b46-abd3-ab33-c98885a09cf3.png)


途中リポジトリの場所を選択する場面があったが、hotdocsを選べば問題ないと思う。

<h2>最後に</h2>
間違えやすい場所は①を忘れることで、
フォルダーを開いてからやってもうまくいかなかった。
teratailの回答にあるように、baseブランチとcompareブランチの間に差分がないともいえるかもしれない。