OmniAICreator/Qiita-1.07M huggingface dataset:
テンソル(Tensor)の理解(1) : Dimension

#1.はじめに

Tensorの理解に必要な情報を、自分用メモとして整理します。
同時に、PythonにおけるTensorの表記法もご紹介します。

*英語の表現が直感的で理解しやすいため、訳さずにそのまま記入致します。

#2.テンソルとは？

1. Tensor is a just a container for data.
2. The data are almost numerical data
3. Therefore, **Tensor is a container for number.**

テンソルは、数字を入れるコンテナです。シンプルですね。
下記の図のようにテンソルに関して様々な説明がされていますが、要は**数字を入れるコンテナ**です。

![tensor01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/5d432e48-371f-adcf-3347-953ccc8217a3.jpeg)
![tensor02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/ce4d2eb0-2553-ee00-84ed-0ff2824ec366.jpeg)
![tensor03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/d605b198-1d03-f97f-d36b-8707f41a6345.jpeg)

#3.テンソルのキーワード

Tensor, Dimension, Axis, Ranksの意味です。


1. Tensor is a **container of numbers.**
2. Tensor is a generalization of matrices to an arbitrary number of **dimensions**.
3. In tensor, **dimension** is often called **axis**.
4. **Number of dimension (=Number of axis)** is called **ranks**.

テンソルは、マトリックスの一般化された表現。



| 名称       |   テンソル |  表記    |
|:----------------:|:-----------------:|:------------------:|
|Scalar  |0 Dimensional Tensor  | Not Available |
|Vector  |1 Dimensional Tensor  | (k)  |
|Matrix  |2 Dimensional Tensor  |(j,k)  |
| ..  | 3 Dimensional tensor  |(i,j,l)  |

![tensor-keyword.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/583f2bc0-3fed-da6e-218e-beef6359e927.png)

#4.テンソルのDimension
テンソルの例、Pythonでの記入法を紹介します。
Pythonでは、リストを表すために**[ ]**を使います。この表現に早く慣れましょう。
numpyのndmi命令で、TensorのDimensionが確認できます。


##4.1 Scalar : 0D Tensor
A tensor that **contains only one number** is called a **scalar**.

![scalar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/c35665d6-13c7-dd38-f113-d6d31820c5f9.png)

##4.2 Vector : 1D Tensor
An **array of number** is called a vector, or 1D tensor.
![Vector.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/39c59efb-386f-c20c-aa51-a9b8815fb2ca.png)


##4.3 Matrix : 2D Tensor
An **array of vecotrs** is a matrix, or 2D tensor.
![matrix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/636f8f73-4156-7124-40a2-42d7b6b8040f.png)

##4.4 ..    :3D Tensor 
It is just nD tensor from 3D tensor.
![3dtensor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/a1847689-7e8f-f50e-81dc-b935239f406d.png)

#5. まとめ

Tensorとは、数字を入れるコンテナです。
TensorのDimension(=axis)の意味、Pythonでの表現について整理しました。
次回は、TensorのShapeについてご紹介します。

[テンソル(Tensor)の理解　(2) : Shape](https://qiita.com/kotai2003/items/b977a28660bba2a07dc7)
3/10 授業ノート

#今日習ったこと(教科書P208～217、P225)
CSS
・aside要素→メインコンテンツと関係が薄く、取り外しても問題がないセクションを表す要素
・article要素→自己完結した独立したセクションを表す要素
・datetime属性→日付や時刻を属性値で指定することができる

#休んでいた分のまとめ
boxモデルについて(教科書P110～119)
・nav要素のスタイルを整えて横一列のボタン風に設定する
　①中黒を消す(li要素で作業)
	```li{ list-style: none;}```
　②メニュー項目を横並びにする(li要素で作業)
　　li要素はブロックレベル要素のためdisplayプロパティの初期値がblockになっており、
　　横並びにするためには、displayの値を変更する必要がある
　　・displayプロパティ：ブロックレベル・インライン・フレックスコンテナ等の、
　　　要素の表示形式を指定する際に使用
	display:block→ブロックレベル要素のため自動改行される(縦並び)
	display:inline→テキストレベルの要素と同じ動きを取り、
自動改行されなくなる(横並び)
ボックスサイズ(width)は内容に応じて自動的に変わる(変更できない)
　③メニューの各項目を同じ幅に統一する(li要素で作業)
	display:inline-block→横並びでボックスサイズ(width)の指定もできる
	ex:) ```li{ list-style:none; display: inline-block; width:180px; }```
　④メニュー項目をボタン風デザインに変更する(a要素で作業)
	1.マウスオーバーで色が変わる設定にする(:hover)
	ex:)
```li a{ background: #ff0; color: #fff; }```
```li a:hover{ background: #000;}```

2.ボタンに見えるようにクリックできる(文字部分の)領域を広げる
ex:)
```li a{ padding: 10px; background: #ff0; color: #fff; }```

3.li要素の内側いっぱいにa要素のボックスが収まるようにする
　：a要素のdisplay初期値がinlineのためli要素と範囲が揃わない→値をblockに変更
ex:)
```li a{ display: block; padding: 10px; background: #ff0; color: #fff; }```

　①～④をまとめると、
	ex:)
	```li{ list-style: none; display: inline-block; width:任意の値; maagin: 任意の値; }
li a{ display: block; padding/・background・color:任意の値; text-decolation: none;}
li a:hover{ background: #任意の値;}```
・特定のボックスの横幅を任意の値に設定してブラウザの中央に寄せる
　→左右marginの値をautoにすると横幅を固定したブロックレベルのボックスそのものを
　　センタリングできる
ex:) ```#box{ width:任意の値; margin:任意の値 auto; ・・・}```

#感想
1週間も病欠したのでノートまとめがめちゃくちゃ大変…。
【AWS】EC2 Cloud9からGitHubにプッシュ

Git、GitHubリモートリポジトリ作成後のリモート接続でコマンドなど備忘録として。
ミス不足などあればご指摘頂けますと幸いですm(_ _)m

#確認、失敗時の削除コマンド

```
# 確認
$ git remote -v

#削除
$ git remote rm 名称（originや自分でつけたもの）
```

# Cloud9でSSHキー取得 ~ GitHub側に設置まで

移動

```
$ cd ~/.ssh
$ ls -ltr
```

##「 **ssh-keygen** 」 でSSH（Secure SHell）の公開鍵と秘密鍵を作成する

