OmniAICreator/Qiita-1.07M huggingface dataset:
PHPで保守性高くファイルをアップロードする方法



自分のアウトプット用です。
何かありましたらバシバシ詰めてください。

inputのnameは『file』とする。

````php:qiita.php

if(isset($_FILES['file']['error'])){

try{
switch($_FILES['file']['error']){
  case UPLOAD_ERR_OK:  //OKの時だけ処理をそのまま進める
    break;
  case UPLOAD_ERR_FORM_SIZE:
    throw new RuntimeException('ファイルサイズオーバー');
      break;
  case UPLOAD_ERR_NO_FILE:
    throw new RuntimeException('ファイルがありません');
      break;
  case UPLOAD_ERR_NO_FILE:
    throw new RuntimeException('ファイルがありません');
      break;
  case UPLOAD_ERR_PARTIAL:
    throw new RuntimeException('一部しかアップロード出来ません');
      break;
}//ここまではマニュアルに載ってるのでコピペ。その他必要なエラーコードがあれば追加

$img_type = @exif_imagetype($FILES['file']['tmp_name']);
//これがあまりググっても出てこない。
//exif_imagetypeは『imagetype_jpeg』や『imagetype_png』などの定数を返す。mimeタイプを自力でチェック

//in_arrayは第一引数には検索したい値を渡し、第二引数では検索対象の配列を渡す。
//第三引数にはtrueを必ず渡す。じゃないと型まで合ってるか判断してくれない。
if(!in_array($img_type,[imagetype_jpeg,imagetype_png,imagetype_gif]),true){
    throw new RuntimeException('ファイル形式が違います');
    }
$path = 'ディレクトリ名/'.sha1_file($_FILES['tmp_name']).image_type_to_extension($img_type);
//『sha1_file』でハッシュ化。いっぱいファイル保存する場合はファイル名ダブル場合があるので。md5_fileとかでも良いかと
//image_type_to_extensionはファイルの拡張子取得。これもググってもあまり出て来てくれない。

//ここまでやれば結構良い感じ。と信じたい。
//いざファイル場所移動
   move_upload_file($_FILES['file']['tmp_name']),$path);
//パーミッション変更
   chmod($path,0644);

}catch(RuntimeException $e){
  error_log('エラーです:'.$e->getMessage());
}
}
`````
プログラミングってどれもそうですが動作にすると数秒なのに
とてつもなく長いコード書きますよね。
VPCピアリングとVPCエンドポイントの違い

## 勉強前イメージ

VPCピアリングはVPC通しを繋ぐ
VPCエンドポイントは他のサービスと繋ぐ
的な・・？

## 調査

### VPCピアリング とは

異なるVPCを接続することが出来ます。
複数のAWSのコンテンツをまとめたり、複数のAWS間で通信が行うことが出来ます。

詳細は [こちら](https://qiita.com/miyuki_samitani/items/da07166c665cd2e71672)

以下は接続イメージです。

![piaringuVPCピアリング とは - Qiita - Google Chrome 2021-03-13 13..png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/b13d617e-e14d-1ca9-4dc3-62586533b0e8.png)


### VPCエンドポイント とは

VPCと他のサービス間の通信を可能にするVPCコンポーネント(仮想デバイス)で、
VPCエンドポイントを作成することで、VPC内のインスタンスとVPC外のサービスをプライベート接続で通信できるようになります。
※種類がいくつかあります。

詳細は [こちら](https://qiita.com/miyuki_samitani/items/9d9f7a0c417cb75a6c85)

※以下は比較したイメージの図解です。
正しい記載ではないです。

![エンドポイント2021-03-13 VPCピアリングとVPCエンドポイントの違い - diagrams.net -.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/fbccbc43-afc9-efc2-760d-d4291a932115.png)


### 違い

接続できるサービスとか細かい違いを書いてるわけではないですが、
大きい違いは以下。

- VPCピアリング : VPC間のネットワーク通信をさせるもの
- VPCエンドポイント : 他のAWSサービスとプライベート接続をさせるもの


## 勉強後イメージ

VPCなんとかかんとかっていっぱいあってややこしい....
他にもプライベートリンクとかあって学び直さないといけない(忘れた)
[AtCoder]AtCoder Beginner Contest 133

# はじめに
* AtCoder Beginner Contestの過去問の解法及び提出したソースコードをまとめています。
* 基本的に自分が振り返ることを目的としておりますが、誤りや気になった点、その他質問等もお待ちしておりますので遠慮なくお願いします。

# コンテストページ
https://atcoder.jp/contests/abc133

# A問題
電車はN人xA円。タクシーは人数に関わらずB円それぞれかかるのでその２つの金額の小さい方が答えです。

```c++
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,a,b;
    cin >> n >> a >> b;
    cout << min(n*a, b) << endl;
    return 0;
}
```
# B問題
i<jを満たすの組み合わせを全探索し、条件を満たすものをカウントしていきます。
条件を満たしているかどうかの判定にはsqrt()で求まる平方根を整数にキャストしたとき少数点以下が切り捨てられることを利用し、平方根の二乗が元の数と一致するかどうかで判別しています。

```c++
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,d;
    cin >> n >> d;
    vector<vector<int>> x(n, vector<int>(d));
    for (int i = 0; i < n; i++) for (int j = 0; j < d; j++){
        cin >> x[i][j];
    }

    int ans = 0;
    for (int i = 0; i < n; i++) for (int j = i+1; j < n; j++){
        int dist = 0;
        for(int k = 0; k < d; k++){
            dist += (x[i][k] - x[j][k]) * (x[i][k] - x[j][k]);
        }
        if(dist == ((int)sqrt(dist) * (int)sqrt(dist))){
            ans++;
        }
    }

    cout << ans << endl;
    return 0;
}
```
# C問題
題意通りに全探索しようとすると計算量的に間に合いません。
以下の二通りを考えることで計算量を減らせます。
1. [l,r]に含まれる数の個数が2019個以上の場合、必ずその中に１つ以上2019で割り切れるものが存在する
2. [l,r]に含まれる数の個数が2019個未満の場合は計算が必要

```c++
#include <bits/stdc++.h>
using namespace std;
#define ll long long

int main()
{
    ll l,r;
    const ll M = 2019;
    cin >> l >> r;
    ll ans = INT32_MAX;
    if(r-l+1 >= M){
        ans = 0;
    }
    else{
        for (ll i = l; i < r; i++){
            for (ll j = i+1; j <= r; j++){
                ans = min(ans, (i*j)%M);
            }
        }
    }

    cout << ans << endl;
    return 0;
}
```
# D問題
答えとなる各山の降水量のうちどれか１つでも求まると、その両側のダムの水量から隣の山の降水量も求まります。
山1(山iをX<sub>i</sub>とする)の降水量は以下のようにして求まります。

```math
Sum = A_1 + A_2 + ... + A_N = X_1 + X_2 + ... + X_N\\
X_i + X_i+1 = 2A_i\\
```
上記二式から

```math
X_1 = Sum - (X_2 + X_3 + ... + X_N) = Sum - 2(A_2 + A_4 + ... A_{N-1})
```

※ソースコードでは0インデックスで実装してます。

```c++
#include <bits/stdc++.h>
using namespace std;
#define ll long long

int main()
{
    ll n;
    cin >> n;
    vector<ll> a(n);
    for(int i = 0; i < n; i++){
        cin >> a[i];
    }
    ll sum = accumulate(a.begin(), a.end(), 0LL);
    vector<ll> ans(n);
    ans[0] = sum;
    for(int i = 0; i < n; i++){
        if(i%2==1) ans[0] -= 2*a[i];
    }
    for(int i = 1; i < n; i++){
        ans[i] = 2 * a[i-1] - ans[i-1];
    }
    for(int i = 0; i < n; i++){
        cout << ans[i] << endl;
    }
    return 0;
}
```
# E問題(未AC)
まだ解いておりません。

# F問題(未AC)
まだ解いておりません。
CSS~ブロック要素とインライン要素~

HTMLにはブロック要素とインライン要素がありましたね👍
なにそれって方は、前の記事を参考にしてみてください😊
▶https://qiita.com/akari_0618/items/f3b6892932cb6080c905

#①display:block
実際に制作していると、ここ要素変えたいなってときがあるとします！
そのときに使えるのが、こちらのプロバティです！
インライン要素をブロック要素に変えることができるものです👍

では、実際にみていきましょう！！

```index.html
<a href="#">テスト</a>
```
```style.css
a {
  background-color: aqua;
  border-radius: 30px;
  width: 40%;
}
```

これをブラウザ上でリロードしてみましょう！
![スクリーンショット 2021-03-12 20.19.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/bfbf4c4f-f2eb-6726-7eda-14abf1a69cc6.png)

おそらくwidthが効いていないのではないでしょうか。
インライン要素は文字の数分だけしか範囲が効かなかったですね。
ではではここにdisplay:block;を足してみましょう！

```style.css
a {
  background-color: aqua;
  border-radius: 30px;
  display: block;
  width: 40%;
}
```

![スクリーンショット 2021-03-12 20.23.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/a7b3450a-08c3-d113-5823-f6d34706e444.png)

おお！変わりましたね👍
そんな感じです👌

#②display:inline;
こちらは、先程とは反対でブロック要素をインライン要素に変えます！

```index.html
<h1>今日は雨が降っています</h1>
<h2>外に出たくなかったです</h2>
```
今回もわかりやすいようにバックグラウンドカラーを足しました👍
![スクリーンショット 2021-03-13 13.31.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/e01a3e10-e024-7256-770b-5028a595d03e.png)
ブロック要素なので横幅いっぱいに並んでいて、積み木のような形になっていますね！
ではこれらを、横並びにしていきたいと思います！

では、cssに次のように記入していきましょう！

```style.css
h1 {
  background-color: blue;
  display: inline;
}

