OmniAICreator/Qiita-1.07M huggingface dataset:
OAuth2.0の役割とフローついて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257568/6535151c-e732-5721-c9c2-c8c5f83f4055.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257568/bab3f099-a7c3-8e07-824b-e8df7f5ad134.png)

詳しく把握していなかったのでこちらを読んで

## OAuth2.0とは
**リソース所有者の代わりとして保護対象リソースへのアクセス権をクライアントに与える通信規約**

- 移譲プロトコル
- セキュリティに関するプロトコル
- ある要素から別の構成要素にアクセス権を渡すためのもの
- 1.0が存在し、現行のバージョンが2.0

## OAuthを成立させる要素
主に4つの要素で成立する

- リソース所有者(Resource Owner)
- クライアント(Client Application)
- 認可サーバー(Authorization Server)
- 保護対象リソース(Resource Server)

### リソース所有者(Resource Owner)
APIへのアクセス権を持ち、そのAPIへのアクセス権を委譲できる所有者のこと

リソースの所有者は人である必要はなく、アプリケーションであることもあり得る

### クライアント(Client Application)
リソース所有者の代わりに保護対象リソースにアクセスするソフトウェアのこと

### 認可サーバー(Authorization Server)
アクセストークンをクライアントに発行するサーバーのこと

### 保護対象リソース(Resource Server)
リソース所有者がアクセス権を持っているリソースのこと

- Web API
- リソースとはAPIなのでCRUDの操作も行える

### OAuth2.0のフロー
1. リソース所有者(Resource Owner) -> クライアント(Client Application)  
  - リソース所有者がクライアントを使用する

2. クライアント(Client Application) -> 認可サーバー(Authorization Server)  
  - クライアントを使用しているリソース所有者が認可サーバーへ承認リクエストをする

3. 認可サーバー(Authorization Server) -> クライアント(Client Application)  
  - クライアントを使用しているリソース所有者にクライアントを認可するかどうかのリクエストをする

4. クライアント(Client Application) -> 認可サーバー(Authorization Server)  
  - クライアントを使用しているリソース所有者は利用するデータセットやスコープを指定しつつ認可をし、権限が付与されたクライアントは認可サーバーにアクセストークンをリクエストする

5. 認可サーバー(Authorization Server) -> クライアント(Client Application)  
  - 認可サーバーはアクセストークンを発行し、クライアントに送る

6. クライアント(Client Application) -> 保護対象リソース(Resource Server)  
  - アクセストークンを保護対象リソースに送る

7. 保護対象リソース(Resource Server) -> クライアント(Client Application)  
  - 保護対象リソースがリソース所有者によって認可されたことを示すアクセストークンを確認し、要求されたリソースをクライアントにレスポンスする

## ポイント
- リソース所有者のクレデンシャル(IDやパスワードなどの実際の値)がクライアントに知られることはない
- クライアントは自分自身だけでアクセスできるものは何もない
- クライアントはアクセス情報を持たない代わりに、保護対象リソースにアクセスできるようになる前に正当なリソース所有者によって認可を求める
- アプリケーションに依存しない
- ネットワークに依存する
- アプリケーションに依存しないのでマルチデバイスに対応できる

## OAuth2.0の注意点
OAuth2.0とは**トークンの取得方法とそのトークンの使用方法**に関すること

- HTTPプロトコルが必須
- 認証プロトコルではない
- 権限移譲をする時の中身までは定義していない
- 暗号化については定義していない
- 複数の定義とフローに分かれていて単一のプロトコルではない

## 書籍情報
Justin Richer, Antonio Sanso. OAuth徹底入門
https://amzn.to/2W8KlzH

Moore, Joseph. OAuth 2.0: Introduction to API Security with OAuth 2.0
https://amzn.to/310Wxpu

## 雑感
シーケンス書くのにPlantUML使ってみようか。
[Flutter] Web用のpubspec.yaml

ウェブサイト開発もデサントがもっと近いかな？　Flutterでつくれますね。
えーと、よく見ると、dependenciesの部分は少し違いますね。
忘れないように記録します。

```yaml
name: flutter_web
description: An app built using Flutter for web

environment:
  # You must be using Flutter >=1.5.0 or Dart >=2.3.0
  sdk: '>=2.3.0-dev.0.1 <3.0.0'

dependencies:
  flutter_web: any
  flutter_web_ui: any

dev_dependencies:
  build_runner: ^1.4.0
  build_web_compilers: ^2.0.0
  pedantic: ^1.0.0

dependency_overrides:
  flutter_web:
    git:
      url: https://github.com/flutter/flutter_web
      path: packages/flutter_web
  flutter_web_ui:
    git:
      url: https://github.com/flutter/flutter_web
      path: packages/flutter_web_ui

```
FPGAボードのリスト

#Lattice (4入力LUT) 

|ボードメーカー名|ボード名|価格(US$)|Logic Cells|FPGAシリーズ名|	
|:--|:--|--:|--:|:--|
|TinyFPGA|TinyFPGA BX|38|7,680|ICE40LP8K|

# Intel (4入力LUT) 

|ボードメーカー名|ボード名|価格(US$)|Logic Cells|FPGAシリーズ名|	
|:--|:--|--:|--:|:--|
|Trenz Electronic|CYC1000|34|24,624|Cyclone 10 LP|
|Terasic|DE10-Lite|85|50,000|MAX10|

#Intel (6入力LUT)

|ボードメーカー名|ボード名|価格(US$)|Logic Cells|FPGAシリーズ名|	
|:--|:--|--:|--:|:--|
|Terasic|DE10-Nano|130|110,000|Cyclone V SE|
|Arrow Electronics|BeMicro CV A9|149|301,000|Cyclone V E|
|NovTech|CHAMELEON96|155|110,000|Cyclone V SE|

#Xilinx (6入力LUT)

|ボードメーカー名|ボード名|価格(US$)|Logic Cells|FPGAシリーズ名|	
|:--|:--|--:|--:|:--|
|Avnet|Ultra96-V2|249|154,350|XCZU3EG|
|Trenz Electronic|TE0725LP-01-72C-1|133|101,440|Atrix-7|
|TUL|PYNQ-Z2|119|85,000|XC7Z020|	
|MyiR|MYS-7Z020-C-S|119|85,000|XC7Z020|
|Xilinx|ZCU104 Evaluation Kit|895|504,000|XCZU7EV|	
|Digilent|Arty S7-50T|119|52,160|Spartan-7|


以上。
Oracle Groundbreakers Japan Tour in Okayama 個人メモ

https://okajug.doorkeeper.jp/events/91026

- Gerald Venzlのセッションは、スクリーンとの接続トラブルによりスキップ
- 「成功するJavaユーザグループの作り方」もNikhil NanivadekarのKafka、Erno VenalainenのIoTのセッションに変更

---
# Big Data Exploration with Spark SQL and Java By Fernando Babadopulos

- データサイエンティストとどのようにデータを交換するか。  
→Sparkフレームワーク
- Spark Notebook
    - マークダウンをサーバー側で処理
    - コードを実行して結果を返す
- データは内部でjson形式のプレインテキスト
- csvを取り込んで表示できる。データフレーム
- 基本データはStringだが、データ型を指定できる。
- .filterによりデータの絞り込みができる。
- .sort並べ替え
- ユーザー定義関数をJava/Scalaで定義して名前を付けて登録し呼び出せる。
- SQLのようにdistinct, groupbyなども使える。
- 棒グラフや円グラフへプロットできる。  
データ定義を変えて再実行するとグラフもすぐに変わる。
- 直接SQLを記述することもできる。
- テキストでの表形式だけでなく、リアルタイムで検索窓から絞り込みできる表示形式にもできる。
- データの処理結果をpersistにより、他の処理でも使えるデータとして永続化できる。  
unpersistによりキャッシュをクリアできる。

---
# Using Microprofile to develop microservices for IoT platform By Victor Duran
- 自動車には5枚のSIMカードを積んでいる。
- 砂漠に水の貯蔵庫を設置できる。
- 5Gの特徴
    - 低周波へシフトしていく
- 膨大な数のデバイスをどのように制御するか。
- 2週間で書き換え可能な小さいマイクロサービス
- Entity-Control-Boundaryパターンに基づくサービス
    - Boundary：ユーザー境界
- マイクロサービス
    - ファンクションへ細分化していく。問題を小さくする。
    - 同期呼び出しを避ける。
    - データの分離。サービスごとに1データベース。
    - 価値
        - 独立して動ける
        - ライフサイクルが別なのでいつでもデプロイできる
        - 顧客の価値に集中できる
    - 避けること
        - 分散型モノリスのような結合度の高いサービス
        - DBトランザクションの不在
    - デプロイ
        - コンテナごとにサービスを立てる
    - テスト
        - 結合テストが厚いダイヤモンドアプローチ

