OmniAICreator/Qiita-1.07M huggingface dataset:
AWSサーバ構築[ELB+EC2(AutoScale)+RDS+踏み台] 前編〜サブネットを綺麗に分けて構築してみた〜

こんにちは！

この記事ではAWSでのサーバ構築を実践した記録を残します。
ELB、EC2、AutoScaling、RDS、踏み台サーバをうまくパブリックサブネットとプライベートサブネットに分けて構築しました。
前後編にわけ、この前編ではサブネットをprivateとpublicに分けて構築する、ネットワーク要素の強い話になります！

## 全体像

- Public Subnet

    - ELB
    - 踏み台サーバ
    - NATゲートウェイ

- Private Subnet
    
    - EC2インスタンス（マルチAZ）
    - RDS（マルチAZ)

## VPC

- IPv4 CIDR ブロック

```
10.0.0.1/16
```
/16だと 11111111.11111111.**11111111.11111111** の後ろ16桁が使えるので
[10.0.0.0 ~ 10.0.255.255]の65536通りのIPをそのVPC内で使うことができる。

- 作成後アクションからDNSホスト名を有効にする。

## サブネット

public、privateそれぞれこんな感じ

|   IP address   |  用途  |    AZ    | public/private |
|:--------------:|:-----:|:--------:|:--------------:|
| 10.0.1.0/24 | ELB | ap-northeast-1a | public |
| 10.0.2.0/24 | ELB | ap-northeast-1c | public |
| 10.0.10.0/25 | NAT | ap-northeast-1a | public |
| 10.0.11.0/25 | Bastion | ap-northeast-1a | public |
| 10.0.101.0/24 | EC2 | ap-northeast-1a | private |
| 10.0.102.0/24 | EC2 | ap-northeast-1c | private |
| 10.0.201.0/24 | RDS | ap-northeast-1a | private |
| 10.0.202.0/24 | RDS | ap-northeast-1c | private |

`10.0.1.0/24` だと 第４オクテット 0~255 までの256個
`10.0.10.0/25` だと 第４オクテット 0~127 までの128個

## GW, NATゲートウェイ, 踏み台サーバー

- インターネットゲートウェイ

作成しVPCにアタッチしておく

- NATゲートウェイ

NAT用のサブネットを割り振る。
ElasticIPも新規作成して割り振る

- 踏み台サーバー(Bastion)

EC2を１台配置して、Bastionのに割り当てたサブネットをあてる。

## ルートテーブル

VPCのdefaultルートテーブルが存在するのでそれをprivate用にする。
どのルートテーブルにも紐付いていないサブネットは自動でメイン（デフォルト）ルートテーブルに紐づくため。

#### publicサブネット用のルートテーブルを作成し、そこにpublicサブネットを紐づける。

- ELB(2つ)
- NAT
- Bastion

#### ルート編集を行う
private用のルートテーブル
0.0.0.0/0 => natインスタンスを向ける

public用のルートテーブル
0.0.0.0/0 => インターネットGWを向ける

---

これでVPCからサブネット周りの設定が完了です。
後半セキュリティグループの設定,RDS,ELB,AutoScalingの構築になります！


参考にさせていただいたサイト
[AWSドキュメント](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Route_Tables.html)
https://53ningen.com/elb-ec2-rds/
Mac OSでTA-Libをpipで入れられなかった時の対処法

#はじめに
近年システムトレード等でテクニカル分析をpythonで行うケースが増えていると思います。
その際PythonのライブラリーでTA-Libという計算ツールがあり、面倒なテクニカル分析の計算をメソッドを使って一発で計算することができるようになりました。

#問題点
僕はPythonのライブラリーのinstallにcondaを使わず基本pipでinstallしていました。
しかし

```
pip install TA-Lib
```

とターミナルにいれてもうまくインストールできません....

#改善法

今回Homebrewとpipが必要になります
コチラの記事がわかりやすかったので参考にして見てください
https://qiita.com/ms-rock/items/6e4498a5963f3d9c4a67#4-pip%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB



##手順その１　HomebrewにTA-Libをインストールする
以下のコマンドを打ちます

```
brew install ta-lib
```

するとHomebrewにTA-Libがインストールされます。

##手順その２　pipでTA-Libをインストールする

次に以下のコマンドを打ちます

```
pip install TA-Lib
```
Successfully installed TA-Lib-0.4.17と出ればインストール完了です！！

#おまけ
condaでライブラリーをインストールしてるという方は

```
conda install ta-lib
```
でインストールできるそうです！

他のOSでのインストール方法はコチラの記事がわかりやすく書かれていたので参考にしてください！！

https://qiita.com/ConnieWild/items/cb50f36425a683c914d2

#終わりに
リンク先の記事の方々執筆ありがとうございました（無断の記載お許しください）
AWS Deep Racer League 参加レポート

# はじめに
今回は AWS Summit Tokyo2019 にて開催された AWS Deep Racer League に参加したので、その結果を記録します。

# AWS Deep Racer とは
強化学習で作成したモデルによって走る、1/18 スケールの 4WD モンスタートラックです。
3D レーシングオンラインシミュレーター上で強化学習によるモデルを作成し、モデルを Deep Racer にデプロイして、コースを走らせることができます。
AWS DeepRacer では、あらゆるレベルの開発者が強化学習を開始できるよう、ハンズオンチュートリアルを用意されているため、強化学習初心者でも簡単に強化学習を楽しめます。

![40d542e0-aws-deepracer-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/65f087d9-96fb-76f3-c01e-1d8d16aa5af7.png)


# AWS Deep Racer League とは
誰でも参加できる、Deep Racer によるレーシングリーグです。
仮想サーキットによるオンラインレースと AWS Summit 会場にて行われる Summit サーキットの2種類があります。
今回私は Summit サーキットに参加してきました。

# Deep Racer 会場
会場にはコースが2つ用意されていて、中央のモニターにはリアルタイムでランキングが表示されていました。



![IMG_3694.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/b6cd8208-275f-3f62-76b1-ab3fb29c1071.jpeg)


モデルを持っていなくても、AWSの用意したモデルを利用してレースに参加できるため、多くの人が列に並び、待ち時間は3時間まで伸びてました。

![IMG_3718.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/2745cd42-8b87-a4c8-82b3-146feb63ad48.jpeg)




# レース参加！
今回はモデルを持ち込みでレースに参加してきました。
結果は **10.610秒** で全体としては39位でした。

- AWS Summit Tokyo の ランキング  
https://d3akhm1epsal2g.cloudfront.net/bigscreen/?event=tokyo

<img width="485" alt="005.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/d1866419-d709-fb74-cf00-0c366ff45651.png">

シミュレーションでは12秒台だったので、やはりシミュレーションと実機では差がでますね。

# 最後に
今回はDeep Racer Leagueに参加したレポートを書きました。
会場の実機で走らせてみると、うまく走れたり走れなかったする様を見て、ついつい頑張れって声に出してしまうほど楽しめました。
オンラインレースは6月30日まで開催されているので、まだ機械学習触れたことない人でもぜひ、参加してみてください。
GKEで起動したコンテナ内からgsutilを使用してGCS(Google Cloud Storage)にアクセスする方法

# 概要
GKE Cluster内のコンテナからGCSのBucket上にあるデータをダウンロードする仕組みが必要だったので、その時に行った設定を残します。

# 事前準備
以下の項目については、本題とは少しそれるため事前準備として記載します。