h2 {
  background-color: brown;
  display: inline;
}
```
これで、ブロック要素からインライン要素に変更することができました。

![スクリーンショット 2021-03-13 13.41.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/78ca3d4e-cff7-e308-39de-fb030aa3ea78.png)

横並びになりましたね😊
Github herokuへのpushができないエラー

#はじめに
下記のエラーが発生し,Githubへのpushができなくなりました。
同じようなエラーが発生した方の参考になればと思います。

```
＄ git push heroku master

fatal: unable to access 'https://git.heroku.com/省略.git/': error setting certificate verify locations:
  CAfile: /etc/ssl/cert.pem
  CApath: none
```

#到達点
以下の2点を達成する
・エラーの原因を調べる
・エラーの対処を学ぶ

#流れ
① エラー前に入力したコマンド
② 原因を調べる
③ cacert.pemをダウンロードする

#① エラー前に入力したコマンド
```
＄ CERT_PATH=$(ruby -ropenssl -e "puts OpenSSL::X509::DEFAULT_CERT_FILE")
＄ sudo curl "https://curl.haxx.se/ca/cacert.pem" -o $CERT_PATH
```
`CERT_PATH`は、変数
`OpenSSL::X509::DEFAULT_CERT_FILE`は、デフォルトのCA証明書ファイル名です。
"https\://curl.haxx.se/ca/cacert.pem" をCERT_PATHに出力するコマンドを行ったところ、Githubへのpushができなくなりました。

#②  原因を調べる
```
＄ ls -al /private/etc/ssl

total 24
drwxr-xr-x   6 root  wheel   192  1  1  2020 .
drwxr-xr-x  85 root  wheel  2720  2 27 10:58 ..
-rw-r--r--   1 root  wheel   299  3  6 16:46 cert.pem
drwxr-xr-x   2 root  wheel    64  1  1  2020 certs
-rw-r--r--   1 root  wheel   745  1  1  2020 openssl.cnf
-rw-r--r--   1 root  wheel  1006  1  1  2020 x509v3.cnf
```
cert.pemの存在を確認する
　

```
＄ ruby -ropenssl -e "puts OpenSSL::X509::DEFAULT_CERT_FILE"

/private/etc/ssl/cert.pem
```

ruby -ropenssl -e "puts OpenSSL::X509::DEFAULT_CERT_FILE"によって、証明書の置き場所は/etc/ssl/cert.pemと分かります。
そして、/etc/ssl/cert.pemには、"https://curl.haxx.se/ca/cacert.pem" の内容が出力されています。
 　

```
＄ cat /private/etc/ssl/cert.pem 

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://curl.se/ca/cacert.pem">here</a>.</p>
<hr>
<address>Apache Server at curl.haxx.se Port 80</address>
</body></html>
```
/etc/ssl/cert.pemには、 SSL証明書用の情報が記載されていました。
また、「301リダイレクト」の設定がされていていることがわかります。




##以上のことからわかること3点
・ruby -ropenssl -e "puts OpenSSL::X509::DEFAULT_CERT_FILE"では、/etc/ssl/cert.pemが返され、"https://curl.haxx.se/ca/cacert.pem" の内容が出力されています。

・https\://curl.haxx.se/ca/cacert.pemというURLには「301リダイレクト」の設定がされている。__これが原因だと推測します。__

・`sudo curl "https://curl.haxx.se/ca/cacert.pem"  -o $CERT_PATH`というコマンドをすると、/etc/ssl/cert.pem ファイルに、証明書情報ではなくリダイレクトの情報が返される。



#③  cacert.pemをダウンロードする

```
＄ sudo wget https://curl.se/ca/cacert.pem 
zsh: command not found: wget

＄ brew install wget
＄ sudo wget https://curl.se/ca/cacert.pem 
```
新たにhttps://curl.se/ca/cacert.pem からダウンロードすると、Githubへのpushが可能になりました。
wgetが使えない場合は、installしてください。

# 学んだこと
以下の3点を行うと問題解決する糸口が見つかることを学びました。
「エラーメッセージをしっかり理解する」
「エラーメッセージで指定されているファイルなどを調べてみる」
「理解しないまま使っているコマンドの挙動を調べてみる」

# 参考記事
[ssl証明書エラーが発生する場合の対処法](http://smootech.hatenablog.com/entry/2017/03/08/105144)
Web Vitalsとは何か

※本記事は[web.dev](https://web.dev/vitals/)を学習用にまとめたものです。解釈に齟齬等あればコメントください。

# Overview
Googleで提唱されているWebページのUXを最適化するためのガイドライン

# Core Web Vitals
UXに影響を与える重要なメトリクスとして以下３つを掲げている。
一方で、重要視されるメトリクスは日々変化するため注意が必要。
2020年執筆時点では、「**読み込み**」「**インタラクティブ性**」「**視覚的安定性**」に着目している。

### LCP (Largest Contentful Paint)
📝内容：表示領域における「最大の画像またはテキストブロック」のレンダリング時間を評価する
🎯目標値：**2.5秒以内** (75%ile）
💡目的：「ページが有効である」とユーザが知覚されるまでの読み込み速度を最適化し、ユーザを安心させるのに役立つ（あ、表示されないからこのページ見るのやめよ💢）

**最大コンテンツとされるもの**

- `<img>` 要素
- `<image>` 要素内の`<svg>`要素
- `<video>` 要素
- `url()関数`を介してロードされた背景画像を持つ要素
- テキストノードまたは他のインラインレベルのテキスト要素の子を含むブロックレベルの要素

### FIP (First Input Delay)
📝内容：ページに対してアクションを実行してから、実際にブラウザがイベントを受け付けるまでの時間を評価する
🎯目標値：**100ミリ秒以内** (75%ile）
💡目的：サイトとの応答性に対するユーザーの第一印象を測定するのに役立つ（見えてるのに操作できないとイライラする💢）

**最初の入力としてカウントされるもの、されないもの**

- ✔️ クリック
- ✔️ タップ
- ✔️ キーの押下
- ❌ スクロール
- ❌ ズーム


### CLS (Cumulative Layout Shift)
📝内容：ページの存続期間中に発生するすべてのレイアウトシフトについて、すべてのスコアの総和を評価する
🎯目標値：**0.1未満**
💡目的：いわゆる広告表示などでコンテンツの表示位置がガクッと変わる事象を評価する（間違って広告踏んで遷移するとイライラする💢）

**レイアウトシフトの計算方法**

```
layout shift score = impact fraction * distance fraction
```

- Impact fraction
	- ビューポート全体における何％くらいに影響を与えるか
- Distance fraction
	- 移動した距離がビューポートに対して何％くらいか

# Measure
改善のためには何より計測することが重要

### 本番環境での計測
RUM (RealUser Monitoring)を導入してるなら、それを使うべき
設定してないなら、無料のツールを使って計測可能

- [PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/)
- [Search Console](https://search.google.com/search-console/welcome)
- [CrUX dashboard](https://developers.google.com/web/updates/2018/08/chrome-ux-report-dashboard)

[web-vitals](https://github.com/GoogleChrome/web-vitals)というJavaScript libraryを使えば、クライアントサイドにおけるメトリクスを計測可能。
計測した内容をGoogle Analyticsなどに送信すると、データを収集して解析できる。

## 開発環境での計測
ラボデータ（合成データ）と呼ばれるものを開発時点で計測するには、以下のようなツールを活用

- [Web Vitals Chrome Extension](https://github.com/GoogleChrome/web-vitals-extension)
- [Lighthouse](https://github.com/GoogleChrome/lighthouse-ci)
- [WebPageTest](https://webpagetest.org/)

※ただし、合成データとRUMを比較すると、デバイス・ネットワーク・ロケーションなどに差があるため注意が必要


# 感想
パフォーマンスを語っているだけのことはあって、参照した https://web.dev/ は表示速度がバリ速い
それぞれの改善方法については、また別の機会に
Vue CLIプロジェクトで環境変数を使う

Vue CLIプロジェクトでは、dotenv等のパッケージを追加しなくても環境変数が使えるのですね。

ちゃんと公式にも載っていました。

https://cli.vuejs.org/guide/mode-and-env.html#modes

備忘録として、設定内容を残します。

# 環境変数を設定するファイルを作成

今回は、``.env.local``を作成し、firebaseで使う情報を記載しました。

1. プロジェクトルートに``.env.local``ファイルを作成します。
2. 環境変数を定義  

変数名は接頭辞``VUE_APP_``を付ける必要があるので注意

```
# firebaseConfig
VUE_APP_API_KEY = '文字列'
VUE_APP_AUTH_DOMAIN = '文字列'
VUE_APP_PROJECT_ID = '文字列'
VUE_APP_STORAGE_BUCKET = '文字列'
VUE_APP_MESSAGING_SENDER_ID = '文字列'
VUE_APP_APP_ID = '文字列'
VUE_APP_MEASUREMENT_ID = '文字列'
```

# アプリケーションから呼び出し

アプリケーションの該当コードで、環境変数を参照するように変更します。
``process.env.変数名``で呼び出せます。

```
    var firebaseConfig = {
      apiKey: process.env.VUE_APP_API_KEY,
      authDomain: process.env.VUE_APP_AUTH_DOMAIN,
      projectId: process.env.VUE_APP_PROJECT_ID,
      storageBucket: process.env.VUE_APP_STORAGE_BUCKET,
      messagingSenderId: process.env.VUE_APP_MESSAGING_SENDER_ID,
      appId: process.env.VUE_APP_APP_ID,
      measurementId: process.env.VUE_APP_MEASUREMENT_ID,
    };