[【 ssh-keygen 】コマンド――SSHの公開鍵と秘密鍵を作成する](https://www.atmarkit.co.jp/ait/articles/1908/02/news015.html)
[【図解】初心者も分かる”公開鍵/秘密鍵”の仕組み～公開鍵暗号方式の身近で具体的な利用例やメリット〜](https://milestone-of-se.nesuke.com/sv-advanced/digicert/public-private-key/)

```
$ ssh-keygen
```

公開鍵(.pub)を表示して、「ssh」から手動選択してコピー（**アドレス部は不要**）

```
$ cat ~/.ssh/id_rsa.pub
ssh-rsa hoggehogehogehoge...hogehoge foobar@1111　←これは不要
```

GitHubトップへ行き、settings - SSH and GPG keysに貼り付け。

保存予定のGitHubリモートリポジトリの**HTTPS**のURL確認し

```
# リモートのpush,fetchの追加
$ git remote add origin URL(HTTPS)
```
※ 補足
fetchコマンドは「他の更新内容を、自分の開発環境に取り入れる機能（更新はなし）」
pushはマージを含むもの。

[共同開発の第一歩!git fetchを正しく理解しよう!](https://www.sejuku.net/blog/71164)

##使用する秘密鍵をconfigファイルに設定
※ 秘密鍵（Cloud9側）で暗号化したファイルが公開鍵（GitHub）で公開される

[gitでPlease make sure you have the correct access rights and the repository exists. が出た時の対処法](https://milestone-of-se.nesuke.com/sv-advanced/digicert/public-private-key/)

```
$ vi ~/.ssh/config
#-------------------
Host github
  HostName github.com
  IdentityFile ~/.ssh/id_rsa
  User git
#-------------------
# 「Iキー」 インサートモード（編集）
# 「wq」 保存して終了
```

プッシュ

```
$ git push -u origin --all
Username for 'https://github.com': ユーザー名（GitHubで使用中の名前）
Password for 'https://ユーザー名（GitHubで使用中の名前）@github.com': パスワード（GitHub使用のパスワード）

省略

Everything up-to-date
```

終了。

# 参考
[cloud 9からGitHubに初めてpushする方法(初学者向け)](https://qiita.com/catkk/items/182080c20e4f26f93625)
Raspberry Pi Imager を使って microSD カードをフォーマットする

Raspberry Pi 用に microSD カードをフォーマットする方法を調べていて、いろいろな方法が出てきた。

ただ、Raspberry Pi が公式で提供している Raspberry Pi Imager を使う方法について書かれたものについては見つけられなくて。

試してみたところ Raspberry Pi Imager を使う方法が一番簡単だと思ったのでメモしておく。

## 環境

環境は下記のとおり。

```shell
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.3
BuildVersion:   19D76
```

## Raspberry Pi Imager

Raspberry Pi Imager は SD カードに Raspberry Pi 用の OS をインストールするためのツール。実はこのツールを使って SD カードのフォーマットもできることを知った。

下記からダウンロード＆インストールできる。

- <https://www.raspberrypi.org/downloads/>

![Raspberry_Pi_Downloads_-_Software_for_the_Raspberry_Pi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6294/c4b8294b-e513-80dd-ed87-ade0a135bbea.png)

## microSD カードをフォーマットする

インストールする OS を選ぶメニューから「Erase」という項目を選ぶ。

![1866C39788A4986F6D815FD3181C60B7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6294/fac8fe7a-3b83-c255-a3a0-af365c7e76ef.jpeg)

![FE8817BC9F92EEAD935F1E6E0F6FAC5F.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6294/9d13e912-5a77-a188-f8d2-7cac8bed3d33.jpeg)

あとはフォーマットしたい SD カードを選んで実行するだけ。FAT32 でフォーマットされる。

![251FE6FA4D9D4B7166C4BF1D5FF74ADE.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6294/89ec1a23-d91d-747a-a142-db1ebfc2da3f.jpeg)

ちなみに私の場合は SD カードを選ぶ際に、対象の SD カードが表示されなくて、SD カードを一度マウント解除して挿し直したら、表示されるようになった。

## OS をインストールする

フォーマットした後、そのまま Raspberry Pi Imager を使って、Raspberry Pi 用の OS を SD カードにインストールできる。便利。
Nuxt.jsで共通のcssを呼ぶときの注意

# 全体で`.styl`を読み込む
共通の.stylファイルを呼び出したいときはNuxtであれば[@nuxtjs/style-resources](https://github.com/nuxt-community/style-resources-module)を利用します。

```
$ npm i --save-dev @nuxtjs/style-resources
```

共通で読み込みたい.stylファイルを`/assets/stylus/xxx.styl'`とすると
`nuxt.config.js` に以下の記述を追記します。

```js:nuxt.config.js
export default {
  modules: [
    '@nuxtjs/style-resources',
  ],
  styleResources: {
   stylus: './assets/stylus/xxx.styl'
  }
}
```

複数の.stylファイルを読むこともできますが、メインの.stylを1つ読み込んでそのなかに`@import`を書いて上げる方法で良いと思います。

# 注意点
上記の方法1つ注意があります。
**共通で呼ぶ.stylファイルは、mixinやfunction、定数を記述したファイルのみにしておきましょう！**
共通の.stylに普通にスタイルを当てる記述を書いちゃうと、コンポーネントの数分無駄に同じcssがかかれてしまします。
これが原因で要素の検証をするときにかなり重くなることもあります。

resetやdefaultのスタイルがもしある場合は、`layouts/default.vue`に

```vue
<style lang="stylus">
@import "../assets/stylus/reset"
</style>
```

と書いてやると良いかと思います。

追記
この方法じゃなくて `nuxt.config.js` の `css` にstylusのファイルを書くのも動きました。
XServerにWordPress5.3でも動くようにWP-CLIをインストールする

# すること

XServerにWP-CLIをインストールします。

```console
$ mkdir ~/bin
$ curl -o ~/bin/wp https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ chmod +x ~/bin/wp
$ echo -e "\n"'alias wp="php7.4 ~/bin/wp"' >> ~/.bashrc
$ source ~/.bashrc
```

[Gistにコードを書いたので、下記での実行も可能です。](https://gist.github.com/yousan/721bed85c7040d22cfa73cef47bbf8ed)


```console
$ curl https://gist.githubusercontent.com/yousan/721bed85c7040d22cfa73cef47bbf8ed/raw/0d4b49ed260bd563c169886ae18d7e749c927905/install_wpcli_for_xserver.sh | sh
```

# コマンドについて

コマンド | 説明
----|----
mkdir ~/bin | ホームディレクトリにbinを作成する
curl ... | WP-CLIのダウンロード
chmod +x bin/wp | 実行権限付与
echo 'alias wp="php7.4 ~/bin/wp"' >> ~/.bashrc | wpにエイリアスを掛ける
source ~/.bashrc | エイリアスの再読み込み

# エイリアスの利用

XServerでは `env php` がPHP5.4[^1]となっていますが、WordPress 5.3ではPHP５．６が必要要件となっているため動きません。そこでエイリアスを掛けています。


```console
$ wp plugin list
Your server is running PHP version 5.4.16 but WordPress 5.3 requires at least 5.6.20.
```

[^1]: 2020年3月11日 現在
【PHP】DBテーブルから文字化けせずにCSV出力する方法





DBから取得したデータをCSV出力してみたいなと思いました。
しかし、表示している文字化けやら、出力されなかったりと振り回されたのでここにまとめてみます。



#方法

```php:csv.php
<?php
$dsn = "mysql:dbname=board;host=127.0.0.1";
// $dsn = "mysql:dbname={$dbname};host={$dbhost}";
$dbuser = "root";//データベースユーザー名
$dbpassword = "root";//データベースユーザーパスワード



$file_path = "customer.csv"; //生成されるファイル名
$export_csv_title = ["id", "view_name", "message", "post_date"];//DBテーブルのヘッダー項目
$export_sql = "SELECT * from message";//SQL文


foreach( $export_csv_title as $key => $val ){

    $export_header[] = mb_convert_encoding($val, 'SJIS-win', 'UTF-8');
}

try{
    $dbh = new PDO($dsn, $dbuser, $dbpassword);
}catch(PDOException $e){
    print('Connection failed:'.$e->getMessage());
    die();
}


//$now_date3="./";
//if(touch($now_date3.$file_path)) この場合は1つ上の階層でファイルが生成される

if(touch($file_path)){ //ファイル生成場所（階層指定の場合は↑参照）
    $file = new SplFileObject($file_path, "w");

    // 出力するCSVにヘッダーを書き込む
    $file->fputcsv($export_header);

    // データベース検索
    $stmt = $dbh->query($export_sql);

    // 検索結果をCSVに書き込む（SJIS-winに変換するコードに後々更新します。）
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
        $file->fputcsv($row);

    }

    // データベース接続の切断
    $dbh = null;
}
?>
```

```php:index.php
<button><a href="posts/csv" class="button">csvダウンロード<a></button>

```
##補足
補足説明です。

###各々テーブル変更する箇所


```
$row = '"title","body","image_url"' . "\n";
foreach ($result as $value ){
   $row .= '"' . $value['title'] . '","' . $value['body'] . '","' . $value['image_url'] . '",' . "\n";
  }
```

ここの"title"とかその他の部分はそれぞれのテーブルと照らし合わせて変更してください。

###文字化け対策
最後の方の**mb_convert_variables("sjis","utf8",$row );**に注目です。
`print $row;`出力する前にここで文字化けしないようにセットしてます。



これで行けるはず！
![csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543413/32ebce23-c0b9-5a1a-107a-d9bf760714bc.png)
dockerでimage treeを見るスクリプト

動作確認OS: ubuntu 19.10

# ホスト側初期設定
[graphvizのinstall](https://www.graphviz.org/download/)
[dockerのinstall](https://docs.docker.com/install/)


```bash
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images --dot > image.dot
dot -Tpng image.dot -o image.png
```

ここからはubuntuのみ

```bash
xdg-open image.png
```

# 参考記事
[Docker で Image の ツリーを見る方法](https://qiita.com/moremagic/items/860d4853377d1286d97c)
Railsで作ったアプリをAWSでデプロイ③　〜Elastic IP,ポート開放,EC2インスタンスログイン〜

前回までにEC2インスタンスを作りましたので続きです

Railsで作ったアプリをAWSでデプロイ①　〜アカウント作成編〜
https://qiita.com/shunsuke284052/items/39bf73d1996251083c72
Railsで作ったアプリをAWSでデプロイ②　〜EC2インスタンス〜
https://qiita.com/shunsuke284052/items/6de92b0f832d6240f0bb

作ったEC2インスタンスにElastic IPを振り分けます
こうしないとEC2インスタンス作成時から振り分けられたパブリックIPはサーバー再起動の度に変化してしまいます
AWSから振り分けられた固定のパブリックIPアドレスであるElastic IPを振り分けます

左サイドバーの「Elastic IP」→「Elastic IP アドレスの割り当て」→「Amazon の IPv4 アドレスプール」→「割り当て」でカンタンに作成できます
<img width="1440" alt="スクリーンショット 2020-03-11 15.20.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/a91d43fe-731d-f32a-970a-ce7b20738dee.png">

作成したElastic IPをEC2インスタンスに紐付けましょう

<img width="1440" alt="スクリーンショット 2020-03-11 15.26.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/dedc8b77-6052-0f92-4b87-d724c5aa0a15.png">

リソースタイプは「インスタンス」
インスタンスは紐付けたいインスタンスのインスタンスID
プライベートIPアドレス、再関連付けは何も入力しません
<img width="1440" alt="スクリーンショット 2020-03-11 15.29.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/67977c38-49c7-804d-ce98-e9930460cd6d.png">

EC2インスタンスの画面からElastic IPが振り分けられていることが確認できます
IPv4 パブリック IP = Elastic IPになっていますね
<img width="1440" alt="スクリーンショット 2020-03-11 15.35.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/f855ea8d-56d7-4d41-0bfb-84ea52c503ac.png">

最後にポートをHTTPにも開放してあげて実際にインスタンスにログインしてこの回は終了にしたいと思います
EC２インスタンスメニューの「セキュリティグループ」から「launch-wizard-1」をクリックしてあげると英語の画面に遷移します
そこから「Inbound rules」→「Edit Inbound rules」を選択します
<img width="1440" alt="スクリーンショット 2020-03-11 15.41.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/7f77a089-6afe-9242-dad6-34c92b655f7e.png">
「Add rules」→「HTTP」を選択→Sourceを「Custom」「0.0.0.0/0」→あとは何もいじらず「Save rules」
「0.0.0.0」や「/0」は「全てのアクセスを許可する」という意味です

<img width="1440" alt="スクリーンショット 2020-03-11 15.43.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/ec438a67-c993-a6f7-6b4e-c3eafc4d3b85.png">

これでポートは開きました

EC2インスタンスにログインします
ローカルのターミナルでこちらを実行します

```
$ cd ~

$ mkdir ~/.ssh
# .sshというディレクトリを作成
# File existsとエラーが表示されたとしても、.sshディレクトリは存在しているのということなので、そのまま進みましょう。

$ mv Downloads/ダウンロードした鍵の名前.pem .ssh/
# mvコマンドで、ダウンロードしたpemファイルを、ダウンロードディレクトリから、.sshディレクトリに移動します。

$ cd .ssh/

$ ls
# pemファイルが存在するか確認しましょう

$ chmod 600 ダウンロードした鍵の名前.pem
# 権限を付与

$ ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP
#（例えばElastic IPが123.456.789であれば、shh -i ダウンロードした鍵の名前.pem ec2-user@123.456.789 というコマンドになります）
#（ダウンロードした鍵を用いて、ec2-userとしてログイン

```

初回ログイン時に何かしらの質問がきますがyesと答えてください

大きくEC２と書かれた画面が現れたら成功です
背景を複数の選択肢からランダムで表示する

## 完成物

<p class="codepen" data-height="431" data-theme-id="dark" data-default-tab="js,result" data-user="ririli" data-slug-hash="JjdpKJj" style="height: 431px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="random-background">
  <span>See the Pen <a href="https://codepen.io/ririli/pen/JjdpKJj">
  random-background</a> by ririli (<a href="https://codepen.io/ririli">@ririli</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


## ちょっと解説

するまでもないですが。

事前に背景の選択肢をarrayで定義しておきます。
今回は色にしましたが画像とかでもOK。

```javascript

let backgroundImageData = [
    'red',
    'blue',
    'green'
]
```

ランダム要素のためにMath.random()の値を返す関数を定義します。
ポイントは0~maxまでの整数を返すようにすること。

```javascript

function getRandInt(max) {
   return Math.floor(Math.random() * Math.floor(max));
}
```

window.onloadのタイミングでrand関数を呼び出します。
その結果を定義した選択肢のarrayに適用。

```javascript
window.onload= function() {
    const randNum = getRandInt(backgroundImageData.length)

    const background = document.getElementById("background")

    background.style.backgroundColor = backgroundImageData[randNum]
};
```


## あとがき

こんな単純なことでも以外と要件にあったりするので誰かに役に立てば。
こうしておくと後任の担当者にも変更箇所が簡潔に見えて良さそう。
Laravel バリデーション メモ

※個人的なメモです。

#フォームの入力にたいしてバリデーションするならフォームリクエスト、またはValidatorクラスのメソッドを使う

下記フォームリクエスト作成コマンド

```
php artisan make:request CreateUserRequest
```

保存時とか特定のタイミングでエラー検証したい場合はValidatorを使う。
コントローラ等で下記コードを記載すればよい

```
use Validator;
```

#errorsメソッド

```
# 全てのエラーメッセージを配列で取得
$errors->all()

# 指定した項目の初めのエラーメッセージを取得
$errors->first('項目名')

# 指定した項目のエラーメッセージ全てを取得
$errors->get('項目名')
```

#バリデーション 検証ルール　メソッド

```php
# true, on, yes, 1をチェック(チェックボックス等で使用)
accept

# アドレス指定されたドメインが実際に有効かどうかをチェック
active_url

# url形式かどうかをチェック
url

# 指定した日付より後かチェック
after: 日付

#指定した日付が同じか、それより後かをチェック
after_or_equal: 日付

...その他多数あり
```

#バリデーション結果検証メソッド

##failsメソッド

```php
# バリデーションがエラーになっていればtrueを返す　
$validator->fails()
```

##passesメソッド

```php
# バリデーションが成功していればtrueを返す(failsメソッドの逆)
$validator-> passes()
```

#バリデーション エラーとフォームの値をリダイレクト先に表示

##withErrorsとwithInputの使い方
下記のように書くとリダイレクト先にエラーメッセージとフォームの値を保持できる

```
    $validator = Validator::make($request->all(),[
      'name' => 'required',
      'mail' => 'email',
      'age' => 'numeric|between:0,150',
    ]);
    
    if($validator->fails()){
      return redirect('/hello')->withErrors($validator)->withInput();
    }
```

#クエリーに対してバリデーション 

queryメソッドを使う　

```
    $validator = Validator::make($request->query(),[
      'id' => 'required',
      'pass' => 'required'
    ]);
```
ubuntu16.04 LTS remote-desktop (Windows10)



# Why

- 構築メモ
- 既存の記事でいろいろハマったので忘備録として


#How


基本的は以下を参考にさせてもらいました。
変えたのはほんの少しだけ
[Windows10からのRDP接続（ubuntu16.04 LTS）](https://qiita.com/hitobb/items/e97b38723304589f4f1d)






#### デスクトップ環境セットアップ

```
$ sudo apt-get update&&upgrade

$ sudo apt-get -y install ubuntu-desktop

$ sudo reboot
```

#### xrdp

上記の筆者も書かれていますが、
>apt-get使って最新のxrdpをインストールしたいところですが、
>16.04の場合は古いバージョン（v0.61）がインストールされます。
>ワタクシはLTSが使いたいのです！

##### 記事に従って下準備のinstall

```
$ sudo apt-get install build-essential devscripts git autoconf libtool pkg-config gcc g++ make libssl-dev libpam0g-dev libjpeg-dev libx11-dev libxfixes-dev libxrandr-dev flex bison libxml2-dev intltool xsltproc xutils-dev python-libxml2 g++ xutils libfuse-dev libmp3lame-dev nasm libpixman-1-dev xserver-xorg-dev
```

以下にアクセスして入れるバージョンを確認
[xrdp package in Ubuntu](https://launchpad.net/ubuntu/+source/xrdp)

記事にあったバージョンは0.9.4
今回入れたのは0.9.5

![ver2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326425/88700106-9845-b939-f2eb-a54d51c8f5a8.png)


##### ダウンロード
```
$ sudo wget https://launchpad.net/ubuntu/+archive/primary/+files/xrdp_0.9.5.orig.tar.gz
$ sudo wget https://launchpad.net/ubuntu/+archive/primary/+files/xrdp_0.9.5.orig-xorgxrdp.tar.gz
```

##### 適当なディレクトリで解凍

```
$ sudo tar -zxvf xrdp_0.9.5.orig.tar.gz
$ sudo tar -zxvf xrdp_0.9.5.orig-xorgxrdp.tar.gz
```

##### インストール

```
cd ~ 
cd xrdp-0.9.5
sudo ./bootstrap
sudo ./configure --enable-fuse
sudo make
sudo make install
sudo ln -s /usr/local/sbin/xrdp{,-sesman} /usr/sbin
cd ~
cd xorgxrdp-0.2.5
sudo ./bootstrap
sudo ./configure
sudo make
sudo make install
```


#### デスクトップ環境構築

後は記事と同じです

```
$ sudo apt-get install xfce4 xfce4-goodies

$ echo xfce4-session > ~/.xsession
```

```
$ sudo vi /etc/xrdp/startwm.sh

  # suse
  if [ -r /etc/X11/xdm/Xsession ]; then
    # since the following script run a user login shell,
    # do not execute the pseudo login shell scripts
#    . /etc/X11/xdm/Xsession 
        xfce4-session
    exit 0
  fi
```

/etc/X11/xdm/Xsession  # コメントアウト
xfce4-session # 追加

```
$ systemctl restart xrdp
$ systemctl status xrdp

# Activeを確認
● xrdp.service - xrdp daemon
   Loaded: loaded (/lib/systemd/system/xrdp.service; disabled; vendor preset: enabled)
   Active: active (running) since 水 2020-03-11 14:47:39 JST; 46min ago
```

リモデができます


# After

CentOS7でもリモデ環境を構築していたので、Ubuntuでもサクッといけるだろうと思っていたのが
思っていたよりハマりました。「ubuntu16.04 リモデ」でググってみても同じように皆さんハマっていて、
かつ解決できていないパターンも見かけました。

ubyntu18.04なら結構楽にできそうな感じっぽいので、今度試してみようかと。
AWS上のインスタンスにリモデするパターンもやっておきたい。

# 追記
---

AWS EC2インスタンス(Ubuntu16.04)のGPUインスタンスタイプにて、
機械学習における学習モデル構築のためのサーバを立てました。

リージョン：東京
OS:Ubuntu16.04LTS
タイプ：p2.xlarge

スポットインスタンスを利用して、
0.45$/hほどで使えました。


##### インスタンスの容量が足りなくなった

オフィシャルを参考に
https://aws.amazon.com/jp/premiumsupport/knowledge-center/extend-linux-file-system/


環境構築途中でインスタンスのボリュームサイズがショートしたので、追加で増量(増量はできるが、減量はできない)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326425/6e2ec8f6-291f-d2dd-3950-4e9f1404f2e1.png)





##### 機械学習用環境構築後、リモデができなくなった

0.9.x バージョンの時の対処例
https://diary.app.ssig33.com/280

これでリモデ復活した
再束縛と再代入の違い

# 再束縛と再代入の違いをコードで見比べてみました。
Rustでは変数とはデータに付いた名前のようなイメージだそうです。

変数束縛とは値に名前をつけること。

letで変数の値を更新した気になっても、実は別の値に同じ名前を束縛しただけ、ということが起き得るわけですね。

ですからイテレータなどを使ってtmp変数を更新する、みたいなことをする際には`let mut tmp = tmp + i`みたいにする必要があるというわけです。


しかしfor文の中で再束縛される場合とされない場合の違いがよくわからないではある。(追記2020/03/11：コメントで指摘あり)


```rust
fn rebind(){
    let sum = 0;
    println!("sum : {}",sum);
    for i in 0..10 {
        // 新しい束縛を作っているので上の束縛には影響がない。
        let sum = sum + i;
    }
    println!("rebind sum : {}", sum); // => 0
}

fn reassign() {
    let mut sum = 0;
    println!("sum : {}", sum);
    for i in 0..10 {
        // 上の束縛の値を書き換える。 
        sum = sum + i;
    }
    println!("reassign sum : {}", sum);
}

fn rebind2(){
    let y = 0;
    println!("let y : {}", y);
    let i = 10;
    let y = y + i;
        // let y = y + 1;
    println!("letyで新しい束縛を作った結果\ny : {}", y);
}

fn reassign2(){
    let mut y = 0;
    println!("let mut y : {}", y);
    y = y + 1;
    println!("y=y+1でyを再代入した結果\ny : {}", y);
}


fn main(){
    rebind();
    reassign();
    rebind2();
    reassign2();
}
```


```
sum : 0
rebind sum : 0
sum : 0
reassign sum : 45
let y : 0
letyで新しい束縛を作った結果
y : 10
let mut y : 0
y=y+1でyを再代入した結果
y : 1
```


# 参考文献
https://employment.en-japan.com/engineerhub/entry/2017/07/10/110000

# 追記2020/03/11
> しかしfor文の中で再束縛される場合とされない場合の違いがよくわからないではある。

コメントで指摘してくださった方がいらっしゃいました。これは変数の再束縛(シャドーイング)を行ったのがスコープの中だったため、for文が終わった際にスコープを抜けるため、シャドーイングされていた値が一つ前の値に戻った(ように見える)ためなようです。

[wikipediaの可変変数の記事です。rustとpythonのコードが面白かったです](https://en.wikipedia.org/wiki/Variable_shadowing)
[WIP]Settings Syncが公式化したVSCode Ver.1.44.0を使ってみる

# 概要

`Visual Studio Code - Insiders バージョン: 1.44.0-insider` から Settings Sync が公式で導入されました。今までは`Settings Sync`という拡張機能で実現されていましたが、VSCodeの機能だけで設定の共有が可能です。ただし、`Settings Sync`の拡張機能の方とは違い、チームでVSCodeの設定を揃えるなどといったことはできません。
Settings Sync を有効にする方法を説明します。


# 環境

```
Visual Studio Code - Insiders

バージョン: 1.44.0-insider
コミット: b0791e5236f462fbb785e9a00319705607cefb9d
日付: 2020-03-10T11:17:54.705Z (18 時間前)
Electron: 7.1.11
Chrome: 78.0.3904.130
Node.js: 12.8.1
V8: 7.8.279.23-electron.0
OS: Darwin x64 19.3.0
```

# Settings Sync の有効化

[Settings Sync in Visual Studio Code](https://code.visualstudio.com/docs/editor/settings-sync#_enabling-settings-sync) を参考に設定していきます。

1. 左下の歯車から「同期をオンにする...」をクリック

<img width="638" alt="スクリーンショット 2020-03-11 15.03.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104942/336ef546-ad63-b933-3ca7-55b348480232.png">


2. ポップアップの「同期をオンにする」をクリック
<img width="638" alt="スクリーンショット 2020-03-11 15.03.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104942/ba1b8b50-b61a-21e0-da45-bb5013a54cc1.png">


3. 「サインインしてオンにする」をクリック
<img width="638" alt="スクリーンショット 2020-03-11 15.04.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104942/abb66824-6ff1-aa33-7410-2b11e543434a.png">

4. ブラウザが開くので、MicrosoftアカウントかGitHubアカウントでサインインします（今回はGitHub）
<img width="638" alt="スクリーンショット 2020-03-11 15.05.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104942/2186710b-55a2-43a6-6b3b-dc98c7735484.png">

5. 認可が必要なので、「Authorize Microsoft-corp」をクリック
<img width="638" alt="スクリーンショット 2020-03-11 15.06.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104942/b4e39b91-a5c3-9163-6944-8eb253650f2e.png">

6. 最後に１つ、結局Microsoftアカウントが必要らしいので、「次へ」をクリックしてアカウントを作成します
<img width="638" alt="スクリーンショット 2020-03-11 15.07.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104942/81d57b52-e034-3055-d094-50adbad748e1.png">


7. ↓の画面が出たら有効化完了です
<img width="638" alt="スクリーンショット 2020-03-11 15.07.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104942/04604d3b-63a3-966a-d9f0-c404d9b6471c.png">

8. もう一度左下の歯車を押すと同期機能を設定できます
<img width="638" alt="スクリーンショット 2020-03-11 15.08.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104942/17e670de-2883-da9e-b8aa-87ddd0298846.png">
クエリでCSVデータをテーブルに取込む方法【SQLServer】

#BULK INSERT を使用して楽に取り込む
BULK INSERT を使用することで、ウィザードを使用しなくても、CSVデータを取込むことができます。

##まずはテーブル作成

商品の複数機械部門のテーブルがあったとします。

```sql
USE WKSPACE
GO

CREATE TABLE [dbo].[商品機械部門] (
[商品コード] varchar(50),
[商品名] varchar(50),
[機械部門コード1] varchar(50),
[機械部門単価1] varchar(50),
[機械部門コード2] varchar(50),
[機械部門単価2] varchar(50),
[機械部門コード3] varchar(50),
[機械部門単価3] varchar(50),
[機械部門コード4] varchar(50),
[機械部門単価4] varchar(50),
[機械部門コード5] varchar(50),
[機械部門単価5] varchar(50)
)
```


##取込みはパスを指定するだけ
今回はCドライブのCSVデータというフォルダの中にあるCSVファイルを指定します。


```sql
BULK INSERT dbo.商品機械部門 FROM 'C:\CSVデータ\機械部門.csv'
   WITH (
      FIELDTERMINATOR = ',',
      ROWTERMINATOR = '\n',
      DATAFILETYPE = 'char'
   )
```


容量が大きいデータを扱うことがある時に便利です。
laravel新規プロジェクト立ち上げ

coposerとか入っていない状態でサーバーを立ち上げると以下のようなエラーが発生

```terminal

PHP Warning:  require(/Users/zero/test/gnm/src/vendor/autoload.php): failed to open stream: No such file or directory in /Users/zero/test/gnm/src/artisan on line 18

Warning: require(/Users/zero/test/gnm/src/vendor/autoload.php): failed to open stream: No such file or directory in /Users/zero/test/gnm/src/artisan on line 18
PHP Fatal error:  require(): Failed opening required '/Users/zero/test/gnm/src/vendor/autoload.php' (include_path='.:/usr/local/Cellar/php/7.4.3/share/php/pear') in /Users/zero/test/gnm/src/artisan on line 18

Fatal error: require(): Failed opening required '/Users/zero/test/gnm/src/vendor/autoload.php' (include_path='.:/usr/local/Cellar/php/7.4.3/share/php/pear') in /Users/zero/test/gnm/src/artisan on line 18
```

なのでlocalで初期のセットをしましょうと。

# サーバースタートまで

```terminal
composer run/composerを実行するために下記を実行
composer update
```

# サーバーは立ち上がるが500エラーになる

```
create keyを生成しよう
php artisan key:generate
```

次のエラーが吐かれた

```teminal 
  ErrorException 

  file_get_contents(/Users/zero/test/gnm/src/.env): failed to open stream: No such file or directory

  at vendor/laravel/framework/src/Illuminate/Foundation/Console/KeyGenerateCommand.php:96
     92|     {
     93|         file_put_contents($this->laravel->environmentFilePath(), preg_replace(
     94|             $this->keyReplacementPattern(),
     95|             'APP_KEY='.$key,
  >  96|             file_get_contents($this->laravel->environmentFilePath())
     97|         ));
     98|     }
     99| 
    100|     /**

      +17 vendor frames 
  18  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
```

#  create your own .env file / .envファイルを作る

```
cp .env.example .env.local
```

*　.env.local is generally included in the .gitignore / .gitignoreファイルに.env.localが基本的に含まれている

# Create your database, and put the login information in the .env.local file / データベースを作成し、ログイン情報を.env.localファイルに入れる

Copy your .env.local file to .env / .env.local ファイルを .env ファイルにコピーする

```
cp .env.local .env
```

# npm run devのエラーについて

pagage.jsonのseript内のパスを変えてあげる
[参考:laravelでnpm run devを実行すると「cross-env: not found」というエラーが出る件対応したった](https://qiita.com/Yorinton/items/fd9dae33c6748abcdfbc)
[こちらのパスも参考](https://github.com/JeffreyWay/laravel-mix/issues/478)

その次に

```
Error: Specified Tailwind config file "/Users/zero/test/gnm/src/tailwind.js" doesn't exist.
```

というエラーが発生するので、これを解消してあげるにはtailswind_config.jsをrenameしてあげる
[参考:Error: Specified Tailwind config file "...\tailwind.js" doesn't exist.](https://github.com/JeffreyWay/laravel-mix-tailwind/issues/19)
Vue.js＋Webpackで作ったプロジェクトをGitHub Pagesのサブディレクトリでの公開時PublicPath設定について

##はじめに
Vue.js＋Webpackで作ったプロジェクトをそのままBuildして、GitHub Pagesへサブディレクトリとしてデプロイしました。
   - 開発環境(Local)　⇒https://localhost:8080/
   - 本番環境(GitHub Pages)　⇒https://\<username\>.github.io/\<repository\>/
GitHub PagesのURLにアクセスしたところ、imgタグの画像とCSSに定義した画像パスが404エラーとなって、5時間もはまってしまったので、解決するまでのメモを残しておきたいと思います。

##GitHub Pagesに公開するために設定すべきところ
####1.コンフィグファイルのパス
```Javascript:config/vue.config.js
  module.exports = {
  build: {
    index: path.resolve(__dirname, '../docs/index.html'),
    assetsRoot: path.resolve(__dirname, '../docs'),
    assetsSubDirectory: 'static',
    assetsPublicPath: '/<repository>/',
    productionSourceMap: true,
    productionGzip: false,
    productionGzipExtensions: ['js', 'css'],
    bundleAnalyzerReport: process.env.npm_config_report
  }
```
   **index**
     GitHub Pagesは「docs」配下のindex.htmlを探しに行くので、デフォルトの「dist」を「docs」に修正する。

   **assetsRoot**
     ビルドファイルの出力先をデフォルトの「dist」から「docs」に修正する。

   **assetsPublicPath(ハマり箇所1)**
     デフォルト値　⇒　assetsPublicPath: '/'
     設定すべき値　⇒　assetsPublicPath: '/\<repository\>/'
　　　
     デフォルト値のままの場合、ドメイン直下(https://\<username\>.github.io/)に assets がある体のコードが出力されてしまい、画像ファイルなどを読み込めないためリポジトリ名を設定する。

####2.Vueルータ
```Javascript:src/router.js
  export default new Router({
  mode: 'history',
  base: '/<repository>/',
  routes: [
    {
      path: '/',
      name: 'Top',
      component: Top
    },
    {
      path: '/about',
      name: 'About',
      component: About
    },
    {
      path: '*',
      name: 'Not Found',
      component: PageNotFound,
      title: 'Not Found'
    }
  ]
})
```
   **baseオプション**
     baseオプションのを追加する。追加しないと画面遷移がおかしくなるため。(ハマり箇所2)

####3.そのほか
「window.location.host」を使用したところがあれば注意してください。Local開発環境の動きと違うため(「<username>.github.io」まで取得)。
お世話になったperlモジュール

# 一覧

|モジュール名|内容|
|:----------|:---|
|strict|構文チェック。必須|
|warnings|警告表示。必須|
|lib|モジュール検索パスの追加|
|Config::Simple|設定ファイル|
|Data::Dumper|変数出力。デリファレンスしなくていいので楽|
|List::Util|配列操作|
|Benchmark|ベンチマーク|
|Parallel::ForkManager|子プロセス生成、制御|
|File::Basename|ファイル取得|
|Text::CSV_XC|csvファイル操作|
|Time::Piece|日時取得、計算|
|Time::Local|エポック秒に変換|
|Encode|文字コード変換|
|Geo::OGC::Geometry|Geometry変換|
|CGI|CGIモジュール|
|HTML::Template|HTMLテンプレート|
[fulutter] unfortunately has stopped の対処法

# 対処法
まずエラー箇所を` flutter run --enable-software-rendering`で調べて、あとはWARNINGを解決すればよし。

```terminal:例
> flutter run --enable-software-rendering
WARNING: linker: libdvm.so has text relocations. This is wasting memory and is a security risk. Please fix.
```
講義で書いたPythonのコードをまとめてみた　その2

# はじめに
今回もPythonで解いていきます。
書くことないので早速ゴー。

## 問題とコード

ゲームでよくあるガチャについて考える。
このガチャは引くたびに1/nで当たりが出るものとする(nは与えられた自然数)。
k回引いた場合に、少なくとも1回は当たりが出る確率はいくらだろうか。
N君はこれを以下のように考えた。
「k回全てが外れである確率が
$$
(\frac{n-1}{n})^k
$$
だから、少なくとも1回は当たりがでる確率Pkは

$$
P_k = 1 - (\frac{n - 1}{n})^k
$$
である。x = 1/nとおくと、

$$
P_k = 1 - (1 - x)^k
$$

となる。xは小さいのでテイラー展開を使って以下のように概算できる。

$$
P_k = 1 - (1-x)^k 
    \approx 1 - (1 - kx)
    = kx
    \approx \frac{k}{n}
$$

ここでk = nとおくと、
$$
P_k \approx 1
$$
となる。これは「確率(1/n)のがちゃをn回引くと、1回くらいは当たりがでる」という意味なので納得できる。」

問.k = 0,1,2,3・・・に対して、Pkの正しい値を計算しグラフを描きなさい。
また、Pk > 0.999を満たす最小のkを見つけなさい。
今回はn = 100とします。

```python
import numpy as np
import matplotlib.pyplot as plt

def graph(n = 100):              #n = 100とする。           
    for k in range(1000):        #1000回回す。 
        P = 1 - ((n-1)/n)**k
        P = round(P, 7)            
        print('P' + str(k) + '=' + str(P))
        if P > 0.999:
            print(str(k) + '回目に0.999を超えました。\nP_k > 0.999を満たす最小のkは、k = '+ str(k))
            break
        
#グラフの設定    
        plt.xlim(0, 1000)
        plt.ylim(0, 2.00)
        plt.plot(k, P, marker = ('.'))      
        
if __name__ == "__main__":
    graph()     #graph()関数を呼び出す。
```
実行結果は以下のツイートから確認できます。
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/Python%E3%81%8A%E5%8B%89%E5%BC%B7%E6%97%A5%E8%A8%98?src=hash&amp;ref_src=twsrc%5Etfw">#Pythonお勉強日記</a><br>修正後 <a href="https://t.co/qlcKKVe5Jw">pic.twitter.com/qlcKKVe5Jw</a></p>&mdash; マイティ・ニラ (@NILAgasukiyanen) <a href="https://twitter.com/NILAgasukiyanen/status/1237645510946635776?ref_src=twsrc%5Etfw">March 11, 2020</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>




##さいごに
今回は1問だけまとめました。
この問題に関してはあってる自信がありません...。
あとQiitaの記事を参考にして私のプログラム実行動画のツイートも載せました。
実行結果はスクショでも撮って載せるしかないんですかね？
またぼちぼちまとめていきます。


##参考文献
簡潔でわかりやすかったです。
[Qiitaに動画を埋め込む方法](https://qiita.com/akameco/items/6ff78b0918e96f871f57)
Vue.jsのPropsにTypescriptの型を定義する

Vue.jsのPropsでは限られた型定義が以下のように行える。
（※実際には型定義ではなくバリデーション）

```js
props: {
  value1: {
    type: Array
  }
}
```
※[プロパティのバリデーション](https://jp.vuejs.org/v2/guide/components-props.html#プロパティのバリデーション)
`Array`の内容までチェックする際は独自のvalidateを定義する必要があるが本稿では割愛（ドキュメント見てください）

## TypeScriptの型定義を適用する
```ts
interface PropValue {
  hoge: string
  fuga?: boolean
}
// 中略
props: {
  value1: {
    type: Array as () => PropValue[],
    default: () => []
  }
}
```
これで`value1`が`PropValue`の配列であることが定義できます。

### Veturで補完される

Veturを導入していればちゃんと補完されます。
<img width="578" alt="スクリーンショット 2020-03-11 15.20.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89213/abe8252b-e5b2-c46b-c7fc-ae55ce8e5e30.png">

もちろん型定義も見れます。
<img width="414" alt="スクリーンショット 2020-03-11 15.21.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89213/27dd797c-3c40-4e54-449b-0e0ca93384f6.png">

## 追記 PropTypeを使う

```ts
import { PropType } from '@vue/composition-api'

// 中略
props: {
  value1: {
    type: Array as PropType<PropValue[]>,
    default: () => []
  }
}
```

ちゃんとComposition APIに用意されている
データ指向なんもわからん！（③JobSystemとBurst Compiler編）

[前回の記事](https://qiita.com/hayu500ml/items/741dae0408401ffe401c)の続きです。

さて、Unityでデータ指向をあつかうにはDOTSというものを使えばいいそうですね。
DOTSとはなんぞやを調べてるうちに**JobSystemとBurst Compiler**とはなんぞやっていう壁が先に待ってました。
調べよう。

# JobSystem
>Unity C# Job System を使用すると、ゲームパフォーマンスを向上させるために、Unity エンジンと相互作用する簡単で安全なマルチスレッドコードを作成できます。
>（Unity公式ドキュメントより）

Unityで並列処理を可能にしたよ、ということらしいです。

あれ？今までは違ったの？と思っちゃったんですが、テラシュールブログさんが解説してくださってました。
[【Unity】C# Job Systemを自分なりに解説してみる - テラシュールブログ](http://tsubakit1.hateblo.jp/entry/2018/03/04/223804)

わたしが勘違いしてたのは、非同期処理のことでした。

###そもそも並列処理って？
並列処理は、複数のタスクを順序や実行タイミングを把握せずに、一気に実行する方法です。

たとえば、6msかかるタスクが4つあったとして、その処理を順番に１つのコアが行うと
6[ms] x 4 = 24[ms]　かかる計算となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311402/b29585fd-21c2-5b84-a3e5-6c59cab902f6.png)


先ほどの処理を、４つのコアで担うとどうなるでしょう。
１つのコアで行われるタスク処理の時間は
6[ms] x 1 = 6[ms]　で、それが並列に４つ動くので、合計6msしかかからないですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311402/4d01fbbe-39c0-320b-0212-9f3a2259a66b.png)


###じゃあ非同期処理って？

非同期処理も複数のスレッドが同時に処理を行うのですが、非同期処理の役割は
入力待ちを最小限にすることです。

通信やファイル読み込みなど、処理に時間がかかるタスクがあるとします。
このタスクを行っている間、CUP1は他の入力を受け付けることが出来ません。


非同期処理はこのタスクを別スレッドに渡して、CPU1が即座に他入力に反応できる状態を作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311402/03215cae-46b4-1afc-5785-e61ebe9752c1.png)

###つまり

並列処理を使うと、空いたリソースを利用して処理をより早くできるメリットがあるわけですね。

#Burst Compiler

C# Job Systemは、Burst Compiler向けに最適化されてるコンパイラです。高速なコードを吐き出してくれるらしい。
バーストコンパイラ・・・！なんだか強そうですね。調べよう。
ちなみにこちらはUnityでのコンパイルの仕組みの図。
今回のBurst Compilerが1番右のやつですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311402/361689a6-515f-2a94-9c29-e573f3f1acad.png)

#Burst Compilerはなぜ早い？

#### LLVMの最適化が効くから

>LLVMとは、コンパイル時、リンク時、実行時などあらゆる時点でプログラムを最適化するよう設計された、任意のプログラミング言語に対応可能なコンパイラ基盤である

Burst Compilerのすごいところは、ILをCPUに合わせてCPU演算向け最適化を行ったアセンブラを吐いてくれることにあります。
あらかじめ最適化されたアセンブラを実行することになるので、実行時のパフォーマンスがあがります。

#### SIMDを使うから

>SIMDとは、コンピュータやマイクロプロセッサで並列処理を行なうための設計様式の一つで、一つの命令を同時に複数のデータに適用し、並列に処理する方式。 そのような処理方式をベクトル演算、ベクトル処理などと呼ぶことがある。

最近のCPUには1つの命令で複数のデータを同時に計算する命令群が備わっているらしい。
つまり、1命令で4つのfloatの足し算や掛け算を1度に行うことが出来る。

#### メモリエイリアスを考慮するから

どうやら**エイリアス問題**といったものが起きたときに、ちゃんとエラーをはいてくれるらしい。
エイリアス問題については、調べてもよくわからなかった。。。おしえて...えらい人...


#Burst Compilerの制約

そんなBurst Compilerですが、いくつか制約があります。

#### C# Job Systemでしか使えない

先ほど書いた通り
>C# Job Systemは、Burst Compiler向けに最適化されてるコンパイラです。

言い換えると、Burst CompilerはC# Job System専用のコンパイラというわけです。

#### クラスが使えない

GCを避けるため、マネージドヒープを使う参照型が使えません。

- 使える
   - 構造体
   - NativeArray
   - NativeString
- 使えない
   - クラス
   - 配列
   - 文字列 

#### 例外処理が使えない

- 使える
   - throw
- 使えない
   - try
   - catch
   - finally

# JobSystemとBurst Compiler
JobSystem専用であったり、制約を設けることで、C++と同等の高速化を実現できてるらしい！
これが次回の記事で使おうと思ってるDOTSで威力を発揮するらしいよ！

参照
https://learning.unity3d.jp/3973/
http://i-saint.hatenablog.com/entry/2015/05/26/212441
twitterシェアボタン　テキスト改行方法

改行箇所に`%5Etfw`を入れる。

```html
// qiitaのtwitterシェアボタンを真似ました。
<a class="twitter-share-button"
        href="https://twitter.com/share?ref_src=twsrc%5Etfw"
        data-size="large"
        data-text="Twitterシェアボタンの設置&#010;"
        data-url="https://qiita.com/york_____nishi/items/4230d28086c5913622bd"
        data-hashtags="Qiita">  
        Tweet
</a>
```
bladeファイル内で画像リンクに変数を使いたい

bladeファイル内の画像リンクにassetを使用した時のデータベースからテキストを引用する書き方

```ruby:index.blade.php
<img src="{{ asset('image/' . $変数名->DBのカラム名) }}" alt="">
```

'　の外に出して、結合演算子 . で繋げる
個人用メモ
Railsで作ったアプリをAWSでデプロイ②　〜EC2インスタンス〜

前回の続きです
Railsで作ったアプリをAWSでデプロイ①　〜アカウント作成編〜
https://qiita.com/shunsuke284052/items/39bf73d1996251083c72

今回はEC2インスタンスを作っていきます
EC2インスタンスとはAmazonが提供しているLinuxが組み込まれた「仮想マシン」です

まずはアカウント作りたてなのでリージョンを設定します
ログイン画面の右上です
Amazonの最寄りのサーバを選びます

<img width="1440" alt="スクリーンショット 2020-03-11 14.49.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/67366369-b03c-5600-8e0a-d0ae022e5434.png">

次にEC2インスタンスを作成します
同画面左上「サービス」→「検索バーでEC2と検索」→「左サイドバーからインスタンスを選択」でこの画面になるので、
「インスタンスを作成」をクリック
<img width="1440" alt="スクリーンショット 2020-03-11 14.54.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/806cbd45-0e8a-7347-cd78-93e50d76e679.png">

この「インスタンスを作成」の流れは「AMIの選択」→「EC2インスタンスのタイプ選択」→「キーペアをダウンロード」です

まずはAMIの選択
AMIにはAmazonが用意している事前にLinuxなどのOSやWebサーバが事前にインストールされている物があり、
ここでは「Amazon Linux AMI」というAmazonがある程度カスタムしているAMIを使います

<img width="1440" alt="スクリーンショット 2020-03-11 15.00.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/ae033151-6485-7ee6-ca9b-b84cfff330f6.png">

「EC2インスタンスのタイプ」は「t2.micro」を選択します
<img width="1440" alt="スクリーンショット 2020-03-11 15.03.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/6ae2de0b-4f27-acfd-4b6b-7704784f6216.png">

そしたらこんな画面に遷移しますので「起動」をクリックしてください
<img width="1440" alt="スクリーンショット 2020-03-11 15.04.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/5a84171e-2802-8bb5-67af-fda1c48fb89b.png">

キーペアのダウンロードを行います
「新しいキーペアの作成」してご自身の好きな名前をつけて保存してください
<img width="1440" alt="スクリーンショット 2020-03-11 15.06.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/85da79a7-e29f-375a-51a0-62dfeef5e5bc.png">

これでEC2インスタンス作成ができました
この次は「Elastic IPアドレス」、「ポートの開放」、「EC2インスタンスへのログイン」を行います

ありがとうございます。
GitHub ActionsによるCIの実践

# はじめに
- 本記事は、2019年11月13日にGitHubから正式リリースされたGitHub Actionsを用いて、CIを実践する方法について、まとめたものです。
- 本記事で掲載しているGitHubの操作画面は、2020年3月11日時点のものになります。

# CIとは
- 継続的インテグレーション(Continuous Integration)の略称です。
- インテグレーションとは、各人が作成した製作物を1か所に集め、ビルドとテストを行うプロセスのことです。
- 継続的インテグレーションとは、「<font color="red"><b>定期的・自動的</b></font>」にインテグレーションを行う仕組みのことを指します。

【インテグレーションの要素】
1. すべてのソースコードを1か所に集める。
2. ビルドを行う。
3. テストを実行する。

# GitHub Actionsとは
- GitHubのイベント(プッシュ、プルリクエストなど)をトリガーとして、ソフトウェア開発のワークフローを自動化する機能。
- ワークフローとは、GitHubに任意のコードプロジェクトをビルド、テスト、パッケージ、リリース、またはデプロイするためにGitリポジトリーで設定できる、カスタムの自動プロセスです。
- GitHub Actionsを利用することで、<font color="red"><b>GitHub上のソースコードに対するCIを実現</b></font>できます。

# GitHub Actionsの役割
インテグレーションの要素から見ると、
1. すべてのソースコードを1か所に集める。
　　　⇒ GitHub上のGitリポジトリーで管理されている。
2. ビルドを行う。
3. テストを実行する。
　　　⇒<font color="red"><b>2と3について、GitHub Actionで行えるようになった。</b></font>

# GitHub ActionsでCIを行う手順
1. テストケースの作成。
2. (必要であれば)テストで必要なライブラリの設定をビルドツールに追加。
3. テストケース等をGitリポジトリーに登録。
4. Gitリポジトリー上にワークフローを記述するファイル(YAML形式)を作成。<br>
　　　⇒ <font color="red"><b>テストケースを呼び出す処理(コマンド)を記述する。</b></font>

以降、ワークフローで指定したイベントが発生すると、自動的にCIが行われます。

# ワークフローの作成方法
1. GitHub上のリポジトリーのActionタブからワークフローを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/6ce47d1b-b2b2-c045-d53a-ac013284825d.png)

2. メジャーな言語、環境、サーバー等のテンプレートが用意されているので、利用するテンプレートを選択する。<br>テンプレートを選択せずに、自分で作成することもできます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/2f4c17d5-8506-ed1f-ea48-96991ae949fa.png)


3. 指定したテンプレートのワークフローが作成されるので、ファイル名、処理を記述する。<br>※「Gitリポジトリー/.github/workflows」の下に作成します。<br>※ワークフローの構成、構文については、後ほど説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/f19e78e4-d140-eeec-7f95-390658f3f865.png)

4. ワークフローの処理を記述したら、コミットを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/39fcd379-e441-1031-3b83-b9ca9c8aefac.png)

5. コミットが完了すると、ワークフローの初回実行が行われます。<br>以降、ワークフローで指定したイベントが発生するごとに、ワークフローが実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/6b699b7c-b8d0-48b2-bd41-ba09c296b62f.png)

# ワークフローの構成
ワークフローは以下の構成となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/87c3448c-c0cd-9c27-8a74-6d655da0c359.png)


# ワークフローの構文
- Java with Mavenのテンプレートを例に、ワークフローの構文を説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531245/e5a34e5a-b9d7-afa2-2c3d-f4d2cf08973b.png)

# 参考資料
GitHub Actions公式ドキュメント
https://help.github.com/ja/actions
rbenvのrubyコマンドがすべて「invalid option -: (-h will show valid options) (RuntimeError)」それRUBYOPTが原因かも

# はじめに
- Rubymin+rbenv+ruby2.7の環境で使っていた
- ruby2.6.3にスイッチして作業しようとしたらRubymineで **「No Rails found in SDK」** エラーがでるようになった
- Rubymineの設定を探っていたが、`ruby -v` が失敗していることに気付く
- 別のバージョンなら？ `2.6.5`, `2.5.7`をインストールしたがすべてNG
- `2.7.0`に戻すと正常に動作する

# エラー内容

```console
$ ruby -v
Traceback (most recent call last):
/Users/ueki/.rbenv/versions/2.6.4/bin/ruby: invalid option -:  (-h will show valid options) (RuntimeError)
```


# 結論

- `.bashrc`に書いている`RUBYOPT`を削除しよう
- [Switching back to ruby 2\.6 after installing / using 2\.7 \- strange ruby errors · Issue \#154 · asdf\-vm/asdf\-ruby](https://github.com/asdf-vm/asdf-ruby/issues/154)

## RUBYOPTを削除する

```:bashなら
unset RUBYOPT
```

```:fish_shellなら
set - e RUBYOPT
```

# 原因

Ruby 2.7の警告を抑制するために、.bashrc (.zshrc / config.fish)に`RUBYOPT`を設定していたことが原因でした。

```:.bashrc
export RUBYOPT='-W:no-deprecated -W:no-experimental'
```

# おわりに
しらべているときは「macOS Catalinaのせいだ、rbenvのせいだ。」:rage: 解決してみれば自分で設定した環境変数のせいだったという…:sweat_smile:

## 「エラーメッセージまるごと検索」に救われた
解決にいたった[Switching back to ruby 2\.6 after installing / using 2\.7 \- strange ruby errors · Issue \#154 · asdf\-vm/asdf\-ruby](https://github.com/asdf-vm/asdf-ruby/issues/154)にたどり着けたのは、**エラーメッセージをまるごと貼り付けて検索した** からでした。


**決め手の検索キーワード**
「`"invalid option -: (-h will show valid options) "`」


このとき、ダブルクォーテーションで囲んでおくのが大事です！（囲まないと文字列の`-`や半角スペースが検索のクエリとして扱われてしまうためです）

※ちなみに Windows10 + WSL2の環境でもおなじことをしていたので再現しました。
The Julia Language 初めて見た

#きっかけ
最近、MITのopen course ware(https://ocw.mit.edu/index.htm) の授業を受けていて、MATLABのテキストにコード付属など様々な方面でいろいろな言語を使っており、そこでRust, python, C++などをやってる身としては、MITで開発された言語ならやってみるしかないと思いまして、初めてみました。あ、ちなみにRuby, Rを触ったことはありますが、ほぼ初心者です。笑

始めてからの1時間もたたずに開発環境の整えたりとかの状態のことなので不足なこともありますので、間違っていたら、ご指摘くださるとうれしいです。

ちなみにドキュメンテーションは以下のURLに。
https://docs.julialang.org/en/v1/
https://hshindo.github.io/julia-doc-ja-v0.6/index.html

#Juliaのいいとこ
Ruby, C, Matlabのような計算速度の速さとダイナミクスを兼ね備えたうえで、Python, Rのような言語のいいところをとっているようなもの。Rustより簡単(?)
ちなみにPythonより速度は速いらしい。僕はまだその域に達していませんが。

#Juliaのインストール
1．The Julia Programming Languageのページオープン(URL: https://julialang.org/)
2．ダウンロードページへ(URL: https://julialang.org/downloads/)
3．Current stable release: v1.x.x の自分のPCに応じたものを選んでインストール。
(3/11/2020時点では、v1.3.1でした。)
4．インストールしたら、セットアップなどしてREPLの表示。

この時点で対話型でのJuliaを扱うことができます。しかし、対話型のものは非常に扱いづらい。
他の言語でも、CMDとかanaconda使ってたりなどはあまりいないと思う。。。

#開発環境を整える
自分はPythonを扱うことが多いのでJupyterNotebookを使うことにします。
Jupyter NotebookのURL。インストールしてない人などはほかのページを参照ください。
https://jupyter.org/

以下の記事を参考までに。
今さら聞けない Jupyter notebook 　 by Kentaro SUZUKI @szk3
https://qiita.com/szk3/items/920fd3e905ed16469780
(勝手にですが…)


REPL上で下記のことを行う。
一応、REPLはJuliaを開いた状態のところ。

```
julia> import Pkg
(v1.3) pkg> add IJulia
(v1.3) pkg> build IJulia

//BackSpaceでPackage ver.に戻る。
julia> using IJulia
julia> notebook()
install Jupyter via Conda, y/n? [y]: y

//ここでJupyterNotebookが起動。
```

ここから任意のアドレスで、プログラムのページ開くときに、言語選択においてJuliaが選択できるはず。
そこで。

```julia
println("Hello, world!")
```
と打てば、

```terminal
Hello, world!
```

と表示される。


ほんとに初期の初期なので、ちょっと雑な部分もありますが、開発環境はどの言語においてもわからないことも多いと思うのでなるべく簡潔に書いてみました。僕の周りでやっている人がいないので、ぜひだれかこれをきっかけに一緒に始めてもらえると嬉しいです。僕も今日から勉強します笑

ご指摘などございましたら、コメントで教えていただけるうれしいです。
加速度から計測震度を計算してみる

ふと気象庁が発表している震度を計算したくなったので、最近よく使うtypescriptで実装しようと思います。

###前提###
この記事ではある程度プログラムができそこそこ地震観測に詳しい人向けです。

###計算方法###
気象庁の震度は、1分長の3成分加速度情報をフーリエ演算して各成分ごとにフィルターを掛け合わせてからの逆フーリエ演算、その後各成分を合成し3成分合成加速度の絶対値がちょうど0.3秒になる値から震度算出と、文字に起こすとややこしいものになっています。
※リアルタイム震度を出すときはおおむね3秒長のデータを使用しているようです。

###実装###
今回、FFT(高速フーリエ演算)のライブラリは[fft-js](https://www.npmjs.com/package/fft-js)を使うことにします。
データは[気象庁強震観測データ](https://www.data.jma.go.jp/svd/eqev/data/kyoshin/jishin/index.html)を利用します。

2011/03/11 14:46:18に発生した地震で、大崎市古川三日町の観測所のデータを使います。
110311_4B9.json に3成分加速度情報を2次元配列にしてJSON形式で保存します。
※上下、東西、北南の順番はどの順番でもいいです。
※データは3分長ですが計算結果に影響はほぼないので大丈夫。

```typescript
import { fft, ifft } from 'fft-js';
import gals from './110311_4B9.json';
```

加速度をFFTに通すために、2のべき乗個にしなくてはいけないので、2のべき乗個になるように後ろに0を追加していき、その後FFT関数を実行します。

```typescript
const fftGals: [number, number][][] = gals.map(gal => fft(arrayPadding(gal)));

function arrayPadding(arr: number[]) {
    let dips = 2;

    while (dips <= arr.length) {
        dips *= 2;
    }

  return arr.concat(new Array(dips - arr.length).fill(0));
}
```

次に地震波の周期による影響を補正するフィルターを各成分ごとにかけます。

```typescript
// サンプリング間隔(seconds)
const dt = 0.01;

const NF = fftGals[0].length;
const NF2 = NF / 2;

for (let i = 1; i <= NF2; i++) {
    // 周波数
    const frq = i / (NF * dt);

    const x = frq / 10;
    const fc = Math.sqrt(1 / frq);
    const fh =
        1 /
        Math.sqrt(
            1 +
            0.694 * x ** 2 +
            0.241 * x ** 4 +
            0.0557 * x ** 6 +
            0.009664 * x ** 8 +
            0.00134 * x ** 10 +
            0.000155 * x ** 12
        );
    const fl = (1 - Math.exp((-(frq / 0.5)) ** 3)) ** 0.5;
    const fa = fc * fh * fl;

    // 計算回数を抑える
    for (let lk = 0; lk < fftGals.length; lk++) {
        const fs: [number, number] = [fftGals[lk][i][0] * fa, fftGals[lk][i][1] * fa];

        fftGals[lk][i] = fs;
        fftGals[lk][NF - i] = [fs[0], -fs[1]];
    }
}
```

フィルターを通したらIFFT（逆フーリエ変換）をして3成分合成加速度を得ます。

```typescript
const filterGals = fftGals.map(fftGal => ifft(fftGal));

const lenGals: number[][] = [];

filterGals.forEach((gal, i) => {
    gal.forEach(([gas], t) => {
        (lenGals[t] || (lenGals[t] = [])).push(gas);
    });
});

// 各成分を合成
const syntheticGal: number[] = lenGals.map(([s1, s2, s3]) => Math.sqrt(s1 ** 2 + s2 ** 2 + s3 ** 2));
```

合成加速度を得たら震度を算出していきます。

```typescript
// 合成加速度を降順に直す。
syntheticGal.sort((a, b) => b - a);

// 合成加速度上位0.3秒目のindex値を得る。
const top03 = Math.floor(0.3 / dt) - 1;

// 震度計算
const int = 2 * (Math.log(syntheticGal[top03]) / Math.LN10) + 0.94;

// 気象庁の告示に従い計測震度に直す。
const kInt = (Math.floor(Math.round(int * 100) / 10) / 10).toFixed(1);

console.log('計測震度: ' + kInt);
// < 計測震度: 6.2
```

完成です。

***
***参考***
平成8年気象庁告示第4号
MaixduinoにM5Stackのアプリを移植してみる

# はじめに

M5Stackは使いやすく人気で、面白そうなアプリも公開されていたりする。MaixduinoもArduinoフレームワークで動作するので、M5Stackのアプリを [Sipeed MAIX Go](https://www.seeedstudio.com/Sipeed-MAix-GO-Suit-for-RISC-V-AI-IoT-p-2874.html) に簡単に移植できないかと模索してみる。

# M5Stack.h

M5Stackアプリには必須なので、M5Stack.hを移植

https://github.com/fukuen/Maixduino_M5Compat

# 使用例

MP3プレーヤーアプリの例

https://github.com/fukuen/mp3-player-m5stack

MP3プレーヤーアプリで使用しているESP8266Audioも移植

https://github.com/fukuen/ESP8266Audio

# まとめ

100%互換性というわけにはいかないが、移植作業がちょっと楽になったかな

今度、Maixduinoに入力スイッチを付けて試してみる予定。（Maixduinoにはタッチスクリーン、入力スイッチがないのでした）
データ分析する際、まずはじめのアプローチ

##はじめに

データ分析のアプローチは以下の三つに分けられる

##説明的データ分析
**事実を説明**する
###例
- どんな人が何を買っているか
- ある広告がどれだけ売り上げに貢献しているか

###手法
**クラスタリング**、アソシエーション分析

##予測的データ分析
**未来を予測**する
###例
- 株価の値はこれからどうなるか
- この人がこれから購入しそうなアイテムは何なのか

###手法
**classification**、 **回帰**、　**統計的機械学習**

##指示的データ分析
**最適解**を探す

###例
- 利益を最大化するための、最適な仕入れ量は?
- 廃棄を最小化するための、最適な仕入れ量は?

###手法
最適化、　実験計画
[PyTorch]modelとdatasetがcudaモードになっているか確認する

# はじめに
PyTorchはテンソルに対して```hoge.to(device)```などで簡単にcpuとgpuモードを切り替えられますが，よくこのデータセットやモデルがcpuかgpuなのかわからなくなったので，確認する方法を書き残しときます．

## 確認方法
前提としてデータセットとモデルの準備は

```python
IMAGE_SIZE=224
BATCH_SIZE=20
TRAIN = 'train'
DATA_DIR = 'dataset/predata/'
DEVICE = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

data_transforms = {
    TRAIN: transforms.Compose([
        transforms.Resize(IMAGE_SIZE),
        transforms.ToTensor(),
    ])
}

# データの前処理
image_datasets = {x: datasets.ImageFolder(os.path.join(DATA_DIR, x), data_transforms[x]) for x in [TRAIN]}
dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], 
                                              batch_size=BATCH_SIZE, shuffle=True, num_workers=4) for x in [TRAIN]}

```

```is_cuda``` を使えば ```bool``` 型で返ってくるので[ここ](https://discuss.pytorch.org/t/how-to-check-if-model-is-on-cuda/180/2?u=kazuki_hamaguchi)(1)を参考にして

```python
data, label = iter(dataloaders[TRAIN]).next()
data = data.to(DEVICE)
label = label.to(DEVICE)
print(data.is_cuda)
print(label.is_cuda)

model = model.to(DEVICE)
print(next(model.parameters()).is_cuda)
```
これで確認できます．

## さいごに
ローカル変数抜ける前と抜けた後だとモードってどうなるんだろうね
確認してみるのも面白いかも

## 参考資料
(1) [How to check if Model is on cuda](https://discuss.pytorch.org/t/how-to-check-if-model-is-on-cuda/180/2?u=kazuki_hamaguchi)