OmniAICreator/Qiita-1.07M huggingface dataset:
任意次元空間における三角形の内心の簡単な求め方

#目的

外心を求めた[前回の記事](https://qiita.com/fockl/items/09544073d4cf81bb9bc9)に引き続き，怒りに任せて任意次元空間における三角形の内心の簡単な求め方と実装を書きます．

#方針

三角形の3頂点を$A, B, C$とし，適当な原点$O$を取ります．
求める点をPとすると，とある実数$x, y, z$を用いて

```math
\vec{OP} = x \vec{OA} + y \vec{OB} + z \vec{OC} \\
(x+y+z=1)
```

と書けます．この式を点$A$からのベクトルに書き直します．

```math
\vec{AP} = y \vec{AB} + z \vec{AC}
```

ここで注意することは，

>内心は3つの角の二等分線の交点である。

ので(例えば[Wikipedia](https://ja.wikipedia.org/wiki/内接円)参照)，適当な実数$k$を用いて

```math
\vec{AP} = k \frac{\vec{AB}}{\|\vec{AB}\|} + k \frac{\vec{AC}}{\|\vec{AC}\|}
```

と書ける必要があります．そのためには

```math
y\|\vec{AB}\| = z\|\vec{AC}\|
```

が必要です．
同様に

```math
x\|\vec{AC}\| = y\|\vec{BC}\| \\
x\|\vec{AB}\| = z\|\vec{BC}\|
```

が成り立ちます．これは

```math
\left(x, y, z\right) = \frac{1}{\|\vec{AB}\| + \|\vec{BC}\| + \|\vec{AC}\|} \left(\|\vec{BC}\|, \|\vec{AC}\|, \|\vec{AB}\|\right)
```

とすれば全て成立します

#実装

```C++
    vector<double> incenter(vector<double> P1, vector<double> P2, vector<double> P3){
      vector<double> ans(D, 0.0);
      double AB2=0.0;
      double AC2=0.0;
      double BC2=0.0;
      for(ll i=0; i<D; ++i){
        AB2 += (P2[i]-P1[i])*(P2[i]-P1[i]);
        BC2 += (P3[i]-P2[i])*(P3[i]-P2[i]);
        AC2 += (P3[i]-P1[i])*(P3[i]-P1[i]);
      }
      AB2 = sqrt(AB2);
      BC2 = sqrt(BC2);
      AC2 = sqrt(AC2);
      for(ll i=0; i<D; ++i){
        ans[i] = (BC2*P1[i]+AC2*P2[i]+AB2*P3[i])/(AB2+BC2+AC2);
      }

      return ans;
    };
```
Azure CLIで操作する（WebApps編）

## Azure CLIを利用してスケールアップ/ダウン、スケールアウト/インさせる。
### Azure CLIとは
Windows、MacOS、Linuxなどクロスプラットフォームで利用出来るAzureをコマンドラインで操作出来るツールです。
ダウロードは下記のページから
https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest

1. Azureにログイン
az login
ログインするとサブスクリプションIDなどの情報が表示されます。
※プロキシサーバがある環境では、必要に応じてプロキシを環境変数に設定して下さい。
一時的な場合は、下記のコマンドを入力
set HTTP_PROXY=http://username:password@proxy.contoso.com:8000
set HTTPS_PROXY=http://username:password@proxy.contoso.com:800

2. Azure CLIのバージョンを確認する。
az --version
![cli2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/86d0fd67-bb3d-b67d-c0e3-7de7c4c0aed7.png)

3. 対象のWebAppsと紐づくプランを確認する。
az webapp list -g リソースグループ名 -o table
![cli1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/6c62a854-5701-4193-a8d9-8a8ee3e52636.png)

4. 現状のプランサイズを確認する。
az appservice plan show -g リソースグループ名 -n AppServicePlan名 --query "sku" -o json

5. スケールアップ/スケールダウンさせる。
az appservice plan update -g リソースグループ名 -n AppServicePlan名 --sku S2
※SKUのサイズを選択することでスケールアップ、スケールダウンになります。
　選択出来るサイズは下記のページから確認して下さい。
　https://azure.microsoft.com/ja-jp/pricing/details/app-service/windows/
![cli3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/6167dbed-f9c2-172e-6498-0ee0cbdacd62.png)

6. スケールアップ/スケールダウンされたことを確認する。
5.でも確認出来ましたが、表示される情報が多いため下記のコマンドでskuのみ確認すると分かりやすいです。
az appservice plan show -g リソースグループ名 -n AppServicePlan名 --query "sku" -o json

7. 手動スケールアウト/スケールインさせる。
az appservice plan update -g demo -n app-plan --set sku.capacity=2
"sku.capacity"で稼働させたいインスタンス数を指定します。
![cli4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270447/1e2e7db8-39d6-1e2b-9c47-096fdb0eb87e.png)

8. その他
WebAppsに関するコマンド
https://docs.microsoft.com/en-us/cli/azure/webapp?view=azure-cli-latest
AppServicePlanに関するコマンド
https://docs.microsoft.com/en-us/cli/azure/appservice/plan?view=azure-cli-latest
JavaScript勉強の記録その11: filterを利用して配列の要素にフィルタをかける

#filterを利用した配列のデータにフィルタをかける

配列の各要素になんらかの条件をつけてフィルターをかけたい時があるかと思いますが、そのような時にはfilterが役立ちます。
以下の例では２の倍数の数字の場合はtrueを返し、trueの場合はevenNumbersに配列の形で代入し直しています。

```index.js
const numbers = [1, 50, 40, 90];

const evenNumbers = numbers.filter(function(number){
  if (number % 2 === 0) {
    return true;
  } else {
    return false;
  }
});
console.log(evenNumbers);
//=> [50, 40, 90]
```

filterもアロー関数を利用することで大幅に短縮して記述することができます。
if文の部分もざくっと短縮して書くことができます。

```index.js
const numbers = [1, 50, 40, 90];

const evenNumbers = numbers.filter(number => number % 2 === 0);
console.log(evenNumbers);
//=> [50, 40, 90]
```
UnityEditorでの言語設定エミュレーション用のスクリプト

## やりたいこと
Unityでは、Application.systemLanguageでシステムの言語設定が取得できます。
UnityEditorで実行中はApplication.systemLanguageの値はOSの設定と同じになると思います。（※1）
しかし、このままだと言語を切り替えたときの動作の確認がやりにくいです。（検証のたびにOSの言語設定を変えないといけないため）
そのため、UnityEditorで実行した時はエディタで設定した言語を読み取り、ビルドしたアプリではシステムの言語設定を読み取るようなスクリプトを作成しました。

※1 macOS Catalina / Unity2019.3.0f3 環境ではOSが日本語設定でもなぜかEnglishになります。
→ 2020/2/2 追記： もしかするとDevice Simulatorの設定で上書きされてるかも？（追記参照）

## スクリプト
```cs
using System;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

namespace HiiroHitoyo
{
    #if UNITY_EDITOR
    public class EmulatableLanguageSettings : SettingsProvider
    {
        static readonly string emulatedLanguageKey = "EmulatedLanguageKey";
        public EmulatableLanguageSettings( string path, SettingsScope scope  ): base( path, scope ) { }

        [SettingsProvider]
        private static SettingsProvider Create()
        {
            var path        = "Project/Language Emulation";
            var provider    = new EmulatableLanguageSettings( path, SettingsScope.Project );
            provider.keywords = new []{ "Language"};
            return provider;
        }
        public override void OnGUI( string searchContext )
        {
            var currentLanguage = emulatedLanguage;
            var lang = (SystemLanguage) EditorGUILayout.EnumPopup("Language", currentLanguage);
            EditorPrefs.SetInt(emulatedLanguageKey, (int) lang);
        }

        static public SystemLanguage emulatedLanguage => (SystemLanguage) Enum.ToObject(typeof(SystemLanguage), EditorPrefs.GetInt(emulatedLanguageKey, (int)Application.systemLanguage));
    }
    #endif

    public class EmulatableLanguage
    {
        #if UNITY_EDITOR
        static public SystemLanguage systemLanguage => EmulatableLanguageSettings.emulatedLanguage;
        #else
        static public SystemLanguage systemLanguage => Application.systemLanguage;
        #endif
    }
}
```

## 使い方
### 設定言語の読み取り方法
Application.systemLanguageの代わりに、EmulatableLanguage.systemLanguageを呼び出してください。

```cs
using HiiroHitoyo

public class Example
{
    public void test()
    {
        Debug.Log("Language = " + EmulatableLanguage.systemLanguage);
    }
}
```

### 言語設定方法
Edit -> Project Settings から Language Emulationタブを選択し、プルダウンから設定したい言語を選択したください。

### 注意事項
設定値をEditorPrefsで保存しているので、設定値はプロジェクトをまたいで変更されます。
設定をプロジェクト内で留めたい場合はEditorUserSettingsで保存するなどしてください。

### 動作確認環境
Mac OS 10.15.2
Unity 2019.3.0f3

## 2020/2/2 追記
Unity 2019.3 から使えるようになった、Device Simulator パッケージを使うと、言語設定をシミュレートできるっぽいです。（試してないからわからないけど）
GatsbyJSでgatsby-remark-audioプラグインを使う

# gatsby-remark-audio とは
Gatsby.jsで、markdownファイルの中にオーディオファイルを置けるプラグイン
マークダウンの中で `` `audio: <URL>` `` と書くと、 HTMLの`<audio>`タグに変換してくれる

公式はここ: https://www.gatsbyjs.org/packages/gatsby-remark-audio/

こんな感じになるよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430849/62e3e8bb-f3d4-4032-6fc9-5adac019b116.png)

# 使い方

1. npmかyarnでインストールする
2. `gatsby-config.js`をいじる
3. 音声ファイルを`/static`ディレクトリ下に置く
4. マークダウンの中で `audio: /bar.wav`みたいに書く

## 1. パッケージのインストール 

npmまたはyarnを使って入れます
プロジェクトで使ってる方にあわせてね

`npm install gatsby-remark-audio`
または
`yarn add gatsby-remark-audio`

## 2. `gatsby-config.js`をいじる
このプラグインに限らずGatsby.jsのプラグインでは、インストールしたあとに`gatsby-config.js`を書き換えます
`gatsby-config.js`はgatsbyプロジェクトがあるディレクトリのルート直下にあります (`package.json`とかと同じとこ）

書き換える内容は下のとおりで、

- `plugins`の下の
- `gatsby-transformer-remark`の下の
- `plugins`の下に

`gatsby-remark-audio`の設定をかきます



```js:gatsby-config.js
module.exports = {
  // 省略
  plugins: [
    // 省略
    {
      resolve: `gatsby-transformer-remark`,
      options: {
        plugins: [
          {
            resolve: "gatsby-remark-audio",
            options: {
              preload: "auto",
              loop: false,
              controls: true,
              muted: false,
              autoplay: false,
            },
          },
        ],
      },
    },
    // 省略
  ],
}
```

もしプラグインが読み込めてなかったら、↓をかくにんしてみてね

- pluginの中にまたpluginがあったりするので、ネストをミスってないか
- すでに`gatsby-transformer-remark`が入ってたら、↑のコードに変える

## 3. 音声ファイルを追加する

`/static`ディレクトリの中に直接ぶちこみます
入れたあとのプロジェクトのディレクトリ構造はこんなかんじ↓

```bash
my-gatsby-project
┗ public
┗ src
  ┗ pages  ┗ components
  ┗ templates
  # その他ソースコード
┗ static
  ┗ foo.wav # 追加した音声ファイル
┗ package.json
┗ gatsby-config.js
```

## 4. マークダウンの中で`audio`コードを書く

書き方は
`` `audio: <URL>` ``

例えばこう↓

```md
# みだし

これはWAVファイルです

`audio: /foo.wav`
`audio: https://fairu-hosuto.com/hoge.mp3`
```

音声を`/static`フォルダの中に入れた場合はURLのとこを `/<ファイル名>`にします
外部サイトとかのURLだったら、そのままいれる

`/static`の中にあるけど、マークダウンの中のファイル名は`/`で始まるので注意です

# まとめ

- `gatsby-remark-audio`はマークダウンから`<audio>`タグをつくってくれる
- 公式docs: https://www.gatsbyjs.org/packages/gatsby-remark-audio/
『開眼！JavaScript』の正誤表

『[開眼！JavaScript 言語仕様から学ぶJavaScriptの本質](https://www.oreilly.co.jp/books/9784873116211/)』初版第8刷を購入した。
~~良書~~（と思っていたが、ちょっと物足りなさ過ぎかも）なのだが、誤りが多い。なのに、正誤表が無い。。。
オライリー・ジャパンさん、誤りを5年も放置しないでください。

## 正誤表
- 訳者まえがき
   - 8行目の「読み物の分量としてはの」は、「は」は不要。
- 7ページ
    - 最下行から次ページにかけての「インスタンスとみなされます」は、「インスタンスといいます」のほうが分かりやすい気がする。
- 19ページ
   - サンプルコード3行目の`var myString = null;`は、複製した変数に影響しないという意図からすると、`var`が無いほうが伝わりやすい。
- 19ページの訳注
 - 2行目の「([1 === '1'」は、「[」が不要か、または「]」が不足。
 - 4行目の「([1 == '1'」は、「[」が不要か、または「]」が不足。
 - 4行目の「等値演算子」は、「同値演算子」の誤り。
- 31ページ
    - 下部の[サンプルコードのJSFiddle](https://jsfiddle.net/jseja/x7Amr)は、なぜかJSフレームワークのMootools 1.3.2が有効になっており、それがために動かない。
- 32ページ
    - 下から2行目の「生成されたインスタンス」は「生成されたオブジェクト」の誤り？
- 40ページ
    - 下部のサンプルコード最下行の`myObject.0`は`myObject.123`の誤り。
- 60ページ
    - 3.6節2行目の「プロパティチェーン」は「プロトタイプチェーン」の誤り。
- 74ページ
    - 下から2行目の「bar()に格納」は、「barに格納」の誤り？
- 78ページ
    - 5.2節5行目の「引数渡した」は「引数として渡した」の誤り。
- 86ページ
    - 下から5,6行目の「プロパティ」は「メソッド」の誤り？
- 90ページ
    - 下部のサンプルコード下から2行目と次ページ3行目の`Object {foo = 'foo', bar = 'bar'}`は`Object {foo: 'foo', bar: 'bar'}`の誤り？
- 93ページ
    - サンプルコード2行目はif文なので末尾のセミコロンは不要。
- 96ページ
    - 7.2節のサンプルコードが不適切。ブロックスコープを持たないことを確認するなら下記のようなサンプルコードが望ましい。

~~~javascript
var foo = 1; // グローバル変数fooの値は1

if (true) {
    var foo = 2; // グローバル変数fooの値が2に変更される
    for(var i = 3; i <= 5; i++) {
        var foo = i; // グローバル変数fooの値がiの値に変更される
        console.log(foo); // 出力：3、4、5
    }
    console.log(foo); // ブロックスコープを持たないため、2ではなく5を出力
}
console.log(foo); // ブロックスコープを持たないため、1ではなく5を出力
~~~
- 97ページ
    - サンプルコード3行目の「グローバルスコープ」は「グローバルオブジェクト」の誤り？
- 99ページ
    - 7.5節2行目の「スープ」は「スコープ」の誤り。
- 103ページ
    - サンプルコード3行目の`var i;`を削除して、for文の初期化式で`for (var i = 0;`と宣言したほうがコードが分かりやすい。
- 112ぺージ
    - NOTEに「prototypeプロパティの値にはオブジェクトを設定することができます。プリミティブ値を設定使用した場合、その宣言は無視されます。」とあるが、下記のようにprototypeプロパティに1を設定したところ、そのまま反映されてしまったのだが？

~~~javascript
var myFunction = function() {}; // 関数を生成
myFunction.prototype = 1; // prototypeプロパティを追加し、1を設定
console.log(myFunction.prototype); // 空のオブジェクトではなく1が出力
~~~
- 116ページ
    - 8.8節5行目の「foo」は「Foo」の誤り。
- 117ページ
    - 訳注の下から3行目の「foo」は「Foo」の誤り。
- 130ページ
    - 上部のサンプルコードの4行目の`// 出力：'Object {color="blue"}'`は、`// 出力：'Object {color: "blue"}'`の誤り？
- 135ページ
    - サンプルコードの下から2行目の「出力：foo」は、「出力：'foo'」の誤り。

## 不足している内容
- 「変数の巻き上げ」も知っておくべきJavaScriptの癖だと思うのだが。
- thisについて、もっと掘り下げが必要。下記記事がとても役に立ちました。
    - https://qiita.com/takkyun/items/c6e2f2cf25327299cf03

## 雑感
本書はES3について書かれている。次の版ではES5にする予定だったようだ。
ES5も終わろうとしているのに、なぜか出版されていない。
分かりやすかったから、ES5版で読みたかったのに。。。
JavaScript勉強の記録その10: mapを利用した配列の操作

#mapを利用した配列の操作

配列の各要素になんらかの処理を加え、新しい配列を作りたい場合は、mapが便利です。
以下の例ではpricesの各要素に20を足して、新しい配列を作っています。

```index.js
const prices = [20, 30, 40];

const updatedPrieces = prices.map(price => price + 20);

console.log(updatedPrieces);
//=>[40, 50, 60]
```

#配列の要素に加えて、インデックス番号も一緒に取得する　
forEachと同じような使い方ですが（あまりこのような使い方はしないでしょうが）、第二引数を設定することでインデックス番号も取得することもできます。

```index.js
const prices = [20, 30, 40];

prices.map((price, indexNum) => console.log(`price: ${price} index: ${indexNum}`));

//=>price: 20 index: 0
//=>price: 30 index: 1
//=>price: 40 index: 2
```
GitHub Actions Pythonのcacheサンプル

![14541002696_1cc1d3c206.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/d36e12a8-3f70-4844-0acf-a1c1237b3737.jpeg)

■ [actions/cache](https://github.com/actions/cache)

GitHub Actionsでpipのキャッシュを使用する際のメモ

## pipのキャッシュ

OSごとのディレクトリは下記
(試してないですがUbuntuの場合は環境変数「XDG_CACHE_HOME」を指定することで任意のパスへキャッシュできるとのこと。)

``` bash
# Unix
~/.cache/pip

# macOS
~/Library/Caches/pip

# Windows
<CSIDL_LOCAL_APPDATA>\pip\Cache
```
## 使用方法

キャッシュを作成(使用するOSはubuntuを想定)

``` yaml
- uses: actions/cache@v1
  with:
    path: ~/.cache/pip
    key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
    restore-keys: |
      ${{ runner.os }}-pip-
```

キャッシュから復元

``` yaml
- name: Get pip cache
   id: pip-cache
   run: |
     python -c "from pip._internal.locations import USER_CACHE_DIR; print('::set-output name=dir::' + USER_CACHE_DIR)"

- uses: actions/cache@v1
  with:
    path: ${{ steps.pip-cache.outputs.dir }}
    key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
    restore-keys: |
      ${{ runner.os }}-pip-
```

ちなみに他の言語もそれぞれ公式が分かりやすようにサンプルを書いてくれていてとても簡単に導入できる。

[cache/examples.md](https://github.com/actions/cache/blob/master/examples.md)

requirements.txtに書かれているパッケージでもpipのキャッシュを使用したくないものについては別途「--no-cache-dir」をつけインストールする必要がある。

``` bash
$ pip --no-cache-dir install [パッケージ名]
```

## cache-hitしなかった際に行いたい動作を定義

[Skipping steps based on cache-hit](https://github.com/actions/cache#skipping-steps-based-on-cache-hit)

キャッシュヒットの有無はcache-hitというbool値で保持される。
ヒットしなかった場合はデプロイないし後続の処理を継続といった流れを簡単に実装できる。

## 参考資料

■ [pip install](https://pip.pypa.io/en/stable/reference/pip_install/#id40)
■ [依存関係をキャッシュしてワークフローのスピードを上げる](https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/caching-dependencies-to-speed-up-workflows)
■ [GitHub Actionsでキャッシュが使えるようになって嬉しい！](https://qiita.com/ngmr_mo/items/0576bfcea8c4487a6b47)
dockerfileについて調べてapache起動するまでのメモ

##はじめに
前回はDockerのコマンド操作を学ぶために主な操作の記事を書かせて頂きました。
他にもいろいろ調べていたらdockerfileなるのもがありそれを使用してイメージを作成するとのことでした。
見た感じ難しそうで抵抗があったのですが、そういうものこそ試していかないといけないと思いやってみましたので備忘録件まとめ用として記事にしてみたいと思います。

##dockerfielってなんぞ？
コンテナを作成する場合、docker hubから欲しいイメージを取得してコンテナを作成したり、最小限のイメージから自分で新しくミドルウェアを追加したものをイメージ化して展開したりするとたくさんの情報が出ていましたが、自分でイメージを一から作成する場合などに使用するファイルです。
dockerfileはベースとするイメージに対して行う操作を記載する。

##dockerfileを使用する利点

+ OSや各種ミドルウェアなどの設定をコードとして管理できる
+ 上記により細かく設定した環境を漏れなく簡単に再作成したり同一環境を用意したい人に配布できる。
+ jenkinsなどのCIツールを使用することでイメージ作成やコンテナのデプロイを自動化することもできる(らしい)

##書き方について
調べてみたのですが結構難しそうでした（笑）
まずは簡単にコードについて

+ FROM イメージ名 →ベースにするイメージを指定する
+ LABEL →管理用の情報などを記載する　バージョン情報やなにを作るためのdockerfileですよ的な
+ RUN →コマンド実行を命令するリターンキーの役割(こいつがコマンドを実行していく感じ)
+ CMD →コンテナ起動時にファイルやコマンドを実行する命令を記載する
+ ENV →環境変数を設定する

おおまかにはこんな感じでした。ほかにもたくさんありましたが、いったんこれくらいにしておきました。(覚える自信ない)

##実際に書いてみる
簡単にapache用のdockerfileを書いてみます。

```:dockerfile
FROM centos:centos7        #ベースになるイメージ指定
RUN yum -y update          #パッケージ更新
RUN yum -y upgrade         #更新、不要なもの削除(してくれるらしい)
RUN yum install -y httpd   #apacheインストール
RUN systemctl enable httpd #apache自動起動設定
EXPOSE 80                  #ポート開放
```

できたので上記ファイルを使用してイメージの作成をしてみます。

```
$ docker build -t apache .
```
ずーーーーと実行されて終わったみたいなのでイメージができてるか確認してみます。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
apache              latest              827d4f21614f        15 seconds ago      599MB
```

ありました！apacheという名前で作成したのでできています。

##イメージからコンテナ作成して起動
起動


```
$ docker run --privileged -d -p 80:80 apache /sbin/init
8a86bb505eca2b7143ac70a1033e34205ffbbccf48a3ca89e96031194b00ffd9
```

確認
しっかり起動しているのがわかりました！

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
8a86bb505eca        apache              "/sbin/init"        9 seconds ago       Up 8 seconds        0.0.0.0:80->80/tcp   sweet_hodgkin
```

##実際にアクセスして確認！！
![20200113001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564493/a88bd949-c89c-b67f-c325-e6711ed3f98e.jpeg)

テストページが表示されたので問題なさそうです！！！

ちなみにcentos7の場合はコンテナの起動を上記のようにしないとうまくapacheがうまく起動しないようです。(めっちゃはまった)
ここら辺の起動の仕方とコンテナ内の動きについては調べなおして書かせていただければと思います。

##まとめ

+ Dockerfileはベースのイメージに対して行う命令を記載するもの
+ 構築過程のコマンドや起動時の命令もコードとして管理できる
+ 実行するだけで何回でも同じ環境をミスなく作れる
+ まだまだ勉強しないとdockerを扱って環境構築は厳しそうw
catalinaにpyenvでpython2.x系インストール

エラー
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

これでうまく行った
2.7.2 とかだと何やってもだめだったので、マイナーバージョン上げてみるといいかも

```
$ CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install 2.7.17
```
Shibboleth IdPをCASサーバとしても利用する

# 前説
個人的には全く好きではないのだが、一部界隈では圧倒的な存在感を持っている[Shibboleth](https://wiki.shibboleth.net/confluence/display/CONCEPT)。このShibboleth IdPを[CAS](https://www.apereo.org/projects/cas)サーバとしても利用できるように設定する。

# CASで利用できるようにする理由
Shibbolethの特徴はIdPとSPで相互に信頼関係を築くことと、eduPersonXXXの形式で多くの属性を渡すことができることにある。しかしながらIdPとSPで相互にメタデータの作成と交換という作業が必要になってくる。
例えばShibboleth IdPの認証機能を組織内で簡易に利用したいというようなニーズがあったとすると、Shibbolethは使いにくい。CASを有効にしておくことで、利用者には通常のShibboleth IdPで認証を行わせながら、CASサーバとしても利用することができる。
CASサーバとして利用する場合のデメリットとしては、ユーザIDしかSPに渡すことができない点が大きい。そのため特定の属性値（**eduPersonAffiliation**が**faculty**など）を持つユーザにだけ利用させたいというようなことがIdPの認証結果だけではできない。

# 設定方法
## Shibboleth IdP側の設定
Shibboleth 3.4.6の場合、以下のファイルを編集する。

```diff:conf/idp.properties
-   #idp.cas.StorageService=shibboleth.StorageService
+   idp.cas.StorageService=shibboleth.StorageService
```

```diff:conf/relying-party.xml
    <bean id="shibboleth.DefaultRelyingParty" parent="RelyingParty">
        <property name="profileConfigurations">
            <list>
    ...
+               <ref bean="CAS.LoginConfiguration" />
+               <ref bean="CAS.ProxyConfiguration" />
+               <ref bean="CAS.ValidateConfiguration" />
            </list>
```

```diff:conf/cas-protocol.xml
    <bean id="reloadableServiceRegistry"
          class="%{idp.cas.serviceRegistryClass:net.shibboleth.idp.cas.service.PatternServiceRegistry}">
        <property name="definitions">
            <list>
                <!--
                <bean class="net.shibboleth.idp.cas.service.ServiceDefinition"
                      c:regex="https://([A-Za-z0-9_-]+\.)*example\.org(:\d+)?/.*"
                      p:group="proxying-services"
                      p:authorizedToProxy="true"
                      p:singleLogoutParticipant="true" />
+               -->
                <bean class="net.shibboleth.idp.cas.service.ServiceDefinition"
-                     c:regex="http://([A-Za-z0-9_-]+\.)*example\.org(:\d+)?/.*"
+                     c:regex="https?://([A-Za-z0-9_-]+\.)*hoge\.fuga(:\d+)?/.*"
                      p:group="non-proxying-services"
-                     p:authorizedToProxy="false" /
+                     p:authorizedToProxy="false" />
-               -->
            </list>
        </property>
    </bean>
```

最後の**conf/cas-protocol.xml**でCASサーバ機能の利用を許可するホスト名を指定できるため、自組織のドメインなどに書き換える。
設定変更後はTomcatを再起動して変更を反映させる。

## SP側の設定
今回はお手軽にウェブサイトでのBASIC認証の置き換えを想定した設定とする。CentOS以外の場合は適宜読み替え。
なお、CASの仕様上SSLサーバ証明書が導入済みの必要がある。

ApacheのCAS認証用モジュールを追加する。

```
# yum install epel-release
# yum install mod_auth_cas
```

mod_auth_casインストール時に追加された設定ファイルをShibboleth IdPのものに書き換え、Apacheを再起動する。

```diff:/etc/httpd/conf.d/auth_cas.conf
-   CASLoginURL https://login.example.org/cas/login
+   CASLoginURL https://shibboleth-idp.hoge.fuga/idp/profile/cas/login
-   CASValidateURL https://login.example.org/cas/serviceValidate
+   CASValidateURL https://shibboleth-idp.hoge.fuga/idp/profile/cas/serviceValidate
```

認証を設定したいディレクトリにあった.htaccessのBASIC認証部分を書き換える。

```apache:.htaccess
Authtype CAS
Require valid-user
```
micro:bit　シリアル経由で音を鳴らす

micro:bitはシリアルも扱えるので、midiで受けた音をシリアル経由で鳴らせるようにしてみました。
micro:bitで音を鳴らすにはP0-GND間にスピーカーをつなぐ必要があります。
自分は[こちら](http://akizukidenshi.com/catalog/g/gM-12832/)を使用しました。

シリアルから 0-127の数値を受け取るとオクターブ-1のC#1からオクターブ9のGまでの音を鳴らします。0は音を止めるのに使用します。

```javascript
serial.onDataReceived(serial.delimiters(Delimiters.NewLine), function () {
    music.stopMelody(MelodyStopOptions.All)
    AA = serial.readString()
    iAA = parseFloat(AA.substr(0, AA.length - 1))
    if (iAA >= 0 && iAA < 128) {
        music.rest(20)
        music.ringTone(fArr[iAA])
        led.unplot(px, py)
        if (iAA > 0) {
            px = iAA % 12 % 5
            py = iAA % 12 / 5 % 5
            led.plot(px, py)
        }
    }
})
let py = 0
let px = 0
let iAA = 0
let AA = ""
let fArr: number[] = []
let f = 0
let tmp = 0
fArr = [0, 8.661958, 9.177023, 9.722718, 10.30086, 10.91338, 11.56233, 12.24986, 12.97827, 13.75, 14.56762, 15.43385, 16.3516, 17.32392, 18.35405, 19.44544, 20.60172, 21.82676, 23.12465, 24.49972, 25.95654, 27.5, 29.13523, 30.86771, 32.70319, 34.64783, 36.7081, 38.89087, 41.20344, 43.65353, 46.2493, 48.99942, 51.91309, 55, 58.27047, 61.73542, 65.40639, 69.29565, 73.4162, 77.78175, 82.40688, 87.30706, 92.4986, 97.99885, 103.8262, 110, 116.5409, 123.4708, 130.8128, 138.5913, 146.8324, 155.5635, 164.8138, 174.6141, 184.9972, 195.9977, 207.6523, 220, 233.0819, 246.9417, 261.6255, 277.1826, 293.6648, 311.127, 329.6276, 349.2282, 369.9944, 391.9954, 415.3047, 440, 466.1638, 493.8833, 523.2511, 554.3653, 587.3295, 622.254, 659.2551, 698.4565, 739.9888, 783.9908, 830.6094, 880, 932.3276, 987.7666, 1046.502, 1108.731, 1174.659, 1244.508, 1318.51, 1396.913, 1479.978, 1567.982, 1661.219, 1760, 1864.655, 1975.533, 2093.004, 2217.461, 2349.318, 2489.016, 2637.02, 2793.826, 2959.955, 3135.963, 3322.438, 3520, 3729.31, 3951.067, 4186.009, 4434.922, 4698.637, 4978.032, 5274.041, 5587.652, 5919.911, 6271.926, 6644.875, 7040, 7458.622, 7902.132, 8372.018, 8869.845, 9397.271, 9956.063, 10548.08, 11175.3, 11839.82, 12543.86]
serial.redirect(
SerialPin.USB_TX,
SerialPin.USB_RX,
BaudRate.BaudRate115200
)
for (let index = 0; index <= 50; index++) {
    music.ringTone(fArr[index + 40])
    basic.pause(5)
}
music.rest(1)
```
[動画1:arduinoのシリアルモニタから直接](https://youtu.be/lfORWHgvvyo)
[動画2:Unity経由で曲を再生](https://youtu.be/sfZ4_eE2Gzk)

周波数は下記の式で計算できますが、実機だと精度が出ないようです

```javascript

let fArr: number[] = []
for (let index = 0; index <= 127; index++) {
fArr.push(440 * 2 ** ((index - 69) / 12))
}
```
[動画](https://youtu.be/SVV88Q-6ggM)

関連：[micro:bitをPlatformIOで動かす](https://qiita.com/ELIXIR/items/aad4540202fb87b0a609)
【AWS Cloud9 / Laravel 5.8】make:authして認証画面を作ったけどリンク先が反応しない

<img width="538" alt="スクリーンショット 2020-01-13 1.03.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566050/86d1ce6d-1c4c-c249-39b1-d40c90c14b46.png">


こんにちは、にゃーんです。昨日Laravelを始めたばかりの者です。
たぶん初心者すぎて笑える内容です。どうか温かい目で見てあげてください。
間違いやまずい部分があれば訂正しますので、ご指摘あればお待ちしています。


#トラブル内容

####以下のサイトを参考にAWS Cloud9に登録して開発環境を整えた。
(バージョンはphp7.1、Laravelは5.8)

>参考: [AWS Cloud9 で Laravel を使ってみた。【環境構築】](
https://iwasawa-officialweb.com/2018/11/03/aws-cloud9-%E3%81%A7-laravel-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E3%80%82%E3%80%90%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%80%91)

####次にデータベースを構築した。
>参考: [AWS Cloud9 で Laravel を使ってみる【データベース構築】](https://iwasawa-officialweb.com/2018/11/03/aws-cloud9-%e3%81%a7-laravel-%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b%e3%80%90%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e6%a7%8b%e7%af%89%e3%80%91/)

####そのあとLaravelのドキュメント通りに認証機能をつけた。
<img width="806" alt="スクリーンショット 2020-01-13 0.19.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566050/bcf67401-a1b9-a089-00d0-cb70848d02b8.png">

>引用元: https://readouble.com/laravel/5.8/ja/authentication.html

####そして何事もなく初期画面に"Login"と"Register"が表示された。

<img width="544" alt="スクリーンショット 2020-01-13 0.14.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566050/e7294bde-71d8-b508-3efb-2720b3fb8f79.png">


と思ったら、

###"LOGIN"をクリックしても全く反応がない。
調べまくってもみんなログイン画面にちゃんと飛んでいるのに、なぜか飛ばない。
エラーも出ないので、原因が分からなくてしばらく泣いた。

#原因
route()で吐き出されるURIが"http:〜"になってたので、**Cloud9のプレビューだとリンク先に飛ばない模様。**

#解決策
常時SSLになるように"app/Providers/AppServiceProvider.php"を書き換えたところ、とりあえずリンクが機能するようになった。

```php:app/Providers/AppServiceProvider.php

use Illuminate\Routing\UrlGenerator;

class AppServiceProvider extends ServiceProvider
    public function boot(UrlGenerator $url)
    {
        $url->forceScheme('https');
    }
}
```

>引用元: [[Laravel]常時SSLなアプリケーションでのURL生成のベストプラクティスを考える](https://qiita.com/hisash/items/4b3bb1ea47c38b0d8c86)

#ご意見お待ちしています。
エンジニアになって日が浅いのでこれが正しいのか分からないところもあります。色々まずいよーってことがあればぜひお知らせください。
JavaScript勉強の記録その9: forEachを利用した配列の操作

#forEachを利用した配列の操作

forEachを使うことによって、配列のデータを順に取り出すことができます。

```index.js
const scores = [0, 40, 60, 10, 70];

scores.forEach((score) => {
  console.log(score);
});

// 0
// 40
// 60
// 10
// 70
```

#forEachでインデックス番号も一緒に出力

forEachに第二引数を設定すると、インデックス番号も一緒に取得することができます。

```index.js
const scores = [0, 40, 60, 10, 70];

scores.forEach((score, index) => {
  console.log(`score: ${score} index: ${index}`);
});

// score: 0 index: 0
// score: 40 index: 1
// score: 60 index: 2
// score: 10 index: 3
// score: 70 index: 4

```

#forEachの短縮系
おさらいですが、forEachもアロー関数を使うことで短く書くことができます。
個人的には{}をつけた方がなんとなく読みやすいのですが、以下のような書き方もできます。

```index.js
const scores = [0, 40, 60, 10, 70];

scores.forEach((score, index) => console.log(`score: ${score} index: ${index}`));

// score: 0 index: 0
// score: 40 index: 1
// score: 60 index: 2
// score: 10 index: 3
// score: 70 index: 4

```
【PowerShell】Powershellの起動時にログを生成するショートカット作成

# はじめに
Powershellで作業するときにログを残して置きたい時ってありませんか。
また、TeraTermのように起動時に自動でログを作成してほしい時ってありませんか。
そんな、あなたのためにPowershell起動時に自動でログを作成するショートカットを作成します。

### 事前準備
ログの保存先として、`C:\log\`を作成します。
保存先は任意に変更しても構いません。

### ショートカット作成 
右クリックし、ショートカットの作成を押下します。そして、ショートカットの設定は以下の通りです。

* リンク先

```
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe "-NoExit" "-Command" $date = Get-Date -Format "yyyyMMdd_ssmm"; Start-Transcript -Path C:\log\$date.log
```
`%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe`は環境によって変更する可能性があります。
`C:\log\$date.log`は任意の保存先に変更してください。
` $date `はdateコマンドの結果を変数に格納しています。

* 作業フォルダ

```
%HOMEDRIVE%%HOMEPATH%
```
作業フォルダを`%HOMEDRIVE%%HOMEPATH%`にしないとホームディレクトリが`%SystemRoot%\system32\WindowsPowerShell\v1.0\`のままになります。  
ショートカットを実行すると、Powershellが起動し、`C:\log\<yyyyMMdd_ssmm>.log`のログファイルが作成されます。イメージで言うと、TeraTermのログみたいな感じですね。

### ショートカットの説明
ショートカットについて説明します。
ショートカットをカスタマイズしたい方はお読みください。

#### powershell.exe "-NoExit" "-Command"

```
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe "-NoExit" "-Command"
```
`-NoExit`はPowershellを起動しっぱなしにする処理です。
`-Command`以下の処理を実行した後、通常は閉じられますが、-NoExitによって閉じないようにしてます。

#### $date = Get-Date -Format "yyyyMMdd_ssmm"

```
$date = Get-Date -Format "yyyyMMdd_ssmm";
```
ファイル名を日付で一意にするために作成しています。
`;`を使用することでコマンドが続けて実行されます。

* 例

```
commandA ; commandB
```
`；`を使用することで、`commandA ; commandB`が続けて実行されます。

#### Start-Transcript

```
Start-Transcript -Path C:\log\$date.log
```
Powershellをログとして出力するコマンドです。
`-Path`でログの出力先を指定します。

その他のオプションについては以下をご覧ください。
[https://docs.microsoft.com/ja-jp/previous-versions/powershell/module/Microsoft.PowerShell.Host/Start-Transcript?view=powershell-3.0]
Nuxt.js: コンポーネントのファイル名にsuffixを付けるだけで、コンポーネントをどこからでも呼び出せるようにする

よく使うコンポーネントは、いちいちimportして使うのは面倒なので、どこからでも呼び出せるようにしたい、

これまでは、pluginsディレクトリにコンポーネント登録用のファイルを置いて登録していたのだけれど、どのコンポーネントを追加したのか忘れてしまい、登録用のファイルを開いて確認する作業が地味に手間だった。

Githubをサーフィンしていたところ、コンポーネントのファイル名に「global」というサフィックスを付けるだけでどこからでも呼び出し可能にするプラグイン（@nuxtjs/global-components）が目に留まったので、試してみたところ非常に便利だったので紹介したい。

https://github.com/nuxt-community/global-components

使い方は以下のとおり。

## @nuxtjs/global-components をインストールする
```
npm i -D @nuxtjs/global-components
```

## nuxt.config.js に登録する
```nuxt.config.js
module.exports = {
  ...
  buildModules: [
    '@nuxtjs/global-components'
  ],
...
}
````
Nuxt v2.9 未満の場合は、devModules が使えないので、modules に登録する。（未検証）

## 登録方法
components ディレクトリの中のファイル名に、「global」というサフィックスを付けるだけでOK。

```
components/
  my-component.vue # importが必要
  my-button.global.vue # グローバルに登録され、どこからも呼び出せる
```

上記の例の場合、「my-button」というタグがどこでも使用可能になる。

普段、VSCodeを使っているのだけど、エクスプローラーを見ればファイル名ですぐに判断が付くので、非常に快適になった。

また、対象となるディレクトリやサフィックスをカスタマイズすることも可能。
↓ 詳しくはこちら
https://github.com/nuxt-community/global-components

Nuxtがどんどん便利になっていく、もう離れられない。
NLP4J [006-033] NLP4J で言語処理100本ノック #33 サ変名詞

[Indexに戻る](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29) 

やってみます。

# 33. サ変名詞
> サ変接続の名詞をすべて抽出せよ．

# Maven

現在開発中のバージョンを利用します。

```xml
<dependency>
	<groupId>org.nlp4j</groupId>
	<artifactId>nlp4j-core</artifactId>
	<version>1.1.1.0-SNAPSHOT</version>
</dependency>
```

# Text Data

デフォルトで利用している形態素解析（Yahoo! Japan デベロッパーネットワーク 日本語形態素解析) では、リクエストサイズの上限が900KBであり、回数に制限もあるので小さなサイズのテキストファイルを利用しています。

```
一

　吾輩は猫である。
名前はまだ無い。

　どこで生れたかとんと見当がつかぬ。
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
吾輩はここで始めて人間というものを見た。
しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。
この書生というのは時々我々を捕えて煮て食うという話である。
しかしその当時は何という考もなかったから別段恐しいとも思わなかった。
ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。
掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。
この時妙なものだと思った感じが今でも残っている。
第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。
その後猫にもだいぶ逢ったがこんな片輪には一度も出会わした事がない。
のみならず顔の真中があまりに突起している。
そうしてその穴の中から時々ぷうぷうと煙を吹く。
どうも咽せぽくて実に弱った。
これが人間の飲む煙草というものである事はようやくこの頃知った。


```
# Java Code

```java
package nlp4j.nokku.chap4;

import java.util.List;

import nlp4j.Document;
import nlp4j.DocumentAnnotator;
import nlp4j.DocumentAnnotatorPipeline;
import nlp4j.Keyword;
import nlp4j.crawler.Crawler;
import nlp4j.crawler.TextFileLineSeparatedCrawler;
import nlp4j.impl.DefaultDocumentAnnotatorPipeline;
import nlp4j.index.DocumentIndex;
import nlp4j.index.SimpleDocumentIndex;
import nlp4j.yhoo_jp.YJpMaAnnotator;

public class Nokku31 {
	public static void main(String[] args) throws Exception {
		// NLP4Jが提供するテキストファイルのクローラーを利用する
		Crawler crawler = new TextFileLineSeparatedCrawler();
		crawler.setProperty("file", "src/test/resources/nlp4j.crawler/neko_short_utf8.txt");
		crawler.setProperty("encoding", "UTF-8");
		crawler.setProperty("target", "text");
		// ドキュメントのクロール
		List<Document> docs = crawler.crawlDocuments();
		// NLPパイプライン（複数の処理をパイプラインとして連結することで処理する）の定義
		DocumentAnnotatorPipeline pipeline = new DefaultDocumentAnnotatorPipeline();
		{
			// Yahoo! Japan の形態素解析APIを利用するアノテーター
			DocumentAnnotator annotator = new YJpMaAnnotator();
			pipeline.add(annotator);
		}
		// アノテーション処理の実行
		pipeline.annotate(docs);
		// キーワードをカウントするためにDocumentIndexを利用します。
		SimpleDocumentIndex index = new SimpleDocumentIndex();
		// ドキュメントの追加
		index.addDocuments(docs);
		List<Keyword> kwds = index.getKeywordsWithoutCount();

		String meishi = null;

// かっこいいやり方ではないが、今回は単純に名詞＋するを探すとする。
		for (Keyword kwd : kwds) {
			if (kwd.getFacet().equals("名詞")) {
				meishi = kwd.getLex();
			} //
			else if (meishi != null && kwd.getLex().equals("する")) {
				System.err.println(meishi + kwd.getLex());
				meishi = null;
			} //
			else {
				meishi = null;
			}
		}
	}
}
```

# 結果

```
記憶する
装飾する
突起する
```

# 所感

サ変動詞でなくてサ変名詞なのですね。

# まとめ

NLP4J を使うと、Javaで簡単に自然言語処理ができますね！


#プロジェクトURL
https://www.nlp4j.org/
<img width="64" alt="NLP4J_N_128.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/4f59b21b-4b43-187d-0aac-7b99c0fd4bac.png">

---
[Indexに戻る](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29)
任意次元空間における三角形の外心の簡単な求め方

#目的

AtCoderに外心を求める問題があって解けなかったので，怒りに任せて任意次元空間における三角形の外心の簡単な求め方と実装を書きます．

#方針
三角形の3頂点を$A, B, C$とします．求める点をPとすると，とある実数$x, y$を用いて

```math
\vec{AP} = x \vec{AB} + y \vec{AC}
```

と書けます．

>三角形の外心は、3つの辺の垂直二等分線が交わる点である

ので(例えば[Wikipedia](https://ja.wikipedia.org/wiki/外接円#外心の位置)参照)，次の2つの方程式が成り立ちます．

```math
\left(\frac{\vec{AB}}{2} - \vec{AP}\right) \cdot \vec{AB} = 0 \\
\left(\frac{\vec{AC}}{2} - \vec{AP}\right) \cdot \vec{AC} = 0
```

先の式を代入して解くと

```math
x \| \vec{AB} \|^2 + y \left( \vec{AB} \cdot \vec{AC} \right) = \frac{1}{2} \| \vec{AB} \|^2 \\
x \left( \vec{AB} \cdot \vec{AC} \right) + y \| \vec{AC} \|^2 = \frac{1}{2} \| \vec{AC} \|^2 \\
```

行列表示すると

```math
\left(x, y\right) \begin{pmatrix}
\| \vec{AB} \|^2 & \vec{AB} \cdot \vec{AC} \\
\vec{AB} \cdot \vec{AC} & \| \vec{AC} \|^2
\end{pmatrix}
= \frac{1}{2} \left(\| \vec{AB} \|^2, \| \vec{AC} \|^2\right)
```

これを解くと（逆行列かけると楽です）

```math
\begin{pmatrix}
x \\
y
\end{pmatrix}
=
\frac{1}{2}
\frac{1}{\|\vec{AB}\|^2 \|\vec{AC}\|^2 - \left( \vec{AB} \cdot \vec{AC} \right)^2}
\begin{pmatrix}
\| \vec{AB} \|^2 \| \vec{AC} \|^2 - \| \vec{AC} \|^2 \left( \vec{AB} \cdot \vec{AC} \right) \\
\| \vec{AB} \|^2 \| \vec{AC} \|^2 - \| \vec{AB} \|^2 \left( \vec{AB} \cdot \vec{AC} \right) 
\end{pmatrix}
```

と，内積計算だけで解けます．

#実装

```C++
vector<double> circumcenter(vector<double> P1, vector<double> P2, vector<double> P3){
      double AB2 = 0.0;
      double AC2 = 0.0;
      double ABAC = 0.0;
      double EPS = 1.0E-12;
      vector<double> ans(D, 0.0);
      for(ll i=0; i<D; ++i){
        double AB = P2[i]-P1[i];
        double AC = P3[i]-P1[i];
        AB2 += AB*AB;
        AC2 += AC*AC;
        ABAC += AB*AC;
      }

      double denominator = (AB2*AC2-ABAC*ABAC);

      if(denominator < EPS){
        fprintf(stderr, "Circumcenter Error\n");
        return ans;
      }

      double x = 0.5*(AB2*AC2-AC2*ABAC)/denominator;
      double y = 0.5*(AB2*AC2-AB2*ABAC)/denominator;

      for(ll i=0; i<D; ++i){
        double AB = P2[i]-P1[i];
        double AC = P3[i]-P1[i];
        ans[i] = x*AB+y*AC+P1[i];
      }
      return ans;
}
```

分母が0の時（か0に近い時）は3点$A, B, C$が一直線上にある時です．例外処理しましょう．
Gradleのimplementationとapiの違いメモ

# `implementation`と`api`
|コンフィグレーション|依存関係の伝播|
|:--|:--|
|`implementation`|しない|
|`api`|する|

# サンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302946/bab8f73e-e1d8-9b78-c9fa-86b88a3b6ef0.png)

このとき、プロジェクトAから見て

|プロジェクト|コードの参照可否|
|:--|:--|
|B|参照できる|
|C|参照できる|
|D|**参照できない**|
|E|参照できる|
|F|**参照できない**|
|G|参照できる|

となる。

# 参考
- [ビルド依存関係の追加 - Android Developers](https://developer.android.com/studio/build/dependencies.html#dependency_configurations)
- [The Java Library Plugin - Gradle User Manual](https://docs.gradle.org/current/userguide/java_library_plugin.html)
[M5StickC / Raspberry Pi] 俺のリモートコントローラー

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140921/c0197604-568f-e827-d972-5212ffba95fa.png">

# TL;DR(まとめ)

- M5StickC, Raspberry Pi Zero W (Node-RED) ,USB接続赤外線リモコンを用いて俺専用リモコンを作りました。
- どこからでもテレビのON/OFF, チャンネル変更, ボリューム変更が可能になりました。
- M5StickCは加速度センサー、内蔵バッテリー、Wi-Fi、モニタありでPoCに最適なデバイスでした。
- おうちハック生活に少しでもお役に立てれば幸いです。（ただ1点重大な課題が・・・。）

# きっかけ
Google Homeに話しかけてテレビを操作するおうちハックをしましたが、我が家では以下の問題がありました。

- ザッピングするたびに、Google Homeに話すの面倒
- 夜ひとりでGoogle Homeに話しかけると寂しくなってくる

そこで、ザッピングできる俺専用リモコンを開発しました。

# システム構成

<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140921/26218f4b-1f7f-5bee-c01c-ba04c00b8d12.png">

1. M5StickCのボタンAを押す。
2. Raspberry Piにボタン操作の種類をMQTT Publishする。
3. Raspberry PiのMQTT INノードでメッセージを受信して、テレビ操作スクリプトを実行する。
4. 赤外線リモコンからテレビに赤外線コマンドを送信する。

# 構築手順（ブラッシュアップのアドバイス大募集中です！）
### M5StickC（UiFLOW）※一部抜粋

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140921/f3a74f70-3614-60c3-6cc9-be0edbdf4ef5.png">

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140921/2784c6bb-0c60-2006-e93c-36729d8a0aa9.png">


加速度センサーを利用して、M5StickCの向きに応じて送信したいコマンドを設定しています。

# 利用イメージ

<blockquote class="twitter-tweet"><p lang="es" dir="ltr"><a href="https://twitter.com/hashtag/M5stickC?src=hash&amp;ref_src=twsrc%5Etfw">#M5stickC</a> + <a href="https://twitter.com/hashtag/RaspberryPi?src=hash&amp;ref_src=twsrc%5Etfw">#RaspberryPi</a> (Node-RED) = Personal remote controller<br><br> <a href="https://twitter.com/hashtag/M5stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5stack</a> <a href="https://t.co/2EAlaf5I3U">pic.twitter.com/2EAlaf5I3U</a></p>&mdash; yagni (@yahagi301) <a href="https://twitter.com/yahagi301/status/1216370352697171973?ref_src=twsrc%5Etfw">January 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 残課題
- M5StickC のバッテリーが持たない問題
    - フル充電した場合でもバッテリーが持たないため、**30分に一回充電する必要があります。。**
NLP4J [006-032] NLP4J で言語処理100本ノック #32 動詞の原形

[Indexに戻る](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29) 

やってみます。

# 32. 動詞の原形
> 動詞の原形をすべて抽出せよ．

# Maven

現在開発中のバージョンを利用します。

```xml
<dependency>
	<groupId>org.nlp4j</groupId>
	<artifactId>nlp4j-core</artifactId>
	<version>1.1.1.0-SNAPSHOT</version>
</dependency>
```

# Text Data

デフォルトで利用している形態素解析（Yahoo! Japan デベロッパーネットワーク 日本語形態素解析) では、リクエストサイズの上限が900KBであり、回数に制限もあるので小さなサイズのテキストファイルを利用しています。

```
一

　吾輩は猫である。
名前はまだ無い。

　どこで生れたかとんと見当がつかぬ。
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
吾輩はここで始めて人間というものを見た。
しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。
この書生というのは時々我々を捕えて煮て食うという話である。
しかしその当時は何という考もなかったから別段恐しいとも思わなかった。
ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。
掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。
この時妙なものだと思った感じが今でも残っている。
第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。
その後猫にもだいぶ逢ったがこんな片輪には一度も出会わした事がない。
のみならず顔の真中があまりに突起している。
そうしてその穴の中から時々ぷうぷうと煙を吹く。
どうも咽せぽくて実に弱った。
これが人間の飲む煙草というものである事はようやくこの頃知った。


```


# Java Code

```java
package nlp4j.nokku.chap4;

import java.util.List;

import nlp4j.Document;
import nlp4j.DocumentAnnotator;
import nlp4j.DocumentAnnotatorPipeline;
import nlp4j.Keyword;
import nlp4j.crawler.Crawler;
import nlp4j.crawler.TextFileLineSeparatedCrawler;
import nlp4j.impl.DefaultDocumentAnnotatorPipeline;
import nlp4j.index.DocumentIndex;
import nlp4j.index.SimpleDocumentIndex;
import nlp4j.yhoo_jp.YJpMaAnnotator;

public class Nokku31 {
	public static void main(String[] args) throws Exception {
		// NLP4Jが提供するテキストファイルのクローラーを利用する
		Crawler crawler = new TextFileLineSeparatedCrawler();
		crawler.setProperty("file", "src/test/resources/nlp4j.crawler/neko_short_utf8.txt");
		crawler.setProperty("encoding", "UTF-8");
		crawler.setProperty("target", "text");
		// ドキュメントのクロール
		List<Document> docs = crawler.crawlDocuments();
		// NLPパイプライン（複数の処理をパイプラインとして連結することで処理する）の定義
		DocumentAnnotatorPipeline pipeline = new DefaultDocumentAnnotatorPipeline();
		{
			// Yahoo! Japan の形態素解析APIを利用するアノテーター
			DocumentAnnotator annotator = new YJpMaAnnotator();
			pipeline.add(annotator);
		}
		// アノテーション処理の実行
		pipeline.annotate(docs);
		// キーワードをカウントするためにDocumentIndexを利用します。
		SimpleDocumentIndex index = new SimpleDocumentIndex();
		// ドキュメントの追加
		index.addDocuments(docs);
		List<Keyword> kwds = index.getKeywords();
		kwds = kwds.stream() //
				.filter(o -> o.getFacet().equals("動詞")) // 品詞が動詞
				.collect(Collectors.toList());
		for (Keyword kwd : kwds) {
			System.err.println(kwd.getLex()); // ←ここだけ変更
		}
	}
}
```

# 結果

```
生れる
つく
する
泣く
始める
いう
見る
聞く
いう
いう
捕える
煮る
食う
いう
思う
載せる
持ち上げる
する
ある
落ちつく
見る
いう
思う
残る
もつ
する
逢う
出会う
する
吹く
咽せる
くう
弱る
飲む
いう
知る
```


# まとめ

NLP4J を使うと、Javaで簡単に自然言語処理ができますね！


#プロジェクトURL
https://www.nlp4j.org/
<img width="64" alt="NLP4J_N_128.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/4f59b21b-4b43-187d-0aac-7b99c0fd4bac.png">

---
[Indexに戻る](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29)
AWS Amplify フレームワークの使い方Part3〜API設定編〜

# はじめに
AmpifyシリーズのPart3はAppSyncを利用できるようになるまでを解説していきます。

# APIの設定
`$amplify add api`から `$amplify push`まで。

## AmplifyにAPIを追加
まずはおなじみのコマンドから実行し、APIの設定を進めていきます。

```console
$ amplify add api
```
## サービスを選択
今回は、AppSyncを利用したいので、GraphQLを選択します。

```console
? Please select from one of the below mentioned services GraphQL
```
## API名設定
何でもいいですが、管理しやすいプロジェクト名などでいいと思います。

```console
? Provide API name: API名
```
## 認証形式
今回は、Cognitoを使った認証設定にしています。特段CRUDの権限を制限しない場合は、API KEYでOKです。(その他の選択肢は未検証)
Cognitoを選択すると、まだAuth設定をしていない場合は、`amplify add auth`と同じ操作がここから始まります。

```console
? Choose an authorization type for the API Amazon Cognito User Pool
```
■参考
[AWS Amplify フレームワークの使い方Part1〜Auth設定編〜](https://japan-port.qiita.com/too/items/a70f3139eb183ba44b65) 

## スキーマ設定
このあたりのスキーマ設定は後で変更ができる(むしその変更が超絶肝!!)ので、デフォルト連打でOK。

```console
? Do you have an annotated GraphQL schema? No
? Do you want a guided schema creation? Yes
? What best describes your project: Single object with fields (e.g., “Todo” with ID, name, description)
? Do you want to edit the schema now? Yes
```
## スキーマファイルの編集
`amplify push`の前に `amplify/backend/api/<api名>/schema.graphql`を編集していきます。
push後もある程度の更新、変更は可能ですが、思わぬところでエラーが起きて更新できなかったりするので、ある程度考えた上でpushしましょう。
ただ、テストで試す場合は、そのエラーを知ることも大切ですので、基本的なスキーマ設計をしたら次へ進みましょう。

※スキーマファイルの書き方については別途記事にまとめる予定です。

## リソースの作成
そして、push。これで、設定完了です！！

```console
$ amplify push
```
# おわりに
まずは、スキーマのデフォルトで選べるTODOのスキーマなどでお試しで触ってみることをおすすめします。次の記事では、push後の実際の利用方法について記事を書いていきます。

# 関連記事
[AWS amplify フレームワークの使い方Part1〜Auth設定編〜](https://qiita.com/too/items/fc961283dcbef3aafdeb)
[AWS Amplify フレームワークの使い方Part2〜Auth実践編〜](https://qiita.com/too/items/54992bb871fc1a2ab101)
[AWS Amplify フレームワークの使い方Part4〜API実践編〜](https://qiita.com/too/items/f9078803ea394c35df7d)
[AWS Amplify フレームワークの使い方Part5〜GraphQL Transform @model編〜](https://qiita.com/too/items/ab6b313da9f9e34be4a7)
[AWS Amplify フレームワークの使い方Part6〜GraphQL Transform @auth編〜]
(https://qiita.com/too/items/fae2879ea36f00c3ae10)
[AWS Amplify フレームワークの使い方Part7〜GraphQL Transform @key編〜]
(https://qiita.com/too/items/cb1dfb4f44536a3e9855)
[AWS Amplify フレームワークの使い方Part8〜GraphQL Transform @connection編〜](https://qiita.com/too/items/c77f1e5487d2497b5061)
[AWS Amplify フレームワークの使い方Part9〜Function 基礎編〜](https://qiita.com/too/items/d2732b3ec625011f4567)
[AWS Amplify フレームワークの使い方Part10〜Storage編〜](https://qiita.com/too/items/361bc10b6d27f133e9f8)
[AWS Amplify フレームワークの使い方Part11〜Function 権限管理編〜](https://qiita.com/too/items/b34cbfd7e96a01e33f23)
[AWS Amplify フレームワークの使い方Part12〜ENV編〜](https://qiita.com/too/items/5c1e28cf95fc6229547e)
[AWS Amplify フレームワークの使い方Part13〜Auth 設定更新編〜]
(https://qiita.com/too/items/52f35860bcb5bdf5e667)
[AWS Amplify フレームワークの使い方Part14〜Lambda レイヤー編〜]
(https://qiita.com/too/items/54de781085bd9a3a66d0)
NLP4J [006-031] NLP4J で言語処理100本ノック #31 動詞

[Indexに戻る](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29) 

やってみます。

# 31. 動詞
> 動詞の表層形をすべて抽出せよ．

# Maven

現在開発中のバージョンを利用します。

```xml
<dependency>
	<groupId>org.nlp4j</groupId>
	<artifactId>nlp4j-core</artifactId>
	<version>1.1.1.0-SNAPSHOT</version>
</dependency>
```

# Text Data

デフォルトで利用している形態素解析（Yahoo! Japan デベロッパーネットワーク 日本語形態素解析) では、リクエストサイズの上限が900KBであり、回数に制限もあるので小さなサイズのテキストファイルを利用しています。

# Java Code

```java
package nlp4j.nokku.chap4;

import java.util.List;

import nlp4j.Document;
import nlp4j.DocumentAnnotator;
import nlp4j.DocumentAnnotatorPipeline;
import nlp4j.Keyword;
import nlp4j.crawler.Crawler;
import nlp4j.crawler.TextFileLineSeparatedCrawler;
import nlp4j.impl.DefaultDocumentAnnotatorPipeline;
import nlp4j.index.DocumentIndex;
import nlp4j.index.SimpleDocumentIndex;
import nlp4j.yhoo_jp.YJpMaAnnotator;

public class Nokku31 {
	public static void main(String[] args) throws Exception {
		// NLP4Jが提供するテキストファイルのクローラーを利用する
		Crawler crawler = new TextFileLineSeparatedCrawler();
		crawler.setProperty("file", "src/test/resources/nlp4j.crawler/neko_short_utf8.txt");
		crawler.setProperty("encoding", "UTF-8");
		crawler.setProperty("target", "text");
		// ドキュメントのクロール
		List<Document> docs = crawler.crawlDocuments();
		// NLPパイプライン（複数の処理をパイプラインとして連結することで処理する）の定義
		DocumentAnnotatorPipeline pipeline = new DefaultDocumentAnnotatorPipeline();
		{
			// Yahoo! Japan の形態素解析APIを利用するアノテーター
			DocumentAnnotator annotator = new YJpMaAnnotator();
			pipeline.add(annotator);
		}
		// アノテーション処理の実行
		pipeline.annotate(docs);
		// キーワードをカウントするためにDocumentIndexを利用します。
		SimpleDocumentIndex index = new SimpleDocumentIndex();
		// ドキュメントの追加
		index.addDocuments(docs);
		List<Keyword> kwds = index.getKeywords();
		kwds = kwds.stream() //
				.filter(o -> o.getFacet().equals("動詞")) // 品詞が動詞
				.collect(Collectors.toList());
		for (Keyword kwd : kwds) {
			System.err.println(kwd.getStr());
		}
	}
}
```

# 結果

```
生れ
つか
し
泣い
始め
いう
見
聞く
いう
いう
捕え
煮
食う
いう
思わ
載せ
持ち上げ
し
あっ
落ちつい
見
いう
思っ
残っ
もっ
し
逢っ
出会わ
し
吹く
咽せ
く
弱っ
飲む
いう
知っ
```


# まとめ

NLP4J を使うと、Javaで簡単に自然言語処理ができますね！


#プロジェクトURL
https://www.nlp4j.org/
<img width="64" alt="NLP4J_N_128.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/4f59b21b-4b43-187d-0aac-7b99c0fd4bac.png">

---
[Indexに戻る](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29)
VPS/ubuntu上にインストールしたmysqlに外部からアクセス

# 概要
conohaVPS(ubuntu)上にインストールしたMysqlに外部(Macのターミナル)からアクセスをする
備忘録としてまとめています

# 環境
### ローカル
MacBookPro(macOS 10.15.1)

### VPS
conoha VPS(ubuntu18.04)
Mysql 5.7.28

# VPSにmysqlをインストール
ubuntu上にmysqlをインストールします

```shell:VPS
$ sudo apt update
$ sudo apt install mysql-server
```

# 外部接続用ユーザーの作成
mysqlのインストールが完了したら外部接続用のユーザーを作成します。
まず初めにmysqlにrootユーザーでログイン
パスワードも聞かれます

```shell:VPS
$ mysql -u root -p
```

rootログインができたら外部接続用ユーザーを作成します。
今回はユーザー名：outer/ホスト名：XXX.XXX.XXX.XXX/パスワード:passwdという名前にします。適宜変えてください
(ホスト名のIPは接続側、今回ならmac側のIPです。VPSのIPではない)
また、権限は全OKな感じにしているのでこちらも適宜変えてください。


```:VPS/mysql
# ユーザーの作成
CREATE USER outer@XXX.XXX.XXX.XXX IDENTIFIED BY 'passwd';

# 作ったユーザーの権限を設定
GRANT ALL PRIVILEGES ON *.* to outer@XXX.XXX.XXX.XXX IDENTIFIED BY 'passwd' WITH GRANT OPTION;

# 必要であれば下記コマンドで正しく設定されているか確認
SELECT user, host FROM mysql.user;
```

ここまでできたら一度"exit"と叩いてmysqlからログアウトします。

# mysqlの再起動
下記コマンドでMysqlを再起動します。

```shell:VPS
$ sudo systemctl restart mysql
```

また、(必要か分かりませんが)mysqlの下記configを変更する必要があるそうです。

```shell:VPS
$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

#下記をコメントアウトする。 
bind-address = 127.0.0.1
```

# ubuntuファイアウォールの設定
mysqlのデフォルトのポートは3306なのでファイアウォールも設定してあげます。

```shell:VPS
# ポート3306を解放
sudo ufw allow 3306

# ufwの再読み込み
ufw reload

# 必要であれば下記コマンドで確認
ufw status verbose
```

# macターミナルから接続
最後に外部からアクセスできるか確認します。
ここでのYYY.YYY.YYY.YYYはVPSのIPアドレスです。

```shell:mac/ターミナル
$ mysql -h YYY.YYY.YYY.YYY -u outer -p
```

これで接続ができました。
ハマりメモ: ２次元配列の値のmaxを取るときにmax(max(list))はしてはならない


```Python
a = []
a.append([-1,-1,-1])
a.append([-1, 2, -1])
a.append([-1, -1, 3])
```

というリストがあった際に、このリストの中の最大値3を得たい。つまり、

```Python
>>> max(list(map(lambda x: max(x), a)))
3
```

を行いたい。この際にmaxを入れ子にするとうまくいかない。

```Python
>>> max(max(a))
2
```

これは、max(a)をした際に`[-1,-1,-1]`と`[-1, 2, -1]`と`[-1, -1, 3]`の比較が行われる。これは辞書順に比較され、

```Python
>>> [-1, 2, -1] > [-1, -1, 3]
True
>>> "acb" > "abz" # これと一緒
True
```

となるためである。

# 解法1: map
```Python
>>> max(list(map(lambda x: max(x), a)))
3
```

# 解法2: itertools.chainでflatなlistにする
```Python
>>> from itertools import chain
>>> list(chain(*a))
[-1, -1, -1, -1, 2, -1, -1, -1, 3]
>>> max(chain(*a))
3
```
javaでAtCoder Beginner Contest 151を解く

AtCoder Beginner Contest 151お疲れ様でした！
[公式ページ](https://atcoder.jp/contests/abc151)

今回の自分の書いたコードは[こちら](https://github.com/ko-flavor/atcoder-java/tree/master/atcoder/src/abc/abc151)
以下簡単に解説します。

##[問題A](https://atcoder.jp/contests/abc151/tasks/abc151_a)
入力文字列の次のアルファベットを出力する問題。
javaのcharはインクリメントすると次のcharになることを知っていたので、そのまま記載。

##[問題B](https://atcoder.jp/contests/abc151/tasks/abc151_b)
テストの点数が与えられ、目標点に到達するには何点とればよいか、という問題。
テストの点数を順番に足していって、目標点と引き算すればOKです。

目標点に頑張っても到達できない場合と既に到達している場合があるので、注意。

##[問題C](https://atcoder.jp/contests/abc151/tasks/abc151_c)

個人的にちょっと骨がありました。
問題番号と`AC`か`WA`が与えられ、正解した問題数とペナルティ数を数える問題。

ペナルティ数は正解した問題にしか適用されないので注意。(これで一度不正解なってしまいました。)

##[問題D](https://atcoder.jp/contests/abc151/tasks/abc151_d)
手つけてません

##[問題E](https://atcoder.jp/contests/abc151/tasks/abc151_e)

数の組み合わせから特定の数を選んで、その最大値と最小値の差を、組み合わせの数だけ足し合わせる問題。
最大値と最小値を別々に求める発想にいたらず、TLEでした。

コンテスト後に最大値と最小値別々に求めるように変更したらTLEがなおらないままWAになって迷宮入りしたので、あきらめました。
最大値と最小値を別々に求めるって考え方があるって学べたからヨシとします。(二項係数の算出方法が遅いのかな・・・)

(2020/01/16追記)
コメント欄で助言いただき、修正してACになりました！

##[問題F](https://atcoder.jp/contests/abc151/tasks/abc151_f)

一定の数の点を包含する最小の円の半径を求めよ、という問題。
全ての点の最大の長さを求めて半分したのですが、それでは考慮不足でした。

点の数が50だったので、多少計算量膨らんでもよいって気づけばよかった・・・残念。

----

残念ながら今回はじめてレーティングが下がってしまいました。
今までほぼ丸腰で挑んでいましたが、ぼちぼちセオリーを学び始めようかと思います。。
HTMLとCSS学習完了

あっという間にHTMLとCSSの学習部分が終了。
テキスト通り言われるがままコードを書いただけ。とりあえず表示はされたのでうまくいったのかとは思う・・・
何度も同じコードを打っていたら、なんとなく意味が分かってきた気がする。divがグループを括ってるとか、bodyとかfooterとか。。。

最後に確認テストがありました。コードを自分で書いて、ページの左上の方が広さ300px、高さが100pxの範囲を赤くするというもの。全くわからず。。。自分のレベルの低さに愕然。繰り返しコードを書いて、自分のものにしていきたいとおもいます。<img width="1440" alt="スクリーンショット 2020-01-13 0.10.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565375/364441fe-9a91-8953-c4e4-e6890e215814.png">
pip installでエラーが出たときの備忘録

#pip installって意外とうまくいかない。。
趣味と（未だに）仕事で機械学習をプログラミングしているのですが、必要なパッケージをインストールする際に困ることがよくあります。特にpip install系のエラー。
仕方なくAnacondaを使用できず、開発環境が異なっている状態だとエラーがでる要因がたくさんあります。

検索すれば解決するのですが、再発する頃には結局忘れてもう一回検索。。と面倒なので自分用の備忘録を残します(笑)


##transformers(os:win)
![error01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274588/307cee83-ea30-87f8-8df8-77dde29e3436.png)

FileNotFoundError: [Errno 2] No such file or directory: '..\\VERSION' ---------------------------------------- ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.


[ここ](https://github.com/google/sentencepiece/releases/tag/v0.1.84)の
**statementpiece-0.1.84-cp36-cp36m-win_amd64.whl**
をダウンロードして
**pip install statementpiece-0.1.84-cp36-cp36m-win_amd64.whl**
でインストールすればOK

エラー出たらバージョンに適したwhlをインストールする