OmniAICreator/Qiita-1.07M huggingface dataset:
Nest.js を Systemd で起動する

こちらのサンプルを systemd で起動するようにしました。
[Nest.js と TypeORM で MariaDB に接続](https://qiita.com/ekzemplaro/items/91ce87d281a3387f33c6)

設定ファイルの作成

```text:/etc/systemd/system/one_shot.service
[Unit]
Description=one_shot shell
After=netctl@profile.service

[Service]
Environment=NODE_PORT=3000
Type=simple
User=www-data
Restart=on-failure
WorkingDirectory=/home/uchida/nest/sample/05-sql-typeorm
ExecStart=npm start

[Install]
WantedBy=multi-user.target
```

起動

```bash
sudo systemctl start one_shot
```

状態の確認

```text
$ sudo systemctl status one_shot
● one_shot.service - one_shot shell
     Loaded: loaded (/etc/systemd/system/one_shot.service; disabled; vendor pre>
     Active: active (running) since Fri 2021-02-12 13:03:33 JST; 42s ago
   Main PID: 92839 (node)
      Tasks: 35 (limit: 1064)
     Memory: 258.4M
     CGroup: /system.slice/one_shot.service
```
Next.jsにglobal.cssを適応させる


# 手順
①プロジェクトのルートにstylesフォルダを作成し、global.cssを追加。

```
$ mkdir styles
```

```
$ touch styles/global.css
```

```css:global.css
html,
body {
  padding: 0;
  margin: 0;
  font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
    Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
  line-height: 1.6;
  font-size: 18px;
}

* {
  box-sizing: border-box;
}

a {
  color: #0070f3;
  text-decoration: none;
}

a:hover {
  text-decoration: underline;
}

img {
  max-width: 100%;
  display: block;
}

```
②pages/_app.jsを作成。Next.jsではAppコンポーネントを使用して全てのページを初期化するようになっています。 そのため、このコンポーネントを継承したクラスがあるファイル、_app.js(tsx) を作成することでデフォルトのAppコンポーネントを上書きできます。

```
$ touch pages/_app.js
```

```js:_app.js
import "../styles/global.css";

export default function App({ Component, pageProps }) {
  return <Component {...pageProps} />;
}

```

# 参考にさせていただいた記事
[Next.jsでの_documment.js(tsx)・App.js(tsx)について爆速で理解しよう](https://qiita.com/Yuki-Kurita/items/6a0eae00999e1294a3b1)
strings.Replace と strings.Replacer はどっちが早い

# 概要
複数の文字を置換するときは `strings.Replacer` でまとめて置換した方が早そうな印象がありました。
しかし `strings.Replace` のコードの方が `-bench` の結果がよい状況に出会したので改めて確認しました。

# 用語

## やりたいこと
`ABCDE` の `A` を `1` に `BC` を `23` に置き換えたいとき

## 用語

（用語に自信がないので以下の使い方で書きます）

* 「文字」
    * 上記やりたいことでいうところの、`A`
* 「文字列」
    * 上記やりたいことでいうところの、`BC`
* 「置き換えたい文字（列）」
    * 上記やりたいことでいうところの、`A` や `BC`
* 「置換対象文字列」
    * 上記やりたいことでいうところの、`ABCDE`

# さっそくまとめ

以下の場合は `strings.Replace` を複数回実行した方が早そうです。

* 「置き換えたい文字（列）」が少ないとき
* 「文字列」を置き換えたいとき
* 「置換対象文字列」に、「置き換えたい文字（列）」が含まれない場合があるとき

# ベンチマーク

以下の通り確認しましたが、よくないところがあれば教えてもらえるとうれしいです。

https://github.com/abetomo/strings-replace-bench

```strings.Replaceのベンチマーク.go
const str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ"
func BenchmarkStringsReplace(b *testing.B) {
	b.Run("2 strings", func(b *testing.B) {
		b.Run("Replace all", func(b *testing.B) {
			b.ResetTimer()
			for i := 0; i < b.N; i++ {
				s := strings.Replace(str, "ABC", "123", -1)
				strings.Replace(s, "DEF", "456", -1)
			}
		})

		b.Run("Replace some", func(b *testing.B) {
			b.ResetTimer()
			for i := 0; i < b.N; i++ {
				s := strings.Replace(str, "ABC", "123", -1)
				strings.Replace(s, "456", "___", -1)
			}
		})
	})
}
```

```strings.Replacerのベンチマーク.go
const str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ"
func BenchmarkStringsReplacer(b *testing.B) {
	b.Run("2 strings", func(b *testing.B) {
		b.Run("Replace all.", func(b *testing.B) {
			oldnew := []string{
				"ABC", "123",
				"DEF", "456",
			}
			r := strings.NewReplacer(oldnew...)
			b.ResetTimer()
			for i := 0; i < b.N; i++ {
				r.Replace(str)
			}
		})

		b.Run("Replace some.", func(b *testing.B) {
			oldnew := []string{
				"ABC", "123",
				"456", "___",
			}
			r := strings.NewReplacer(oldnew...)
			b.ResetTimer()
			for i := 0; i < b.N; i++ {
				r.Replace(str)
			}
		})
	})
}
```

```
BenchmarkStringsReplace/2_strings/Replace_all-8       	 3911292	       305 ns/op	     320 B/op	       4 allocs/op
BenchmarkStringsReplace/2_strings/Replace_some-8      	 7506202	       164 ns/op	     160 B/op	       2 allocs/op
```

```
BenchmarkStringsReplacer/2_strings/Replace_all.-8     	 3955276	       305 ns/op	     192 B/op	       3 allocs/op
BenchmarkStringsReplacer/2_strings/Replace_some.-8    	 4732401	       254 ns/op	     192 B/op	       3 allocs/op
```

各環境、各バージョンの結果:
https://github.com/abetomo/strings-replace-bench/actions/runs/559930095
Beanstalkの無料枠が謎すぎて課金くらった

# AWSを手探りで初めてみたら課金されてしまった

そう、あの日の俺は、開発中のASP.NET Core 3.1 のWebアプリをただAWSで動かしたかっただけなんだ。
それなのに、それなのにまさか$2.08も課金って、、悲しい。俺はとても悲しかった。

## まとめ
- Elastic Beanstalkで.NET Coreを試す場合、まず **.NET Core on Linux** プラットフォームを選ぶとEC2の無料枠が使われる
- **Billing**サービスで課金状況は把握できる
- 実験が終わったら **環境の終了** で停止すると無料利用枠を節約できる。（40日以内ならいつでも復活できる）


## AWSで.NET Core を動かすにはElastic Beanstalk
コンソールでいじるなら、`アプリケーション`と`環境`を同時に作ることから始まります。
が、いろいろ触ってみて気になったのが「これ、無料枠内で動いてるの？」という疑問。

前提として、Elastic Beanstalk自体の利用は無料です。それは理解した。
ただ、そこから作られるEC2やRDS(DB)、その他の設備は無料枠があって、気軽に試せるようにAWSが計らってくれてるわけです。

AWSのWebsiteなどに「EC2のt2.microは無料」と書いてあるので「EBを動かすVPCのサイズをしょぼいのにすればいい」というイメージはありますが、アプリケーションの作成や環境の設定に「EC2の設定」なんてどこにも出てきません。
*ちなみに詳細な設定画面にいくと`t2.medium`とかスケールの選択肢を見つけることができます。*

結論からいうと、何はともあれ **.NET Core on Linux** を選べば無料枠、間違って「.NET on Windows Server」を選んで課金されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248679/4d49edfa-0cd0-d25c-5a7c-1e400b9fad8d.png)

## 「EC2のインスタンス」はどこに
`アプリケーション` ＞ `環境` ＞ `設定` ＞ `容量` の`インスタンスタイプ`に発見！
ちゃんと`t2.micro`になってますね。
AWSのプロにとってはわかりやすいのかもしれないが我らAWS歴100秒未満の雑魚にとっては非常にわかりづらいです。
環境を作ったらまずここを確認することをお勧めします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248679/1fea07dc-af2a-0962-bd01-a1bc9a0f022a.png)

## 課金状況を知るには
コンソールから`Billing`というサービスを探して開いてみましょう。
ダッシュボード上部は課金状況、下部に無料利用枠サービスのリストが見れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248679/f6330db4-479b-ba55-d1b5-f769966e6d25.png)

## もし意図しない課金がされてたら
「今月初めから今日までのサービス別利用料」の「料金明細」にて課金対象の詳細がわかります、心当たりがないか調べてみましょう。ここを見て自分はたぶんプラットフォームEC2の.NET on Windows Serverが課金対象だったであろうことが判明しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248679/6734930e-7315-2c3e-0f3f-07eda45b8916.png)

## 無料枠の使用状況を把握しよう
Billing下部の「使用状況別の上位無料利用枠サービス」の「すべて表示」でAWSの無料枠一覧に飛んで、枠の使用状況が把握できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248679/417b71a3-85e2-b680-3e33-e4c222eafe6a.png)
PythonにおけるSpicyのエラー

Spiderにて、from scipy.interpolate を使用したときに

OSError: Failed to open file b'C:\\Users\\\xec\x9d\xb4\xeb\x8f\x99\xec\xa7\x84\\AppData\\Local\\Temp\\scipy-XXX

といったエラーが表示され、ドツボにハマった経験がある。
これは、C:/users/○○の○○ところに日本語の平仮名、漢字などで名前を登録した際に生じるエラーであることがわかった。

結構そういうのうるさいので，最近は全部新しいドライブ作ってD:/ ~に入れてみたりしたが、
手っ取り早く、Windowsの場合は TEMPとTMPを英文字のディレクトリ下(C:/users/の下)に移動したところうまくコンパイルが通った。