```


# 注意
ローカルでbuildしたファイルをサーバーにアップしている場合、``.env.local``に記載した内容は、buildしたファイルに書き出されてしまいます。そのため、``.env.local``ではなく、``.env.development.local``ファイルを使う必要があります。
詳細は以下に記載しています。

https://qiita.com/okada3333/items/43bf58e188a31fde86bd#%E6%B3%A8%E6%84%8F%E7%82%B9
Azure PowerShellをインストールする

## Azure PowerShellとは

AzureのセットアップをしているとAzure PowerShellという文字をよく目にするので普通のPowerShellと何が違うのか調べてみました。
ググってみたところ、Azure用のコマンドレットのセットのことをAzure PowerShellと呼んでいるらしいです。

> Azure PowerShellは、PowerShellコマンドラインからAzureリソースを直接管理するためのコマンドレットのセットです。

## Azure PowerShellのインストール
ref. https://docs.microsoft.com/ja-jp/powershell/azure/install-az-ps?view=azps-2.8.0

ドキュメントに従いインストールします。

```powershell
if (Get-Module -Name AzureRM -ListAvailable) {
    Write-Warning -Message ('Az module not installed. Having both the AzureRM and ' +
      'Az modules installed at the same time is not supported.')
} else {
    Install-Module -Name Az -AllowClobber -Scope CurrentUser
}
```

プロンプトが表示されるので、```[A] Yes to All```を選択します。

```powershell
Untrusted repository

You are installing the modules from an untrusted repository. If you trust this repository, change
its InstallationPolicy value by running the `Set-PSRepository` cmdlet.

Are you sure you want to install the modules from 'PSGallery'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): A
```

## サインイン

インストールが終わったらAzureにサインインできるか確認してみます。

```powershell
# Connect to Azure with a browser sign in token
Connect-AzAccount
```

## Azure PowerShellのアップデート

Install-Moduleを使用してインストールした場合は、Update-Moduleを使用してアップデートする必要があるようです。
（MSIでインストールしたら、MSIでアップデートする必要があるとのこと。つまり、アップデートにはインストールしたのと同じ方法を使用しなければならない)

https://docs.microsoft.com/ja-jp/powershell/module/powershellget/update-module?view=powershell-7.1

以上
C++独習メモ

https://ezoeryou.github.io/cpp-intro/
を読んでいてなるほど！と思ったことを記録します。あくまで、自分が初めて知ったことを書いていきます。

# 小数点はsetprecision
標準では5桁しか返さない。

```C++
 cout << setprecision(20);
```
とすればよくて、テンプレに埋め込んでおけばよいだろう。

# powは小数型を返す
```C++
  double pow(double x, double y);
```
とかで、実は、int, longを返すわけでない。なので、

```C++
 int ans = 0;
 ...
 ans = max(ans, pow(val,2));
 ->
 ans = max(ans, (int)pow(val,2));
```
とかする。

# 整数リテラルはシングルクォートで区切れる
```C++
    int m = 1'000'000'000 + 7; cout<<m<<"\n"; // 1000000007
```
可読性に３つごとにクォート入れられる。便利そうだが、使うことはなさそう。

# キャストはstatic_cast<>
```C++
    int a = -100; long long b;
    b = static_cast<long long>(a);
    cout << b << "\n"; // -100
```
競技プログラミング範囲だと、推定してくれるので使わなそうだけどCだと(int)などで済ませていたので存在を知った。
クラスの変換などでは使える。尚、dynamic_castというのもある。これはクラスチェックをしてくれる。

# 浮動小数点
```C++
// 小数点を書くのが大切
// 1.0f: float, 1.0: double, 1.0L: double long
    cout << fixed << setprecision(20);
    long double ld = 1.0L/2.0L; cout <<ld<<"\n"; //0.50000000000000000000
    long double ld2 = 1/2; cout <<ld2<<"\n"; //★0.00000000000000000000
    cout << sizeof(long double) <<"\n";
```
思わず、1/2と書きそうだが、小数点を書くのがポイント。リテラル書かないとfloatというあたりも注意。
fixedは浮動小数点数を固定小数点表記でcoutするためのもの。競技プログラミングなら長い分には大抵十分そう。

# 10のn乗はe,E
```C++
    cout << 2e4 << "\n"; //20000
    cout << 1e3 << "\n";//1000
    cout << 8e-2 << "\n";//0.08
```
$a*10^b$ を示す。 Pythonだと、$a^b$がa**bなので、使い勝手が違う。Cではpowを使いましょう。
制約が$2 \cdot 10^5$等の時は`2e5`とすればいいので使いやすさはこちらの方が良さそう。

# infの定義
```C++
    cout << fixed << setprecision(20);

    cout << std::numeric_limits<long>::min() << endl; // -9223372036854775808
    cout << std::numeric_limits<long>::max() << endl; //  9223372036854775808
    cout << std::numeric_limits<long>::has_infinity << endl; // 0
    cout << std::numeric_limits<long>::infinity() << endl; //0(定義なし)

    cout << std::numeric_limits<double>::min() << endl; // 0.00000...
    cout << std::numeric_limits<double>::max() << endl; // とても大きな数
    cout << std::numeric_limits<double>::has_infinity << endl; // 1
    cout << std::numeric_limits<double>::infinity() << endl; // inf
    cout << -std::numeric_limits<double>::infinity() << endl; // -inf
```
競技プログラミングでは、整数はmin, maxをinfとして扱い、浮動小数は必要ならinfinityを使うのが良さそう。

# ラムダ式の中で相互にラムダ式を呼びたい

```C++
#include <bits/stdc++.h>
using namespace std;

