OmniAICreator/Qiita-1.07M huggingface dataset:
自治体ウェブサイト動向

自治体のウェブサイトで HTTPS 対応が進んできている気配がしてきた。以前から[Wikidata でデータをメンテナンス](https://qiita.com/kwi/items/29ec8de4c897536830a7)してきていて気が付いたので、思い切って普段よりも深めに作業してみた。いくつか気が付いたことがあったので、記録としてメモしておく。

- ドメイン名
  - HTTPS が増えてきて、ホスト名が特定しやすくなってきた。以前は異なるホスト名で同一コンテンツが見えていたりしていた。
  - 以前と同様に lg.jp への移行が進んでいる
  - 県で独自に維持している `$perfecture.jp` 等は市区町村のサイト（`$town.$prefecture.jp` の形式）のために残されていることも多い
  - 独自路線は減ってきたものの、相変わらず存在する。[最上町](http://mogami.tv/) とか。
- 接続
  - HEAD method では redirection が検出できないことがよくある。
  - 中間証明書の設定でミスが出ている模様（サーバー側）。
  - 証明書の有効期限が切れていることもある
  - SSL プロトコルで SNI が使われていることもある
  - 証明書に SAN (X509v3 Subject Alternative Name) が使われていることもある
  - 弱い cipher が使われていることもある（そのせいで機械アクセスに失敗することもある）
- オープンデータ `Q309901` のサイト
  - P856「公式サイト」に P642「以下についての」で記述しているパターン（[例](https://www.wikidata.org/wiki/Q170616)）
     - turtle 表記では`wd:Q170616 p:P856 [ pq:P642 wd:Q309901 ] .` のようになる。
  - P1325 「外部データURL」に P642「以下についての」で記述しているパターン（[例](https://www.wikidata.org/wiki/Q194087)）
     - turtle 表記では `wd:Q194087 p:P1325 [ pq:P642 wd:Q309901 ] .` のようになる。
  - しかしデータ全体としてみたときには、[使い方はどうなんだろう](https://query.wikidata.org/#SELECT%20%3Fs%20%3FsLabel%20WHERE%20%7B%0A%20%3Fs%20%3Fv%20%5B%20pq%3AP642%20wd%3AQ309901%20%5D%20.%0A%20SERVICE%20wikibase%3Alabel%20%7B%0A%20%20bd%3AserviceParam%20wikibase%3Alanguage%20%22ja%22%20.%0A%20%7D%0A%7D%0A)ね。
- 以前は海外からはアクセス禁止されているサイトも多かったが、今はどうなっただろうか。余力があれば調査したい。
- 証明書のチェーン情報を集めてみようと思ったけれども、python で取り出すのに[苦労する](https://bugs.python.org/issue18233)


## 中間証明書設定
認証局が用意している[チェックサイト](https://www.digicert.com/help/)で確認できる。いくつかのウェブサーバは中間証明書の設定が正しくできていなかった。2019-04-01 現在見つけたものは 7 サイトある。HTTPS 対応が進むのは喜ばしい一方で、設定ミスを引き起こすポイントも新たに出現しているのですね。

Linux では `ca-certificates` ではルート証明書のみが格納されているので、これで動いているプログラムからアクセスすると検証に必要な情報が足りず、失敗する。`firefox` などのブラウザは中間証明書も[全部抱えている](https://ozuma.hatenablog.jp/entry/20180725/1532530568)ので、問題なくアクセスできる（firefox では Software Security Device で持っている。[参考](https://www.atmarkit.co.jp/ait/articles/1202/10/news123.html)）。現在存在する自治体のサイトは、以下の中間証明書 Intermediate Certificate を信頼すれば全てアクセスできるようになった。

- [DigiCert SHA2 Secure Server CA](https://www.digicert.co.jp/repository/intermediate/server/dc-ov.html)
- [Domain Validation CA - SHA256 - G2](https://support.globalsign.com/customer/portal/articles/1464460-domainssl-intermediate-certificates)
- [Organization Validation CA - SHA256 - G2](https://support.globalsign.com/customer/portal/articles/1219303-organizationssl-intermediate-certificates)
positon:ralativeやabsoluteを使ってtransitonする時の注意点

#変更前に初期値を設定する必要がある

#####これだと動かない

```css

.btn{
  background: red;
  transition: all 1s;
}

.btn:hover{
  cursor: pointer;
  background: red;
  transition: all 1s;
  position: relative;
  top: 10px;
}

```



#####これで動く
```css

.btn{
  background: red;
  transition: all 1s;
  position: relative;//初期値
  top: 0;//初期値
}

.btn:hover{
  cursor: pointer;
  background: red;
  transition: all 1s;
  top: 10px;//変更後
}

```
MkdocsをDockerで動かしてみた

# はじめに
MkdocsをDockerで利用する方法です。
普通にMkdocsを導入する際に必要なmkdocs本体、デザインのインストールが不要になります。

# Mkdocsとは
Markdown形式のファイルをドキュメントサイトの形に変換してくれる高速でシンプルな静的サイトジェネレーターです。
いくつかデザインが用意されていますが、[material](https://squidfunk.github.io/mkdocs-material/)デザインがメジャーなようです。

![material.jpg](https://qiita-image-store.s3.amazonaws.com/0/215847/ffa19bf7-d554-b12a-f927-a7ceddfdb9ec.jpeg)


Mkdocsでは、以下の構成のプロジェクトフォルダが必要になります。

```
documentフォルダ
|-- docs    # markdownファイルや画像を格納するフォルダ
|   |-- 各ページのmarkdownファイル
|   `-- img
|        `-- 画像ファイル
|
|-- mkdocs.yml　# mkdocsの設定ファイル
`-- site        # mkdocsで生成されたファイルが格納されるフォルダ
```

`mkdocs.yml`に各種設定を記載します。　
以下は例になるので、設定値は適宜変更してください。

```mkdocs.yml
site_name: サイト名

# ページとmarkdownファイルを紐づける設定
nav:
  - 概要: index.md
  - ページ１: page1.md
  - ページ２: page2.md

# ページのデザイン設定
theme:
  name: 'material'
  language: 'ja'
  palette:
    primary: 'indigo'
    accent: 'indigo'
  font:
    text: 'Roboto'
    code: 'Roboto Mono'

# 検索機能の設定
extra:
  search:
    language: 'jp'

# 拡張機能の設定
markdown_extensions:
  - admonition
  - footnotes
  - codehilite
  - toc:
      permalink: true
  - pymdownx.tasklist:  
      custom_checkbox: true
```


# Dockerでの実行手順
DockerHubに[mkdocsイメージ](https://hub.docker.com/r/squidfunk/mkdocs-material/)が公開されているので、これを利用します。

### サイトプレビュー
プロジェクトフォルダ内の`mkdocs.yml`ファイルと同じディレクトリにいることを確認してから、Dockerコマンドを実行します。

```
$ docker run --rm -it -p 8000:8000 -v `pwd`:/docs squidfunk/mkdocs-material
INFO    -  Building documentation... 
INFO    -  Cleaning site directory 
[I 190302 03:36:32 server:298] Serving on http://0.0.0.0:8000
[I 190302 03:36:32 handlers:59] Start watching changes
[I 190302 03:36:32 handlers:61] Start detecting changes
```
上記のコマンドでは、ローカル上のMarkdownファイルが格納されているdocsフォルダをコンテナにマウントしています。

コンテナが起動すると、ファイル変更を監視している状態となります。
変更が発生するとリロードする必要なく、リアルタイムで反映されます。

`http://localhost:8000`にアクセスし、正常にWebサイトが表示されることを確認します。


コンテナを終了する場合は、[Ctrl]+[c]
（`--rm`オプションをつけて起動しているため、終了時にコンテナは削除されます）

### ビルド
プレビューでの確認が完了したら、以下コマンドでビルドを行い、markdownファイルをもとに静的コンテンツを生成します。

``` bash
# buildコマンドで静的コンテンツが生成される
$ docker run --rm -it -v ${PWD}:/docs squidfunk/mkdocs-material build
INFO    -  Cleaning site directory 
INFO    -  Building documentation to directory: /docs/site 
```

ビルドが完了すると、siteフォルダに変換されたファイル群が生成されます。

後は、siteフォルダに生成されたファイルをGitHub Pagesや、S3などにデプロイすればWeb公開できます。


## 参考
[MkDocsによるドキュメント作成](https://qiita.com/mebiusbox2/items/a61d42878266af969e3c)
[書き散らかしたMarkdownメモをかっこよく活用する【手順編】](https://qiita.com/kijibato/items/945d79e12d47e22e59bf)
Gitlab CIにて、コミット情報をデプロイしたコンテナに渡す

# やりたいこと
gitlabにて、commitしたコードを使ってコンテナ(Webアプリケーション)をデプロイするCIを運用中。
本番とステージングの２種類を用意しているため、各々の画面を見たときに、これはどのコミットなのかすぐに判別したい(本番とステージングで差があるかどうか)。

# 解決策

GitLab10.8以上という条件付きではあるが、Gitlabであらかじめ用意されている環境変数を使用すればよい。
[GitLab CI/CD Variables](https://docs.gitlab.com/ee/ci/variables/)
この中の、CI_COMMIT_TITLEを使用する。

まず、表示させたいページのHTMLに、以下のような内容を追記する。

```html:toppage.html
<p class="text-muted" align="right">Commit Version: CI_COMMIT_TITLE</p>
```

このCI_COMMIT_TITLEをCIのジョブで書き換える。
以下では確認のために、exportとechoで変数の内容を確認するステップを入れている。

```yml:.gitlab-ci.yml
before_script:
   - docker info
   - export
   - echo ${CI_COMMIT_TITLE}
   - sed -i -e "s/CI_COMMIT_TITLE/${CI_COMMIT_TITLE}/g" templates/toppage.html

build:
  script:
    - docker build -t citest .
#(略)
```

これでtoppage.htmlを表示させれば、コミットメッセージの最初の1行が表示される。

# Shell Executerの場合(2020/1/7 Update)
上記の方法はshell executerでCIを行っているときには有効ではなかった。その場合は次のように、
まず--build-argオプションを使って、DockerfileにCI_COMMIT_TITLEを渡す。

```yml:.gitlab-ci.yml
build:
  script:
    - docker build -t citest . --build-arg commit_title="$CI_COMMIT_TITLE"
#(略)
```

そしてDockerfile内でその変数を使用してHTMLを書き換える。

```text:Dockerfile
ARG commit_title
RUN sed -i -e "s%CI_COMMIT_TITLE%${commit_title}%g" deploy-automation/templates/datadomain/home.html
```

ここでsedのセパレータとして%を使用しているのは、コミットタイトルにデフォルトのセパレータである/(スラッシュ)が入っていることが多いため。

## 補足
ちなみに"$CI_COMMIT_TITLE"をダブルクォータで囲まないと、CI_COMMIT_TITLEに空白がある場合に以下のようなエラーで失敗する。

```shell-session
$ sudo docker build citest --build-arg commit_title=$CI_COMMIT_TITLE .
"docker build" requires exactly 1 argument.
See 'docker build --help'.

Usage:  docker build [OPTIONS] PATH | URL | -

Build an image from a Dockerfile
ERROR: Job failed: exit status 1
```
【令和】写真から文字をトレースする

# 概要

１枚の写真を渡される
「これに写ってる文字を印刷してお願い！:laughing:」
 
写真に写っている文字を、Photoshopで切り抜いて、印刷する。
「何だか輪郭がぼやけてない？もっときれいに印刷して！:unamused:」

同じようなフォントを探して、同じ文字を入力、印刷する。
「なんか写真の文字と違わない？:worried:」
「これと、全くほぼ同じ字形じゃなければイヤイヤイヤ！:confounded:」

…。


**じゃあ、ベクタ化して印刷すればいいじゃない。**

# 方法
## 1. Photoshopである程度、編集しておく

文字を切り抜く、色合いを変える、かすれたりしていたら補修する。などなど

<img src="https://qiita-image-store.s3.amazonaws.com/0/390388/b0f33cd9-4549-dc52-0b26-a9d9cd8ef6ff.png" width="640">

↓

<img src="https://qiita-image-store.s3.amazonaws.com/0/390388/127b15f3-904c-e414-fa36-0377480b5dd8.png" width="640">

## 2. Illustratorで画像トレース

`オブジェクト`→`画像トレース`→`作成`

トレースし終わったら、「プリセット」や「画像トレースパネル」を自分が納得がいくまでいじる。

納得がいったら、`拡張`でベクタ化。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/390388/c56d3ea6-70cf-488c-0ec8-ae56ff4a271b.png)

![4.png](https://qiita-image-store.s3.amazonaws.com/0/390388/a0ecb4e1-9260-11a3-a869-452218536e4b.png)

## 3.完成

印刷する。

![DSC_0002.JPG](https://qiita-image-store.s3.amazonaws.com/0/390388/d9e94321-46a6-7af2-9293-2756dd59e596.jpeg)


## 4.コツ

Photoshopである程度まできれいに編集しておくと、Illustratorが楽。

↓きれいな編集の例↓

* 背景は白く、文字は黒く
コントラストなどをいじって明暗をはっきりさせる

* 切り抜くときは、「色域指定」や「自動選択ツール」がラクチン。

* でも、もっときれいにしたいなら細部は手動が基本

#おまけ

菅義偉内閣官房長官が記者会見で発表した新元号「令和」のトレース画像です。

PDF・AI・PSD・JPGで用意しております。
https://github.com/D0uJ7kPR2OQcCISI3vSUOGGcpt9wIVo2kt2Jiv9/reiwa

>書家の茂住修身氏が揮毫したとの事です。
[官邸に掲げられた新元号の文字「令和」を書いたのはこの人！][fnn]
[fnn]:https://www.fnn.jp/posts/00044471HDK/201904011149_reporter_HDK

![令和.jpg](https://qiita-image-store.s3.amazonaws.com/0/390388/de996fb7-0692-7fa1-4827-3d8a3820cf12.jpeg)
【やらかした！】/etc/passwd から root を削除してしまったときに復旧する方法

# はじめに
**やってもうた！**そこの~~ポンコツの~~あなた！

僕は[この記事](https://qiita.com/SeeLog/items/bec96ab2e56b70f56756)を書く際にコマンドをテストしている時にやってしまいました．

>以下のコマンドで追記できます．**(-aを忘れると地獄を見ます！！！)**
>zsh実行してる端末でやらないとエラー出るかも．

> `% echo "${USER}:x:${UID}:${GID}:${USER}:${HOME}:$(which zsh)" | sudo tee -a /etc/passwd`

ふむ．

>**(-aを忘れると地獄を見ます！！！)**
>**(-aを忘れると地獄を見ます！！！)**
>**(-aを忘れると地獄を見ます！！！)**

やってもうた．

なんということでしょう．`-a`を忘れただけで自分しかログインできないマシンの完成です．(しかも再起動したら二度と起き上がらない)

**そもそもこういうことを避けるために`/etc/passwd`を直接編集することは避けるべきです．**が，そうせざるを得ない状況になることもあります．(まあ`tee`でやらかすアホは僕くらいだと信じたいですが．)

でも諦めるのはまだ早いです．なんとしても復旧させます．
その際に僕が行った内容を備忘録としてここに残します．

# 今回の最大の目標
- **/etc/passwd を元の内容に戻す**

ここを目指します．

まず`/etc/passwd`に書かれたユーザが自分だけなので
- sudo 不可(rootなんて人はいないよって言われる)
- su - 不可(同上)
- ssh 不可
- なんかいろいろ不可
- ていうか再起動したらログインも不可(たぶん)

sudoが不可なのでバックアップがあっても`/etc/passwd`を編集することができません．
まあ，**詰み**です．

# 手順
## 1. OSのディスクを用意
なんとかして用意しましょう．自分の場合は自分の所属場所に置いてあるのでここは無問題でした．

## 2. OSのディスクからUbuntuを起動
BIOSの画面からOS起動順位を変えるか，起動オプションを使ってOSのディスクから起動させましょう．
BIOSの画面はPCメーカーによって出現させる方法が違います．(僕は`F2`でした)

ディスクの読み込みが終わったら
`Try Ubuntu without installing` でEnterを押します．
**OSの再インストールはしません．**

## 3. sudo 権限でファイラーを起動
怖いのでGUIで操作をしていきます．
**コマンドだと打ち間違えてバックアップすらさようならする危険がありますので......**

端末を開きます．左上のアプリケーションを開くところに`terminal`と打てば出ます．
以下のコマンドを実行．
`sudo nautilus &`

これでsudo権限を持ったファイラーが現れます．

## 4. バックアップを書き戻す
ファイラーからHDD/SSD等がマウントされていることを確認します．
マウントされているなら，そのHDDへアクセスします．
恐らく`(HDD/SSDなど)/etc/passwd-`**(最後にハイフンがある)**というファイルが直前のバックアップになっています．
この中身をファイラーなり端末なりからsudo権限を持ったgeditなどを起動して確認しましょう．

書き戻す内容がそれで合っていれば，内容をコピーします．

その後，今度は`(HDD/SSDなど)/etc/passwd`**(今度はハイフン無し！)**をgedit等で開きます．
sudo権限を持ったファイラーから現れたgeditはまたsudo権限を持ちます．

さっきコピーした内容を書き戻して保存．
エラーが出なければ大勝利！おめでとうございます．

## 5. シャットダウンと再起動
シャットダウンしてOSのディスクを抜き，再度起動します．
無事にログインができることを確認したらOSのディスクを元の場所に戻しましょう．


# 終わりに
やらかした誰かの役に立てば幸いです．
最後に，
**そもそもこういうことを避けるために`/etc/passwd`を直接編集することは避けるべきです．**
**そもそもこういうことを避けるために`/etc/passwd`を直接編集することは避けるべきです．**
**そもそもこういうことを避けるために`/etc/passwd`を直接編集することは避けるべきです．**

大事なことなので3回言いました．おわり．
【PHP】PHP extension（PHP拡張モジュール）の確認と有効化（ext-fileinfo、ext-gd編）


# TL;DR

`composer install`でエラーが発生した際の解決までのメモ
（原因は**PHP拡張モジュールの有効化がされてないこと**でした）

# `composer install`でエラー

他のプロジェクトへ途中参加することになったのでいつも通りにクローンからの`composer install`。
すると**エラーが発生**

```
>composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for league/flysystem 1.0.47 -> satisfiable by league/flysystem[1.0.47].
    - league/flysystem 1.0.47 requires ext-fileinfo * -> the requested PHP extension fileinfo is missing from your system.
  Problem 2
    - Installation request for phpoffice/phpspreadsheet 1.4.1 -> satisfiable by phpoffice/phpspreadsheet[1.4.1].
    - phpoffice/phpspreadsheet 1.4.1 requires ext-gd * -> the requested PHP extension gd is missing from your system.
  Problem 3
    - league/flysystem 1.0.47 requires ext-fileinfo * -> the requested PHP extension fileinfo is missing from your system.
    - laravel/framework v5.7.9 requires league/flysystem ^1.0.8 -> satisfiable by league/flysystem[1.0.47].
    - Installation request for laravel/framework v5.7.9 -> satisfiable by laravel/framework[v5.7.9].

  To enable extensions, verify that they are enabled in your .ini files:
    - C:\tools\php71\php.ini
  You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.
```

エラー内容的に**PHP拡張モジュールがない**みたいなエラーが

# PHP拡張の確認

```
>php -i | grep ext-fileinfo
```

確認したが入ってなかった。

# PHP7.2系の最新をインストール

とりあえず使用していたPHPのバージョンが7.1系だったので7.2系の最新をChocolatey経由でインストール
（ここではPHPのバージョン違いをインストールするとエラーがでるので`--force`オプションを指定してます）

```
>choco install php --version 7.2.15 --force
```

> -f, --force
     Force - force the behavior. Do not use force during normal operation -
       it subverts some of the smart behavior for commands.

**※強制実行コマンドなので実行時は慎重にしてください**


# インストールされたか確認

```
>choco list -lo
```

# PHPのiniファイルを変更

以下を探して有効化（コメントを外す）

## **ext-fileinfo**の有効化

```php.ini
extension=php_fileinfo.dll
```

## **ext-gd**の有効化

```php.ini
extension=php_gd2.dll
```

# 一度ログアウト後再び`composer install`

```
> composer install
```

無事動きました

# 参考URL
- [php – ext-fileinfoが必要です。それをcomposer.jsonファイルに追加する方法 - コードログ](https://codeday.me/jp/qa/20190228/338623.html)
Raspberry pi zeroを立ち上げる

IoTのエッジデバイスとするために、Raspberry Pi Zero WHを買いました。
届いてから、SSHでRaspberry pi zeroにログインできるところまでを纏めます。
なお、Windows10のPCが前提です。

# 何が必要か
Raspberry pi zeroをSSHで接続して使える状態にするまでに必要なものは以下の通りです。

* Raspberry pi zero wh
* microsdカード(16GB以上はあった方がいい)
* USB-A-micro-usbケーブル
* WiFiルーター
* Raspberry pi zeroを置く段ボール(ケースの代わり)
* SDカードアダプタ
* SDカードリーダー

分からずいろいろと買いましたが、これだけあればできます。
 
# まずはOS
https://www.raspberrypi.org/downloads/ にアクセスして、Raspberry OSをダウンロードしましょう。zipファイルなので、解凍してください。
ここでは、RaspbianのRaspbian Stretch Liteを使います。

# Etcherをダウンロードし、インストール
RaspbianをSDカードにイメージ保存するために必要なEtcherをダウンドーロして、インストールします。
https://www.balena.io/etcher/

# Raspberry OSをSDカードに転送
banelaEtcherを立ち上げます。
Select Imageでダウンロードして解凍したイメージファイルを選択します。

<img width="602" alt="pi1.png" src="https://qiita-image-store.s3.amazonaws.com/0/334727/80b500be-65ec-efea-4577-3e505423b1c7.png">

Flashボタンをクリック。

<img width="601" alt="pi2.png" src="https://qiita-image-store.s3.amazonaws.com/0/334727/f1fdc191-b796-fe5d-0027-2d0bebca1503.png">

Starting...
Flashing...
Validating...

と続きますので、しばし待ちましょう。
この画面になったら、完成です。

<img width="601" alt="pi3.png" src="https://qiita-image-store.s3.amazonaws.com/0/334727/dde5d9f9-8eb4-b72d-afec-88ed2829a4f9.png">

# WiFiとSSHの設定
Raspbianは、wpa_supplicant.confにWiFi設定、ssh.txtにSSH設定をしたファイルをmicroSDのルートに置いておくと、WiFiルーターにつないでくれます。
また、SSHで接続することも簡単にできます。
まず、このファイルを作成しましょう。
https://mascii.github.io/wpa-supplicant-conf-tool/ にアクセスして、SSIDとパスフレーズを入力して追加ボタンをクリックします。
wpa_supplicant.conf作成ボタンをクリックするとwpa_supplicant.confが、ssh.txt作成ボタンをクリックするとssh.txtファイルをダウンロードできます。
この2つのファイルを、Raspbianイメージを作成したmicroSDにコピーしましょう。
Windowsだと、bootと言うドライブになっているはずです。

# いよいよ、Raspberry起動
RaspbianのmicroSDをRasberry pi zeroに挿して起動しましょう。
USB-A-microUSBケーブルで適当につないでください。そして、起動するまで3分ほど待ちましょう。

# Raspberry pi zeroを探そう
WiFiルーターまでは、自動的に接続されます。
普通はDHCPでIPアドレスが振られますので、IPアドレスを調べる必要があります。
まずは、コマンドプロンプトで、以下のコマンドを実行します。
(192.168.0のところは自分の環境に合わせてください)

> for /l %i in (0,1,255) do ping -w 1 -n 1 192.168.0.%i

次にarpコマンドでアクセスできたIPアドレス一覧を表示します。

> arp -a

物理アドレスの先頭が、「b8-27」となっているものがRaspberry pi zeroです。

DHCPにIPアドレスの付与を任せると、この手順でRaspberryを探す手間が増えるので、DHCPサーバーのDHCP固定割当設定で空いているIPアドレスに物理アドレスをマッピングする事をオススメします。
そうすると、常に同じIPアドレスが割り当てられます。

# SSHで接続
SSHで接続します。有名なソフトとしてはTeraTermでしょうか。
上記でべたRaspBerry pi zeroのIPアドレスを指定します。

<img width="359" alt="tt1.png" src="https://qiita-image-store.s3.amazonaws.com/0/334727/e7b2db05-ac1d-b7e3-49d5-7dc3b470d6ee.png">

セキュリティ警告が表示されますので、続行をクリックしましょう。
既存の鍵を、新しい鍵で上書きすると言うオプションが表示されたら、チェックしましょう。

SSH認証で、ユーザ名をpi、パスフレーズにraspberryを入力し、OKボタンをクリックしましょう。

<img width="494" alt="pi4.png" src="https://qiita-image-store.s3.amazonaws.com/0/334727/e7436315-e10c-57e2-c4b2-88920d14ab45.png">

SSHで繋がりました！！

# アップデートの実行
Raspbianをアップデートしておきましょう。

```shell
sudo apt-get update
sudo apt-get -y upgrade
```
コンストラクタで毎回`$this->hoge = $hoge`と書くのがつらたん

コンストラクタに引数を4個渡したい。

```php
class HOGE{
	private int $foo;
	protected string $bar;
	public array $baz;
	public DateTime $qux;

	/**
	* コンストラクタ
	* @param int $foo
	* @param string $bar
	* @param array $baz
	* @param DateTime $qux
	*/
	public function __construct(int $foo, string $bar, array $baz, DateTime $qux){
		$this->foo = $foo;
		$this->bar = $bar;
		$this->baz = $baz;
		$this->qux = $qux;
	}
}
```

毎回こんなの書くのはつらみがあります。

ということで、ここの構文を[もっと楽にしようというRFC](https://wiki.php.net/rfc/code_free_constructor)が2019/01/23に提出されました。

# Code free constructor

## 文法

```php
class HOGE{
	/**
	* コンストラクタ
	* @param int $foo
	* @param string $bar
	* @param array $baz
	* @param DateTime $qux
	*/
	public function __construct(private int $foo, protected string $bar, public array $baz, DateTime $qux){
	}
}
```

なんてこった全部消えた。

コンストラクタ引数は全て同名のプロパティに自動バインドされます。

可視性は引数に書かれているものが対応します。
`$foo`はprivateの`$this->foo`に、`$bar`はprotectedの`$this->bar`になる、ということです。
可視性が書かれていない`$qux`は、単純にpublicになります。


## extends

```php
// 現在
class MyCustomMotorCycle extends MotorCycle {
    public $passenger;

    public function __construct(Person $driver, Person $passenger) {
        parent::__construct("Custom", $driver);
        $this->passenger = $passenger;
    }
}

// 上と同じ
class MyCustomMotorCycle(Person $driver, Person $passenger) 
    extends MotorCycle("Custom", $driver) { };
```

引数の一部を親クラスにそのまま渡す場合は、そのプロパティは子クラスには設定されません。


## 無名クラス

```php
// 現在
$a = new class($mDriver, $mPassenger) extends MotorCycle {
    private $passenger;
    public function __construct(Person $driver, Person $passenger) {
        parent::__construct("Custom", $driver);
        $this->passenger = $passenger;
    }
};

// 同じ       |------arguments------||-----------constructor params------------|
$a = new class($mDriver, $mPassenger)(Person $driver, private Person $passenger) 
        extends MotorCycle("Custom", $driver){};
```

無名クラスの文法は少々わかりづらいですね。

## 過去のRFC

2013年に[Automatic Property Initialization](https://wiki.php.net/rfc/automatic_property_initialization)というRFCが提出されましたが、却下されています。


## 導入

PHP8で導入したい。


## 互換性のない変更

非互換はおそらくありません(Looks like no BI)。


# 感想

いや…あかんじゃろこれ。

何がよくないって、ショートハンドに傾倒するあまり人に優しくない。
特に、可視性を書いてないときは勝手にpublicになるのは悪手でしょう。
非互換はたぶんないとか書いてあるけど、このRFCが導入されたら、入れた覚えのないプロパティが勝手に増えるので、`foreach`や`property_exists`の動作が変わります。

extendsしたときの挙動も極めてわかりにくいですね。
あとコンストラクタで`$this->foo = $bar`ってしたときに`$this->bar`がどうなるのかよくわからない。

これなら[Automatic Property Initialization](https://wiki.php.net/rfc/automatic_property_initialization)の文法の方がまだいいと思います。

```php
  class Point
  {
      private $x;
      
      public function __construct($this->x, $y);
  }
```

こちらであれば、引数に`$this->x`と書いたらプロパティに入る、普通に`$y`と書いたら入らない、ということで、まだわかりやすいですね。

[PHP internal](http://news.php.net/php.internals)にはこのようなRFCや、RFCに辿り着かないような思いつきが日々投稿されています。
しかし、思いつきの中にも時折光る原石があり、それらがやがてPHP本体に取り込まれることを考えると、全ての投稿やアイデアはきっと無駄ではありません。
Code free constructorはいったいどちらになるでしょうか。

まあ、これが投票まで行ったとしても採択されることはないと思いますが。
Qiitaの記事を表情豊かにする絵文字を簡単に見つけられるよ💚

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52151/a7ddebac-53e7-3e49-5459-57176b44cdae.png)

# Qiitaの記事を表情豊かにする絵文字を簡単に見つけられるよ

- **どうゆうこと？**

先週、はじてめてQiitaへの投稿をしてみましたが、他の方の記事は絵文字が効果的に使用されていて、「読みやすい!」と感じていたました。

- **気がつかなかったの？**

Qiita投稿の常連の方には「そんなの知っているよ。気がつかなかったの？」と言われそうです。
なにせ、投稿エディタの右上に、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52151/1064a325-7434-31d1-214c-18bde15cfb20.png)
と、便利なアイコンがあるじゃないのと...

# なぜこの記事を書いたのか

- **絵文字をサポートするマークダウン記法が存在することに気が付いたから**

もしかしたら、FAQなのかもしれませんが、エディタ・アイコンのクリックで表示される絵文字はマークダウン記法で入力することができます。

**絵文字とマークダウン記法の対応**は[こちら。](https://gist.github.com/rxaviers/7360908)

全ては試していませんが、マークダウン記法で利用できる絵文字の**コンプリートリスト**だそうです。
よく使う絵文字なら、**キーボード操作だけ**で絵文字が埋め込めて便利だと思います。
それと、一覧表示されるので使いたい絵文字を一気に確認&コピペできるところはとても便利です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52151/3ddd295f-820c-ed32-09bb-ecbf605e671f.png)

# 小さな発見が多くの人の役に立ちますように...

発見というほどではありませんが:sweat_smile:
factory_bot導入手順をまとめる

#今回の目的
factory_bot導入をできるように手順をまとめる

#手順
####Gemのインストール
```terminal:ターミナル
group :development, :test do
  gem 'rspec-rails'
  gem 'factory_bot_rails'
end
```
ポイントは「rspec-rails」と同じグループに設定すること。

####ディレクトリとファイルの作成
specディレクトリ直下に「factories」というディレクトリを作成
作成するインスタンス(複数形)のファイル名でRubyのファイルを作成
*Productクラスのインスタンスを作る場合、「products.rb」を作成

####テストコードの記述例
```products.rb
FactoryBot.define do

  factory :product do
    name              {"apple"}
    description        {"美味しい"}
    price              {120}
  end

end
```
####buildメソッドとcreateメソッド
```products.rb
product = FactoryBot.build(:product)
product = FactoryBot.create(:product)
```
上記のように記述することにより、インスタンスの作成ができる。
createの場合はテスト用のDBに値が保存される。しかしテストが終わるとロールバックされる。

####factory_botの記法の省略
下記ファイルを編集することにより、インスタンス作成時に「FactoryBot」の記述が不要になる。

```spec/rails_helper.rb
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods #追記
end
```
```products.rb
product = build(:product)
```

####値を変更しインスタンスを作成したい場合
```products.rb
product = build(:product, name:"orenge")
```

以上です。
プログラミング学習記録44〜やる気がない時こそProgate〜

##今日やったこと
- Progate Git リセット復習３周

今日はやる気が出なかったので、ProgateのGitだけやりました。

やる気がなくてもなんとなく始めることができて、進めているうちにやる気が出てくるので、やる気がない時こそProgateをやるのがオススメです。

ProgateのGitは前回やってからだいぶ期間が空いたので、忘れてしまっている部分も多かったのですが、３周リセット復習したらだいぶ思い出しました。

これでGitの基礎の基礎の基礎の基礎は理解できました。

３周ぐらい続けてやると理解が深まりますね。

大まかな流れとしては、
`add→commit→push→pull→…`
という感じです。

そのほかにレッスンで学んだコマンドは以下の通りです。

`git init`→gitを始めるときに最初に打つコマンド`

`git remote add リモート名 リモートのURL(GitHubとかのURL)`→リモートを登録する


`git status`→変更したファイル、addしたファイルを確認できる

`git diff`→変更内容を確認できる

`git log`→自分や他人のコミットがわかる

`git log -p`→コミットメッセージだけでなく、変更内容も見れる


基礎の基礎の基礎の基礎はこれで終わりにして、次は**「わかばちゃんと学ぶGit使い方入門」**でGitの便利な使い方を学びます。
<br>

久しぶりにSANGOの公式HPを見たら、だいぶ新しいバージョンまでアップデートしていたので、自分のブログでも久しぶりにアップデートしようかな…という気になりました。

ということで、明日からも引き続きプログラミング学習頑張ります。

おわり
articleとsectionの入れ方

#article
とても単純なhtmlバリデーションエラーがあった。

>The “main” element must not appear as a descendant of the “article” element.

**“ main”要素は、“ article”要素の子孫としてはいけません。**(直訳)

main > articleの順で入れ子にするから、あとは記事部分に使うのが無難。
それ単体で成り立つ。という意味を肥大化させない。
http://www.htmq.com/html5/article.shtml

#section
これも単純なhtmlバリデーションinfoがあった。（警告ではない）

> Section lacks heading. Consider using “h2”-“h6” elements to add identifying headings to all sections.

**セクションに見出しがありません。すべてのセクションに識別用の見出しを追加するには、「h2」 - 「h6」要素を使用することを検討してください。**(直訳)

section > h2など、見出しタグが必要だと思う。
これはエラーではないので必須ではないが、見出しがないものはそもそもsectionで囲む必要は無い。


#要素の入れ子

以上を踏まえてざっと整理すると
- main > article > section > h2その他
- main > section > article > section > h2その他
- main > section > h2その他 + article > 以下略

みたいな形が間違いではないと思う。

#まとめ
これが正しいというのは、htmlの方針が変わったり、googleの検索基準が変わったりするから、定義しずらいと思う。
（これが正しい組み方！っていう本はあまりみたことがない。）

なので、**間違った**組み方だけしなければなんでもええねん！
ul > li を ul > div > li とかにしなければ大丈夫！
みたいな感覚。

なので、この記事もあくまで参考程度で。
悩んでたら解消のきっかけになれば幸いです。
Ubuntu 16.04 で zsh を使うまでのメモ

# はじめに
まあbashでもいいけど，zshのほうが何かと見栄えもいいし，なんかいいじゃないですか
gitのブランチとかも見れるし

環境
- Ubuntu 16.04
- なんか特殊(自分の所属独特の環境です......が誰かの役に立てば．)

ログインシェルもzshに変更するのに微妙に手間取ったので，その際のメモを残します．
**ちょっと特殊な環境向けなので `/etc/passwd` を編集するのが怖い人はその部分を適宜読み替えてください．
やらかすと[こう](https://qiita.com/SeeLog/items/cd5d47db6d6e4063178d)なります．気をつけて．**

# 手順
## 1. インストール
入ってたらしなくていいです
`% sudo apt install zsh`

## 2. 確認
`% zsh`
これでzshが起動したらOK
`% which zsh`
これで
`/usr/bin/zsh`
みたいなのが出てきたらOK

## 3. ログインシェルの変更
うちの環境では以下はダメでした
`% chsh`
`/etc/passwd` にお前はいないぞと言われます．

というわけで`/etc/passwd`に追記しましょう．
自分の環境では`useradd`などがうまく機能しないため，`/etc/passwd`を直接編集するという危険な行為を行いました．
くれぐれもバックアップを忘れずに...... $\tiny{バックアップしても無駄かも}$

以下のコマンドで追記できます．**(`-a`を忘れると地獄を見ます！！！)**
zsh実行してる端末でやらないとエラー出るかも．

`% echo "${USER}:x:${UID}:${GID}:${USER}:${HOME}:$(which zsh)" | sudo tee -a /etc/passwd`

怖い人は`sudo nano /etc/passwd`などで**最終行**に追記しましょう．
(useradd，usermodが何故かうまく使えない環境で他に危険じゃない方法を知っている方がいたら教えて欲しいです)

あとは再起動(というかログアウト)すればログイン時に自動でzshでログインできているはずです．

## 4. zshの設定とか
bashでは`.bashrc`を編集することでエイリアスなどを設定しますが，zshでは`.zshrc`を編集して行います．

ところで`.zshrc`は有志の方が作成してくれた素晴らしい設定が既にあります．

[少し凝った zshrc](https://gist.github.com/mollifier/4979906)

これを使うことで現在のディレクトリや環境，gitのブランチもよくわかるようになります．
またディレクトリとコマンドを2行に分けて表示するため，`pwd`コマンドを二度と使わなくてよくなります．
こんな感じです．(見せられない部分が多くてすみません)
![Screenshot from 2019-04-01 19-35-38.png](https://qiita-image-store.s3.amazonaws.com/0/284136/8e07fb32-c931-3fce-d483-167b3610bd10.png)
`py36`が環境名，`@`以外消されてるところが`[ユーザ名@マシン名]`，
`/git/`以外が隠されているところが現在のディレクトリ，`(git)-[master]`って書いてあるところがブランチです．

少し凝った zshrcをお借りして，適当なテキストエディタで`.zshrc`に貼り付けておきましょう．
`.bashrc`から移行したい設定がある人はそれも追記しておきましょう．**(とくにAnacondaとか入れてる人)**

編集したあとは `source ~/.zshrc`とかすればリロードされそうです．
うまくいかなければ再起動．

## 終わりに
便利ですよね．

**くれぐれも`/etc/passwd`やらかしちゃダメだからな！絶対だぞ！**
[こうなるぞ](https://qiita.com/SeeLog/items/cd5d47db6d6e4063178d)

## 参考
- [Ubuntuのシェルをzshに変更する - Qiita](https://qiita.com/sayama0402/items/ac9e078b024c3287f99f)
- [ログインシェルの変更 - konafx’s diary](http://konafx.hatenablog.com/entry/2018/01/23/093335)
GASを使ってスプレッドシートからGoogleカレンダーにスケジュール登録する

##概要
GoogleAppsScriptを使用するとExcelのマクロのように自動処理を設定できます。
今回はGoogleAppsScriptを利用してスプレッドシートの予定一覧から自動でGoogleカレンダーにスケジュール登録を行う方法を記載します。

##スケジュール登録用のコードの全体像
#####■設定
今回は例としてサッカーの試合日程をスプレッドシートで一覧作成し、それをGoogleカレンダーへスケジュール登録するという設定でコードを作成します。


まず、日程一覧表を下図のような感じで作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/360050/4adbb144-0313-32f6-9eb4-d9bf65be81c7.png)


上記で作成した日程表に合わせて、以下のようにコードを書きます。

#####■サンプルコード
```js:code.gs
//■スケジュールのカレンダー登録
function CreateSchedule() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var slist = ss.getSheetByName('柏レイソル試合日程');
  var lastrow = slist.getLastRow();
  
  //予定の一覧部分・カレンダー名・カレンダーIDを取得
  var contents = slist.getRange(4, 1, lastrow, 6).getValues();
  var cnlist = '柏レイソル試合日程';
  var cidlist = 'ここにGoogleカレンダーIDを指定';
  
  //順に予定を作成
  for (i = 0; i <= lastrow - 4; i++) {
    
    //登録フラグが「〇」になっていたら登録しない
    if (contents[i][3] == '〇') {
      continue;
    }

    //必須項目が入力されていない場合、スキップ
    if (contents[i][1] == '') {
      continue;
    }
    if (contents[i][2] == '') {
      continue;
    }
    if (contents[i][4] == '') {
      continue;
    }
    if (contents[i][5] == '') {
      continue;
    }
    
    //選択されたカレンダーのIDを取得
    var calendar = cidlist;
    
    //予定のコンテンツを取得
    var title = contents[i][4];
    var startTime = contents[i][1];
    var endTime = contents[i][2];
    var location = contents[i][5];

    //予定を作成
    CalendarApp.getCalendarById(calendar).createEvent(
      title,
      startTime,
      endTime,
      {
        location: location
      }
    );

    //予定が作成されたら登録フラグを「〇」にする
    slist.getRange(i + 4, 4).setValue('〇');
  }
}

```

##中身の解説
まず、以下でスプレッドシートの中のどのシートか、一覧がシートの中のどの部分なのか、登録先のカレンダーは何なのかを設定します。

```js:code.gs
  //開いているスプレッドシートの中のどのシートなのか、どの行までなのかを指定
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var slist = ss.getSheetByName('柏レイソル試合日程');
  var lastrow = slist.getLastRow();
  
  //予定の一覧部分・カレンダー名・カレンダーIDを取得
  var contents = slist.getRange(4, 1, lastrow, 6).getValues();
  var cnlist = 'テスト用';
  var cidlist = 'ここにGoogleカレンダーIDを指定';
```


必要情報の設定が完了したら、繰り返し文で登録する予定を作成していきます。
登録フラグや必須項目については必要に応じて作成していただければと思います。


最後に以下の通り、タイトル、開始日時/終了日時、場所を指定を定義し、`.createEvent`の中に指定することでスケジュール情報をGoogleカレンダーに登録します。

```js:code.gs
    //選択されたカレンダーのIDを取得
    var calendar = cidlist;
    
    //予定のコンテンツを取得
    var title = contents[i][4];
    var startTime = contents[i][1];
    var endTime = contents[i][2];
    var location = contents[i][5];

    //予定を作成
    CalendarApp.getCalendarById(calendar).createEvent(
      title,
      startTime,
      endTime,
      {
        location: location
      }
    );
```


コードを実行することで下図にように指定したカレンダーに予定を登録することができました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/360050/f8345746-2c51-b725-b8ce-89a29b73f130.png)

大量の予定を登録する際に、一つ一つ手で登録していくのは面倒だと思いますので、ぜひGASでコードを組んでスケジュール登録してみてはいかがでしょうか。
Rundeck の Cluster 構成

## 概要
1年以上、1台構成で動かしてきた Rundeck の調子が悪く？、ジョブ起動中にプロセスが落ちるようになったのがきっかけで、その辺の仮想サーバに Rundeck を構築し、冗長化した話。

## やったこと
- Rundeck のパラメータ (rundeck-config.properties) への設定追加

## 詳細説明
[公式ドキュメント](https://docs.rundeck.com/docs/administration/configuration/storage-facility.html) に書いてあるけど、以下の設定を追記する。

```:/etc/rundeck/rundeck-config.properties
# ①クラスターモードの有効化
rundeck.clusterMode.enabled = true

# ②キーストレージを DB に移行(デフォルトはローカルストレージ)
rundeck.storage.provider.1.type=db
rundeck.storage.provider.1.path=/

# ③プロジェクトストレージを DB に移行(デフォルトはローカルストレージ)
rundeck.projectsStorageType=db
rundeck.config.storage.provider.1.type=db
rundeck.config.storage.provider.1.path=projects
```

設定後は、Rundeck の再起動。以上。

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/
RSpecのテスト方法

##今回の目的
RSpecのテストのやり方をまとめる

##テスト方法
###specファイルの作成
specファイルは「対応するクラス名_spec.rb」という命名規則がある。
Productクラスの場合は「product_spec.rb」となる。
ファイルの配置場所は「spec/models」となります。無い場合は作成する。

###テストコードの記述方法
```ruby:sample_spec.rb
describe "test" do
  it "2 * 2は4になること" do
    expect(2 * 2).to eq 4
  end
end
```

###各コードの説明
####describe
直後のdo ~ 最後のendまでをひとつのグループして、テストのまとまりを作ります。
describeの後に続く""の中にはそのグループの説明を記載。

####it do ~ end
exampleと呼ばれる。確認したいひとつのテストを記載し、ひとつのグループとする。
describe内にいくつも記載することが可能です。itの後に続く""の中に説明を書く。

####expect(2 * 2).to eq 4
エクスペクテーション。確認したいテストの式のこと。
また「eq」の部分をマッチャという。「eq」の意味は「等しければ」。
なので、今回のエクスペクテーションは「2*2が4と等しければ」となる。

####マッチャ
eqの他にもinclude(含んでいれば)、valid(バリデーションされれば)など。

とりあえず一通りの流れの確認のため、まとめてみた。
Windows標準コマンドでHashを取得するバッチ！


#はじめに
WindowsでたくさんのファイルのHashを取得する際に、
いちいちコマンド打つのは面倒くさいため、いい感じのバッチファイルにしました。
~~それに出力形式がとてもイケていないから~~

#バッチファイル(説明)
例ではSHA256を求めていますが、下記ハッシュ値に対応しているため、
(MD2／MD4／MD5／SHA1／SHA256／SHA384／SHA512)
他のアルゴリズムのHashを求めたい場合は、
定義部分のset HashMethod=SHA256をset HashMethod=MD5等に変更して使用してください。

#使用方法
下記をoutputHash.batとして作成し、
Hashを取得したいファイルをドラッグ＆ドロップすると、
バッチファイルと同じ階層にHashのテキストが出力されます。


```outputHash.bat
@echo off

:: 使用方法
if "%~1" == "" (
echo Hashを求めたいファイルをドラッグ＆ドロップしてください
pause
)

:: 定義
setlocal
set CmdName=CertUtil
set HashMethod=SHA256
set OutputPath=%~dp0\outputHash.txt

for %%a in (%*) do for %%f in (%%a) do call :PrintFileHash "%%~f"
exit /b 0
:PrintFileHash
set Hash=
for /f "usebackq delims=" %%h in (`%CmdName% -hashfile "%~1" %HashMethod% ^| find /v "%HashMethod%" ^| find /v "%CmdName%:"`) do set Hash=%%h
:: ファイルサイズが0だとエラーになるので例外処理
if "%Hash%" == "" if "%~z1" == "0" (
set Hash="ファイルサイズが0です"
) else (
exit /b 0
)

:: 間のスペースを削除
set Hash=%Hash: =%

:: OutputPath(.batファイルと同じ階層)に出力
:: 1ファイル毎に改行
echo ■%~n1%~x1(%HashMethod%)>> "%OutputPath%"
echo %Hash%>> "%OutputPath%"
echo;>> "%OutputPath%"
```

# おわりに
Gitの[リポジトリ](https://github.com/tsumita2929/getHashForWindows/tree/master)を公開しておきますので、こうした方が良い！
などありましたらプルリクエストいただけると嬉しいです！
統計用語の英単語帳

統計の入門レベルの項目を復習するためのノート

# 度数:frequency 
・観測値の数

# 代表値:averages
## 平均:mean
## 算術平均:arithmetic mean
・いわゆる平均

```math
\bar x = \frac{1}{n} \sum x_i
``` 

## 幾何平均:geometric mean
・上昇率の平均など

```.math
x_G=\sqrt[n] \prod x_i
```

## 調和平均:harmonic mean
・速度の平均など
$$\frac{1}{x_H}=\frac{1}{n}\sum\frac{1}{x_i}$$

# 中央値:median
# 四分位: quantile
・ソートした後の下からの順位で何%の位置か
第2四分位点 $Q_2$ 50%tile = median
第1四分位点 $Q_2$ 25%分位点
第3四分位点 $Q_2$ 75%分位点

# 最頻値: mode

右に歪んだ分布(=右裾の長い分布)は一般的に
$$Mean \geq Median \geq Mode$$
一般的に異常値に大きく左右されないという点でMedianが代表値として使われることが多い


# 平均偏差
$\bar x$:平均

```.math
d=\frac{1}{n} \sum |x_i - \bar x|
```

# 分散

```.math
S^2=\frac{1}{n}\sum_{i=1}^{n}(x_i - \bar x)^2
```


# 標準偏差

```.math
S=\sqrt{S^2}=\sqrt{\frac{\sum(x_i-\bar x)^2}{n}}
```

# 2次元のデータ
2次元データの直線への当てはまりの良さを調べる
## 相関係数 correlation coefficient
ピアソンの積率相関係数

```.math
r_{xy}=\frac{\sum(x_i-\bar x)(y_i - \bar y)}{\sqrt{\sum(x_i-\bar x)^2}\sqrt{\sum(y_i-\bar y)^2}}
```

$rx_{xy}=1$ :正の完全相関 $y=bx+a(b>0)$
$rx_{xy}=-1$ :負の完全相関 $y=-bx+a(b<0)$



## 最小二乗法 method of least squares
xがyを左右ないし決定するとき
xを独立変数、説明変数
yを従属変数、非説明変数
という

最小二乗法は
二乗和
```.math
L=\sum \{y_i-(bx_i+a)\}^2
```
Lを最小にするa,bを求める

得られた方程式をyのx上への回帰方程式 regression equation
bは回帰直線の傾きで回帰係数 regression coefficient

## 決定係数 coefficient of determination
```.math
b=r_{xy}\frac{S_y}{S_x}
```
が成立する

$r^2$が1に近いほど(rが+-1に近いほど)直線関係が強い

$r^2$を決定係数と呼ぶ

# 確率
## 確率の公理主義的定義 axiomatic definition

- すべての事象Aに対して$0 \leq P(A) \leq 1$
- $P(\Omega)=1$
- たがいに背反な事象$A_1,A_2,\cdots$に対して
    $$P(A_1 \cup A_2 \cup \cdots) = P(A_1)+P(A_2)+ \cdots $$

*つまり確率とはある種の測度と言える
## 条件付き確率 conditional probability
Bを条件とするAの条件付き確率

```.math
P(A|B)=\frac{P(A \cap B)}{P(B)}
```
AとBが同時に起こる確率のうちBがすでに起きている

## 独立性 independent

Aの起きる確率P(A)がBの起きた如何によらない
$$P(A)=P(A|B)$$
とき独立であるという

## ベイズの定理

$$P(H_i|A)=\frac{P(H_i)\cdot P(A|H_i)}{\sum P(H_j)\cdot P(A|H_j)}$$


$$P(A)=\sum P(H_j)\cdot P(A|H_j)$$

$P(H_i)はH_i$の事前確率 prior probability $P(H_i|A)はH_i$の事後確率 posterior probability
事前事後はAが起こる事象を基準にしている


# 確率変数
ある確率分布で取りうる値の変数を確率変数 random variableと呼ぶ
連続型の確率変数
$$P(a \leq X \leq b)=\int_{a}^{b}f(x)dx$$

## 確率密度関数 probability density function
$$
\forall x,f(x) \geq0 \land \int_{-\infty}^{\infty}f(x)dt=1
$$
f(x)をXの確率密度関数

# 確率分布
## 指数分布 exponential distribution
$$f(x)= \lambda e^{-\lambda x} (x \geq0), 0 (x<0)$$

## 歪度 skewness
3乗
正ならば右裾が長く、負なら左裾が長い

## 尖度 kurtosis
4乗
正規分布の$\alpha_4=3$と比較して
$\alpha_4-3$が正なら尖って、負なら丸く鈍い形をしている

# 離散型の確率分布
## 超幾何分布
## 二項分布
## ベルヌーイ分布
## ポアソン分布
## 幾何分布
## 負の二項分布
## 離散一様分布

# 連続型の確率分布
## 正規分布
3シグマ範囲: 997/1000が含まれる(3/1000)

## 指数分布
待ち時間分布
故障率が一定の機器の故障までの時間

## ガンマ分布
## ベータ分布
## 一様分布
## コーシー分布
## 対数正規分布
## パレート分布
## ワイブル分布



# 大数の法則 low of large numbers
多くの標本を取れば母集団の平均に近づいていく
多くのサンプルをとるべき根拠

# 中心極限定理 central limit theorem
$S_n=X_1+X_2+\cdots + X_n$
母集団がどんな分布であれ標本数が多くけば正規分布に近づいていく
大数の法則は平均だけを規定するが、分布の様子までわかるので大数の法則よりも強い定理

## χ分布
$Z_1,Z_2,\cdots Z_k$が独立な正規分布N(0,1)に従うとき
$$\chi^2(k)=Z_1^2+Z_2^2+\cdots + Z_n^2$$
を自由度kのχ二乗分布という

## t分布

# 推定
# 仮説検定
# 回帰分析

# 参考
復習に使ったテキストがとても良かった
・わかりやすく読みやすい
・単語に英訳がついてる
・図表とサンプルが多い
ひととおり内容を押さえるために一読をオススメ

統計学入門 (基礎統計学Ⅰ)   東京大学教養学部統計学教室 https://www.amazon.co.jp/dp/4130420658/ref=cm_sw_r_tw_dp_U_x_dxEOCb0V8NTC3
クロスサイトリクエストフォージェリ（リクエスト強要）を理解する

# クロスサイトリクエストフォージェリ（CSRF）とは

フォージェリ（forgery）は「偽造」を意味します。
クロスサイトリクエストフォージェリ（以下、CSRF）とは、攻撃者が標的のブラウザに、別のサイト（クロスサイト）への偽造したリクエストを強制的に送信させることです。リクエスト強要とも呼ばれます。

事例としては、2012年に横浜市のサイトの掲示板に小学校への殺人予告が書き込まれた事件があったのですが、これは犯人が無関係の他人のブラウザに殺人予告の投稿リクエストを強要させたものでした。このリクエスト強要の被害に遭ったパソコンの持ち主は誤認逮捕されてしまいました。

# CSRF攻撃の具体例
注）理解しやすくする狙いで、攻撃者をあなたとしています。

私があるショッピングサイトにログインしているとします。商品を購入する時、私のブラウザからショッピングサイトに以下のリクエストが送信されるものとします。
https://shop.jp/purchase?address={配送先住所}&item_id={商品ID}

この仕様を知っていたあなたは、以下のスクリプトを埋め込んだサイトを作って私を誘導しました。fetch()は、ブラウザにHTTPリクエストの送信を命令するメソッドです。

```
<script>
fetch('https://shop.jp/purchase?address={あなたの住所}&item_id=1')
</script>
```

私がそのサイトにアクセスすると、私のブラウザでただちに上記のスクリプトが実行されることになり、shop.jpへのリクエストが送信されます。
この時たまたま私がショッピングサイトにログインしていれば、ショッピングサイトは私本人からの商品購入のリクエストと解釈して、購入処理を実行してしまうでしょう。
結果、商品はあなたの住所に配送され、私は代金だけが引き落とされてしまいました。

# CSRF脆弱性とは

この時、shop.jpは、ブラウザからのリクエストを十分検証せずに本人の意思によるリクエストと見なしてしまったため、CSRF脆弱性があると言えます。

例えば、検証の手段が、Cookieだけで認証トークンやセッションIDを管理しているケースです。
shop.jpから受け取ったCookieは、shop.jpにリクエストするたびに、たとえそれが強要されたリクエストであっても自動で送信されてしまいます。したがってサーバは、受け取ったリクエストが強要されたものなのか本人の意思によるものなのかを区別することができません。

# サイト管理者による対策例

サーバが受け取ったリクエストが、強要されたものではなく本人の操作によるものであることを検証できる仕組みが必要です。

## 検証に認証トークンを使う場合

認証トークンを、自動送信されるCookieとは別の方法でリクエストに付与する必要があります。
あなたのサイトのスクリプトが私のブラウザにリクエストを強要させても、認証トークンを予測したりブラウザから取得したりできない限りリクエストを再現することはできません。

formでのリクエストであれば、サーバでHTMLを生成する時にトークンをformのhidden値にセットする方法があります。これはRuby on Railsなど多くのWebアプリケーションフレームワークに実装されています。

```
<form action="/purchase" method="post">
  <input type="hidden" name="CSRFToken" value="1qazxsw23edcvfr4">
  …
</form>
```


また、ブラウザのWeb Storageに認証トークンを保存しておき、リクエスト時にそれを付与する方法もあります。
Web Storageは同一生成元ポリシーに従いサイトの生成元別のストレージで管理されているため、あなたのサイトから読み込まれたスクリプトが、shop.jpのWeb Storageに保存されているトークンを読み込むことはできません。Cookieと違い自動送信されることもありません。

上記のどちらの手段においても、サーバはリクエストに付与されたトークンを、予めセッションに保存しておいたトークンを照合して本人確認を行います。


あるいは、認証トークンをCookieに保存し、かつリクエストにも付与するという方法もあります。
サーバはリクエストを受け取った時に、自動送信されてきたCookieの認証トークンと、リクエストに付与された認証トークンが一致しているかを検証します。
これはCookieの二重送信と呼ばれる方法で、サーバは認証トークンを保存しておく必要がありません。


## 認証トークンを使わない検証方法

HTTPヘッダーのOriginをチェックする方法があります。あなたのサイトのスクリプトによって強要されたリクエストであれば、OriginヘッダーにはあなたのサイトのURLがセットされています。
サーバはこのOriginヘッダーを見て、リクエストの生成元が信頼できなければ処理しないといった対応ができます。

また、重要な処理の前にはパスワードの再入力を求めたり、「画像に表示されている文字を入力してください」「私はロボットではありません」のような人間が操作せざるを得ない手続きを踏ませたりする方法もあります。

# 参考
[クロスサイトリクエストフォージェリ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%AA)
[クロスサイトリクエストフォージェリ (CSRF) の防止策に関するチートシート - OWASP](https://jpcertcc.github.io/OWASPdocuments/CheatSheets/Cross-SiteRequestForgeryPrevention.html#Using_a_Secret_Cookie)
半歩ずつ進める機械学習～scikit-learnボストン住宅価格編～③

##前回まで

[前回の記事][1]でひとまずデータセットから重回帰モデルを作りました。

モデルの精度や、詳しい分析を無視すれば
以下のように数行で重回帰モデルを作る事が出来ました。

```python3:boston.py
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression

env_data = pd.DataFrame(boston.data,columns = boston.feature_names)#説明変数のロード
price_data = boston.target#目的変数のロード

lr = LinearRegression()
lr.fit(env_data,price_data)#説明変数と目的変数からモデル作成

#実際に予測を行いたい場合は
#lr.predict("説明変数")で計算可能
```

ただ、このモデルを実際に使おうと思うなら、予測精度の問題が出てきます。
いきなり**「高精度なモデルを作るんだ！」**なんてモチベーションはありませんが
とりあえず現状のモデルが使い物になるのか見ていきます。

##モデルの精度を確かめる
まず、前回は全ての`env_data`を使ってモデルを作りました
今回は以下の様にデータを5分割して、4個分で学習し1個分で精度を確認
これを5回繰り返し、予測精度を確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/316551/a35dd906-e96d-0ce9-fddd-d16960ffd377.png)
ボストン住宅価格のデータ数は506件だったので、400件を学習に使い、100件で精度検証をする事になります。
**交差検証（Cross-Validation)**っていう方法みたいです。

##実際にやってみる
今回は`cross_val_score`という関数を使います。
モデルの評価を行う際には、他にも`cross_validate`という関数もありますが
今回は`cross_val_score`を使用します。

```python3:boston.py
from sklearn.model_selection import cross_val_score

lr = LinearRegression()
print(cross_val_score(lr,env_data,price_data,cv = 5)
#[ 0.63861069  0.71334432  0.58645134  0.07842495 -0.26312455]

```
使い方は非常に簡単で、予測モデルのインスタンスを作って
目的変数と説明変数とセットで関数に渡してやるだけです。
ちなみに引数の`cv = 5`は分割数の指定で、5分割を設定しているという意味になります
その他の引数等、詳しいリファレンスは[こちら][2]

##この数値はいいの？悪いの？
とりあえず`#[ 0.63861069  0.71334432  0.58645134  0.07842495 -0.26312455]`という値が取れました
この数値は**決定係数**という物で、`R^2`と表記されたりします。
この決定係数についてなんですが、複数の定義があるようで
`cross_valid_score`で返ってくるのは以下の定義の物だと思われます（違ってたらｽｲﾏｾﾝ･･･

```math
y_i = i番目の物件価格\\
\hat{y_i} = i番目の予測価格\\
\bar{y} = 物件平均価格\\
\Large R^2 = 1 - {\frac{\sum_{i=1}^{n}(y_i - \hat{y_i})^2} { \sum_{i=1}^{n}(y_i - \bar{y})^2}}
```

数式はややこしいかもしれませんが、例え話をすれば

あなたはボストンに物件を持っているとします、しかし評価額が分かりません。
物件の部屋数や地域の犯罪率等のデータを持って不動産鑑定士にいくらになるか相談しました。
**鑑定士「よく分かりませんが、ボストンの物件平均価格は1億円なんで、そんなもんじゃないですか」**
こいつが**決定係数＝0**の状態です、説明変数も何も関係なく目的変数の平均を返してくるだけのモデルです。
決定係数は1に近ければ近い程良いモデルで、マイナスになるとこのポンコツ鑑定士以下の存在になります。

決定係数がいくら以上あれば**使い物になる！**という基準は、使用者が決める事ですが
0.5程度あれば使い物になるという記述を見たことがあります。

その基準で行けば5回の交差検証の内、前半3回は概ねOKですが
後半2回は非常に精度の悪い結果となっている、と言えるかと思います
##次回へ
次回は何故、交差検証の結果、後半2回の精度が著しく悪いのか
それを実際のデータを見ながら考えていきたいと思います。

##お願い
機械学習初心者が勉強がてらの備忘録として投稿しています。
間違っている点等、お気づきの事がありましたらご指摘頂けますと誠に幸いです。





[1]:https://qiita.com/Mukomiz/items/ee49a37ee8e451599c8f
[2]:https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html
自分用メモ：もしも「労働条件通知書を電子メールで送りたい」と言われたら

## はじめに
2019年4月より、労働条件通知書が電子メール等で交付可能となります。（なりました）

　***参考（[厚生労働省令第百十二号](https://www.mhlw.go.jp/content/000350655.pdf)）***

労働条件通知書の内容については割愛して、電子メールでの交付に当たり気をつけることを記載していきます。
LINEやFacebook等のSNSでの交付も可能となりますが、今回は特に触れません。

内容に不足/賛否があるとは思いますが少しでも誰かの助けになれば幸いです。

## 電子メールを選択する上での注意点
### 条文に違反していないか
　条文ではファクシミリか電気通信いずれかの方法によることを***希望した場合のみ***その方法を用いた交付が可能と記述されている。つまり、***事業者が一方的に電子メールでの交付を決めてはならない***ということ。
「労働者が希望した」もしくは「希望していない」ことを後から確認できるようにしておき、条文に違反していないことを証明できるようにしておきたい。
ちなみに、***労働条件通知書の保存期間は労働基準法第109条***と***労働基準法施行規則第56条***より「雇入れ又は退職に関する書類については、労働者の退職又は死亡の日 」から***最短で3年***。希望の賛否も同様に保存しておきたい。

### 電子メールが到達しない場合の交付書の発行ルートを準備する
電子メールは***ISPのスパムフィルター***、***DNSBLのブラックリスト判定***、***受信者の設定したスパムフィルター***を通過しながら送信される。しかし、これらのどこかに引っかかってしまうと受信者にメールが到達しなくなる。これは事業者と開発者の努力によって軽減が可能だが、すべてのメールを到達させることはほぼ不可能。

そのため、***電子メールが届かなかった労働者を考慮し、その人に対しては電子メール以外で交付を行う***。
Webビーコンなどでメールの開封率を監視すれば受信した労働者の判別が可能。
一定期間内に開封されなかったメールの受信者にアナウンスを行い、それでも受信できていないようであれば電子メール以外の方法で交付する。

### 信頼度（レピュテーション）を保つメール送信を行う
メールにはレピュテーションと呼ばれる***送信元の信頼度***を表す指標がある。
　***IPレピュテーション*** …　送信元IPアドレスに対する信頼度
　***ドメインレピュテーション*** …　送信元ドメインに対する信頼度

***レピュテーションが高いとメールは到達しやすく***なり、***低いとメールが迷惑メール扱いされ到達しにくく***なる。
先述したスパムフィルターとブラックリスト判定はレピュテーションを用いている。

***レピュテーションを下げることの例***
1. スパムトラップや存在しないメールアドレスにメールを送信する。
2. 送信したメールが迷惑メールとして報告される。
3. DNSBLにIPアドレス、ドメインが登録される。
4. etc...
***逆に、レピュテーションを下げずに多くのメール送信に成功することができればレピュテーションを高めることができる。***


前日の送信数0件、その翌日送信数1万件といった極端な送信を行うとスパムメール扱いされるため、
一日に何千通も送信する大企業の場合はIPアドレスとドメインのWarmupを行う。
（IP/Domain Warmupなどと呼ばれる）


# あとがき
以上です。
SNSが広まったことによりメールは衰退しつつありますが、ビジネスではまだまだ使用箇所が多い印象です。メールについてもっと詳しく知りたいという方は、メール配信サービスSendGridさんのブログを見るといいかもしれません。視覚的もわかりやすいのでおすすめ。
Rspec初期設定

## 今回の目的
Rspecでテストを行える状態にする。

## 手順
### Gemのインストール
```terminal:Gemfile
group :development, :test do
  gem 'rspec-rails'
end

group :development do
  gem 'web-console', '~> 2.0'
end
```
web_consoleはtest環境で動かすと不具合が起きる可能性があるとのことなので
development環境でのみ動くようにします。終わったら

```terminal:ターミナル
bundle install
```

###Rspecの設定
RSpec用の設定ファイルを作成

```terminal:ターミナル
rails g rspec:install
```
下記ファイルが作成される。

```terminal:ターミナル
create  .rspec
create  spec
create  spec/spec_helper.rb
create  spec/rails_helper.rb
```

作成された「.rspec」に下記を記載

```rspec:.rspec
--format documentation
```
設定としては以上。

###確認
```terminal:ターミナル
bundle exec rspec
```
上記コマンド実行後、下記のような結果になれば設定完了です。

```terminal:ターミナル
No examples found.


Finished in 0.00031 seconds (files took 0.19956 seconds to load)
0 examples, 0 failures
```
Windows ServerでIISや.NETをインストールしようとしたときに「指定されたサーバーで機能を・・・失敗しました」と表示されたときの対象方

##環境
Windows 10（ホストOS）
VirtualBox 6.0
Windows Server 2016（ゲストOS）

##とある検証時に
とある検証のために、VirtualBoxでWindows Serverを構築していた際に起こったこと。

役割と機能の追加ウィザードからIISをインストールしようとした際に、
「指定されたサーバーで機能を追加または削除する要求に失敗しました。1つ以上の役割、役割サービス、または機能をインストールできませんでした。パラメータが間違っています。エラー：0x80070057」
と、表示されインストールが出来ませんでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/293484/f6926a50-f5ac-ac9e-d39e-d794943bca31.png)

頭を抱えながら上記のエラーについて調査し.....

...しばらく調査し、解決方法を発見しました！

##解決方法
ここでは　VirtualBox 6.0の環境の解決方法になります。

まず、VirtualBoxを開き（ゲストOSは立ち上げたままでも大丈夫です。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/293484/778a509c-216a-7663-e3c9-887248cbfdf8.png)
現在立ち上げているゲストOSの［SATA ポート 1］を押し、インストール時に使用したWindows ServerのISOをマウントしてください。
該当のISOにチェックが付いたら、立ち上げているWindows Serverに戻ります。

エクスプローラーを立ち上げ、ISOファイルが正常にマウントされているか確認してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/293484/d0fa483a-f56c-ef73-f920-91376bc41efb.png)

お使いの環境によって、マウント先が異なりますのでご注意ください。
（私の場合は D: にマウントされてます。）

その後、「役割と機能の追加ウィザード」へ戻ります。

［サーバーの役割］と［機能］から任意のサービスを選択後、［確認］にて、『代替ソースパスの指定』を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/293484/b204a6ea-ddee-6338-63b0-3763102ca006.png)

［パス］の入力欄に《（ISOのマウント先）:￥sources￥sxs》と入力して、《OK》を押します。
（私の場合は D:￥sources￥sxs）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/293484/2dceac4f-b687-4077-cedb-a6fd7b645d42.png)

その後、《インストール》を押すことでインストールが完了するかと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/293484/61be6d9a-da71-6eb5-b3dc-72f39e74f8c0.png)

ご指摘箇所がある場合は言っていただければ幸いでございます！
一人でも多くの方が同じお悩みが解決できるように(';')
令和の「令」の字がUNICODEに2つ収録されている件

UNICODEは複雑怪奇です。

新元号「令和」の「令」の字が U+4EE4 と U+F9A8 に収録されています。

なんでですかーーーー？


#予想

「令」の字は活字と手書きで字体が異なることで有名です。

手書きだと下の部分を「マ」みたいに書くと思います。

<img width="74" alt="令.png" src="https://qiita-image-store.s3.amazonaws.com/0/104360/9cb4702a-f8ed-e237-2d1d-9581e00b1f2c.png">


この手書きバージョンを後から収録したのかなと。

しかし、それは **異体字セレクタ** の方で解決しています。

じゃあ U+F9A8 は何なんだ？


#答え

U+F900 から U+FA0B までは韓国語の都合で収録されたものです。

元々、中国での漢字は字と読みが1対1で対応しているものです。

日本で音読みが2種類以上あるのは、漢字が入ってきたときの聞き取りに揺れがあって、様々な音読みが当てられてしまったからです。

一方、韓国では、基本的には字と読みが1対1なんですが、字によっては複数の読みがある場合があります。
で、韓国国内ではそれらに別の文字コードを割り当てたいという要望があるみたいです。
ただ、今の韓国語は漢字をほぼ使わずハングル（日本語で言うところのひらがなに相当するもの）だけにしているので、別にどうでもいいという立場だったものの、ユニコードコンソーシアムが忖度(?)して収録しちゃったみたいです。

日本語を扱うシステムで、この地雷を踏んでしまうことはほとんど無さそうです。
同様の地雷は268文字あって、金・女・裸・溺など、ポピュラーな漢字が含まれているので、いままで問題なければ、これからも問題ないかなという印象です。

#まとめ
多様な文化を積極的に受け入れて平和な世界にしていきましょう！

#参考文献
[CJK互換漢字](https://ja.wikipedia.org/wiki/CJK%E4%BA%92%E6%8F%9B%E6%BC%A2%E5%AD%97) - Wikipedia
[u4ee4（令）](https://glyphwiki.org/wiki/u4ee4) - グリフウィキ
LambdaをAPI Gatewayから非同期で呼出してみた

Lambdaは同一リージョン内での同時実行数が「1,000」で、
同期呼出の場合呼び出し時にMAXを超えた以降の処理はエラーになっちゃうんですよね。
SQS使って管理しろって言われるかもしれませんが、
できるだけ使用するサービス数は押さえてシンプルにさっぱり頂きたい。
というわけでなんとか楽をしたくて調べてみたところ、Lambdaを非同期で呼出せば同時実行数の上限から溢れたリクエストを再試行してくれると公式のドキュメントにありました。

[同時実行数の管理](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/concurrent-executions.html)
非同期でLambdaを呼出せば、イベントを最大6時間自動的に再試行すると書かれています。
というわけで今回はAPI GatewayをからLambdaを非同期で呼出してみることにしました。

[API Gateway で AWS Lambda 関数の REST API を作成する](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/integrating-api-with-aws-services-lambda.html)
はい。こっちも公式ドキュメントにしっかりとやり方が書いていますね。
基本的に心を無にして↑に書かれている手順を辿ると非同期実行することができましたが、
ちょっとだけ難しいというか言葉足らずな書き方をしている箇所があったので、
今回はそこをポイントとして記載します。

####ARNについて
LambdaとロールのARNをAPI Gatewayの「統合リクエスト」へ登録しますが、
LambdaのARNについては追記する内容があります。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/390179/6f990cf6-f046-baad-79de-c201d76fd0c9.png)
上記の画像の黒塗り部分はARNそのものです。
見て頂ければわかると思いますが、LambdaのARNの前後には「/2015-03-31/functions/」と「invocations」を加える必要があります。
ロールについてはARNをそのままコピー＆ペーストで大丈夫です。

####HTTPヘッダーについて
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/390179/39848dd0-3653-c0ac-fc98-dc55090d397e.png)
API Gatewayの「統合リクエスト」→「HTTPヘッダー」へは上記の設定が必要です。
気を付けたいのは「マッピング元」の「'Event'」で、これは「'」も含めた形で記載する必要があります。

####その他
API Gatewayの「モデル」については「Input」のみ登録すれば大丈夫です。
「Output」と「Result」は公式ドキュメントの手順では使用されません。

先述しました通り、基本的には公式の手順通りに進めれば問題なく実装できます。
ネットで調べると色々と記事が出てきますが、まずは公式の手順で作ってみることをお勧めします。
【苦しんで覚える新元号】UTF-8の令和のデータ表現は2種類ある。

# 新元号"令和"の文字出力

### 1つ目

```c:令和
#include <stdio.h>

int main(void)
{	
	char reiwa[7];
	reiwa[0]=0xEF;
	reiwa[1]=0xA6;
	reiwa[2]=0xA8;
	reiwa[3]=0xE5;
	reiwa[4]=0x92;
	reiwa[5]=0x8C;
	reiwa[6]=0;
	
    printf("%s",reiwa);
	
	return 0;
}
```

```:出力
令和
```

### 2つ目

```c:令和
#include <stdio.h>

int main(void)
{	
	char reiwa[7];
	reiwa[0]=0xE4;
	reiwa[1]=0xBB;
	reiwa[2]=0xA4;
	reiwa[3]=0xE5;
	reiwa[4]=0x92;
	reiwa[5]=0x8C;
	reiwa[6]=0;
	
    printf("%s",reiwa);
	
	return 0;
}
```

```:出力
令和
```

対応が面倒になるかもしれないですね。
【PBCS】メンバのデータストレージ設定について

メンバには「データストレージ」の設定があります。
データベースのブロックサイズやデータベース関連ファイルのサイズも変わってくるので、
メンバのタイプに応じて、適切な設定をすることが必要です。
知っていること、調べたことを一挙にまとめていきます。

#前提知識
密次元（Dense）：データ・ブロック内のセル（データ）を構成する次元
　　　　　　　　　→Year（年）,Account（勘定科目）など
疎次元（Sparse）：データ・ブロックを構成する次元
　　　　　　　　　→Product（製品）など

#データストレージの種類
・保管
・動的計算
・動的計算および保管
・共有しない
・共有
・ラベルのみ

#保管
デフォルトの設定。
レベル0メンバ、疎次元メンバは基本データを持つので保管にすることが多い。
子が動的計算の場合は、親メンバーを保管に設定しないこと。
フォームを保存したりリフレッシュする際に親の新たな合計が計算されない。

#動的計算
メンバーのデータ値が計算され、値は保存されない。動的計算の親の子は100が上限。
メンバー式が定義されているメンバ、密次元の親メンバで使うことが多い。
積上処理をビジネスルールで実行する必要がなくなり、ブロックサイズも削減できる。
子を多く持つ疎次元メンバに使うとデータ取得のパフォーマンスが劣化するので注意。

#動的計算および保管
複雑な式を持つ疎ディメンションのメンバーの場合はこちらを使用する。
値を保持するためディスク容量は増えるが、場合によっては取得時間が削減できることもある。

#共有しない
親と子メンバが1対1のときの暗黙の共有をしないようにする設定。
#####暗黙の共有とは？
　Essbaseにより勝手に共有関係が設定される状態。
　たとえば、親メンバAに対して子メンバBしかいない場合、1:1になるので
　子メンバBの値は親メンバAに自動的に格納される。

#ラベルのみ
メンバのグルーピングをする際に使用する。仮想メンバのため、関連付けるデータはない。
レベル0のメンバーには割り当てできない。
通常のメンバーと比べブロックサイズが減少するので容量削減が可能。
　
#共有
　すでに存在しているメンバを共有する。
　例えば、一つの次元内で複数の分析軸を持つ場合に使用する。
　これを使うと、データを二重持ちすることなく共有メンバとして追加することができる。

例）Aという製品に対して「製品計」「広告費計」「販売費計」と軸を分ける場合

`●製品計`
   　　 `○ 製品A`
`●広告費計`
    　　`○製品A（共有）`
`●販売費計`
    　　`○製品A（共有）`
 
この場合なら、製品Aというメンバーは１つのみで良い