OmniAICreator/Qiita-1.07M huggingface dataset:
4歳娘「パパ、セッションとCookieってなあに？」

## ある日の我が家
娘**（４歳）**「パパ、**セッション**とか**Cookie**ってなあに？」
娘「サーバサイドの勉強してると出てくるやつ」

ワイ「おお、今日はその質問か」
ワイ「ええでええで〜、パパが教えたるで〜」

娘「わ〜い！」
ワイ「ワ〜イ！」

## 例えば月曜日

ワイ「例えば、月曜日の朝は**仕事する気にならへん**から**Twitter**を見るやろ？」

娘「うん！」

ワイ「せやからTwitterのホーム画面を見るために」
ワイ「ブラウザのアドレスバーに`https://twitter.com/home`って打ち込むんや」
ワイ「まぁ実際にはブックマークから行くんやけど、まぁ同じことや」
ワイ「つまりブラウザ君を通して、サーバ君に」

> 「ワイのTwitterのホーム画面のHTMLをくれや〜」

ワイ「ってことを伝える訳や」

娘「うんうん」

ワイ「でもな？」
ワイ「それも**Cookie**を使って**セッション管理**をせんと実現できひんことやねん」

娘「何で？」

ワイ「世界中のPCやスマホからTwitterのサーバにアクセスが来るわけやから」
ワイ「サーバ君からして見たら」

> ワイのアクセス「ワイのホーム画面をくれや〜！」
> 山田くんのアクセス「ワイのホーム画面をくれや〜！」
> 佐藤くんのアクセス「ワイのホーム画面をくれや〜！」
> 〇〇くんのアクセス「ワイのホーム画面をくれや〜！」
・・・
・・・

ワイ「ってな感じや」
ワイ「**何万人**ものユーザが」

> 「ワイのホーム画面をくれや〜！」

ワイ「ってアクセスしに来るねん」
ワイ「でも、HTTP通信っていうのは**ステートレス**な通信やからアカンねん」

娘「ステートレス・・・状態がないってこと？」

ワイ「せや」
ワイ「例えば・・・」

> ワイのアクセス「ただいま`Yametaro1983`のアカウントでログイン中や！」
> ワイのアクセス「せやからワイのホーム画面をくれや〜！」

ワイ「↑こんな感じで、**現在の状態を添えて**サーバ君にリクエストしてあげたら」
ワイ「サーバ君も」

> サーバ君「よっしゃ、貴様のホーム画面の情報を返したるわ！！！」

ワイ「・・・って返してくれると思うんやけど」
ワイ「HTTPリクエストは**状態を持たれへん**から」
ワイ「毎回**はじめまして**な感じやねん」

> サーバ君「貴様ら、**ワイのホーム画面くれ**とか、**ワイの通知一覧くれ**とか言うてるけど」
> サーバ君「**ワイって誰やねん！！！**」
> サーバ君「どのアカウントでログイン中の奴やねん！！！」

ワイ「って感じやねん」
ワイ「せやから**Cookie**を使った**セッション管理**が必要なんや」

娘「まだよく分かんないけど、Cookieを使ってセッション管理ってのをすると」
娘「どのアカウントでログイン中なのか、っていう」
娘「そういう**状態**をサーバ君に伝えられるってこと？」

ワイ「せや」
ワイ「**擬似的に**やけどな」

## そもそもセッションとは
ワイ「**セッション**って言葉には**一定期間の活動**っていう意味があるんや」
ワイ「つまり、1回こっきりのアクセスやなくて」
ワイ「ログインした状態で色んなページを見て回ったり、っていう」
ワイ「そういう**一連の流れ**が**セッション**やな」

娘「うんうん」
娘「で、どうやってその流れを表現するの？」
娘「HTTP通信は毎回**はじめまして**になっちゃうんでしょ？」

ワイ「ほな説明していくで」
ワイ「まず、自分のホーム画面を見るためには」
ワイ「ログイン画面でアカウントとパスワードを入力して**ログイン**をするやろ？」

娘「うん」

ワイ「そうするとサーバ君が」

> サーバ君「ログインできたで〜！」

ワイ「って言う情報と共に」

> サーバ君「貴様の**個人識別番号**は`gh3049ghjb39003n`やから、覚えときや〜！」

ワイ「っていう**指示**をブラウザ君に対してくれるねん」
ワイ「そうすると、ブラウザ君はその**個人識別番号**を保存しといてくれんねん」
ワイ「その、ブラウザに保存される情報が**Cookie**や」

娘「へえぇ〜」

ワイ「個人識別番号だけやなくて、ほかにもいくつも記憶させたり出来るで」

娘「そうなんだね」
娘「パパより賢いね」

ワイ「せや」

## Cookieって何かに似てる

娘「Cookieってなんか」
娘「JavaScriptの**sessionStorage**とか**localStorage**みたいだね」

ワイ「せやな」
ワイ「でもそれらと違うのは、**Cookieは毎回サーバに自動送信される**ってとこやな」

娘「そうなんだ〜」

ワイ「ほんで、ブラウザ君だけがその**個人識別番号**を覚えててもしゃあないから」
ワイ「当然サーバ君も記憶しておいてくれんねん」
ワイ「サーバ側が記憶してくれる情報が**セッション情報**や」


娘「なるほど〜」
娘「だから・・・」

> ワイのアクセス「今度は通知一覧ページをくれや〜」
> ワイのアクセス「ワイの個人識別番号は`gh3049ghjb39003n`やで〜（自動送信）」
>
> サーバ君「また貴様か！」
> サーバ君「ずっとTwitter見てるな！」
> サーバ君「仕方ない、ほらよ！」

娘「みたいに、サーバ君とのやり取りができるんだね」

ワイ「せや」
ワイ「ドチャクソざっくりやけど、イメージは分かったやろ？」

娘「うん！」
娘「HTTP通信は**ステートレス**、つまり**状態を持たない**けど」
娘「Cookieをつかって**セッション管理**をすると」
娘「ちゃんとユーザを識別したりして」
娘「**擬似的に状態を維持できる！**」
娘「ってことだね！」

ワイ「そんな感じや！！！」
ワイ「アクセスする度に毎回はじめまして、やなくて」
ワイ「一つの流れ、つまり**セッション**として扱える感じやな！」

## 娘ちゃんが寝たあと
よめ太郎「あんた、セッションとかCookieとか知ってたんやな」
よめ太郎「**jQuery**しか知らんのかと思ってたわ」

ワイ「いや、実は昨日ハスケル子ちゃんがな」

> ハスケル子「そろそろ娘ちゃんからこんな質問が来るころだと思うので」
> ハスケル子「セッションとCookieのことをお伝えしておきますね・・・」

ワイ「って言うて、あらかじめ教えてくれたんや・・・」

よめ太郎「Oh...」
よめ太郎「ハスケル子ちゃん、予言者かい・・・」

## そのとき会社では
ハスケル子「ハ、ハッ・・・」
ハスケル子「**ハッスケル！！！！！**」

ハスケル子「誰か私のウワサしてるな・・・」

**〜おしまい〜**
Ruby勉強日誌１

メソッド定義

```method.rb
def メソッド名
  処理
end
```

each メソッド

```each.rb
オブジェクト.each do | 変数 |
  puts 変数[] + []
end
```


while true （trueの間処理を繰り返す）

```while.rb
while true
  値 = A
  if 値 == A
    処理１
　elsif 値 == B
    処理２
　else 値 == C
    処理３
    #trueではないので処理が終わる
end
```
[Swift] クロージャー式とクロージャーを区別する by Advanced Swift