int main(){
    // f1は intを返し、intを取る関数、のポインタ
    int (*f1)(int);
    // f1の型を宣言しているので、f2で先行して呼べる
    auto f2 = [&](int x) { return f1(x); };
    // ここでf2を宣言する。
    f1 = [](int x) { return x + 100; };
    cout << f2(1) << "\n"; // 101

    // 関数ポインタ的な扱いをするときはキャプチャできないので、以下はコンパイルエラーになる
    // もし、f3 = [&](int x){..}ができれば通るが、この使い方は一切キャプチャができない
    /*
    int (*f3)(int);
    int (*f4)(int);
    f3 = [](int x) { if(x==0) return 0; cout<<"f3:"<<x<<"\n"; f4(x-1); };
    f4 = [](int x) { if(x==0) return 0; cout<<"f4:"<<x<<"\n"; f3(x-1); };
    f3(3);
    */
}
```
【Vue.js】require()を使っても画像が表示されないとき

## 環境
vue 3.0.4
vue/cli 5.0.0-alpha.5
vue-loader 16.1.2

## Vue.jsでsrcにv-bindした画像が表示されない

```sample.vue
<template>
  <div>
    <img :src="imgPath" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      imgPath: "../assets/test.png"
    }
  }
}
</script>
```
## 最初に試した方法
### 画像パスにrequire()を追加する
参考：
[【Vue】v-bindで画像が表示されない時の対処法。computedで処理したプロパティで画像を表示する](https://qiita.com/yuta-38/items/b24f3e7a40cfa5be085d)
[【Vue.js】なぜかimgが表示されない時の解決法とその理由](https://greko-engineer.hateblo.jp/entry/2020/03/05/231242)

### vue.config.js に esModule: false を記述する
参考：
[Vue.js + webpackで画像表示されない](https://qiita.com/Afro0009/items/4188a9febc6532b22408)
[Vue is returning [object Module] to img src](https://stackoverflow.com/questions/61354334/vue-is-returning-object-module-to-img-src)

→自分の環境ではどちらの方法でも解消できませんでした。

## 解決方法
require("パス")<strong>.default</strong>とすると解決する

```sample.vue
<script>
export default {
  data() {
    return {
      imgPath: require("../assets/test.png").default
    }
  }
}
</script>
```

参考：
https://github.com/vuejs/vue-loader/issues/1612
こちらの25-Apr-2020に書かれているコメント

日本語の情報が無さそうだったので記事にしました。
String.prototype.replaceAll

既存の[String.prototype.replace()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace)では、正規表現の/gオプションを使わなければ、マッチした始めの1単語しか変換されませんでした。

```js
    "ippai".replace("i", "o")
    // => "oppai"
    "ippai".replace(/i/g, "o")
    // => "oppao"
```

ES2021で追加された[String.prototype.replaceAll](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll)()を使えば、正規表現を使わなくてもマッチしたすべての単語を変換することができます。

```js
    "ippai".replaceAll("i", "o")
    // => "oppao"
```
「多変数暗号アルゴリズム(量子耐性特許)」PR用メモ

この技術のusageを日々模索してます。皆さんの力が必要です！


今回はこの技術の概要を簡単に紹介する際、僕が使っている文面を共有します。もし、あなたがお知り合いの方にこの話題を提供する機会があればぜひ使ってください。


==JP.ver==


**Web3.0時代のネットワークでベースとなるべき暗号技術**


ブロックチェーンを使う事業者やユーザは、この技術によって量子コンピュータによる未来の攻撃に対し完璧にリスクフリーになる。


開発者渡邊はNISTが着目する可換アルゴリズムの利点を活かしつつ、計算困難性に依存しない非可換アルゴリズムによってNISTの目的を達成した。


すべての理論的検証を完了し、現在はこのテクノロジーを使用するパートナーを模索中。


このベース技術をサービスレベルで使いこなした方は、GAFAMを超えるでしょう。


下記ホームページでは本発明に関するPDF文書や、完全なデジタル通貨発行を想定した活用事例に関する文書を読むことができる。


>[METEORA SYSTEM Co., Ltd.](https://meteora-system.com/quantum_resistant_blockchain.html)


技術的な質問やパートナーシップのリクエスト、usageの提案を歓迎します。


何か一緒にできるといいですね。


==EN.ver==


Dear Mr. or Mrs.


We invented **“Multivariable(n≧2) algorithm of cryptography(quantum resistant)”**.


This technology is also post-zero-knowledge proof algorithm.


Implementing this makes service providers, users and networks completely risk-free against future attacks by quantum computers. For example, solve the security problems of the blockchain ecosystem (which many people haven't noticed yet). 


President of our company Mr. Watanabe achieved NIST's objectives with a non-commutative algorithm that does not depend on computational difficulty, while retaining the advantages of the commutative algorithm that NIST is discussing.


We have completed all the theoretical verifications and looking for a partner use this technology for realize a better world.


On the website below, you can read PDF documents related to this technology and documents of use cases assuming "issuance of technically complete digital currency".


>[METEORA SYSTEM Co., Ltd.](https://meteora-system.com/quantum_resistant_blockchain.html)


We welcome your technical questions and partnership requests.


King regards


==========
[Swift5] 画面遷移の実装

## 1, シンプルな画面遷移
Storyboard で Segueに Identifier を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018670/bb601c5e-4111-9b8d-bfbc-be2f4256076e.png)

```swift
// 画面遷移
performSegue(withIdentifier: "next", sender: nil)
↓
// 画面を消去して戻る場合
dismiss(animated: true, completion: nil)
```

## 画面遷移時に値を渡す
遷移先のViewControllerを segue.destination でインスタンス化してプロパティを更新する
Example: 次の画面のcount2に値を渡したい場合

```swift
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let nextVC = segue.destination as! NextViewController
        nextVC.count2 = count
}
```

## 2,Navigation Controllerで画面遷移する
- Product -> Embed -> Navigation Controller でNavigation Controllerを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018670/f45ea2af-56a0-d7b9-993d-7c33d36b1c3b.png)

- storyboard?.instantiateViewController でインスタンスをつくってnavigationController?.pushViewController で遷移させる

```swift
let nextVC = storyboard?.instantiateViewController(identifier: "next") as! NextViewController
navigationController?.pushViewController(nextVC, animated: true)
```

- storyboard? を使う時は、storyboard id を設定すること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018670/ddd57a23-110d-2469-3ff0-cc007c880f7a.png)
SVGImporterの初期設定を変更しようとしたらノリでできちゃった話

UnityではVector Graphicというパッケージをインポートすることで、SVGを画像として読み込めるようになります。
その初期設定を変更する方法を調べても出てこず、他のアセットの初期設定方法を参考にしたらうまくいったので、やり方を紹介します。

#SVGImporterの初期設定を変更する

```c#:SVGImportManager.cs
using UnityEngine;
using UnityEditor;
using Unity.VectorGraphics.Editor;

public class SVGImportManager : AssetPostprocessor
{
    void OnPreprocessAsset()
    {
        SVGImporter si = assetImporter as SVGImporter;
        if (si != null && assetPath.Contains("Textures/SVG"))
        {
            // 変更したい項目をここに書く
            si.SvgPixelsPerUnit = 50;
            si.GradientResolution = 32;
            si.SvgType = SVGType.Texture2D;
            si.TextureSize = 512;
            si.WrapMode = TextureWrapMode.Clamp;
            si.FilterMode = FilterMode.Point;
        }
    }
}
```

このようなスクリプトを`Editor/`以下に作成すればOKです。
`assetPath.Contains("Textures/SVG")`とすることで`Texture/SVG`がパスに含まれているすべてのSVGファイルにこの変更が適用されます。
フォルダごとに設定を変えたいときに便利です。

#結果

##変更前

![スクリーンショット 2021-03-13 114817.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423351/a4f37bfa-30fb-2973-c8c0-e8d25a7b12f2.png)

##変更後

![スクリーンショット 2021-03-13 120317.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423351/149a83ba-d86f-13e7-6847-bb73a82473d9.png)


#参照

- [【Unity】テクスチャーのインポート設定を自動で行う](https://qiita.com/TD12734/items/ca4308f01f6caf5d90c4)
- [UnityEditor.AssetPostprocessor - Unity スクリプトリファレンス](https://docs.unity3d.com/ja/current/ScriptReference/AssetPostprocessor.html)
PowerShellのif文は$?がTrueでもelseになる

Azure PowerShellをインストールしようとドキュメントを見ていたところ、以下のようにモジュールをインストールせよと書いてあった。

```powershell
if (Get-Module -Name AzureRM -ListAvailable) {
    Write-Warning -Message ('Az module not installed. Having both the AzureRM and ' +
      'Az modules installed at the same time is not supported.')
} else {
    Install-Module -Name Az -AllowClobber -Scope CurrentUser
}
```

PowerShell初心者なため、個々のコマンドレットを打ちながら動作を確認しようと最初の```Get-Module -Name AzureRM -ListAvialble```を直接PowerShellで実行する。

```powershell
PS C:\> Get-Module -Name AzureRM -ListAvailable
PS C:\> $?
True
```

私の環境にはAzureRMモジュールはないのでFalseになるかと思ったがTrueになった。
コマンドレット自体は正常終了しているのでTrueになるということか。(Unixのシェルの感覚だとFalseだが)

次にお試しにif文を書いたところelseになった。＄?がTrueにも関わらず！

```powershell
PS C:\> if (Get-Module -Name AzureRM -ListAvailable) { echo "true" } else { echo "false" }
false
```

おそらくコマンドレットの出力が空なのでfalseになるのだろう。
PowerShellではif文で終了コードは見ないのだろうか？
よくわからない。。。
laravel Class 'App\Http\Controllers\XXX\Controller' not foundのエラーが出る

Controller：namespaceを変更するとClass 'App\Http\Controllers\XXX\Controller' not foundのエラーが出る

use App\Http\Controllers\Controller;
を追加する必要があります。

#対応方針
```UserLoginController.php
namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller; // ←追加
use Illuminate\Http\Request;

