OmniAICreator/Qiita-1.07M huggingface dataset:
列ストアインデックスを貼るとInsertはどれくらい遅くなる？

## そもそも列ストアインデックスって？
https://www.slideshare.net/odashinsuke/sql-server-73269307

## テーブル作成

列が50個のテーブルを2つ用意

```sql
CREATE TABLE [TableName]
	(
	c000 char(20) NULL,
	c001 char(20) NULL,
           ︙             
	c049 char(20) NULL
	)  ON [PRIMARY]
```

一方のテーブルには全項目を対象にした列ストアインデックスを作成

```sql
CREATE NONCLUSTERED COLUMNSTORE INDEX NonClusteredColumnStoreIndex ON dbo.TEST_withCSIndex
	(
	c000,
	c001,
     ︙ 
	c049
	)
```

## ダミーデータをInsert

1000 万件 Insert するよ
これが早い（ http://geekswithblogs.net/nestor/archive/2007/08/23/114925.aspx ）

```sql
SET STATISTICS TIME ON

Declare @p_NumberOfRows Bigint 
Select @p_NumberOfRows=10000000; 
With Base As
  (
    Select 1 as n
    Union All
    Select n+1 From Base Where n < Ceiling(SQRT(@p_NumberOfRows))
  ),
  Expand As
  (
    Select 1 as C From Base as B1, Base as B2
  ),
  Nums As
  (
    Select Row_Number() OVER(ORDER BY C) As n From Expand
  )
INSERT INTO [TableName]
  Select 
    -- 列の数分
	'DATA' + right('0000000000' + convert(varchar, n), 10),
	'DATA' + right('0000000000' + convert(varchar, n), 10),
                              ︙              
	'DATA' + right('0000000000' + convert(varchar, n), 10)
    from Nums  Where n<=@p_NumberOfRows
OPTION (MaxRecursion 0); 

```

結果（no インデックス）

```
        ︙
 SQL Server 実行時間: 
、CPU 時間 = 150328 ミリ秒、経過時間 = 200014 ミリ秒。

(10000000 行処理されました)
```

結果（with インデックス）

```
        ︙
 SQL Server 実行時間: 
、CPU 時間 = 295593 ミリ秒、経過時間 = 473816 ミリ秒。

(10000000 行処理されました)
```
## まとめ

約2倍になってますね
（実際のテーブルではここまでシンプルでないため、一概には言えませんが...）
型の空宣言方法

型の空宣言をたまに忘れるので備忘録

#String

```swift
let test = ""
test = "test"
```

#Dictionary
```swift

let test: [String: String] = [:]
test = ["test": "test"]
           key/value
```

#配列
```swift

let test: [String] = []
test = ["test"]
Arrayは配列
```
mysqlとかのサービス起動を待機するBashコマンド

Dockerコンテナ起動は速いですが、コンテナ内のサービスが起動完了するのに時間がかかり、後続の処理を連続して実行するとDB接続エラーになる事があります。

例えば、mysqlコンテナを起動後、テストを実行したい場合に、mysqlサーバの起動が完了するのを待つ必要があります。

以下のコマンドでは、mysqlを起動後、mysqlの3306ポートをcurlで叩いて未起動の場合は 2秒待機(sleep)を繰り返します(until -; do -; done)。

```bash
# Run Mysql
docker run -d -p 3306:3306 -e MYSQL_RANDOM_ROOT_PASSWORD=yes mysql

# Wait for service
until curl localhost:3306 > /dev/null 2>&1; do echo "mysql is unavailable - waiting" && sleep 2 ; done
echo "mysql is up"

# Executing Test
# ....
```

ポートを確認しているだけなので、mysql以外にも応用できます。以下は、InfluxDBの例です。

```bash
# Run InfluxDB
docker run -d -p 8086:8086 influxdb

# Wait for service
until curl localhost:8086 > /dev/null 2>&1; do echo "influxdb is unavailable - waiting" && sleep 2 ; done
echo "influxdb is up"

# Executing Test
# ....
```
新しいMacbook Proのセットアップ

# 自分の用途に合うようにMacbook PROをセットアップする

モダンなMacの仕様歴は歴は浅いので、試行錯誤ですが基本全ての日常用途を全てカバーするマシンにするつもり。OSはmacOS Catalina。日常の要件はだいたい下の通り。

* 英語キーボードに合わせた設定とTouch Bar設定
* Node.js
* Python
* Inkscape
* ImageMagick
* ffmpeg
* Xcode
* AWS関連ツール
* Visual Studio Code


## 英語キーボードに合わせた設定
購入したMacbook ProはUS配列のキーボードなので、使い勝手が良いように設定を変えようと思います。今後試行錯誤することになるでしょう。
### cpas lockキーで日本語・英語を切り替える。(OSX Mojaveにはなかったと思う)
システム環境設定 → 入力ソース
入力ソースには、"日本語"と"U.S."を含めた。
"Cpas Lockキーで、U.S.入力モードと切り替える"と言うありがたいチェックボックスがあるので、これをチェック。

### Touch Barには標準時F1〜F12キーを表示する。
システム環境設定 → キーボード
"Touch Barに表示する項目"のポップアップメニューで"F1、 F2などのキー"を選択。
これで"Fn"キーを押さない状態であれば、F1〜F12キーが表示される。

## 必要なソフトウェアインストール
### ブラウザ
* Google Chrome
  * 既定のブラウザにして以降はChromeを使う。
  * Chromeを立ち上げて、Googleにサインイン。同期を有効にして慣れたブックマークを取り込む。



### HomeBrew使う系
* HomeBrew
    * ここを見て簡単インストール: https://brew.sh/index_ja
    * ターミナルで上記サイトに掲げてあるインストールコマンドをコピーペーストで実行して完了。
* zsh (※Catalinaからデフォルトがzshなので、必要なかったのかも。とにかく私は実行してしまった。)
    * ```$brew install zsh```
    * ```$brew install zsh-completion```
    * とりあえず先を進めることを優先し、後日zsh環境は整えようと思います。仕事でも使えそうなので。
* nodebrew
    * ```$brew install nodebrew```
    * こちらを参照しつつ nodeのセットアップ。 https://himakuro.com/nodebrew-node-install-guide
    * nodebrewインストールとパスの確認後にnodeも最新の安定板をインストールしました。
* pyenv
    * ```$brew install pyenv```
* awscli
    * #brew install awscli
* ImageMagick
    * ```$ brew install imagemagick```
* ffmpeg
    * ```$ brew install ffmpeg```

### Mac App Storeからインストールするソフトウェア
* Xcode
    * __7.78GBもあったのか！__
* Evernote
    * 長年使っているので。

### Mac用のインストール形式のあるアプリケーションをダウンロード・インストール
* XQuartz
    * https://www.xquartz.org/
    * この時の最新バージョンは2.7.11でした。
    * 後述するようにInkscape1.0から必要なくなるので、すでに私には要らないかも。