他のアプリでもC : /users/○○のところに日本語の平仮名、漢字などでエラーを起こすことが多いので注意が必要である。
キャリブレーションパターンの生成


OpenCVのキャリブレーションに用いられるパターンは、以下サイトで簡単に作成できます。
https://calib.io/pages/camera-calibration-pattern-generator

写真のように,パターンの形や間隔サイズなどを自由に選択可能です。
![スクリーンショット (305).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/911bb806-7b7c-c850-c7db-7f0b916ca44d.png)

Arマーカーを組み合わせパターンも生成できて面白いですね笑
![スクリーンショット (308).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/6cb7cbca-6d38-e514-e449-9755909854d3.png)
LeapMotionをUnityで使えるまで（自分用の備忘録）

#環境
Windows
Unity 2018.3.14f1
LeapDeveloperKit 4.1.0+52211
LeapMotion Unity Modules 4.7.0


#インストール
まずはUnity Hubをインストールして，そこからUnity 2018.3.14f1をインストール．
https://unity3d.com/jp/get-unity/download

次はLeapMotionのデベロッパーキットのzipファイルを以下のURLからダウンロード．
https://developer.leapmotion.com/sdk-leap-motion-controller/

最後にLeapMotionのUnity Modulesのzipファイルをダウンロード．
https://github.com/leapmotion/UnityModules/releases/tag/UM-4.7.0

#下準備
###デベロッパーキットの準備
デベロッパーキットのzipを展開し，インストール．
インストールすると，LeapMotion VisualizarからLeapMotionの動作を確認できる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654759/61f21756-bdfd-ae07-7523-a13fcba35177.png)


###Unityのプロジェクト作成
右上の新規作成からプロジェクトを作成．
今回は，「3D」のプロジェクトを選択．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654759/c448724a-2fa9-be6f-a099-d7f7a4fa567f.png)

###パッケージを入れる
先ほどダウンロードしたzipを展開し，AssetsのImport PakageからCore，Hands，Interaction Engineをインポート．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654759/18c6a27e-190a-7109-72a8-c92dc3790a28.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654759/364bd810-0856-6086-a120-0c8001edc345.png)

#試す
Assets/Plugins/LeapMotionのCoreやHnads，InteractionなどにはSceneファイルが入っており，そこからExampleを試すことができる．
あとはExampleを参考に開発しよう．
UIAlertControllerを表示するメソッドを作る

#作り方
```swift
public func showAlert(view:UIViewController,title:String,msg:String) {
    var alertController:UIAlertController
    alertController = UIAlertController(title:title,message:msg,preferredStyle:.alert)
    alertController.addAction(UIAlertAction(title:"OK",style:.default,handler:nil))
    view.present(alertController,animated:true)
}
```
#使い方
```swift
let title = "タイトル"
let msg = "メッセージ"
showAlert(view:self,title:title,msg:msg)
.netのnuget.exeでパッケージをさがす方法

# nuget.exeのv5.8から、searchコマンドがついた

[（Microsoftのブログ Jonさん）Getting started with NuGet 5.8](https://devblogs.microsoft.com/nuget/getting-started-with-nuget-5-8/)の記事に書いてあり、nuget.exeをダウンロードして```nuget.exe search <パッケージ名>```でパッケージ名から探すことができるようになった。

mac版はmonoを通して実行されるから、```mono nuget.exe search <パッケージ名>```。

```
$ which nuget
/Library/Frameworks/Mono.framework/Versions/Current/Commands/nuget
mac:webapi01 takahiro$ cat /Library/Frameworks/Mono.framework/Versions/Current/Commands/nuget
```
```#!/bin/sh
exec /Library/Frameworks/Mono.framework/Versions/6.12.0/bin/mono $MONO_OPTIONS /Library/Frameworks/Mono.framework/Versions/6.12.0/lib/mono/nuget/nuget.exe "$@"
```
AWS S3に画像をアップロードする際にEXIFデータを取り出す方法

ローカル環境ではEXIFデータを取り出せていたのに、S3に切り替えたら画像のEXIFデータを取り出せず詰まってしまいました。
悩み 調べ 書き切れないほどに試して解決できました。同じ様な症状に陥った方のデバッグのヒントになるかもしれないのでまとめていきます。

**前提：**
・EXIFデータを取得するために`exifr`を使用しています。


# １. 状況によって取り出し方が違う

### ① 既にS3へアップロードされているEXIFデータを取り出したい場合
**結論：**
**S3に保存した画像からはEXIFデータの取得は基本的にできない**ようです。

**取り出すために行うこと：**
**画像ファイルをS3からlocalに一時的にダウンロードして、落とした画像からメタデータを取り出す必要があります。**
※今回はこちらの説明は含んでおりません。（今後、個人的に実装した場合に追加していきます）

### ② S3へ画像をアップロードする際にEXIFデータを取り出したい場合

アップローダの記述を以下でいけます：
ポイントは①です！

```image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base
  attr_accessor :latitude, :longitude, :datetime　　　　***　①　***

  if Rails.env.production?
    storage :fog
  else
    storage :file
  end

  process :get_exif_info
  def get_exif_info　　　　***　　②　***
    begin　　　　***　　③　***
    require 'exifr/jpeg'
      exif = EXIFR::JPEG::new(self.file.file)
      @latitude = exif.gps.latitude
      @longitude = exif.gps.longitude
      @datetime = exif.date_time
    rescue
    end
  end

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
end

```

### 解説：
①`attr_accessor`を使ってインスタンス変数を渡しています。

②緯度・経度・撮影日のデータを格納。


③begin - rescueを使って例外処理をしています。
EXIFデータの有無で処理を分けているので、データがない場合の処理を書きたい場合は、`rescue`と`end`の間に書く。


あとはアクション内で以下みたいにすれば取得できます！
僕の場合はここでデータベースに保存させました。

```
@post.latitude = @post.image.latitude
@post.datetime = @post.image.datetime
```

今となってはこれだけだったんですが、paramsで取得することに執着して完全に見失っておりました。
ここで渡してあげないと、アップローダで取得したデータ値をアクション内で使えません（nilになります）

# アクション内でデータ値を使う為に他に試したこと：

#### １.そもそもアップロード時に取得できているのか？

```
get_exif_infoメソッド内での実行結果：
EXIFR::JPEG::new(self.file.file).gps.latitude
=> 35.29805555555556

EXIFR::JPEG::new(self.file.file).date_time
=> 2020-10-03 08:18:00 +0900
```
取得はできている。
ちなみにS３側にも画像は保存されている。

#### 2.  `instance_variable_get`で強引に取ってきてみる

```
obj = ImageUploader.new
binding.pry

obj.instance_variable_get("@latitude")を実行してみる
実行結果：➡︎ nil
```

#### 3.  パスを指定して取得してみる
S3には間違いなくアップロードされているので、
**オブジェクト URL をダイレクトに指定してみる。**

```
EXIFR::JPEG::new("オブジェクト URL/#{@post.fish_image.path}")

実行結果：
Errno::ENOENT: No such file or directory @ rb_sysopen
```

**S3 URIをダイレクトに指定してみる。**

```
EXIFR::JPEG::new("S3 URI/#{@post.fish_image.path}")

実行結果：
Errno::ENOENT: No such file or directory @ rb_sysopen
```



# まとめ
結局はシンプルにアクセサーで渡してしまうのが手っ取り早いようです。
そのあとで、データベースに保存させれば活用できました。
データテーブルの連結ー縦方向1 （異なる列名をそのまま残す場合）

テーブルとテーブルの連結には、縦方向（行が増える）と横方向（列が増える）の場合があります。
縦方向の場合は__集合__、横方向の場合は__結合__と言います。

集合には以下の３つのパターンがあります。
　和集合：複数のテーブルのレコードをすべて足す。
　積集合：複数のテーブルの共通するレコードを取り出す。
　差集合：他のテーブルと共通しないレコードを取り出す。

今回は、和集合について、SAS プログラムと SQL、および Python (Pandas) をそれぞれ用いた例を紹介します。

行いたい操作は下記です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287001/19b2da42-809b-ce08-1e13-3c2b09992322.png)
変数名が共通しているA列を結合します。
片方しかない変数 (B列、C列) はすべて残します。

####① SAS プログラム

~~~sas
data table_3;
 set table_1 table_2;
run;
~~~
__<font color="Blue"> set </font>__ ステートメントで縦に重ねることができます。
記載されている順番で読み込み連結します。
この例ではテーブルは２つですが、任意の数のテーブルを連結できます。

####② SQL

~~~sas
 create table table_3 as
 select A, B from table_1
   outer union corr
 select A, C from table_2;
~~~
<font color="Blue"> SELECT文 __outer union corr__  SELECT文</font> 
→ SELECT文の結果を縦に結合します。

####③ Python (Pandas)
~~~python
import pandas as pd
table_1 = pd.DataFrame({'A': [1, 2], 'B': ['AA', 'BB']})
table_2 = pd.DataFrame({'A': [2, 3], 'C': [10, 20]})
table_3 = pd.concat([table_1, table_2], ignore_index = True)
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287001/6b5c4f11-0921-ac6e-055d-697485f40a01.png)
<font color="Blue"> __pd.concat__ </font>  の引数の順に沿ってテーブルが連結されます。NaN は欠損値です。

####関連記事
[データテーブルの連結－縦方向 2（異なる列名を統合する場合）](https://qiita.com/MomonekoView/items/e63b54b0ae1849c3ddd1)
[データテーブルの連結－縦方向 3（積集合と差集合）](https://qiita.com/MomonekoView/items/14fe790b6993c2b3dad3)
[データテーブルの連結－横方向 1（完全外部結合）](https://qiita.com/MomonekoView/items/86f124e53d372290e2a4)
[データテーブルの連結－横方向 2（内部結合）](https://qiita.com/MomonekoView/items/5d067363c506a0ab2013)
[データテーブルの連結－横方向 3（左右の外部結合）](https://qiita.com/MomonekoView/items/434d8bceab29606568e9)
[データテーブルの連結ー交差結合](https://qiita.com/MomonekoView/items/d57a2adf97b10e4549d1)
Rでデータ型を調べるclassについて

Rで扱う代表的なデータ型には numeric, complex, character, logical などがある。データ型を調べるclassという関数があり、class(X)を実行するとXのデータ型が調べられる。この際、引数Xは複数要素を含むものも許されており、欠損値がある場合の出力結果が気になったので調査した。

[データ型とデータ構造](http://cse.naro.affrc.go.jp/takezawa/r-tips/r/25.html)によると、__character > complex > numeric > logical > NULL__という大小関係があり、複数のデータ型を含むベクトルの場合はより大きい型のデータ型となる。以下でテストしてみる。

```r:class.r
X1 <- c(NULL)
X2 <- c(NULL, TRUE)
X3 <- c(NULL, TRUE, 2.8)
X4 <- c(NULL, TRUE, 2.8, 1+2i)
X5 <- c(NULL, TRUE, 2.8, 1+2i, "TEST")