---
# Getting Started Kafka By Nikhil Nanivadekar
- 最初、日本語でスピーチを始めてくれた。そのまま日本語でしてくれるのかと思いきや、限界を迎えて英語に切り替わった。
- Kafka
    - トランザクションログ データベース
    - Producer(データを生み出すもの)とConcumer(利用するもの)を分離する
    - メッセージが生み出された順序を保持する
    - 単一のProducer、複数のConcumer
- コンポーネント
    - Zookeeper:
        - 駅のようなもの？
    - Broker / Server:
        - メッセージの保存と保持
    - Topic:
        - メッセージの論理的な分離、レール・○○線の比喩（行き先が違う）
    - Producer:
        - メッセージを生み出しTopicへ発行する
    - Consumer:
        - メッセージを受け取る
        - グループ化できる
- クラスター構成でき、Brokerが1つ死んでも影響がない。
- Producerが複数のパーティションへメッセージを配布する。
- Consumerのプロセスが終了した後に発行されたメッセージがあれば、その差分を受け取れる。
- Zookeeperが各Concumerグループがどこまでメッセージを受け取ったか覚えている。

---
# Erno Venalainen
- IoT: バイクとイベント会場の場所を地図上にマッピングするデモ
- いくつかの層に分かれる
    - デバイス
    - 通信
        - 2G / 3G / Bluetooth / WiFi
　　- デバイスクラウドサービス
　　- リアルタイムシステム
        - k8sのクラスター
　　- 分析システム
- DBはリアルタイムシステムと分析システムの中間に位置する。
【Ruby】Date型、DateTime型の計算

簡単なのに忘れがちなDate型、DateTime型の計算方法について。
計算方法というよりは計算結果についての備忘録だけど。
（ ※ 計算結果は2019-06-01 時点 ）

**実行環境**
**Ruby 2.5.1**

# Date型の計算
### 誕生日から今日までの経過日数を計算する

```ruby
require 'date'

today = Date.today()
birthday = Date.new(1985, 11, 27)

days = today - birthday
#=> (12239/1)
```

**Date型の計算結果は「日数」で得られる。**
ということでこの世に生を受けて12239日経過していることがわかったが、なぜか整数ではなく分数のような形で出力されている。
試しにデータ型を調べる。