class UserLoginController extends Controller
{
```
テキストマイニング（共起ネットワーク）の効果がわかりやすい例

　共起ネットワークというのがあって、説明によると何百次元かを使って使われている語をどーのコーの。確かに単語の書かれた円をマウスでドラッグすると「びよーん」。
 おお！ってなるけど、で、これ、だからどうなの、どうすんの？
 というわけで、テキストマイニング素人の私が大胆な発想で共起ネットワーク図がどんなに便利なものであるか、直感でわかる例を作ってみました。

　さて、学校や職場で「人権標語」を作ってこいと言われること、ありますよねえ。毎年めんどうだなあ、と思いながらしのぐのですが、そこで思いつきました。「過去の優秀とされた人権標語を集めてテキストマイニングしたらどうなるだろう」。
![人権標語の共起ネットワーク図](https://i.imgur.com/udD9xo3.png)
　つまり「人権標語によく使われる単語がその親和性をもって平面上に展開されている」わけなので、この図を見ていれば、なんとなく耳障りが良い人権標語が簡単に作れてしまう。
*  見る話す、笑顔が広げるこころの輪
*  思いやり、違う個性を守ること
*  相手の気持を考えて、出てくる一言ありがとう

意味はよくわからないのだがボツにするのも後味が悪い。そのレベルのものが量産できる。
これで今後人権標語に苦労することはなくなりそうだ。

でも、これ、それほどあっさり作れるものでもないんだよ。というのは「小学生はひらがなで書いている」のでこれを全部漢字になおさないといけない。MeCab使って単語に分けて、ひらがなは漢字に直し、助詞・助動詞はカットする、といった前処理が必要でした。  
もちろん、それ以前にどういう前処理をするとわかりやすい図ができるかという試行錯誤が必要でした。

　一方で同じデータから自己組織化マップを作っても、ここまでわかりやすくなりません。実はWord2Vecでもやってみました「過去の優秀作品の単語を入れ替える際の候補を選ぶ、くらいの役には立ってほしかった。得意不得意がある、ということでしょう。
![人権標語の自己組織化マップ](https://i.imgur.com/i02I0Hv.png)
　なお、この辺のテキストマイニング処理は[KHCoder](https://khcoder.net/)を使わせてもらってます。ありがとう。

　ちなみに「人権標語 ＆ 優秀作品」でヒットした全国の自治体のホームページから５００ほど集めてきました。これで地方別の特徴なんかがでて来ると面白いのですが「そもそも太平洋沿岸、東北は人権標語に熱心でない」程度の結果しか出てませんです。
UITest実行にCoreDataのデータをクリーンアップ

ググっているとdocumentDirectoryを削除するとか色々出てくるのですが、ファイルまで消さなくてもオブジェクトだけ簡単に削除できたら良いやと思ったので、自前で実装してみました。

# コードと解説
AppDelegateなどに、以下のコードを記述してください。

1. 万が一のことがないようにCompilation Conditionsを利用してリリースビルドでクリーンアップ処理が混入しないようにしています。
2. ProcessInfoを利用して注入された環境値を読み取って、UITestであればクリーンアップ処理を実行します

```swift
#if DEBUG
if ProcessInfo.processInfo.environment["UI_TEST"] == "1" {
    CoreDataStack.shared.cleanUp()
}
#endif
```

CoreDataを管理しているクラスなどで以下のコードを記述してください。

1. こちらも同様に#if DEBUGを利用してリリースへのデバッグコード混入を避けています。
2. 全てのエンティティに対して全データのフェッチを要求してfor文を回して削除を実行しています
3. コンテキストの保存を行なっています。

NSBatchDeleteRequestを利用しても良いのですが、UIテストの実行ではデータ件数がそれほど多くないはずなので安易にforを利用しています。

```swift
#if DEBUG
func cleanUp() {
    let viewContext = persistentContainer.viewContext
    for entity in persistentContainer.managedObjectModel.entities {
        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: entity.name!)
        let results = try! viewContext.fetch(fetchRequest)
        for result in results {
            viewContext.delete(result)
        }
    }

    if viewContext.hasChanges {
        try! viewContext.save()
    }
}

#endif
```

UITestのテストクラスで記述してください。

中段の`launchEnvironment["UI_TEST"] = "1"`で環境変数を注入しています。
テストプランやスキームに記述したlaunchEnvironmentは、テストターゲット全体での実行時には環境変数を注入してくれますが、個別に実行した場合には影響しない(*筆者の環境が変なだけかもしれません。違ったら教えてください)ので、テストクラスごとに設定しています。

```swift

class YourUITest: XCTestCase {

    private var app: XCUIApplication!

    override func setUpWithError() throws {

        continueAfterFailure = false

        app = XCUIApplication()
        app.launchEnvironment["UI_TEST"] = "1"
        app.launch()

     }
}
```
[Swift5] テキストフィールド / キーボード操作のメソッド

## 初期化
UITextFieldDelegate をViewControllerから継承する

```swift
import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    
    @IBOutlet weak var userNameTextField: UITextField!
    @IBOutlet weak var passWordTextField: UITextField!
       
    override func viewDidLoad() {
        super.viewDidLoad()
        
        userNameTextField.delegate = self
        passWordTextField.delegate = self
    }
```

## タッチでキーボードを閉じる
touchesBeganメソッド内で view.endEditing(true)する

```swift
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        view.endEditing(true)
}
```
![ezgif-2-bafa0759f409.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018670/3603efd5-3491-f437-c005-52b3ff145458.gif)

## リターンキーを押した時にキーボードを閉じる
textFieldShouldReturnメソッド内で、textField.resignFirstResponder()

```swift
//リターンキーを押したときにキーボードを閉じる
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        //キーボードが閉じるよ
        textField.resignFirstResponder()
        return true
}
```
![ezgif-2-b6f2ef47097a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018670/f9cb7cc7-9b36-b4eb-0d29-4c97ce267238.gif)
Vuex（Vue.js）のAction、Mutationに第三引数を使いたくなった時はどうする？！

こないだ業務でVuexを書いていて、Actionに第三引数を渡したくなって、ハマったので備忘録として残しておきます。


## 通常の渡し方（渡したい引数が一つ時）
```js
const id = 1
this.$stroe.dispatch('testAction', id)
```
公式リファレンスでも下記のように記載されています。



上記でいえば、idが第２引数payloadとしてActionの渡されてます。

しかし公式リファレンスでは以下のように記載があるものの、第３引数という記述はありません。
`そして、第２引数の payload があれば、それを受け取ります。`
[公式リファレンス](https://vuex.vuejs.org/ja/api/#vuex-store)
そうです。payloadには第３引数という概念はないのです。

では第３引数を渡したい時はどうすればよいのでしょうか？

## エラーとなる渡し方

```js
const id   = 1
const name = 'hoge'
this.$store.dispatch('testAction', id, name)
```
この渡し方だと第３引数を渡してしまっています。
あくまでも`payload`は第２引数として渡さなければなりません。

## 正しい渡し方
```js
const id   = 1
const name = 'hoge' 
this.$store.dispatch('testAction', { id, name })
```

そうですオブジェクトとして渡せばよいのです。
この場合Actionでどのように書けばよいかというと、

```js
testAction({ commit }, { id, name }) {
  const userId   = id
  const userName = name
  console.log(`${userId}: ${userName}`)
}
```
このように書けます。
第２引数として渡されるオブジェクトは`payload`として渡されるので、以下のように書くことも可能です。

```js
testAction( {commit}, payload) {
  const userId   = payload.id
  const userName = payload.name
  console.log(` ${userId}: ${userName}`)
}
```

ここではActionを例にしましたが、Mutationでも同じ書き方ができます。

このようにAction、Mutationで引数を複数渡したいときはオブジェクトとして渡せばOKです。

ハマりましたが勉強になりました。
Vue.js始めてみました⑤(v-if)

この度Vue.jsを学び始めました。
その勉強内容をまとめます


## v-if

条件によって表示させたり消したりするときにv-ifを使います。
以下のように`v-if`、`v-else`、`v-else-if`で条件を指定することができます。

```JavaScript:Vue.js

//条件がtrueなら表示
<タグ v-if="条件">

//複数条件によって表示を変える
<タグ v-if="条件1">条件1がtrueで表示
<タグ v-else-if="条件2">条件1がfalseで条件2がtrueなら表示
<タグ v-else>条件1、条件2どちらもfalseなら表示
```

## 使い方

```JavaScript:Vue.js

//チェックボックスのON.OFFで表示を変える

<div id="app">
  <label><input type="checkbox" v-model="select">チェック</label>
  <p v-if="select">ON</p>
  <p v-else>OFF</p>
</div>