class(X1)
[1] "NULL"
class(X2)
[1] "logical"
class(X3)
[1] "numeric"
class(X4)
[1] "complex"
class(X5)
[1] "character"
```

たしかにデータ型の大きなものになっていることが確認ができた。あるデータの列全体に関してデータ型を調べるときには、列全体をclass()の引数に入れれば、欠損値があってもデータ型が判定できる。
Kotlinで空文字列とNullを相互変換する

運用都合で空文字列とNullを相互に変換して取り扱う必要があったので、簡単に備忘録としてまとめておく。


## 空文字列を受け取ったらNullに変換する

```kotlin
val empty: String = ""
val nullable: String? = empty.ifEmpty { null }
```

## 空文字列 or 空白文字列を受け取ったらNullに変換する

```kotlin
val blank: String = " "
val nullable: String? = blank.ifBlank { null }
```

## Nullを受け取ったら空文字列に変換する

```kotlin
val nullable: String? = null
val empty: String = nullable.orEmpty()
```

## 動作確認
[Kotlin Playground][kp]でサクッと動作確認。

```kotlin
fun main() {
    listOf("", " ", null, "hoge").forEach { string ->
        check(string)

        print("string.orEmpty()        : ")
        check(string.orEmpty())

        print("string?.ifEmpty{ null } : ")
        check(string?.ifEmpty{ null })

        print("string?.ifBlank{ null } : ")
        check(string?.ifBlank{ null })

        println("")
    }
}

fun check(string: String?) {
    when(string) {
        null -> println("null")
        ""   -> println("empty")
        " "  -> println("blank")
        else -> println(string)
    }
}
```

```
empty
string.orEmpty()        : empty
string?.ifEmpty{ null } : null
string?.ifBlank{ null } : null

blank
string.orEmpty()        : blank
string?.ifEmpty{ null } : blank
string?.ifBlank{ null } : null

null
string.orEmpty()        : empty
string?.ifEmpty{ null } : null
string?.ifBlank{ null } : null

hoge
string.orEmpty()        : hoge
string?.ifEmpty{ null } : hoge
string?.ifBlank{ null } : hoge
```

[kp]:https://play.kotlinlang.org/
MFMailComposeViewControllerを表示する

#1.フレームワークのインポート
```swift
import MessageUI
```

#2.メソッドの作成
```swift
class ViewController:UIViewController,MFMailComposeViewControllerDelegate {
    func sendMail() {
        if MFMailComposeViewController.canSendMail() {
            let mail = MFMailComposeViewController()
            mail.mailComposeDelegate = self
            mail.setToRecipients(["宛先"])
            mail.setSubject("件名")
            mail.setMessageBody("本文",isHTML:false)
            self.present(mail,animated:true,completion:nil)
        }
    }
    func mailComposeController(_ controller:MFMailComposeViewController,didFinishWith result:MFMailComposeResult,error:Error?){
        if error == nil {controller.dismiss(animated:true,completion:nil)}
    }
}
```

#3.メソッドの呼び出し
```swift
sendMail()
```
『「原因と結果」の経済学』要点まとめ

* 読んだ本：[「原因と結果」の経済学―――データから真実を見抜く思考法](https://www.amazon.co.jp/dp/B06X6GJYWF)
* 本には、↓の項目ごとに実際に行われた効果検証の例が書いてある

# 目的

後から要点を参照できるようにしておく

# 目次

* 因果関係を確認する3つのチェックポイント
* 反事実
* 反事実っぽいデータの作り方
* 回帰分析
* その他

# 内容

## 因果関係を確認する3つのチェックポイント

「相関はありそうだけど、因果はあるのか？」というのを考えるときに疑ってみるポイント

* 「まったくの偶然」ではないか
* 「第３の変数」は存在していないか
* 「逆の因果関係」は存在していないか

## 反事実

* 因果関係を説明するのには「反事実」が必要
* 「aをしたからbになった」という事実と、「aをしなかったらどうなっていたか」という反事実を比較する必要がある

## 反事実っぽいデータの作り方

実際は、反事実は（タイムマシンで過去に戻ってやり直さなければ）観測不可能。そのため、比較可能なデータを作り反事実をもっともらしいデータで置き換える

* その1：ランダム化比較試験
* その2：自然実験（得られたデータから、ランダム化比較試験のような状況を探す）
* その3：実験をまねる「疑似実験」
  * 差の差分析
     * 対象Aと対象Bを考える。「Aは何か影響を与えられてA1->A2、Bには何もしないでB1->B2」と変化したとき、因果効果として「(A2-A1)-(B2-B1)」を測定する。必要な前提条件は、AとBは、因果効果以外は同じ変化をする（同じトレンド、他に影響がある変化起きていない）ものであること。
  * 操作変数法
     * 「原因を通してのみ結果に影響を与える」操作変数によって介入群と比較群を比較する。必要な前提条件は、「操作変数は原因には影響を与えるが、結果には直接影響しないこと」「操作変数と結果両方に影響するような第４の変数が存在しないこと（存在していても、データがあれば良い）」
  * 回帰不連続デザイン
     * 恣意的に決めた値をカットオフ値として介入群と比較群を分けて、因果効果として「カットオフ値前後でのジャンプ値」を測定する。必要な前提条件は、カットオフ値周辺で結果に影響を与えるような他のイベントが起きていないこと
  * マッチング法
     * 結果に影響を与えるような共変数を用いて、介入群と似た比較群を選出し、比較する方法。必要な前提条件は、結果に影響を与える共変数がすべて観察可能であること
     * 共変数：原因と結果以外のすべての変数
     * 共変数が複数あったら、まとめて比較する方法もある（プロペンシティ・スコア・マッチング）。必要な前提条件は、「結果に影響を与えるようなすべての共変数がデータとして測定され、手元にあること」「すべての共変数がプロペンシティ・スコアの計算に用いられていること」

## 回帰分析

* 単回帰分析
  * 原因と結果だけで近似直線引いて、因果効果として傾きを計測する
* 重回帰分析
  * 交絡因子（原因と結果に影響を与える変数）も含めて回帰分析する。交絡因子の影響を消して、原因と結果の関係を見ることができる。
* 計算とかは[コッチ参照](https://qiita.com/kazuya_minakuchi/items/186b20efd0eefdeb026b#%E7%B7%9A%E5%BD%A2%E5%9B%9E%E5%B8%B0)

## その他
* 分析の妥当性と限界
  * 内的妥当性：研究対象となった集団に同じことをしたら、同じ結果を得られるか
  * 外的妥当性：研究対象以外に同じことをしたら、同じ結果を得られるか（例：アメリカ人を対象に行なった研究の結果が、日本人にも適用できるか）
  * ランダム化比較試験もランダムピックアップする対象を厳選しているので、「外的妥当性」という点では完璧ではない
* 因果推論の５ステップ
  1. 「原因」は何か
  2. 「結果」は何か
  3. 「因果関係を確認する3つのチェックポイント」を確認する
  4. 反事実を作る
  5. 比較可能になるよう調整する
時系列データの前処理（R 編）

# はじめに
R を使って時系列データの前処理を行った際、使ったコードをつらつらと書き足していく。全く同じことをPython でも行っているので、それを読みたい方は[こちら](https://qiita.com/ryamamoto0406/items/58d8e0ee5d3009738a52)。

開発環境

- R 4.0.3
- RStudio 1.4.1103

更新履歴

- 2021/02/12：初投稿。データの読み込みから欠損の確認まで。


参考にした記事

- https://ultrabem-branch3.com/informatics/r/r_histogram


# データの読み込み
データは時系列かつ多変量である[Water Treatment Plant](https://archive.ics.uci.edu/ml/datasets/water+treatment+plant)を利用した。

必要なパッケージとデータを読み込む。

```R:
library(dplyr)