* [Inkscape](https://inkscape.org/ja/)
    * OSX Catalinaでは、32ビットアプリがサポートされなくなったため、Inkscapeの安定板が動かない。
    * 1.0 BETAをインストールしました。XQartz不要になったのですね。
* Audacity
    * ここからインストール: https://www.audacityteam.org/download/mac/

### Visual Studio Code
  * https://code.visualstudio.com/download
### pyenvを使ってpython
   * ```$ pyenv install --list``` で利用可能な2系と3系の最新バージョンを確認する。
   * ```$ pyenv install 2.7.17```
   * ```$ pyenv install 3.8.0```

---
### インストールを様子見するソフトウェア
* [Karabiner-Elements](https://pqrs.org/osx/karabiner/)
    * 業務で使っている macOS Mojaveでは使っているけど、Catalinaではcapsロックを日英切り替えに使える設定が正式に出ているので、そちらに慣れてみようと思います。

![mbp16_2019.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537237/d81407ce-ddca-61ba-60c1-abf9ff059d57.jpeg)
Flutterで "kanel-service.dart.snapshot"は開発元を確認できないため、開けませんでした" とエラーが出る

久しぶりにFlutterの開発をしようと思ったらMacのダイアログでエラーが出て、Flutterのアップデート系のコマンドを打つたびに出てきて異常終了してします問題にぶち当たったのでメモ。

>"kanel-service.dart.snapshot"は開発元を確認できないため、開けませんでした"

とか

>「kernel-service.dart.snapshot」は、身元不明の開発者によるものであるため開くことができません。

みたいなエラ〜メッセージだった。

OS Xのファイアーウォール的な仕組みの Gatekeeperさんがお怒りなのである。

回避策は一時的にGatekeeperさんをオフにして、再度オンにするという方法だ。

```bash
# Gatekeeperをオフにする
$ sudo spctl --master-disable
```

オフにしている間に、先ほど出たFlutterのコマンドを実行すると成功するはずである。
コマンド実行が成功したら忘れずにGatekeeperをオンにしておこう。

```bash
# Gatekeeperをオンにする
$ sudo spctl --master-enable
```

一度実行すれば、もうエラーが出ることはないらしくGatekeeperをオフにする必要はない。

良いFlutterライフを🍻

## 参考文献
https://github.com/flutter/flutter/issues/36114
【PHP】学習メモ / アクセサメソッド（セッター、ゲッターの目的と使い方）

「変数の値に直接アクセスできるようにするのは良くない。アクセサメソッドを使えば間接的にアクセスするようにできる」みたいなことをどこかで学んだが、結局アクセスしてんじゃん、と思ったので具体的に何ができるのか一歩踏み込んで調べてみた。

#アクセサメソッドの意味と使う目的

プロパティのアクセス権をprivateにするとプロパティの値をクラスの外から変更できなくなる。
[アクセス権について](https://qiita.com/kota_sho/items/b76a4dfeda441543d2a2)

セッター：プロパティの値を変更するメソッド
ゲッター：プロパティの値を読み出すメソッド

public : 
どんなデータでも直接入れられる

privateでアクセサメソッドを経由 : 
setする時チェックが可能で、不正なデータは外部から格納できないようにする事ができる。
アクセサメソッドを使うことにより、受け入れられるデータだけを通す事ができる。つまり、フィルタリングできるということらしい。例えば、成績がA〜Eまであるとして、「A〜Eのアルファベットのデータのみ受け入れる」とすれば、Fという不正なデータは受け取らないで済む。その他、「読み取るだけ」のアクセサメソッドを作ることにより「データは見れるが、更新はできない」ということもできる。


```php
class Menu{
    private $price;

    public function setPrice($price){
        $this->price = $price;
    }
    
    $coffee = new Menu();
    $coffee->setPrice(300);

    echo $coffee->getPrice(); //300

    $coffee->price = 500; //privateなので直接アクセス不可
}
```
Amazon Cognito を利用して、会員登録を行う。

## はじめに
ここでは、Amazon Cognito を使用して、メールアドレスとパスワードを登録するためのソースコードを書きます。ただし、既に[ユーザープールを作成し、ユーザープールにアプリを追加ている](https://aws.amazon.com/jp/getting-started/projects/build-serverless-web-app-lambda-apigateway-s3-dynamodb-cognito/module-2/)ものとします。

## AWS Amplify ライブラリをインストール
Amazon Cognito を使用するには、[AWS Amplify ライブラリ](https://github.com/aws-amplify/amplify-js)が必要なのでインストールします。

```terminal
$ npm install aws-amplify --save
```
ちなみに [「Amazon Cognito ID SDK for JavaScript」が「AWS Amplify ライブラリ」 の一部になった](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/setting-up-the-javascript-sdk.html)らしいです。

## 

ソースコードに次の記述を書きます。HTML は省略します。

```javascript

import * as AmazonCognitoIdentity from "amazon-cognito-identity-js";

export default class UserRegistration {

  // フォームの登録ボタンをクリックした時にこれを呼び出す。
  public registerUser() {

    let poolData = {
      UserPoolId: <ユーザープールのID>,
      ClientId: <アプリクライアントID>
    };
    let userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);

    let email = {
      Name: "email",
      Value: <ユーザーが入力したメールアドレス>
    };

    let attributeEmail = new AmazonCognitoIdentity.CognitoUserAttribute(
      email
    );

    userPool.signUp(
      <ユーザーが入力したメールアドレス>,
      <ユーザーが入力したパスワード>,
      [attributeEmail],
      [],
      (err, result) => {
        if (!err) {
          // 成功した場合の処理。
        } else {
          // 失敗した場合の処理。
        }
      }
    );
  }
}
```

ユーザーのメールアドレスとパスワードをフォームから取得して、Cognito に送信します。
　これで、フォームの登録ボタンなどをクリックした時に registerUser() を実行すると、ユーザーが入力したメールアドレスに確認コードが届きます。次は、確認コードを Cognito に送信しなければなりません。
　メールアドレスの確認を行うためのソースコードが以下です。

```javascript

import * as AmazonCognitoIdentity from "amazon-cognito-identity-js";

export default class EmailVerification {

  public verifyEmail() {

    let poolData = {
      UserPoolId: <ユーザープールのID>,
      ClientId: <アプリクライアントID>
    };
    let userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);

    this.createCognitoUser(userPool).confirmRegistration(
      <ユーザーが入力した確認コード>,
      true,
      (err, result) => {
        if (!err) {
          // 成功した時の処理。
        } else {
          // 失敗した時の処理。
        }
      }
    );
  }

  private createCognitoUser(userPool) {
    return new AmazonCognitoIdentity.CognitoUser({
      Username: <メールアドレス>,
      Pool: userPool
    });
  }

}
```

ユーザーが入力した確認コードをフォームから取得し、Cognito に送信しています。


### 参考資料
以下を参考にしてソースコードを書きました。
・https://aws.amazon.com/jp/getting-started/projects/build-serverless-web-app-lambda-apigateway-s3-dynamodb-cognito/module-1/
・https://github.com/aws-samples/aws-serverless-workshops/tree/master/WebApplication/1_StaticWebHosting/website
Vim のユーザー定義補完について調べてみた

## はじめに

最近 Vim 標準の補完機能について調べています。

以前は Vim の辞書ファイルからの補完について調べました。
[Vim の辞書ファイルからのキーワード補完について調べてみた - Qiita](https://qiita.com/gotchane/items/98876bd62356f83ac944)

今回は、ユーザー定義関数による補完について使い方を調べてみました。


## ユーザー定義補完とは

[Vim のマニュアル](https://vim-jp.org/vimdoc-ja/insert.html#i_CTRL-X_CTRL-U) から引用します。

> ユーザー定義補完は、オプション 'completefunc' で設定した関数(ユーザー定義関数
でもよい)によって補完する方法である。

自前で指定した関数を使って、補完候補を準備できるようです。

## 使い方

ユーザー定義の関数の指定方法は、[Vim マニュアルの complete-functions](https://vim-jp.org/vimdoc-ja/insert.html#complete-functions) という項目に書かれています。

Vim では挿入モードで `CTRL-X CTRL-U` でユーザー定義の補完を呼び出すことができます。 ユーザー定義の補完は変数 `completefunc` に指定された関数を使って行われます。`completefunc` に指定の形式に沿った補完用の関数を作って指定することで、Vim で独自の補完を利用することができるようになります。

`completefunc` に指定された関数は、補完開始時に2回呼び出されます。

1. 最初に補完するテキストの始点を見つける
2. 実際に候補を検索する

`completefunc` の関数は `findstart`、`base` の2つの引数を取ります。それぞれの呼び出しの際に渡される値は以下のとおりです。

1. `findstart`が1、`base` がempty
2. `findstart`が0、`base` が補完対象のテキスト

上記の動作に従って関数を準備する必要があります。

### サンプル関数

最初に、Vim マニュアルを参考にしたサンプル関数を載せます。こちらをもとに説明します。

前回の記事と同様の例として、Git のコミットメッセージのプレフィックスを候補にする関数にしました。(参考：[angular.js/DEVELOPERS.md at master · angular/angular.js · GitHub](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#type))

```vim
fun! CompleteGitCommitPrefixes(findstart, base)
  if a:findstart
    let line = getline('.')
    let start = col('.') - 1
    while start > 0 && line[start - 1] =~ '\a'
      let start -= 1
    endwhile
    return start
  else
    let res = []
    for m in split("feat: fix: docs: style: refactor: perf: test: chore:")
      if m =~ '^' . a:base
        call add(res, m)
      endif
    endfor
    return res
  endif
endfun
set completefunc=CompleteGitCommitPrefixes
```

挿入モードで `CTRL-X CTRL-U` と入力すると、以下のような補完候補が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222030/002f5cfd-216a-3b32-40df-3be016f48c84.png)


### 1回目呼び出し：最初に補完するテキストの始点を見つける

最初の呼び出しにおいて、`if a:findstart` が `1` のブロックが呼ばれます。ここでは補完テキストの始点を探すための処理を実施しています。

`getline('.')` でカーソルのある行文字列を取得し、`col('.') - 1` でカーソル位置の直前を最初に取得します。

その後、while ループで `line[start - 1]` が英字を表す文字クラス `\a` の場合に `start` の番号を前に1ずつずらし、最初の単語位置を特定しています。

### 2回目呼び出し： 実際に候補を検索する

2回目の呼び出しにおいて、`if a:findstart` が `0` のブロックが呼ばれます。ここでは補完候補を表示する処理が実施されます。

変数 `a:base` には、1回目呼び出しで抽出した補完対象テキスト文字列が入っています。その文字列から始まる候補を for 文でループして検索し、マッチした候補のみ `res` の配列に格納し、配列を返しています。

この配列が補完候補として表示されます。

配列の要素の形式は [Vim マニュアル complete-items](https://vim-jp.org/vimdoc-ja/insert.html#complete-items)の項目にもある通り、文字列か辞書形式であれば OK です。

## おわりに

マニュアルから動作を仕組みを汲み取って関数を準備するというスタイルが面白いですね。もっと読み込んでいこうと思います。

## 参考

* [vimのcompletefuncの仕様についてのメモ -- ぺけみさお](https://www.xmisao.com/2014/05/04/vim-completefunc.html)
mysql.server startの際にエラーがでてしまった時に解決した方法

mysqlをHomebrew経由でMacへダウンロードします。

```
$ brew install mysql
```

日本語化設定と暗号化プラグインの設定に関しては省略します。
mysqlを起動します。

```
$ mysql.server start
```

本来はここで

```
Starting MySQL
. SUCCESS!
```

と出ればインストールが完了するのですが私の場合

```
ERROR! The server quit without updating PID file (/usr/local/var/mysql/username.local.pid)
```

とでました。
色々と検索したところ、ユーザーの権限の問題があり権限を変更すれば解決することができたという記事を見かけましたが私も色々試しましたのですが解決することができませんでした。
しかし、MySQLのデータファイルやログなどが格納されているディレクトリを削除するという方法で解決することができました。

```
#MySQLのデータファイルやログなどが格納されているディレクトリを削除する
$ sudo rm -rf /usr/local/var/mysql 
```

```
#MySQLを再インストール
$ brew uninstall mysql
$ brew install mysql
```

```
#MySQLを起動
$ mysql.server start
Starting MySQL
SUCCESS!
```
mysql無事起動成功しました。


参考までに引用リンクを記載しておきます。
>https://reasonable-code.com/mysql-start-error/
文系事務職がRでネットワーク分析を学ぶ（1日目）

#はじめに
- 普段は事務職をしています。
- 通信制の大学（文系）に通っているのですが、卒論を書くにあたってRでネットワーク分析をしたいと思っています。
- Rは1週間ほど前に始めてインストールしました。これまで全く使ったことがありません。

#これまでやったこと
- とりあえずCSVファイルからデータを読み込んでグラフを書くところまではできました。

#今やろうとしていること
例えばigraphで以下のような無向グラフを描画する際、重複したエッジ（「2」と「3」のノードから出ている二つのエッジ）をまとめて表示する方法を調べています。
その際、単に1本にまとめるのではなく、エッジの本数分（この場合は2本分）の太さにしたいと思っています。
![g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/30c599b0-771e-0668-486d-fcd5b036cf79.png)

今書いているコードはこんな感じです。

```ruby:R
library("igraph")
g<-matrix(c(
1,1,1,0,
1,2,2,1,
1,2,2,1,
0,1,1,1),
nrow=4,ncol=4,byrow=TRUE)
g <- graph.adjacency(g, mode = "undirected", diag = FALSE)
plot(g)
```
引き続きいろいろやってみます。

#追記1(11/23)
とりあえず、以下の方法を試してみました。
まず、多重辺の辺の数（?）を重みとして扱うため、graph.adjacency()関数の中に「weighted = T」を追加します。
また、重みをエッジの幅に反映させるため、「ew <- abs(E(g)$weight)*2」を記述します。
そして、plotで出力する際に、(g,edge.width = ew)と記述します。

```ruby:R
g <- graph.adjacency(g, mode = "undirected", weighted = T, diag = FALSE)
ew <- abs(E(g)$weight)*2
plot(g,edge.width = ew)
```
すると、こんな感じで確かに多重辺については1つにまとまりました。
![スクリーンショット 2019-11-23 12.06.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/5efe43db-6181-7e56-b815-a91b85bf086e.png)
が、他の辺よりもかなり太くなっています。うーん、合ってるかな...？

ちなみに、重みをエッジの幅に反映させるコードについてはこちらのサイトを参考にさせていただきました。

- [igraphでネットワーク解析　2.4 相関係数行列からグラフの作成](https://rstudio-pubs-static.s3.amazonaws.com/294332_7a46fbbb156a405caec8be808be283cd.html)

また、別の方法としてエッジの重みを濃淡で表現するにはこちらをご参考にさせて頂くとできそうです。

- [R-igraph】エッジの重みを濃淡で表現する](https://qiita.com/cameturtle/items/a2aa40036ce653961440)

#追記2(11/23)
「Rで学ぶデータサイエンス８　ネットワーク分析」によれば、グラフオブジェクトを作成する際は、graph_from_adjacency_matrix()関数を用いるようでした。
ですので、追記1の「ew <- abs(E(g)$weight)*2」は残したまま、以下のように記述してみました。

```ruby:R
g<-graph_from_adjacency_matrix(
matrix(c(
1,1,1,0,
1,2,2,1,
1,2,2,1,
0,1,1,1),
nrow=4,ncol=4,byrow=TRUE),
mode="undirected",weighted=TRUE)
plot(g,edge.width = ew)
```
すると、以下のとおり多重辺はちょうど本数分（今回の場合は2本文）の太さになったのですが、「diag = FALSE」を外してしまっていたので自分から自分に対するループが発生してしまいました。
![スクリーンショット 2019-11-23 13.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/1c33a855-6de1-43ba-7318-82dd2e59ae68.png)

再度、modeに「diag = F」を記述して自己ループを除外しました。

- [igraphでネットワーク解析 2.3 隣接行列からグラフオブジェクトの生成](https://rstudio-pubs-static.s3.amazonaws.com/294332_7a46fbbb156a405caec8be808be283cd.html)

```ruby:R
g<-graph_from_adjacency_matrix(
matrix(c(
1,1,1,0,
1,2,2,1,
1,2,2,1,
0,1,1,1),
nrow=4,ncol=4,byrow=TRUE),
mode="undirected",weighted=TRUE,diag=FALSE)
plot(g,edge.width = ew)
```
すると、以下のとおり思っていたとおりの図ができました。
![スクリーンショット 2019-11-23 13.17.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/79220c95-1b9a-9990-2c22-ef87f4abe940.png)

#追記3(11/23)
「graph_from_adjacency_matrix()関数」ではなく「graph.adjacency()関数」でも同様に表示することができました。コードは以下のとおりです。

```ruby:R
library("igraph")
g<-matrix(c(
1,1,1,0,
1,2,2,1,
1,2,2,1,
0,1,1,1),
nrow=4,ncol=4,byrow=TRUE)
g <- graph.adjacency(g, mode = "undirected",weighted=TRUE,diag = FALSE)
ew <- abs(E(g)$weight)*2
plot(g,edge.width = ew)
```

#追記4(2023/7/5)
念の為の補足ですが、igraphを使うためには事前にigraphをインストールする必要があります。自分は以下のサイトを参照しました。
http://www.nemotos.net/igraph-tutorial/NetSciX_2016_Workshop_ja.html
```ruby:R
install.packages("igraph")
```
【Rails】パーシャルを使う

# パーシャルのメリット
あちこちで使う部品を定義しておけば、
その部品を呼び出すだけで同じViewを出力できるようになる。

## パーシャルファイルの作成
viewディレクトリに作成
`_任意の名前.htil.erb` <=`_`先頭にアンダースコアをつける。

#### 繰り返し使用する部分テンプレート作成
```form.html.erb

<%= form_for @board  do |f| %>
    <div class="form-group">
        <%= f.label :name, '名前' %>
        <%= f.text_field :name, class: 'form-control' %>
    </div>
    <div class="form-group">
        <%= f.label :title, 'タイトル' %>
        <%= f.text_field :title, class: 'form-control' %>
    </div>
    <div class="form-group">
        <%= f.label :body, '本文' %>
        <%= f.text_area :body, class: 'form-control', rows: 10%>
    </div>
    <%= f.submit '保存', class: 'btn btn-primary' %>
<% end %>

```

# 呼び出す先の記述

```erb

<div class="d-flex align-items-center">
    <h1>掲示板作成</h1>
    <div class="ml-auto boards_linkBox">
        <%= link_to '掲示板一覧', boards_path, class: 'btn btn-outline-dark'%>
    </div>
</div>
<%= render partial: 'form' %>   

```

`<%= render partial: 'form' %> ` ハッシュ形式で呼び出し元のファイル名を記述

**補足**

`<%= render partial: 'form', locals: { board: @board } %>`
第２引数に`locals: { board: @board }`と記載しておくと、どこからのインスタンス変数を使用しているのかがわかるので
バグが起こりにくくなる。
Zephyr + STM32F769 Discovery Kit > UART >  error: undefined reference to `tty_init'

```txt:動作環境
Ubuntu 18.04 LTS
STM32F769 Discovery Kit (以下、STM32F769)
Zephyr 2.1.0-rc1
```

### tty_init()実装後のエラー

[Zephyr + STM32F769 Discovery Kit > UART > UART6の設定表示まで | baud rateの設定: stm32f769i_disco.dts](https://qiita.com/7of9/items/db2919eca83ffe9cd5a4)の続き。

tty_init()を使用するとwest build時に以下のエラーとなるようになった。

```
... undefined reference to `tty_init'
```

### 参考

https://github.com/zephyrproject-rtos/zephyr/issues/13890

gon1332 commented on 4 Mar
にてproj.confに以下に二行を追加するようにとの記載がある。

```proj.conf
CONFIG_CONSOLE_SUBSYS=y
CONFIG_CONSOLE_GETCHAR=y
```

こちらの環境でも追加をすることでtty_init()のエラーは出なくなった。
[CentOS7]サーバのタイムゾーンの設定

サーバの初期設定はUTCの設定になっているので、日本時間にする場合以下のコマンドを実行します。

<変更前>

`# timedatectl`
`Local time: Sat 2019-11-23 01:12:28 UTC`
`Universal time: Sat 2019-11-23 01:12:28 UTC`
`RTC time: Sat 2019-11-23 01:12:22`
`Time zone: UTC (UTC, +0000)`
`NTP enabled: yes`
`NTP synchronized: no`
`RTC in local TZ: no`
`DST active: n/a`

<日本時間へ変更>

`# timedatectl set-timezone Asia/Tokyo`

<変更後>

`# timedatectl`
`Local time: Sat 2019-11-23 10:23:47 JST`
`Universal time: Sat 2019-11-23 01:23:47 UTC`
`RTC time: Sat 2019-11-23 01:23:41`
`Time zone: Asia/Tokyo (JST, +0900)`
`NTP enabled: yes`
`NTP synchronized: no`
`RTC in local TZ: no`
`DST active: n/a`

#### 設定可能なタイムゾーンを表示

`# timedatectl list-timezones`
`Africa/Abidjan`
`Africa/Accra`
`Africa/Addis_Ababa`
…

#### タイムゾーンファイルの置き場所

`# cd /usr/share/zoneinfo/`
`[root@ip-10-150-9-70 zoneinfo]# ll`
`total 392`
`drwxr-xr-x  2 root root   4096 Mar  5  2019 Africa`
`drwxr-xr-x  6 root root   8192 Mar  5  2019 America`
`drwxr-xr-x  2 root root    187 Mar  5  2019 Antarctica`
…

※ファイルの中身を書き換えるとPHPの時間処理(Datetimeクラスなど)に影響が出るため慎重に検討する必要があります。
IoTシステム技術検定（基礎）合格体験記

数ヶ月前ですが、第6回IoTシステム技術検定に合格しました。
記憶があるうちに、自分の学習方法等を記録しておこうと思います。


##学習方法
自分は1ヶ月前ぐらいから学習を開始しました。
学習で用いたテキストはこれです。

- IoT技術テキスト 基礎編 [MCPC IoTシステム技術検定基礎対応]公式ガイド

基本的にはテキストを3周ぐらい読み込んだり、キーワードや略称をまとめたメモを作って暗記したりしました。
IoTシステム技術検定のホームページに掲載されているサンプル問題からもわかるように、問題の形式は4択の短文のうち、不適切なものを選ぶのが多いです。

ですので、テキストの文章や脚注などに記載されているキーワードの内容を暗記しておけば、概ね解けると思います。
（イメージとしては、巻末の索引の単語を見てその内容がわかるようになっていれば大丈夫だと思います。）

##試験当日

当日のスケジュールは以下のとおりでした。

- 受付時間09：00～09：30

- 事前説明09：30～09：50

- 試験09:50～10:50

なお、自分が受験した時はセキュリティ関係、ネットワーク関係、機械学習関係が多く出題された気がします。
また、匿名加工情報に関する直近の制度の状況が出ました。こちらはネットでも公開されている「個人情報保護法ガイドライン（匿名加工情報編）」などを見ていればより解けたかもしれません。

とはいえ、基本はテキストからの出題ですし、割と一般常識で解けるものもありました。

時間的には割と余裕があり、自分の場合は一通り解き終わってから見直しをする時間もありました。

##まとめ
受験日は7/6だったのですが、7/22に合格発表がありました。
合格証（認定証？）は郵送されず、各自マイページからダウンロードする方式です。

自分は文系の事務職なのでIoTに関する知識はあまりなかったのですが、この試験を通じて基礎の基礎は知ることができたと思います。
割と短期間の学習で合格できるので、基礎的な知識を習得するにはいい試験だと思いました。
hoge とは何か

プログラミングをしている方なら使ったことがあると思う言葉、`hoge`。しかし`hoge` とは一体なんだろう？何で`hoge` なのかについて調べてみた。

## `hoge` とは一体なんなんだろう？
`hoge` とは、全く意味のない名称であることを示す言葉。メタ構文変数と言われるもの。

## `hoge` には続きがある
`hoge` には続きがあり、`fuga`, `piyo`, `hogehoge`, `fugafuga`, `piyopiyo` となるのが多いらしい。何事にも順番があるのだと感心。

## `hoge` は日本だけ
`hoge` というのは日本だけで使われるメタ構文変数らしい。  
米国だと `foo`, `bar`, `baz`, `foobar` などが使われ、英国では `toto` が使われるよう。

## `hoge` の由来
残念ながら、`hoge` の由来について、仮説はいくつかある。しかし、はっきりしていないらしく、調べても**1980年代頃から使われ出した**ということくらいしか分からない。

## 参考
- [メタ構文変数 Wikipedia](https://ja.m.wikipedia.org/wiki/%E3%83%A1%E3%82%BF%E6%A7%8B%E6%96%87%E5%A4%89%E6%95%B0)
- [ほげ (hoge)とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word11871.html)
- [ hoge, hogehogeの由来、foo,bar の語源](https://dacelo.space/net/entry-662.html)
- [hogeとは (ホゲとは) [単語記事] - ニコニコ大百科](https://dic.nicovideo.jp/t/a/hoge)
- [hoge(ほげ)の意味 | とくに意味もないときに使う変数名
hoge(ほげ)の意味 | とくに意味もないときに使う変数名](https://www.manicyouth.jp/hoge/)
- [ほげを考えるページ](http://kmaebashi.com/programmer/hoge.html)
【PHP】 ファイル操作

PHPのファイル操作に関する備忘録です。


##1.html(input)からPHP側に送付するフォームを作る


```html
<form action="image_form.php" method="post" enctype="multipart/form-data">
<input type="file" name="img">
<input type="submit" value="アップロードする">
</form>
```

##2.PHP側の処理

```php
<?php

//ファイル名を取得する 例）*****.pngとか
$filename = $_FILES['img']['name'];

//一時保存されたファイルのパスとファイルを取得
$filedata = $_FILES['img']['tmp_name'];

//ファイルを保存するフォルダ名
$storeDir = '/home/vagrant/image/img/';

//一時保存したファイルを指定のファイルに移動する.
//第一引数には一時保存したファイルパス
//第二引数には保存先のファイルパス
move_uploaded_file($filedata,$storeDir.$filename);

?>
```

##解説

###$_FILESについて

```
上記ではファイルを送信するnameをimgとしました。
ですので、$_FILES['img']をvar_dump($_FILES['img'])すると下記のように出力します。

array(5) { 
["name"]=> string(51) "スクリーンショット 2019-11-16 16.07.59.png" 
["type"]=> string(9) "image/png" 
["tmp_name"]=> string(14) "/tmp/php8VMhWj" 
["error"]=> int(0) 
["size"]=> int(29001) 
}
```

name:アップロードしたファイルの名前
type:アップロードしたファイルの種類
tmp_name:一時保存しているファイルのパス
error:エラーが発生していると1,エラーなしは0
size:ファイルサイズを表示（単位はbyte)
gitの使い方（初心者）

1. `git init`：ローカルリポジトリ作成

2. `git add .`：インデックスにディレクトリを一時保存。（インデックスとは、リポジトリにコミットする
準備をするために変更内容を一時的に保存する場所のこと。）

3. `git commit -m "~"`：ローカルリポジトリに追加や変更を記録する
　(`git commit -am "~"`:addとcommitを同時に行う)

4. リモートリポジトリに反映させるために、リモートリポジトリの情報を追加
`git remote add origin https://github.com//awesome.git`：こんな感じのやつ

5. `git push origin master`:ローカルリポジトリをリモートリポジトリにプッシュ！！
シェルスクリプト for文 書き方(6つの例)

#### for file in *
カレントディレクトリ内のすべてのファイル名を表示

```bash:for-example1
for file in *
do
  echo "${file}"
done
```

#### for text in \`cat textlist\`
コマンド置換により、textlist 内のテキストを1行ずつ読み込み表示

```bash:for-example2
for text in `cat textlist`
do
  echo "${text}"
done
```

#### for arg in "$@"
シェルスクリプトに与えられた引数を1つずつ表示

```bash:for-example3
for arg in "$@"
do
  echo "${arg}"
done
```

#### for文内に case
カレントディレクトリ内のファイルに対してバックアップ(.bak)を作成
ただし、すでにバックアップが存在している場合はスキップ

```bash:for-example4
for file in *
do
  case "${file}" in
    *.bak)
      continue
      ;;
  esac
  cp -p "${file}" "${file}".bak
done
```

#### N回数ループ
10回ループ

```bash:for-example5
for i in {1..10}
do
  echo "${i}"
done
```

#### 特殊文字でループ
; や \ にはシングルクォートで囲んであげる
: や / に対しては囲まなくても動く

```bash:for-example6
for i in ';' '\'
do
  echo "${i}"
done
```
http から https にリダイレクトさせる方法

## 設置した経緯

`http` でアクセスした場合に、一部の機能がエラーになるので `https` にリダイレクトさせたい！


## .htaccessファイルを作成

```
RewriteEngine on
RewriteCond %{ HTTPS } off
RewriteRule ^(.*)$ https://%{ HTTP_HOST }%{ REQUEST_URI } [R=301,L]
```

## 設置する場所

ファイル全体に反映したい場合は、ドメインルートに設定する。
階層ごとにファイルを設置した場合は、その階層のファイルの設定が優先されます。

![htaccess_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497005/b6667e19-55ec-86e8-fc14-80c538174eb3.png)

![htaccess_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497005/5cff78bc-4e84-2139-8fdc-cbe94aa9059a.png)
Next.js で Invalid hooks エラーになったけど意味不明なときは npm run clean する

Next.js で React hooks を使おうと思って意気揚々と `useEffect()` って書いて実行をしたら以下のようなエラーが出てしまって彷徨ってしまったときのメモ。

```
Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app
See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.
```

非常に丁寧なエラーメッセージで、解説記事もあり分かりやすい。のだけど、どう考えてもどれにも該当していない…なぜと頭を悩ませていたけど、実際は3番めの React app が重複して読み込まれているという症状だった。

Next.js で SSR するときには `npm run serve` を実行するが、そのときに生成される `dist` ディレクトリが原因。これがある状態で `npm run dev` でビルドすると重複してしまう。なので、どちらかに統一するのが良い。

単純に `dist` ディレクトリを消しても良いし、 `npm run clean` で余計なファイルを一括で削除しても良い。これで Next.js で React hooks を使うことができる。
[質問] C言語　１〜１００の中から素数を判定し、それらを表示するプログラムについて

if文やwhile文を最近習った、プログラミング初心者です。
「１から１００まで、素数かそうでないかを判断し、表示するプログラム」
これをwhile文を用いて作成せよ、という課題が出ました。
私なりに作成してみたのですが、実行しても何も起きませんでした。そのプログラムを以下に示します。原因と解決策を教えていただきたいです。

#include<stdio.h>
int main(void)
{
  int j=1;
  int count,i;
  for(i=2;i<=100;i++){
    while(j<=i-1){
      if(i%j==0){
	count++;
      }
      if(count==1){
	printf("%d\n",i);
      }
      j++;
    }
  }
  return 0;
}
react-railsでMaterial-ui

Material-UIはマテリアルデザインをReactアプリケーションに導入することができるUIコンポーネントです。Material-UIを使うことで、手軽にGoogleのマテリアルデザインを導入できます。

#インストール
まずはYarnで以下をインストールしてください。

```ruby:
$ yarn add @material-ui/core
$ yarn add @material-ui/icons #アイコン用
```

#使ってみる
これでmaterial-uiが使えるようになりました。
次に、material-uiの公式サイト（https://material-ui.com）にアクセスします。
サイドメニューのコンポーネントから、好きなコンポーネントを選択します。
今回はInputsのButtonを選択してみます。
すると以下のように、いくつかのButtonとソースコードが表示されます。
<img width="1422" alt="スクリーンショット 2019-11-23 8.21.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537630/46af42e4-7a8e-aa9e-19e7-483e381ef26e.png">

気に入ったUIのソースコードをRailsのReactコンポーネントに貼り付けることで、簡単にマテリアルコンポーネントを使用することができます。
では、react-railsで任意のコンポーネントを作成し、作成したコンポーネントを以下のように変更してくだい

```ruby:
import React from "react"
import PropTypes from "prop-types"
import Button from '@material-ui/core/Button'; 

class MaterialComponentList extends React.Component {
  render () {
    return (
      <React.Fragment>
      <Button variant="contained" color="primary">
          Primary
        </Button>
      </React.Fragment>
    );
  }
}

export default MaterialComponentList
```

今回はButtonコンポーネントを使用したので、Railsのnode_modules/@material-ui/core/Buttonをインポートしています。
これでreactcomponentの良び出す画面にアクセスすれば、material-uiのButtonが表示されているはずです。
FirebaseAuthの認証をつけたサーバサイドにPostmanからスタイリッシュにリクエストする方法

Gakuです。
最近、サーバサイドはGolang(heroku)+FirebaseAuthで構成するようにしていて、jwtをheaderに付与して認証するようにしてます。(めちゃくちゃ手軽に認証機能作れるので、この構成おすすめです。

そんなサーバサイドですが、動作確認を行うのにPostmanを使っていて、Postman上で認証させてリクエストする作業が面倒だったのでなんとかできないかと考えていました。
具体的には
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47132/3d34c7e6-6733-9165-6661-96a627f1b70e.png)
こんな感じのFirebaseAuthにログインするためだけの静的ページを作成して、ログインして出力されるaccess tokenを
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47132/eaa9b91c-3c74-6568-565c-e97d0aecbad8.png)
PostmanのCollection設定でBearer Tokenにペタっと貼って、サーバサイドにリクエストする感じです。

【面倒なポイント】
・この静的ページを毎PJで作る必要がある
・Tokenの有効期限が1時間なので、1時間たったらこの作業をやらないといけない。
・権限違いの動作確認を行う場合も、対象のユーザに切り替えてこの作業を行わないといけない。

くっそめんどう。もっと楽にならないかと考えるのはエンジニアのSagaですね。
楽になったので、その方法を記載したいと思います。

# やること概要
FirebaseAuthenticationはRestAPIを備えています。
documentは[ここに](https://firebase.google.com/docs/reference/rest/auth/#section-api-usage)あります。
この中の「signInWithPassword」を使えば、Postリクエストを投げることで対象ユーザのidTokenを取得可能です。

また、postmanには「Pre-request script」という機能があって、この機能を使えばリクエストを投げる前に処理をさせることが可能です。
pre-requestでsignInWithPasswordにpostしてidTokenを取得。そして、headerに「Bearer Token」をsetしてサーバサイドにリクエスト！で楽にします。

## Pre-request scriptの設定
postman上で作成したcollectionを右クリックして「Edit」を押すことで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47132/ae9645f4-227b-bb83-d0c3-8037dcde41d6.png)
collectionの編集画面が出てきます。pre-request scriptタブで以下を貼り付けます。

```js:pre-request-script
pm.sendRequest({
    url: 'https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=' + pm.environment.get("WEB_API_KEY"),
    method: 'POST',
    body: {
        mode: 'raw',
        raw: JSON.stringify(
        {
	        "email": pm.environment.get("EMAIL"),
	        "password": pm.environment.get("PASSWORD"),
	        "returnSecureToken": true
        }
    )}
}, function (err, res) {
    pm.request.headers.add({
        key: 'Authorization',
        value: 'Bearer ' + res.json().idToken
    });
});
```
postしてheaderに設定しているだけです。

## environmentの設定
postman上の右上にある歯車をクリックして「manage environments」を開いてこんな感じで設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47132/cc4ad045-0a3f-52ae-e6a9-54b42a81c383.png)
WEB_API_KEYはfirebase上の設定に記述されている
<img width="1364" alt="スクリーンショット 2019-11-23 8.18.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47132/aa5eeddc-6f2b-3b3a-4b01-fdafdff69782.png">
を設定すればOK。
EMAILとPASSWORDはログインしたいユーザの情報を記述すればok!

最後にサーバサイドにリクエストを投げてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47132/5ae530b3-2953-d42f-8994-16d1f209a534.png)
ちゃんと認証してresponseが帰ってきました。
これでくっそ楽になります(´・ω・｀)b

# おわりに
今回はFirebaseAuthを例にPostmanで認証させてリクエストを投げる方法を記載しましたが、この方法を使えばどんなAPIサーバでも認証させてリクエストを行えます。
こんなことがさくっとできるPostman素敵🎉
JuliaのMeta.parseでファイルをパーズしてみる

実行環境 julia1.2, MacOS

juliaのソースをparseして、関数やstructの関係を解析するツールを作ってみたいなと思ったわけですが、ファイルの中身をstringにしてMeta.parse()の引数に渡してもエラーになるばかり。

Manualを読むと、Meta.parse()には第二引数があって、そこを始点としてparseをしてくれるらしい。

ということで、ファイルの中身を文字列として次のファイルに渡すと、parseできる単位(関数とかstruct)でparseしたものをExprのArray{Any,1}としてくれる関数を作ってみた。

```julia
function parsestr(str)
 ix=1
 ps=[]
 while true
   (pp, ni) = Meta.parse(str,ix)
   if pp==nothing; break end
   push!(ps, pp)
   ix=ni
 end
 return ps
end
```

追記
Expr以外にもstringが収穫されることもある
他にもあるのかも
地図づくりはイノベーションで安堵されるか

![1280px-Battle_of_Nagashino.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102082/7a2d1755-2547-055d-a9c6-5ce485d950f3.jpeg)

https://speakerdeck.com/hfu/di-tu-dukurihaifalsebesiyondean-du-sareruka

専門的なコンテキストをいただける素晴らしい機会を頂きました。パネルディスカッションを通じて、2020年台には「地物が地図フレームの軛を打破して、直接的にウェブでハイパーリンクされる」ということを私が志向していることを引き出してくださいました。対話をしないとなかなか気がつけないことですが、確かにそここそ本質であり、今は局所的にしか実装されていないその方法を、進めるのだと思います。その実装において、識別子の問題は要素命題の問題のように解かれることになるのではないかと思います。科学の言語のような言語は少なく、言語ゲームの世界は広い。技術者としての私の2020年代のテーマは、この辺りにあるのかもしれませんね👍

## 地物識別子問題について
ほとんど自分のためだけのメモになるかもしれませんが、識別子問題へのヒントを、あえて紛らわしく編集した以下のテキストではっきり残しておきます。

> 親方Aが「タイル！」と叫ぶと、助手Bがタイルを持っていく。このとき、Aは別に、「Bよ、私にタイルを持ってきてくれ」と言っているわけではない。にもかかわらず、Bは、Aの「タイル！」を理解し、それに応じてタイルを持っていく。「タイル！」に対して、「はい、これはタイルです」と返答できたとしても、その言葉を理解したことにはならない。言葉は、言語ゲームのうちでその使い方を理解したときに初めて理解したといえる。

材料として、[ヴィトゲンシュタイン『哲学探究』を解読する](https://www.philosophyguides.org/decoding/decoding-of-wittgenstein-untersuchungen/)を使わせていただいています。
￼
github 初期設定からpushまでmemo

# Gitリポジトリ作成
```
git init
```

# 初期設定
```
git config --global user.name "ユーザ名"
git config --global user.email "メールアドレス"
```



# リモートリポジトリへ登録 (githubでリポジトリを作成してから)
```
git remote add origin https://github.com/ユーザ名/リポジトリ
git push origin master
```
VSCodeでRubyのコードを書いてデバッグするためにしたこと

# はじめに
VSCode上でRubyのコードの編集、デバッグをするためにしたことをまとめました。
# 環境
記事の内容について以下の環境で動作確認しています
macOS Catalina バージョン: 10.15.1
Visual Studio Code バージョン: 1.40.1
# 手順
1. rbenvをインストールする
2. rbenvを使ってRubyをインストールする
3. Bundlerをインストールする
4. debase (Rubyのデバッガ) をインストールする
5. ruby-debug-ideをインストールする　(debaseとVSCodeを連携できるようにする)
6. VSCodeにRubyの拡張機能を追加する

## 1. rbenvをインストールする
Rubyのバージョンを切り替えられるようにするためにrbenvをインストールします。
ターミナルを開いて以下のコマンドを実行します。

```bash:
$ brew install rbenv 
```

rbenvコマンドが使えればインストールは成功です。

```bash:
$ rbenv -v
rbenv 1.1.2
```
## 2. rbenvを使ってRubyをインストールする
バージョンを指定してRubyをインストールします。

```bash:
$ rbenv install 2.6.3
```

インストールされているRubyのバージョンを確認してみます。
*が付いているのが現在使用しているRubyのバージョンです。

```bash:
$ rbenv versions
  system
* 2.4.3 (set by /Users/(ユーザー名)/.rbenv/version)
  2.6.3
```
インストールしたバージョンに切り替えるには以下のコマンドを実行します。

```bash:
$ rbenv global 2.6.3
```
もう一度```rbenv versions```を実行すると、Rubyのバージョンが切り替わっていることがわかります。

```bash:
$ rbenv versions
  system
  2.4.3 (set by /Users/(ユーザー名)/.rbenv/version)
* 2.6.3
```
## 3. Bundlerをインストールする
gemの管理のためにbundlerをインストールします。

```bash:
$ gem install bundler
```
bundleコマンドが使えればインストールは成功です。

## 4. デバッガ(debase)をインストールする
Rubyのデバッガをインストールします

```bash:
$ gem install debase
```

インストールできたか確認してみます。

```bash:
$ gem list | grep debase
debase (0.2.4.1)
debase-ruby_core_source (0.10.6)
```

## 5. ruby-debug-ideをインストールする
デバッガ(debase)とVSCodeが連携できるようにします。

```bash:
$ gem install ruby-debug-ide
```

インストールできたか確認してみます。

```bash:
$ gem list | grep ruby-debug-ide
ruby-debug-ide (0.7.0)
```


## 6. VSCodeにRubyの拡張機能を追加する
VSCodeでRubyのコードを編集したときに入力補完などが効くようにします。
<img width="1048" alt="スクリーンショット 2019-11-23 3.47.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371652/f6bd2191-ed44-b56b-1086-fb4a22e063b8.png">

# デバッグする
以下のようなlaunch.jsonを作ってプログラムを実行するとデバッグができるようになります。
<img width="1381" alt="スクリーンショット 2019-11-23 4.06.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371652/1c664ef6-b50d-853f-6c2a-caedf660b9ba.png">
MATLABでツイートのセンチメント分析

# はじめに

MATLABのText Analytics Toolboxというものを普段愛用しているのですが、最新バージョンR2019bの[新機能リスト](https://jp.mathworks.com/help/textanalytics/release-notes.html)にセンチメント分析の機能があったので（Sentiment Analysis: Evaluate sentiment in text data using sentiment scoring algorithms including VADER）、お遊び感覚で試してみました。自分の備忘も兼ねて紹介します。

# センチメント分析とは？

記載の文章が、ポジティブ・ネガティブ・ニュートラルのどれなのか、一連の単語から判断するものです。感情分析ともいいます。ツイートやアンケート結果がポジティブなのかどうかを判断するために使われたりもします。

# 準備するもの

MATLABに、バージョンR2019b以降のText Analytics Toolboxが入っていればOKです。

# 早速試してみました

### データの準備
解析に使ったデータは下記です。strという名前のテーブルに3つの文章を保存しています。
<img width="200" alt="sentimentanalysisstr.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/b1171d7b-9341-1b05-c30c-a39ed505a94f.png">

念のため、Google翻訳を使って日本語に訳すと、意味としては下記の通りです。
"I am happy for you!": よかったね！
"Once upon a time, there was a princess.": むかしむかし、王女がいました。
"I'm so shocked because I failed the exam.": 試験に失敗したのでショックを受けました。

### トークン化
センチメント分析をするための前処理として、トークン化をします。コードと出力結果は下記です。

```matlab:
documents = tokenizedDocument(table2array(str));
documents(1:3)
ans = 
  3×1 tokenizedDocument:
     6 tokens: I am happy for you !
    10 tokens: Once upon a time , there was a princess .
     8 tokens: I'm shocked because I failed the exam .
```

### センチメント分析
各文章のスコアを見てみます。コードと出力結果は下記です。

```matlab:
compoundScores = vaderSentimentScores(documents);
compoundScores(1:3)
ans =
    0.6114
         0
   -0.6808
```

文章が下に行くほど値がネガティブになっていることがわかります。
このスコア化の部分、2行だけで書けたので、これから便利に使っていけそうです。

# Twitterのコメントをざっと見てみた

センチメント分析を応用できないかなと、twitterで、自分の好きな海外のテレビ番組名を検索した時の視聴者の反応を見てみました。（激しいコメントもあったので、番組名は伏せておきます）
なお、ツイートの取得に関しては、twitterのdeveloperアカウントも持っているのですが、アカウントを作っていない人でも雰囲気だけ試せるように、Htmlから中身を取ってくるコードを下に載せておきます。
（おそらく関数が英語のみ対応？なので、lang=enを明示しています）

```matlab
% KEYWORDには好きな検索ワードを入れる
doc = webread('https://twitter.com/search?q=KEYWORD&src=typd&lang=en');
% paragraphタグの中身を抽出
doc2 = extractBetween(doc, "<p", "/p>");
% eraseTagsを使用するためにタグをつけ戻す
for ii=1:length(doc2)
    doc3{ii} = ['<p' doc2{ii} '/p>'];
end
doc3 = doc3';
% HTMLタグの削除
doc4 = eraseTags(doc3);
% トークン化
documents = tokenizedDocument(doc4);
% センチメント分析
compoundScores = vaderSentimentScores(documents);
% ツイートとセンチメント分析スコアを横並びにして1つのテーブルにする
Scoretab = table(doc4 ,compoundScores);
```

以上の処理で、Scoretabという名前のテーブルの中に、ツイート（実際にはツイート以外の文も混ざっていますが・・）とスコアが横並びに格納されます。

で、Scoretabの中身を全部公開するにはちょっと激しい内容もあったので一部抜粋で・・
こんな感じの結果が出てきました。

・解説者は野蛮で、女の子は野蛮で、編集は野蛮である！　スコア -0.9115
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/b6bca527-097c-fa38-496f-5941ae547527.png)

・言ってもいいですか、私は◎◎と△△が大好きです　スコア 0.6369
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/966cd224-fe3e-04be-fda7-a9e25a639166.png)

スコア別にツイートをまとめたり、ソートしたりと、何かしら使い道がありそうですね。

もし、他にもっと良いセンチメント分析のお遊びの題材や、もっと良いコードの書き方などあれば教えてください。
laravel6


```terminal:terminal
sudo service mysqld start
mysql -u root -p
CREATE DATABASE laravel CHARACTER SET utf8;
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer
composer global require laravel/installer
export PATH=~/.composer/vendor/bin:$PATH
composer create-project --prefer-dist laravel/laravel laravel6

```
```terminal:terminal
laravel new laravel6
```

```terminal:terminal
composer require laravel/ui
```
「laravel DB作成

```terminal:terminal
cd laravel6
php artisan ui vue --auth

php artisan migrate
```
```terminal:terminal
npm install
```
```terminal:terminal
npm run dev
```

```terminal:terminal
php artisan serve
```
```
http://127.0.0.1:8000/home
```
docker コマンドリファレンス

## Docker command
### Remove Containers
`docker rm [コンテナID]`
これは複数指定も可能
`docker rm [コンテナID] [コンテナID]`

コンテナIDのみを表示するには
`docker ps -a -q`
とすればよく、これで実質全停止中のコンテナの削除ができる。

### Remove Images
`docker rmi [イメージID]`
git push で毎回SSHのパスフレーズを聞かれる時の対処

GitHubにpushする度にSSHのパスフレーズを求められるので、パスフレーズを省略する方法を調べてみました。
僕みたいな初学者だとググっても中々答えにたどり着けなかったので、世の初学者の為になれば幸いです。
初学者でも極力分かりやすいように書きます。

# 前提条件
１、SSHキーを作成している。
２、GitHubを使用していて、GitHubとSSHキーを連結している。
３、PCがMacである。
４、ターミナル及び、ターミナルコマンドの基本を知っている。

SSHキーをまだ作成していない方や、SSHキーの連結をしてない方はググって調べてください。
例えば、「Mac　SSHキー　作り方」「GitHub　SSH　連結」等、いろんなキーワードを使って調べましょう。
初学者こそググる力を蓄えないといけないらしいです。

# 使用環境
macOS Catalina V.10.15.1
git version 2.21.0


# 結論
該当のディレクトリ（GitHubと連結しれるプロジェクト）で**ssh-add**コマンドを打ち込む

```
// 必ず該当のディレクトリに移動する
% cd my-app　← my-appは例えです。
// 移動したら実行
% ssh-add
```

すると、SSHキー作成時に設定したパスフレーズの入力を求められるので、打ち込みましょう。

```
Identity added: .ssh/id_rsaのパス　（あなたがGitHubに登録したメアド）
```
これが表示がされたら成功です。試しにgit pushしてみてください。
おそらくパスフレーズは聞かれないはずです。

以上になります。これで解決しない場合は、、、すみません。ググってください。:innocent:
Vue.js の enter トランジション/アニメーションが適用されない

## 概要
Vue.js の v2.6.9 以降、 `<transition>` タグを直下に持ったコンポーネントを `v-if` で表示/非表示する場合、 `v-if` の値が `false` から `true` になる際の enter トランジション/アニメーションが効かなくなるようです。

以下、その例と解決方法です。

## enter トランジション/アニメーションが効かない例
`Toggle` と書かれたボタンをクリックする度に、 `My Transition Component.` という文字列が表示/非表示される UI があるとします。ここでは `v-if` で評価する `isShown` のデフォルト値は `false` とします。

```.vue
<button v-on:click="isShown = !isShown">Toggle</button>
<my-transition-component v-if="isShown"></my-transition-component>
```

また、 `my-transition-component` は次のような html を持つコンポーネントとします。

```html
<transition name="fade">
  <div>My Transition Component.</div>
</transition>
```

トランジションのためのCSSは以下が定義されているとします。

```.css
.fade-enter-active, .fade-leave-active {
  transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
  opacity: 0;
}
```

ここで、 `Toggle` ボタンをクリックし、 `isShown` の値を `false` から `true` に変更すると、 `my-transition-component` の `My Transition Component.` という文字列が描画されますが、 enter トランジション/アニメーションが適用されません。


## `<transition>` に `appear` 属性タグを追加する
上記の enter トランジション/アニメーションが適用されない問題の解決方法としては、トランジションさせたいコンポーネントの `<transition>` タグに `appear` 属性タグを追加します。 そうすると、コンポーネントが描画されるタイミングで、 enter トランジションが動作するようになります。

```html
<transition name="fade" appear>
  <div>My Transition Component.</div>
</transition>
```

## 参考
https://github.com/vuejs/vue/pull/9668
複数コミットの差分をPull Requestで表示する方法

こんにちは！
[株式会社Diverse](https://diverse-inc.co.jp/)でかいはつ室の室長をしているsamukeiです。

Diverseは「**すべての人へ出会いのプラットフォームを作る**」をミッションにインターネットでの出会いを提供するサービスを展開している会社です。
[DroidKaigi2019](https://droidkaigi.jp/2019/)、[iOSDC2019](https://iosdc.jp/2019/)にスポンサードするなどエンジニア文化にも理解がある会社です。
当社に興味がわいた方はお気軽に[@SAMUKEI](https://twitter.com/SAMUKEI)にDMください！

さて、1日目の記事としてgithubのちょっと便利なtipsを1つご紹介します。

# 複数コミットの差分をPull Requestで表示する方法

Pull Requestでレビュアーから修正が必要だった場合、複数のコミットにまたがって修正することがあると思います。
その際に、**あるコミットからあるコミットまでの差分だけを表示したい！**と思うことがありました。
今まではコミット単位のURLをコメントに貼って、参照してもらうようにしていたのですが、Githubの機能としてこの要件を満たす機能を見つけたので紹介します。

1. Pull Requestの画面を開き、画面左の「Changes from: all commits」をクリックします
![スクリーンショット 2019-11-25 11.23.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80840/93a9909c-a49c-dec0-1d86-75986b549eb1.png)

2. 「Select commit」から差分として選択したいコミットの先頭を「Shift」を押しながら始点をクリックします。そうすると、ハイライトされることがわかります。
<img width="385" alt="スクリーンショット 2019-11-23 2.12.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80840/fbb36739-f8ea-7483-5cdb-cd1e1c54f7a5.png">

3. 「Shift」を押したまま、選択したいコミットの最後のコミットをクリックします。
<img width="386" alt="スクリーンショット 2019-11-23 2.13.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80840/abda7b81-e0bd-a724-a359-c148c30aba00.png">

4. クリック後に、先頭→最後のコミットの間の差分が表示されます。 
![スクリーンショット 2019-11-25 11.24.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80840/6ba954b7-24c8-708e-f247-906397e7805d.png)

このURLを共有することで、あるコミットからあるコミットまでの差分だけを抽出でき、簡単に再度レビューしてもらうことが出来るようになりました。
レビュアーとのやりとりが円滑にすることができたので皆さんも試してみてください:relaxed:
MyBatisのMapperXMLでresultTypeが珍妙な動きをした

# またしてもMyBatisがやってくれやがった

[前回に引き続き](https://qiita.com/genkai_desu/items/40d7bce85b4ca5e9a71a)、またしてもMyBatisのヘンテコな動きにハマったという話です。
とは言うものの、基本的に私自身がおっちょこちょいなのと、どう考えても間違えたやつが悪い案件なので
MyBatisは何も悪くないと思います（いや、やっぱ悪いと思う）
意外と自分自身では間違いを見つけられずに、無駄な時間を過ごしてしまうって事が
まれによくあると思うのでいつか誰かが同じようなことで悩んだときにすぐに解決できるように残しておきます

MyBatisのバージョンは3.2です。

# 発生したこと

DBの`NUMERIC`なカラムに対して、Javaの`Integer`で保持しているデータが何故か入らなかった。
（実際に吐き出されたエラーをとっていなかったので、後でちゃんと貼り付けます！）
たしか、

**`String`なデータを`NUMERIC`なカラムに入れるなら、明示的にCASTしてね！**

というようなエラー内容だったと思う。

え？なんで`String`？僕が持っているの、`Integer`なんですけど・・・・？という内容です。

※ 以下のソースは、フィーリングを伝えるためのクソコードです。
変数名とかメソッド名とかすごい適当です

```ItemService.java
// 諸々省略
...
...
...
List<Integer> itemMasterIds = itemMasterMapper.getIdsByCategoryName("タピオカ");
// ↓↓ここでエラーになる↓↓
userItemsMapper.add(user.getId(), itemMasterIds);
```

```ItemMasterMapper.java
List<Integer> getIdsByCategoryName(@Param("categoryName") String categoryName);
```

```ItemMasterMapper.xml
<select id="getIdsByCategoryName" resultType="string">
    SELECT item_master_id FROM item_master WHERE category = #{categoryName}
</select>
```

```UserItemsMapper.java
void add(@Param("userId") long userId, @Param("itemMasterIds") List<Integer> itemMasterIds); 
```

```UserItemsMapper.xml
<insert id="add">
    INSERT INTO user_items (user_id, item_master_id)
    VALUES
    <foreach collection="itemMasterIds" item="item" separator=",">
    (#{userId}, #{item})
    </foreach>
</insert>
```

# 原因

おそらく、大体の人はざっと上記のコードを見ただけで瞬時にわかっちゃうと思うんですが、
`ItemMasterMapper.xml`で`getIdsByItemCategory`の`resultType`を、
`string`って書いちゃってるんですね。

> ```java
> <select id="getIdsByItemCategory" resultType="string">
>```

普通なら、Mapperインタフェースに定義した戻り値の型と、
Mapper XMLで定義している`resultType`が不一致だった場合は、
その時点でエラーになると思うんですが、なぜか`item_master.item_master_id `が
`String`の`List`で取れちゃうんですよねこれが・・・・。 

この程度のエラーがすぐに見つけられないとか、もう限界ですわ
Common data service の新しいデータタイプ(files)

ついにロールアウトされました！CDSの新しいデータタイプ：Filesです！
Power AppsのCanvas Appでは詳細設定に、このデータタイプを取り扱うための設定がありましたが、これまではCDS側が対応していなかったので、利用できない状態でした。

2019/11/23になって、この新しいデータタイプが追加されていましたので、簡単に紹介します。


#エンティティへの追加
特段迷いませんが、エンティティにフィールドを追加する際のデータ型に「ファイル」が追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/d2a0b10d-ff91-1002-2493-b97b5f510d0c.png)

これを選んで編集内容を保存します。
残念ながら、ビューの設定に、この「ファイル」は表示されませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/3c26e6a1-779b-0338-9ae0-ce68da043fd7.png)
（ファイル名だけでも見たい気もします）

#PowerApps上での振る舞い
PowerAppsのキャンバスアプリでどのようにこのフィールドが取り扱われるのかを見てみます。
単純にFormコントロールに追加してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/fb117459-3d41-2d53-fb5d-8f447a740e26.png)
結果としては添付ファイルと同じコントロールで登録・更新ができるようです。
実際、FormModeをViewに変更すると、ローカルにファイルがダウンロードされました。

#PowerAppsからのファイルアップロード
通常のFormコントロールはそのままですが、CDSのFileデータ型がすごいところは、PowerApps上のカメラ、画像の追加(に設定したファイル)を、非常に簡単にPatchできる点にあります！！

```Button.OnSelect
Patch(TEST,Defaults(TEST),{cr275_name:"1234",cr275_file:{FileName:"ABCD.xlsx",Value:UploadedImage1.Image}})
```

例えば画像の追加コントロールからなら、上記のようにFile列のデータをレコード形式で指定することで、ファイルの登録ができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/158df460-0b75-3b44-a5cc-9f825f889065.png)

これまでファイルのアップロードは（SharePointライブラリに対して）非常に大変でした。しかし、新しいフィールドの追加により、SharePointライブラリよりも高度な、"ドキュメントライブラリ"が利用できるようになりました。
※このファイルはBlobストレージに保存されるということです。

#おわりに
簡単でしたが、新しいFileフィールドのご紹介でした。
Power Automateを使うことなく、しかも非常にシンプルなPatch操作でデータをアップロードできる素晴らしいアップデートでした！
Dockerのデータマウントについて

# Dockerのデータ管理方法

## volumes
ホスト上では直接操作しない領域をマウントさせたい場合に使用
Linuxであれば /var/lib/docker/volumes　に作成される

### volumeの作成
dockerコンテナ内で

```bash
$ docker volume create [volume名]
```
### volumeの一覧
```bash
$ docker volume ls
```
### volumeの詳細確認
```bash
$ docker volume inspect [volume名]
```
###volumeの削除
```bash
$ docker volume rm [volume名]
```

### volumeのマウント -vを使う場合
```bash
$ docker run -itd --name [コンテナ名] -v [volume名]:[コンテナ上にマウントするパス] [利用したいイメージ]:[利用したいバージョン]
``` 
volumeを複数のコンテナで共有する場合は

```bash
$ docker run -itd --name [コンテナ名] -v [volume名]:[コンテナ上にマウントするパス]:ro [利用したいイメージ]:[利用したいバージョン]
``` 
のように編集権限を設定できる
### volumeのマウント --mountを使う場合(推奨)
```bash
$ docker run -itd --name [コンテナ名] --mount source=[volume名],target=[コンテナ上にマウントするパス] [利用したいイメージ]:[利用したいバージョン]
```
volumeを複数のコンテナで共有する場合は

```bash
$ docker run -itd --name [コンテナ名] --mount source=[volume名], destination=[コンテナ上にマウントするパス],readonly [利用したいイメージ]:[利用したいバージョン]
```
のように編集権限を設定できる
## bind mount
ボリュームとは違い、ユーザーの管理しているファイルやディレクトリ

### マウント -vを使用する場合
```bash
$ docker run -itd --name [コンテナ名] -v [ホスト上のパス]:[コンテナ上にマウントするパス] [利用したいイメージ]:[利用したいバージョン]
```
-vを使用した場合、ホスト上のパスが存在しない場合は新しくディレクトリが作成されます
### マウント --mountを使用する場合
```bash
docker run -itd --name [コンテナ名] --mount type=bind,source=[ホスト上のパス],target=[コンテナ上にマウントするパス] [利用したいイメージ]:[利用したいバージョン]
```
--mountの場合はホスト上にパスが存在しない場合エラーで怒られます

## tmpfs
メモリ領域をディレクトリとしてマウント
コンテナ停止するとホストでも消えてしまうので、永続的なデータではなく
一時的に保持するような消えても問題ないデータのみ保存する
### マウント
```bash
$ docker run -itd --name [コンテナ名] --mount type=tmpfs,destination=[コンテナ上にマウントするパス],tmpfs-size=[メモリサイズ(単位byte)],tmpfs-mode=[権限の設定 700など] [利用したいイメージ]:[利用したいバージョン]
```
【iOS】Xcodeショートカット集 　〜今日から始める圧倒的な時短開発〜

Qiita初投稿です！

開発中によく使うXcodeのショートカットをまとめました。
まだたくさんあると思うので、随時追加していきたいと思います。
こんな便利なものもあるよ！というのがあれば是非コメント欄に！


#ビルド&デバッグ

|コマンド|用途  
|---|---|
|command + R| ビルド + 実行
|command + B | ビルド
|command + control + R | 実行のみ(前回ビルドしたものを実行)
|command + . (ピリオド)  | 停止
|command + shift + K | クリーン


#検索

|コマンド|用途  
|---|---|
|command + F| ファイル内検索
|command + shift + F | プロジェクト内検索
|command + shift + O | ファイル名検索
|command + shift + J | 編集中のファイルをナビゲーターエリアで表示

#ファイル
|コマンド|用途
|---|---|
|command + N| ファイル作成

#シミュレーター

|コマンド|用途  
|---|---|
|command + →| 右回転
|commnad + ←| 左回転
|command + Q| シミュレーターを閉じる
|Option|二本指タップ
GCS にjupyterからモデルをアップロードする

## パッケージ
`pip install --upgrade google-cloud-storage`

## サービスアカウント
jupyterが乗っているclusterのサービスアカウントに、ストレージ管理者渡す。

## データの読み書き
```python
# Imports the Google Cloud client library
from google.cloud import storage

project_name = "riita_project"
storage_client = storage.Client(project_name)

bucket_name = 'riita_bucket'
bucket = storage_client.get_bucket(bucket_name)

#ファイルをアップロード
blob = bucket.blob('保存ファイル名')
blob.upload_from_filename(filename='ローカルファイルパス')

#アップロードしたファイルをダウンロード
blob2 = bucket.get_blob('取得ファイル名')
```
備忘録: Android ChromeアプリでのURLスキームIntent呼びだし

# 事前情報
AndroidのChromeアプリでURLスキームを利用して、Androidアプリを起動する際に気をつけるべき、不具合？仕様？があるので忘れないためというのと、記事がどこにもなかったため他にそのパターンに出会う人がいた時のために記事にしておきます。
あらかじめ書いておくと、ここに不具合なのか仕様なのかはわかっていません。またそれに対する回避方法などもわかっておりません。
ただ、意図しない挙動が起こるという事実だけを記載します。
ちなみに1週間ずっと悩んだ挙句答えに辿りつきませんでした。。。。

# 概要
AndroidのアプリをChromeブラウザアプリから起動させる際にURLスキームを利用するとブラウザバックが起こるという内容です。

# ブラウザバックが起こるパターン
## 前提条件 
OS Android 
ブラウザ Chrome
画面A/画面B 2つ
呼び出すスマホアプリ 1つ

## 前提条件詳細
- 画面Aには画面Bへの別タブで開くaタグが記載されている  

```screenA.html
<a href="/screenB.html" target="_blank>画面Bへ</a>
```

- 画面Bにはアプリを起動するjavascriptが記載されている

```screenB.html
<script>
                       // アプリを起動するURLスキーム
  top.location.href = "Inten://~end;";
</script>
```

## 手順
1. 画面Aにて画面Bへのリンクをクリックする
2. 画面Bが表示されると`top.location.href = "Inten://~end;";`が実行されて、アプリが起動する。
3. 自動的に画面がブラウザバックし、画面Aに遷移する。  
　(※target属性に_blankを指定しているため別タブで開かれていうるが、タブが閉じられる。Android全体で使用している戻るボタンのため、動作がPCのブラウザバックと多少違う？)

## 問題
アプリは起動するが、javascriptにブラウザバックする記述がないにも関わらず、ブラウザバックしてしまう。
Android端末でfirefoxで同様の動作をするとブラウザバックは起らす、iOSでsafariで確認したがブラウザバックは起らなかった。
iOSでのChromeの検証はすることができなかったの。

##所感
かなりの時間を割いて調査したが、有力な情報は手に入らなかった。
AndroidのChromeは安定しないと思っている方もいるらしい。バグなのか、何かしらのセキュリティにひっかかる動作のためなのか。
同様の事象で困っっている人がいるのを[stackoverflow](https://stackoverflow.com/questions/58092833/how-to-stop-back-behavior-of-intent-redirection#comment102579099_58092833)で発見できたため、自分の環境特有のものではないことを確認した.
safriとfirefoxで起らないということはバグではないかと思っている。