<script>
  new Vue({
    el: '#app',
    data: {
      select: false
    }
  })
</script>
```

上記のようにすると、チェックボックスにチェックを入れるとONという表示になり、外すとOFFという表示になります。

例えば、SNSのいいねボタンのように使うのが一般的なのかな...

以上です。
【Rails6】 RSpecによるReviewのモデル単体テストの実装

#はじめに
サービスの品質を保つために必要不可欠なテストを実施しております。

今回はReviewモデル編ということで、今後他のモデルについても実施し記事にしていきたいと思います。

※レビューが何かについては以下「レビュー画面」でご確認いただけます。

#前提
・以下のgemはインストール済み

```
  gem 'rspec-rails', '~> 4.0.0'
  gem 'factory_bot_rails'
  gem 'faker'
```

・レビュー機能実装済み

#バージョン
rubyのバージョン　ruby-2.6.5
Railsのバージョン Rails:6.0.0
rspec-rails 4.0.0

#実施したテスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/a0515ade-f9af-ed7f-e91c-a0ea8d4393ac.png)

#レビュー画面
![レビュー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/b7acbdd0-286a-5a84-f0c1-02ac96d9a944.gif)

#reviewsテーブルのカラムの紹介

```xxx_create_reviews.rb
class CreateReviews < ActiveRecord::Migration[6.0]
  def change
    create_table :reviews do |t|
      t.string :content
      t.integer :score
      t.references :user,       foreign_key: true
      t.references :definition, foreign_key: true
      t.timestamps
    end
  end
end
```

#モデル内のバリデーション

```app/models/review.rb
class Review < ApplicationRecord
  belongs_to :user
  belongs_to :definition

  validates :user_id, presence: true
  validates :definition_id, presence: true
  validates :score, presence: true
  validates_uniqueness_of :definition_id, scope: :user_id
end
```

#FactoryBotの内訳

```spec/factories/reviews.rb
FactoryBot.define do
  factory :review do
    association :definition
    association :user
    content                       {Faker::Lorem.word}
    score                         {'3'}
  end
end
```

#テストコードの内容

```spec/models/review_spec.rb
require 'rails_helper'

RSpec.describe Review, type: :model do
  before do
    @review = FactoryBot.build(:review)
  end
  describe '正常値と異常値の確認' do
    context 'reviewモデルのバリデーション' do
      it "user_idとdefinition_idがあれば保存できる" do
        expect(FactoryBot.create(:definition)).to be_valid
      end

      it"スコアがなければ保存できない"do
        @review.score = nil
        @review.valid?
        expect(@review.errors[:user_id]).to include("を入力してください")
      end

      it "user_idがなければ無効な状態であること" do
        @review.user_id = nil
        @review.valid?
        expect(@review.errors[:user_id]).to include("を入力してください")
      end

      it "definition_idがなければ無効な状態であること" do
        @review.definition_id = nil
        @review.valid?
        expect(@review.errors[:definition_id]).to include("を入力してください")
      end
    end
  end

    describe "各モデルとのアソシエーション" do
    let(:association) do
      described_class.reflect_on_association(target)
    end

    context "Userモデルとのアソシエーション" do
      let(:target) { :user }

      it "Userとの関連付けはbelongs_toであること" do
        expect(association.macro).to  eq :belongs_to
      end
    end

    context "Definitionモデルとのアソシエーション" do
      let(:target) { :definition }

      it "Definitionとの関連付けはbelongs_toであること" do
        expect(association.macro).to  eq :belongs_to
      end
    end
  end

end
```

#補足説明
##テストコードの内容について
・各バリデーションに従い、正常値と異常値を確認
・アソシエーションのテスト

以上です。
【Pytorch】BatchNorm VS InstanceNorm

<h1>背景</h1>
BatchSize=1の時、BatchNormとInstanceNormは等価なので、結果が同じになるのか気になって調べてみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/b2a5e994-e9f4-6950-2e27-05b943748430.png)

<h1>調査</h1>
Pytorchでの
BatchNormのではaffine=TrueでΓとβの値がparameterとして学習されるのに対し
InstanceNormではaffine=FalseでΓ=1とβ=0と固定している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/00845acc-cdc3-8b50-0d56-56ac584cde38.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/04776800-c6e9-b12a-725a-6909a50d428a.png)

<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/4c01b1ce-4069-2fea-68bc-1e5d600394a1.png)
BatchNormよりInstanceNormの方が精度が高い
BatchNormのDefault Valueを同じに設定したらほとんど同じ結果が得られた。

<h1>結論</h1>
・BatchNormのaffine=FalseにするとInstanceNormと同じ結果が得られる
・Batch_size=1でBatchNormを使うとΓとβがノイズを持ったデータに対して学習されてしまうと考えられるので、AffineをFalseにするかInstanceNormを使うと良いかもしれない。


<h1>参考文献</h1>
BatchNorm2d
https://pytorch.org/docs/stable/generated/torch.nn.BatchNorm2d.html
InstanceNorm2d
https://pytorch.org/docs/stable/generated/torch.nn.InstanceNorm2d.html
iOSビルドでJson.NETを使おうとするとNotSupportedExceptionが出てしまう



Unity で Newtonsoft の Json.NET の dll を直接取り込んで使っていると、Windowsアプリ、Androidなどで問題がなくても、iOSビルドして実行すると NotSupportedException が発生してしまいます。解決する際に参考にした情報を基に、以下にまとめてあります。

# 対応方法
本家を folk して、PackageManager 経由で Unity に取り込めるように対応してくれているリポジトリがあります。そのリポジトリに向けた設定を Unity に入れることで、iOSビルドでもエラーが出ることなく使用できるようになります。

# 設定方法

1. PackageManager でのインストールが 2018.1 からなので、それ以上のバージョンの Unity でないと設定できません。

2. `<project>/Packages/manifest.json` に以下設定を足してください。バージョン番号はリポジトリの[タグ](https://github.com/jilleJr/Newtonsoft.Json-for-Unity/tags)を参考に最新版を設定しておくとよいかと思います。

``` json
{
  "scopedRegistries": [
    {
      "name": "Packages from jillejr",
      "url": "https://npm.cloudsmith.io/jillejr/newtonsoft-json-for-unity/",
      "scopes": ["jillejr"]
    }
  ],
  "dependencies": {
    "jillejr.newtonsoft.json-for-unity": "12.0.301",
  }
}
```

# 参考
* [Unity form](https://forum.unity.com/threads/compiling-for-ios-weird-newtonsoft-json-serialization-errors.724412/)
  * エラーが出たときにこのリポジトリを見るけることができたところ
* [jilleJr/Newtonsoft.Json-for-Unity](https://github.com/jilleJr/Newtonsoft.Json-for-Unity)
  * 設定方法を含めて、このリポジトリの一部抜粋
【Heroku】The Ruby version you are trying to install does not exist on this stack.

## Error

Rails アプリケーションを Heroku へのデプロイした際に以下のエラーが発生

```
remote:  !     The Ruby version you are trying to install does not exist on this stack.
remote:  !     
remote:  !     You are trying to install ruby-2.6.3 on heroku-20.
remote:  !     
remote:  !     Ruby ruby-2.6.3 is present on the following stacks:
remote:  !     
remote:  !     - cedar-14
remote:  !     - heroku-16
remote:  !     - heroku-18
```


# Translate

>インストールしようとしている Ruby のバージョンは、このスタックには存在しません。
>
>heroku-20 に ruby-2.6.3 をインストールしようとしています。
>
>Ruby の ruby-2.6.3 は以下のスタックに存在します。
>
>- cedar-14
>- heroku-16
>- heroku-18

現在の Heroku スタック（デプロイ環境）は「heroku-20」で使用予定の ruby-2.6.3 を使うには

- cedar-14
- heroku-16
- heroku-18

のいずれかのスタックを使用する必要があるらしい


# Resolve

Heroku のスタック（デプロイ環境）を「heroku-18」に変更して、再度 push

```
$ heroku stack:set heroku-18
$ git push heroku master
```
【Pytorch】image normalizationの効果を試してみた


<h1>背景</h1>
computer visionで入力画像をnomalizationする方法が適応されている事がしばしばある。
color nomalizationはdeep learningの学習時に効果的なのかをKITTI Datasetを用いて評価してみたい。

```
__imagenet_stats = {"mean": [0.485, 0.456, 0.406], "std": [0.229, 0.224, 0.225]}

def normalize_color(normalize=__imagenet_stats):
    t_list = [
        transforms.ToTensor(),
        transforms.Normalize(**normalize),
    ]
    return transforms.Compose(t_list)