df <- read.csv(file="./water-treatment.data", header=FALSE, na.strings="?") #?を欠損値として扱う
dim(df)
```

```:出力
[1] 527  39
```
ただしくデータが読み込まれた。

# データの結合（複数ある場合）
データのcsvファイルが複数ある場合は、それを結合し一つのDataFrameとして扱いたい。各列の要素が同じであることをチェックしたら、

```R:
df <- bind_rows(df.1, df.2, df.3)
```
で結合すればよい。#今回の場合は1ファイルなので不要。

# 時刻化と時刻でのソート
1列目に時刻がD-日付/月/年という形式で入っているので、それをPOSIXct型に直す。Rでは、`as.POSIXct`という関数があるので、それを使用する。

```R:
df[,1] <- as.POSIXct(df[,1], format="D-%d/%m/%y", tz="UTC")
df <- df[order(df[,1]),] #時刻でソートする
```

デフォルトだとJSTになってしまうのが多少気持ち悪いので、タイムゾーンをUTCで指定している。このデータは日付だけなので、POSIXct型ではなくDate型にしても良さそう。

```R:
df[,1] <- as.Date(df[,1], format="D-%d/%m/%y")
df <- df[order(df[,1]),] #時刻でソートする
```

以下はDate型として取り扱う。

# データの重複の確認
データの重複が無いかをチェックする。列を直接比較する方法は難しそうなので、一旦転置し重複行を探して削除し、再度転置して戻すという方法を取る。

```R:
duplicated(t(df)) #重複の確認
```

今回のデータの場合全て`False`なので重複は無し。重複があった場合は、その列番号を指定して、

```R:
df = df[,-10] #例えば10列目を削除したい場合
```
で削除できる。

因みに要素ではなく列名で重複を確認する場合は以下に示す。

```R
colnames(y) %>% duplicated()
```

いずれにせよ、重複は

1. 重複の有無を確認する。
2. 重複が有った場合、データの中身を確認する（プロットしてみるなど）
3. 削除するかを決める

という感じで取り扱うのが良さそう。

# データのサンプル間隔を調べる
よくよくデータを見てみると等サンプルのデータではなさそうなので、サンプリング間隔のヒストグラムを作る。日付の配列を一つずらした配列を作り順次引き算していくことでデータのサンプル間隔を調べる。

```R:
dt <- as.integer( df[,1] - lag(df[,1], 1) ) #時刻の差分
hist(dt, breaks = seq(0,35,1)) #ヒストグラムにプロット
```
![R_hist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077734/511885f2-ec65-db87-2b8a-dbb5451ee518.png)


見難いので対数で取ったヒストグラムも作成する。（[参考記事１](https://ultrabem-branch3.com/informatics/r/r_histogram)）Rの場合は少し工夫が必要。

```R:
dt.data <- hist(dt, breaks = seq(0,35,1), plot=FALSE) #ヒストグラムのデータを作成
dt.data$counts <- log10(dt.data$counts) #countsを対数に直す
plot(dt.data, ylim=c(-1, 5) ,ylab='log10(Frequency)') #再度プロット
```
![R_hist_log.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077734/306c7c3f-d0b7-c283-7be7-e4c121e52d73.png)


$\log_{10}(1) = 0$ の点があるせいでこちらも見難いグラフになってしまった。__どなたかRできれいに対数ヒストグラムを書く方法をご存じでしたら教えて下さい！__


ほとんどが一日間のサンプリングデータだが1/5程度は二日間、ごくまれに三日間、1データだけ一か月くらい（三十二日間）データが飛んでいる箇所があるよう。

これを「等サンプリングに直す」のは次回。

# データの欠損の確認
このデータは欠損を含んでいる（欠損は?で表されている。）ので、その可視化を行う。列ごとに欠損の数を数え、その割合を棒グラフにする。

```R:
na.count <- apply(is.na(df), 2, sum)
na.per <- na.count / nrow(df) * 100

barplot(na.per, ylab="Percentage of NAs [%]", xlab="Columns")
```
![R_NA_per.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077734/09612f40-cea2-fab0-c9fe-50b5817b53a2.png)


ほとんどのデータは10%以下、多くても12%程度の欠損であることが分かった。


# おわりに
以上、データの下準備とちょっとした分析を行った結果を示した。もし加えて何かをした場合は記事に追記していきたい。
【Git 共同開発】ローカルで作業中にコードレビューする方法

## はじめに
現在共同開発に参加させて頂いており、コードレビューすることになりました。
その際に気になったことについて備忘録として残しておきます。


## 現状
- チームメンバーからプルリクのレビュー依頼
- 現在ローカルで作業中
- コミットしたくないファイルがある


## 結論：git stashを使う
### git stashとは
- 変更内容を一時退避させておくことができる
- コミットしたくないファイルがある場合などに使う


## コードレビュー方法
### 1. 現在の作業内容を一時退避
```ruby
# 作業内容を退避させる
git stash

# コメントの挿入も可能
git stash save "コメント"
```
`save`の後にコメントを残しておくことで、どんな作業していたか一目で分かるので忘れ防止になります。


### 2. developブランチに切り替える
```ruby
# git statusで差分がないことを再度確認してから
git switch develop
```

### 3. コードレビュー実施


### 4. コードレビュー完了後、元の作業ブランチに戻る
```ruby
git switch ブランチ名
```

### 5. 変更内容を元に戻す
#### 退避させていた作業を確認する
```ruby
git stash list
```
```ruby
# 実行結果
# 一番上が最新のstashしたファイル
stash@{0}: WIP on branch_a: xxxx
stash@{1}: WIP on branch_b: xxxx
```

#### 退避した作業を戻す

```ruby
# 元に戻したいstashを指定(0番目の場合)
git stash apply stash@{0}
```

以上で作業途中でも変更をコミットする事なくコードレビューを行うことが出来ます。

まだまだ慣れない共同開発ですが、他の方のコードを確認するのは勉強になるため、積極的にコードレビューしていきたいです！
クリップボードから読み込んだデータからヒストグラムを作る

# 背景
実験結果からヒストグラムを書きたいときがよくある。大体エクセルで散布図や平均値・標準偏差などを描いている流れで、ところで一応ヒストグラム見ておきたいという事が多々ある。そんな時に、エクセルではヒストグラムを作るのがいちいち面倒である。また、対象のデータがそこまでない場合、ヒストグラムのためだけにCSVファイルを作っているのは面倒だと思う。

# 目的
エクセルで閲覧しているデータを簡単にpandasのデータフレームとして扱って、ざっくり全体のカラム毎の分布を確認するときに必要な方法をまとめる。


# 概要
- エクセルで対象のテーブルを作っておく
- 全体を選択してコピーする
- pythonで受け取る
- ヒストグラムを書く

# コード
```hist.py
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

#クリップボードから読込
df = pd.read_clipboard()

#データを確認
df.head()

#ヒストグラムを書く
from pylab import rcParams

#サイズを調整（これ無いとかなり小さくなってしまう）
rcParams["figure.figsize"]= 10, 10

df.hist()
plt.tight_layout()
plt.show()
```

# まとめ
- エクセルで小規模のデータを分析しているとき、全体の分布をざっくり把握したいときに便利そう
- 細かなパラメータの変更とかはおいおい理解していきたい
対応ブラウザをIEからChromeに変更する時の注意点その５(input type="file")の違い

# 対応ブラウザをIEからChromeに変更する時の注意点その５(input type="file")の違い

対応ブラウザをIEからChromeに変更する時の注意点について備忘録的に記載します。

# 発生問題点
input type="file"を使用しているとIEとChromeで見た目の違いが発生する


# 環境
* <font color="Green">__OSはWindows10__</font>
	* バージョン：1909(OS ビルド 18363,1256)

* <font color="Green">__Microsoft Internet Explorer__</font>
	* バージョン：11.1198.18362.0

* <font color="Green">__Google Chrome__</font>
	* バージョン： 88.0.4324.96(Official Build) (64ビット)

# 画面イメージ

IEとChromeでinput type="file"を使用した場合の見た目は以下のようになる。



![file.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701538/0904173e-d73a-1c7e-0050-8471b86f0acc.png)

# 使用HTML

```
 1  <!DOCTYPE html>
 2  <html>
 3  <style>
 4  #file::-ms-value {
 5   background-color:#ccffcc
 6  }
 7  </style>
 8  <title>FILE</title>
 9  
 0  <input id="file" type="file" >