[Advanced Swift](https://www.objc.io/books/advanced-swift/)では、クロージャー式とクロージャーを区別して理解するようにとの解説が丁寧に行われています。

なぜならばクロージャーは、**外部の環境変数を持つ関数** とした立派な定義があるためです。

```swift:本来のクロージャー
// 外部の環境変数
var cnt = 0;

func counter() -> Int {
	cnt += 1;
	return cnt;
}

// 変数cは、外部の環境変数を持つ関数(真のクロージャー😀)
let c = counter;
_ = c();
_ = c();
_ = c();
_ = c();
print(c()); // 5
```

一方、Swiftのブロック文`{}`によるラムダ式は、別に外部の環境変数を持った関数である必要はありません。

```swift:swiftのラムダ式をクロージャー式という
let advance = { (str) in
	print(str);
}

advance("クロージャー式とクロージャーは同一ではありません。 😗 ")
```

またクロージャー式を **クロージャース** と短縮して呼べることも紹介されています。
(以下[無料公開](https://www.objc.io/books/advanced-swift/preview/)されている部分から抜粋)

> Functions can be declared either with the func keyword or by using a shorthand { } syntax called a **closure expression**. 
> Sometimes this gets shortened to “closures,” but don’t let it give you the impression that only closure expressions can be closures. 

> 関数は `func`キーワード、**クロージャー式** と呼ばれる 簡略化された `{ }` 構文を使ってどちらでも定義することが出来ます。
> 時々、これは **closures** と短縮されますが、クロージャー式だけがクロージャーになれるということを意図しているわけではありません。

# 参照

Advanced Swift 
https://www.objc.io/books/advanced-swift/
Macのファインダーから右クリックでファイルをvimで開く

### やりたいこと

表題の通りです。
普段は、ファインダーからアクセスしたファイルをVSCodeで開いているのですが、ふとしたきっかけで、
「Macのファインダーから右クリックでファイルをvimで開く」のはどうしたらいいか調べたので、そのメモです。

同様の記事は、すでにたくさんありますが、結果的に初めてAppleScriptを使うことになったので、書いておきます。

### 流れ

- Automatorを使う
- Automatorで新規作成 -> AppleScriptを実行 で、スクリプトを記述
- アプリケーション形式で保存（名前はTerminalVimとか）
- 対象のファイルを右クリック
    - 「このアプリケーションで開く」で、作成したアプリケーションを選択

<img width="500" alt="Automatorで記載.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27976/dd9dbe28-331c-23de-2de9-69dfb9764e81.png">


### 記載内容

見よう見まねで試しましたが、いったんはこのような形で落ち着きました。
iTermで開く場合は、"Terminal" を "iTerm" に置き換えます。

```applescript
on run {input}
	set the_path to POSIX path of input
	set cmd to "vim " & quoted form of the_path & "; exit"
	tell application "System Events" to set terminalIsRunning to exists application process "Terminal"
	tell application "Terminal"
		if terminalIsRunning is true then
			do script with command cmd
		else
			do script with command cmd in window 1
		end if
		activate
	end tell
end run
```

### 参考

- https://gist.github.com/charlietran/43639b0f4e0a01c7c20df8f1929b76f2
- [Mac Automation Scripting Guide](https://developer.apple.com/library/archive/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/)
USBメモリが総容量が数MBになってる状態の解消

#ある日USBメモリを接続すると..
認識しない！！
windowsでもエラーで認識しない。
Macのディスクユーティリティでも数MBになっている。（マウントもできない）
フォーマットしても治らない。
そんな時は以下を試しましょう。
#ターミナルから試みる
まずはUSBメモリを接続して以下を試しましょう

```sh
$ diskutil list                                                                                                                          167ms  日 10/13 09:12:01 2019
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                 Apple_APFS Container disk1         1000.0 GB  disk0s2

##################
###############

/dev/disk3 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     Apple_partition_scheme                        *31.6 GB    disk3
   1:        Apple_partition_map                         4.1 KB     disk3s1
   2:                  Apple_HFS                         2.4 MB     disk3s2
```

こんな感じでファイルシステムのディスク容量が表示されると思います。
今回の場合は32GBのUSBメモリを接続したので`/dev/disk3`ですね。

それではフォーマットしましょう。

```sh
# disknameには適当な名前を入れてください
$ diskutil eraseDisk ExFAT diskname MBRformat disk3                                                                                            日 10/13 09:16:23 2019
Started erase on disk3
Unmounting disk
Creating the partition map
Waiting for partitions to activate
Formatting disk3s1 as ExFAT with name diskname
Volume name      : diskname
Partition offset : 2048 sectors (1048576 bytes)
Volume size      : 61700096 sectors (31590449152 bytes)
Bytes per sector : 512
Bytes per cluster: 32768
FAT offset       : 2048 sectors (1048576 bytes)
# FAT sectors    : 8192
Number of FATs   : 1
Cluster offset   : 10240 sectors (5242880 bytes)
# Clusters       : 963904
Volume Serial #  : 5da26d09
Bitmap start     : 2
Bitmap file size : 120488
Upcase start     : 6
Upcase file size : 5836
Root start       : 7
Mounting disk
Finished erase on disk3
```

これでうまくフォーマットできれば完了です。
素人がDeep Learningお勉強用環境をつくる#2

#PC部品換装
以前の投稿で、PCの選定まで完了した。
https://qiita.com/minarai-engineer/items/007d9afa4034fd533e05

本投稿では、PCの部品換装までの作業内容を記載する

##optane memoryの停止

##背面カバー外す

##メモリ/SSD取り付け

##RAMメモリアクセステスト

工事中
等比数列の和の公式の証明

# 概要
等比数列の和の公式の証明を2つ与える．後者の方がスマートである．

# 詳細
初項 $a$，公比 $r$ の等比数列の第 $n$ 項までの和は

```math
\sum_{k=1}^nar^{k-1}=\frac{a(r^n-1)}{r-1}
```
である．ただし $r\neq1$ とする．

## 証明1
上記の等式を(A)とする．
$a=0$ のとき(A)の両辺はともに $0$ となり，成り立つ．
$a\neq0$ のとき，(A)の両辺を $a$ で割ると

```math
\sum_{k=1}^nr^{k-1}=\frac{r^n-1}{r-1}
```
である．以下，この等式(B)が成り立つことを数学的帰納法を用いて示す．
[1] $n=1$ のとき(B)の両辺はともに $1$ となり，成り立つ．
[2] $n=m$ のとき(B)が成り立つと仮定する．このとき

```math
\begin{align}
\sum_{k=1}^{m+1}r^{k-1}
&=\sum_{k=1}^mr^{k-1}+r^m \\
&=\frac{r^m-1}{r-1}+r^m \\
&=\frac{(r^m-1)+r^m(r-1)}{r-1} \\
&=\frac{r^m\{1+(r-1)\}-1}{r-1} \\
&=\frac{r^{m+1}-1}{r-1} \\
\end{align}
```
となり，$n=m+1$ のときも(B)が成り立つ．
[1]，[2]より，すべての $n=1,2,\cdots$ に対して(B)は成り立つ．従って，(A)も成り立つ．

## 証明2
上記の等式を(A)とする．
$a=0$ のとき(A)の両辺はともに $0$ となり，成り立つ．
$a\neq0$ のとき，(A)の両辺を $a$ で割ると

```math
\sum_{k=1}^nr^{k-1}=\frac{r^n-1}{r-1}
```
である．この等式が成り立つことを示せばよいが，

```math
(r-1)\sum_{k=1}^nr^{k-1}=\sum_{k=1}^n(r^k-r^{k-1})=r^n-1
```
であるから，$r\neq1$ より従う．
Railsでポートフォリオを作ってみよう！ vol.2 (DB~UserModel編)

#なぜQiitaを作成したのか
もう少しポートフォリオの作品を増やす為と、Qiitaに上げることにより自分がどれくらい知識を身につけたか + 議事録になると考えた為。
調べた事とか、詰まった事、それを解決した手順等がかけたらいいなぁ。
#####※ここの内容が間違ってる等ありましたらご指摘をいただけるとありがたいです

##DB作成
まずはここからだと感じてとりあえずDB(user)を作成。
RailsTutorial第6章では name と email と password_digestだけの作成だったが、今回は
>
name -> int
nickname -> int
email -> int
password_digest -> int
self_introduction -> text

で作成。
ちなみにカラムの型の種類はざっとこんな感じ

| 型 | 説明 |
|:--|:--|
| string | 文字列(1〜255文字) |
| text | 長い文字列(1〜4294967296文字) |
| integer | 整数(4バイト) |
| bigint | 整数(8バイト) |
| float | 浮動小数 |
| decimal | 精度の高い小数 |
| numeric | 数値 |
| date | 日付 |
| datetime | 日時 |
| time | 時間 |
| boolean | trueかfalseを返す |
| primary_key | プライマリキー |

ただ、使うのはこの中から半分あるかないかぐらい(今現在自分の中では)だと思う。

##validation
このままだとnameが空欄だったりemailが空欄でも全てOKになってしまう為バリデーションを張る。
今回はemailを例にする(バリデーションが多かったし)

```ruby:user.rb
validates :email, presence: true, length: {maximum: 255}, 
format: {with: VALID_EMAIL_REGEX}, uniqueness: {case_sensitive: false}
```
validates : メソッド

presence : 空欄でないことを強制する。trueにすることによりemailが空ならvalid?でfalseを返す

length : 長さの上限を強制する。maximumを255にすることにより256文字以上入力されるとvalid?でfalseを返す

format: {with: VALID_EMAIL_REGEX} : 定数 VALID_EMAIL_REGEX に正規表現を定義してある。これによりemailのフォーマットを検証することができる(別に定数に入れなくてもここに正規表現を直入れしても行ける)
※正規表現とは? -> https://ja.wikipedia.org/wiki/正規表現

uniqueness: {case_sensitive: false} : 今回一番へぇと思ったオプション。これを使用することにより大文字・小文字を区別しないことになる。
JavaScriptで文字数をカウントする

#文字数をカウントする
```
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script language="JavaScript" type="text/JavaScript">
      function countLength( text, field ) {
        document.getElementById(field).innerHTML = text.length;
      }
    </script>
  </head>
 
  <body>
    <p>onKeyUp時に文字数をカウント</p>
    <textarea cols="20" rows="1" onKeyUp="countLength(value, 'textlength');"></textarea>
    <p id="textlength">0</p>
  </body>
</html>
```

#function countLengthについて
`var element = document.getElementById(id);`でIDが一致するオブジェクトが返される
・引数textにはvalue(テキストエリアに入力した文字)が入っている(このValueはHTMLTextAreaElementのメソッドの一つなのか何なのかよく分かってない。.valueの形でしか取り出せないのかと思っていたが勘違いらしいので後で調べる)
参考：https://developer.mozilla.org/ja/docs/Web/API/HTMLTextAreaElement
・引数fieldにはtextlength(恐らく0が入る)が入る

#innerHTMLについて
`document.body.innerHTML = "";`
要素の値を置き換えることが出来る。また空白に置き換えることで要素を削除することも可能。
参考：https://developer.mozilla.org/ja/docs/Web/API/Element/innerHTML

`function countLength`では`id="textlength"`の0を`text.length`で取得できる入力されたテキストの文字数に置き換えることになる。

#onKeyUpについて
`<element onkeyup="実行する関数">`
キーボードで何らかのキーを離した時のイベント
今回はテキストエリアに入力された文字が変化するたびに文字数が更新されるようになる。

#イベントとDOMについて
参考：https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model/Events
Laravel　csrfトークンの419エラー

vagrantのlaravel/homesteadで現在laravelの勉強中です。
post処理で４１９のエラーが出ます。
<meta name="csrf-token" content="{{ csrf_token() }}">も
@csrfも記述しております。
jsもpost時にcsrfも一緒に飛ばしているのにエラーになります。
全く原因がわからないので、どなたかご教授お願い致します。
MySQL8.0で4文字パスワードを許可

# はじめに

MySQLでは、パスワードポリシーが高く設定されているため、
デフォルトでは安易なパスワードが設定できないようになっている。

MySQLのパスワードポリシー変更記事は様々なものがあるが、バージョンなど環境により、若干ことなったりするので、
CentOS 7.6でMySQL8.0の場合で、パスワードのポリシーを変更し、4文字パスワードを許可するように変更する手順を記載する。


---

## パスワードのポリシーを変更する

```bash
$ vi /etc/my.conf

# 下記の設定を追加する

validate_password.policy=LOW
validate_password.length=4
validate_password.check_user_name=OFF
```

## セーフモード起動

```bash
$ systemctl stop mysqld
$ systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
$ systemctl start mysqld
```

## パスワードポリシーの確認

下記のように表示されることを確認する。

```bash
$ mysql -u root -e "SHOW variables like '%validate_password%';"

+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password.check_user_name    | OFF   |
| validate_password.dictionary_file    |       |
| validate_password.length             | 4     |
| validate_password.mixed_case_count   | 1     |
| validate_password.number_count       | 1     |
| validate_password.policy             | LOW   |
| validate_password.special_char_count | 1     |
+--------------------------------------+-------+
```

表示されない場合、下記のコマンドで再設定する。

```bash
$ mysql -u root -e "SET GLOBAL validate_password.policy = LOW;"
$ mysql -u root -e "SET GLOBAL validate_password.length = 4;"
$ mysql -u root -e "SET GLOBAL validate_password.check_user_name = OFF;"
```

## rootのパスワードリセット

```bash
$ mysql -u root -e "UPDATE mysql.user SET authentication_string=null WHERE User='root';"
```

---

## セーフモード解除

```bash
$ systemctl stop mysqld
$ systemctl set-environment MYSQLD_OPTS=""
$ systemctl start mysqld
```

## パスワードの再設定

パスワードをpassに設定。

```bash
$ mysql -u root 
> ALTER USER 'root'@'localhost' IDENTIFIED BY 'pass';

※ MySQL 5系の場合は、下記のコマンドで変更可能。
> UPDATE mysql.user SET authentication_string = PASSWORD('pass') WHERE User = 'root';"
```
---

## 設定したパスワードが使用できることを確認

```bash
$ mysql -u root -ppass -e "select host,user from mysql.user;"
```
eachメソッドの使い方（each_with_indexとeach.with_index）

##eachメソッド
eachメソッドとは、配列の要素分の処理を繰り返し行いたい場合に使用するメソッドです。

```ruby
#書き方
配列.each do |ブロック変数| #配列内の要素が順番に代入される
繰り返したい処理
end

sports_list = ["サッカー","野球","ラグビー","キックボクシング"]
sports_list.each do |list|
puts list
end
#=>サッカー
#=>野球
#=>ラグビー
#=>キックボクシング
```
###do…endと{}
Rubyでは、`{ }`を使うことで`do…end`を使わずに同様の処理を書くことができます。

```ruby
#書き方
配列.each { |ブロック変数| 繰り返したい処理 }

sports_list = ["サッカー","野球","ラグビー","キックボクシング"]
sports_list.each{ |list| puts list }
#=>サッカー
#=>野球
#=>ラグビー
#=>キックボクシング

```
do…endと{}の使い分けは明確には決まっていませんが
・改行を含む長いブロックの場合は`do…end`
・１行で書けるブロックの場合は`{ }`
と使い分けられる場合が多いです。
##each_with_indexメソッド

```ruby
sports_list = ["サッカー","野球","ラグビー","キックボクシング"]
sports_list.each_with_index { |list, index| puts "#{index}番目は#{list}です" } 
#=>0番目はサッカーです
#=>1番目は野球です
#=>2番目はラグビーです
#=>3番目はキックボクシングです
```
each_with_indexメソッドを使うことで、配列のインデックスも表示させることができます。
インデックスは、0から始まります。なので、1から番号を始めたい場合は、"#{ i+1 }番目のようにiに１を足してやることで求めることができます。

##each.with_indexメソッド

```ruby
sports = ["サッカー","野球","ラグビー","キックボクシング"]
#インデックスを９９に指定
sports_list.each.with_index(99) { |list, index| puts "#{index}番目は#{list}です" } 
#=>99番目はサッカーです
#=>100番目は野球です
#=>101番目はラグビーです
#=>102番目はキックボクシングです
```
任意のインデックスから始めたい場合、each.with_indexメソッドを使うことで任意の番号を指定することができます。


参考資料
>Rubyリファレンス：each_with_index
>https://ref.xaio.jp/ruby/classes/enumerable/each_with_index
>「プロを目指すための人のRuby入門」
clangのインストール

clangというのはLLVM(Low Level Virtual Machine)のC言語フロントエンドです。大雑把にはベターgccと捉えて良いと思います。先日バージョン9.0が[リリース](http://llvm.org/)され、[linuxカーネルがコンパイルできるようになった](https://www.phoronix.com/scan.php?page=article&item=clang-linux-53&num=1)ようです。LLVM自体もやってみたいし、ビルドして入れてみました。
## 環境

+ OS: ubuntu 16.04LTS
+ コンパイラ： gcc (バージョン5以上8以下)

## 準備
```
% wget http://releases.llvm.org/9.0.0/llvm-9.0.0.src.tar.xz
% wget http://releases.llvm.org/9.0.0/cfe-9.0.0.src.tar.xz
```

## ビルド
prefixとして/home/llvm、ビルドタイプとしてReleaseを指定します。

```
% tar Jxf llvm-9.0.0.src.tar.xz
% tar Jxf cfe-9.0.0.src.tar.xz
% mv cfe-9.0.0.src ./llvm-9.0.0.src/tools/
% mkdir build
% cd build
% cmake -G "Unix Makefiles" ../llvm-9.0.0.src -DCMAKE_INSTALL_PREFIX=/home/llvm -DCMAKE_BUILD_TYPE=Release
% make -j12
```
おまけ：コンパイル中動作中のgnome-system-monitor
![Screenshot from 2019-10-22 21-11-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127483/9978a529-65ad-e93b-ecda-df8e03301279.png)
直近のUsage低下はscreenshotの影響な感じ。

## インストール
```
% su
# make install
```

/home/llvm/binにPATHを通せばgcc/g++を使う感覚でclang/clang++コマンドを使えます。
mac(catalina)の.zshrc

# mac(catalina)の.zshrcを設定してみた。
macOSをcatalinaに上げたところターミナルがなんか言ってたので、
bashからzshに変わっても大丈夫なように設定をしてみた。

## .bash_profileの確認 
``` .bash_prfile 
  export PATH=/usr/local/bin:$PATH
  PS1='\h $ '
  alias ll='ls -FGl'
```
ふむふむ。。。。。。。。。。
ん？

### 第１の疑問
PS１＝ってなんだ・・・・？（設定したの覚えてない）

### 第１の疑問を調べた結果
プロンプトの表示を変えてたことが判明。
デフォルトだとbash -3.2$ って出るだけか。そうか納得。

### 第２の疑問
alias ll=
あ、そうそうls -lにエイリアス貼ってたよね。

ん？
なんだ。オプションのFG・・・って
あ、Fはフォルダをわかるようにするやつか。

G・・・・思い出せない。
フォルダに色つけるやつか・・・
なんかすごく見ずらいと思ってたのこれか。。

### 結果
ｌｓの色を変えよう。
LSCOLORSか。


# 最終的に
```
export PATH=/usr/local/bin:$PATH
export LSCOLORS=gxfxcxdxbxegexabagacad
PROMPT='%m %% '
alias ll='ls -FGl'
```
こうなりました。
継承と多様性

#はじめに
親子クラスとオーバーライドの関係で、勘違いしていたことがあったので、メモ。

#多様性
javaには多様性という概念があり、継承関係にあるクラスをざっくり捉えることができる。ということを勉強しました。つまり、子クラスを親クラスとして扱うことができるということです。

たとえば、

| 親クラス   |子クラス |   
|:-----------------:|:------------------:|
| int a            |  |
| int b           |      | 
| method1()          | method1() |    
|            |  method2() |  
    
上のようににクラス内で定義されている親子クラスがあった場合を考えます。
このとき、子クラス型で生み出された子クラスのインスタンスは `int a`,`int b`,`method1()`,`method2()`の全てを扱うことができます。
しかし、親クラス型で生み出された子クラスのインスタンス（　`親クラス型 A = new 子クラス();`　)は親クラスとして捉えられているため、`int a`,`int b`,`method1()`のみしか扱えません。

ここまでは理解できたつもりでいたのですが、一つ勘違いをしていました。
それは、
**親クラス型で定義された子クラスのインスタンスAの`method1()`を呼び出すと、子クラス側でオーバーライドされた`method1()`が呼び出される**
ということです。

親クラスで定義したからと言って、親クラスのコードだけを見ていてはいけないことになります。
#感想
私は、子クラスそれぞれに対して`equals()`メソッドを定義し、親クラスでも`equals()`メソッドを定義しなければ使えないと勘違いしていて、かなり無駄な努力をしていることに気づきました。
逆に考えると、一つのインスタンスで、親クラス型として扱うときと子クラス型として扱うときで`equals()`の定義を変えたい場面や、親クラスが同じで子クラスは違う二つの親クラス型の子クラスインスタンスが`equals()`で`true`となる状況をつくりたいときに、困ってしまうかもしれません（そんな場面が訪れることはないかもしれませんが、、）
【Python】画像ファイルをbase64エンコードしてimg要素で表示する

base64エンコードの情報自体は沢山ありますが、`base64.b64encode`するだけだとバイナリ型になってしまいます。
そのままimgタグに埋め込むとエンコード文字列が`b''`に囲まれて画像として認識されません。

`.decode('utf-8')`してやることで文字列に変換されて、imgタグで表示できるようになります。

```python
import base64
from jinja2 import Environment, FileSystemLoader

def image_file_to_base64(file_path):
    with open(file_path, "rb") as image_file:
        data = base64.b64encode(image_file.read())

    return data.decode('utf-8')

if __name__ == '__main__':

    template_env = Environment(loader=FileSystemLoader('./', encoding='utf8'))
    template_env.globals['image_file_to_base64'] = image_file_to_base64
    template = template_env.get_template('index.tpl')
    html = template.render({
            'image' : 'test.jpg'
    })

    with open('index.html', mode='w', encoding='utf8') as f:
        f.write(html)
```

```html:index.tpl
<html>
<body>
<img src="data:image/jpeg;base64,{{image_file_to_base64(image)}}" />
</body>
</html>
```

```html:index.html
<html>
<body>
<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDUFBQUFBQUF～" />
</body>
</html>
```
初心者によるプログラミング学習ログ 133日目

# 100日チャレンジの133日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

133日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>133日目<br><br>メンターさんのjavascript課題<br>Rubyの開発環境構築<br><br>どうしてもRuby勉強したい欲が我慢できなくて…<br>あと課題はわからないのでメンターさんに質問投げて終わり<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a> <a href="https://twitter.com/hashtag/javascript?src=hash&amp;ref_src=twsrc%5Etfw">#javascript</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1184940998385758208?ref_src=twsrc%5Etfw">October 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
SNS連携(iOS)とログインOAuthの流れについて簡単に(LINE・Twitter・Facebook)

##はじめに
SNSログインの調査をしたときに、AOuth認証についてもたくさん調査したのですが、
そもそもの**AOuth認証のフローの理解に苦しんだ**ので、備忘録としてまとめたのですが、
まとめたものが、そのまま半年くらいデスクトップに放置されていたので、
このまま消さないうちに、念のためアップしておきます。

なお、**誤った記載などしておりましたら、ご指摘ください。**
※SNS連携の記載情報も少し古い可能性もございますので、ご了承ください。

## SNS連携(iOS)とログインOAuthの流れについて簡単に(LINE・Twitter・Facebook)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/9679abc1-5ebf-96ad-9d04-7a1e9c245e06.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/4682d16f-1fbc-2868-6a5a-1cb78ea37001.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/7b8d4306-65a3-b08e-b858-9c2425c9a838.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/1232f0ab-0136-429f-1ed2-614b986ea5bf.png)

developperサイト
LINE：https://developers.line.biz/ja/
Twitter：https://developer.twitter.com/
Facebook：https://developers.facebook.com/

使用するSDK(iOS)
LINE:https://developers.line.biz/ja/docs/ios-sdk/swift/overview/
Facebook：https://developers.facebook.com/docs/ios

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/08a9965b-3ef3-8d64-7841-573c82b4ae8c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/548e4e7f-00d5-af5f-9f2e-2c72c4a1d5e2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/de24e630-1fff-7a25-cb39-8d8f2e45e332.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/4ecfad34-174b-a8bb-6870-ebb009776c4b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/560dba63-f7d3-0894-361c-5d9924ccda8f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/75c84764-ec8a-e251-ea76-55eba6d3df00.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/8e7df30f-a705-2e3f-bd3f-37e362f4c6d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/5989b558-6860-e990-6c4d-ce29484df582.png)

##まとめ
資料は勢いで完成させないと、そのままお蔵入りになってしまう可能性が高いということを学びました。
業務等を通して、またOAuthの理解を深めていきたいと思います。
SNS連携関連で記事も書いておりますので、何かの参考になればと思います。

- [【Swift5】LINEログインしてプロフィール情報を取得する](https://qiita.com/haru15komekome/items/91e1d139aa4275a87df1)
- [【Swift5】Twitterログインしてトークン情報を取得する](https://qiita.com/haru15komekome/items/10bd68df52ad72233b5c)
- [【Swift5】Facebookログインしてプロフィール情報を取得する](https://qiita.com/haru15komekome/items/8f63a6273103489503a3)

##参考
- [OAuth 2.0 の仕組みと認証方法](https://murashun.jp/blog/20150920-01.html)
正規分布で時計を作ってみた

 百聞は一見に如かずという事で。

20時49分です。

![norm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178570/91cc5a77-627f-2eec-f201-0bb8be1180a1.png)

形状と時刻が一対一対応しているのでアナログ時計と同じように使えます。

# 作り方

```python:python
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime as dt
from scipy.stats import norm

# 現在時刻を取得
hour = dt.now().hour
minute = dt.now().minute

# 標準偏差は正にしたいので
# あと、[平均]時 [標準偏差]分 形式にしたいので
if minute == 0:
    minute = 60
    
# x軸の左右端
xlim = 200

# 値を作成
X = np.arange(-1*xlim, xlim, 0.1)
Y = norm.pdf(X, hour, minute)

# プロット
plt.plot(X,Y)
plt.title('μ: %d    σ: %d' % (hour, minute), fontsize=14)
plt.xlim([-1*xlim, xlim])
plt.rcParams["font.size"] = 14
plt.savefig('norm.png')
plt.show()
```
webpackでBulmaを使いたい

[公式](https://bulma.io/documentation/customize/with-webpack/)に丁寧にまとめられていました

必要なローダー等のインストール

[](https://stackoverflow.com/questions/46381209/why-is-document-is-not-defined-error-on-webpack-build)

```sh
npm install --save-dev css-loader node-sass sass-loader style-loader
```

bulmaのインストール

```sh
npm install --save-dev　bulma
```

## webpack.config.jsの編集

`rules`はbootstrapのものが参考になりました。[こちら](https://qiita.com/gsk3beta/items/a0a833f2f01628c9d7e8)もご参照ください

```js:webpack.config.js

  entry: {
    use_bulma: './assets/scss/use_bulma.scss',
  },
...
        rules: [
      {
        test: /\.(scss)$/,
        use: [
        {
          loader: 'style-loader',
        }, {
          loader: 'css-loader',
        }, {
          loader: 'postcss-loader',
          options: {
            plugins: function () {
              return [
                require('precss'),
                require('autoprefixer')
              ];
            }
          }
        }, {
          loader: 'sass-loader',
        },
        ]
      }
...
```

## 例

```scss:assets/scss/use_bulma.scss
@charset "utf-8";

@import url('https://fonts.googleapis.com/css?family=Nunito:400,700');

// Set your brand colors
$purple: #8A4D76;
$pink: #FA7C91;
$brown: #757763;
$beige-light: #D0D1CD;
$beige-lighter: #EFF0EB;

// Update Bulma's global variables
$family-sans-serif: "Nunito", sans-serif;
$grey-dark: $brown;
$grey-light: $beige-light;
$primary: $purple;
$link: $pink;
$widescreen-enabled: false;
$fullhd-enabled: false;

// Update some of Bulma's component variables
$body-background-color: $beige-lighter;
$control-border-width: 2px;
$input-border-color: transparent;
$input-shadow: none;

@import "~bulma/bulma";
```

```html
<h1 class="title">
  Bulma
</h1>

<p class="subtitle">
Modern CSS framework based on <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox">Flexbox</a>
</p>

<div class="field">
  <div class="control">
    <input class="input" type="text" placeholder="Input">
  </div>
</div>

<div class="field">
  <p class="control">
  <span class="select">
    <select>
      <option>Select dropdown</option>
    </select>
  </span>
  </p>
</div>

<div class="buttons">
  <a class="button is-primary">Primary</a>
  <a class="button is-link">Link</a>
</div>
```

![bulma.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79562/6ea8b77e-da9e-5941-6fd1-df39a9fba8a5.png)


## djangoで動かすなら

[こちら](https://qiita.com/gsk3beta/items/c2b902c3659610701071)もご覧ください
React+webpackでress.cssを導入する

Reactを使い、webpackでbundleしたコードを立ち上げた。
その後chromeで開いた際、`<body>`に取りたくないmarginがデフォルトで設定されていたので、取り除く対応を行った。

導入したライブラリは`ress.css`。
ブラウザによってデフォルトで当てられてしまう各スタイルをノーマライズするために用いられるらしい。
類似ライブラリとして`normalize.css`というものもある。
（詳しいことは公式のDocへ→　[ress.css(github)](https://github.com/filipelinhares/ress) ）

# 実際に導入する

### 1. npmでress.cssをインストールする

```
yarn add ress
```

### 2. 一番上位のjs(index.js)にimportする

```index.js
import React from 'react';
import { render } from 'react-dom';
import * as serviceWorker from './serviceWorker';
import App from './App';

import 'ress'; // ress.cssをインポート

render(
    <App/>,
    document.getElementById('root')
);

serviceWorker.unregister();
```

webpackを用いてない場合はここまで。
webpackを用いている場合は、cssのインポートを解決してあげる為にloaderの設定をする。
(create-react-appを使っている場合でもwebpackは用いているが、必要なloaderはデフォルトで追加されている。)

### 3.webpack.config.js(webpackの設定ファイル）に必要なものを追加

```webpack.config.js
~~略~~
  module: {
    rules: [
      {
          test:/\.css/,
          use: [
            'style-loader',
            'css-loader',
          ],
      },
~~略~~
```

<br>
これで`ress.css`が適用される。
【Rails】syntax error, unexpected tIDENTIFIERの原因

#タイトルにあるエラーが出た時の対処
```
syntax error, unexpected tIDENTIFIER
```
というエラーが出た時は

- コードに全角スペースが入っていないかどうか
- 「"」「、」などの全角の文字を入力していないかどうか

などが原因の可能性が高いので確認してみましょう。

エラー文を直訳すると「構文エラー、予期せぬ識別子(tlDENTIFIERは識別子のこと)」となるので、コードの中で予期せぬ所に識別子が使われているというエラー文になります。
※scivolaさんより
×「間違った識別子を使っている」
○「識別子を書くことができない部分に書かれている」
というご指摘をいただき、修正を行いました。

##おすすめ
**「Ctrl + F」**で現在開いているページの文字検索ができるので、「　」(⬅︎全角スペース)で検索するとミスがすぐ見つかります。
v0.61 から始めるreact-nativeの注意点まとめ

react-nativeを始めるには、大きく分けて2つの道があります。
[expo][expo]という、js以外の部分を全てexpo serverにまかせてしまう方法、
及び、[react-native-cli][react-native-cli]を使って、jsのファイルからiOS,Androidのビルドまでを自分で行う方法、いわゆる素のreact-nativeです。

いままで、素のreact-nativeで開発するには、jsの知識の他に、iOSやAndroidのビルド知識や、ネイティブの知識が多く必要でした。

しかし、最近(2019/10/22現在)では、素のreact-native回りで苦労する人が多かった、Native Moduleを使ったライブラリとのLinkなどがだいぶ楽になってきました。
react-native v0.61では、Fast Refresh機能や、Metro bundler上でログが表示されたり、現在のExpo(v35)には無い機能があるので、個人的には素のreact nativeで開発するほうが楽なのではと考えています。

しかし、素のreact-nativeならではの注意点はまだ存在するため、個人的な忘備録として、その注意点を記載します。

気が向いたら追加していきます。

## TypeScriptでreact-nativeを始める。
react-native typescriptで検索すると、結構前にMicrosoftが用意していたTemplateを使って始める[React Native公式ブログの記事][react-native-blog]が出てきます。

2019/10/22時点でこのページに記載されているTemplateは**古い**です。
templateリポジトリが存在しないのか、この記事の通りコマンドを打っても失敗します。

今は、コミュニティが作成している、[typescriptのtemplateリポジトリ][react-native-typescript-template]が存在するので、そちらの手順に従って、以下のコマンドでプロジェクトを作成しましょう。

```sh
npx react-native init MyApp --template react-native-template-typescript
```


## react-native-vector-icons を使う

react-native v0.60以降は、Native ModuleをLinkするのに、`react-native link`コマンドを使用する必要がなくなりました。 iOSの場合`cocoapods`, Androidの場合 `jetifier` が良い感じにNative ModuleのLinkを自動的にやってくれます。
ただ、自動的に変更してくれる箇所以外にも変更が必要な箇所があるライブラリもあります。
その一つが[react-native-vector-icons][react-native-vector-icons]です。
react-native-vector-iconsはNative ModuleのLinkの他に、Vector-iconのFontファイルが読み込まれるようにする必要があります。react-native-vector-iconsのREADMEにも記載されていますが、下記手順を取ればFontファイルが読み込まれます。

### iOS

`info.plist`に、使用したいFontを記載します。提供されているアイコン全てを使う場合は、以下の内容を`info.plist`に追記してください。

```xml
<key>UIAppFonts</key>
<array>
	<string>AntDesign.ttf</string>
	<string>Entypo.ttf</string>
	<string>EvilIcons.ttf</string>
	<string>Feather.ttf</string>
	<string>FontAwesome.ttf</string>
	<string>FontAwesome5_Brands.ttf</string>
	<string>FontAwesome5_Regular.ttf</string>
	<string>FontAwesome5_Solid.ttf</string>
	<string>Foundation.ttf</string>
	<string>Ionicons.ttf</string>
	<string>MaterialIcons.ttf</string>
	<string>MaterialCommunityIcons.ttf</string>
	<string>SimpleLineIcons.ttf</string>
	<string>Octicons.ttf</string>
	<string>Zocial.ttf</string>
</array>
```
### Android
`android/build.gradle` (`android/app/build.gradle`じゃないほう)に下記の内容を追記します。

```
apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"
```

追加するFontの数を絞りたい場合は、代わりに下記の内容を追記します。

```
project.ext.vectoricons = [
    iconFontNames: [ 'MaterialIcons.ttf', 'EvilIcons.ttf' ] // 追加したいFontファイル
]

apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"
```

[expo]:https://expo.io/
[react-native-cli]:https://github.com/react-native-community/cli
[react-native-blog]:https://facebook.github.io/react-native/blog/2018/05/07/using-typescript-with-react-native
[react-native-typescript-template]:https://github.com/react-native-community/react-native-template-typescript
[react-native-vector-icons]:https://github.com/oblador/react-native-vector-icons
[website-pull-request]:https://github.com/facebook/react-native-website/pull/1419
Serverless Days Tokyo 2019 トヨタ自動車・ダイキン工業 事例覚書


Serverless Days Tokyoに参加してきました。いずれも興味深い内容ばかりでしたが、ダイキン工業とトヨタのIoTシステムの中の話は、こういう機会でもなければ聞けない話でかなり貴重な話を聞けた感がありました。
その内容をメモったので残しておきます。

入り口の様子。
![IMG_4993.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/b03e6c0c-b401-5a59-c103-72eaf2d2bf54.jpeg "IMG_4993.JPG")

会場の様子。休みの日の朝9時からというのに、ほぼ満席な感じでした。
![IMG_4987.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/30d3ff00-03aa-9cf8-bb62-89cd89a0361d.jpeg "IMG_4987.JPG")


## ダイキン工業：空調設備向けIoTシステムにおけるランニングコスト

* ダイキン工業は、全世界の空調機（エアコン等）をインターネットに繋いで、販売、運用、保守、施工に対するサービスを提供する。
* システム名は「Daikin Global Network（ダイキン・グローバルネットワーク）」
* 想定接続台数は500万台。各空調機が1分ごとにデータをサーバーにあげる。
* 想定ユーザー数は30万人。
* 無限に発生するデータを格納できるストレージが必要。
* 断固としてデータベースにRDBは使わず、全てNoSQLで扱う。
* 初期投資を抑えるためにサーバーレスでスモールスタート。
* サーバーレス開発はクラウドランニングコストとの戦い。
* 一般にサーバーレスは低コストと言われるが、大規模なIoTシステムにおいては、サーバーレスアーキテクチャだとスケールしてコストがかさむ。
* ユーザーが監視中は毎分データの取り出しを行う。
* ユーザー監視中は建物内のデータを全て表示するので、複数機器のデータを一度に取り出す。
* Lambdaの処理時間を抑えてコストを抑えるためには、DynamoDBのデータ構造が重要。
* データ書き込み側は少しづつ書き込みたい、読み出し側は一度に読み込みたいという要求があった。
* １機器中の１データにつきDynamoDBの１レコードとして保存すると、書き込みは速いが読み込み時に数千レコードを読み込むこともあり読み込みコストが高い。
* 最終的にDynamoDBのパーティションキーに建物ID、ソートキーに機器IDを指定、データはJSONとして１レコードに格納することで書き込み、読み込みのコストを低減。
* 失敗談として、ログレベルをDebugにしたままテストを実行して、CloudWatchLogに数百億のログを送信してしまい、アマゾンから数十万円を請求された。ログレベルには気をつけましょう。

## トヨタ x サーバーレス

グローバル展開のコネクティッドカーを支える大規模サーバーレス事例

* なぜトヨタがサーバーレスを選んだのか。
	* トヨタ車とドライバー、保険事業者、官公庁などをIoTで結ぶ。
	* セキュリティ会社とIoTでつないで盗難検知（遠隔からエンジン始動を禁止できる）
* 圧倒的スピードでお客様へ価値を提供するには人的リソースが必要。でも人的リソースはトヨタといえども無限にあるわけではない。
	* 価値を生まない部分を徹底的に削減。
* 車からのサーバーへのアクセスは日中は多く、夜は少ない。
	* サーバーレス化することで無駄をすべてマネージド化。
* 法規上の問題で、コネクティッドカーのサーバーは各国ごとに作らなければならない。
	* 車の多い地域もあれば少ないあ地域もある。同じ規模のシステムを構築すると車の少ない地域ではコストが無駄になる。

* トヨタのコネクティッドカーシステムは、地域ごとに分かれているシステムと、グローバルで共通のシステムとで連携する設計となっている。
* 状態を特定のコンポーネントで集中管理し、プロセスをステートレスな設計にすることで、部分部分を再起動できる構成に。
* アーキテクチャースタイル
	* アーキテクチャを決めるためのスタイル。

* 設計の選択肢
	* Nティアー
	* ウェブキュー・ワーカー/イベントドリブン
	* マイクロサービス
* 各コンポーネントの設計
	* リクエストの受信には２つの選択肢
		* Amazon API Gateway + Lambda
		* Application Loadbalancer + Fargate（スケールを柔軟にコントロールしやすい）
	* データの保存は全てDynamoDB（オンデマンドにすることでスケーリングを柔軟にコントロールできる）
	* インテグレーション
		* Amazon SQS（１つのメッセージに対して１つのパブリッシャー）
		* Amazon SNS
		* Amazon Kinesis Data Streams（キャパシティを拡張したり縮小したりできる）
	* ワーカープロセスは全てLambda

* サーバーレスの課題
	* テストがしにくい
		* CI/CDパイプラインでテスト実行環境をつくる。
			* CodeCommit Codeepipeeline ...
			* LocalStackを利用してサービス単体でのテストをローカル/自動実行を可能にした
	* 各機能はシンプルになるが全体像が把握しにくい。
		* ロギング/分散トレーシング環境をしっかり作る。
		* ログはCloudWatch Logsに出すのが便利。
		* ログの出し過ぎは後から高コストに繋がる。
		* X-Rayを活用した分散トレーシング。
	* 自動スケールは便利だが、コントロールすべき項目が出てきた。
* 自動スケールが逆に問題となるケース
	* 成功するまでリトライを行う必要のある仕様のLambdaがあった。
	* あっという間に数千処理が並行処理する状態になる。
	* Lambda同時実行数がアカウントの上限に達し、他のLambdaが起動できない状況に。
* 運用コストの見積もりは50%ダウン。
* 運用チームにかかっていたコストを開発チームに投与。開発サイクルを高速化。
* １ヶ月あたり624回デプロイしている。
* 今後は問題が生じた際の回復も自動化していきたい。


会場ではドーナツもいただきました。コーヒーもあって大変美味しかったです。
![IMG_4992.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/f7a67d17-513d-97de-2620-0f7389129a76.jpeg "IMG_4992.JPG")
Git基礎

#Gitの利用方法

- リモードリポジトリの作成
    - [Githubを利用](https://github.com/)
    - [Bitbucket](https://bitbucket.org/)
    - [リポジトリサーバー自作](http://qiita.com/nekogeruge_987/items/326ba157d5552f0076be)
- Gitディレクトリ
    - `$ git init` 
    - `$ ls -a` → `.git` ができていることを確認
- リモートリポジトリの登録
    - `$ git remote add 設定するリモートリポジトリ名 リモートリポジトリURL`
- 作業ディレクトリ内の全てのファイルをステージングエリアにステージング
    - `$ git add ファイル名`　指定したファイルをステージング
    - `$ git add -all` 全てのファイルをステージング
- ローカルリポジトリにコミット(ステージングエリアのファイルをローカルリポジトリに登録)
    - `$ git commit -m "コメント"` 
    - 最初のcommitで<b>masterブランチ</b>(開発の本流)が作成される
        - `$ git branch` →　*masterとなってることを確認
- リモートリポジトリへプッシュ(ローカルリポジトリに登録された内容をリモートリポジトリに登録)
    - `$ git push リモートリポジトリ名 リモートブランチ名`

#参考文献
https://git-scm.com/book/ja/v2
http://programmerbox.com/2013-07-17_git_summary/https://note.mu/koushikagawa/n/n56d158125ee9
【SQL】データ操作:検索などの処理内容を指定する方法(SELECT, INSERT, UPDATE, DELETE)

# はじめに
SQLはデータベースを操作するためのプログラムです。
プログラムをどのように分解するかは賛否あると思いますが、
ここでは以下の４つに分類して基本の構文をまとめます。

- **処理内容:検索/更新/挿入/削除のいずれの処理をおこなうか**
- [対象テーブル:処理対象のテーブルと、テーブル間の関係](https://qiita.com/yatto5/items/0f64db56928c84deaca0)
- [絞り込み条件:対象レコードをどのように絞り込むか](https://qiita.com/yatto5/items/df7742990e2d28057d45)
- 表示条件・計算など:定義された関数での計算や表示順など

このページでは処理内容の基本構文をまとめます。
処理内容には「検索」「挿入」「更新」「削除」の４つがあります。

例として、年別の会員名簿(こんなデータの持ち方イケてないですけど)とステータスの区分を表す
合計3テーブルが存在するとして、各SQLの動きを解説します。

**1年目会員名簿(MEMBER_LIST_1ST)**

|ID|FAMIRY_NAME|FIRST_NAME|BIRTH_DAY|GENDER|STATUS_ID|NOTE|
|---|---|---|---|---|---|---|
|0001|鈴木|太郎|1980/10/25|M|1||
|0002|山田|太郎|1981/3/1|M|1||
|0003|佐藤|長次郎|1980/4/2|M|1||
|0004|鈴木|定子|1980/8/2|F|1||

**2年目会員名簿(MEMBER_LIST_2ND)**

|ID|FAMIRY_NAME|FIRST_NAME|BIRTH_DAY|GENDER|STATUS_ID|NOTE|
|---|---|---|---|---|---|---|
|0001|鈴木|太郎|1980/10/25|M|1||
|0002|山田|太郎|1981/3/1|M|2||
|0003|佐藤|長次郎|1980/4/2|M|1||
|0004|鈴木|定子|1980/8/2|F|1||
|0005|鈴本|花子|1980/12/14|F|1||

**ステータス区分(STATUS_DIV)**

|STATUS_ID|STATUS_TEXT|
|---|---|
|1|正規会員|
|2|退会|

# 検索(SELECT)
```SQL:SELECT
SELECT *  FROM STATUS_DIV
```
ステータス区分テーブルに存在するすべてのデータが取得できます

|STATUS_ID|STATUS_TEXT|
|---|---|
|1|正規会員|
|2|退会|

# 挿入(INSERT INTO)
```SQL:insert_set_values
INSERT INTO STATUS_DIV(STATUS_ID, STATUS_TEXT) VALUES (3, '休止')
```
ステータス区分テーブルにレコードが一つ追加されます

|STATUS_ID|STATUS_TEXT|
|---|---|
|1|正規会員|
|2|退会|
|***3***|***休止***|

```SQL:insert_from_table
INSERT INTO MEMBER_LIST_1ST select * FROM MEMBER_LIST_2ND WHERE ID = '0005"
```
1年目会員名簿に、2年目会員名簿でIDが'0005'のレコードが追加されます

|ID|FAMIRY_NAME|FIRST_NAME|BIRTH_DAY|GENDER|STATUS_ID|NOTE|
|---|---|---|---|---|---|---|
|0001|鈴木|太郎|1980/10/25|M|1||
|0002|山田|太郎|1981/3/1|M|1||
|0003|佐藤|長次郎|1980/4/2|M|1||
|0004|鈴木|定子|1980/8/2|F|1||
|***0005***|***鈴本***|***花子***|***1980/12/14***|***F***|***1***||

# 更新(UPDATE)
```SQL:update
UPDATE MEMBER_LIST_2ND SET STATUS_ID = '2' WHERE ID = '0001'
```
2年目会員名簿でIDが'0001'のレコードSTATUS_IDが更新されます

|ID|FAMIRY_NAME|FIRST_NAME|BIRTH_DAY|GENDER|STATUS_ID|NOTE|
|---|---|---|---|---|---|---|
|0001|鈴木|太郎|1980/10/25|M|***2***||
|0002|山田|太郎|1981/3/1|M|2||
|0003|佐藤|長次郎|1980/4/2|M|1||
|0004|鈴木|定子|1980/8/2|F|1||
|0005|鈴本|花子|1980/12/14|F|1||

# 削除(DELETE)
```SQL:delete
DELETE FROM MEMBER_LIST_2ND WHERE ID = '0002'
```
2年目会員名簿でIDが'0002'のレコードが削除されます。 

|ID|FAMIRY_NAME|FIRST_NAME|BIRTH_DAY|GENDER|STATUS_ID|NOTE|
|---|---|---|---|---|---|---|
|0001|鈴木|太郎|1980/10/25|M|2||
|0003|佐藤|長次郎|1980/4/2|M|1||
|0004|鈴木|定子|1980/8/2|F|1||
|0005|鈴本|花子|1980/12/14|F|1||
【Cassandra】特徴整理

# Cassandraの特徴について
一般的に言われていること... ただし、表現？とか若干、主観が入ってるかもしれない...。

# パフォーマンス
・書き込み操作について、非常に高いスループット
　・特に書き込み ( 追加書き込み ) で非常に高いスループット
　・データ更新・削除については、実際にはディスク上のデータの置換えをしないようにすることで、オーバヘッドを回避
・読取り操作について、それなりのスループット
　・ハッシュに基づくデータ検索なので、キー等価検索の性能は高い。
　・シーケンシャルアクセス的な読み取り操作には向いていない。

※CassandraのI/OはLSM-treeのバリエーションなので、パフォーマンスにはそのメリデメが反映される。

# 拡張性、弾力性 ( Elasticity )
・マスターレスのアーキテクチャにより、水平方向での直線的な拡張性を提供
　・ボトルネックとなる特定の役割を果たすノードが存在しない。( マスター/スレーブのようなアーキテクチャではない。 )
　　・ノード数を2倍にするとスループットが倍増 ( ただし、データが適切に分散されることが前提 = 適切なモデリング )
・拡張作業が容易
　・すべてのノードがほぼ同じ設定
　　・設定ファイルのIPアドレスとかは変えないといけない...けど、あとはだいたい同じ設定にできる。
・ダウンタイムや進行中の作業の中断なく拡張可能

※オンプレでの比較、クラウドサービスとの比較ではない

# 高可用性
・SPOF回避
　・( 自動的に )データを複数のノードに複製するアーキテクチャ
・障害時にフェールオーバ切替が発生なし ( システムの複雑さ低減 )
・マルチデータセンタ対応のレプリケーション

※パッチ適用やバージョンアップを業務無停止( ローリングメンテ )で実行可能なのは大きなメリット

# 低コスト
・比較的低コストのサーバで構成可能
　堅牢で高価なハードウェアを必要とするリレーショナルデータベースとは異なる。

※ディスクはSSD推奨
※ノード1台1台のスペックアップよりもノード追加推奨だが、商用サポートのディストリビューションの場合、ノードを増やすとライセンス費用も増える...

# データ圧縮
・80%に達するデータ圧縮率
　・ディスクのデータ量削減
　・データ圧縮のCPUオーバーヘッドより、データ圧縮によるIO時間向上のメリットが大きい場合、読み取りと書き込みのスループットが向上

# データ操作
・Cassandra Query Language( CQL )の提供
　・なんとなくSQLに似ているので、なじみやすい。
・Relational ( RDB的 ) な操作はできない。( 本質はKVS的なものなので )
　・テーブルの結合( JOIN )不可、参照整合性の概念なし ( クエリに合うようにテーブルを設計要 )
　・Subquery ( 副問い合わせ )のサポートなし
・セカンダリインデックスはいちおう使用可能、ただし制約が多いし、効率悪い
・JSONサポート

※NoSQL系はRDBのように統一された規格( SQL )がないので、CQLが用意されているのは大きなメリットかと。

# Consistency、トランザクション
・基本的に結果整合性 ( なので厳密なトランザクションが必要な業務には向かない。 )
　・CassandraはDynamoDBと同様に結果整合性がベース
　・定期的に手動メンテナンス( repair )が必要、repairするまでは整合性は保証されない。
・調整可能な整合性 ( Tunable consistency )
　・読み取りまたは書き込み操作のレベルで整合性を調整可能
・トランザクションをサポートしない。
　・ロールバック機構を提供していない。
　・ロック機構を提供していない。
　・以下の機能をサポートしているが、いろいろと制限あり。
　　・atomic batch( 複数処理を1単位として扱う )
　　・楽観的ロックのサポート CAS(軽量トランザクション)
Filesystem Hierarchy Standard

# 初めに
リナックスの起動に関する問題に直面したのをきっかけに起動シーケンス周辺を勉強しているのですが、そこで出会った内容をちょいとメモしたいと思いまして。

Linuxのセットアップファイルが雑誌に添付されるようになったころから、「ファイル構造分かりにくいなー」と思ってはいたのですが、きちんと考えたことはありませんでした。

幾つかのLinuxディストリビューションで共通する構造になってきているとは思っていたのです。
で、偉い人たちがきちんと考えてくれていたようで、タイトルの通りLinuxのディレクトリ構造はFHS（Filesystem Hierarchy Standard）つまり「ファイルシステム階層構造標準」としてまとめられている様子。

現在はFHSバージョン3.0。2015年に策定された様です。

---

とはいえ、[レッドハット社のサイト](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/storage_administration_guide/s1-filesystem-fhs)を見てみると独自拡張しているとの文言もあり、今後の拡張や変更も出てくる様に思います。
という訳で、以下に抜粋した内容は当然現状という事になります。

# FHS V3.0 抜粋

| パス             | 内容              |
|:-----------------|:------------------|
| /	       |ルートディレクトリ
|/bin          |一般ユーザー向けの基本コマンド
|/boot         |システム起動時のファイル
|/dev          |実デバイス、仮想デバイス
|/etc          |システム全体の設定ファイル
|/etc/opt      | /opt/のための設定ファイル群。
|/etc/X11      |X Window用設定ファイル
| /home        |ユーザーのホームディレクトリ
|/lib          |実行ファイルのライブラリ
|/media        |リムーバブルメディアのマウントポイント
|/mnt          |ファイルシステムの一時マウントポイント
|/opt          |アプリケーションソフトのインストール先
|/proc         |カーネル、プロセスに関する情報
|/root         |rootユーザのホームディレクトリ
|/sbin         |システム管理に不可欠の実行ファイル
|/srv          |Webに公開するデータ
|/tmp          |一時ファイル
|/usr          |一般マルチユーザのユーティリティとアプリケーションを格納
|/usr/bin      |一般ユーザ向けだが基本的ではないコマンドの実行ファイル
|/usr/include  |includeファイル
|/usr/lib      |/usr/bin/ や /usr/sbin/ のライブラリ
|/usr/sbin     |基本的でない(/sbin にない)システム実行ファイル
|/usr/share    |アーキテクチャに依存しない共有データ（？？？）
|/usr/src      |ソースコード
|/usr/X11R6    |X Window
|/usr/local    |ローカルデータを格納する。サブディレクトリとして /usr と似た構造を持つ
|/var          |可変ファイル。容量が常に変化するようなファイルを格納
|/var/cache    |アプリケーションのキャッシュデータ。
|/var/log      |ログファイル
|/var/mail     |メールボックス
|/var/spool    |処理待ち状態のタスクのスプール。印刷待ちなど。
|/var/tmp      |一時ファイル。再起動しても削除されない。

#終わりに
WikiとRedHat社の内容をコピペになり過ぎないよう配慮しつつ。

# リンク
・[Wikipedia](https://ja.wikipedia.org/wiki/Filesystem_Hierarchy_Standard)
・[RedHat FHSの概要](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/storage_administration_guide/s1-filesystem-fhs)
・[]()
・[]()
yum installの参照元リポジトリとインストール内容を確認する

yum installする際に気になって調べてことのメモです。

# パッケージのインストール元を確認する
現状の参照元リポジトリを確認するには以下のコマンドを実行

```
$ yum repolist
```

# インストールされるパッケージ内容をインストールなしで確認する

予期しない対象のインストールを避けるために以下のコマンドで事前にインストールされるものを確認すると良い

```
$ yum install --assumeno php
```
pythonでpackageのソースコードを確認する (inspect)

インストール済みpackageのソースコードを確認したいときの手順です。例えばkeras.optimizers.Optimizer.pyの内容は以下で確認できます。

```python:python
import inspect
import keras
print(inspect.getsource(keras.optimizers.Optimizer)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/db67fd75-503f-7fe6-6fd1-2653d8217228.png)

レッツトライ！
Blender忘備録（自分用）

### 選択
- A : 全選択
- L : 独立したメッシュの選択
- B : 矩形選択
- C : 円で塗りつぶし選択
- Shiftキー＋左クリック : 複数選択
- Ctrlキー＋左クリック: 最短距離を選択
- Ctrlキー+左クリック＋ドラッグ: 輪っか選択
- Alt+右クリック : 辺ループ選択
- Ctrl+Alt+右クリック : 辺リング選択
- Ctrl + ＋ : 選択範囲の拡大
- Ctrl + － : 選択範囲の縮小
- Ctrl + I : 選択範囲の反転
- Alt＋Shift＋M : 非多様体選択 メッシュに穴が開いている部分（切り口的な部分）を一括で選択出来ます。
- Shift＋Ctrl＋Alt＋F : リンクするフラットな面
- Shift＋G : 類似選択

### meshを分離
- 選択　→　P

### meshを結合
- objectを選択　→　ctrl + J

### ラティス構造を作る
https://www.romanreiner.com/3d-lattice-structure-design-for-additive-manufacturing/


### 面白そうなaddon

- https://github.com/alessandro-zomparelli/tissue
- Mesh Tools Addon
- https://github.com/jayanam/fast-carve/tree/fast-carve-2-8


### 分割したメッシュを結合する（節点がない場合）

1. 結合したいメッシュを選択　→　面　→　交差（ブーリアン）　：これで交差する所に節点ができる
1. 結合したいメッシュを選択　→　メッシュ　→　マージ　→　距離で（非選択部にチェックを入れる）　：これで節点同士が結合される

### 回転の中心を設定

ピボットポイントを設定する。3Dカーソルにすると、任意に設定できる
GCPのセグメントを集約してアドバタイズする方法

CloudRouterを使いVPNやInterconnectを接続した際に、ルートのアドバタイズの仕方でつまづいたので、こちらにナレッジとして残しておきたいと思います。

#AWSでのルートテーブル
AWSではVPC、サブネットに対してセグメントを付与できるため、VPC側でルートをまとめることができます。
VPC側で172.30.0.0/16を設定した場合、下記のような構成図だと、VPC側のルートテーブルにはVPC
のセグメントがアドバタイズされます。
![AWS VPC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475010/0a453c66-235b-4aa4-618c-779721143b1d.png)


##VPC側のルーティングテーブル

|送信先|ターゲット|備考|
|:-:|:-:|:-:|
| 172.30.0.0/16 | local | VPC内部でルーティング |
| 10.1.1.0/24 |  DirectConnect |  専用線へ |
| 0.0.0.0/0 | internet | インターネットへ |

##自宅側ルータのルーティングテーブル
|送信先|ターゲット|備考|
|:-:|:-:|:-:|
| 10.1.1.0/24 | local | 自宅内部でルーティング |
| 172.30.0.0/16 | vpn-gw | 専用線 |
| 0.0.0.0/0 | internet | インターネットへ |

#GCPの場合

GCPでも同じくVPC,サブネットを作成可能ですが、GCPではサブネットにしかセグメントを付与することができません。
したがって下記のような構成にした場合、CloudRouter側にはサブネットのセグメントがアドバタイズされます。
![GCP VPC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475010/20192072-02e7-80bc-93f0-c1233f332933.png)


##CloudRouter側のルーティングテーブル

|送信先|ターゲット|備考|
|:-:|:-:|:-:|
| 172.31.10.0/24 | local | サブネットへルーティング |
| 172.31.20.0/24 | local | サブネットへルーティング |
| 172.31.100.0/24 | local | サブネットへルーティング |
| 172.31.120.0/24 | local | サブネットへルーティング |
| 10.1.1.0/24 |  CloudRouter |  専用線へ |
| 0.0.0.0/0 | internet | インターネットへ |

##自宅側ルータのルーティングテーブル
|送信先|ターゲット|備考|
|:-:|:-:|:-:|
| 10.1.1.0/24 | local | 自宅内部でルーティング |
| 172.31.10.0/24 | vpn-gw | 専用線へ|
| 172.31.20.0/24 | vpn-gw | 専用線へ|
| 172.31.100.0/24 | vpn-gw | 専用線へ|
| 172.31.120.0/24 | vpn-gw | 専用線へ|
| 0.0.0.0/0 | internet | インターネットへ |

#CloudRouterを利用した際のアドバタイズの問題点
上記に記載したように、GCPではセグメントごとにルートがアドバタイズされます。
通常であればこれらを設定すればルートのアドバタイズは完了です。しかし社内で静的ルーティングを設定している場合はGCPのサブネットを作成するたびにルーティング経路を追加する必要があるという煩雑な管理方法になってしまいます。
これらの対策として、CloudRouterにはカスタムルートを使用したルートの管理方法があります。

#カスタムルートアドバタイズ
カスタムルートを使用した場合、CloudRouterからオンプレミスルータへBGPを利用してルートのアドバタイズが可能となります。
やり方は[こちら](https://cloud.google.com/router/docs/how-to/advertising-overview?hl=ja)

ただしこちらを実施する場合、VPC内に新たにサブネットを作成した際に手動でCloudRouterにアドバタイズの設定を追加する必要があります。

#カスタムルートアドバタイズを使う場面
私個人としては、あまり必要ないんじゃないか？と思っています。
AWSをメインで使っており、NWの管理的にセグメントをまとめたい、という判断をされた人は使ってみるといいかもしれません。
全ての経路をBGP等で動的に学習していればそこまで必要はないと思われます。

#余談
GCPでプライベートIPを保持しているサービスを調べた結果をまとめました。
・GCE
・GKE
・CloudSQL(Google固有の内部VPCにいるので制約あり)

他にもあったら教えてください。


参考
https://cloud.google.com/router/docs/how-to/advertising-overview?hl=ja
https://cloud.google.com/router/docs/how-to/advertising-subnets?hl=ja
https://cloud.google.com/router/docs/concepts/overview?hl=en#route-advertisement
SSLサーバ証明書の購入からインストールまで

Webアプリケーションサーバのサーバ証明書をそれまでの **Let's Encrypt** から有料証明書に置きかえる機会があったので、手順を説明する。

# サーバ証明書とは
サーバ証明書は、**認証局**（CA）と呼ばれる審査機関に申請し発行してもらうものだ。
自分自身で発行することもできるが、これは**オレオレ証明書**（自己署名証明書）と呼ばれ、信用されない。
サーバ証明書には下表の３種類があり、Let's Encryptという認証局が発行できるのはDV証明書である。

|証明書種類              |保証範囲                  |
|:----------------------|:------------------------|
|ドメイン認証（DV）証明書 |ドメイン名の所有権のみを保証|
|企業認証（OV）証明書    |ドメイン認証に加え、申請した組織の実在性を保証|
|拡張認証（EV）証明書    |企業認証に加え、ドメイン権利者組織実在の確実性を保証|

DV証明書では、申請者が本当にそのドメインを持っているかどうかさえ確認できれば良いので、信頼性は劣るが発行が短期間で済む。（スピード審査を謳うところなら数分で終わる）

# 購入元の選定
通常のWebサービスであればDV証明書で十分だろう。本記事で候補とするのは、

* グローバルサイン認証局のクイック認証SSL
* デジサート認証局（旧ジオトラスト）のクイックSSLプレミアム

いずれも国内正規代理店を経由すると年間15,000円程度になる。
ここでは、比較的メジャーな代理店であるハイパーボックス社のSSLサーバ証明書サービス「[ドメインキーパー](https://www.domain-keeper.net/sec/ssl/)」を例に、**クイック認証SSL**を購入してみよう。

# CSR作成手順
**CSR**とは認証局に提出する署名リクエスト（**C**ertificate **S**igning **R**equest）のことだ。
認証局は提出されたCSRに認証機関としての署名をして、サーバ証明書を発行する。

ドメイン（コモンネーム）を `example.com` として解説する。

## 秘密鍵ファイルの作成

```:パスフレーズ設定ありで作成する場合
openssl genrsa -des3 -out example.com.key 2048
```

```:パスフレーズ設定なしで作成する場合
openssl genrsa -out example.com.key 2048
```
秘密鍵ファイルを外部に出すことは無いので、人目に触れない安全な場所に保管しておこう。

## CSRファイルの作成

```
openssl req -new -key example.com.key -out example.com.csr
```

必要情報（DN＝ディスティングイッシュネーム）を入力。

```
Country Name           : JP
State or Province Name : Tokyo
Locality Name          : Chiyoda-ku
Organization Name      : Example Co.,Ltd.
Unit Name              : 
Common Name            : example.com
```
申請時にDNを渡すことで、**CSR**の作成まで代行してくれる代理店もある。

# サーバ証明書の取得まで
**クイック認証SSL**では、書類不要のオンライン審査によるドメイン認証に対応している。
ドメイン認証、つまり、申請者がそのドメイン（コモンネーム）の所有者かどうかは、次のいずれかによって確認される。

- **メール**による確認
ドメイン所有者のみが受信可能とされるメールアドレス（admin@コモンネーム、whoisに記載のメールアドレスなど）を準備する必要がある。

- **Webページ**による確認
認証局が指定するコードを、Webページの`meta`タグに挿入する必要がある。

- **DNS**による確認
認証局が指定するコードを、DNSのTXTレコードに追加する必要がある。

ここでは、お手軽なメールによるドメイン認証を選択する。
サーバ証明書を取得する流れは次の通りだ。

1. ドメインキーパーにログイン
2. コモンネームに `example.com` を入力
3. **クイック認証SSL**を選択
4. 作成したCSRファイルを貼付
5. **メール認証**を選択
6. 代理店に支払いが終わると、認証局（グローバルサイン社）からメールが届く
7. メールに記載のURLにアクセスし、承認手続き
8. メールでサーバ証明書と中間証明書が納品される

ちなみに、こうした認証局とのやり取りを、JSON形式のWeb APIとして仕様を標準化、自動で行うものが**ACME**プロトコルであり、ACMEクライアントをPythonで実装したものが、Let's Encryptが配布する`certbot`である。

# サーバ証明書のインストール
認証局が署名したサーバ証明書（`*.crt`）と、そのペアになる秘密鍵（`*.key`）をサーバにインストールする。

## Apache2定義ファイルの編集
Apache2.4以降では、中間証明書を指定する`SSLCertificateChainFile`ディレクティブが無いので、`cat`コマンドなどでサーバ証明書ファイルに結合しておこう。

```apache:httpd.conf
SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/private/example.com.key
```

証明書の格納先パスが変わるような場合（Let's Encrypt標準インストール状態からの移行なら、たいてい変わると思う）、アプリケーション開発チームとの連携も忘れずに。
例えば、アプリケーション内の **WebSocket** が証明書の格納先パスを指定している場合がある。

## ブラウザから確認
Apacheを再起動し、ブラウザの鍵ボタンなどから、証明書の**発行者**と**有効期間**が変わっていることを確認できればOKだ。
![kakunin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/438b7eb8-2e35-db6b-b663-99ae0a8ab1f0.png)
[ゼロから作るDeep Learning]損失関数 交差エントロピー誤差を分かりやすく解説してみた

#はじめに
この記事は**ゼロから作るディープラーニング 5章ニューラルネットワークの学習**を自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。

#交差エントロピー誤差とは
分類問題を解くためのニューラルネットワークの損失関数として使われる関数です。
実際に行われている処理を軽く説明すると、出力層のsoftmax関数から出力された値をネイビア数で指数計算したものに正解データを掛け、それの総和にマイナスをつけます。
言葉で説明するのは理解しにくいので図と数式で表してみます。
<img width="722" alt="スクリーンショット 2019-10-22 20.11.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/bfd8741d-02ae-81e8-eb5f-adf28203fc25.png">
tが正解データ　zが予測データ
<img width="168" alt="スクリーンショット 2019-10-22 20.12.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/f4f53233-2179-fe51-5683-4ffbbcf2d2ee.png">

では実際にpythonで実装してみます。

```python
#交差エントロピー誤差 tが正解データ　yが予測データ
def cross_entropy_error(t,y):
    delta = 1e-7
    return -(t * np.log(y + delta)).sum()
cross_entropy_error(t,y)
0.3566748010815999
```

予測データに1e-7を足してあげる事で予測データが0の時にエラーが起きてしまうのを防ぐことができます。