OmniAICreator/Qiita-1.07M huggingface dataset:
reference型のカラムを作成、追加する時の気をつける点

# はじめに
テーブルにreference型のカラムを追加する際に、マイグレーションファイルの
記述方法に細かな作法があるようなのでまとめておきます。

# テーブルと一緒にreference型のカラムを作成する時
前提条件

* userテーブルがあり、新たにcredit_cardテーブルを作る
* credit_cardテーブルの中にはreference型のuser_idカラムがある。
* 他のカラムとして、カード番号、期限、セキュリティ番号がある。

credit_cardモデルを作成

```
$ rails g model credit_card
```

作られたmigrationファイルを開き、編集

```
db/migrate/作成された日付_create_creditcards.rb

class CreateCreditcards < ActiveRecord::Migration[5.2]
  def change
    create_table :creditcards do |t|
      t.integer :credit_number, null: false
      t.integer :limit_month, null: false
      t.integer :limit_year, null: false
      t.integer :security_number, null: false
      t.references :user, null: false, foreign_key: true
      t.timestamps
    end
  end
end
```
マイグレーションの実行

```
$ rake db:migrate
```

# すでに作られているテーブルにreference型のカラムを追加するとき
前提条件

* userテーブルとcredit_cardテーブルがある
* credit_cardテーブルにはカード番号、期限、セキュリティ番号のカラムがある
* 新たにreference型のuser_idというカラムを追加する

マイグレーションファイルの生成

```
$ rails g migration AddReferencesToCredit_cards
```
作られたmigrationファイルを開き、編集

```
db/migrate/作成された日付_add_references_to_credit_cards.rb

class AddReferencesToCreditCards < ActiveRecord::Migration[5.2]
  def change
    add_reference :credit_cards, :user, null: false, foreign_key: true
  end
end
```

マイグレーションの実行

```
$ rake db:migrate
```

# ポイント

* 作成する時は、references
* 追加する時は、reference
* 追加する際の対象テーブルの名前は複数形
* user_idカラムを作る時のカラム名の指定は、:userのみ（_idをつけない）
Machine learning notes

#These are my machine learning notes.

I would like to predict the house estimate value, so I will write things I searched.

##statistical knowledges  
* Covariance is Large negative covariance, Near zero covariance, Large positive covariance

```math
Covariance = 
\left( \sum_{k=1}^n (x-u)(y-v)/\right)(n-1) 
```
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference: https://www.youtube.com/watch?v=0nZT9fqr2MU

*  Person’s r measures of the strength of the linear relationship between two variables and is always between 1 and -1

* 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference: https://www.youtube.com/watch?v=2B_UW-RweSE

* R-squared or coefficient of determination can be thought of as a percent, it gives you an idea of how many data points fall within the results of the line formed by regression equation. If the coefficient is 0.80, then 80% of the points should fall within the regression line.


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference: https://www.statisticshowto.datasciencecentral.com/probability-and-statistics/coefficient-of-determination-r-squared/
##useful machine learning techniches
* how show Person's r between features

``` python:example
#Calculate and show correlation matrix
cm = np.corrcoef(data.values.T)
sns.set(font_scale=1.5)
hm = sns.heatmap(cm,
                cbar=True,
                annot=True,
                square=True,
                fmt='.2f',
                annot_kws={'size': 15},
                yticklabels=cols,
                xticklabels=cols)
```
reference: https://towardsdatascience.com/machine-learning-project-predicting-boston-house-prices-with-regression-b4e47493633d

* how to measure the quality of models

  ``` python:example
# Import 'r2_score'

from sklearn.metrics import r2_score

def performance_metric(y_true, y_predict):
    """ Calculates and returns the performance score between 
        true (y_true) and predicted (y_predict) values based on the metric chosen. """
    
    score = r2_score(y_true, y_predict)
    
    # Return the score
    return score
```

* we have to choose which maximum depths is suitable for the model,
so visualization of models which have different maximum depths.

  ``` python:example
# Produce learning curves for varying training set sizes and maximum depths
vs.ModelLearning(features, prices)
```

it is easy which depth is good for the model.

  ``` python:example
# Produce complexity curve for varying training set sizes and maximum depths
vs.ModelComplexity(X_train, y_train)
```

for example if the depth is one, training and validation data don't return good score. It is called a symptom of undercfitting and so, high bias.
If the depth is maximum, the model learn perfectly well from training data and also returns poor results on test data. It is called a symptom of overfitting.

reference:https://towardsdatascience.com/machine-learning-project-predicting-boston-house-prices-with-regression-b4e47493633d
Gitを始めて最初に覚えたコマンド

`git help push`
コマンドのヘルプを見る（pushのヘルプ）。

`git --version`
gitのバージョンを確認する。gitが存在するかどうかの確認に使用。

`git init`
.gitフォルダを作成。カレントディレクトリをローカルリポジトリにする。

`git add`
ファイルをワーキングツリーからインデックスへ追加する（ステージング）。

`git add -A`
ローカルリポジトリ内全てのファイルをインデックスへ追加。

`git add .`
カレントディレクトリ以下全てのファイルをインデックスへ追加。

`git commit -m "test commit"`
ローカルリポジトリにコミットする。-mはメッセージ。

`git remote add origin git@github.xxx/xxxx.git`
リモートリポジトリを設定する。originは変数。

`git remote -v`
設定されているリモートリポジトリを確認する。

`git remote rm origin`
設定されているリモートリポジトリを取り消す。

`git fetch`
ブランチ情報を取得する。

`git checkout develop`
ブランチを切り替える。developは行き先ブランチ名。

`git push -u origin master`
プッシュする。originはローカルで決めたリモートリポジトリ名、masterはブランチ名。
[備忘録]Homebrewのインストール方法、コマンドについて

#環境
macOS Mojave 10.14.6
Homebrew 2.1.11