11  </html>
```


# 解決方法
『input type=”file”』を『display:none』で非表示として、 代わりに『readonly』の『input type=”text”』と
ボタンを使用する。



# 画面イメージ
Chromeでの表示


![file_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701538/7a9a3851-6579-a992-ab5c-2a583a1c48f0.png)

# ソース

```
 1  <!DOCTYPE html>
 2  <html>
 3  <script
 4    src="https://code.jquery.com/jquery-2.2.4.min.js"
 5    integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="
 6    crossorigin="anonymous">
 7  </script>
 8  <style>
 9  input[readonly] {
 0   background-color:#ccffcc
11  }
12  </style>
13  <title>FILE</title>
14  <!-- 代わりのテキストボックス(readonly) -->
15  <input id="file_name" type="text"  readonly="readonly" />
16  <label for="file">
17    <!-- 非表示にする(type="file") -->
18    <input id="file" type="file" style="display: none;" />
19    <!-- 代わりのボタン -->
20    <p style="cursor: pointer; padding: 1px 10px; background-color: #dedede; border: solid 1px #b7b7b7; display: inline-block;" >参照...</p>
21  </label>
22  <script type="text/javascript">
23    $(function(){
24  	  $(document).on('change','input[type="file"]',function(){
25  	  if ($(this).prop('files').length != 0) {
26  	  		$('#file_name').val($(this).prop('files')[0].name);
27  	  }else{
28  	 	 	$('#file_name').val("");
29  	  }
30      });
31    });
32  </script>
33  </html>
```
nRF52によるBLE通信MTUサイズ上限の取得

# 記事の概要
NordicのBLEモジュール nRF52を用いてMTUを取得させます。

# MTUとは何か
BLEにおいて、セントラル機器とペリフェラル機器間ではBLE通信（NotifyやWrite）でパケットを送受信します。
このパケットの上限サイズがMTU（Maximum Transmission Unit)です。

# MTUのサイズ
BLE 4.0においてMTUは20バイトです。
そして、BLE 4.2においてMTUは257バイトになりました。

ですが、これは飽くまでも規格値の上限であり、実際にはBLE接続機器の性能に依存して150バイト前後にまで下がります。

# MTUのサイズを取得する
BLEモジュールがセントラル機器と接続する時、相手のMTUに合わせてパケット分割したい場合があります。

例えば、1000バイトのデータを送信したい時、今回BLE接続したiPhoneはMTUが100バイトだからパケットを10分割して、次にBLE接続したiPhoneはMTUが200バイトだからパケットを5分割する、といったように臨機応変にMTUサイズに合わせて通信したいことがあります。

ただし、MTUサイズを取得した際、オペコードに1バイト、ハンドルに2バイトを使用するので、通信データに使用できるのは、取得値から3バイトを引いた値になります。

[MTU に基づいた最大パケットサイズ - KBA203312 - Community Translated (JA)](https://community.cypress.com/t5/Knowledge-Base-Articles/MTU-%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%84%E3%81%9F%E6%9C%80%E5%A4%A7%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E3%82%B5%E3%82%A4%E3%82%BA-KBA203312-Community-Translated-JA/ta-p/252759)

# 実装
Q&Aサイトの「[negotiating-max-mtu-size](https://devzone.nordicsemi.com/f/nordic-q-a/33541/negotiating-max-mtu-size)」を参照して作成したコードの一部を以下に示します。


```c
#define 	OPCODE_LENGTH   1 
#define 	HANDLE_LENGTH   2

static uint16_t mtu_max_size;

void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
{
    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
    {
        mtu_max_size = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
    }
}


/**@brief Function for initializing the GATT module.
 */
static void gatt_init(void)
{
    ret_code_t err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE); // UPDATE MTU HERE
    APP_ERROR_CHECK(err_code);
}
```

`gatt_init()`関数に割り込みハンドラー`gatt_evt_handler`を設定します。

割り込みハンドラーでは、`p_evt->params.att_mtu_effective`によりBLE接続したCentral側のMTUを取得できます。
これからオペコードの1バイトとハンドル部の2バイトを引いた値が、1パケットに乗せられるデータサイズの上限になります。

最後に`nrf_ble_gatt_att_mtu_periph_set()`を実行することで、ペリフェラル側のMTUが更新されます。
ここでは、`NRF_SDH_BLE_GATT_MAX_MTU_SIZE`をsdk_config.hにおいて247に設定しています。

規格では257バイトなのに247バイトにしている理由は、Data channel PDU headerの2バイト、Data channel PDU MICの4バイト、Basic L2CAP PDU headerの4バイトを除いたのが、257-2-4-4=247バイトだからです。

詳細は以下をご覧ください。
https://devzone.nordicsemi.com/f/nordic-q-a/28640/maximum-att-mtu-for-ble-nus

これを実行すると、BLE接続するたびに、Central機器に依存して、`mtu_max_size`が20、138、152と様々な値に変動し、Central機器のMTUを知ることができます。
PICでADCを使用する (PIC16F1769)

文中のINTCON = 0b0xxxxxx1;などのxは，これから設定するビットを表す（xのまま書き込むわけではない）

操作レジスタ
---
* TRISx
* ANSELx
* ADCON0
* ADCON1

必要に応じて割り込み関連のレジスタも操作する．

1．TRISxレジスタの設定
---
対応するピンのビットをセットして入力端子とする．

2．ANSELxレジスタの設定
---
対応するポートをセットしてアナログ入力端子とする．

3．ADCON0レジスタの設定
---
```c
ADCON0 = 0b0xxxxxx1
```
`CHS <6:2>` ：アナログチャンネル選択ビット．
`GO/nDONE`：このビットをセットするとAD変換サイクルが開始する．AD変換が完了するとハードでクリアされるので，くりかえす場合には毎度セットする必要がある．
`ADON`：セットでADCを有効にする．

3．ADCON1レジスタの設定
---
```c

ADCON1 = 0bxxxx0xxx
```
`ADFM`：H・L合わせて10ビットのADRESレジスタに，変換結果を左右どちら詰めで書き込むかを決めるビット．セットで右詰め．
`ADCS <2:0>`：ADC変換クロック選択ビット．これはFOSCによって推奨値が異なるので，データシートを見て確認すること．
`ADNREF`：ADCの負側参照電圧をどこからとるかを決めるビット．
`ADPREF`：ADCの正側参照電圧をどこからとるかを決めるビット．



参考ページ
---

MICROCHIP　PIC16(L)F1764/5/8/9　日本語PDFデータシート
https://akizukidenshi.com/download/ds/microchip/PIC16F1764_PIC16LF1769_j.pdf
Rで重複するカラムを消す

読み込んだデータに重複する列があったため、重複を調べて削除→インデックス振り直しを行うコードをRで書いた。スマートではないので、いい方法をご存知の方はぜひコメントください。

まずデータとそのヘッダーを読み込む。

```r:readFile.r
d <- read.csv(file="data.csv", header=FALSE)
h <- read.csv(file="header.csv", fileEncoding="UTF-8-BOM")
colname <- h$ROWNAMES
```

列名で集計をとり、2つ以上存在する列を調べる。

```r:removeColumn.r
X <- table(colname)
removedcol <- c()
for (i in 1:dim(X)) {
  if (X[i]>1) {
    removedcol <- c(removedcol, X[i])
  }  
}
removedcol
```

removedcolに入っている列が何列目か調べて削除し、その分インデックスがずれるので振り直す。（以下はi列目、j列目、k列目を削除する場合）

```r:reindex.r
d <- d[, -c(i, j, k)]
rownames(d) <- 1:nrow(d)
```

削除する列を調べる部分でうまくtable形式から列名を扱えればいいんだが、うまくできず結局生データを見て何番目か調べている。。。絶対スマートにできる方法があるはず。。。誰か教えて。。。
PIC　状態変化割り込みの使用方法 (PIC16F1769)

文中のINTCON = 0bxx000000;などのxは，これから設定するビットを表す（xのまま書き込むわけではない）

調整するレジスタ
---
* IOCxN
* IOCxP
* IOCxF
* INTCON

※ xは使用するポートによる

1．IOCxN，IOCxPレジスタの設定
---
それぞれNegative，Positiveの意で，ポートが1から0へ変化した時か，ポートが0から1へ変化した時か，どちらの場合に割り込み許可をするかを設定するレジスタである．ビットはレジスタ名の末尾にポート番号が添えられた表記になっている．


2．IOCxFレジスタの設定
---
ポートAのピンを状態変化割り込みとして使用する場合とすると

**1**：対応するピンで状態変化が検出された
*IOCAPx = 1で、RAxに立ち上がりエッジが検出された場合、またはIOCANx = 1で、RAxに立 ち下がりエッジが検出された場合にセットされる*

**0**：状態変化なし、または検出された状態変化をユーザがクリアした

**割り込みを繰り返し行うには，割り込み発生後にIOCxFレジスタ，または各ビットを初期化する必要がある．**

3．INTCONレジスタの設定
---
```c

INTCON = 0bxx00x000;
```
`GIE`：セットで全てのアクティブな割り込み有効（1ビット）
`PEIE`：セットで全てのアクティブな周辺モジュール割り込み有効（1ビット）
`IOCIE`：セットで状態変化割り込み有効（1ビット）

`IOCIF`
**1** : 状態変化割り込みピンのうち少なくとも1本の状態が変化した　
**0** : 状態変化割り込みピンの状態は変化していない
（1ビット）**※Read Only**





参考
---
ツール・ラボ　第18回 割込み処理(3) 〜割込み処理プログラムテンプレ〜　PICマイコン入門－応用
https://tool-lab.com/pic-app-18/ 

浅草ギ研　入門用マイコンボードＰＩＣｏｌｏ　スイッチなどの外部入力による割り込み（状態変化割り込み）
http://www.robotsfx.com/robot/robohow/RoboHow154/RoboHow154.html

MICROCHIP　PIC16(L)F1764/5/8/9　日本語PDFデータシート
https://akizukidenshi.com/download/ds/microchip/PIC16F1764_PIC16LF1769_j.pdf
PIC でEUSART  非同期  極性：非反転 (PIC16F1769)

MCUを使用せずにモジュールのプログラムを書くときは，一度MCUで動かしてからレジスタの値を確認するようにすると良いと思う．

調整するレジスタ
---
* TX1STAPIC16F1769
* RC1STA
* BAUD1CON
* SP1BRG (H/L)
* RxyPPS
* TX1REG

1．BAUD1CONレジスタの設定
---
```c

TX1STA = 0b00100100 
```
`TXEN`：送信イネーブルビット．セットで有効
`SYNC`： EUSARTモード選択ビット．クリアで非同期モード
`BRGH`：高baudレート選択ビット．セットで高速　（※同期モードでは使用しない）

2．RC1STAレジスタの設定
---
```c

RC1STA = 0b10000000
```
`SPEN`：シリアルポート イネーブルビット．セットで有効．
※送信のみを行う場合も，このビットをセットしなければシリアル通信はできない．


3．BAUD1CONレジスタの設定
---
```c