```
before
![left.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/c48d7722-2db1-5d57-dc20-54bb73d3eeca.png)

after
![left_img_norm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/2a8a4672-e739-0873-34f1-645a2ce8cb58.png)

<h1>実験内容</h1>
KITTI2015のデータセットを用いてStereo DepthでColor Normalizationを入力画像に適応して結果がどうなるかを比較する。

<h1>結果</h1>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/6250bae2-7cc0-fcd1-b602-27a9e239c8f1.png)
Color Normalizeしないほうが精度が高かった

<h1>結論</h1>
今回はKITTI Datasetでstereo depthのアルゴリズムで比較してみたが、trainとinference共に精度が一番高くなった。
もしかしたら、他のデータに適応した時にColor Normalizationは役に立つかもしれない。
少なくてもKITTI dataset内では意味が無いことがわかった。

<h1>参考文献</h1>
PSMNet
https://github.com/JiaRenChang/PSMNet
シェルスクリプトでよく使う書き方

webアプリケーションやサーバの運用をしているとシェルスクリプトを書くことが多いです。
シェルスクリプトでよく使うコードの書き方を知っておくと良いと思いまとめました。

## ・文字列比較で部分一致を判定

```sh
#!/bin/bash

## 変数にhogeが含まれるかを調べる
FOO="fugahoge"
if [ "`echo $FOO | grep "hoge"`" ]; then
 echo "にゃーん"
fi
```

(少し難しいのでシェルスクリプト初心者の方は読み飛ばしていただいても大丈夫です)
if文は[]内のコマンドの終了ステータスが0の場合に指定した処理を実行します。

grepコマンドは入力値に指定したパターンが含まれる場合に終了ステータスが0になるため、if文での条件判定に利用できます。


## ・文字列の空文字判定

空文字の時のみ処理を実行

```sh
#!/bin/bash
FOO="hoge"
if [ -z "$FOO" ]; then
 echo "にゃーん"
fi
```

空文字でないときのみ処理を実行

```sh
#!/bin/bash
FOO="hoge"
if [ -n "$FOO" ]; then
 echo "にゃーん"
fi
```


## ・他のファイルから変数や関数を読み込む

```sh
. /usr/local/bin/hoge.txt
# または
source /usr/local/bin/hoge.txt
```

よく使うパラメータや関数を外部ファイルに定義しておき、シェルスクリプトでそれを読み込むことが結構あります。

.  [ファイル]や source [ファイル]と書くと外部ファイルに記述された変数や関数を利用することができます。
**.** でも **source** でも同じ結果が得られるのでどちらを使っても構いません

ただ、sourceの方が可読性が高いのでこちらを使うと良いと思います。


## ・ 引数の数が不正な場合、処理を中止する

```sh
# 引数が2個でなければ処理を中断
if [ "$#" != 2 ]; then
 echo "引数を2個指定してください"
 exit 1
fi
```

自分が作ったスクリプトを他の人が使う場合「引数2個のはずが間違えて1個だけで実行してめんどくさい事になっちゃった」みたいなことが起こりえます。(自分が書いたスクリプトの使い方を1か月後には忘れている、ということも)

このような面倒な事態を防ぐためには引数を適切に渡していない場合はそこで処理を中断するという仕様にしておくことが有効です。

「$#」でシェルスクリプトに渡された引数の数を判定することができます。


# ・日付を取得して変数に格納する

```sh
#!/bin/bash 
NOW_DATE=$(date +"%Y%m%d")
echo "$NOW_DATE"
20210313
```
Redux学び_1

#Redux
今回はReduxを学習しているのでアウトプットとして書いていきます。
以下のとらゼミさんの動画を見て学習しました。

https://www.youtube.com/playlist?list=PLX8Rsrpnn3IWavNOj3n4Vypzwb3q1RXhr

##Reduxとは
Reactの状態管理に適用したライブラリーです！

⇨Reduxを使う理由は、
１：stateの見通しをよくするため。
　⇨Reduxのストア（Store）を使ってstateを参照できる、変更可能点。
　**propsのバケツリレーがなくなる**これが（個人的には一番の利点かなと）
２：モジュールを疎結合にするため、機能Aと機能Bが互いに影響しあわない点。


Reduxの流れとしては、、
コンポーネント⇨Container⇨Action（Dispatch）状態変更⇨Reducer（変更管理）⇨Store（状態の管理）⇨mapStateToProps,mapDispatchToPropsでContainerへ伝える。



##Action
**Actionsの役割**
⇨アプリからStroreへデータ送るたけpayloadを渡す役割
⇨純粋にデータだけを渡すだけの役割

例 (actions.js)

```
export const SIGN_IN = 'SIGN_IN';
export const signInActions = (useState) => {
  return {
    type: "SIGN_IN",
    payload: {
      inSignedIn: true,
      uid: useState.uid,
      username: useState.username
    }
  }
}
```

##Reducers

Reducersの役割
⇨stateの変更を管理する。

**Reducerの書き方①**
１、acrionsのファイル内のモジュールを全てimport（Actionsという名前を付ける）
２、initialStateをimport

```jsx
import * as Actions from './actions';
import initialState from '../store/initialState';
```

initialStateは以下のとおり。

```
const initialState = {
  users: {
    isSignedIn: false,
    uid: "",
    username: ""
  }
}

export default initialState;
```



**Reducerの書き方２**
１、第一引数にstate、第二引数にactionがreturnした値
２、Actionsのtypeに応じて、stateをどう変更していくかを決める

```jsx
export const UserReducer = ( state =initialState.users,  action ) => {
  switch (action.type) {
    case Actions.SIGN_IN:
      return {
        ...state, //⇨初期状態（現在）のものが入ってくるのだろう。そしてaction.payloadで上書きされる。
        ...action.payload
      }
    default:
      return; state
  }
}
```

今回はここまでにします。
ありがとうございました。
Git リモートリポジトリを指定してfetchを行う

# 目的

- リモートブランチの情報をリモートローカル追跡ブランチに反映するときにリモートリポジトリを指定する方法をまとめる

# 情報

1. リモートリポジトリが複数登録されている。
    1. `$ git remote -v`を実行した時に複数のリポジトリが表示されている。
    1. リモートリポジトリが2つ登録されていたとしてリモートリポジトリ名がorigin_1とorigin_2だったとする。

# 方法

1. 下記コマンドを実行することでリモートリポジトリを指定してリモート追跡ブランチに反映する。

    ```terminal
    $ git fetch リポジトリ名
    ```

1. 例えばorigin_1のリモートリポジトリの内容をリモート追跡ブランチに反映したいときは下記コマンドを実行する。

    ```terminal
    $ git fetch origin_1
    ```
サーバーについて

今回は、サーバーについて簡単な記事を書きたいと思います。

## サーバー
サーバーには2つの意味があります。
「クライアントの要望に応じたデータを送るプログラム・ソフトウェア」という意味と
「Webサービスなどを提供するパソコン本体」意味です。
今回は後者について、学んだことを記事にしたいと思います。

## サーバーの種類
### レンタルサーバー
レンタルサーバーとは、インターネット上に情報を公開するためのサーバーを、業者からレンタルして利用するサービスのこと。
自前の設備を持たずにサーバーのサービスを利用することができ、低コストで手軽に利用できる点が最大のメリット。

### VPS
レンタルサーバーは通常、1台のパソコンを複数のユーザーで分けて使うような仕組みに対して、VPSは仮想的なパソコン環境を1人1台用意し提供する。レンタルサーバーに比べ、使用方法の自由度が高いことが特徴。

### オンプレミス
サーバーやソフトウェアなどの情報システムを、使用者が管理する設備内に物理的に設置して運用することを指す。
従来は一般的なサーバーの運用形態だった。しかし、クラウドという外部のサーバーリソースを運用する形態が普及するにつれて、従来の形態と区別するために「オンプレミス」と呼ばれるようになった。

## クラウド
クラウドとは、コンピュータ資源の利用形態を指す。
ソフトウェアやハードウェア、ストレージなどを、ネットワーク経由でユーザーにサービスとして提供しており、その資源をクラウドと呼ぶ。

## クラウドの種類
### SaaS
SaaSとは「Software as a Service」の略で、「サース」または「サーズ」と読む。
クライアント側に導入せずに、サービスを提供しているサーバーに直接アクセスをしてサービスを利用する状況を指す。

■代表例
GmailなどのWebメール
サイボウズなどのグループウェア

・PaaS
PaaSとは「Platform as a Service」の略で、「パース」と読む。
作成したアプリケーションなどを、ネットワーク上に公開するためのプラットフォームを提供するサービスのこと。

■代表例
・Heroku

### IaaS
IaaSとは「Infrastructure as a Service 」の略で、「イアース」や「アイアース」と読む。
サービスを利用するユーザーに、仮想化したCPUやメモリ、ストレージなどをインターネット経由で提供するサービスのこと。特徴としては、サービスを利用するたびに金額が発生する。

■代表例
・Microsoft Azure
・Google Compute Engine
データベース【学習記録】

■DBMS
データベース管理システム
データベースの定義、操作、制御などを行うミドルウェア

■RDB
リレーショナルデータベース
データ次第で複数の表を関係付けて扱えるので、関係データベースと言われている

RDBは表、列、行でできている
表(テーブル)
列(カラム)
行(レコード)
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1200029/2595a68d-3eb9-f0d7-8ad7-712eb4dabb6e.png)

■スキーマ
データベースの構造や仕様を定義するもの
外部スキーマ、概念スキーマ、内部スキーマの3層スキーマ構造になっている
3層に分けることでデータの独立性を高めている

・内部スキーマ
利用者の必要とするデータの見方を表現
ビュー表などがこれに該当
プログラムに加えた変更はここまでしか影響しない

・概念スキーマ
データの論理的関係を表現
表の定義はここで、いわばデータベース本体
どこにも依存せずデータ独立性が保たれている

・外部スキーマ
データの物理的関係を表現
ハードウェア的な変更はここに影響する

ビューをいじってもデータベースの格納構造は変わらないし
ハードウェアが変わってもプログラムの修正は必要ない

ビューとは
選択、射影、結合をして仮想的に作る一時的な表のこと

■主キーと外部キー
行を特定したり、表と表に関係を持たせるには
主キーや外部キーという「鍵となる情報」が必要
外部キーは他の表の主キーを参照してる

主キーは重複しないこと、空でないことが条件となる
ひとつの列では一意ににならないけど、組み合わせると一意になる場合は複合キーと呼ぶ

■正規化
データに矛盾や重複が発生しないように表を最適化すること
一度の変更で何箇所も変更しなければいけない時など、修正漏れがあるとデータに不整合が生じるので
表を分けることで変更箇所が一箇所だけになり、矛盾や重複を防げる

後ほど加筆します
for文と拡張for文の違いを説明できないから書いた記事

hashMapの中身を、拡張for文で取り出そう！

```java
for( String key: マップ変数.keySet() ){}
```
そのとき、「あれ？拡張for文の記載方法が複雑だなぁ。」と思いました。
「何でこんな風に書くんだっけ？そもそも拡張for文って何だっけ？」
となったので備忘として残します。


# 復習) for文の書き方
```java
for (ループ変数の初期化; 条件式(繰り返す回数); 更新){
    //処理
}