```ruby

today.class
#=> Date

birthday.class
#=> Date

days.class
#=> Rational
```
**Rational型？**
初見だったのでリファレンスで確認してみた。
[Ruby 2.6.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Rationalクラス](https://docs.ruby-lang.org/ja/latest/class/Rational.html)

**有理数??**
理系出身のはずなのに記憶が蘇ってこない、、、
助けてGoogle先生！
> 【有理数とは】実数のうち、整数か分数かの形で表せる数の総称。

なるほど。
ということで、整数型にしたければ単純に **to_i** してあげれば良さそう。

```ruby
days.to_i
#=> 12239
```

# DateTime型の計算
### 1日の勤務時間を計算する

```ruby
require 'date'

work_from = DateTime.new(2019, 06, 01, 10, 00, 00)
work_to = DateTime.new(2019, 06, 01, 18, 00, 00)

work_times = work_to - work_from
#=> (1/3)
```
**DateTime型も計算結果は「日数」で得られる。**
そしてもちろんRational型。

勤務時間（h）を得たければ24を掛ける。

```ruby
(work_times * 24).to_f
#=> 8.0
```

以上。
docker-compose upでエラー「ERROR: In file './docker-compose.yml', volume must be a mapping, not a string.」が発生する

# はじめに
docker-compose.ymlを作成して、「docker-compose up -d」を実行したところ、以下のようなエラーメッセージが表示されました

ERROR: In file './docker-compose.yml', volume must be a mapping, not a string.

# 対処法
volumes:key部分に:（コロン）がなかったため、発生していました

# docker-compose.yml
## エラー時

```docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    volumes:
      - db-volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
volumes:
  db-volume
```

## 修正後
### 最後の行に:（コロン）を追加する

```docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    volumes:
      - db-volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
volumes:
  db-volume:
```
変数宣言

##いろいろな書き方
`package main`, `import`は省略しています

```go
func main() {
	var i int = 1
	var f64 float64 = 1.5
	var s string = "test"
	var t bool = true
	var f bool = false
	fmt.Println(i, f64, s, t, f)
}
```
###`var t bool = true`と`var f bool = false`をまとめて書く

```go
var t, f bool = true, false
```
###`var`がたくさん…なら、まとめて書こう

```go
func main() {
	var (
		i    int     = 1
		f64  float64 = 1.5
		s    string  = "test"
		t, f bool    = true, false
	)
	fmt.Println(i, f64, s, t, f)
}
```
###初期値を表示させる
```go
func main() {
	var (
		i    int
		f64  float64
		s    string
		t, f bool
	)
	fmt.Println(i, f64, s, t, f)
}
//出力結果
//0 0   false false
//stringのところは空文字です
```
###`var`を使わずに宣言
```go
func main() {
	xi := 1
	xf64 := 1.5
	xs := "test"
	xt, xf := true, false
	fmt.Println(xi, xf64, xs, xt, xf)
}
```
`var`との使い分けは、`var`は関数外で宣言して呼び出して使えるが、ショート(`:=`)での宣言は関数内でしか使えない。

```go
var (
	i    int
	f64  float64
	s    string
	t, f bool
)
func hoge() {
	xi := 1
	xf64 := 1.5
	xs := "test"
	xt, xf := true, false
	fmt.Println(xi, xf64, xs, xt, xf)
}
func main() {
	fmt.Println(i, f64, s, t, f)
	hoge()
}
//これはOKです
```
###型を明示したい場合も`var`を使う
```go
func main() {
	xf32 := 1.2
	fmt.Printf("%T", xf32)
}
```
`Printf`で型を調べると`xf32`は`float64`とわかる。`xf32`の型を`float32`にしたいなら

```go
func main() {
	var xf32 float32 = 1.2
	fmt.Printf("%T", xf32)
```
としてあげればOK

>参考
現役シリコンバレーエンジニアが教えるGo入門(https://www.udemy.com/share/100BhMB0obeFpbTX4=/)
テストにjestを使っている人なら試す価値ありのMajestic

jestのテスト結果をguiでいい感じに見れるMajesticというのがあります。

https://github.com/Raathigesh/majestic

導入もすごい簡単で普段 `npm run test` とかでjestのテストを実行しているディレクトリで

```terminal
npx majestic
```

と打つだけです。

こんな感じでテスト結果を表示してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131625/bcd66406-a0e9-cf55-c044-8b91007f8ddb.png)
※公式画像から引用


普段ターミナル上でテスト結果を確認している時、どこかでテストが落ちた場合、「どのテストが落ちたんだ？」と画面をスクロールして落ちたテストを探すという不毛な作業をしていたんですが、Majesticで確認すれば落ちたテストがどれで、どういうエラーで落ちたのかすぐわかります。

また普段、以下のような感じでjestコマンドにオプションを渡して実行している場合、

```json
  "scripts": {
    "test": "NODE_ENV=test jest -i --coverage --forceExit",
  },
```

package.jsonを以下のように指定すれば、argsに渡されたオプションでjestを実行してくれます。

```json
  "majestic": {
    "args": ["-i --coverage --forceExit"],
    "env": {
      "CI": "true"
    }
  }
```


ただ `npx majestic` と打つだけなのでjestを使っている方は試してみてはどうでしょうか！
Power Queryでカレンダー

単なる作成例。詳細エディタに貼って使えます。

##ただの日付と曜日のリスト
終了日を定め、そこから遡る方式にしてみました。

```PQ:カレンダー生成
(カレンダー終了日 as date,遡る年数 as number) as table=>
let
    Source = List.Generate(
                    ()=>[日付=Date.AddYears(カレンダー終了日,-遡る年数),曜日=Date.DayOfWeekName(日付)],
                    each [日付]<=カレンダー終了日,
                    each [日付=Date.AddDays([日付],1),曜日=Date.DayOfWeekName(日付)]
             ),
    Custom = Table.FromRecords(Source)
in
    Custom
```
詳細エディタに貼ると、こんなかんじに。
![関数画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/6db34bcc-c2c8-431c-96a7-92efdcefa2ec.png)

日付とか入れて、「呼び出し」すると、こんなかんじ。
![呼出し語.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/7b31aa07-0e0e-ed26-3b35-3fdd37f04e54.png)
LaravelでデプロイするときにDB周りで困ったので備忘録

# LaravelでデプロイするときにDB周りで困ったので備忘録

本番にデプロイするためにDB設定

```text:.env
LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST={IPアドレス}
DB_PORT={ポート番号}
DB_DATABASE={データベース名}
DB_USERNAME={ユーザ名}
DB_PASSWORD={パスワード}
```


完了と思いきや...  

```text
Database [] not configured
```


エラー発生(´・ω・)


`{プロジェクト名}/database.php`を置き忘れていました。
git ignoreに入ってるんだね。
知らなった
CSS縦方向に中央揃えメモ

#CSSテキストを縦方向に中央揃えメモ

縦方向に中央揃えにしようとしたのですが、サイトで調べた方法を試してもなかなかうまくいかなかった。原因はdisplayプロパティへの理解不足でした。[こちらサイト](https://saruwakakun.com/html-css/basic/display)でdisplayプロパティについて詳しく解説されていたので参考にしました。

####適用したいhtml

~~~html
<header class="header">
    <div class="header_inner">
         <h1 class="header_title">title</h1>
         //////////
    </div>
</header>
~~~
####失敗したCSS
~~~css
.header_inner {
    vertical-align: middle
}
~~~

text-align, vertical-alignはインライン要素にのみ適用可能とのこと。h1タグはブロック要素なので上記コードを適用しても変更されない。
簡単にgRPCが叩けるOSSツール BloomRPC

gRPCを使ったサーバー側の実装をしているとき、curlでリクエストを投げたりクライアントのモックrpcを用意したりして動作確認を行っていました。
ここ辺りをもう少し手軽に投げたいなぁと思いツールを探していたところ、BloomRPCというOSSのツールを見つけました。
とても便利で使いやすかったので紹介します。

# GitHub
https://github.com/uw-labs/bloomrpc

# インストール

今回はMacにインストールしていきます。方法はGitHubページに記載してありますが非常に簡単で、以下のbrewコマンドを打つだけです。

```
brew cask install bloomrpc
```

# 使用方法

インストールが完了したらアプリケーションフォルダにBloomRPCが追加されているので開きます。
画面は以下のような感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134764/76dbc0ab-9102-ae51-859c-53ed9f53b4ba.png)

シンプルなので使用方法はだいたい見れば分かりますが、以下の流れで使います。

1. protoファイルの読み込み
2. 接続先の指定
3. rpcの選択
4. リクエストの中身の用意
5. 実行、結果の表示


### protoファイルの読み込み
使用するprotoファイルを読み込みましょう。左上の+ボタンを押してprotoファイルを指定します。
選択すると、左のバーに読み込まれたprotoファイルのrpcがずらっと表示されます。

### 接続先の指定
接続先は画面上部のバーに入力します。

### リクエストの中身の用意
実行したいrpcを左のバーから選択すると、画面中央にリクエストのJsonが表示されます。ここの各要素に指定したいパラメーターを入力します。

### レスポンスの確認
画面中央にある実行ボタンを押すとクエリが実行され、画面右に実行結果のレスポンスが表示されます。

### メタデータの指定
画面下部にメタデータを指定できる欄が用意されています。認証などでメタデータに要素を付加したい場合に利用します。


超シンプルで使い勝手がいいので積極的に使っていきましょう！
Firebase AuthのGoogleサインインで com.google.android.gms.common.api.ApiException: 12500 が出たときの対処

本当に大したことないんですが、小一時間ハマったので共有。

FirebaseやGoogle API Consoleがまっさらな状態で[公式ドキュメント](https://firebase.google.com/docs/auth?hl=ja)に従ってFirebase AuthのGoogleログインをセットアップしていくと、こんなエラーが出てログインに失敗した。

```
Exception com.google.android.gms.common.api.ApiException: 12500: 
 at com.google.android.gms.common.internal.zzb.zzz(Unknown Source)
```

原因は、Google API Consoleで「OAuth 同意画面」がセットアップされていなかったこと。OAuth同意画面を開いてサポートメールの部分をちゃんとしたメールアドレスを選択して保存すればログインできた。
3点が同一直線上の点か調べる

## 調べ方
[3点の回転方向を調べる](https://qiita.com/tydesign/items/d41ac74b5effd87141b8)
にて、
$dx2 \times dy1 = dx1 \times dy2$ の場合は、

3点は同一直線上の点であることがわかる。

## 例
$A=(2,3),  B=(7,6), C=(12,9)$ のとき
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384860/ef7a49c0-343f-1555-a457-758741addfee.png">

$dx2 \times dy1 = 10 \times 3 = 30$
$dx1 \times dy2 = 5 \times 6 = 30$
$dx2 \times dy1 = dx1 \times dy2$ なので 3点は同一線直線上の点。

## 3点が同一直線上の点の場合の配置パターン
![3点が同一直線上の点か調べる_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384860/2a3a997d-e6fe-3658-d574-ced7fe99df02.png)
① 点Aが点B,Cの間に配置されている
② 点Bが点A,Cの間に配置されている
③ 点Cが点A,Bの間に配置されている
のいずれかになる。

## 3点が同一直線上の点の場合の配置パターンの判定
① 点Aが点B,Cの間に配置されている
![3点が同一直線上の点か調べる_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384860/3f32db5e-e5c2-2d5c-e2c8-0007dcd5b147.png)
このとき、点Aを基点としているので、
dx1,dx2 のいずれか1つは負の数、
dy1,dy2 のいずれか1つは負の数になるので、
$dx2 \times dy1 = dx1 \times dy2$ かつ、
$dx1 \times dx2 < 0$ または、$dy1 \times dy2 < 0$
の場合、点Aが点B,Cの間に配置されている事になる。

② 点Bが点A,Cの間に配置されている
![3点が同一直線上の点か調べる_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384860/b6a2caa5-49c5-4d64-7a53-d1db461349ca.png)
線分ABと線分ACの距離を比較して、線分ABの方が短ければ、点Bが点A,Cの間に配置されている事になる。
[2点間の距離、中点の座標を求める](https://qiita.com/tydesign/items/04deff44972247fb1ea5)
線分ABの距離は、
$ AB = \sqrt{dx1^2 + dy1^2}$
線分ACの距離は、
$ AC = \sqrt{dx2^2 + dy2^2}$
計算を簡単にするために、各距離を二乗して平方根をなくした数を比較する。
ゆえに、
$dx2 \times dy1 = dx1 \times dy2$ かつ、
$ dx1^2 + dy1^2 < dx2^2 + dy2^2$
ならば、点Bが点A,Cの間に配置されている事になる。

③ 点Cが点A,Bの間に配置されている
![3点が同一直線上の点か調べる_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384860/4ebaa2a9-7c36-1323-89f5-396b5942df70.png)
線分ABと線分ACの距離を比較して、線分ACの方が短ければ、点Cが点A,Bの間に配置されている事になる。
（②の逆）
$dx2 \times dy1 = dx1 \times dy2$ かつ、
$ dx1^2 + dy1^2 > dx2^2 + dy2^2$
ならば、点Cが点A,Bの間に配置されている事になる。

## もっと簡単な調べ方
3点が同一直線上の点の場合の配置パターンは、
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384860/2a3a997d-e6fe-3658-d574-ced7fe99df02.png">
なので、距離を比較して
$ \mid AB \mid + \mid AC \mid = \mid BC \mid $
または、
$ \mid AB \mid + \mid BC \mid = \mid AC \mid $
または、
$ \mid AC \mid + \mid BC \mid = \mid AB \mid $
のいずれかが成り立つ場合、3点は同一直線上の点である。

## もっと簡単な調べ方のプログラム
**3点が一直線上にあるかどうか調べる**
( AutoLISP )

```scheme
(defun point:IsCollinear (a b c)
    (
        (lambda (ab ac bc)
            (or
                (equal (+ ab ac) bc 1e-8)
                (equal (+ ab bc) ac 1e-8)
                (equal (+ ac bc) ab 1e-8)
            )
        )
        (distance a b) (distance a c) (distance b c)
    )
)
;; < Example >
(point:IsCollinear '(2 3) '(7 6) '(12 9))
;; -> T
(point:IsCollinear '(2 3) '(8 5) '(5 9))
;; -> nil
```
Profiling Rust - macOS で DTrace を使って FlameGraph を描画する

# はじめに

* Rust のコードをプロファイリングして FlameGraph を描画する手順をまとめる。
* FlameGraph は横軸を CPU 実行時間、縦軸をコールスタックとするグラフで、関数同士の呼び出し関係や CPU 実行時間が視覚的にわかりやすく表現されるため、パフォーマンスチューニングなどに役に立つ。

# プロファイリング可能なバイナリを用意する

## プロファイリングできるように設定する

* Cargo.toml を変更してプロファイリングができるようにする

```toml:Cargo.toml
[profile.release]
debug = true
```

## ビルドする

* リリースバージョンでビルドする

```sh
cargo build --release
```

# DTrace でプロファイリングする

* 以下の通りにビルドしたバイナリを実行し DTrace でプロファイリングをする

```sh
sudo dtrace -c './target/release/your_binary' -o out.stacks -n 'profile-997 /pid == $target/ { @[ustack(100)] = count(); }'
```

## 各オプションの解説

* `-c` に実行コマンドを指定する。
  * 例はビルドしたバイナリファイル名が `./target/release/your_binary` である場合。引数などがあればこれに追記する。
* `-o` にプロファイリング結果を記録するファイル名を指定する
* `-n` にプロファイリング処理内容を記載する。
  * プロファイリング処理内容は dtrace のドメイン特化言語 D 言語で記載される。

## D 言語の解説

* D 言語の主な文法は `プローブ / 述語 / { アクション }` というものである。
* `プローブ` はプロファイリングを行うポイントを指定する部分。
  * 例のように `profile-997` と指定すると 997 ヘルツごとにプロファイリングの処理が差し込まれる。
* `述語` はプロファイリングのアクションを実行するかどうかを判定する部分。
  * 例のように `pid == $target` とすると PID が $target の場合にアクションを実行する。
  * `$target` は `-c` オプションで実行されたコマンドの PID が入っている変数。
* `アクション` はプロファイリングの処理。
  * `@[]` は集計関数
  * `ustack(100)` はユーザーのコールスタック 100 フレーム分を返す関数
  * `count()` は呼び出された回数を返す関数
  * 全部合わせると `ユーザーのコールスタックにある関数が呼び出された回数を数え上げる` という内容になる。

# FlameGraph を描画する

* FlameGraph を描画するプログラムをダウンロードする

```
git clone https://github.com/brendangregg/FlameGraph
```

* プロファイリング結果のファイルを使って FlameGraph の SVG ファイルを描画する

```
FlameGraph/stackcollapse.pl out.stacks | FlameGraph/flamegraph.pl > graph.svg
```

* 表示する

```
open graph.svg
```

# 参考サイト

* [Rust Profiling with DTrace and FlameGraph on OSX](http://carol-nichols.com/2017/04/20/rust-profiling-with-dtrace-on-osx/)
* [DTrace ユーザーガイド](https://docs.oracle.com/cd/E24845_01/html/E22189/toc.html)
良く使用するgitコマンド

最近ようやくgitを使い始めた。https://git-scm.com/book/ja/v2

**すべてのブランチについて最新のコミットの日付と見出しを表示する**

```shell
git for-each-ref --format="%(objectname:short=7) %(committerdate) %(contents:subject) %(refname)"
```
https://git-scm.com/docs/git-for-each-ref

**作業中のブランチからチェックアウトせずに、リモートブランチの変更内容をmasterに取り込む**

```shell
git fetch origin master:master
```
https://git-scm.com/docs/git-fetch


**masterの変更内容を作業中のブランチに取り込む**

```shell
git merge master
```
https://git-scm.com/docs/git-merge

**コミットログを出力**

```shell
git log --oneline --reverse
```
https://git-scm.com/docs/git-log
空気は読めなくてもバーコードが読めれば仕事ができる<かきかけ>仮説(98)

計算機は、空気が読めなくても、バーコードが読めれば仕事ができる。

人間も、空気が読めなくても、バーコードが読める計算機が手元にあれば仕事ができるかも。

名古屋でマイクロバーコードを企画開発している会社と仕事をしたことがある。

ほとんどすべての最終利用者の入力は、バーコードとする応用ソフトウェアの提案などである。

展示会などでは有効で、入場の際の名札にマイクロバーコードを印刷し、
入場者質問票も、バーコードから選ぶものをあらかじめ印刷しておいたり。

バーコードの基礎知識
https://ias.co.jp/support/know-kind1/

# 棒符号(bar code)
棒状符号（bar code)って、言葉のそのままの意味にも、大きさによって種類がある。

JAN(Japan Article Number)コード

ITF(Interleaved Two of Five)

NW－７

CODE39

CODE128


Universal Product Code

* UPC-A
* UPC-E

PDF417 

PDF49

RSS(Reduced Space Symbology）

# QRコード
二次元バーコード(Quick Response code)は、どちらも言葉のそのままの意味ではないかもしれない。日本のデンソーが発案し、デンソーウェーブが主体となり標準化を推進してきた。

ISO/IEC 18004:2015 
Information technology -- Automatic identification and data capture techniques -- QR Code bar code symbology specification
https://www.iso.org/standard/62021.html

QRコード読み取り
https://qiita.com/tool-taro/items/1923f948a1908255d5df

QRコードメモ
https://qiita.com/aria168/items/a40763ad9e53cf2f7661

QRコード生成
https://qiita.com/tool-taro/items/73d8e63b7a1ccc10ed3c

指定した文字列からQRコードを生成する
https://qiita.com/rubytomato@github/items/187e277b964b14f77179

# zxing
zxing
https://github.com/zxing/zxing

Delphi で Let's Zxing
https://qiita.com/pik/items/9a31f6eb7983bf2a574e

QRコードリーダー起動時、初回の権限確認を許可するとアプリがクラッシュする
https://qiita.com/HisakoIsaka/items/bf7f52d567e6dea52475

Unity で QRCode でバイト列を読み書きする
https://qiita.com/chiepomme/items/8f1052f61771df16a778

# まとめ（予定）
ICカードの発行、入力に対して、バーコードの印刷、入力は圧倒的に費用が安くすむ。
そこで、ICカードがまだ普及していない応用領域で、バーコードによるサービスの展開は十分できる余地がある。

今後とも、バーコードが読めれば仕事ができる環境作りに努めたい。

p.s.
名古屋近郊で国際規格の国内委員会のWGの主査で国際規格のエディタって、
デンソーウェーブ（デンソー）のQRコード関係の方と自分だけだった。
仕事場にご招待して講演会を企画した。

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Dockerで開発用のPostgreSQL+pgAdmin4を入れる

## はじめに
Dockerで開発用のための臨時psqlとpgadminを用意しましょう
psqlは`localhost:5432`, pgadminは`localhost:5433`にバインディングされます。

## やっちゃう
### データを保存するボリューム作成
どうせ破棄する開発用のためのものだからファイルシステムよりDocker Volumeのほうが良さそう

```bash
docker volume create postgres
docker volume create pgadmin
```

### ここが本番
```bash
docker pull postgres:11-alpine
docker run --name postgres \
       -p 127.0.0.1:5432:5432 \
       -p 127.0.0.1:5433:80 \
       -v postgres:/var/lib/postgresql/data \
       -e POSTGRES_PASSWORD=postgres \
       -d postgres:11-alpine
docker pull dpage/pgadmin4
docker run --name pgadmin \
       --net=container:postgres \
       -v pgadmin:/var/lib/pgadmin \
       -e "PGADMIN_DEFAULT_EMAIL=test@docker.local" \
       -e "PGADMIN_DEFAULT_PASSWORD=test" \
       -d dpage/pgadmin4
```

### 後始末 
```bash
docker stop pgadmin
docker stop postgres
docker container prune
docker volume prune
```

## まとめ
やっぱりDockerっていいですね～
[PHP その２]　開発環境の構築とHello World

# シリーズ記事一覧
　[[PHP その０]　Web系初心者だけど今後のためにも１から勉強してみる](https://qiita.com/yaiza/items/d96d7a6c4bbcc9b3cd3d)
　[[PHP その１]　LAMP環境とは？](https://qiita.com/yaiza/items/c830a41c86cf6b3c65f9)
　[[PHP その２]　開発環境の構築とHello World](https://qiita.com/yaiza/items/2a4f807e9bfda07c16f3)

# 環境

| OS       | docker| docker-compose|
|:----------------:|:-----------------:|:------------------:|
| windows 10 Home 1809 |18.03.0-ce,build 0520e24302 | 1.20.1, build 5d8c71b2 |



# dockerとは
カーネルより上だけ仮想化する技術です。これまでのカーネルごと仮想化したハイパーバイザ型やホスト型の仮想化とは違い、コンテナ型の仮想化です（まああんまりこの辺はあんまり知らなくてもひとまずは作業には影響しないと思う）。カーネルまで仮想化しなくていいよねって需要が強くなってできたみたい。カーネルより上、つまり検証したいOS以上をdockerで構築するんですね。利点としては軽いってこと。カーネルまで仮想化されてるとどうしても１環境が重くなる。１コンテナで１ミドルウェアを構成することでいろんな環境を構築できるしコンテナの構成を書いたテキストファイルを共有するだけで別クライアントからでも簡単に環境を共有することができる。

# docker-composeとは
１コンテナで１ミドルウェアを構成すると話しましたが、これを手動で管理するのは非常に煩わしいですよね。これを自動でやってくれます。具体的にはテキストでレシピを作っておくと、そのレシピに相当するコンテナ構成を構築してくれるということです。

# Docker Toolboxの導入

以下のコマンドが実行できるようになったらDockerを使う準備は完了です。

```
docker run hello-world
```

インストール手順のリンク先を見て、上記コマンドが実行できるようになったら次の章に進みます。

ダウンロード：[Get Docker Toolbox for Windows](https://docs.docker.com/toolbox/overview/)

インストール手順：[windows 10 home で docker を導入するメモ](https://qiita.com/idani/items/fb7681d79eeb48c05144)



# Docker-compoese
参考：[Docker Composeを使ってLAMP環境を立ち上げる](https://qiita.com/naga3/items/d1a6e8bbd0799159042e)
どこかに作業ディレクトリを作成して

```
mkdir work
```
以下を実行

```
git clone https://github.com/naga3/docker-lamp.git
cd docker-lamp/
```

参考リンクだとそのまま起動するコマンド叩いてるけど、今はそのままだとエラーになります。
./work/docker-lamp/php/Dockerfileを以下の通り変更します。

```
FROM php:7.0-apache
COPY php.ini /usr/local/etc/php/
RUN apt-get update \
  && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmcrypt-dev \
  && docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt
```
そして以下を実行

```
docker-compose up -d
```

細かい構成については参考リンクを参照。

ここまでくると以下の２つのコンテナが動いているはずです。

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
3243898fd41f        dockerlamp_php      "docker-php-entrypoi…"   21 hours ago        Up 21 hours         0.0.0.0:80->80/tcp    dockerlamp_php_1
3fedae96821c        dockerlamp_mysql    "docker-entrypoint.s…"   21 hours ago        Up 21 hours         3306/tcp, 33060/tcp   dockerlamp_mysql_1
```

0.0.0.0:80で動いていると書いてあります。
dockerが動いているIPは起動時の以下メッセージで確認してください。

```
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/

docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com
```

上記でいうと、ブラウザで http://192.168.99.100/ を開いてphpinfo()のページが出たら成功です。

おっと、まだHello Worldが表示できていませんでした。

./html/index.phpを以下のように変更しましょう

```
<html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <?php echo '<p>Hello World</p>'; ?> 
 </body>
</html>
```

更新を保存したら、ブラウザを更新してHello Worldの文字が出てきたら完了です。
HTTPを理解する⑧ HTTPのバージョン

HTTPはHTTP/0.9, HTTP/1.0, HTTP/1.1, HTTP/2.0といった具合にバージョンが重ねられるごとに機能改善をしてきました。そして現在もっとも普及しているのがHTTP/1.1です。

## HTTP/1.1
### HTTPキープライン
HTTPリクエストやHTTPレスポンスといったデータのやりとりをする際、TCPを用いて行われます。このTCPを利用する時コネクションという通信経路を確立します。HTTP/1.0以前ではHTTPリクエストが送る時コネクションを確立、HTTPレスポンスとしてデータが返ってくると切断されていました。これだと毎回の通信毎にコネクションを確立する必要があり(コネクションを確立する際3回通信が行われる)、余分な通信が起きてしまいます。webページにたくさんの画像が使われるようになるとこの方法では効率が悪く、余分な通信が発生してしまします。HTTP/1.1にバージョンが上がってからはコネクションを維持し続ける方法が確立されました。これを**HTTPキープアライブ**といいます。

### HTTPパイプライン
HTTP/1.1では通常リクエストを一回送るとレスポンスが返ってくるまで、原則次のリクエストが送れないといった欠点がありました。これだとwebサイトに画像が複数あると一個の画像の読み込みが終わるまで次の画像の読み込みが始まらないといった非効率な通信となってしまいます。そこでHTTP/1.1ではリクエストの完了を待たずに次のリクエストを送ることができる仕組みとして**HTTPパイプライン**が実装されました。
ただしHTTPパイプラインには二つの問題がありました。一つがHTTPパイプラインはサーバー側できちんとした対応がされていないとブラウザのリクエストを処理できない問題がありました。二つ目が「サーバーはリクエストが送られてきた順番でレスポンスを返さなければいけない」という制限があります。そのためほとんどのブラウザではHTTPパイプラインはoffになっており、ブラウザ側で複数同時接続を行うことである程度通信の多角化を図っています。

## HTTP/2.0
HTTP/1.1では一回リクエストを送ったらレスポンスが返ってくるまで原則次のリクエストが送れないという欠点を補うためにHTTPパイプラインという仕組みがありました。しかしHTTPパイプラインは複数のリクエストを送ることはできても、リクエストを送った順番でレスポンスを返さないといけないという制限がありました。結果webサイトを読み込む際、レスポンスが遅いものがあればそれ以降の読み込みが止まってしまい、webサイトの表示速度が遅くなる問題がありました。HTTP/2.0ではその問題を解決するために**ストリーム**が実装されました。

### ストリームによる多重化
ストリームはTCPのコネクション内に仮想的な独立した通信経路のことをいいます。複数生成することで、それぞれのストリーム内でリクエストとレスポンスをやりとりできるため、「リクエストを送った順番でレスポンスを返す」といった制限がなくなり、より効率良く通信をすることができるようになりました。

### バイナリ形式の利用
HTTP/1.1以前ではリクエストとレスポンスのデータをテキスト形式(人が読みやすい)でやりとりしていました。バイナリ形式(コンピュータが読みやすい)のデータであっても一度テキスト形式に直してからやりとりしていました。HTTP/2.0ではよりデータのやりとりをバイナリ形式でもできるようになり、変換にかかる時間がなくなり、webブラウザとサーバーの負担も軽減されました。

### ヘッダの圧縮
HTTP/2.0ではヘッダを圧縮することデータ量を軽量化することができます。HTTPリクエストだと利用しているブラウザの種類など、HTTPレスポンスだとwebサーバーのバージョンの種類がヘッダ情報に含まれています。HTTPリクエストとHTTPレスポンスの繰り返しやりとりする上でこのような情報は重複することがあります。HTTP/2.0ではヘッダ情報から差分のみを取り出して送るHPACKという圧縮方式が用いられています。

### サーバープッシュ
サーバープッシュはHTTPリクエストの内容からサーバーが必要なファイルを判断し、事前にwebブラウザに送る仕組みです。通常はHTTPリクエストが送られてきてから必要なファイルをHTTPレスポンスとして返します。あるindexファイルには画像ファイルが必要だったら、そのHTTPリクエストが送られてくるまでサーバーは画像ファイルを送ることはありません。HTTP/2.0では最初のHTTPリクエストが送られてきた段階で、もしindexファイルには画像ファイルが必要と判断したら、HTTPリクエストが送られずともwebサーバーから転送します。
DOCKERで良く使うコマンド

![２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244597/b826d300-3577-4446-f9dc-64c67154733b.png)

皆さん、こんにちは！
記事を読んで頂き、有難うございます。
皆さんもDOCKERの事を良く知っていますね、私は初心者ですので、時々コマンドが忘れますので、良く使うコマンドをメモ致します。他のコマンドが有れば、コメントして、教えて頂けないでしょうか。

＃ DOCKER

Docker HubからIMAGEを引く。
```sudo docker pull image_name```

IMAGEでコンテナを作って、コンテナにアクセスする。
```sudo docker run -v <forder_in_computer>:<forder_in_container> -p　<port_in_computer>:<port_in_container> -it <image_name> /bin/bash```

IMAGEを一覧表示する。
```docker images```

１つのIMAGEを削除する。
```docker rmi {image_id/name}```

実装中コンテナを一覧表示する。
```docker ps```

ストップしてコンテナを一覧表示する。
```docker ps -a```

コンテナを削除する。
```docker rm -f {container_id/name}```

コンテナをスタートする。
```docker start {new_container_name}```

実装中コンテナにアクセスする。
```docker exec -it {new_container_name} /bin/bash```

外からコンテナにコマンドを実装する。
```sudo docker-compose run  コンテナ名 CMD＿内容```
例：
```docker-compose run app rails new . --force --no-deps --database=mysql```

コンテナのコネクトIP
```sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' Container_Id```

II. Dockerfile

DockerfileからIMAGEを作る。
```sudo docker build -t tenimage:tag path_to_Dockerfile```

III. Docker Compose
Docker composer fileのIMAGEを実装する。
```docker-compose up```

Docker composer fileのIMAGEをバックラウンドで実装する。
```docker-compose up -d```

Docker composer fileのIMAGEをストープする。
```docker-compose down```

Updating depend you... :)

また宜しくお願いします。
AWS LambdaでGraphvizを動かす

初投稿。メモも兼ねて
##必要なもの
- Docker version 18.03.0-ce
- Python 3.7.3
- graphviz version 2.40.1
- AWS Lambda
- AWS S3

##環境構築
1.Lambdaの環境に合わせてビルドするためにコンテナを用意する

```bash

$ docker run -v "{$PWD}":/var/task -it amazonlinux:2 /bin/bash
```
2.ビルドツールとかpython3をインストール

```bash
$ yum groupinstall "Development tools"
$ yum install -y cairo-devel pango-devel wget python3
```

3.Graphvizをビルド

```bash
$ wget https://graphviz.gitlab.io/pub/graphviz/stable/SOURCES/graphviz.tar.gz
$ tar -xvf graphviz.tar.gz
$ cd graphviz-2.40.1
$ ./configure --prefix=/var/task
$ make
$ make install
```

4.確認

```bash
$ /var/task/bin/dot -V
dot - graphviz version 2.40.1 (20161225.0304)
```

##Lambda上でPythonから動かす
1.Lambdaで起動するスクリプトを書いとく

```python
def lambda_handler(event,context):
    # パスを通しておく
    os.environ["PATH"]+=":/var/task/bin"
    # SVG形式を指定。PNGとPDFはだめだった。
    G = Digraph(format='svg')
    G.attr('node', shape='circle')

    N = 15
    for i in range(N):
        G.node(str(i), str(i))

    for i in range(N):
        if (i - 1) // 2 >= 0:
            G.edge(str((i - 1) // 2), str(i))

    print(G)
    G.render('/tmp/tree')
    
    # 描画できているか確認するためにS3にアップロード
    bucket_name = "my-bucket-name"
    s3 = boto3.resource('s3')
    s3.Bucket(bucket_name).upload_file('/tmp/tree.svg', 'tree.svg')
    return "OK"
```

2.S3にアップロードするdeploy_package.zipを作成

```bash
$ pip3 install -t /var/task graphviz
$ zip -r9 deploy_package.zip
```

3.deploy_package.zipをS3にアップロードしてLambdaを作成。ロールにS3アップロード権限付けること。

##結果
LambdaをテストするとS3バケットに「tree.svg」があるはず。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f36343130302f33323462633038392d656564632d653963372d323631612d3337633438346331656366392e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261036/7e723a6c-12c3-3453-882c-4349d87bfcc0.png)

##参考
参考にさせて頂きました。
[Deploying Graphviz on AWS Lambda](https://lifeinplaintextblog.wordpress.com/deploying-graphviz-on-aws-lambda/)
[graphvizを使ってPython3で木構造を描く](https://qiita.com/shimo_t/items/b761973805f2cf0b2967)
LARADOCKで複数プロジェクトという環境を設定する。

![２.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244597/90223ab9-1d55-ef77-041e-3e12b4c3c274.jpeg)

皆さん、こんにちは！
2015から、Dockerは開発環境を構築する上でのヒーロとして知られています。あなたも良く使っていますね。
Dockerで環境を築きやすいように、PHPコミュニティがLARADOCKを紹介しました。

# 1. LARADOCKとは何ですか？

LaradockはDocker用の完全なPHP開発環境です。
Laradockの中で事前にパッケージ化されたDockerイメージが含まれていて、素晴らしいPHP開発環境を提供するように事前設定された。

# ２. どうやってLARADOCKを使いますか？
心配しないで、とても簡単ですよ。GitでLaradockをクローンだけです。
今日私たちは複数プロジェクトの環境を築き方を調べましょう。
環境で含めるサービス：

- NGINX
- MYSQL５.７
- PHPMYADMIN
- REDIS
- 2つのLaravel５.８ソースコード

ディレクトリ構造は以下のようになります。
ー　PHP＿PROJECTS
　　ー　LARADOCK　（git clone https://github.com/laradock/laradock.git）
　　ー　LARAVEL−１
　　ー　LARAVEL−２

次はLARADOCKで.ENVファイルを作る。
```cp　.env-example　.env```
LARADOCKはDOCKERのコンテナを作る時に、デフォルトで最新版IMAGEをダウンロードしますので、特定版が欲しい時に、.envでおチェンジしてください。今MYSQLの最新版は⒏０ですので、⒌７にします。
```
### MYSQL #################################################
MYSQL_VERSION=5.7
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d
```

VirtualHostを設定します。
```
cp laradock/nginx/sites/laravel.conf.example laravel-1.conf
cp laradock/nginx/sites/laravel.conf.example laravel-2.conf
```
各ファイルでプロジェクトのために、修正する。
例えばlaravel-1.confファイルで

```
server {
    listen 80;
    listen [::]:80;

    # For https
    # listen 443 ssl;
    # listen [::]:443 ssl ipv6only=on;
    # ssl_certificate /etc/nginx/ssl/default.crt;
    # ssl_certificate_key /etc/nginx/ssl/default.key;

    server_name laravel-1.test;
    root /var/www/laravel-1/public;
    index index.php index.html index.htm;

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php-upstream;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    location /.well-known/acme-challenge/ {
        root /var/www/letsencrypt/;
        log_not_found off;
    }

    error_log /var/log/nginx/laravel_error.log;
    access_log /var/log/nginx/laravel_access.log;
}

```

**hostsをコンフィグする**（vim /etc/hosts and add new row）**

```
127.0.0.1 laravel-1.test laravel-2.test
```
OK.準備ステーブが終わりました。次はコンテナを作りましょう。

**コンテナを作る。**
注意：LARADOCKで事前に化されたパッケージが沢山有りますので、必要なパッケージだけ呼び出してください。何も入れないなら、全てのコンテナが作って、時間がかかりますから、

```
docker-compose up -d nginx mysql phpmyadmin redis
```
上のコマンドが終わったら、環境も築けました。チェックのため、```docker　ps```でチェックする

**Workspaceコンテナに入ります。**
（Artisan、Composer、PHPUnit、Gulpなど）のようなコマンドを実行するには、Workspaceコンテナに入ります。
```docker-compose exec workspace bash```

**結果をチェックする。**
- サイトをアクセスする:　laravel-1.test
- PHPMYADMIN: localhost:8080 (server: mysql, username: root, password:root)

ここまで、終わりいたします。
読んでいただき、有難うございます。
周期を持つ時系列データの分解とRでの実行例

# はじめに
時系列データには、一定の周期を持つデータを扱うことが良くあります。そのデータを扱う際は、いくつかの成分に分解することで、より良い分析を進めることが出来ます。Rでは**stl**という関数を使うことが一般的です。


# stlについて
stl(Seasonal Decomposition Of Time Series By Loess)は次のモデルを考えて、それぞれのデータに分解することが出来ます。

- トレンド(Trend): 長期的に変動する要素
- 周期変動(Seasonal): 一定の時間で周期的に変動する要素
- 残差(Remainder): 残りの細かく変動する要素

なので、「元データ=トレンド+周期変動+残差」となります。
stlについてのより詳しい説明やアルゴリズムついては、[この論文](https://www.researchgate.net/publication/235709689_STL_A_Seasonal-Trend_Decomposition_Procedure_Based_on_Loess)参照ください。

# Rで実施してみる
UKgas(イギリスのガス消費量)とnottem(イギリスの町の20年分の月次平均気温)をstlで分解し可視化してみます。

```R
> ukgas.stl <- stl(UKgas, s.window ="per")
> plot(ukgas.stl)
```

![ukgas_stl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187459/48c40391-39fb-c790-ae0c-805a36d973bc.png)

季節変動とトレンドが綺麗に取れました。残差の変動も興味深く見えます。
なお、各成分をデータとして取り出したいときは、次のようにすれば良いです。

```R
ukgas.stl <- stl(UKgas, s.window ="per")
#周期成分
ukgas.seasonal <- ukgas.stl$time.series[,1]
#トレンド成分
ukgas.trend <- ukgas.stl$time.series[,2]
#残差
ukgas.remainder <- ukgas.stl$time.series[,3]
```
次はnottemのデータで行います。

```R
> nottem.stl <- stl(nottem, s.window ="per")
> plot(nottem.stl)
```
![nottem_stl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187459/4ebcbf5e-b385-00be-46f0-6905366728a5.png)

トレンドに注目することで、いつもとは違う変化に注目できるかも知れません。
より詳しい使い方はhelp(stl)でご確認ください。

# 最後に
このような感じでstlで周期データを分解することで、あなたが持つ仮説を示すことの助けになるかも知れません。
docker-composeを使ってリバースプロキシサーバからドメインアクセスしたい 

docker-compose version 1.23.2

docker-composeを使って、webサーバを立ち上げた時にvertualhostでアクセスしたいと思い、調べていたらnginx-proxyを見つけ、複数サーバからドメインアクセスできそうだったのでやってみた。

docker image：https://hub.docker.com/r/jwilder/nginx-proxy/

大まかなイメージ図
![docker-composeを使ってリバースプロキシサーバから複数webサーバを呼び出したい .jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95052/9cd284b2-e698-fdaa-0768-da6c64544f89.jpeg)

### ディレクトリ構成

```
nginx-proxy
├── docker-compose.yml
├── web1.localhost
│   ├── config
│   │   └── web1
│   │       └── default.conf
│   ├── docker-compose.yml
│   └── web1
│       └── index.html
└── web2.localhost
    ├── config
    │   └── web2
    │       └── default.conf
    ├── docker-compose.yml
    └── web2
        └── index2.html
```
ディレクトリは各々作成お願いします。

### リバースプロキシサーバの設定

```yml:nginx-proxy/docker-compose.yml
version: '3'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - 80:80
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
networks:
  default:
    external:
      name: shared
```


### WEBサーバの設定
nginx-proxy/web2.localhost/docker-compose.ymlも同様に作成する

```yml:nginx-proxy/web1.localhost/docker-compose.yml
version: '3'

services:
  web1:
    image: nginx
    environment:
      - VIRTUAL_HOST=web1.localhost
    volumes:
      - ./config/web1/default.conf:/etc/nginx/conf.d/default.conf
      - ./web1:/var/www/html
networks:
  default:
    external:
      name: shared
```

###nginxの設定

nginx-proxy/web2.localhost/config/web2/default.confも同様に作成する

```conf:nginx-proxy/web1.localhost/config/web1/default.conf
server {
    listen 80;

    root  /var/www/html/;
    index index.php index.html index.htm;
}
```

docker ネットワークの作成

```docker
docker network create --driver bridge shared
```

適当に入力
nginx-proxy/web1.localhost/web1/index.html
nginx-proxy/web2.localhost/web2/index2.html

###docker-compose 起動

```docker:nginx-proxy
docker-compose up -d
```

```docker:nginx-proxy/web1.localhost
docker-compose up -d
```

```docker:nginx-proxy/web2.localhost
docker-compose up -d
```

http://web1.localhost/
http://web2.localhost/



アクセスして、設定したhtmlが表示されていればOK

お疲れ様でした。。。

余裕があればhttps接続の方法も調べたい^ ^




参考文献：
https://suin.io/561
https://gtrt7.com/blog/nginx/reverseproxy
https://qiita.com/fukafuka_dev/items/05d8dc4cc4671d7a5d4f
DNS

ルートサーバーは13台

DNSレコード

|record|memo|
|:--|:--|
|A|ホスト名＋ドメイン名とIPアドレスの紐付け|
|CNAME|別名 エイリアス|
|NS|他のDNSサーバーに処理させる|
|MX|ホスト名＋ドメイン名でのルール|
|TXT|認証などができるようにする|
【iOS】Swiftで良い感じのエラーモデルを作る

iOSアプリ開発でエラーモデル/エラーハンドリングを考える時にいつも悩んでいたのですが、良い感じに１つのパターンに落とし込めたので公開メモとして書いておきます。

あくまでパターンの１つなので全てに当てはまる訳ではないです。

最近考えてたポエムで、「正常系ではない処理って**ビジネスの都合が大きく絡むものが多いので、エラーがビジネスロジックになるのは当たり前**」というのがあります。つまり、「エラーハンドリングはこれ！」というのはなく、**要件によってエラーハンドリングは毎度違って当たり前**ということです。
(エラー知見を探してもなかなか出てこないのはこれが原因ですね

# 仮想要件
クライアントのエラー、サーバーのエラー、アカウントのエラーの3つでエラーを分類したい。各エラーには2桁のエラーコードが割り振られている。これを表現するモデルを作りたい

# 実装

```swift:ErrorModel.swift
extension Error where Self: RawRepresentable, Self.RawValue == Int {
    
    var errorCode: Int {
        return rawValue
    }
    
}

enum ProjectError: Error {
    
    // 00 ~ 09
    enum ClientError: Int, Error {
        case invalidInputAge = 0
        case invalidInputName = 1
        case itemExpired = 2
        case requiredUpdate = 3
        // 色々あって
        case unknown = 9
    }
    
    // 10 ~ 20
    enum ServerError: Int, Error {
        case flightMode = 10
        case badNetwork = 11
        case invalidResponse = 12
        // 色々あって
        case unknown = 19
    }
    
    // 20 ~ 29
    enum AccountError: Int, Error {
        case updated = 21
        case delegate = 22
        case anotherUserAssociated = 23
        // 色々あって
        case unknown = 29
    }
    
    case client(ClientError)
    case server(ServerError)
    case account(AccountError)
}

extension ProjectError {
    
    var errorCode: Int {
        switch self {
        case .client(let error): return error.errorCode
        case .server(let error): return error.errorCode
        case .account(let error): return error.errorCode
        }
    }
    
}

```

# ハンドリング
アプリでは、この形式でエラーを使っていきます（Stringは仮です
`let result: Result<String, ProjectError> = .success("")`

自分がハンドリング可能なエラーが投げられた時は、それだけ捕まえて処理をします。
例えばこんな感じとか。

```swift:handleError.swift

switch result {
case .success(let value):
    completion(value)

case .failure(let error):
    guard case .client(let clientError) = error else {
        completion(error)
        return
    }
    
    guard case .invalidInputAge = clientError else {
        completion(error)
        return
    }
    
    self.handleSpecificError()
}

```

自分が処理できないエラーは上位のモジュールに返していきます。iOSの場合はだいたい最後ViewControllerになりますね。

最後の処理というのは共通エラーハンドリングが多いイメージです。例えば、ダイアログを出すとか。(ex ネットワーク状況がよくありません。しばらくしてから再度お試しください。とか

# さいご
エラーハンドリングに正解はなく、ビジネスの都合がモリモリで困難でありソフトウェアエンジニアの腕が試される箇所です。(先輩の受け売り)

エラー設計をより良く、より楽しんでいきましょう！😇
本格的な夏が来る前に、自宅にエコな自動ドアを設置しよう（割りばし＋オムロン環境センサ2JCIE＋obniz）

#背景
エアコンでタイマーをつけて寝ていると、エアコンが切れた後は暑くて大変ですよね。
夜中に起きてドアを開けるのが辛くて「自動化できないかな・・」と昨年から考えていました。
![熱帯夜.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/ff83c883-f410-0e57-db5c-6550a848e5da.jpeg)


そこで

①もし、リビングの温度（窓を開けているのでほぼ外気温）が一定の温度以下になったら
②エアコンをOFF
③寝室のドアを開けて換気
→朝まで快適に寝れる～
という装置を作成しました。

今回は①③の部分だけ公開します。

###自動ドアが動くところ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">最近暑くなってきましたね。<br>今年もobnizとペットボトルを使用した自動ドアを作りたいと思います。<a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> <a href="https://t.co/y6ihQNNee7">pic.twitter.com/y6ihQNNee7</a></p>&mdash; keicafeblack (@keicafeblack) <a href="https://twitter.com/keicafeblack/status/1134476525779136513?ref_src=twsrc%5Etfw">2019年5月31日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#使用したもの
###電子系
* [obniz](https://obniz.io/ja/)

* [オムロン環境センサ2JCIE](https://www.omron.co.jp/ecb/product-info/sensor/iot-sensor/environmental-sensor)

![2JCIE2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/e5cacd20-8c4b-7168-3144-50fa07a373c2.jpeg)


###素材系
* 木の板
* 割りばし
* ビニール紐
* 水を入れたペットボトル

#自動ドアの作成
木の板に写真のような仕組みを乗せる（固定はタッカー＋接着剤）
![仕組み.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/cabcac2b-da86-6601-0ad7-70814378e351.jpeg)

#コーディング
[オムロン環境センサ2JCIE](https://www.omron.co.jp/ecb/product-info/sensor/iot-sensor/environmental-sensor)からリビングの温度を取得して、27度以下になったらドアを開けます。
（obnizのサーバレスイベントを利用して、1時間に1回下記を実行するようにします）

```Javascript:autoDoor2.js
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
  <script src="https://unpkg.com/obniz@2.0.3/obniz.js" crossorigin="anonymous"></script>
</head>
<body>

<div id="obniz-debug"></div>


<script>
var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {  

  var omron = obniz.wired('2JCIE');
var servo = obniz.wired("ServoMotor", {gnd:2, vcc:1, signal:0});
  
var results = await omron.findWait();

if(results){
    console.log("find");

    await omron.connectWait();
    var data = await omron.getLatestData();

    console.log(data.temperature);

    await omron.disconnectWait();

  if(data.temperature <= 27){
 console.log("less than 27");
  servo.angle(150.0); // half position
     await obniz.wait(1000);
    
   servo.angle(30.0); // half position
     await  obniz.wait(1000);   
    
  }else{
 console.log("over 27");
    
  }
  
}else{
    console.log("not find");
}
}
</script>
</body>
</html>
```
今回はじめて２つの機能（bluetooth経由でオムロンセンサから温度を取得＋サーボモータを動かす）を同時に使用しました。動いたので載せましたが、間違っていたり、もっと良い書き方があればアドバイスをお願いします。

#参考にしたサイト
*[obniz公式：パーツライブラリ＞2JCIE](https://obniz.io/ja/sdk/parts/2JCIE/README.md)
*[obniz公式：入門レッスン＞サーボモータ](https://obniz.io/ja/lessons/lessons/lessons_servo_motor)
*動物を捕まえるための罠のYoutube色々


#今後の予定
・エアコンをOFFにできるようにする
・オムロンセンサからは温度以外（湿度、照度、UV Index、気圧、騒音、不快指数、熱中症警戒度）も取れるので、複数の要素で「エアコンを継続？ドアを開ける？」を判断できるようにする（温度が低くても湿気が高い場合は、引き続きエアコンを継続する、など）
arduino uno ispシールドでatmega328pに書き込む

#作業内容
arduino uno r3とispシールドを用いてatmega328pを内蔵クロックで動作するようにする

#環境
arduino uno r3

Arduino用 AVR ISPシールド ATmega328Pのブートローダ書き込み用
![71djiy7C2EL._SL1024_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175440/d8be5ea4-89b9-76ac-d89a-5a781b15d6f3.jpeg)

arduino IDE v1.8.9
DIY atmega8 (arduinoIDEのライブラリ)

#手順
arduinoにシールドを取り付けない状態でPCに接続。
![IMG_20190601_004227.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175440/7a993cac-9510-b7d8-2b07-7158aaaa0bba.jpeg)

arduino IDEでスケッチ例、arduinoISPを開く
![arduino_isp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175440/56f28dfd-c248-bd96-c573-2c342030df17.jpeg)

arduinoに書き込みする。

シールドをセットする。
atmega328pをセット、へこみはレバー側。
![IMG_20190601_005752.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175440/04a0c725-f8ef-0525-065d-7dbf56d19746.jpeg)


arduino IDEでボード、atmega328pを選択。本記事ではライブラリとして、DIY atmega8を使用。
![名称未設定 1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175440/cdb895c9-8c5c-281a-ac40-6d4ca6e4d640.jpeg)

動作周波数は内蔵8Mhzを選択。ブートローダは使用せず、を設定する。（下図参照）
![名称未設定 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175440/25f75805-2b57-3383-da7a-cdf35d8b1b54.jpeg)

シールドのリセットボタンを押す。
ツール、ブートローダを書き込む、をクリック

スケッチ、書き込み装置を使って書き込む、をクリック
![名称未設定 3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175440/025e98d3-3d79-6cf4-e0f9-ace71cdedf20.jpeg)

これで完了。

書き込んだコードは以下。13ピンのLEDを点滅させている。

```
int led = 13;

void setup() {
  // put your setup code here, to run once:
  pinMode(led, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(led, HIGH);
  delay(1000);
  digitalWrite(led, LOW);
  delay(1000);
}
```

ブレッドボードに刺して動作確認。下図を参考に。
![20171213015114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175440/fb968e67-ad14-eaf9-6985-c5b44393ef7e.png)

電源とLEDのみ接続している。
![IMG_20190601_011730.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175440/73e59a93-bd4f-5b16-83d1-7e692ab48c49.jpeg)

点滅動作した。
とあるRailsエンジニアのリモートワークトライアル 2019-05-31 on Twitter

# とあるRailsエンジニアのリモートワークトライアル 2019-05-30 on Twitter
 [*](https://twitter.com/YumaInaura/status/1134118293055377410")
<https://github.com/YumaInaura/YumaInaura/issues/2093>
# とあるRailsエンジニアのリモートワークトライアル 2019-05-30 on Twitter [ポエム] on @Qiita
 [*](https://twitter.com/YumaInaura/status/1134131802459688961")
<https://qiita.com/YumaInaura/items/be57ababf4cbbe7d1ed9>
# コミュニケーションとらなあかん。
コミュニケーションとるのが仕事や。そやろ？っておっちゃんの声が聞こえる。そのとおり。
 [*](https://twitter.com/YumaInaura/status/1134217762786516992")

# 仕事だし色々な悩みももちろんあったけれど、前職のAimingが、自分の人生に総じて言ってプラスになったかどうかというと、奇跡的なレベルでプラスになったと思う。

 [*](https://twitter.com/YumaInaura/status/1134262418211688448")

# Twitterで人と話して
Slackで人と話して
リモートワークで仕事して

人と対面で話す時間がぐっと減るから
それも

どげんかせんといかん
 [*](https://twitter.com/YumaInaura/status/1134410933315391489")




# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
CircleCI で Rails の RSpec テストを速くする

## 概要

テストが膨らんできて、それにともないCI待ちの時間が増えてきた。困ったのでいろいろ設定してたら1/3くらいに短縮できたのでメモ。

本記事は[CircleCI]、[Ruby on Rails]、[RSpec]、 それと [parallel_tests] の使用が前提になっている。



方針:

- テストサーバは precompile 前提で起動する
    - CIのキャッシュをきちんと設定する
- [parallel_tests] の並行テストを実行時間で割り振る


## テストサーバは precompile 前提で起動する

[RSpec] の `--profile` オプションで遅いテストを調べると、 controller か e2e テストの1件目のみが異様に遅く、2件目の4倍〜10倍近くかかっていた。どうやら assets のコンパイルに時間がかかっているようなので、プリコンパイルを前提に起動することにした。これで極端に遅いテストがなくなった。

```ruby:config/environments/test.rb
  # precompile前提で起動
  config.assets.debug = false
  config.assets.digest = true
  config.assets.compile = false
```

### CIのキャッシュをきちんと設定する

遅いテストが無くなる代わりにプリコンパイルする時間がその分かかるようになったので、プリコンパイルした成果物をCIにキャッシュさせるようにした。こちらは以下の記事を参考に設定した。みんなのウェディング様、クラウドワークス様ありがとうございます。

- [Ruby on Railsのスローテスト対策で効果があったものなかったもの - みんなのウェディングエンジニアリングブログ](https://blog.mwed.info/posts/improve-slow-test.html)
- [CircleCI 2.0に移行して新機能を活用したらCIの実行時間が半分になった話 - クラウドワークス エンジニアブログ](https://engineer.crowdworks.jp/entry/2017/04/04/202719)


## [parallel_tests] の並行テストを実行時間で割り振る

[RSpec] の実行に [parallel_tests] を使っていたのだが、割り振りが良くないようで、2並列のときに片方は3分でもう片方は7分みたいな偏りが出て4分が無駄になっていた。

[parallel_tests] のテストケースの割り振りはデフォルトだと「実行時間もしくはファイルサイズ」になっているが、実行時間を分析させるためには runtime log を用意する必要がある。


>--group-by [TYPE]            group tests by:
> (中略)
>  default - runtime when runtime log is filled otherwise filesize

(`parallel_test --help` の出力より)


runtime log を得るには専用のフォーマッタを指定してテストを実行する。以下のように `.rspec_parallel` を設定してテストを実行。以下の例だと `tmp/parallel_runtime_rspec.log` に runtime log が出力される。


```sh:.rspec_parallel
--format ParallelTests::RSpec::RuntimeLogger
--out tmp/parallel_runtime_rspec.log
```

runtime log ができたら、以下で実行する。これで並行テストが効率的にできるようになった。

```sh
bundle exec bin/parallel_rspec 
--runtime-log tmp/parallel_runtime_rspec.log
```

([parallel_tests] のオプション指定方法でちょっとハマった。 直接指定するものと起動設定ファイルに書くものがあるっぽく、 `--format` は直接指定して実行するとエラーになり、 `--runtime-log` は `.rspec_parallel` に書くとエラーになった)

### CIでの実行

上記の例は[公式ドキュメント通り][parallel_tests]だけど、良心的にgitを管理してると `tmp` ディレクトリは `.gitignore` で無視られてて忘れがちなので、CIでも runtime log が見れるようにgit管理下に含めておく。もしくはCIで持ち回れるようなキャッシュ設定を作る。


[RSpec]: https://github.com/rspec/rspec/
[CircleCI]: https://circleci.com/
[Ruby on Rails]:http://rubyonrails.org/
[parallel_tests]:https://github.com/grosser/parallel_tests/
再入門SSL

# SSL
共通鍵暗号と公開鍵暗号を併用
共通鍵のやりとりを公開鍵暗号で行なっている

- 通信対象の真正性
- 通信内容の暗号化
- 改ざん検知

# SSLサーバー証明書
公開鍵と所有者情報を紐付けて証明したもの。
認証局が発行する。
クライアントがサーバーから証明書を受け取り、サーバーのFQDNと証明書のコモンネームが一致することを検証する

認証局（CA）は２種類
信頼された認証局　→　クライアントに登録されている
信頼されていない認証局　→　クライアントに登録されていないので、自身で判断する必要がある

## CSR
SSLサーバー証明書の発行に必要なテキストデータ。
Certificate Signing Request
公開鍵、コモンネーム、組織名などが含まれている

## サーバー証明書の認証レベル
ドメイン認証タイプ
企業認証タイプ
EV認証タイプ

## CAA
サーバ証明書を発行可能な認証局を制御する仕組み。
DNSサーバーにCAAレコードを設定することで利用可能になる。
CAAレコードの設定はサブドメインに継承される。