BAUD1CON = 0b00001000
```

`SCKP`：同期クロック極性選択ビット．クリアでTX/CKピンへ非反転データを送信する．
`BRG16`：16ビットbaudレート ジェネレータ ビット．セットで16ビットbaudレートジェネレータを使用．

4．SP1BRG (H/L)レジスタの設定
---
BAUDレートの設定を行うレジスタ．計算式は *PIC16F1764_PIC16LF1769_j.pdf* のP442を参照すること．

5．RxyPPSレジスタの設定
---
TX/CKピンに使用するピンを選ぶ．モジュール値は[0x16]．
詳細については *PIC16F1764_PIC16LF1769_j.pdf* のP442を参照すること．

6．TX1REGレジスタの設定
---
送信する文字を格納するレジスタ．


**※受信（RX）をする場合は，RC1STAbits.CREをセットし，RXPPSレジスタで希望のRXピンを設定する．**




参考ページ
---
printf文の使い方 
http://www.picfun.com/HI-Tech/HI-TECH08.html



MICROCHIP　PIC16(L)F1764/5/8/9　日本語PDFデータシート
https://akizukidenshi.com/download/ds/microchip/PIC16F1764_PIC16LF1769_j.pdf
PIC Timer0割り込みの使用方法　(PIC16F1769)

※ここで説明するのは，Timer0のクロック源に内部クロックを使用する場合である．
文中の `INTCON = 0bxxx00x00;` などのxは，これから設定するビットを表す（xのまま書き込むわけではない）

調整するレジスタ
---
* OPTION_REG
* INTCON
* TMR0

1．OPTION_REGレジスタの設定
---
```c

OPTION_REG = 0b1000xxxx
```

`PSA`：クリアでプリスケーラ割り当て（1ビット）
`PS`：プリスケーラ比選択ビット（3ビット）．大きいほど割り込みの周期が長くなる．

**※TMR0CSビットの選択のFOSC/4という表記は，PIC内部の1命令がクロック4周期で進むことに由来するものであり，INTOSC = 8MHzのときにTimer0のクロック源が8 / 4 = 2MHzになる，という意味ではない．**

2．INTCONレジスタの設定
---
```c

INTCON = 0bxxx00x00;
```

`GIE`：セットで全てのアクティブな割り込み有効（1ビット）
`PEIE`：セットで全てのアクティブな周辺モジュール割り込み有効（1ビット）
`TMR0IE`：セットでTimer0割り込み有効（1ビット）
`TMR0IF`：1 = TMR0レジスタがオーバーフローした　0 = TMR0レジスタはオーバーフローしていない

**割り込みを繰り返し行うには，割り込み発生後にTMR0IFレジスタをクリアする必要がある．**

3．TMR0レジスタの設定
---
８ビットのカウンタで，１命令サイクル毎に+1される．（プリスケーラで変更可）．
最初に設定した値からカウントアップされ，255から0へオーバーフローしたときに割り込みが発生する．そのため，**割り込みを繰り返し行うには，割り込み発生後にTMR0レジスタを初期化する必要がある．**

4．プリスケーラ比・TMR0レジスタの初期値の検討
---
**例：INTOSC = 8MHz，10ms毎にTimer0割り込みを発生させたい場合**
Timer0のクロック源をシステムクロック(FOSC/4)に設定（TMR0CS = 0）すると，INTOSC = 8MHzであるから1命令サイクルは (1 / 8000000) * 4 =  0.5 (μs)．

プリスケーラ無しの場合，割り込みが発生する 間隔は最大でも0.128 ms  (0.5μs * (255+1)命令サイクル = 0.128ms)  であり10msには程遠いため，プリスケーラを使用する必要がある．

プリスケーラ比を最大の1：256に設定  (PS：111)  すると，割り込みが発生する間隔は最大で
約30 ms  ( 0.5μs * ( (255+1) * 256 )命令サイクル = 32.76...(ms) )  となる．

これを10ms間隔に調整するには，TMR0レジスタにあらかじめ値を与えてゲタをはかせておく．これによりオーバーフローまでのカウント回数を減らし，周期を短くすることができる．
10 (ms) = 0.5 (μs) * 256 (PRS) * (255 - TMR0 +1) から
TMR0 = 256 - ( 10 (ms) / ( 0.5 (μs) * 256(PRS) ) ) ≒ 178 


TMR0の初期値の設定方法のまとめ
---
**TMR0の初期値 = 256 - 任意の割り込み発生間隔 (s) /（ 1命令サイクル周期 (s) ×  プリスケーラ比 ）**
※ 1命令サイクル周期：使用クロックが8MHzなら(1/8000000) * 4 = 0.5 (μs)

**Timer0で100ms等の長い割り込み発生間隔を実現するには，割り込み関数内で変数をカウントして，一定数になったら割り込み処理を行うようにするといった方法がある．**

参考ページ
---
MICROCHIP　PIC16(L)F1764/5/8/9　日本語PDFデータシート
https://akizukidenshi.com/download/ds/microchip/PIC16F1764_PIC16LF1769_j.pdf

PICで遊ぶ電子工作 TMR0割込みを使ってみる(LEDを点滅させる) 
http://mitt.la.coocan.jp/pic/pic5_05.html]

まくまくいろいろノート タイマ 0 を使用する ─ PIC めもめも 
https://maku77.github.io/memo/pic/asm/timer0.html

【きむ茶工房ガレージハウス】タイマー割込みを使ってLEDを点滅させます 
http://zattouka.net/GarageHouse/micon/MPLAB/12F1822/TIMERtoLED/TIMERtoLED.htm

PICマイコンと電子工作 インターバルタイマと割り込み 
http://picmicom.web.fc2.com/practical/tmr0.html

PIC18内蔵モジュールの使い方 タイマー0,1,2,3の使い方 
http://www.picfun.com/pic18/mod1803.html

https://wak-tech.com/archives/292
【Rails】Deviceでのユーザー登録時に、ランダム尚且つユニークなアプリ内IDを自動付与&後からユーザー自身で変更可能にする。

## はじめに
TwitterやInstagramでもユーザー名とは別でアプリ内IDがありますが、
そのイメージのやつを実装します。

自身のポートフォリオで実装しており、
当初は新規登録時にユーザーにて入力してもらっていましたが、
まずはランダムでアプリ内ID付与し、後から変更可能とするのが、
ユーザー目線かなぁ　と感じ、後付けで実装しましたので、流れを記事にしました。

## 実装イメージ
+ public_uid gemを使用
+ Deviceでの新規登録時にアプリ内IDを自動付与
+ 後からユーザー自身で変更可能

## 前提
+ Rails5
+ 既にUserテーブルはできている

## 参考にさせていただいた記事
+ [deviseで会員登録時に乱数（ランダムな文字列）を生成](https://asalworld.com/1472/)
+ [updateの時だけvalidationを実行させる](https://www.cotegg.com/blog/?p=2300)
+ [GitHubのREADME.md](https://github.com/equivalent/public_uid)

## 実装

### public_uid gemをインストール
データをDBに登録するときに、ランダムな文字列を生成してくれるgemです。
デフォルトだとHexString（16進数）で生成されます。

```ruby:Gemfile
gem 'public_uid'
```

```
bundle install
```

### public_uidカラムを追加
アプリ内IDのカラムをstring型でUserテーブルに追加します。
※カラム名は何でも大丈夫ですので、既にカラムがあるかたは飛ばしていただいてOKです。

```
rails g migration AddColumnPublicUidToUsers public_uid:string
```

```
rails db:migrate
```

### Userモデルにpublic_uidを自動生成するコードを付与

```/app/models/user.rb
class User < ApplicationRecord
#下記1行追記
  generate_public_uid
end
```

なお、public_uidというカラム名であれば上記でOKですが、
別のカラム名にしている場合は下記追記してください。

```/app/models/user.rb
class User < ApplicationRecord
  generate_public_uid column: :カラム名
end
```

また、上記で参考記事で挙げていますが、
ここで文字数指定や数字だけにもできます。（デフォルトは8文字の英数字です。）
[deviseで会員登録時に乱数（ランダムな文字列）を生成](https://asalworld.com/1472/)

ここまで完了すれば自動付与は完了です。

### Userモデルにpublic_uidを自動生成するコードを付与
最後にユーザー自身で更新できるようにします。
そのため、バリデーションをかけたいですが、
普通にvalidates :unique_code, presence: true,を記載すると、
新規登録時に自動付与の前に引っ掛かってしまい進めません。
今回は更新時のみバリデーションをかけたいので、on: :updateを記述します。
下記に例を記載します。

```/app/models/user.rb
class User < ApplicationRecord
  generate_public_uid column: :カラム名

  # 5-12文字の半角英数字（更新時のみのバリデーション※新規登録時には自動でランダム登録）
  validates :unique_code, presence: true, on: :update
  validates :unique_code, format: { with: /\A[a-z0-9]+\z/i }, on: :update
  validates :unique_code, length: { minimum: 5, maximum: 12 }, on: :update