#Homebrewのインストール
[Homebrewの公式サイト](http://brew.sh/)に記載されている以下のコマンドを実行する。

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

「Command Line Tools」が必要なようだが、Homebrewをインストールする際に一緒にインストールしてくれる。
インストール完了後、以下のコマンドを実行してHomebrewの動作に問題がないことを確認する。

```
$ brew doctor
```

以下の結果が出力されれば問題なし。

```
Your system is ready to brew.
```

#Homebrewのコマンド
**インストール可能なパッケージを表示**

>```
$ brew search
```

>または

>```
$ brew -S
```

**パッケージをインストール**

>```
$ brew install [パッケージ名] 
```

**パッケージをアンインストール**

>```
$ brew uninstall [パッケージ名] 
```

**インストール済みのパッケージを確認**

>```
$ brew list
```

>または

>```
$ brew ls
```

**Homebrewとインストール済みの全てのパッケージをアップグレード**

>```
$ brew upgrade
```

**コマンドの一覧を表示**

>```
$ brew commands
```

**コマンドの使用法を表示**

>```
$ brew help [コマンド名]
```


#参考
[【Homebrew】Command Line Toolsのインストールについて  |  Sutepulu](https://sutepulu.com/homebrew-about-command-line-tools-installation/)
[Homebrewのインストールとrbenvのインストールまで Mac編 - Qiita](https://qiita.com/is-lab/items/e0443b79da117ed48294)
[Homebrewの使い方。よく使うコマンド一覧など詳しい解説まとめ | オリジナルゲーム.com](https://original-game.com/homebrew/)
【R】glmの結果の表をcsvで出力する

# はじめに
Rで分析した結果をcsvで吐き出せたらそのあと何かと楽だな～と思ったので作りました。
Rさん気が利かねーなーと思ってたので私が気を利かせたぞ。

```summary_table.r
summary_table <- function(result){

  tbl <- as.data.frame(summary(result)[[12]])
  tbl <- tbl[2:nrow(tbl), ]
  colnames(tbl) <- c("Estimate", "SE", "z-value", "p-value")
  write.csv(tbl, "result.csv")

  return(summary(result))

}
```
使い方は```summary(result)```の代わりに使うだけ。

# おわりに
今回私がやったのがglmだったのでz-valueになってるけど、これモノによってt-valueとか使い分けられたら便利だなと思います。今後改良していきます、多分ね。
おわり。
Vue + Typescript で forEach するとエラー core-js/modules/web.dom.iterable in ./src/main.ts

## エラー内容

~~~sh
$ yarn serve

# 中略

This dependency was not found:

* core-js/modules/web.dom.iterable in ./src/main.ts

To install it, you can run: npm install --save core-js/modules/web.dom.iterable
No type errors found
No lint errors found
Version: typescript 3.6.2, tslint 5.20.0
Time: 5261ms
~~~

`$ yarn add core-js/modules/web.dom.iterable` すると 405 エラー。

## 解決策

package.json の core-js のメージャーバージョンを 2 にしたら直りました。

~~~package.json
  "dependencies": {
    "core-js": "^2.6.7",
~~~

`$ vue create` した時のデフォルトの core-js は 2 だったのですが
何かのタイミングで package.json を変更して 3 にしていたようです。

## きっかけ

[Vue.js - 基底コンポーネントの自動グローバル登録](https://jp.vuejs.org/v2/guide/components-registration.html#%E5%9F%BA%E5%BA%95%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E8%87%AA%E5%8B%95%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E7%99%BB%E9%8C%B2) をしようとしました。

~~~js
requireComponent.keys().forEach(fileName => {
  // コンポーネントの自動登録
})
~~~

## 環境

~~~sh
$ vue -V
3.8.2

$ yarn -V
yarn install v1.17.3
~~~

## 参考

- [GitHub - core-js module error](https://github.com/vuejs/vue-cli/issues/3678)
std::vector<T>の初期化時の要素数について


# std::vector\<T>の要素数について
C++で可変長の配列とかリストを使いたいときに、まず候補として**std::vector\<T\>**があると思います。
配列のように要素が連続して配置されることが保証されているため、最初に確保されている領域を超える要素を追加すると保持している要素の再配置を行います。

そのため予め領域を確保しておくことで、再配置が行われず効率がよくなります。
領域を確保する方法として調べてみると、

1. コンストラクタでサイズを指定する
2. reserve()でサイズを指定する

がありましたが、どっちを使えばいいか忘れそうだったのでメモを残しておこうと思います。

内部で保持している要素数は、**size()**
確保されている領域サイズは、**capacity()**
で確認することができます。


##1 コンストラクタでサイズを指定する

コンストラクタにサイズを指定した場合は、領域を確保するだけでなく要素も生成します。
初期値は、0やnullptrになっていました。
クラスの場合は、引数なしのコンストラクタで初期化された要素が生成されます。

```cpp
std::vector<int> intVector(100);

// size == 100
int size = intVector.size();

// capacity == 100
int capacity = intVector.capacity();

// value == 0
int value = intVector[10];
```

##2 reserve()でサイズを指定する
reserve()で領域サイズを指定した場合は、内部的にメモリは確保しているようですが、要素は挿入されていない状態でした。

```cpp
std::vector<int> intVector;
intVector.reserve(100)

// size == 0
int size = intVector.size();

// capacity == 100
int capacity = intVector.capacity();
```

# まとめ
コンストラクタでサイズを指定すると要素の生成までするのに対して、reserve()では領域のみ確保し要素数は０となりました。

自分が使用するときは、push_back()、emplace_back()で要素を追加することばかりなのでreserve()を使うべきだと分かりました。

# 参考文献
- [vector - cpprefjp C++日本語リファレンス](https://cpprefjp.github.io/reference/vector/vector.html)
GitHub Actions で Swift を使えるようにしてみた。

# 概略

[Swiftをsetupしてくれるaction](https://github.com/marketplace/actions/swift-setup)を作ったよ。(完)



# はじめに

2019年11月13日に正式版が発表される予定のGitHub Actions[^github-actions-release]ですが、すでにベータ版での提供は始まっています。レポジトリのpushやPR作成といったイベントなどをトリガとしてスクリプトを走らせてくれる優れもの。CI/CDにもうってつけ。
[Actionsのアカウント](https://GitHub.com/Actions)もあって、[Rubyをセットアップしてくれるaction](https://github.com/actions/setup-ruby)や[Pythonをセットアップしてくれるaction](https://github.com/actions/setup-python)もあるわけです。当然Swiftをセットアップしてくれるactionもあるよね…？
………ありませんでした。
正式版登場時にはあるのかもしれませんが、今使いたい！
というわけで作った次第です。

[^github-actions-release]: https://github.blog/jp/2019-08-21-github-actions-now-supports-ci-cd/


# Actionの作り方

一つのレポジトリで動くだけで良いなら、 https://help.github.com/en/articles/workflow-syntax-for-github-actions に書かれているように、YAMLファイルを`.github/workflows`に配置するだけでOKなのですが…。
いろんなレポジトリで使いまわしたいactionを作るためには、なんと、Dockerを使うかJavaScript(Node.js)を使うかという選択肢しかないようです。(たぶん)
前出のsetup-rubyやsetup-pythonはJavaScript(TypeScript)で書かれていたので、自分もそうしてみました。
※JavaScriptを触るなんて10年ぶりくらい。*のちに初めて触るTypeScriptへ移行*


## 注意点

https://help.github.com/en/articles/creating-a-javascript-action にサンプルがあるのでその通りに作ればだいたいOKなのですが、多少ひっかかった部分もあるのでそれをここに記しておきます。


### 基本的に環境変数はステップを超えて引き継がれない

任意の場所に`swift`をインストールして`PATH`環境変数を書き換えて使いたいと思っていたら、うまくいかず…。`@actions/core`の`addPath`関数を使う必要があるようです。

```JavaScript
const core = require('@actions/core');
core.addPath('/path/to/bin/dir')
```


### シェルは非同期で実行される

`@actions/exec`に`exec`という関数があるのですが、`async`なfunctionであるため注意が必要です。
たとえば

```JavaScript
const exec = require('@actions/exec')
exec.exec('mkdir', ['-p', '/my/new/directory'])
exec.exec('cd', ['/my/new/directory'])
```

ということをすると、`mkdir`が完了する前に`cd`が実行されてしまい、そんなディレクトリはないと怒られることがあります。こういった場合は同期的に実行する必要があるようです。setup-swiftでの実際の実装は、[ソース](https://github.com/YOCKOW/Action-setup-swift/blob/master/main.ts)をご覧ください。


### その他

ほかにも何かあった気がするのですが…。思い出したら追記します。


# Actionの使い方

公式ドキュメントを参照いただければと思いますが、たとえば、macOSには最初からSwiftが入っているのでUbuntuの時だけSwiftをインストールしたいということであれば、次のようになります。

```yaml
name: Swift CI
on: [push, pull_request]
jobs:
  Test:
    strategy:
      matrix:
        os: [ubuntu-latest, macOS-latest]
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@master
    - uses: YOCKOW/Action-setup-swift@master
      with:
        swift-version: '5.0.3'
      if: startsWith( matrix.os, 'ubuntu' )
    - name: Test
      run: swift test
```


# おわりに

みなさんもGitHub Actionsで快適なSwift生活を。
「rails s」で「webpacker」が出た時の対処法

##開発環境
```
windows
ruby 2.5
rails 6.0
```

##エラー内容

rails newをしてサーバを立ち上げようと思ったら、エラー発生。

```
・・・（省略）

C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/webpacker-4.0.7/lib/webpacker/configuration.rb:91:in `rescue in load': Webpacker configuration file not found  Please run rails webpacker:install Error: No such file or directory @ rb_sysopen -  (一部省略)

```

まずは、言われている通りにする。

```commnd
$ rails webpacker:install
```

```
Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/
```
yarnをインストールしろとのことなので、yarnをインストールする。
自分はnpmからインストールした。
なお、npmからインストールするにはnode.jsをインストールしておく必要がある。
node.jsのインストールに関しては[こちら](https://qiita.com/Masayuki-M/items/840a997a824e18f576d8)を参照。

```command
$ npm install -g yarn
```
再び、webpackerをインストールする。


```
$ rails webpacker:install
・・・（省略）
$ rails s
```
![2019-09-22 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169545/da995587-80e1-9c71-02d5-c2466707564d.png)

##参考
[windows10にNode.jsをインストールする](https://qiita.com/Masayuki-M/items/840a997a824e18f576d8)
macOSでPython環境の構築

#前提条件
macOSでAzure開発用にPythonをセットアップしたときのメモです。
Azureでは現在Python3.6.Xをサポートしているので、Python3.6.9をインストールします。

# Xcodeのインストール
Apple Storeから[Xcode]("https://apps.apple.com/jp/app/xcode/id497799835?mt=12&ign-mpt=uo%3D4")をインストールする。

インストール後、コマンドライン・デベロッパ・ツールをインストールするためterminalで以下のコマンドを実行する。

```
$ xcode-select --install
```
利用規約の同意が聞かれるので、同意してインストールを進める。

# Homebrewのインストール
[Homebrew公式サイト]("https://brew.sh/index_ja.html")に従って、下記スクリプトをterminalで実行する。

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
# Pythonのインストール
はじめに、複数のPython環境が使えるようにpyenvをインストールします。

```
$ brew install pyenv
```
pyenvのインストール後に、Python3.6系列のバージョンにおいてインストールできるバージョンの確認を行います。

```
$ pyenv install --list  | egrep '^[ ]+[3]\.[6]\.[0-9\.]+$' 
```

ここでは、AzureでサポートされているPythonが3.6系列のため、Python3.6.9をインストールします。

```
$ pyenv install 3.6.9
```

通常使用するPythonを変更します。

```
$ pyenv global 3.6.9
```

Pythonの設定を行っていきます。
ベースとなるPythonには、今回の設定以外のパッケージをインストールせずにvirtualenvかpipenvで制作するプロジェクト内で、パッケージをインストールしてもらいます。

```
$ python -m pip install pipenv virtualenv
```

最後に、pyenv-virtualenvをインストールして、Python環境の構築は完了です。

```
$ brew install pyenv-virtualenv
```

以上です。お疲れさまでした。

# 引用
参考にさせていいただきました。ありがとうございます。
・[macOSにHomebrewをインストール](https://qiita.com/pypypyo14/items/4bf3b8bd511b6e93c9f9)
・[MacOSとHomebrewとpyenvで快適python環境を。](https://qiita.com/crankcube@github/items/15f06b32ec56736fc43a)
【Kotlin:Androidアプリ】EditTextに文字列（または数値）のみを入力できるようにする方法 & 入力できる文字数（または桁数）を指定する方法

## はじめに
今回は、名前や電話番号などを入力する項目に文字列（または数値）のみを入力できるように設定したい場合の方法と、入力できる文字数（または桁数）を指定する方法について調べたことをまとめました。

## 事前説明
まず先に文字列の入力と文字数の指定について説明した後に、数値の入力と桁数の指定について説明します。
（今回はIDEにAndroidStudio、文字や数字を入力する際にEditTextを使用しています。）

## 設定方法
#### 文字列のみ入力・文字数指定
xmlファイルにEditTextを配置した後、デザインタブからテキストタブに切り替えると以下のように表示されます。（以下、サンプル1）

```kotlin:activity_example1.xml

<EditText  //例1
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:id="@+id/editTextAddItemName"
        app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent"
        android:layout_marginTop="158dp" app:layout_constraintEnd_toEndOf="parent" android:textAlignment="center"/>
```
上記のコードに以下を追加します。

```kotlin
        android:inputType="text"  //入力値を文字列に指定
        android:maxLength="10"    //入力できる文字数
```

以上で完了です。

android:inputType="text"を指定しているので、EditTextに何かを入力する時は文字入力のキーボードが表示されます。また、1, 2, 3...と数字を入力しても数値ではなく文字列として認識されます。

#### 数値のみ入力・桁数指定

同様にxmlファイルにEditTextを配置した後、デザインタブからテキストタブに切り替えると以下のように表示されます。（以下、サンプル2）

```kotlin:activity_example2.xml

<EditText  //例2
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:id="@+id/editTextAddItemName"
        app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent"
        android:layout_marginTop="158dp" app:layout_constraintEnd_toEndOf="parent" android:textAlignment="center"/>
```
上記のコードに以下を追加します。

```kotlin
        android:inputType="number"   //入力値を数値に指定
        android:digits="0123456789"  //入力できる数字
        android:maxLength="5"        //入力できるケタ数
```

以上で完了です。

android:inputType="number"を指定しているので、EditTextに何かを入力する時は数字入力のキーボードが表示されます。textを指定した時とは違い1, 2, 3...と入力すると文字列ではなく数値として認識されます。
また、android:digits="0123456789"とすることで、入力可能な数字や記号を指定できます。"123"と指定すると1, 2, 3以外は入力できなくなり、"0123456789-."と指定すると-（マイナス）や.（小数点）も入力できるようになります。

## おわりに
今回はinputTypeに文字や数字（textやnumber）を指定する方法について触れましたが、他にも色々な指定の方法があるので気になる方は @joji さんの以下のページを参照してみてください。
https://qiita.com/joji/items/41cc6cbedb7b84b632df
それでは、ここまで読んでいただきありがとうございました。
AI学習の備忘録　#2

前回に引き続き、AI学習を進めている。最近になってようやくオライリージャパンの「Pythonで始める機会学習」、「ゼロから作るDeep-Learnning」を購入できた。低収入者には痛い出費である。

以前の記事まで読み進めた部分から再開した。

自宅では基本的にPycharmを使用している。これはローカルで動作するIDEで「独学プログラマー」の著者、コーリー・アルソフも勧めている。

そんなPycharmはスマホのような予測変換や候補表示をするので大変便利だが、いかんせん環境構築でトラブルが発生しやすい。

今まではGoogle Colaboratoryを使用し、難なくインストールできたmglearnも特定のフォルダにフォルダをペーストしたり、numpyで使用するmklも正常に動作している別のPCから.dllのデータをメールで送ってペーストして回復させるなどかなり面倒なことをしてきた。

だが、現在も複数のトラブルにより学習が妨げられている。

「Pythonで始める機会学習」のP116~118 決定関数のコード実行するところで以下のような問題が発生している。

１．scikit-learnを使用するにあたり、
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import make_circles
これらのコードを動かすと、

DeprecationWarning: sklearn.externals.joblib is deprecated in 0.21 and will be removed in 0.23. Please import this functionality directly from joblib, which can be installed with: pip install joblib. If this warning is raised when loading pickled models, you may need to re-serialize those models with scikit-learn 0.21+.
  warnings.warn(msg, category=DeprecationWarning)

DeprecationWarning: The module is deprecated in version 0.21 and will be removed in version 0.23 since we've dropped support for Python 2.7. Please rely on the official version of six (https://pypi.org/project/six/).
  "(https://pypi.org/project/six/).", DeprecationWarning)

これらの警告が出てくる。調べるとこれは警告であってプログラムの動作に影響はないらしい。どれも今使ってるものは次のバージョンだと使えなくなるから、新しいやり方でやれ、と言いたいらしいがさっぱりわからない。さらに調べる。

２．Intel MKL FATAL ERROR: Error on loading function mkl_serv_load_vml.

numpyとの因果関係は不明

ちなみにjupyter, google colaboratoryでも同様の事例発生。
頑張って解決します。
RN(expo)でカメラで写真をとってfirestoreに保存する


自分用のメモ。

こちらの記事は古いので[こちら](https://qiita.com/zaburo/items/729f145735ecdc5c660c)をどうぞ。

## 注意

このコードにはFirebase Authで認証している箇所がないので、Firestore側のパーミションが下記のように誰でも書き込みOKとなっている必要があります（よくないです）。

```js
rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      //allow read, write: if request.auth != null;
      allow read, write;
    }
  }
}

```
で、実装。めんどくさいのでApp.jsに全部書いた。


```js:App.js
import React from 'react';
import { StyleSheet, Text, View, Button } from 'react-native';
import * as firebase from 'firebase';
import 'firebase/firestore';
import * as ImagePicker from 'expo-image-picker';
import Constants from 'expo-constants';
import * as Permissions from 'expo-permissions';

const firebaseConfig = {
    apiKey: "xxxxxxxxxxx",
    authDomain: "xxxxxxxxxxx",
    databaseURL: "xxxxxxxxxxx",
    projectId: "xxxxxxxxxxx",
    storageBucket: "xxxxxxxxxxx",
    messagingSenderId: "xxxxxxxxxxx",
    appId: "xxxxxxxxxxx"
};

firebase.initializeApp(firebaseConfig);
const db = firebase.firestore();

export default class App extends React.Component {

    componentDidMount = () => {
        this.getPermissionAsync();
    }

    getPermissionAsync = async () => {
        if (Constants.platform.ios) {
            const { status } = await Permissions.askAsync(Permissions.CAMERA_ROLL);
            if (status !== 'granted') {
                alert('カメラ利用の許可が必要です。')
            }
        }
    }

    onChooseImagePress = async () => {
        let result = await ImagePicker.launchCameraAsync();
        //ライブラリから選ぶ場合
        // let result = await ImagePicker.launchImageLibraryAsyn();

        if (!result.cancelled) {
            this.uploadImage(result.uri, "test-image")
                .then(() => {
                    alert("success");
                })
                .catch(e => {
                    alert(JSON.stringify(e));
                })
        }
    }

    uploadImage = async (uri, imageName) => {

        //元のファイルからblobを生成
        const response = await fetch(uri);
        const blob = await response.blob();

        //firestoreの保存場所指定
        var ref = firebase.storage().ref().child("images/" + imageName);

        //保存場所にput
        return ref.put(blob);
    }
    render() {
        return (
            <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
                <Text>App</Text>
                <Button
                    title="Choose image..."
                    onPress={() => this.onChooseImagePress()}
                />
            </View>
        );
    }
}
```
#VSCode でお手軽に #javascript を実行するには CodeRunner プラグインをインストールして 、コマンドパレットから Run Code を実行するだけ。

# プラグインのインストール

![image](https://user-images.githubusercontent.com/13635059/65382117-4a3e9300-dd39-11e9-8762-4c29d555ec31.png)

# お試しコードをファイルに書いて保存する

適当に `foo.js` とかいう名前をつけて保存。

```
a = 1;
console.log(a);

```

# コマンドパレットを開いて Run Code を実行する

画面下のコンソールで結果が確認できる。

![image](https://user-images.githubusercontent.com/13635059/65382118-4ca0ed00-dd39-11e9-8b69-8cd17f997c18.png)




# ショートカット

Macだと Control + Option + N でショートカット実行できそう。


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2505








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
完全な脱Karabiner-Elements成る。続Ultimate Hacking Keyboard (UHK) がなかなか良い。

## 前回の記事の訂正
[前回の記事](https://qiita.com/AngryMiddleAgedMan/items/65e0a1b46c4d18f4f718)
前回の記事で、UHKがKarabiner-Elementsと比べて複雑なキーマッピングができないと書きました。一部正しいのですが、例で挙げていた「単独で押した場合はある入力a、押しっぱなしにして別のキーと一緒に押したら別の修飾キーbとして入力される」という設定はUHKでも簡単にできました。むしろ、Karabiner-Elementsよりスマートでした。

記事を書いた翌日に気づきました。完全に間違った情報をお伝えしてしまったため、訂正いたします。

## 単独 -> キー入力a, 押しっぱなし -> 修飾キーb の設定のしかた
下図のように、通常のロールの部分に単独で押した場合に入力したいキー操作を入れ、`Secondary role`に押しっぱなしにした場合の修飾キーを入れるだけです。
<img width="580" alt="Screenshot 2019-09-22 13.53.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115243/08a04e1b-5067-8275-2e05-7c3cd62849a8.png">

## 変更後の基本のキーマッピング
[前回の基本のキーマッピング](https://qiita.com/AngryMiddleAgedMan/items/65e0a1b46c4d18f4f718#%E5%9F%BA%E6%9C%AC)
- ShiftキーがSpaceキーとまとまり、親指で押せるようになったことで、打ちやすさが格段に上がりました。
- 言語変更ボタンも他の修飾キーとまとまったことによって、他のキーを親指下に割り当てることができ、シンプルかつ修飾キーを親指に集めることができました。
- Cmdキー・Optionキー・Controlキーの場所は未確定で、今後必要があれば修正していきます。
<img width="1017" alt="Screenshot 2019-09-22 14.16.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115243/745a2952-99dd-12d7-e116-f78992c741d5.png">

## まとめ
この変更ができたことによって、私のKarabiner-Elementsの設定を全てUHKに置き換えることができました。
IOS + monaca + FCMの利用手順

開発用の手順です。
個人だと、たまにしかやらないので忘れる。。。ということでメモ
・コンソールのデザインは変わる事があるので、画像はなし

公式の手順
[iOS アプリのビルド](https://docs.monaca.io/ja/products_guide/monaca_ide/build/ios/build_ios/)
[iOS のプッシュ通知設定](https://docs.monaca.io/ja/products_guide/push_notification/apns/)
[Cordova Firebase プラグイン](https://docs.monaca.io/ja/tutorials/firebase/)

##以下の順に作業します
1. ビルド時に利用する証明書
2. App ID
3. プロビジョニングプロファイル
4. Firebase
5. プッシュ通知証明書

##1. ビルド時に利用する証明書
1.monaca上の操作
　IOSビルド設定にて秘密鍵とCSRを作成し、CSRをダウンロード

2.Apple Developer上の操作
　Certificatesにて証明書の作成へ
　・DevelopmentのiOS App Developmentを選択
　・1.1の手順で作成したCSRをアップロード
　・作成された証明書をダウンロード

2.monaca上の操作
　IOSビルド設定にて1.2の手順で作成した証明書をアップロード
　※プロファイル作成後でも可

##2. App ID

1.Apple Developer上の操作
　IdentifiersにてAPPIDの作成へ
　・PlatformはiOS, tvOS, watchOSを選択
　・Bundle IDはIOSアプリ設定で確認したiOS のバンドル IDを設定
　・Capabilitiesは利用するサービスを選択

##3. プロビジョニングプロファイル
1.Apple Developer上の操作
　Profilesにてプロファイルの作成へ
　・DevelopmentのiOS App Developmentを選択
　・2.1で作成したApp IDを選択
　・1.2で作成した証明書を選択
　・開発用端末を選択(登録していなければ、Apple DeveloperのDevicesに端末を登録する)
　・プロビジョニングプロファイルの名前を入力
　・作成されたプロビジョニングプロファイルをダウンロード

2.monaca上の操作
　IOSビルド設定にて3.1の手順で作成したプロビジョニングプロファイルをアップロード

##4. Firebase
1.Firebaseコンソール上の操作
　・プロジェクトを作成
　・プロジェクトセッティングにてIOSアプリの設定を作成
　・monacaのIOSアプリ設定で確認したiOS のバンドル IDを設定
　・GoogleService-Info.plistをダウンロード
　・continueで設定を完了する

2.monaca上の操作
　・4.1でダウンロードしたGoogleService-Info.plistをプロジェクトのルートフォルダへ配置

##5. プッシュ通知証明書
1.monacaのバックエンド上の操作
　・バックエンド設定にて秘密鍵とCSRを作成
　・CSRのダウンロード

2.Apple Developer上の操作
　・Certificatesにて証明書の作成へ
　・ServicesのiOS Apple Push Notification service SSL (Sandbox)を選択
　・既存のAPPIDを選択
　・monacaで作成した秘密鍵をアップロード
　・作成された証明書をダウンロード

3.monacaのバックエンド上の操作
　・5.2で作成した証明書をアップロード
　・エクスポートにてP12ファイルをダウンロード、パスワードも入力しておく

4.Firebaseコンソール上の操作
　・4.1で作成したIOSアプリの設定を開く
　・APNs CertificatesのDEV側に5.3でダウンロードしたP12ファイルをアップロード
Ndivia driver のカーネルのバージョン固定方法


# Nvidia driver のカーネルのバージョンを固定する方法

nvidiaのドライバーをカーネルのバージョンを固定しないでいると、アップグレードとかしたときにドライバとの依存関係が崩れるようなので、そのやり方をメモとして残しておきます。


## 1. aptitude のインストール

```
$ sudo apt-get install aptitude
```
#### aptitudeとは

- [ ]  Debian GNU/Linux のパッケージシステムに対するテキストベースのインタフェース
- [ ]  ユーザはパッケージの一覧を表示したり、パッケージのインストール・更新・削除などといったパッケージ管理作業ができる。
- [ ]  アクションはビジュアルインタフェースとコマンドラインから
       行えます。


## 2. カーネルのバージョンの確認

```
$ aptitude show linux-generic
```

## 3. カーネルのバージョンの固定

*2.カーネルのバージョンの確認* で確認した内容を以下のファイルの書き込みます。

```
cd /etc/apt/preferences.d
sudo vim linux-kernel.pref
```
各自自分のカーネルのバージョンに合わせて作成して下さい。

```/etc/apt/preferences.d/linux-kernel.pref
Package: linux-generic
Pin: version 4.15.0.64.66
Pin-Priority: 1001

Package: linux-headers-generic
Pin: version 4.15.0.64.66
Pin-Priority: 1001

Package: linux-image-generic
Pin: version 4.15.0.64.66
Pin-Priority: 1001
```

# +α  Nvidia driverをapt-getでインストールする方法

#### PPAリポジトリを追加してインストール

```
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-driver-XXX
$ sudo reboot
```
###### そもそもPPAリポジトリとは何か？

この内容については、[Ubuntu LinuxのPPAって？](https://kazuhira-r.hatenablog.com/entry/2019/03/10/225459)で以下のように説明されています。


>PPAとは、「Personal Package Archive」の略です。

>パッケージ配布側から見た場合、PPAを使うとソフトウェアを配布できるようになります。利用側から見ると、PPAを使って
公開されたパッケージを利用して、aptなどでインストールを行うことができます。

>また、インストールされたパッケージの更新も、PPAでaptを使ったインストールだと追従してくれます。

> ただ、PPAが「Personal」という名前から指している通り、Ubuntuディストリビューション公式に承認されたものではない
というのが注意点ですね。要は自己責任で導入しましょう、と。

####インストールされているか確認

```
$ nvidia-smi
```

#終わりに

とりあえず、カーネルのバージョンの固定はしておいた方が良いです。
nvidia-driverをインストールした後は、cudaとcudnnをインストールしますが面倒なので dockerでやる方法があるようです。
時間があるときにそちらのやり方も試して見たいと思います。

#参考文献
この記事は以下の情報を参考にして執筆しました。

[UbuntuにNVIDIAドライバを入れる手順](https://qiita.com/Reizouko/items/c5826dbcc113321fbbcd)
[Ubuntu manpage](http://manpages.ubuntu.com/manpages/bionic/ja/man8/aptitude-curses.8.html)
Flutter v1.9.1+hotfix.2でbuild appbundleに失敗する

Flutter v1.9.1+hotfix.2でbuild appbundleに失敗します。

gradleプラグインv3.5.0の仕様変更によるものだそうで、gradleプラグインv3.4.2にすると成功します。Flutterの最新master channelでは解決していますが、stable channelでは次バージョンまで解決を待つ必要があります。

https://github.com/flutter/flutter/issues/38934

たぶん3か月くらいしか意味が無いノウハウですが、共有しておきます。
当方 #javascript 初心者だけど、コンソールから動作確認をしたいときは #node を使えば良いのでは？ ブラウザ開きたくないし。HTMLファイルも使わない。

正しいかどうかは知らない。

# イメージ

![image](https://user-images.githubusercontent.com/13635059/65381992-5b86a000-dd37-11e9-80da-14f9fccd8ee6.png)

# こんな計算とか、手軽にやりたい

![image](https://user-images.githubusercontent.com/13635059/65382015-c0da9100-dd37-11e9-977f-a9ad415ac5ec.png)

# やり方

[MacにNode.jsをインストール - Qiita](https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09)

---

```
node
```

```
$ node
> Math.ceil(.95)
1
> Math.ceil(-7.004)
-7
> Math.ceil(4)
4
>
```



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2504








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
DCGANでモンスターハンター・アイスボーンの新種のモンスターを作成してみた！！

# はじめに
- 最近、機械学習とモンスターハンターワールド・IBにハマりだした拙いものです。
- 「新種のモンスター作成」というテーマでMHWIBのモンスターの画像データセットでDCGANを使用して新しいモンスターを作ってみました。

# 実行環境
- MacOS 10.14.6
- Python 3.7.4
    - Pythonの必要なライブラリは各自インストールしてください。

# DCGAN について
- [DCGAN](https://www.cresco.co.jp/blog/entry/7502/)については自分はこちらがわかりやすかったので参照しました。また、[こちら](https://www.youtube.com/watch?v=2rC2_-HtpsQ)も図で説明しているので自分のような初心者でもわかりやすいと思います。

# データセット
- かなり雑にですが画像を集めました。
- "rot-1"ファイルはオリジナル画像を-1度回転させたもの、flipは左右反転させて水増ししたものです。(本当は水増しはよくないらしい(汗))

# Step
#####1. こちらの[Github](https://github.com/kanzaki0507/mhw_dcgan)からcloneしてください。

```
git clone https://github.com/kanzaki0507/mhw_dcgan.git
```

#####2. mhw_IB_dcgan.py を実行する。

```
python mhw_IB_dcgan.py
```

# 結果
今回は10000 epoch行い1000 epochごとに画像生成するように設定しました。また、保存されるディレクトリは"newMonster"というディレクトリ名にしています(ここは好きなように変更できます)。

```mhw_IB_dcgan.py:
#実装部分
if __name__ == '__main__':
     gan = DCGAN(ans_path = "./img/", save_path = "./newMonster/", save_name = "monster")
     gan.Generator()
     gan.Discriminator()
     gan.Combined() 
     gan.train(epochs = 10000, itv=1000)
```

#####1000 epoch
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501252/cfb525e4-bcbd-78b6-15ed-103c93644cbf.png)

#####10000 epoch
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501252/0f16b93c-e867-c362-25c9-31983a789002.png)
遠目で見るとモンスターのような気もしない・・・
やはりGANのチューニングは難しい！！

# 最後に
- GANはチューニングが難しいので各パラメーターを少し変えてみることで良いものができるかもしれません。
- imagechange.pyで画像サイズを変更できますが、変更するとmhw_IB_dcgan.pyのimg_size部分とGenerator, Discriminatorのレイヤーサイズを修正する必要があるのでsummaryをみながら注意してください。

# 余談
自分は長時間待つのが嫌だったのでGoogle DriveにimgファイルをアップロードさせてGoogle ColaboratoryでGPUを活用し画像生成しました。Google Colaboratoryを使うのなら、はじめに必ずマウントする必要があります。 -> [[マウント方法]](https://qiita.com/k_uekado/items/45b76f9a6f920bf0f786)

#参考にしたサイト
- [DCGANによるポケモン生成](https://qiita.com/Kohey1480/items/1d72b7f2a4ea92915734)
- [機械学習のデータセット画像枚数を増やす方法](https://qiita.com/bohemian916/items/9630661cd5292240f8c7)
Google Cloud PlatformにSSLウェブサーバーの作成

#はじめに
AWSのroute53でDNSを登録すると毎月料金が発生します。
GCPでは無料で使えるのでご紹介させていただきます。
#Compute Engineの作成
「Compute Engine」の「VMインスタンス」を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/b01d2967-d026-5a83-996e-46a4b04fa76d.png)
us-east-4(北バージニア)以外のusリージョン、f1-microタイプはは無料で使えます。
今回はUbuntu16.04LTSで作成してみます。
1分位待つとVMインスタンスに接続ができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/06a65396-bca1-168a-0cbb-8da4234d0ab8.png)
「ブラウザウィンドウで開く」を選ぶとブラウザ上でインスタンスに接続ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/1dff46dc-216d-5494-29d7-4b43ade3c2de.png)
#Apacheのインストール
ubuntuを最新化します。
```sudo apt-get update```
```sudo apt-get upgrade```
apacheをインストールします。
```sudo apt-get install apache2```
apacheのステータスを確認します。
```systemctl status apache2```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/4ea7cf05-2f76-0c57-a329-9ccf3dd4efa1.png)
自分の外部IPを確認して、ブラウザに移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/21e1bf86-08fb-d08e-9fcb-c306925bd397.png)
apacheのインストールができました。
#Domain登録
<https://freenom.com>で無料ドメインを取得します。
GCPのネットワークサービスにあるCloud DNSで「DNSゾーンの作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/767cef26-a0a1-fbfd-80f3-484fa130bd59.png)
freenom.comで取得したDNS名で作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/1bd1c613-c0b3-7e17-8a9b-6648837d74aa.png)
NSタイプのデータをfreenom.comのネームサーバーに設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/be285949-6ac4-db4c-ab66-944c54750f59.png)
Aレコードを作成します。
IPv4アドレスに自分のGCEインスタンスの外部IPを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/30d15cb7-46d6-aba7-631a-4824af02b1c3.png)
少し時間が過ぎると、freenom.comで取得したDNS名で接続ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/a507a34b-1a06-c5a8-eef9-f3a450d3015d.png)

#ApacheのSSL化
apacheに「Let's Encrypt」と「certbot」を利用してSSL接続ができるようにしましょう。
###Let's Encryptとは
>wikipediaから抜粋
Let's Encrypt（レッツ・エンクリプト）は、2016年4月に正式に開始された認証局である。自動化された発行プロセスにより、TLSのX.509証明書の発行を無料で行っている。

###certbotとは
>https://certbot.eff.orgから抜粋
Certbot is a free, open source software tool for automatically using Let’s Encrypt certificates on manually-administrated websites to enable HTTPS.

###certbotのインストール
```sudo add-apt-repository ppa:certbot/certbot```
```sudo apt-get update```
```sudo apt-get install certbot python-certbot-apache```

###SSL認証
```sudo certbot --apache -d [自分のDNS名]```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/a81a5ecb-b6ef-a8bd-eff4-4f10bfaf4002.png)
メールアドレスと同意の「a」とno-redirectの「1」を入力するとSSL認証ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/579abb93-04ea-f611-398f-e922829bfe4e.png)
ブラウザーでSSLされているのを確認できます。

###certbotの自動更新
「Let's Encrypt」は90日が有効期間です。
毎月1回は有効チェックするのをおオススメします。
crontabに
```1 0 1 * * sudo certbot renew```
を登録すると毎月初日00:01に認証書を更新します。

#終わりに
簡単にGoogle Cloud PlatformにSSLウェブサーバーを作ってみました。
certbotがあれば、SSLの更新に気にする必要がないから開発に集中できると思います。
ありがとうございます。
WebSocketは、OPENイベント発火からCONNECTINGになるまでに、少し間がある

WebSocketは、OPENイベントが発火してから、実際にCONNECTING状態になるまでに少し間があり、その間にデータを送信するとこけます。

検索したら、いくつか解決策があったのですが、JavsScriptに関する限り、自分は以下で乗り越えました。->　OPENイベントの直後のデータ送信は、またCONNECTINGになっていないという前提で、Statusをチェックして、まだConnectingでないなら少したってから試す。

```javascript

function safeSend(socket, param) {
    console.log('safeSend to ' + socket.url);
    switch (socket.readyState) {
        case socket.OPEN:
            socket.send(param);
            break;
        case socket.CONNECTING:
            setTimeout( safeSend(socket, param), 100 );
            break;;
        case socket.CLOSING:
        case socket.CLOSED:
            console.log('websocket is CLOSING or CLOSED');
            break;
    };
}
...
メインの処理
 　　ws.onopen = () => {
        safeSend(ws, '...');
　　　　...
    };
    ...
    ws.onmessage = e => {
        //接続された後の処理
　　　　ws.send('...');
...
```

一方、Pythonのaiohttpでは、WebSocketの状態が取れないので、同じような解決策は取れません。
レベル3AIアシスタント構築ツール

# 概要
自動運転にもレベル0-5があるようにAIアシスタントにも5段階の洗練度があります。
今回は、この5レベルのAIアシスタントとは何なのかを紹介し、現在利用できるレベル3のアシスタント構築ツールを紹介します。

# AIアシスタント
## レベル1: 通知アシスタント
lineやmessengerなどでのメッセージ通知が可能

例：アシスタントがメッセンジャーで、1か月以内に保険を更新する必要があるというメッセージ通知を送信。

## レベル2: FAQアシスタント
多段階のやりとりと基本的なやりとりが可能

例：messengerで保険チャットボットに質問すると、実際に質問に対する応答が返答。ただし、対話型ではない。応答は特定のヘルプではなく一般的なヘルプとして判断。「いくらですか？」に対する応答では、「Webサイトで更新価格を計算できます」のような応答になる。

## レベル3: コンテキストアシスタント
ユーザーが以前に言ったこと（コンテキスト）を考慮して、予期しない入力を理解して対応。

例：保険の見積もり更新において、
以前と変わったことを尋ねられ、価格が設定され、メッセンジャーで新しいポリシーを直接購入できる。

## レベル4: パーソソナライズアシスタント
コンテキストに基づいて連絡を取り、積極的に手を差し伸べるのに適したタイミングを学習する。好みを記憶し、あなたに究極の、パーソナライズされたインターフェースを提供。

例：すべての詳細を尋ねる必要はなく、実際の状況に合わせた見積もりを提供する前に、いくつかの確認事項を確認し提案。

## レベル5: アシスタントの自律組織
すべての顧客を知り、マーケティング、販売、人事、財務などのリードジェネレーションから企業運営の大部分を実行するAIアシスタントのグループが存在するように。

## レベル5アシスタント概略図
![5Levels_AIAssistants.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218202/2edf081e-9174-7afc-c4c5-1794750e15a7.png)


# レベル3アシスタント構築ツール
レベル3のアシスタント構築ツールであるRasaとdialogflowを比較しながら紹介します。

## Rasa
簡単な質問に答える以上のボットを展開するための開発者および製品チーム向けのオープンソースの機械学習ツール。
Rasaには、Rasa NLUとRasa Coreが付属している。Rasa NLUはインテントとエンティティを処理し、Rasa Coreはダイアログとフルフィルメントを処理する。

## Dialogflow
DialogflowはGoogleが出しているツール。
APIとWebインターフェイスを備えた完全なクローズドソース製品で、以前はapi.aiとして知られており、2016年にGoogleに買収された。

## Rasa vs Dialogflow
### Rasa長所: 
 - オンプレミスソリューション

 - 高度にカスタマイズ可能

さまざまなパイプラインを使用して、ユーザーダイアログを処理可能。spaCy + sklearnはデフォルトのバックエンドですが、MITIEも使用可能。

 - rasaフレームワークは、単純なhttpサーバーとして実行するか、PythonからAPIを使用可能。

 - Rasa-nluをサーバーとして実行すると、LUISやWit.aiなどの他の商用NLPプラットフォームを模倣可能。これにより、既存のアプリケーションをrasa-nluに簡単に移行できるr。

### Rasa短所: 
 - 学習曲線

インストール、構成、およびトレーニングの段階では、機械学習の専門知識が必要。

 - すぐに使用できないコンテキストベースの会話

チャットボットは、会話のコンテキストを理解および維持し、応答する。
たとえば、ユーザーは「デリーの天気は？」と尋ねると、デリーの天気の説明を返信する。ユーザーが再び「バンガロールについてはどうですか？」と尋ねた場合、ボットはユーザーがまだ天気について話していることを理解する必要がある。これは、コンテキストを理解し維持することによって行われる。
Rasa-nluはコンテキストを自動的に維持せず、個別にプログラムする必要がある。

 - 統合

他のメッセージングプラットフォームやデバイスとすぐに統合可能。

### Dialogflow長所: 
 - クラウドベースのサービスであるため、典型的なクラウドベースのサービスのすべての利点が適用可能。

 - 構築、展開、保守が簡単です。モデルのトレーニングは自動。

 - Webhookはどこにでもデプロイでき、通常のWeb開発者が構築可能

 - コンテキスト管理が組み込まれている。

 - 典型的な歓迎の会話、別れの会話、およびささいな会話には、コーディングやモデルのトレーニングの必要なし。Dialogflowにはこれらの機能が既に組み込まれている。必要に応じてカスタマイズもできる。

 - Google Assistant（Google Home）、Line、Facebookメッセンジャー、Twitter、Slack、Viber、Skype、Telegram、Kik、Line、Amazon Alexa、Microsoft Cortana、Cisco Sparkなどに統合可能。

 - 組み込みの複数の言語オプション

### Dialogflow短所:
 - トラフィック量が少ない場合、サービスは無料だが、量が増えると有料プランに移行する必要がある。

 - ダイアログ処理を細かく制御することができない。

# 参照
[The next generation of AI assistants in enterprise](https://www.oreilly.com/radar/the-next-generation-of-ai-assistants-in-enterprise/)
[Rasa official](https://blog.rasa.com/)
[Dialogflow official](https://dialogflow.com/)
[Building Chatbots - A comparison of Rasa-NLU and Dialogflow](https://www.linkedin.com/pulse/building-chatbots-comparison-rasa-nlu-dialogflow-justin-jose)
日本語キーボード上で英語配列を使うxkeysnail設定

ThinkPad X230にUbuntu18.04を導入しました。
xkeysnail 0.2.0

```config.py
define_keymap(None, {
    ## 日本語キーボード上で英語配列を使う設定
    K(      "GRAVE"): K("Shift-LEFT_BRACE"), # [半角/全角]
    K("Shift-GRAVE"): K("Shift-EQUAL"),
    K("Shift-KEY_2"): K("LEFT_BRACE"),
    K("Shift-KEY_6"): K("EQUAL"),
    K("Shift-KEY_7"): K("Shift-KEY_6"),
    K("Shift-KEY_8"): K("Shift-APOSTROPHE"),
    K("Shift-KEY_9"): K("Shift-KEY_8"),
    K("Shift-KEY_0"): K("Shift-KEY_9"),
    ## [Minus]は共通
    K("Shift-MINUS"):       K("Shift-RO"),
    K(      "EQUAL"):       K("Shift-MINUS"),
    K("Shift-EQUAL"):       K("Shift-SEMICOLON"),
    K(      "YEN"):         K("BACKSPACE"),
    K(      "LEFT_BRACE"):  K("RIGHT_BRACE"),
    K("Shift-LEFT_BRACE"):  K("Shift-RIGHT_BRACE"),
    K(      "RIGHT_BRACE"): K("BACKSLASH"),
    K("Shift-RIGHT_BRACE"): K("Shift-BACKSLASH"),
    ## [Semicolon]は共通
    K("Shift-SEMICOLON"):   K("APOSTROPHE"),
    K(      "APOSTROPHE"):  K("Shift-KEY_7"),
    K("Shift-APOSTROPHE"):  K("Shift-KEY_2"),
    K(      "BACKSLASH"):   K("YEN"),
    K("Shift-BACKSLASH"):   K("Shift-YEN"),
}, "Global")
```

個人的には[半角/全角]は”GRAVE”発生のままとし、Shift+[ろ]で`(バッククォート)が出るようにしています。

```.py
    ## K(      "GRAVE"): K("Shift-LEFT_BRACE"), # [半角/全角]
    K("Shift-RO"):       K("Shift-LEFT_BRACE"),
```

まだ書いたばかりで検証は不十分かもです。
AppGoatで学ぶディレクトリトラバーサル

# ディレクトリトラバーサルの概要

traverseという単語は**横断する**という意味であり、悪意のある利用者がパラメータに「 ../」といったディレクトリを横断するキーワードを含め、
サービス提供者が予期していないディレクトリへのアクセスを目論む攻撃をディレクトリトラバーサルと呼びます。

![AppGoat_attack.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/f7fda315-5ff9-37d1-c919-b363d1ef0eb6.png)
※出典：AppGoat

AppGoatの例が**Windows Server 2003**で大変な歴史を感じます。

# ディレクトリトラバーサルの対策

対策自体は簡単で、パラメータにディレクトリトラバーサルを引き起こしそうなものが含まれていたら弾く処理をいれるだけです。
いくつかの言語毎の対策を並べます。

C++の場合

```c++:DirectoryTravarse.cpp
 if( NULL != strstr(urlPath, "../") || 
          NULL != strstr(urlPath, "..\\") )
          return -1;
```

C#の場合(ファイル名だけ抜き取ってこちらの想定外のディレクトリにアクセスさせない)

```c#:DirectoryTravarse.cs
      const string DIRECTORY_PATH = @"C:\Files\";
 
      //ファイル名取得
      string fileName = Path.GetFileName(path);
      
      //パス結合
      string path = Path.Combine(DIRECTORY_PATH, fileName);
```


Pythonの場合(ディレクトリトラバーサルを引き起こすかどうか判定するコード)

```python:DirectoryTravarse.py
import os 

def is_directory_traversal(file_name):
    current_directory = os.path.abspath(os.curdir)
    requested_path = os.path.relpath(file_name, start=current_directory)
    requested_path = os.path.abspath(requested_path)
    common_prefix = os.path.commonprefix([requested_path, current_directory])
    return common_prefix != current_directory
```

Pythonは以下から引用したのですが、単純にディレクトリを横断されなきゃ良いと考えてしまっては防げない問題の指摘もあり、勉強になります。
https://codeday.me/jp/qa/20190222/272788.html

言語ごとに最適な方法があるのできちんと意識する事がまず一歩ですね。
AppGoatだけでは内容が古く、別途調べて知識を補完する必要があると強く感じた章でした。
QSpinBox利用で整数専用のLineEdit風

事務作業系のアプリなら必要性あるのでは。
WA_InputMethodEnabled,false は無いとwindowsで難ありなので。
keyPressEventは、del back キーで消去されたように見えて消去されていないからです。

```
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtWidgets import QSpinBox

class myIntegerBox(QSpinBox):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.setProperty("showGroupSeparator", True)
        self.setAttribute(QtCore.Qt.WA_InputMethodEnabled,False)
        self.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)

    def keyPressEvent(self,event):
        super().keyPressEvent(event)

        # del back space で0 セット
        if event.key() == QtCore.Qt.Key_Delete:
            self.setValue(0)
        if event.key() == QtCore.Qt.Key_Backspace:
            self.setValue(0)
        if event.key() == QtCore.Qt.Key_Space:
            self.setValue(0)
```
カーソルの位置などに依然難ありです。
Laravel メモ

## アプリ作成
```:laravel~7
$ composer create-project --prefer-dist laravel/laravel 〇〇 "6.*"
```

```:laravel-8~
curl -s https://laravel.build/example-app | bash
```

## アプリ起動
```:
$ php artisan serve
```

## Composer
```
$ composer install
$ composer update
```

## npmコマンド
```:
$ npm run watch　　　　　(ファイルの監視)
$ npm run hot　　　　　　(ファイルの監視)
$ npm run watch-poll　　(docker時) 
$ npm run dev
$ npm run prod　　　　　　(本番環境用)
```

## データベース周り
### 開発環境MAMPでMySQLを使用する場合
```
$ export PATH=$PATH:/Applications/MAMP/Library/bin
$ source ~/.bash_profile
$ cd /Applications/MAMP/Library/bin/
$ ./mysql -u root -p
mysql> CREATE DATABASE 〇〇;
mysql> USE 〇〇;

//① あとで使う
mysql> SHOW VARIABLES LIKE '%sock%';
```

####データベース接続
```:.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=データベース名
DB_USERNAME=ユーザー名
DB_PASSWORD=パスワード
```

```:config/database.php
'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', '.envに記載したデータベース名'),
            'username' => env('DB_USERNAME', '.envに記載したユーザー名'),
            'password' => env('DB_PASSWORD', '.envに記載したパスワード'),
            'unix_socket' => env('DB_SOCKET', '①'),
```

## ログイン機能
データベースとの連携が終わっていることが前提
###6系
```
$ composer require laravel/ui:^1.0 --dev

// vue
$ php artisan ui vue --auth

// React
$ php artisan ui react --auth

$ php artisan migrate
$ npm install
```

## キャッシュ消去(むやみに行わない)
```:キャッシュの消去
$ php artisan cache:clear
$ php artisan config:clear
$ php artisan route:clear
$ php artisan view:clear
$ php artisan config:cache
```

## Controller
```:コントローラー
// controllerの作成
$ php artisan make:controller 〇〇Controller
```

## Model
```:モデル
// modelの作成、-mでmigrationファイルも一緒に作成
$ php artisan make:model 〇〇 -m

// migrationファイルの作成
$ php artisan make:migration create_〇〇_table

// 変更を反映
$ php artisan migrate

// migrationファイルを一つ前の状態に戻す
$ php artisan migrate:rollback

// migrationファイルを再構築する。DBに入っている情報が全部消えるので注意
$ php artisan migrate:fresh
```

## Seeder
```
$ php artisan make:seeder 〇〇TableSeeder
$ composer dump-autoload

$ php artisan db:seed
$ php artisan migrate:refresh --seed
```

## Tinker
```
$ php artisan tinker
```

## Blade
### Blade上のVueコンポーネントにjson形式で値を渡す
#### 既にDBに値がある場合と、値がまだない場合を三項演算子で表示
```
<vue-component
① :title="{{json_encode($post->title ?? old('title'))}}"
② :title='@json($post->title ?? old('title'))'
></vue-component>
```
LaravelでHTMLメールに画像を添付する

# あんまり記事がなかったので忘れないように書いておく

## 前提条件

- Homestead
- Mac
- Laravel5.8

## 注意事項

.envファイルの設定とかもないのであくまでメールは飛ぶ前提の記事です。
メール機能はふんわりしか説明しないので、その辺は他の記事みてください（投げやり）

## Mail

ではメール送信機能の実装をザックリ進めていきます。
まずはターミナルからプロジェクトディレクトリに移動して以下のコマンドでMailableクラスを生成します。

```terminal
php artisan make:mail MailSend
```

> MailSendのところは任意

## Mailable

コンストラクトにControllerから呼び出す時に引数として渡す`$request`を`$contact`という変数名で宣言しておきます。

```php:app/Mail/MailSend.php
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class MailSend extends Mailable
{
    use Queueable, SerializesModels;

    protected $_params;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($contact)
    {
        $this->contact = $contact;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->from('test@test.com')
        ->subject('テストメールです。')
        ->with(['contact' => $this->contact])
        ->view('mails/mail_send');
    }
}
```

> 今回HTMLメールとして送信するので必ず`->view();`を使用してください。

## Routing

じゃあ後から作成するControllerのルーティングを設定しておきます。

```php:routes/web.php
Route::post('/send', 'MailSendsController@send')->name('send');
```


## Controller

フォームから`$request`の中に`file`というnameで画像のアップロード情報が入っているという前提で書いていきます。

ファイルのアップロードは`storage/public/upload`というディレクトリに保存します。
あとメール送信が終わったら適当に`/thanks`というviewファイルにリダイレクトかけておきます。

> バリデーションは画像データで5MBまで許容しておきます。

```php:app/Htp/Controllers/MailSendsController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Mail\MailSend;

class MailSendsController extends Controller
{

    public function send(Request $request)
    {
        $this->validate($request, [
            'file' => 'image|mimes:png,jpg,jpeg|max:500000|',
        ]);

        $file_name = $request->file('file')->store('public/upload/');

        $request->file = basename($file_name);

        try {
            Mail::to('test@test.com')->send(new MailSend($request));
        } catch(Exception $e) {
            echo "エラー：" . $e->getMessage();
        }

        return redirect('/thanks');
    }
}
```

## シンボリックリンク

publicからstorageにアクセス出来るようにシンボリックリンクを設置します。
仮想環境のプロジェクトフォルダで以下のコマンドを実行してください。

```terminal
php artisan storage:link
```

> この時ちゃんとシンボリックリンク先のパスがあってるかどうか確認しないとつまります。。

```terminal
cd public
ls -la

~~~~~~~~~~省略~~~~~~~~~~
lrwxr-xr-x 1 vagrant vagrant   37 Sep 22 03:32 storage -> /home/vagrant/code/storage/app/public
```

## View(メール文)

ではViewファイルを作成しましょう。

```terminal
mkdir resources/views/mails
touch resources/views/mails/mail_send.blade.php
```

メール文↓

```php:resources/views/mails/mail_send.blade.php

<!DOCTYPE html>
<html lang="ja">
    <body>
        <div>
            <p>[添付ファイル]</p>
            <img src="{{ $message->embed('storage/upload/' .$contact->file) }}">
        </div>
    </body>
</html>
```

これで添付できたはず。
Linux勉強用

# WSL2 + Windows 10 + ruby + rails

https://docs.microsoft.com/ja-jp/windows/wsl/install-win10

バージョンの確認

```terminal
wsl -l -v
```

##zsh
```terminal
sudo apt update
sudo apt install zsh powerline fonts-powerline
which zsh
chsh -s /usr/bin/zsh

git clone https://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
gedit .zshrc

```

##rbenv
```terminal
sudo apt update
sudo apt install autoconf bison build-essential libssl-dev libyaml-dev libreadline-dev zlib1g zlib1g-dev sqlite3 libsqlite3-dev nodejs npm imagemagick git
sudo npm install -g yarn

```

```terminal
git clone https://github.com/rbenv/rbenv.git ~/.rbenv

# bash の場合　wsl Ubuntu
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
# zshの場合
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
```
```terminal
~/.rbenv/bin/rbenv init
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47172/7b1dda94-4db4-5cc6-f399-afcc599d2061.png)
.zshrcに書き込めと表示さるので下記のコマンドを実行

```terminal
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
```
```terminal
rbenv -v
```
##ruby-buildインストール

ruby-buildがインストールされているかを確認する

```terminal
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash
```
下記のメッセージが表示された場合インストールされてない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47172/295a8fac-4f22-2877-78ed-57e959463422.png)

```terminal
mkdir -p "$(rbenv root)"/plugins
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
```

```terminal
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash
```
これでOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47172/1110f902-f918-179b-4a57-eca8321759f5.png)

##Rubyのインストール

```terminal
rbenv install -l
rbenv install 2.6.6
rbenv versions
```

```terminal
rbenv global 2.6.6
rbby -v
```

## rails インストール
```terminal
gem install rails -v 6.0.3
rails -v
rails new hello_rails
```


## メモ
・yarnのインストール
https://classic.yarnpkg.com/en/docs/install/#debian-stable
・webpackerのエラー
https://qiita.com/libertyu/items/1eb74adc817ab8971100
# Docker 

```terminal
docker build -t myrailsapp .
docker run -p 3000:3000 myrailsapp
```
# Termの操作

## ショートカット
```terminal
//ショートカットキー
Ctrl + a　　　　//行頭へ移動
Ctrl + e
Ctrl + u      //行頭まで削除
Ctrl + k
Ctrl + _
Ctrl + /

```
## コマンド
```terminal

//ファイルの表示
cat 
less
head
tail
scp
rsync

>   //上書き
>>   // 追記
```
# Termの設定
```
test
```
# tmux
https://qiita.com/nl0_blu/items/9d207a70ccc8467f7bab

## 選択
Prefix+[で文字列選択モードに入る
vimの操作方法で選択したい文字列へとカーソル移動
Spaceで選択開始
Enter / Returnで文字列コピー
Prefix+]で文字列貼り付け

# vim
```
test
```
## NERDTree

#heroku

https://github.com/PhilippHeuer/wordpress-heroku

heroku login
heroku run bash -a APPNAME
$ cd app