* GCPアカウントのセットアップ（プロジェクトの作成)
* gcloudのインストール、セットアップ
    * [こちら](https://cloud.google.com/sdk/downloads?hl=ja)
* GKEクラスターの作成
    * [こちら](https://cloud.google.com/kubernetes-engine/docs/quickstart?hl=ja)のドキュメントを参考に
  
* IAM（以下の権限を付与)
   * Kuvernetes Enginne 管理者

# セットアップ
## サービスアカウントの作成
GCSにアクセス可能なサービスアカウントを作成し、ダウンロードします。
今回は雑に `ストレージ管理者` 権限をサービスアカウントに付与しました。

## secretsの作成
ダウンロードしたサービスアカウントファイル(json)をkubernetesのsecretsに保管します。
secretsを作成することで、実際にはKubernetes Master内でリソースの永続化に使われる高信頼分散KVS(etcd)内に保管され、
GKE Cluster内のpodからリクエストがあれば参照できるようになっているようです。
secretsについては、[こちら](https://ubiteku.oinker.me/2017/03/01/kubernetes-secrets/)の解説が理解しやすかったです。

```sh
# 書式
$ kubectl create secret generic <secret名> --from-file=<etcd内に保存されるファイル名>=./<サービスアカウントのファイル名>

# 例)
$ kubectl create secret generic gcs-access-key --from-file=gcs-access.key=./hogehoge.json

# 確認
$ kubectl get secrets

# 詳細確認
$ kubectl decribe secrets <secret名>
```

## 認証処理
これで準備は整いました。
あとはsecretsに格納したetcdをmountして、`gcloud auth`で認証すればGCSにアクセス可能です。
以下の例では、マニュフェストファイル内で先ほど作成したsecretsをmountさせます。
実際には平文で保存されているためか、復号化等の処理は不要なようです。

### マニュフェストの準備
```yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: test
spec:
  template:
    metadata:
      name: test
    spec:
      volumes:
　　　 # ボリュームにsecretsを指定
      - name: google-cloud-key
        secret:
          secretName: gcs-access-key
      containers:
      - name: test
        image: <イメージ名>
        args: ["echo", "ok"]
　　　　　# ボリュームにsecretsを指定
        volumeMounts:
        - name: google-cloud-key
          mountPath: /var/secrets/google
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/secrets/google/gcs-access.key
      restartPolicy: Never
```

####補足
`gsutil`を使用するには、gcloud authで認証すれば大丈夫なんですが、
例えば、コンテナからgoogle-api-python-clientライブラリ等を使用して、
GCSにアクセスするには`GOOGLE_APPLICATION_CREDENTIALS`を設定する必要があるようです。


###実行スクリプトの準備
あとはコンテナ起動時に実行するスクリプトに以下のような処理を追加し、呼び出せば認証させることができます。
今回はDockerfileのENTORYPOINTを使用して以下のようなスクリプトを実行させました。
作りは

```sh
#!/bin/bash

auth_gcp () {
  gcloud auth activate-service-account --key-file=/var/secrets/google/gcs-access.key
}

fetch_data () {
  gsutil cp -r "${GCS_INPUT_DATA}" .
}

auth_gcp
fetch_data
```

# まとめ
我流で実装してみましたが、他にいい方法があれば教えてください。
Sails.js を Chrome でデバッグする方法

# やりたいこと

node のフレームワークである Sails を Chrome でデバッグする方法についてメモします。

今回は node に標準搭載されているデバッグ機能（inspect）を Sails.js で使ってみます。

# 環境

OS: macOS High Sierra 10.13.6
node.js: 10.15.1
Sials.js: 1.2.2

# やり方

## 1. degugger を追記

node に標準搭載されているデバッグ機能を使えば、コード内に `debugger` と追記することで処理を止めることができます。

今回は、`api/controllers/entrance/signup.js` を使って試してみたいと思います。
`signup.js` は Sails を `1. Web App` テンプレートでインストールすると最初から用意されているコントローラです。

ユーザー登録の処理が行われるときの `input` の中身を確認してみましょう。
以下の場所に `debugger` を追記します。

```api/controllers/entrance/signup.js
// ...略...
  fn: async function (inputs) {
    debugger; // ここに追記

    var newEmailAddress = inputs.emailAddress.toLowerCase();
// ...略...
```

## サーバーの起動

次にサーバーを立ち上げます。

サーバーの起動については、いろいろな記事で `sails lift` コマンドが紹介されていますが、これでは今回のデバッグ方法が使えません。

デバッグする際は以下のコマンドを使用します。

```
$ sails inspect
```

また、古いバージョンでは `sails debug` コマンドを使用するみたいですが、最新版（2019年６月現在）では上記のコマンドを使用します。

## 3. Chrome DevTools を起動

実際にデバッグする画面を Chrome 上に表示させます。

Chrome を起動し `chrome://inspect/` にアクセスします。
すると、以下のような画面が表示されるかと思います。

![スクリーンショット 2019-06-18 14.23.05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238891/6daa8796-8174-242c-97ec-bd33a81abefa.jpeg)

一番下に「inspect」という表示があるのでクリックします。

![スクリーンショット 2019-06-18 14.34.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238891/bb0cef70-b5bb-6f68-56df-72dfcbeb0df0.png)

上記のようなウィンドウが表示されます。
この画面上でデバックを行います。

## 4. デバッグしてみる

実際にデバッグして見ましょう。

サーバーを起動した状態で `http://localhost:1337` にアクセスすると、sials デフォルトのホーム画面が表示されます。

ホーム画面右上に「Sing up」ボタンがあるのでクリックし、ユーザー登録をおこなってください。

![スクリーンショット 2019-06-20 13.22.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238891/14bbf116-42b4-874b-d4ef-2893a8c88cb7.png)

「Create account」を押すと、先ほどのウィンドウが表示され、`debugger` の部分で止まっているのがわかります。

![スクリーンショット 2019-06-20 13.24.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238891/25cb4aba-2cd2-0b33-0a26-3c7cba38695a.png)

`input` の隣には変数の中身が表示されています。
また、`input` にカーソルを合わせたり、右サイドバーの Scope からも中身を確認できます。

右上のアイコンをクリックすることでステップ実行も可能です。
重宝しそうです。
Safety rules for working with electrical tools and equipment

[**Commercial electricians in Sydney**](https://gcrelectricalservices.com.au/) need a safe working environment. However, a safe environment is not all that is needed to control all potential hazards while dealing with electricity. Electricians must work safely and be very cautious. You can apply safety rules to control risks of death or injury from workplace hazards. If you are working with electrical equipment and tools, you need to use the following safety rules.

**Avoid contact with live circuits**

You should never make fun of this important rule. It is important to know that touching live wires can cause death and if you are lucky you can sustain serious injuries. Always remember that if something bad happens, you won’t have a second chance. 

![home_van.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442158/9a02b92e-5b06-4193-858c-4f68719517a5.png)

**Use tools with non-conducting handles**

Using tools with conducting handles is just the same as touching live wires. Commercial electrical contractors in Sydney city have specialized tools that have non-conducting handles and they have testers to check whether the line has power or not. When dealing with electricity, you should never use metallic rulers and pencils. You should also avoid wearing metal watchbands or rings when dealing with electrical equipment. This is very easy to forget rule especially when you are pointing on an electric line with a metallic pencil. 

**Clothes, gloves and shoes**
 
When it is very necessary to deal with equipment that is plugged into power, you should ensure that your hands are dry. Wear nonconductive protective clothes, gloves and shoes that have insulted soles. 

**Work with only one hand** 

Experienced commercial electricians Sydney in NSW have mastered the skill of working with only one hand with the other hand in the pocket or at their side. This is to ensure that the other hand is away from the conductive material. This will reduce the likelihood of accidents that can result in electricity passing through the chest cavity.
ReactのPromptが意図した挙動にならないので外しました

Reactアプリケーションでブラウザ遷移の制御を行ってました。
`react-router`の`Prompt`を使っていたんですが、動作検証を行なっていると以下のissuesで議論されている問題にぶつかり断念することに。
https://github.com/ReactTraining/react-router/issues/5405

`Prompt` 内部で使用されている `history.block` が問題っぽいですが、そもそもの原因はブラウザ側のセキュリティの仕様っぽい。
https://github.com/ReactTraining/history/issues/690

## `Prompt`でできること

ブラウザの「戻る」「進む」のアクション時に『保存が行われていませんがよろしいですか？』などのメッセージを出して、画面遷移を行うか画面に止まるかなどの確認ダイアログを表示することができる。

## うまく制御ができないパターン

通常の操作をしている時には、問題なく想定通りに動いてくれるのですが、以下の操作を行うと確認ダイアログでキャンセルを押した時にURLが元のURLに戻らない問題が発生します。

- F5等で画面を再読み込みした直後に「戻る」「進む」のアクションを行う

## 対応策

`Prompt`を使わずに独自実装を考えましたが、現時点で以下のようなブラウザの制限があり制御が難しいため遷移時の制御を外しました。

**ブラウザの制限**

- ブラウザのhistoryの数は取得できるが、自分がどのhistoryにいるかが提供されていない
- 「戻る」「進む」のどちらが使われたのかの情報をイベントで取得できない

## まとめ

今回は独自実装はなかなかコストがかかり、全てのパターンで動作保証を行うのが難しそうだったため中途半端になるくらいなら制御しない方針にしました。

ユーザー操作によって表示されている画面とURLに差異が発生しうるため、不要なバグやトラブルが発生する可能性があるためです。

上に紹介させていただきましたissuesの通り、`history.block`は削除したい方針のようなので、もっといい方法が確立してから対応を行うのが無難な気がします。

もし既に信頼できる方法での解決がされているようであれば連絡いただけると幸いです。
Verilog HDL スタディ

##環境

* Terasic DE0-Nano
* Quartus Prime 18.1 Lite Edition
* DE0-Nano_v.1.2.4_SystemCD Users Manual
 * DE0-Nano_My_First_Fpga_v1.0.pdf
 * My_First_NiosII_Qsys.pd

## Verilog HDLでLチカ
DE0-Nano_My_First_Fpga_v1.0.pdfの通りやってLチカ成功。

## NiosIIでLチカ
My_First_NiosII_Qsys.pdfに記述されている方法を試す。


### Creation Hardware Design

```my_first_niosii.v
DE0_NANO_QSYS DE0_NANO_QSYS_inst
	(
		.clk_50							(CLOCK_50),
		.out_port_from_the_pio_led	(LED),
		.reset_n							(1'b1)
	);
```
これの通りでは以下のエラーが出る。
``Error (12002): Port "clk_50" does not exist in macrofunction "DE0_NANO_QSYS_inst"``
``Error (12002): Port "out_port_from_the_pio_led" does not exist in macrofunction "DE0_NANO_QSYS_inst"``
``Error (12002): Port "reset_n" does not exist in macrofunction "DE0_NANO_QSYS_inst"``

以下の記述でコンパイルが通る


```my_first_niosii.v
DE0_NANO_QSYS DE0_NANO_QSYS_inst
	(
		.clk_clk						(CLOCK_50),
		.pio_led_external_connection_export	(LED),
		.reset_reset_n							(1'b1)
	);
```							

Qsys -> Generate -> Show Installation Templateの記述を参考にした。

### Creation of Software Design

NiosII EclipseでHello Worldテンプレートを使ってビルドすると以下のエラーになる。
``error: ld returned 1 exit status ``

以下を参考にenable_lightweight_device_driverを有効にすることで解決した。

https://forums.intel.com/s/question/0D50P00003yyQD0SAM/nios-ii-hello-world-small-buildcompilation-error?language=ja

LチカCコードをビルドすると、以下のエラーになる。

``hello_world.c:31:32: error: 'LED_BASE' undeclared (first use in this function)``
``    IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, count & 0x01);``

LED_BASEの記述は、Platform DesignerでPIOに名付けた名前に「_BASE」を後ろにつけるルールらしい。
以下のコードで通るようになった。

```hello_world.c
#include <system.h>
#include <altera_avalon_pio_regs.h>

int main()
{
  printf("Hello from Nios II!\n");

  int count = 0;

  int delay;

  while(1)
  {
	  IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, count & 0x01);

	  delay = 0;

	  while(delay < 1000000)
	  {
		  delay++;
	  }

	  count++;
  }

  return 0;
}
```

実行するためRun -> Run Configuration -> Nios II Hardwareを選択すると以下のエラーが出た。

`` [Target Connection]: Connected system ID hash not found on target at expected base address.``

単純にハードが起動していないことが原因だった。
Quartus Programmer -> Start を押下して、ハードを起動させる。
Nios II Eclipse -> Runとして、ソフトを走らせる。

Lチカ成功！
Googleスプレッドシート覚書

スプシ初心者の私が、ここ最近資料作成や要件整理に駆り出されることも増えてきたために
「いちいちググるのめんどくさい！自分用のチートシートを作ろう！」と決意して生まれたのがこのページです。

## よく使う機能

### 1. 特定の列や行に自動で通し番号（連番）を振る

よく使う度：★★★★★

```spreadsheet
// 列
=ROW()-n
```

```spreadsheet
// 行
=COLUMN()-n
```

#### ▼解説

```spreadsheet
// 行を返す
=ROW()
// 列を返す
=COLUMN()
```

これらの関数は、「指定したセルの存在する行（列）の番号を返す」ものになります。

![row1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72531/b112a7e3-2d3b-4eb5-803b-fe8c30352802.gif)



ですので、C2に関数を記入すると

```spreadsheet
=ROW() => 2
=COLUMN() => 3
```

が返ってきます。
少ない連番であれば手動入力でもいいのですが、数が多い場合や途中一行を消したり足したりすることが多いときなどは自動で連番を維持してくれるため非常に便利ですね。

しかし、よくあるのが

![row2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72531/8353c0b5-111f-7116-fc1a-9451ad61997d.png)


こういう、上にヘッダが欲しい時ですね。
A2に `=ROW()`をいれると、「2」から始まる連番になってしまいます。

なので

```spreadsheet
=ROW()-n
// n = ヘッダで使用している行数
```

としています。

### 2. 特定の列や行に自動で通し番号（連番）を一括で振る

よく使う度：★★★★★

```spreadsheet
// 列
=ARRAYFORMULA(ROW(A1:A1000))
```

```spreadsheet
// 行
=ARRAYFORMULA(COLUMN(A1:K1))
```

#### ▼解説

こちらを参考にさせていただいていますmm

> スプレッドシートで数千数万行に渡って自動で連番する（番号を振る）方法
> https://tanuhack.com/useful-tool/spreadsheet/auto-serial-number/

![row3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72531/515f7cd0-e72a-a107-ed08-87388be5a533.gif)


`=ROW()` などでは難しいくらいに数が多いときなどは、これを連番のスタートするセルに書いておくことで

一括で振ることができます。

### 3. セルにプルダウンメニューを設置

よく使う度：★★★★☆

```spreadsheet
セル内で右クリック => 「データの入力規則...」を選択 => 条件：リストを直接指定
// 値の例
未対応,仕掛中,確認中,完了
```

#### ▼解説

手入力やコピペでの作業に比べると、後の更新がとてもラクになるため、自分のシートのほかお客様や他の人との共有ファイルではよく使っている機能です。

値の部分はカンマ区切りで書いていきます。

```
未対応,仕掛中,確認中,完了
```

![pull1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72531/5057215d-92bd-f580-fa1f-7c3e5aa2f713.gif)


### 4. セルにプルダウンメニューを設置、値を別シートで管理

よく使う度：★★★★☆

```spreadsheet
セル内で右クリック => 「データの入力規則...」を選択 => 条件：リストを範囲で指定
// 値の例
Sheet!A1:A5
```

#### ▼解説

だいたい3で事足りたりもするのですが、例えば他の案件でも使いそうなフォーマットだったり、
後々スケールアップしそうな項目の場合は外部データ化しておくと一括で修正が可能になります。

![pull2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72531/650eef9b-9927-5f2b-daa2-7a02104db619.png)


外部データを置くシートを、「データ」というシート名で用意したとします。

その場合は、条件に対する値を

```spreadsheet
データ!A1:A5
```

とします。

![pull3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72531/aa59339d-8b88-4aac-e455-23cf687a54c6.gif)


### セルの値に応じてその行の色変更

よく使う度：★★★☆☆

```spreadsheet
セル内で右クリック => 「条件付き書式設定」を選択
// 値の例
範囲に適応：A1:K100
// 書式ルールの例
カスタム数式
値または数式：=$C1="完了"
```

#### ▼解説

ステイタスを変更したい時などによく使うのですが、適応範囲や数式の設定をよくど忘れしてしまうやつですね。（経験上、「そのセルだけを色分けたい」というよりも、「行ごと色を変えたい」ということが多いのです。）

色などは自由に変更できるため、完了はグレー、優先度高は赤　などで色分けして共有をしています。

![color.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72531/785cdb9f-c467-8aa4-8901-2ff0d6195cb9.png)


## まとめ

基本的には面倒くさい&眠たくなるスプシ作業ですが、できるだけキレイで効率的に終えたいところ。



精進してまいります。
XFS利用時のEC2のディスクを拡張する方法

# この記事は？ 
XFS利用時のEC2のディスク拡張する際の手順です。
xfs_growfsのことを忘れっぽいのでメモ代わりに。

# 流れ
* EC2コンソールからEBSのディスクサイズをオンライン拡張する。
* lsblkとdfでOSから見えるディスクサイズを確認しておく。
* growpartで対象パーティションを拡張。
* xfs_growfsでファイルシステムを拡張。(resize2fsじゃないんやで(´・ω・｀))

## 1. EC2コンソールからEBSのディスクサイズをオンライン拡張する。
* 画面からポチポチっと。
* 対象EBSを選んで拡張すればよし。(後で挿し絵入れます。)

## 2. lsblkにて拡張後のOSから見えるディスクサイズを確認しておく。
* EC2コンソールからEBS増やしてOSは00GBのディスクがつながっていると認識しているけど、この時点では200GB しか使っていないです。

```
[root@server01 ~]$ lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0  400G  0 disk
├─nvme0n1p1   259:1    0  400G  0 part /
└─nvme0n1p128 259:2    0    1M  0 part
[root@server01 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        961M     0  961M   0% /dev
tmpfs           978M     0  978M   0% /dev/shm
tmpfs           978M   54M  925M   6% /run
tmpfs           978M     0  978M   0% /sys/fs/cgroup
/dev/nvme0n1p1  200G  181G   20G  91% /
tmpfs           196M     0  196M   0% /run/user/1000
[root@server01 ~]$
```

## 3. growpartで対象パーティションを拡張。
* 「nvme0n1p1 --> nvme0n1 1」と指定を変えてやります。
* この時点でパーティションが拡張されますが、まだファイルシステムとしては使用できる状態になっていません。
 
```
[root@server01 ~]$ growpart /dev/nvme0n1 1
CHANGED: partition=1 start=4096 old: size=419426271 end=419430367 new: size=838856671,end=838860767
[root@server01 ~]$
```

## 4. xfs_growfsでファイルシステムを拡張。
* ここでファイルシステムを拡張行って、初めて拡張した分の容量がOSから使用できるようになります。
    * でないと無駄金…

```
[root@server01 ~]$ xfs_growfs /dev/nvme0n1p1
meta-data=/dev/nvme0n1p1         isize=512    agcount=101, agsize=524159 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1 spinodes=0
data     =                       bsize=4096   blocks=52428283, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 52428283 to 104857083
[root@server01 ~]$
```

## 5. 拡張後のサイズを確認。
* 終わったあとの確認は大事です。残心みたいなものです。

```
[root@server01 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        961M     0  961M   0% /dev
tmpfs           978M     0  978M   0% /dev/shm
tmpfs           978M   54M  925M   6% /run
tmpfs           978M     0  978M   0% /sys/fs/cgroup
/dev/nvme0n1p1  400G  181G  220G  46% /
tmpfs           196M     0  196M   0% /run/user/1000
[root@server01 ~]$
```

以上。
phoenixのcsrfチェックを外したい

phoenixフレームワークを利用してAPIサーバを立てようとしていたのですが、
フツーにpostリクエストを送ってしまうとcsrfのエラーが発生しました。

```
invalid CSRF (Cross Site Request Forgery) token, make sure all requests include a valid &#39;_csrf_token&#39; param or &#39;x-csrf-token&#39; header
```
セキュリティ的に、デフォルトでONになっているのは安全でいいですね。
しかし、APIサーバとして稼働させたい時などは、このチェックがあるとアクセスができなくなってしまうため外したい。

routeに設定してあるplug :protect_from_forgeryの記述を消せば発生しなくなるのですが、
消してしまうと、他のURLにも影響が出てしまう。
例えばwebサイトとして動かしている部分とapiサーバが同居してた場合、
どちらかが不利益を被るので、そういう場合どうやって制御すればいいんだろ、と。

で、そういう場合はscope毎に使用するpipelineを変えてあげれば実現できそうでした。

```
defmodule PhoenixBlogWeb.Router do
  use PhoenixBlogWeb, :router

  # webサーバとして動かす設定
  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
  end

  # apiサーバとして動かす設定
  pipeline :api do
    plug :accepts, ["json"]
  end

  scope "/", PhoenixBlogWeb do
    pipe_through :browser # webアクセス用の設定を使用する

    get "/", PageController, :index
    resources "/articles", ArticleController
  end

  scope "/api", PhoenixBlogWeb do
    pipe_through :api # api用の設定を使用する
    resources "/articles", ArticleController
  end
end

```

こうすることで、URL毎にCSRF(だけじゃなくてその他のplugに関しても)をON / OFFできます。
PyData.Tokyo Meetup #20 医療・保険におけるデータ分析 勉強会メモ

# 概要

[PyData.Tokyo Meetup #20 医療・保険におけるデータ分析](https://pydatatokyo.connpass.com/event/131223/)

> 企業・スタートアップ・学会等の各方面で活躍している Pythonista の皆さんが、データ分析・機械学習関連のトピックについて深く議論、交流するためのコミュニティです。「Python+Dataを通じて、世界の PyData エクスパートと繋がれるコミュニティを作る」ことを目標としています。

 > 第19回勉強会としてPyData.Tokyo Meetup #20 を開催します。今回のテーマは「保険領域×機械学習」です。


# 発表内容

## [生命保険数理と医療データサイエンス](https://www.slideshare.net/TomohiroAoki6/pydata-20190619)

- 青木智広さん
    - RGAリインシュアランスカンパニーという再保険会社
    - データアクチュアリーとして働く

- 再保険会社の保険商品開発について
    - 発生率
        - 1年以内に保険事故が発生する確率
            - i.e. 死亡保険の場合、死亡
        - 性別、年齢、体況・既往歴、生活集団などの条件によって、保険事故の発生率が変わる

    - 保険会社
        - 保険金と発生率から期待支出、保険料から確定収入が分かる
        - そのため、発生率と保険料・給付金から、保険会社の期待粗利が分かる
        - 実績発生率が予測発生率よりも低いことで、粗利がプラスになる

    - 再保険会社
        - 保険会社は、想定よりも多額の保険金支払いのリスクがある
        - リスク分散するため、保険会社は再保険会社に契約者からの保険料を支払う代わりに、保険金を支払いを再保険会社から受け取って契約者に行う
        - 保険会社の発生率見積もりより再保険会社の見積もりが小さければ、その差額が期待収益になる
            - 予定発生率と実績発生率のギャップ
        - 再保険会社は、保険会社よりも精緻な分析が行って、発生率を正確に見積もる
        - 元請の生保会社は規制業法の影響により、発生率を高めに設定して政府の認可を受ける必要があるが、再保険会社は損保なのせ規制を受けない

- 匿名化項医療データ
    - 医療機関ベース
        - 病院などの患者データ
            - データ取得を集めやすい大手病院患者のバイアス
            - 不健康
            - 医療水準が高い
            - 入院期間が短い

        - データの打ち切り事由
            - 転退院/死亡/データ提供者との契約終了
            - 一部傷病において、長期観察不可
            - 転院後の追跡不能

    - 保険者ベース
        - 健康保険組合の勤労者と扶養家族のデータ
            - データ取得を集めやすい大企業労働者のバイアス
            - 健康
            - 所得水準が高く、検診受診頻度が高い
            - 診断の発生率が高く、入院の発生率が低く、入院期間が短い

        - データの打ち切り事由
            - 転職・退職/死亡/データ提供者との契約終了
            - 死亡前は働けないため、比較的健康なものが観察される
            - 結果として、観測死亡率が低くなる

- 観測発生率の計算
    - 曝露(Exposure)
        - 疾病発生以前に存在する測定可能性を考慮しないすべての状態
        - 性別、年齢、遺伝的要因以外にも「毎日30分以上散歩する」なども
    - 危険因子
        - 曝露のうち、疾病発生率に影響を与えるもの
        - 喫煙は肺がんの危険因子など

    - 観測死亡率
        - Claim / Exposure (保険金給付 / 人年)
        - 男女別・年齢など条件別に発生率を計算する
        - 他にも、喫煙習慣や血液などのパラメータが増えることで、組み合わせ爆発を起こしうる

    - lifelines
        - pythonモジュールで生存時間分析
        - Kaplan-Meier曲線で時間経過に伴う生存率を可視化
        - Kaplan-Meier法は単変量解析
        - cox回帰分析は多変量解析
Rails6 のちょい足しな新機能を試す37（String#first, String#last 編）

# はじめに

Rails 6 に追加されそうな新機能を試す第37段。 今回は、 `String#last` , `String#first` 編です。
Rails 6 では、 `String#first` や `String#last` の引数に負の整数を指定すると `DEPRECATION WARNING` が出力されます。

Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

# String.first と String.last を使ってみる

今回は、単純にスクリプトを作ることにします。

```ruby:bin/string_first_last
#!/usr/bin/env ruby

require 'active_support/core_ext'

puts 'Rails'.first(-1)
puts 'Rails'.last(-1)

puts 'Rails'.first(1)
puts 'Rails'.last(1)
```

# スクリプトを実行する

スクリプトを実行すると引数に `-1` を指定した方は `DEPRECATION WARNING` が表示されます。
Rails 6.1 では、ArgumentError になるようです。

```shell
$ bin/string_first_last
DEPRECATION WARNING: Calling String#first with a negative integer limit will raise an ArgumentError in Rails 6.1. (called from <main> at bin/string_first_last:5)
Rail
DEPRECATION WARNING: Calling String#last with a negative integer limit will raise an ArgumentError in Rails 6.1. (called from <main> at bin/string_first_last:6)
ails
R
s
```

# ちょい足しの理由

`string.first` は `string.each_char.first` と同じ動作であるべきということが理由のようです。

```ruby:bin/string_each_char_first
#!/usr/bin/env ruby

puts 'Rails'.each_char.first(1).join
puts 'Rails'.each_char.first(-1).join
```

スクリプトの実行結果

```shell
bash-4.4# bin/string_each_char_first
R
Traceback (most recent call last):
        1: from bin/string_each_char_first:4:in `<main>'
bin/string_each_char_first:4:in `first': attempt to take negative size (ArgumentError)
```

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try037_string_first_last

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Add deprecation warning when String#first and String#last receive neg…](https://github.com/rails/rails/pull/33058)
* [Clarify behavior for ActiveSupport's String#first, String#last when limit is negative](https://github.com/rails/rails/pull/29105)
51歳からのプログラミング　備忘　実現未達　スマホでローカルサイトにSSL通信したい！　考え方まとめ

ローカルサーバはxampp

ローカルサイトに認証書を発行しSSL（https）
--
**ローカルサイトのSSL化**
PCから、PC内のローカルサイトにSSL通信するのには
・　windowsのhostsに、IPアドレスとドメイン名を登録し、ドメイン名でIPアドレスに接続できるように設定(opemsslのCNで認証発行）
・　xamppのhttps-sslのvairtualHostにてssl通信に必要な情報を取得
・　opensslで認証書を発行するSAN（subjectAltName）を指定して、opensllコマンドで暗号化キーを発行して、認証書を発行。

これでローカルPCからローカルPC上に作ったサイトにはHTTPSで通信できる。

**流れ**
ローカルPCのブラウザから、FQDNを指定してローカルサイトに接続を試みると、
・　windows/..hostsに設定したドメイン名とIPアドレスを確認
・　Xamppのvirtualhostに接続されて、公開キーと暗号キーを受ける
・　openssl-san.cnfのCN(certification name)と照合し認証書を確認
・　virtuarlHostのdocumentrootに接続する

ってことになるのかな？


スマホからローカルPC上のローカルサイトに接続
--
**一週間以上試行錯誤で悩み続けた**
このローカルサイトにスマホで接続を試みる場合には、`php artisan serve --host IPアドレス`によって、ローカルPCのIPアドレスで接続できるように設定して接続しますが、SSL通信にはなりません。

SSLは、FQDNに対して行われるようで、IPアドレスにSSLの設定はできない仕様のようです。

したがって、スマホでローカルサイトに接続するのに、認証書を発行したFQDNを使ってアクセスできるようにするか、IPアドレスでローカルPCに接続したときに、IPアドレスをFQDNに変換するような手続きが必要になるのかな？

今後の検討（継続）
--
・　`php artisan serve --host IPadress`
・　スマホ(ローカルPCのIPアドレスで）接続実行
・　ルーター(IPアドレスから接続先をルーティング) 
・　PC
・　xampp(virtualHost)
・　laravel/pubulic ローカルサイト

この流れの中で
・　ローカルサーバーで、ローカルサイトに認証書を発行（ローカルサイトにFQDN付与）
・　artisan IPアドレス　でローカルPCに接続できるように設定
・　スマホでIPアドレス接続
・　ルーターを通じてPCに接続
・　**どこかでIPアドレスをFQDNに変換**
・　PCからxamppのvirtualHostに接続
・　xampp-virtualHostから、スマホに公開鍵発行
・　スマホは公開鍵から暗号化キーを取得して通信を開始

とできるようになればいいのかな？
ずっと思考錯誤で疲れたですわ。
スマホでローカルサイトにSSL通信で接続したい！
VuexのmapStateについての理解（初心者向け）

# 何をするか

`mapState`の記述方法について
理解できていなかった部分があったので、
備忘録も兼ねてまとめておく。


# 1つのキーのみを使用する場合

```js:
// これらはすべて同値である

// 配列形式での書き方
computed: mapState(["hello"])
// オブジェクト形式での書き方 【1】
computed: mapState({ hello: this.$store.state.hello })
// オブジェクト形式での書き方 【2】
computed: mapState({ hello: state => state.hello})
// オブジェクト形式での書き方 【3】
computed: mapState({ hello: "hello"})
```

# 複数のキーを使用する場合

```js:
// これらはすべて同値である


// 配列形式での書き方
computed: mapState(["hello", "goodbye"])

// オブジェクト形式での書き方 【1】
computed: mapState({ 
  hello: this.$store.state.hello,
  goodbye: this.$store.state.goodbye,
})

// オブジェクト形式での書き方 【2】
computed: mapState({
  hello: state => state.hello,
  goodbye: state => state.goodbye,
})

// オブジェクト形式での書き方 【3】
computed: mapState({
  hello: "hello",
  goodbye: "goodbye"
})
```


#mapStateについて

`mapState`は`state`を`this.$store.state`として扱ってくれる。
そのため、

```ruby:
computed: mapState({ hello: state => state.hello})
```

これは、
<b>helloのstate => stateのhello</b>
つまり、
<b>helloのstateを、state（＝this.$store.state）のhelloにします</b>
すなわち、
<b>`helloのstateを、this.$store.state.helloにします`</b>
ということになる。

<br />


ちなみに、この書き方の良いところは、`module`を使用した場合に便利であること。
例えば`store.js`において、

```js:store.js
state: {
  user: {
    name: "abcd1234",
    email: "abcd@1234.com",
  }
} 
```

という実装をした場合、
`user.name`や`user.email`といった形で値を呼び出せるが、
`store.js`内部で`user.js`をモジュールとして呼び出す場合、例えば

```js:user.js
export const state = {
  user: {
    name: "abcd1234",
    email: "abcd@1234.com",
  }
} 
```

```js:store.js
import * as user from "@/store/modules/user.js"
```

とした場合、値を呼び出すには`user.user.name`や
`user.user.email`とする必要がある。

このとき、前述した

```ruby:
computed: mapState({ hello: state => state.hello})
```

を使用すると、

```ruby:
computed: mapState({ user: state => state.user.user })
```
とすることができる。

<b>userのstateを、(this.$store.)state.user.userにします</b>
つまり、
<b>`userのstateを、(this.$store.)state内のuserモジュール内のuserオブジェクトにします`</b>
ということになる。


こうすれば、`user.user.name`ではなく`user.name`で呼び出せる。
分散の意味

#目次
・分散とは何か
・分散の定義
・なぜ２乗するのか
・確率で考える場合

#分散とは何か

データがどれだけばらついているのかを一目で分かるようにするための指標が**分散**です。

　-分散の「あるべき性質」-
　①全て同じデータのときは、ばらついていないので分散は０になるべき
　②データがばらついているほど、分散は大きくなるべき
　③データを平行移動しても、ばらつきは変わらないので分散も不変であるべき

　最低限これらを満たすように、自然に定義する必要があります。

#分散の定義
ばらつきといっても、どこかに基準を置いて計算しないと定義もできません。そこで平均値を基準として「個別データが平均からどれだけ離れているか」を考えます。今、データ$x_1～x_n$の平均を$\bar{x}$と書くことにします。このときデータの分散を下記のように定義します。
$$\frac{1}{n}\sum_{i=1}^{n}(x_i-\bar{x})^2　　（１）$$

これは、「平均値との誤差の２乗」をデータ個数$n$で割っているので「平均値との誤差の２乗」の平均といえます。

#なぜ2乗するのか
「個別データと平均の差」をばらつき具合の基準とするならば、２乗せずに絶対値を使ってもいい気がします。２乗として定義されるのは理由があります。

　・絶対値だと符号を気にしないといけない
　・２乗の方が遠いデータがあったときに分散をより大きく押し上げる

ちなみに（１）の分散の定義を見ると、記事の一番上に書いた「あるべき性質」は満たします。③の平行移動については、データを$+a$移動すると平均も$+a$され（１）で$$\frac{1}{n}\sum_{i=1}^{n}((x_i+a)-(\bar{x}+a))^2=\frac{1}{n}\sum_{i=1}^{n}(x_i-\bar{x})^2$$なので成立します。

#確率で考える場合
これまでは単純にデータの個数で計算しましたが（つまり均等確率）、データ$x_1～x_n$に対応する確率$p_1～p_n$で考えるときの定義は下記の通りです。
$$\sum_{i=1}^{n}(x_i-\bar{x})^2×p_i　（２）$$

（２）の$p_i$を均等割合$\frac{1}{n}$にしたのが（１）なので、（２）は（１）を一般化したものといえます。
NuxtでWatchを使う時にアロー関数を使ってはならない

# 結論
表題の通り。
Nuxtでカスタムウォッチャを使う時はアロー関数で書いてはならない。
アロー関数で書くと、`this`がundefinedになってしまい、コンポーネントの要素へ全くアクセスできなくなってしまう。

# カスタムウォッチャって？
Vueが用意してくれているプロパティを監視して、変更があれば任意の処理を実行してくれる仕組み
[カスタムウォッチャ](https://jp.vuejs.org/v2/guide/computed.html#%E3%82%A6%E3%82%A9%E3%83%83%E3%83%81%E3%83%A3)

# コード例
#### わるい例


```bad.vue
<script>
export default {
  components: {
  },
  data() {
    return {
      value
    }
  },
  watch: {
    value: newValue => {
      console.log('newValue:', newValue)
      console.log('this:', this) //=> undefinedになる
      this.hoge() //=> VueComponentにアクセスできないのでエラー
    }
  },
  methods: {
    hoge() {
      console.log('hoge')
    }
  }
}
</script>
```

#### よい例


```good.vue
<script>
export default {
  components: {
  },
  data() {
    return {
      value
    }
  },
  watch: {
    value: function(newValue) {
      console.log('newValue:', newValue)
      console.log('this:', this) //=> VueComponent{...}
      this.hoge() //=> 正しくログがでる
    }
  },
  methods: {
    hoge() {
      console.log('hoge')
    }
  }
}
</script>
```

# 教訓
watchに関わらず、アロー関数のthisはその関数を呼び出した時に決定されるらしい。
ちゃんとドキュメントを読みましょうってことでした。
この記事に詳しく書かれています
[Vue.jsに書いてある「アロー関数は、this が期待する Vue インスタンスではなく・・・」とは？](https://qiita.com/_Keitaro_/items/d48733a19c10889e2365)

こちらの記事のコメント欄も参考になりました
[Vue.jsでアロー関数を使うと詰む](https://qiita.com/lookman/items/1ed117d5e0b723d56a4e#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB)
「JavaのKeytoolを使った自己署名証明書で証明書エラーを出さない」ときのメモ

# 事象
Chrome58以降では、CNの名前とリクエストしたホスト名が一致しても安全な接続とはみなさず、ERR_CERT_COMMON_NAME_INVALID が返される。例えば CN=localhost で発行した証明書で、https://localhost でアクセスした場合のこと

# 理由
Chrome58以降は、証明書V3の拡張領域：DNS名でも検証している。
[Qiita:Chromeに怒られないオレオレ証明書の作り方](https://qiita.com/masahiro-aoike/items/dbf17fa03c5973ce9068)

# Keytoolでの対応と制約事項
keytoolで自己署名証明書を発行するときのオプションに、DNSも指定する。そのとき、ドメイン名は必ずA.B.CないしはA.B.C.Dのフォーマットになる。keytoolの制限で、ワイルドカードや .から始まる後方一致形式の指定はできないようだ。

```
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 
-ext san=dns:sample.localhost.com -keystore "tomcat.jks" -validity 3650
```
(実際は1行で）

```txt
キーストアのパスワードを入力してください:(キーストアのパスワード)
新規パスワードを再入力してください:(キーストアのパスワード)
姓名は何ですか。
  ［Unknown］:  sample.localhost.com (検証用のホスト名)
組織単位名は何ですか。
  ［Unknown］:  Capybara
組織名は何ですか。
  ［Unknown］:  Capybara
都市名または地域名は何ですか。
  ［Unknown］:  Shinagawa
都道府県名または州名は何ですか。
  ［Unknown］:  Tokyo
この単位に該当する2文字の国コードは何ですか。
  ［Unknown］:  JP
CN=sample.localhost.com, OU=Capybara, O=Capybara, L=Shinagawa, ST=Tokyo, C=JPでよろしいですか。
  ［いいえ］:  y
```

発行後、このキーストア tomcat.jks を、任意のサーブレットコンテナに適用して起動すると良い。
その時に、sample.localhost.com を localhost(127.0.0.1) になるよう、hostsファイルへ登録しておく。
【Vue.js】slotの中身があるかないかv-ifで分岐する

今後は[v-slot](https://jp.vuejs.org/v2/guide/components-slots.html#%E5%90%8D%E5%89%8D%E4%BB%98%E3%81%8D%E3%82%B9%E3%83%AD%E3%83%83%E3%83%88)を使いなさいって話のようで。

```
.section
    .section__header
        h2 ニュース
    .section__body
        ul
            li 
```

ヘッダーとボディーを持つセクションというのは、とてもよく使います。

```
.contents
    .section
    .section
    .section
```

のようにセクション単位でコンテンツを分けたりします。
「ひとかたまりのコンテンツはセクションで囲む」という鉄の掟を作ると、秩序が生まれます。
なのでコンポーネントを作り、これを使うことを遵守します。

```/src/components/Section.vue
<template lang="pug">
    .section
        .header
            slot(name="header")
        .body
            slot(name="body")
</template>
```

単一ファイルコンポーネントとして作ります。
.section__headerとか.section__bodyとか書く必要も無くなるので、
クラス名を単純に.headerと.bodyにしてしまいます。
※pug-plain-loaderをインストールしているため、lang="pug"をつけることでPugの記法が使えるようになっています。


```/src/views/Index.vue
<template lang="pug">
    Section
        template(v-slot:header)
            h2 新着ニュース一覧
        template(v-slot:body)
            ul
                li ...
                li ...
</template>
<script>
import Section from '@/components/Section.vue'
export default{
    components:{
        Section
    }
}
</script>

```

呼び出し元のViewです。
template(v-slot:header)の子要素がslot(name="header")に、
template(v-slot:body)の子要素がslot(name="body")に置きかわります。

記述する分量が増えてる疑惑がありますが、
クラス名が気に入らなくなって変えたいといった時でも
/src/components/Section.vueの1箇所を変えるだけで、
全てに適用されるのは魅力だと思います。
（パフォーマンスへの影響は若干気になるところですが）



さて、たまに厄介なのが、広告枠などheaderが要らないケースです。

```
    Section
        template(v-slot:body)
            iframe
```

のような場合です。
現状の/src/components/Section.vueは
template(v-slot:header)に子要素がなくても.headerを出力してしまいます。

```
    <div class="section">
        <div class="header"><div>
        <div class="body">
            <iframe></iframe>
        </div>
    </div>
```

といった具合に。
空のDOMエレメントが出力されてしまうのが気になるのでv-ifを使って
「template(v-slot:header)がない場合は.headerの部分を出力しない」
という分岐をします。

```
<template lang="pug">
    .section
        .header(v-if='this.$slots.header')
            slot(name="header")
        .body(v-if='this.$slots.body')
            slot(name="body")
</template>
```

のように「this.$slots」をv-ifの条件に使います。

```/src/views/Index.vue
<template lang="pug">
    Section
        template(v-slot:body)
            iframe
</template>
<script>
import Section from '@/components/Section.vue'
export default{
    components:{
        Section
    }
}
</script>
```

すると、上記のようにtemplate(v-slot:body)がない場合は.headerが出力されなくなります。
【React】JSX内での関数の書き方

備忘録として残します。



#■やり方

`{(()=>{処理内容})()}`です。

```jsx

render() {
  {/* <select value={this.state.selectvalue}> */}


    {/* START FUNCTION */}
      {(()=>{
          // let options = [];
          // let code =  this.state.code
          // for(var i in code){
          //     options.push(<option value={i}>{code[i]}</option>);
          // }
          // return options;
      })()}
    {/* END FUNCTION */}


  {/* </select> */}
}
```
Linuxコマンドメモ

サーバのOSを調べる

```bash

$ uname -s
Linux
```

バージョン調べる

```bash

$ uname -r
2.6.39-400.17.1.el6uek.x86_64
```

日付調べる

```bash

$ date
2019年  6月 20日 木曜日 09:23:19 JST
```

カレンダー

```bash
今日のカレンダー
$ cal
      6月 2019      
日 月 火 水 木 金 土
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

指定してカレンダー
$ cal 06 2013
      6月 2013      
日 月 火 水 木 金 土
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
```


コンピュータの名前

```bash

$ hostname
host01.example.com
```

連続実行

```bash

$ date;hostname
2019年  6月 20日 木曜日 09:25:46 JST
host01.example.com
```

コマンドのマニュアルを開く
特定のセクションで開く

```bash

man -s 1 exit
```

移動はスペースでページ移動
エンターで下がる
bでバック
nでネクスト
/で検索
qでquit


# vim

vimはうかつに変更できない仕様だからサーバ管理者にとってはありがたい。


### 移動モード
間違った文字の上でr(replace)
文字を追加したい、a(append)
カーソル以降の文字を修正cw(change word)

dd: 行削除
yy:コピー
p:ペースト

### 入力モード
WagtailのPage Modelを作るときに躓いた話

#WagtailのPage Modelを作る
[Wagtail Tutorials #2: Create Page Model ](https://www.accordbox.com/blog/wagtail-tutorials-building-blog-part-2/)を進めていく中で、Wgatialプロジェクトの中にblogアプリを作成し、Page Modelを作るという流れがあった。その中で躓いたポイントについてまとめる。

##開発環境
- macOS Mojave ver10.14.5
- nvim
- tmux
- Django 2.2.2
- Wagtail

##やったこと
[Wagtail Tutorials #1: Create Wagtail Project](https://www.accordbox.com/blog/wagtail-tutorials-building-blog-part-1/) を完了

```zsh
$ cd wagtail/wagtail_tuto
$ python manage.py startapp blog
$ nvim wagtail_tuto/settings/base.py
// add 'blog' to 'INSTALLED_APPS'
```
その後`blog/models.py`を編集する。
Tutorial通りには以下のように書かれてある。

```python:blog/models.py
from django.db import models

class BlogPage(Page):
    description = models.CharField(max_length=255, blank=True,)

    content_panels = Page.content_panels + [
        FieldPanel('description', classname="full")
    ]

class PostPage(Page):
    body = RichTextField(blank=True)

    content_panels = Page.content_panels + [
        FieldPanel('body', classname="full"),
    ]
```

##問題
その後migrationを行おうとするが、以下のようになった。
アプリ名を指定するも結果は同じ。

```zsh
$ python manage.py makemigrations
No changes detected
$ python manage.py makemigrations blog
No installed app with label 'blog'.
```
##解決策
`blog/models.py`を以下のように編集。
wagtailで必要なモジュールをそれぞれインポートする必要があった。

```python:blog/models.py
from django.db import models
from wagtail.core.models import Page
from wagtail.core.fields import RichTextField
from wagtail.admin.edit_handlers import FieldPanel

class BlogPage(Page):
    description = models.CharField(max_length=255, blank=True,)

    content_panels = Page.content_panels + [
            FieldPanel('description', classname="full")
    ]

class PostPage(Page):
    body = RichTextField(blank=True)

    content_panels = Page.content_panels + [
            FieldPanel('body', classname="full"),
    ]
```
そしてmigrationを行う。

```zsh
$ python manage.py makemigrations
~ModuleNotFoundError: No module named 'wagtail.wagtailadmin'
```
というエラーが起きて再びmigrationはできなかった。
そこで**wagtailのモジュールのパスをアップデートする**と解決した。

```zsh
$ wagtail updatemodulepaths
blog/models.py - 1 change

Checked 22 .py files, 1 file updated.

$ python manage.py makemigrations
Migrations for 'blog':
  blog/migrations/0001_initial.py
    - Create model BlogPage
    - Create model PostPage

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, home, sessions, taggit, wagtailadmin, wagtailcore, wagtaildocs, wagtailembeds, wagtailforms, wagtailimages, wagtailredirects, wagtailsearch, wagtailusers
Running migrations:
  Applying blog.0001_initial... OK
```

##学び
- 名前がないのなら、定義していないかインポートできるかどうかを疑う。
- またパスが正しいかどうかも考慮する。
GitHub を使って3分でWebサーバーを作る

# 概要

[GitHub Pages](https://pages.github.com/) を使うことでWebサーバーを無料で簡単に構築できます。
構築手順について記載しておきます。

簡単なので3分もあれば完成します。

# 手順

## 1. GitHubへログインする

[GitHub](https://github.com/login) へログインします。
GitHub のアカウントを持っていない場合は [Sign up](https://github.com/) してください。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/573c25b1-34e6-8e5e-a6ba-49d37aa4db9c.png)

## 2. リポジトリーの作成

左側の Repositories から `New` ボタンをクリックします。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/ef78d0ab-a957-3853-8757-c0ffbe0c99b9.png)

`Repository name` に `ユーザー名.github.io` を入力します。
入力したら `Create repository` ボタンをクリックします。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/d96629a3-7479-aefd-2061-6710eec8213f.png)

## 3. リポジトリーのクローン

`ユーザー名.github.io` のリポジトリーが作成されました。
Quick setup のところにあるクローン用のURLをクリップボードへコピーします。

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/dea0108f-34ea-279f-3ca3-70982f251cd4.png)

リポジトリーを任意のフォルダーへクローンします。
[TortoiseGit](https://tortoisegit.org/) を利用してクローンする場合はエクスプローラーの任意のフォルダーで右クリックメニューを表示して `Git Clone...` をクリックします。

GitHub でコピーしたクローン用のURLを `URL` へ入力し、 `Directory` にはクローン先の任意のフォルダーを入力して `OK` ボタンをクリックします。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/e050688e-9a68-400d-c2f7-85e8d9149408.png)

GitHub からリポジトリーがクローンされます。

![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/4fa8e9c5-0dad-532d-e6cd-dae229afb14e.png)

## 4. HTMLファイルの作成

クローンしたフォルダーに index.html を作成します。
サンプルとしてJavaScriptのアラートと文字列を表示するようにします。

```html:index.html
<!DOCTYPE html>
<html>
<body>
<h1>Hello World</h1>
<p>I'm hosted with GitHub Pages.</p>
<script type="text/javascript">alert('Hello World');</script>
</body>
</html>
```

index.html を作成したらファイルを選択して右クリックメニューから `Add...` をクリックします。

## 5. ファイルのコミットとプッシュ

作成した index.html をコミットしてGitHubへプッシュします。
エクスプローラーの右クリックメニューから `Git Commit` -> "master"...` をクリックします。

`Local` と `Remote` が `master` になっていることを確認して `OK` ボタンをクリックします。

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/49fba290-cc1d-9b1a-89b5-cd9359c585fc.png)

続けてGitHubのログイン認証が求められます。
ユーザー名とパスワードを入力します。

![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/64ff13f0-2a85-74c9-fbbe-a35702c5e3ab.png)

TortoiseGit からもユーザー名とパスワードが求められるので入力します。

![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/487df135-9c2d-7298-4fa3-9ba4af23de8b.png)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/77434b77-7878-6b6f-bd1b-bdffd0494009.png)

認証に成功するとGitHubへプッシュされます。

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/af755ef1-6693-49e6-7101-cfdb036a619d.png)

## 6. Webブラウザーでアクセス

Webブラウザーから `https://ユーザー名.github.io` へアクセスしてみます。
JavaScriptのアラートとHello Worldの文字が表示されることが確認できました。

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/91a894bc-41c3-ebaa-9357-a0b06cbc1c83.png)

GitHub PagesでWebサーバーが簡単に構築できました。
CourseraのDeep Learning Specializationを修了したので振り返り

今年ディープラーニングE検定を受ける予定で認定講座を受講中ですが、少し物足りないので通勤時間の暇つぶしも兼ねてCourseraの[Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning)を受講しました。
内容は盛りだくさんですが、１ヶ月ちょいでなんとか修了できたので、振り返りも兼ねて内容をまとめたいと思います。
# コースの概要
### Courseraとは
* MOOC(Massive Open Online Course)と呼ばれるオンラインで受講できる講座を提供するサイトの一つです。他の有名所は[Udacity](https://classroom.udacity.com/)あたりでしょうか。
* Courseraはスタンフォード大学発のMOOCで、多くの講座が大学教授によって開催されています。

### Deep Learning Specializationとは
* Courseraの設立者の一人であるAndrew Ng先生によるディープラーニングのコースです。
* 後に紹介するとおり5つの講座で成っていて、enrollすれば好きな講座を好きな順番に受けることができます。もちろん自分に必要な講座だけを受講することもできます。
* 最初だけ１週間の無料期間があり、その後は１ヶ月につき約5,500円の受講料が必要になります。

### コースのスタイル
* 各講座ともWEEK3~6程度に分かれており、各WEEKごとに講義動画、クイズ、プログラミング課題があります。
* クイズとプログラミング課題で一定以上の得点を取ればそのWEEKは合格。すべてのWEEKを合格すればその講座の修了証がもらえます。
* 講義動画は全てAndrew先生によるものなので、クオリティは安定しています。
* Geoffrey HintonやIan Goodfellowのような著名な研究者のインタビュー動画もあります。

# 講座内容
コースに含まれる5つの講座の内容を簡単にまとめます。詳しく知りたい方は前述の通り１週間は無料で受講できるので実際に講義動画を見てみると良いかと思います。

1. **Neural Networks and Deep Learning**
    * ロジスティック回帰、浅いニューラルネットから始めてディープラーニングの基本まで説明。
    * ディープラーニングは文字の記法がごちゃごちゃしがちですが、ここでしっかりと説明してくれるので混乱せずに最後まで受講できました。
2. **Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization**
    * 各種正則化、最適化手法、バッチ正規化などディープラーニングの精度を向上する手法の説明。
3. **Structuring Machine Learning Projects**
    * 機械学習プロジェクトを効率的に推進するための戦略を説明。
    * データセットをどのように訓練用/開発用/テスト用に分けるか、それらの結果から次のアクションをどうやって決めれば良いか。
    * この講座は教科書には書いていない実践的な内容なので、既にディープラーニングの知識がある人も無料期間で受講してみると良いと思います。
4. **Convolutional Neural Networks**
    * CNNの基本からResNet,Inceptionモデルも説明。
    * 応用としてObject detection,Face Recognition,Neural style transferの紹介。特に物体検出はかなり詳細に説明してくれます。
5. **Sequence Models**
    * RNNの基本からWord Embedding,seq2seq,Attentionモデルまで説明。
    * 個人的にはAttentionモデルのvisual化に興味をそそられました。


# 所感
### 良かった点
* Andrew先生がとにかく素晴らしいです。英語は聞き取りやすく、細かいところまでフォローしてくれるので動画を一回見ただけでほとんど理解できます。動画の端々から人柄の良さが滲み出ています。
* なぜその手法が上手くいくのかを直感的に理解できるような説明を必ずしてくれたのが良かったです。(この講座を受けて初めてなぜbatch正規化が必要かわかりました)
* コースで取り扱う範囲が広い点。浅いニューラルネットワークを詳細に説明することから始まり、YOLOやAttentionモデルまで取扱います。生成モデルと強化学習を除けばE検定のシラバスをカバーできているのではないでしょうか。
* Courseraの講座全般に言えることですが、一つ一つの動画が10分前後と短く区切られているので、通勤時間や昼休みのような隙間時間で受講しやすかったのが便利でした。

### 気になった点
* プログラミング課題はかなり親切にやることを指示をしてくれるため、それに従っているだけで合格できてしまいます(だからこそ１ヶ月ちょいで修了できたのですが…)。実装する力をつけるには別途努力が必要になるかと思います。とはいえ応用問題を除けば基本的にはnumpyで実装させられるので、E検定を受験するレベルには十分到達できるかと。
* Courseraで隙間時間に勉強するスタイルを気に入ったので、常に何かの講座を受講していないと時間がもったいないと思うようになってしまいました。完全に個人の問題ですが、一種の中毒ですね。
GitHub Desktop（ローカル）に残ったブランチを削除する方法


```terminal
$ git branch -d ブランチ名
```
GitHub上でブランチを消しても、
GitHub Desktopにローカルブランチは残ったまま。
このままでは、気持ち悪いので削除したい。
そんな時は、上のコマンドを叩けば削除できる。
マージしたブランチを一気に消す方法もあるけれど、割愛。

追記
エラー出る時は、"ブランチ名"（"で挟む）。
VC++(VS2017)でopensslをstaticで使用するメモ

基本的はnugetで導入可能だが別途dllが必要なので、レアではあるがstaticライブラリでアプリを作る場合のメモ。
## 取得
1. バイナリをダウンロードする。
https://slproweb.com/products/Win32OpenSSL.html
よりWin32とWin64を取得する。
2. インストール先はそれぞれ「C:\OpenSSL-Win32」と「C:\OpenSSL-Win64」とする

## VSの設定
1. プロジェクトのプロパティより「リンカー」「全般」を選択。「追加のライブラリディレクトリ」の欄に以下のパスを設定。「C:\OpenSSL-Win32\lib\VC\static」か「C:\OpenSSL-Win64\lib\VC\static」

2. 「C/C++」「全般」を選択し「追加のインクルードディレクトリ」の欄に以下のパスを設定。「C:\OpenSSL-Win32\include」か「C:\OpenSSL-Win64\include」

3. 「リンカー」「入力」より以下のライブ来rファイルを設定する
「Crypt32.lib」全プラットフォーム、各構成共通

32bit
Release マルチスレッドDLL：「libcrypto32MD.lib」「libssl32MD.lib」
Release マルチスレッド：「libcrypto32MT.lib」「libssl32MT.lib」

64bit
Release マルチスレッドDLL：「libcrypto64MD.lib」「libssl64MD.lib」
Release マルチスレッド：「libcrypto64MT.lib」「libssl64MT.lib」

Debug版は各ファイル名の末尾にdが付くファイル「***d.lib」

古いopenssl(1.0系)から1.1系にアップグレードすると
EVP_CIPHER_CTXの初期化方法が変わっていることによる
ビルドエラーが発生するので対処する必要がある。

```
EVP_CIPHER_CTX ctx
```
は

```
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
```

となり、引数で使用している個所もポインターにする。
Oracle LinuxにAnsibleインストール

Oracle Linux 7.6にAnsibleインストール。

※Oracle Linux Yum Serverリポジトリより
https://docs.oracle.com/cd/E77565_01/E54669/html/ol7-downloading-yum-repo.html

## Ansibleインストール
```
# リポジトリのダウンロード
curl -o /etc/yum.repos.d/public-yum-ol7.repo http://yum.oracle.com/public-yum-ol7.repo

# インストール (リポジトリ指定)
yum install ansible --enablerepo=ol7_openstack30

#バージョン確認
ansible --version
```

## Ansible検証コマンド (おまけ)
```
# 疎通確認
ansible all -i インベントリファイル名 -m ping
※インベントリファイルにて鍵・ユーザ指定
 
# 構文チェック
ansible-playbook -i インベントリファイル名 プレイブックファイル名 --syntax-check
 
# ドライラン
ansible-playbook -i インベントリファイル名 プレイブックファイル名 --check

```
CUI で Miniconda 3 をインストール on Win & Mac

# 内容

Win でも Mac でも Miniconda を利用すると複数のpython環境を管理できて非常に便利です。
[pip](https://www.python.jp/install/windows/pip.html)や[venv](https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e)と比較しても、conda.exeの使い方だけ覚えればいいので簡単な気がします。
現在は[pipenv](https://pipenv-ja.readthedocs.io/ja/translate-ja/)のほうが主流みたいですが、今はまだMinicondaで頑張ります。
対比しやすいように１ページにまとめました。

#

|項目|Win|Mac
|:-:|:-:|:-:
|**アプリケーション管理**|:chocolate_bar: [Chocolatey](https://chocolatey.org/)|:beer: [Homebrew](https://brew.sh/index_ja)
|**Python環境管理**|:snake: [Miniconda3](https://conda.io/miniconda.html)| :snake: [Miniconda3](https://conda.io/miniconda.html)
|**CUI環境**|Powershell|ターミナル
||
|インストール|choco install miniconda3|brew install Caskroom/cask/miniconda

## Windowsの場合

:chocolate_bar: [Chocolatey](https://chocolatey.org/)を利用して :snake: [Miniconda3](https://conda.io/miniconda.html)をインストール

#### インストール

1. 管理者権限でpowershellを開く
1. `choco upgrade chocolatey`
1. `choco install miniconda3 -y`  ***→３を忘れないように！***
1. `refreshenv`
1. Anaconda Prompt を開く
1. `conda init powershell`
1. powershell を開く
1. `refreshenv`

Note : `conda init`すれば [pwsh](https://github.com/PowerShell/PowerShell) でも WindowsPowershell でも WSL でも [conda](https://docs.conda.io/en/latest/) が使用できます。

## Macの場合

:beer: [Homebrew](https://brew.sh/index_ja)を利用して :snake: [Miniconda3](https://conda.io/miniconda.html)をインストール

1. `brew update`
1. `brew install Caskroom/cask/miniconda`
1. `export PATH="/usr/local/miniconda3/bin:$PATH"` →実行パスを設定
1. `source ~/.bash_profile`→実行パスを現在のターミナルに適用

# conda本体をアップデート

chocolateyのリポジトリに置いてあるものが最新とは限らないので、更新をかけます。
`conda update conda -n base -c default`

# ！！！ 注意 ！！！

この手順の後、何も考えずにbase環境で`conda install`をするのはやめましょう。
それだと`conda`の能力が大幅に減衰します。仮想環境を作成しましょう！
そうしなければ`conda`をインストールした意味が無くなります。

# 環境変数「Path」

chocolateyやhomebrewでインストールすると、
Win も Mac も環境変数「Path」に conda.exe の登録がされません。
そこで、Win では `conda init` や `Anaconda Prompt` が、
Mac では `export` や `source` が登場します。

# 参考

-   [Chocolateyでのインストール直後にPATH変更を反映する](https://qiita.com/k1tajima/items/f7e02e3795963d34e635)

**Excelsior!**