end
```

これで実装は完了です。
新規登録時にアプリ内IDを自動付与、
後からユーザーにて変更できるはずです。
Remote Developmentでタイムアウトエラーが発生した

# 目的

- VScodeの拡張であるRemote Developmentでssh接続時にタイムアウトエラーが発生したので原因をメモ的に記載する

# 条件

- .ssh configファイルに正しい接続先の情報が記載されていること。

# 原因

- ESETというセキュリティソフトがsshの通信を遮断してしまっていた。

# エラー内容

- ssh接続先を指定してRemote Developmentを用い接続を行おうとすると下記のようなポップアップが出てタイムアウトエラーが発生してしまう。

    ![Untitled-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/7215276e-a88f-8563-433d-7e79bd7a3904.png)

# 解決方法

- 下記のようにESETのパーソナルファイアウォールを無効にした。

    ![空白_Skitch_キャンバス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ffd3f969-3ce7-d67f-258e-11fa871f3461.png)
VirtualBoxをインストールしてみる

# はじめに

目次みたいな記事を書いたら注意されたので、削除しました。
やりたいことの備忘録を以下に書きます、これもダメなら削除します。

- VirtualBoxをインストール　←この記事はこれ
- Lubuntuをインストール
- Javaをインストール
- VSCodeをインストール
- Springでアプリをつくる

# VirtualBoxをインストール

## ダウンロード

以下のWebサイトへ行き「 Windowsインストーラ 」をクリックしてファイルを取得します。
https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html

![FireShot Capture 004 - Oracle VM VirtualBox - ダウンロード - Oracle 日本 - www.oracle.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/9e770f97-5bde-c812-f954-47dd82452261.png)

## インストール

![2021-02-12_09h32_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/dc8c3771-7a09-5089-9227-0312f92b454d.png)
「VirtualBox-6.1.14-140239-Win」というファイルをクリックしインストールを始めます。

---

![2021-02-12_09h34_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/0e3d3de4-88cb-13b3-fbdf-f639d4829345.png)

セットアップが開始されます。
「Next >」を押下します。


---

![2021-02-12_09h35_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/cb9810e1-748b-b732-530b-33dd75fb671d.png)

インストール場所などを聞かれますが、そのままにします。
「Next >」を押下します。

---

![2021-02-12_09h35_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/57879cc4-a0fc-14b9-4427-8b054f27176f.png)

オプションを聞かれます。
「Create a shortcut in the Quick Launch Bar」だけチェックを外します。
※：好みの問題なので、どれを選択してもインストールはされます。
「Next >」を押下します。

---

![2021-02-12_09h36_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/305469b3-a51a-e51c-f739-b7310831408b.png)

準備ができたのでインストールをします。
「Install」を押下します。

---

![2021-02-12_09h36_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/ee94eed7-0fd7-ac6c-7974-7dad28dceffe.png)

インストールが始まります。
なにも操作せずにしばらく待ちます。

![2021-02-12_09h36_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/726a9d1b-ce75-f024-aa0f-96eba19f5973.png)

しばらくすると、インストールが終了します。
「Finish」を押下します。


# VirtualBox起動

![2021-02-12_10h01_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/31d13046-f897-608c-f47f-5974af67c0eb.png)

インストールが終わると、自動的にVirtualBoxが立ち上がります。

しばらくすると、以下のダイアログが出ます。

![2021-02-12_09h36_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1103659/d774f135-c018-aadb-943e-411666f0da3a.png)

（∵）ﾍ?

ダウンロードページには、以下の文言があったのに・・・

> Oracle VM VirtualBox
> 最新リリースはバージョン6.1.14です。

とりあえず、クリックしても反応がないのでとりあえず、インストール終了とします。

# まとめ

ポチポチ押していたらインストールできました。
最後に、最新バージョンがあるとか出てきて混乱しましたがorz
エンジニアリングを活用するとは？そもそもエンジニアリングとは？

## なに？

とあるツイートで「*デザイナは無意識のうちにデザインの思考や方法論を他にも活用している*」というようなものがあって。
ではエンジニアのわたしは「エンジニアリング」の力をどうやって他の分野に活用しているんだろ？と思い、ついでに「エンジニアって何？」と思ってる人の助けにもなるかなと整理してみました。

## そもそもエンジニアリングとは？

エンジニアリングは基本的には「**工学**」のことです。 詳しくはWikipediaとか見てもらうとして、簡潔に言うと「**エネルギーを、数学や科学の知見を活かして、良いことに使う**」のが「工学」つまり「**エンジニアリング**」です。

ここでいう「**数学や科学の知見**」とは、科学的手法、つまり「**原因と結果を記録して、分析して、その因果関係を考えること**」と考えてよいと思います。大事なのは「記録」と「分析」と「考察」です。

## あらためてエンジニアリングを活用するとは？

とってもシンプルです。

エンジニアリングは「エネルギーを利用して良いことに使う」ことです。
これは例えば、ガソリンを入れて車が走る、電気でライトが光る、アクセス分析で売り上げを上げる、ピストン運動を円運動に変換する、なんでも、**なにかインプットを変換して役立つアウトプットに変える**、ことです（これがエンジニアリングの本質です）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/d707a8d2-712c-bfbc-d9de-6d9c17c50b46.png)

言い換えると Input → Process → Output です。基本的に Input と Output は与えられるもので、Process（変換）部分を重視するのがエンジニアリングの特徴と言えると思います。

これを実現するためにエンジニアがやることもとってもシンプルです。

- まず**記録**すること・・・言い換えると「構成要素」、つまり、解決したい問題や未来とは？それは何から構成されているか？を見つけることです。
- それを**分析**する・・・こまかく言うと「分解」と「分類」をします。エンジニアもただの人間なので、あんまり複雑な問題は手に負えません。扱いやすい適切な大きさにします。
- どうやってあるべき姿にするかを**設計**する・・・インターネットを使う、プログラミングをする、人手に頼るなど、未来の姿に変わるためにどうするかを考えます。
- （あと最後にテストもあります←これ大事）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/ca776696-52a4-0c00-9329-d30089cf880e.png)

基本的にエンジニアがやることはこれですし、これがエンジニアリングです。

「設計」のところでITスキルや数学などを使う事が多くありますが、あるべき姿に快適さ快美性が求められるのであれば認知科学や心理学を使う事だってあります。（ それは単に利用する技術や専門性の問題であって、エンジニアリングかどうか、とはあまり関係の無い話です ）

あと、しつこいですが、もう一回言いたいこと。
エンジニアリングは「インプットされたエネルギーを利用して良いことに使う」です。Wikipediaの定義を見ておきます。

> エネルギーや自然の利用を通じて便宜を得る技術一般。
> 数学と自然科学を基礎とし、ときには人文科学・社会科学の知見を用いて、公共の安全、健康、福祉のために有用な事物や快適な環境を構築することを目的とする学問。

いいでしょうか。「**便宜を得る**」「**有用な物事や快適な環境**」です。何かインプットを変換して悪いことをするのはエンジニアリングじゃないし、そんなことするのはエンジニアじゃないです。



## まとめ

まとめてみるととってもシンプルは話でした。

インプットを変換して良いアウトプットを出す。

わたしが「エンジニア」として色々な分野でやっていけるのは、基本的にこの考えをしっかり持っていることが強みです。もちろんプログラミングとかのスキルもありますが、、、必要なスキルは勉強するか、他から調達すればいいだけなので、それよりはこの考え方が強みだと思ってるし、（ITスキルがあまり出てこない案件だったとしても）これがあるから自分をエンジニアと名乗ってます。

こんなの当たり前だと思ったかもしれませんが、うん、意外と当たり前のことなのです。 そう思った方は立派なエンジニアとしてぜひ世の中をより良くするためにがんばりましょう！

---


## 蛇足． とはいえ

そうはいっても…わたしの場合はそこそこ自慢できるくらいにはコンピューターの知識やプログラミングスキルがあってそれが「自信」になっているのは確かな事です。 「エンジニアリングとはこんなシンプルなことです」という逆側で、しっかりプログラミングができる、システムを構築できるといった実装力や実行力はやっぱり必要です。それがないと結局「絵に描いた餅」で世の中をよくすることが出来ないからです。口だけではエンジニアとはやっぱり呼べません。

## 蛇足． ややこしい話（読み飛ばして良い）

エンジニアリングのややこしいところは、問題の解決プロセスそのものもエンジニアリングだし、解決した結果もエンジニアリング、でフラクタルになっているところです。（このややこしさはエンジニアリングに限らずですが・・・）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/26ffb2af-1ac1-f1b2-7d78-a3f2839ae49c.png)

問題解決のための人とのコミュニケーションもエンジニアリングであれば、結果できあがるECサイトも、そのECサイトの中の１モジュールもすべてがエンジニアリング的な要素を持っています。今自分がどういう視座にいるかを忘れるとややこしいことになります。
STM32G031と液晶、ACM1602K-NLW-BBWでHello Worldを表示(STM32G031J6M6)


x 原因は、わからないが液晶がちらつく場合は、ウェートを調整してね!!


STM32G031J6M6でArduinoを使い16文字2行液晶に
Hello Worldを表示するプログラム

74hc164シフトレジスターを使用した。
液晶とのピン数を節約した。信号線10本から
信号線3本に減らした。

1 CLK クロック端子(緑色)
2 RSDATA RS端子とデータの共有端子(黄色)
3 E 読み込み書き込み同期信号(青色)


![h_con39.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5ada8448-b79c-f0a6-2de5-5fbc5f31112d.jpeg)



```c++


#include <Arduino.h>

//*          *****  *****  
//*         *       *    * 
//*         *       *    *
//*         *       *    *
//*         *       *    *
//********   *****  *****

#define DW   digitalWrite

//#define swdclk   PA14 // 8pin
//#define swdio    PA13 // 7pin
//#define swdclk   PA11 // 5pin
//#define swdio    PA12 // 6pin
#define swdclk   PA12 // 6pin
#define swdio    PA11 // 5pin
//#define t_led1   PA12 // 6pin
//#define t_led2   PA11 // 5pin
#define en       PA0  // 4pin
#define in7      PB7  // 1pin

// tx PA14(PB6) 8PIN
// rx PC14(PB7) 1PIN