for (int i = 0; i < 10; i++){
    System.out.println(i + 1 + "回目の処理");
}
```

#### 実行結果
    1回目の処理
    2回目の処理
    3回目の処理
    4回目の処理
    5回目の処理
    6回目の処理
    7回目の処理
    8回目の処理
    9回目の処理
    10回目の処理

```java
//配列を用いた書き方
int numbers[] = {10, 20, 30 ,40 ,50};
for (int i = 0; i < numbers.length; i++){
    System.out.println(numbers[i]);
}
```

#### 実行結果
    10
    20
    30
    40
    50

#復習) 拡張for文の書き方
 ```java
for (繰り返し用変数の宣言: 集合式) {
    //処理
}

//配列を用いた書き方
int numbers[] = {10, 20, 30 ,40 ,50};
for (int num: numbers){
    System.out.println(num);
}
```
#### 実行結果
    10
    20
    30
    40
    50

# for文と拡張for文の違い
``拡張for文は集合を扱っている``

 ```java
for (繰り返し用変数の宣言: 集合式) {
    //処理
}

//配列を用いた書き方
int numbers[] = {10, 20, 30 ,40 ,50};
for (int num: numbers){
    System.out.println(num);
}
```
for ( int num: numbers ) {　}　の集合式のnumbersは、以下のように解釈できる

```java
for (int num: numbers)
//⬇️
for (int num: {10, 20, 30, 40, 50} ){}
```
1回目のループで、numには10が代入される。
2回目のループで、numには20が代入される。
・
・
・

# HashMapで拡張for文を利用する
```java
Map<String, Integer> myScores = new HashMap<String, Integer>();
myScores.put("国語", 50);
myScores.put("数学", 60);
myScores.put("化学", 80);
myScores.put("英語", 70);

for(String key: myScores.keySet()){
    int score = myScores.get(key);
    System.out.println(key + "の点数は" + score + "点です");
}
```
#### 実行結果
    国語の点数は50点です
    数学の点数は60点です
    化学の点数は80点です
    英語の点数は70点です



集合式は、myScores.keySet (　)
この集合式は以下のように解釈できる

```java
for(String key: myScores.keySet())
//⬇️
for (String key: {"国語", "数学", "化学", "英語"} )
```
1回目のループで、keyには国語が代入される
2回目のループで、keyには数学が代入される
・
・
・

### 補足
@sowrdoneさんコメントありがとうございます。
「HashMapのより効率の良い取り出し方」をご教示いただきました。
keySet() ではなくて、entrySet() を利用する方法です。
こちらの方がkeySet() より早く動くようです。

※以下コメントより参照

```java
Map<String, Integer> myScores = new HashMap<String, Integer>();
myScores.put("国語", 50);
myScores.put("数学", 60);
myScores.put("化学", 80);
myScores.put("英語", 70);

for(Map.Entry<String, Integer> entry: myScores.entrySet()){
    System.out.println(entry.getKey() + "の点数は" + entry.getValue() + "点です");
}
```
[iOS] 実機ビルドした時に、ネットに繋がらないことがある

iOSでの実機ビルドした際に、ネットに繋がらないことがありませんでしょうか？

初心者、iOSエンジニアが以前陥ったしょうもないミスで解決方法がわかったので備忘録として、載せておきます。


## 現象
なぜか、実機ビルドしたときに、ネットに繋がらないことがありました。繋がる時もある。simulatorでは問題がない。

## 原因
mac側のインターネットの共有という設定があり、そちらをONにしていると、実機ビルドした時にネットに繋がらないことがあるらしい。

##  対処方法
以下を参考にするだけ！
[Macのインターネット接続をほかのネットワークユーザと共有する](https://support.apple.com/ja-jp/guide/mac-help/mchlp1540/mac)
Javaの環境構築（Mac）

# JDK13のインストール
以下のリンクから、JDK13のmacOSインストーラーをダウンロードしてください。

[https://www.oracle.com/java/technologies/javase/jdk13-archive-downloads.html](https://www.oracle.com/java/technologies/javase/jdk13-archive-downloads.html)

ダウンロードが完了したら、そのファイルを実行してください。

ターミナルに以下のコマンドを入力して、JDKがインストールされたかどうかを確認してみましょう。

```
java -version
```

JDKのバージョンが表示されればインストール完了です！
MacOSでBluetoothのSnifferを使ってつまづいたところ

Adafruitが出している
Bluefruit LE Sniffer

https://www.switch-science.com/catalog/3347/

を使おうとしてつまづいたところに関してです。
軽く導入した方法も記載しておきます。

# 導入

導入に関しては、この辺を参考にしてください。

https://learn.adafruit.com/introducing-the-adafruit-bluefruit-le-sniffer

https://houwa-js.co.jp/blog/2020/09/20200908/

流れだけ記載しておくと、
1.[ドライバー](https://learn.adafruit.com/introducing-the-adafruit-bluefruit-le-sniffer/usb-driver-install)を入れる
2.WireSharkを入れて、Sniffer用の設定をする
上のページで載せてくれていたスクリプトはcaskのインストールが以前のMacOSの指定の方法だったので、そこを修正したものを載せておきます。

```
#!/bin/bash
NRFSNIFFERPATH="https://www.nordicsemi.com/-/media/Software-and-other-downloads/Desktop-software/nRF-Sniffer/sw/nrfsnifferforbluetoothle300129d2b3.zip"
app=`brew list --cask | grep wireshark`; if [[ ${app} == "" ]]; then `brew install wireshark --cask`; fi
type "aria2c" > /dev/null 2>&1 || brew install aria2
sudo pip3 install --upgrade pip
sudo pip3 install pyserial
aria2c -x16 ${NRFSNIFFERPATH} -d /tmp
mkdir -p ~/.config/wireshark/extcap/
pushd /tmp
ZIPFILE=`find . -name "nrf*sniffer*.zip"`
unzip ${ZIPFILE} -d nrfsniffer
mv nrfsniffer/extcap/* ~/.config/wireshark/extcap/
rm -rf nrfsniffer
rm $ZIPFILE
popd
```
3.Wiresharkを起動して、キャプチャーを始める

# つまづいたところ
で、つまづいたところとしては、Wiresharkを起動するところ。
メニューのWiresharkのアイコンを押して起動したら上記で設定したsnifferに関するインターフェースが出るはずが出ない。。。
最終的には、CUIから起動したら設定が適用できていました。

```
$ Wireshark
```