void setup() {
  // put your setup code here, to run once:

    delay(3000); //not Delete

    pinMode(swdclk,OUTPUT);
    pinMode(swdio,OUTPUT);
    pinMode(en,OUTPUT);
    pinMode(in7,INPUT_PULLUP);

    DW(en,0);
    DW(swdio,0);
    for(int i=0;i<10;i++){
        DW(swdclk,1);
        delay(15);
        DW(swdclk,0);
        delay(15);
    } //for
}


int v;
int rs;
void seg1()
{
    DW(swdio,(v>>7)&1);DW(swdclk,1);DW(swdclk,0); //7
    DW(swdio,(v>>6)&1);DW(swdclk,1);DW(swdclk,0); //6
    DW(swdio,(v>>5)&1);DW(swdclk,1);DW(swdclk,0); //5
    DW(swdio,(v>>4)&1);DW(swdclk,1);DW(swdclk,0); //4
    DW(swdio,(v>>3)&1);DW(swdclk,1);DW(swdclk,0); //3
    DW(swdio,(v>>2)&1);DW(swdclk,1);DW(swdclk,0); //2
    DW(swdio,(v>>1)&1);DW(swdclk,1);DW(swdclk,0); //1
    DW(swdio,(v>>0)&1);DW(swdclk,1);DW(swdclk,0); //0
    DW(swdio,rs);   
    DW(en,1);       delayMicroseconds(40);
    DW(en,0);       
}

void loop() {
  // put your main code here, to run repeatedly:

    //ファンクションセット1
    rs=0;
    v=0x30;seg1();
    delay(5);    
 
    //ファンクションセット2
    rs=0;
    v=0x30;seg1();
    delay(1);   
 
    //ファンクションセット3
    rs=0;
    v=0x30;seg1();   
 
    //ファンクションセット 2ラインモード
    rs=0;
    v=0x38;seg1();   
 
    //表示オフ
    rs=0;
    v=0x08;seg1();   
 
    //画面クリア
    rs=0;
    v=0x01;seg1();
    delay(2);         
 
    //エントリーモードセット
    rs=0;
    v=0x06;seg1();     
 
    //表示オン
    rs=0;
    v=0x08+0x04;seg1(); 
  
    //@文字の表示
    rs=1;
    v='@';seg1();
    delay(500); 
 
    //1ライン目にカーソルを移動
    rs=0;
    v=0x80+0x00;seg1();
 

    int ii;
    char ss1[]="Hello World !";
    ii=0;
    while(ss1[ii]!=0){
        //文字の表示
        rs=1;
        v=ss1[ii];ii++;seg1();
    } //while
 
while(1){} //無限ループ

} //loop

```

![lcd_031_hloo_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9a8aa36e-d6da-03e3-da17-506365400333.jpeg)


![led_sift_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a1c8efa5-6869-226b-0060-671e31351360.jpeg)

![7seg_b_g031_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1d350c5a-9725-b0b9-2472-e9f0aa3e8249.jpeg)
413 Request Entity Too Largeの解決方法

Laravel初学者です。
オリジナルアプリを作成しているのでその過程を記事にしています。

理解が曖昧なところも多いため、ご指摘等ありましたらご連絡いただければ幸いです。

今回は
`413 Request Entity Too Large`
が出たのでその解決方法を記録として残します。


## 環境

|                | Version     |
|:---------------|------------:|
| PHP            | 7.4.14      |
| Laravel        | 8.24.0      |
| mysql          | 8.0.23      |
| docker         | 20.10.2     |
| docker-compose | 1.27.4      |

## エラー発生

画像を投稿する画面で画質の高い画像を送信した際にエラーが発生しました。

![スクリーンショット 2021-02-11 16.24.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/9d4b3d9e-3f53-2d57-982f-ee5ea8232eb8.png)

エラー文を見る限り`画像大きすぎですよ`というエラーですね。
下に`nginx`と記載されているのでどうやらnginxのエラーみたいです。

## 解決

[こちらの記事](https://qiita.com/rope19181/items/a02fe5cfab9cf1e80d02)を参考にさせていただき解決できました。
ありがとうございます！

>Nginxはデフォルトでは最大のアップロードのサイズが1MBとなっているようです

とのことです。

自分のnginxの`default.conf`ファイルを開き

```PHP:default.conf
server {
    listen 80;
    server_name example.com;
    root /work/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    //以下を追加する
    client_max_body_size 10M;
    }
```

上記の記述をしただけでは反映されないのでnginxを再起動(私の場合はDocker環境なのでDockerを再起動しました)で解決です。

以上です。
AWSクラウドプラクティショナー試験対策　AWSクラウドの概念編

# はじめに
　この分野は「AWS認定クラウドプラクティショナー」という書籍によると、本試験の26％を占めるらしいです。つまりここを覚えるだけで知識0から26点は取れるという訳ですね。



<!-- 各チャプター -->
<a id="#クラウドの概念とメリット"></a>
# クラウドの概念とメリット

【クラウドとは】
　クラウドとは、「インターネット経由で他のコンピュータを使えるよ」ということです。その際に利用した分だけ支払うもの（従量課金制という）であるというのが特徴として１つ挙げられます。

【オンプレミスとは】
　自分たちで買うサーバーのことです。（厳密にはそうではありませんが、ここではそういうことにします）。OSのインストールやら、サーバーを保管する場所の管理やらで手間がかかります。

【AWSクラウドを使うメリット】
１．サーバー費用が、固定費ではなく変動費になる
　自社でサーバーを買った場合、サーバーを設置する場所や、サーバーそのものは「固定費」として支払わなければなりません。しかし、AWSを使用すれば、厳重に管理されたサーバーを使わせてもらうだけなので、それらの費用がかからないのです。使った分だけお金がかかる、つまり「変動費」になるという訳です。

２．Amazonがデカい会社なので値段が安くできる
　参考書には「スケールによる大きなコストメリット」と書かれていました。しかし、この表現は直感的に分かりづらいので変えさせていただきました。Amazonはデカい会社でみんなが使ってくれるから、安くしても儲かるよ、だから安く提供できるよ、ということです。

３．キャパシティ予測が不要
　オンプレミス（自社で買う）と、そのサーバーを買う前に、それ自体の性能がどれくらいの物が良いのか検討しなければいけない。しかし、AWSを使うなら後からいくらでも変更ができるので、その必要がなくなる。

４．早い
　オンプレミスだとOSのインストールやら、サーバーの設置やらで時間がかかる。しかし、AWSを使用する場合はそれらが必要ないので早い。
　また、例えばアメリカにサーバーを設置したいとなれば、オンプレミスであればそこまで出向かなければいけない。しかし、AWSであればWebページからポチポチするだけでアメリカにあるサーバーを使用できる。

５．サーバーを置く場所そのものの管理が不要になる
　サーバーを置く場所（以下”データセンタ”）の管理をしなくて済むということ。オンプレミスだとデータセンタのセキュリティや冷房管理などのコストがかかる。しかし、AWSを使用すればAWSの提供するサーバーを借りているだけなので、それらのコストがかからなくなる。




<a id="#クラウドで設計を行う場合に重要な点"></a>
# クラウドで設計を行う場合に重要な点

１．故障しないように作る（当たり前）。だが、この故障しないように作るというのをAWSで「Design for failure」というので覚えておいた方がいい。

２．部品分けする
　参考書には「システムのコンポーネントを疎結合にする」という眩暈を起こしそうな文章が書かれているので変更。なんらかの原因でシステムの一部が動かなくなっても、他の部分には影響しないように、部品分けしようねということです。全体を一個の部品にすると大変なことになります。
　例えば、あなたがこの記事を読んでいる最中にPCが停止したら、あなたはこの記事を読むのをやめるしかなくなります。何らかの原因でPCが動かなくなったことによって、あなたも勉強できなくなりました。あなたが勉強を続行するにはPCをなんとか動く状態にしなければなりません。
　システムでもこの状態が発生すると、ある場所が壊れたせいで、他の場所も動かなくなった～ということになります。これでは困るので、あまり互いに影響しないように設計しましょうねという訳です。

３、柔軟性の実装
　システムの性能を上げたり下げたりできるようにしようねということです。AWSサーバを借りている訳なので、使った分だけお金が取られて行きます。しかし、本来使わないんだけど無駄にサーバの性能が高かったとなると余計な費用がかかります。なので、その本来使わない場所を使わないようにしようねということです。

４．並列化
　並列処理させるようにしましょうということです。同じような処理を１つの場所でやるのではなく、複数の場所で行うことによって高速化を図ることを並列化といいます。
　コンビニのレジという同じような処理を１人でやるのではなく、複数人でやりましょうということです。ここでお客さんがじゃあどのレジに並べばいいのかを指示してくれる存在を「ロードバランサー」と呼びます。

５．使う人の近くにデータを置く
　参考書では「動的コンテンツデータをコンピュータの近くに、静的コンテンツデータをエンドユーザーの近くに保管する」と書かれています。
　静的データ（ユーザーが見る場所としておきます）はユーザーの近くのサーバ―に設置した方がアクセスが早くていいですよね。日本からブラジルサーバーに接続するより、東京サーバーにアクセスする方が早いはずですから。
　動的データ（データベースの変更など）は一度一か所に集めて一括で処理した方がいいですよね。いちいち別な場所で処理をしていたら、統一性を持つのが大変ですから。

<a id="#重要点まとめ"></a>
# 重要点まとめ
・クラウドはインターネット経由でコンピュータを借りるサービスである。
・オンプレミスとは自分で用意するコンピュータのことである
・AWSにはメリットがたくさんある。全部覚えた方がいい。
・AWSを使用するシステム設計でやるべきこともたくさんある。全部覚えた方がいい。

<a id="#reference"></a>
# 参考文献
- [AWS認定資格試験テキスト　AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/dp/B07QX45RXM/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)