OmniAICreator/Qiita-1.07M huggingface dataset:
Ansible Tips: shellモジュールで長時間かかる処理を行う際に、随時途中経過ログを出力させる

# shellモジュールで途中経過を出力させる
terraformのapplyなど、長時間かかる処理を、Ansibleのshellモジュールで実行すると、Ansibleのログ表示が20分など長時間停止してしまい、エラーが出ていたとしてもその認識に不必要に時間がかかってしまったりする。
あまり美しくない実装でも構わないので、準リアルタイムで出力表示させたい。
試行錯誤の末、以下のようにすることで表示できている。

## 実装概要

処理をバックグラウンドで実行させ、実行ログはターゲットノード上のファイルに出力させる。
その上で、Ansible Playbookでは、一定時間おきに上のログファイルの内容をAnsibleのログとして出力。

## 途中経過表示サンプル

```yaml:tasks
  - set_fact:
      shell_log: "/tmp/shell.{{ lookup('pipe','date +%Y%m%d%H%M%S') }}.log"

  - name: terraform apply -auto-approve
    shell: |-
      {   
      set -ex 
      exec > {{shell_log}} 2>&1
      terraform init -no-color
      terraform apply -auto-approve -no-color || terraform apply -auto-approve -no-color
      echo __END__
      } & 
    poll: 0

  - pause:
      seconds: 1

  - shell: cat {{shell_log}}
    register: tail

  - loop: "{{ range(tail_times)|list }}"
    when: tail is not skipped and tail.stdout_lines|last != '__END__'
    shell: |
      sleep {{ tail_seconds }}
      cat {{shell_log}}
    register: tail
    vars:
      tail_times: 10
      tail_seconds: 5

  - file:
      path: "{{shell_log}}"
      state: absent
```

なお、以下を使う事でAnsible側にもログを残すことが可能。
https://qiita.com/hiroyuki_onodera/items/c36ba00da414d9df7e4e

＋

```ini:ansible.cfg
[defaults]
verbosity = 1 
stdout_callback = debug
```

この設定により、shellモジュールのみでログへの出力が可能となり、loop対象を1モジュールとできることからinclude_tasksなどで分離することも不要とできる。

https://qiita.com/hiroyuki_onodera/items/d5bcbf57dcd8189b0345


## 途中経過表示サンプル(旧)
30秒おきに実行中のログをansibleのdebugモジュールで表示

```yaml:tasks
  - set_fact:
      shell_log: "/tmp/shell.{{ lookup('pipe','date +%Y%m%d%H%M%S') }}.log"

  - name: terraform apply -auto-approve
    shell: |-
      {   
      set -ex 
      exec > {{shell_log}} 2>&1
      terraform init -no-color
      terraform apply -auto-approve -no-color || terraform apply -auto-approve -no-color
      echo __END__
      } & 
    poll: 0

  - pause:
      seconds: 1

  - shell: cat {{shell_log}}
    register: tail

  - include_tasks: tail.yml
    loop: "{{ range(tail_times)|list }}"
    vars:
      tail_times: 60    # この場合、最大 60 回 * 30 秒 = 30分間 監視し、次の処理に進む
      tail_seconds: 30

  - shell: cat {{shell_log}}
    register: tail

  - debug: { var: tail.stdout_lines }

  - file:
      path: "{{shell_log}}"
      state: absent
```



```yaml:tail.yml
---
- when: tail is not skipped and tail.stdout_lines|last != '__END__'
  block:

  - pause:
      seconds: "{{tail_seconds}}"

  - shell: cat {{shell_log}}
    register: tail

  - debug: { var: tail.stdout_lines }
```

最終行が \_\_END__ となると、以降はskipされる。

## サンプルの制約
- エラー処理は未実装
    - 時間切れ処理
    - スクリプト実行中にエラーとなった場合の処理 (トラップにて対応可能でしょう)
Windows Gitはデフォルトでcase-insensitiveだが、GitHub Actions [ubuntu-latest]はcase-sensitiveである罠

# Windows GitとGitHub Actions [ubuntu-latest]でcase-sensitiveかどうかが異なる
Gitは、Windows環境下ではデフォルトではファイル名の大文字・小文字を区別しない（case-insensitive）。一方、GitHub Actions、というよりUbuntu環境のデフォルトでは、ファイル名の大文字・小文字を区別する（case-sensitive）。
正確には、Gitは導入されたOSによってcase-sensitivityが変わるようである。Windows環境はデフォルトがcase-insensitiveなので、Git上でもcase-insensitiveになる。同様にGitHub Actionsは`runs-on`で環境を指定でき、それによって大文字・小文字を区別するかどうかが異なるが、人気があると思われる`ubuntu-latest`は区別する。
# 何が問題か？
例えば、WindowsマシンでTypeScriptを書いており、`moduleA.ts`というファイルでmoduleを定義し、同じディレクトリの`B.ts`というファイルで参照するとする。

```typescript:B.ts
import { *** } from './moduleA';
```

この内容でcommitし、GitHub Actionsを設定してビルドが成功しているとしよう。
ここで、`moduleA.ts`を`ModuleA.ts`に変えたいと思ったとする。

```typescript:B.ts
import { *** } from './ModuleA';
```

これをcommit・pushすると、Gitのデフォルトはcase-insensitiveなので、ファイル名が`moduleA.ts`のままになってしまう。一方、`B.ts`の中身はしっかり`ModuleA.ts`を参照するように変化する。
これでActionsを動かした場合、リポジトリには`ModuleA.ts`というファイルが存在していないので、B.tsのビルドに失敗する。
# どう回避するか？
最も簡単なのは、Gitにcase-sensitiveになってもらうことであると思われる。

```
$ git config core.ignorecase false
```

別の方法として、GitHub Actionsの環境を`windows-latest`のようにcase-insensitiveなものにするという方法が考えられるが、別の問題が起こりそうだし、試したことがないので個人的にはあまりオススメしない。
"無線LAN" vs "Wi-Fi" vs "802.11"

ふんわり「無線LAN＝Wi-Fi」という認識でいたんですが、どうやら違うらしいということで。
調べてたら「802.11」というのも出てきてごちゃごちゃしてきたので簡単にまとめられたらと。

# 無線LAN
文字通り、無線通信を介して構築されるLAN（ローカルエリアネットワーク）。この中では一番上位概念ですね。

> 無線LANとは、電波による無線通信により複数の機器間でデータの送受信を行なう構内ネットワーク（LAN：Local Area Network）のこと。
> 
[無線LAN（WLAN）とは - IT用語辞典 e-Words](https://e-words.jp/w/%E7%84%A1%E7%B7%9ALAN.html)

基本的には後述のIEEE 802.11シリーズの規格に準拠した機器で構築されたネットワークを指すけど、広義の無線LANはBluetoothとか802.15シリーズの規格（区別する場合は「無線PAN」と呼んだりするらしい）も含むんだとか。

# IEEE 802.11
IEEEが策定している無線LANの標準規格（群）。802.11a とか 802.11b とか色々あるやつの総称。
1997年に最初の規格（アルファベットの付かない「IEEE 802.11」）が策定された。

要するに「無線LANを構築するためにどうやって通信するか」についての取り決めですね。

タイトルと順番前後しますが、時系列的な意味で先にこっちを。

# Wi-Fi
Wi-Fi Allianceが保有する、無線LANに関する登録商標。

> 1997年にIEEE 802.11の最初の規格が策定されると各メーカーが対応機器を発売したが、細かな仕様の違いによりメーカーが異なると接続できない事例が多発した。そこで、1999年に米スリーコム（3Com/当時）や米ルーセント・テクノロジーズ（Lucent Technologies/当時）、フィンランドのノキア（Nokia）など当時の有力な通信機器メーカーらが集結してWECA（Wireless Ethernet Compatibility Alliance）を設立した。2003年には統一ブランド「Wi-Fi」を発表し、団体名も現在のWi-Fi Allianceに改められた。[^1]
> 
[Wi-Fi Alliance（WECA）とは - IT用語辞典 e-Words](https://e-words.jp/w/Wi-Fi_Alliance.html)

要するに、IEEE 802.11に準拠した機器同士が、メーカーが違ってもちゃんと通信できるということを保証するためのお墨付きみたいな感じですかね。

# まとめ
「無線通信を介して構築されるLAN」という上位概念としての「無線LAN」があり、無線LANを構築する方法についての取り決めが「IEEE 802.11」で、そのIEEE 802.11に準拠した機器に対して業界団体 Wi-Fi Alliance からつけられるお墨付きが「Wi-Fi」ということですね。すっきりしました。

こういうことなので、基本的には「無線LAN（＝802.11）＝Wi-Fi」でも大きく間違うことはなさそうです。食事のことを「ご飯」、晴れのことを「天気」と呼ぶような感じですね。今後も「**ここWi-Fi飛んでんな**」って言っていきましょう。

ただ、IEEE 802.11に準拠していても Wi-Fi Alliance から認定を受けていない機器も一部存在する[^2]ようなので、仕事に関わるような場合には気をつけたほうがいいかもしれませんね。

最後までご覧いただきありがとうございました。

# その他参考文献
[IEEE 802.11とは - IT用語辞典 e-Words](https://e-words.jp/w/IEEE_802.11.html)
[Wi-Fi - Wikipedia](https://ja.wikipedia.org/wiki/Wi-Fi#cite_note-2)
[「Wi-Fi＝無線LAN」じゃないよというお話 - カイ士伝](https://bloggingfrom.tv/wp/2010/11/07/4405)

[^1]: Wi-Fi Alliance のサイト（[History | Wi-Fi Alliance](https://www.wi-fi.org/ja/node/32321)）を見ると、「Wi-Fi」という名前は2000年に考案されたように読めるんですが、どっちが正しいんですかね。
[^2]: ニンテンドーDS、ニンテンドーDS LiteはIEEE 802.11シリーズの規格に準拠してるけどWi-Fi認定されていないようですね。Wi-Fi Alliance のサイトで認定されている機器を検索することができるんですが、確かに入ってませんでした（ https://www.wi-fi.org/ja/product-finder-results?sort_by=default&sort_order=desc&categories=2&companies=532 ）。
redux toolkitのselectorの型

Udemyのとあるコースを勉強していてそれをtypescriptで書き直していてハマったので忘備録をつけておきます。
stateの型がわからない、でlintエラーが出ていたので気持ちが悪く。
かなりっググっておりました。
結局公式サイトで解決。

https://redux-toolkit.js.org/usage/usage-with-typescript#getting-the-state-type

結論はRootStateになりました。

```react
export const selectProfile = (state: RootState) => state.login.profile;
```

store.tsで型をエクスポートしておきましょう。

```react
import { combineReducers } from '@reduxjs/toolkit'
const rootReducer = combineReducers({})
export type RootState = ReturnType<typeof rootReducer>
```
JS 関数式のメリットとは？

### Q.関数を定数に代入するとなにがいいのか？
**①関数宣言：関数を定義して、関数名で呼び出す方法**

```js
function 関数名(引数){
  処理
}

関数名(引数);
```  

**②関数式：定数に関数を値として代入し、後からその変数を呼び出す方法**  

```js
const 定数 = function(引数) {
  処理
}
定数名(引数);
```  
  
### A.関数名が不要（無名関数というらしい）

但し、①は関数の呼び出しが定義より前に記述されていても実行される。②は実行されない。  

今の時点では（エラーが出るまでは）②を使っていこうと思った。
（理由は関数名を考えなくていいから）

[参考URL](https://www.atmarkit.co.jp/ait/articles/1605/18/news018.html#:~:text=%E9%96%A2%E6%95%B0%E5%AE%A3%E8%A8%80%E3%81%AF%E3%80%81%E5%AE%A3%E8%A8%80%E3%82%92,%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%A0%E3%80%82&text=%E9%96%A2%E6%95%B0%E5%AE%A3%E8%A8%80%EF%BC%9A%20func1%E9%96%A2%E6%95%B0%E3%81%AE,%E3%81%BE%E3%81%A7%E3%81%AB%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82)
$(this)についてまとめました

**理解が止まったところ**   
下記のコードで`.find('td')`が使われているけど、この`$(this)`はどこを指すのか？

```.js
$(function() {
  $('table').find('td').on('click', function(){
    $(this).closest('table').find('td') //追記
  });
});
```


**分かっていたこと**
　`$(this)`はイベントが発生した要素のみを取得する  
  
例：下記の場合はクリックしたp要素

```.js
$(function() {
  $('p').on('click', function() {
    $(this).css('color', 'blue');
  });
});
```



###A.（文章化したら解決した）

1. 「クリックされた`<table>`内の`<td>`」を`$(this)`とする
2. 「クリックされた`<table>`内の`<td>`」の親要素`<table>`を(`.closest('table')`)によって取得
3.  `<table>`の子要素`<td>`すべてを(`.find('td')`)によって取得
VSCode PowerShell比較演算子スニペット

# 概要

Visual Studio CodeのPowerShell用のスニペットです。

| ショートカット | 挿入コード |
| -------------- | ---------- |
| `==`           | `-eq`      |
| `!=`           | `-ne`      |
| `>`            | `-gt`      |
| `>=`           | `-ge`      |
| `<`            | `-lt`      |
| `<=`           | `-le`      |


# インストール

歯車のアイコンを選択し、「ユーザースニペット」を選択します。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/75d9c95a-238e-6bd9-1987-fca8bb27486d.png)

「PowerShell」を選択します。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/4ebeea24-dab3-0dde-1e62-c577a6cedac5.png)

「powershell.json」ファイルが開かれました。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/0b306f0b-86f9-97f4-1632-cf37c75dd411.png)

中身を以下に置き換えます。

```json:powershell.json
{
	"equals": {
		"prefix": "==",
		"body": "-eq"
	},
	"not equals": {
		"prefix": "!=",
		"body": "-ne"
	},
	"greater than": {
		"prefix": ">",
		"body": "-gt"
	},
	"greater than or equal": {
		"prefix": ">=",
		"body": "-ge"
	},
	"less than": {
		"prefix": "<",
		"body": "-lt"
	},
	"less than or equal": {
		"prefix": "<=",
		"body": "-le"
	},
}
```

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/df432893-c883-1980-373c-79e9c666f6d1.png)

# 使用例

`<=`を入力し、
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/961cdfff-894a-73e3-04bc-d293ab84d50a.png)

<kbd><kbd>Ctrl</kbd>+<kbd>Space</kbd></kbd>を押し、
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/08c354c8-73e3-557b-2980-39e87f403df9.png)

<kbd>Enter</kbd>か<kbd>Tab</kbd>で確定します。
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/d6928c32-5fb2-9548-65a5-0e55c8095dfc.png)
タプルはモナド

先日 GHCi で `:i (,)` したら `Monad` のインスタンス定義があることに気づいた。

```haskell
instance Monoid a => Monad ((,) a) -- Defined in ‘GHC.Base’
```

ドキュメントによるとどうやら `base-4.9.0.0` から定義されているらしい。そうだよね。昔はなかった気がするもんね。

でもタプルにモナドインスタンスの定義があるからといって特に驚くべきものというわけでもない。このモナドはもうみんな知っているはずだ。 `Writer` である。

```haskell
newtype Writer w a = Writer { runWriter :: (a, w) } 
instance (Monoid w) => Monad (Writer w)
```

モナド副作用としてログ値を隠し持つためにタプルの片方を使おうというわけだ。 `Writer` の定義では `fst` 側が値、 `snd` 側がログ値だが、タプルそのものに定義されているものはこれが逆で、 `fst` 側がログ値、 `snd` 側が値となっているらしい。

というわけで `fst` 側にログ値を置けばそれがモナド裏に隠し持たれ、最後に全部 `mappend` されてくっついたものが得られる。ちょっと使ってみよう。

```haskell
main :: IO ()
main = print $ do
  (["log1"], ())
  x <- (["log2"], 2)
  y <- (["log3"], 3)
  return $ x + y
```
```console
(["log1","log2","log3"],5)
```

`<-` の右にタプルそのものが現れるので `do` 構文としてはちょっと珍しい形になるのが面白い。とはいうものの見た目の話ならリストモナドも似たようなものか。`Writer` でいうところの `tell log` は `(log, ())` にあたる。 `return value` は `(mempty, value)` である。

もう少し実用的に使えそうな例も考えてみよう。例えば `ByteString` を先頭から少しずつ切り取っていくことを考える。最初の 2 bytes は固定の値が入っていて、次の 2 bytes はバージョン番号で、その次の 4 bytes はファイルサイズで…、なんてのはありそうな話だろう[^binary]。愚直に書くとこんな感じになる。

[^binary]: もっとも、この用途なら `binary` パッケージの `Data.Binary.Get` を使うのがおすすめだ。

```haskell
import Data.ByteString.Lazy (ByteString)
import qualified Data.ByteString.Lazy as LB
import qualified Data.ByteString.Lazy.Char8 as C

parseFile :: ByteString -> ([ByteString], ByteString)
parseFile bs = ([a, b, c], bs''')
  where
    (a, bs') = LB.splitAt 2 bs
    (b, bs'') = LB.splitAt 2 bs'
    (c, bs''') = LB.splitAt 4 bs''

main :: IO ()
main = print . parseFile $ C.pack ['A'..'Z']
```
```console
(["AB","CD","EFGH"],"IJKLMNOPQRSTUVWXYZ")
```

ううむ。なんだろう、この `bs'''` てのは。別に `bs1` `bs2` ... でも良いのだけど、どちらにせよとても野暮ったい感じがする。この例のように三つくらいならまだ良いけど、数が増えていくたびにつらい気持ちになるはずだ。

そこでタプル自身がモナドであることを利用してこれをちょっと書き換えてやる。

```haskell
-- 他の import と main は前の例と同じ
import Control.Arrow (first)

parseFile :: ByteString -> ([ByteString], ByteString)
parseFile bs =
  split 2 bs
    >>= split 2
    >>= split 4
  where
    split n = first pure . LB.splitAt n
```

ふむふむ。これで野暮ったい変数名を付けていく必要がなくなって多少マシになった。とはいえこれでも数が増えれば似たような行がずっと並ぶわけで、それももうちょっとどうにかしたいよね。

うーん。この `>>=` が連続するパターンはどこかで見たことがあるぞ。そうだ、これは `foldM` だ。

```haskell
-- 他の import と main は前の例と同じ
import Control.Monad (foldM)

parseFile :: ByteString -> ([ByteString], ByteString)
parseFile bs = foldM split bs [2, 2, 4]
  where
    split b n = first pure $ LB.splitAt n b
```

これで同じ結果が得られる。コードとしては大分すっきりしたのではなかろうか[^performance]。

[^performance]: ところで `Writer` のログ値にリストを使うと、ログが多くなるにつれて `mappend` の効率が悪くなっていくという残念な性質がある。必要に応じて気を付けたい。
jQuery text()タグ 

## jQuery text()によるテキスト操作　　
　　
text()タグはなんの役割か忘れてしまったのでメモしました

**1.pタグ/h1タグのテキスト取得**

```.js
const h1 = $('h1').text();
const p = $('p').text();
```

**2. pタグのテキストを「こんにちは」に変更**

```.js
$('p').text('こんにちは');
```
Gitコマンド一覧メモ

#gitコマンド

##gitクローン
git clone [リポジトリ] [ディレクトリ]

```
git clone 
https://github.com/ユーザID/ディレクトリ.git copy
```

##ローカルリポジトリを作成
```
git init
```

##インデックスに追加
```
git add .
```

##コミット
```
git commit -m “コメント記載”
```

##リポジトリのURLを指定します。
```
$ git remote add origin https://github.com/ユーザーID/push_test.git
```

##プッシュ
```
git push origin master
```

```
git push -f origin master
```

##プル

```
git pull origin master
````
ドットインストール Ruby入門　メモ

<h1><1〜10></h1>
Rubyでの便利なコマンド
irb #インタラクティブにRubyを操作できる。少し何かを試したいときに。exitで抜ける。
ri #知りたい命令やオブジェクトのドキュメントを見ることができる。たとえば「ri Array」としてあげると Array オブジェクトに関する情報が出てくる。qキーで抜ける。

複数行一気にコメントにしたい場合には、=begin と =end で囲う。
print #改行なし
puts #改行
p #デバッグ用 文字列だよということがわかりやすいように、ダブルクォーテーションで囲われて表示されたりする。複雑なデータだと構造が分かりやすいように表示してくれたりする。

定数は全大文字

「2/5r」  #５分の2を表す

四捨五入の場合は round、そして小数点以下切り捨ての場合は floor、小数点以下切り上げの場合は ceil という命令

upcase は文字列を大文字にしたものを返すだけ、upcase! は文字列を大文字にしたものを返しつつ、元の文字列も大文字に書き換えるという違いがあります。
!は大元のオブジェクトを書き換えてしまうという意味で「破壊的なメソッド」と呼んだりする。

?は真偽値を返すメソッド　　include?  empty?など

colors[0..2] #colors配列のインデックス0〜２を引っ張ってくる
colors[0...2] #これは 0〜2 の直前までになるので、これも覚えておきましょう。

colors.push("gold) は　colors << "gold" と省略できる
.size は要素の数

\#ハッシュ scores = {taguchi: 300, fkoji: 400}
キーの一覧を引っ張ってきたい場合は scores.keys、値の一覧だけ引っ張ってきたい場合は scores.values 
そのキーがあるかどうかは scores.has_key? で調べることができる

整数にしたい場合は to integer という意味で「.to_i」
浮動小数点数にしたい場合は to float という意味で「.to_f」
文字列にしたいなら to string で「.to_s」
.to_a で　to array （配列）
.to_h で to hash

<h1><11〜20></h1>
ダブルクォーテーション　""　　 # %Q　で代用可　　　""はQだけでも可
シングルクォーテーション　'' 　　# %q で代用可

書式付きで文字列を埋め込む方法　% を使って「"文字列" % 値」のように表現できたりするので覚えておいてください。
文字列だったら %s、整数だったら %d、浮動小数点数だったら %f を使います。

例: "name: %s" % "taguchi"  =>  "name: taguchi" と出力

10桁分使うなら %10s
10桁使って左詰めなら　%-10s

printf は書式付きで文字列を表示するための命令
「"文字列" % 値」の % は , にすればいいので printf("name: %10s", "taguchi") としてあげましょう。

sprintf は表示するのではなくて文字列を返してくれる命令
文字列が返ってくるのでそれを p で表示したい場合は p sprintf(…) のようにしてあげれば OK 

すごく単純な条件分岐の場合は if を後ろに書くこともできて、たとえば「puts "great!" if score > 80」といった書き方もできたりします。

case と when　でsignalの条件分岐

gets は 1 行読み込むのですが、最後に改行コードがついているので chomp というメソッドでその最後の改行コードを取り除いてあげます

繰り返しは while や　timesがある
配列やハッシュには for や　each 
times メソッドで見たように、繰り返す処理が 1 行ぐらいだったら do から end を { } で囲って 1 行で表現することもよくやる.

永遠に処理を繰り返す loop (Ctrl + C で止める)
ループを抜ける処理とよく使われ、具体的にはループを抜けるための break、そしてループを 1 回スキップするための next が使われる　(next　は一回だけスキップ)

値を設定するほうのメソッドを setter、そして値を取得するほうのメソッドを getter、2 つを合わせてアクセサと呼んだりする.

<h1><21〜26></h1>

メソッドのアクセス権はpublic private protectがある。（protectedは結構特殊）
new したときに呼ばれる initialize メソッドと、クラスの外に書いたメソッドは自動的に private になる。
private はレシーバーを指定できないメソッドになる(例えば User のインスタンスから呼び出すことはできないが、クラスの中からは呼び出せる)。
<h6>private ではレシーバーを指定できないので必ず self は省略</h6> 

モジュールは module Movie  end のように作る（モジュール名の１文字目は大文字）。
関連するメソッドや定数などをざっとまとめてグループ化したいだけのときに、モジュールは手軽に使えて便利。

例外が発生しそうな処理をまず begin と end で囲ってあげて、例外が発生した場合の処理を rescue の後に書いていってあげます。
Amazon Connectの電話番号取得申請のテンプレート/雛形

# 背景

Amazon Connectの電話番号を取得するには申請が必要です。
以前は手続き無しでコンソールから取得できたそうですが、日本の規制（詐欺防止等の取り組みの一貫）により身元確認が必要となったためのようです。

- [(AWS公式)アジアパシフィック (東京) リージョンで Amazon Connect の電話番号を取得する](https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/connect-tokyo-region.html)
- [(AWS公式)Amazon Connect インスタンス ID/ARN の検索](https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/find-instance-arn.html)

サポートケースの書式がよくわからなかったのですが、とりあえず以下のようにやったらパスしました。
初めてだと迷う人が多いと思うのでシェアします。

## サポートケースの内容

以下のとおりです。

| 項目 | 値・内容 |
|:-|:-|
| 言語  | 日本語  |
| Case type  | Account  |
| Subject  | Amazon Connect/日本の電話番号取得  |
| Severity  | General question  |
| Category  | 一般情報および使用開始にあたって, AWS および各種サービスの利用  |
| 添付ファイル | 法人登記簿(古い〜1年3ヶ月前〜でしたがOKでした）<br>免許証(表・裏） |
| 本文  | 以下参照  |

```
ご担当者さま

Amazon Connectを利用したく電話番号取得を申請いたします。

地域=日本
番号=050はじまり
必要な件数=1件
Amazon ConnectインスタンスARN arn:aws:connect:ap-northeast-1:アカウントID:instance/インスタンスID

法人の登記簿と代表者の身分証明書（免許証/表･裏）を添付します｡

社名 名前
```

## 参考/開通までの日数

深夜に申請して翌日(たぶん翌営業日）の午前中に申請受付メール、午後に承諾メールが届きました。
(なお、番号は承諾後に自分で取得するのかと思ったら、後述したように、AWSのほうで自動的に番号取得してくれて、インスタンスに紐付いてました。）

## AWSサポートから届いたメール

### 申請受付メール

```
ご担当者様

050番号取得のご申請を承りました。

今回ご依頼いただきました内容で現在担当部署に申請をさせていただいております。
恐れ入りますが、進捗があり次第ご連絡差し上げたいと存じますので、今しばらくお待ちいただけますでしょうか。

なお、担当部署の判断により、追加の書類提出をお願いさせていただく場合もございますこと、予めご了承ください。

```

### 申請承諾メール（申請の翌々日）

```
ご担当者様

お待たせいたしましたが、該当 Connect インスタンスに 05012345678 という番号を紐づけいたしました。

以上ご報告とさせていただきます。
```
ADFS Windowsトランスポートエンドポイントの無効化方法

#はじめに
ADFSサーバーのWindowsトランスポートエンドポイントへのアクセス（Proxy）を無効化する方法に関して記載しています。ADFSサーバーのWindowsトランスポートエンドポイントですが、デフォルトインストールを行った場合、「有効」になっています。
この設定が有効となり、インターネットにADFS Proxy（WAP）などを利用して公開されている場合、インターネットから、NTLMログインを試行することができるるようになります。また、ADFSのロックアウト保護機構をバイパスすることができる可能性があります。

#外部にWindowsトランスポートエンドポイントが公開されていることを確認
　STSにアクセスしてエンドポイントが公開されているか確認します。公開されている場合、下記のような認証画面が表示されます。

　https://sts-servername/adfs/services/trust/2005/windowstransport

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526427/ba1246d3-fab7-e31c-097e-3504c9806604.png)
上記のように認証ダイヤログが表示されます。認証用のユーザーID、パスワードの入力画面が表示された場合、エンドポイントが公開されているため、ユーザーID・パスワードを外部から入力されてしまい、ID・パスワードを破られる可能性があります。

#無効化作業
ADFSサーバーに管理者としてログオンします。ADFSサーバーが複数台ある場合、プライマリサーバーにログオンします。（他のサーバーの場合、管理ツールが動きません。）
　ADFSサーバーで、ADFS管理ツールを起動します。　サーバーマネージャー　「ツール」―「ADFSの管理」を選択します。
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526427/a77dc5fb-7599-cac7-4145-bb5fbdc75dfb.png)
画面左側で、「ADFS」「サービス」「エンドポイント」の順に選択します。
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526427/ce8cf515-649e-12d0-129b-58edffec6b4b.png)
URLパス「/adfs/services/trust/2005/windowstransport」を選択します。　行の左端の「有効」、「プロキシ有効」の両方が「はい」となっています。
この行を選択して、右クリックもしくは、画面左側の「プロキシに対して無効にする」を選択します。
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526427/a0eb3be6-87c9-5e6a-5a28-3a7ff6250167.png)
　警告画面が表示されるので、「OK」をクリックします。
![キャプチャ5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526427/db830ef6-b05e-d34b-3d9d-bdb738c98288.png)
設定を行うと、該当行のプロキシ有効が「いいえ」に変わります。ADFSの管理画面を閉じます。

#サービスの再起動
ADFSサービスの再起動を行います。ADFSサービスの再起動は、すべてのADFSサーバーで実施します。サーバーマネージャーの「ツール」「サービス」を選択します。
　サービス画面が表示されたら、「Active Directory　フェデレーションサービス（ADFS）を選択し右クリック、「再起動」をクリックして、サービスを再起動します。

#エンドポイント無効化の確認
　ADFSサーバーでWindowsトランスポートエンドポイントへのアクセスが無効化（公開されていない）ことを確認します。
　再度ブラウザーで、下記のWindowsトランスポートエンドポイントにアクセスを行います。

　URL https://sts-servername/adfs/services/trust/2005/windowstransport

　下記のようなサービスが利用できない旨の表示が出ます。
![キャプチャ6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526427/e3fb1cae-4cae-a2f2-a81d-c87a10c3ce9d.png)
入力する句読点の「、」と「，」を切り替えるAppleScript

日本語入力の読点、普段は「、」を使っている人でも公文書や引用文では「，」を使わなきゃいけなかったりして、入力方法をサッと切り替えたい時があるかもしれません。
OSXの標準日本語入力IMEではシステム環境設定から変更する必要があるため、めんどくさい。
自動化しましょう。

```applescript:読点切り替え.scpt
tell application "System Preferences"
	activate
	tell pane "com.apple.preference.keyboard"
		tell anchor "InputSources"
			reveal
			delay 1
			tell application "System Events"
				tell window 1 of application process "System Preferences"
					(* OS標準日本語入力を使ってる時だけ。 *)
					tell splitter group 1 of group 2 of tab group 1
						repeat with theRow in rows of table 1 of scroll area 1
							if name of the UI element 1 of theRow is "日本語 – ローマ字入力" then
								set selected of theRow to true
								(* 句読点入力を切り替える。 *)
								tell pop up button 3 of scroll area 2
									click
									if selected of (menu item "。と 、" of menu 1) then
										set selected of (menu item "。と ," of menu 1) to true
									else
										set selected of (menu item "。と 、" of menu 1) to true
									end if
									keystroke return
									
								end tell
								exit repeat
							end if
						end repeat
					end tell
				end tell
			end tell
		end tell
	end tell
end tell
```
#細かい説明
システム環境設定の「入力ソース」を表示させるところまでは、System Preferences.appがAppleScriptでの制御に対応しているので、サクッと表示させることができます。

```applescript
tell application "System Preferences" (* システム環境設定.appを *)
	activate (* アクティブ化し *)
	tell pane "com.apple.preference.keyboard" (* 「キーボード」環境設定の *)
		tell anchor "InputSources" (* 「入力ソース」を *)
			reveal (* 表示する *)
(* 以下略 *)
```

しかし、表示したその先の部分は直接いじることができない。（ユーザーが任意のIMEをインストールできるから、SystemPreferences.appの責任範囲ではないってことかもしれません。）
そこで、`System Events`を使ってUIを操作する方法で操作してみます。このやり方はOSのバージョン変更等によってUI構成が変わると動かなくなるので、変更に弱いのが難点ですが、仕方ない。
どこに何があるかは、`every UI element`を表示させたりしながら頑張って絞り込んでいきましょう。ファイト！調べた結果、ざっくりこんな感じでした。
![imputsource.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192970/cbce473e-3f7d-204f-6746-417da9def245.png)
そこでまず、scroll area 2 に`日本語 – ローマ字入力`の設定パネルを表示させましょう。

```applescript
(* 前略 *)
tell application "System Events"
	tell window 1 of application process "System Preferences" (* システム環境設定.appのウィンドウの *)
		tell splitter group 1 of group 2 of tab group 1 (* 真ん中らへんに表示されてる部分の *)
			repeat with theRow in rows of table 1 of scroll area 1 (* scroll area 1 の中の表の各行のうち
				if name of the UI element 1 of theRow is "日本語 – ローマ字入力" then (* OSX標準日本語IMEを *)
					set selected of theRow to true (* 選択する *)
(* 以下略 *)
```
そしたら、設定パネルから「句読点の種類」の選択肢を、開いて、選ぶ。

```applescript
tell pop up button 3 of scroll area 2 (* "句読点の種類"ポップアップボタンを *)
	click (* クリックして選択肢を表示させ *)
	if selected of (menu item "。と 、" of menu 1) then (* 今「。と、」だったら *)
		set selected of (menu item "。と ," of menu 1) to true (* 「。と，」に変更 *)
	else (* それ以外の場合は *)
		set selected of (menu item "。と 、" of menu 1) to true (* 「。と、」に変更 *)
	end if
	keystroke return (* 確定 *)
```
で、あとは、タイムラグでの操作ミス対策に適当に`delay`を入れたり、ちょうど良いタイミングでループを抜けたりさせたら完成です。
これを「スクリプトメニュー」に登録しておけば、入力する読点を「、」⇄「，」で切り替えられるってなもんよ。
Enjoy!
Azure Windows Server2019で日本語言語パッケージがインストールできない場合の手順

#はじめに
Azure上でWindows Server 2019を作成した際に、「Windowsキー」－「設定」―「時刻と言語」を選択して、「言語」を選択しWindowsの表示言語で「日本語」を選択してもうまく日本語言語パッケージを導入できない場合があります。日本語言語パッケージのインストールがうまくできない場合の対処方法に関して記述しています。

#実行方法
1. 下記より言語パックの iso ファイルをダウンロードします。

[Windows Server 2019 デスクトップ エクスペリエンスの言語パックを構成できない][link1]
[link1]:[https://support.microsoft.com/ja-jp/help/4466511/cannot-configure-language-pack-for-windows-server-2019#language]
　※LPKSetupを使用 の手順 1 の[ここ]をクリックすることでダウンロードが可能です。

2．ダウンロードした言語パックをマウントします。
3．日本語化したい環境へ管理者としてサインイン
4．「Windows」キー+ 「R」 キー を押下し、「ファイル名を指定して実行」を起動します。
5．名前欄に「lpksetup.exe」と入力し、「OK」をクリックします。
6．「Install display languages」をクリック
7．「Browse...」をクリック
8．「マウントされている言語パックのドライブ」－「x64」－「langpacks」－「Microsoft-Windows-Server-LanguagePack_x64_ja-jp」 を選択し、「OK」をクリックします。
9．Language欄に「Japanese(日本語)」が表示されたことを確認し、「Next」をクリックします。
10．「マイクロソフト ソフトウェア追加ライセンス契約」の内容を確認し、問題がなければ、「I accept the license terms.」 ラジオボタンにチェックを入れ、「Next」をクリックします。
11．「Japanese(日本語)」のインストールが完了したら、「Close」をクリックします。
12．「Setting」－「Language」の順にクリックします。
13. 「Add a language」をクリックします。
14. 日本語を選択し 「Next」をクリックします。
15. 「Install」をクリックします。
※ 画面上部に「Install language pack and set as my Windows display language」が表示されていることを確認してください。
16. インストールが完了しましたらいったんサインアウトし、サインインしなおします。

以上で日本語言語パッケージを導入することができます。
パターンにマッチした行以降を出力

こんにちは
パターン（```pattern ```）にマッチ（初出）した行以降を出力しました（```awk```利用）[^1] [^2]。

[^1]: 参考： "[grep lines after match until the end](https://serverfault.com/questions/695310/grep-lines-after-match-until-the-end)" (serverfault)
[^2]: 参考：「[今日のsed: 任意の文字列以降の行をすべて出力したい](https://qiita.com/tohta/items/d779d29d035c1b4f9518)」

```console
$ awk "/^12/,0" sample.txt
12
12
1
$ cat sample.txt
1
12
12
1
$
```

他にもいくつか方法があるようです（```awk```、```sed```、```perl```利用）：

```console
$ awk "/pattern/,0" sample.txt
$ sed -n '/pattern/,$p' sample.txt
$ perl -ne "print if /pattern/ .. eof;" sample.txt
```

grep を使う方法は：

```console
$ grep -A999999 -e "pattern" sample.txt
$ grep -Pzo "pattern(.*\n)*" sample.txt
```
Udemy学習項目の目次

##目的

udemyで僕が神と崇めている、maximilanさんの講座の、目次をまとめます。
主に、自分の復習用で、どのチャプターを見返せば良いかをわかりやすくするために作成しています。

## Node.js

1. Basics ３
    1. improved development workflow 4
1. Framework
    1. Express.js 5
        1. template engine 6
        1. MVC 7
            1. dynamic routes 9
1. DB
    1. SQL 10
        1. sequelize 11
    1. NoSQL and MongoDB 12
        1. Mongoose 13
1. Features
    1. sessions and cookies 14
    1. authentification 15
        1. advanced auth 17
    1. emails 16
    1. validation 18
    1. error handling 19
    1. files 20
    1. pagination 21
    1. payments 23
1. APIs
    1. basics 24・25
    1. Async/await　22・26
    1. WebSockets 27
    1. graphQL 28
1. others
    1. deploy 29
    1. testing 30

## React

1. components 3
    1. rendering list and conditional contents 5
    1. fragments 9
    1. class-based components 13
1. states and events 4
    1. side effects 10
    1. Redux 18 19
1. styling 6
    1. animating 24
1. forms 16
1. web
    1. HTTP Requests 14
        1. custom hooks 15
    1. React router 20
        1. next.js 23
    1. authentification 22
1. theory 12
1. others
    1. debugging 7
    1. deploying 21
    1. testing 26

## Next
1. Next.js features
  1. Server-side rendering 5
  1. file base routing 3
  1. build full-stack apps 8
1. others
  1. working with app-wide states 10
  1. authentification 13
  1. deploying 12
  

## Vue
1. Basics 2
    1. rendering lists and conditional contents 3
1. components 6
    1. component communication 8
    1. component features 9
    1. animation and transition 14
    1. composition API 19
1. features
    1. forms 11
    1. authentification 17
1. WEB
    1. HTTP requests  12
    1. routing 13
1. stats management
    1. vuex 15
1. theory 5
1. others
    1. development setup 7
    1. developing 18


## Docker
1. development
    1. docker features
        1. Images and containers 2
            1. volumes 3
        1. networking 4
    1. docker architect
        1. multi-container app 5
            1. docker-compose 6
        1. utility container 7
1. deploying 9
1. Kubernetes 11-15

## Javascript
1. basics
    1. es5 and es6 5
    1. Module JS 20
    1. meta-programming 26
1. Data types
    1. variable and constants 2
        1. numbers and strings 16
    1. function 6
        1. side effects 15
    1. array 8
    1. object 9
1. control structures 4
1. OOP
    1. classes 10
    1. constructer 11
1. Browser JS
    1. Dom in JS 7
    1. Browser API 13
    1. events 14
    1. browser storage 22
    1. browser support 23
1. HTTP 
    1. HTTP requests 18
    1. Async Requests 17
    1. security 28
1. JS with
    1. libraries 19
    1. frameworks 25
    1. Node.js 27
1. workflow
    1. tooling 21
    1. development and debugging 3
    1. deploying 29
    1. optimization 30
    1. testing 31




## Typescript

1. Basics
    1. compiler 3
    1. modules 10
    1. webpack 11
1. types
    1. basic types 2
    1. advanced types 6
1. Features
    1. classes and interfaces 5
    1. generics 7
    1. decorators 8
1. Examples with
    1. libraries 12
    1. React 14
    1. Node.js 15
AtomicDesignって実際どうなん

フロントエンド開発において、実際に導入するにはこういう問題があるんじゃない？っていう個人の考えまとめです。

あんまり参考にならないかも。



## AtomicDesignって何？

AtomicDesignはUIデザイン手法です。

Atoms、Molecules、Organisms、Templates、Pagesの５階層に分かれており、各階層を組み合わせて画面を作ります。

細かいことは調べてみてください。

[Atomic Designを分かったつもりになる](https://design.dena.com/design/atomic-design-%E3%82%92%E5%88%86%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A4%E3%82%82%E3%82%8A%E3%81%AB%E3%81%AA%E3%82%8B)

とか、他にもたくさんあります。

（というか、もともとUI **デザイン** 手法なので、全くそのまま使えるわけではないんですが）



## 結局何言いたいの

- フロント部分の実装が1人じゃないと厳しい。
- CSSを別で管理するとめんどくさすぎる。
- デザインとロジックは分離しよう。



## 理由

### フロント部分の実装が1人じゃないと厳しい

- Molecules・Organismsの判別が個人で差が出る可能性がある。（完璧なルールがあれば別です）
- UIパーツが増えれば把握が難しくなっていく。



### CSSを別で管理するとめんどくさすぎる

- CSSやSCSSファイルを別で管理しない方式の方が楽です。Vue.jsやCSS in JS形式にするといいです。



### デザインとロジックは分離しよう

- ロジックはPagesかTemplatesから注入してあげよう。色々使い回しやすくなる。（ここら辺は作るプロダクトと要相談）

- クリーンアーキテクチャとか参考にしよう

  [実装クリーンアーキテクチャ](https://qiita.com/nrslib/items/a5f902c4defc83bd46b8)

  

## 結論

個人開発や小さなプロジェクトレベルなら大丈夫かなあと思いました。（もちろんルール制定を行なった上で）

人が多いと細かく分ける仕様上、どうしても把握できない部分は生まれると思います。

解決策としては、パーツ一覧を作成しておくといいのかな〜と思います。



**ロジックとデザインは分離しとくと🙆‍♀️**

(急な変更にも耐えやすいので、、、)
テストコードの記述 Rails

どうやらエンジニアの開発現場では機能実装とテストコードの記述はセットで行われるらしい。

ただ残念ながら、私のポートフォリオは先に機能実装を全部してしまった。

しかしテストコードは記述する意味はある。

## モデルとコントローラーでテストする。

テストコードは大きく、モデルとコントローラーの二つです。

## 導入

```Gemfile
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rspec-rails', '~> 4.0.0' #ここを追加
end
```

いつも通り、bundle install

で、

```
% rails g rspec:install
```

これで必要なディレクトリとファイルが作成されます。

```.rspec
--require spec_helper
--format documentation #追記
```
これで、テストの結果がターミナル上で表示されます。

"" コントローラーのテスト

```
% rails g rspec:request コントローラー名
```

で必要なファイルが作成されます。

```spec/requests/archives_spec.rb
require 'rails_helper'

RSpec.describe "Archives", type: :request do
  describe "GET /archives" do
    it "Archivesページにアクセスすると正常にリクエストが返ってくる" do
      get archive_index_path
      expect(response).to have_http_status(200)
    end
    it "Archivesページにワード検索フォームが存在する" do
      get archive_index_path
      expect(response.body).to include('アーカイブを検索する')
    end
    it "Archivesページにタグ検索フォームが存在する" do
      get archive_index_path
      expect(response.body).to include('タグで絞り込み検索')
    end
    it "ArchivesページにHOMEボタンが存在する" do
      get archive_index_path
      expect(response.body).to include('HOME')
    end
  end
end
```

簡単に説明すると

have_http_status(200)

これで正常にアクセスできたかどうか

expect(response.body).to include('HOME')

これで、該当のページに正常に要素が存在するかどうかを判断します。

## テスト実行時

```
% bundle exec rspec spec/requests/コントローラー名_spec.rb
```

また内容を確認するときはbinding.pryを使用しましょう。
[Rails]秘密情報の管理方法〜これまでから現在まで〜

# はじめに
秘密情報の管理はセキュリティ面において重要です。
ここを疎かにしてしまうと、取り返しのつかない事態を引き起こす可能性もありますので、確実に抑えておくと良いでしょう。
また、歴史を振り返りながら知ることで、より深く知識を身に付けられると思うので頑張りましょう！

## 〜Rails4.0
このバージョンまでは標準的な秘密情報を安全に管理する方法がありませんでした。
Cookieの暗号化を行うときに利用するトークンが存在していたが、ファイルにベタ書きしていたので、開発者側での句風雨が必要でした。

```config/initializers/secret_token.rb
SampleApp::Application.config.secret_key_base = '......'
```

[12 factor app](https://12factor.net/ja/)の考え方が広まるにつれて、秘密情報は環境変数経由で利用することが増えてきました。その結果、開発中はリポジトリへ含めないようにしている設定ファイルから開発環境用のトークンなどを読み込み、本番環境では、環境変数からトークンを取得する攻勢を取ることが多くなりました。

## Rails4.1
Rails4.1から`rails new`をした際に、環境ごとに値を定義可能な**config/secrets.yml**が生成されるようになりました。
これにより、秘密情報を集める場所の共通認識を開発者間で持てるようになりました。

```config/secrets.yml
development
  secret_ley_base: ...
test
  secret_ley_base: ...
production
  secret_ley_base: <%= ENV["SECRET_KEY_BASE"] %>
```

## Rails5.1
これまで抱えていた問題を解消するべく、**encrypted secrets**を使った暗号化が提示されました。
`config/secrets.yml.enc`に暗号化した内容を記載することで、このファイル自体をリポジトリに含めることが可能になりました。この暗号化を復号するためのキーは、環境変数経由でRAILS_MASTER_KEYという値を別で管理するだけになったので、管理コストはかなり下がりました。

### config/secrets.yml.encが作成されるまでの手順
1.以下のコマンドを実行してセットアップを行う。

```bash
rails secrets:setup
```

2.編集したい場合は、以下のコマンドで編集を行う。

```bash
rails secrets:edit
```

## Rails5.2
前バージョンで、秘密情報の安全な管理方法がもたらされたものの、利用方法が複雑化してきました。これによって生まれたのが**credentials**という仕組みです。
credentialsは、大きな特徴として、環境変数ごとに値を切り替えず、フラットな構成をとります。

`rails new`した時点で、「config/credentials.yml.enc」「config/master.key」が生成されます。この暗号化したファイルを編集するには`rails credentials:edit`とします。

```ruby
aws:
  access_key: 123
  secret_key_base: 456

.
.
.

secret_key_base: ...
```

このファイルに定義された値を参照する場合は、`Rails.application.credentials.〇〇`とすると取得できます。これらは、master.keyやRAILS_MASTER_KEYに値がセットされていない場合はnilを返します。環境変数などの指定漏れで想定外のエラーに対応するべく、`config/environments/production.rb`では、以下の設定が有効になっています。

```config/environments/production.rb
...
config.require_master_key = true
...
```

### credentialsで使用するファイルや環境変数

| ファイル/環境変数 | 内容 |
|:-:|:-:|
| config/credentials.yml.enc  | 暗号化した設定ファイル  |
| config/master.key  | コミットしないファイル  |
| RAILS_MASTER_KEY  | master.keyの値を環境変数経由で受け渡す場合の名前  |

## Rails6.0
現在の最新バージョンRails6系では、より扱いやすくcredentialsが拡張されました。
例えば、ステージング環境用の設定をしたい場合は以下のようにします。

```bash
rails credentials:edit --environment staging
```

コマンド実行後、値を設定して保存すると、`config/credentials/staging.key`と`config/credentials/staging.yml.enc`が生成されます。

上記のように、`--environment`オプションで環境ごとの設定を行えるようになりました。
注意点として、credentialsの読み込みは、`credentials/RAILS_ENV.yml.enc`を参照し、無ければ、`credentials.yml.enc`を読み込ことに注意したほうが良いです。

### credentialsを2つ以上の環境で利用したい場合
＜test環境とdevelop環境で利用する＞

config/environments/test.rbなどに、以下を指定する。

```config/environments/test.rb
Rails.application.configure do
  # development環境と同じcredentialsを利用
  config.credentials.content_path = Rails.root.join('config', 'credentials', 'development.yml.enc')

  # development環境と同じ複号化するkeyを利用
  config.credentials.key_path = Rails.root.join('config', 'credentials', 'development.key')
end
```

# 終わりに
いかがでしたでしょうか？
秘密情報の管理って、自分の感覚ではまどろっこしくて苦手だったので少し避けてきました。
しかし、学習してみると奥が深く面白かったです。
自分と同じ心境の人が秘密情報の管理につまづかない助けになれば良いと思います！
【Ruby】【初心者】ビンゴカード作成問題を解いてみた！

　[アウトプットのネタに困ったらこれ！？](https://blog.jnito.com/entry/2019/05/03/121235)
　こちらの記事を参考にしてビンゴカード作成問題を解いてみました。まずは可読性よりも初心者なりに答えを出すことを心がけたため、とりあえず「動くだけ」のコードとなっております。
　シンプルなコードを追求する上での基本的な考え方や、より有効なメソッドに対する理解も深めていきたいので、ご意見いただけるとありがたいです。

　問題は下記のような出力結果を得ることです。

B：1～15のどれか
I：16～30のどれか
N：31～45のどれか
G：46～60のどれか
O：61～75のどれか

```
 B |  I |  N |  G |  O
13 | 22 | 32 | 48 | 61
 3 | 23 | 43 | 53 | 63
 4 | 19 |    | 60 | 65
12 | 16 | 44 | 50 | 75
 2 | 28 | 33 | 56 | 68
```
　初めは以下のようなコードで「動くだけ」のプログラムを作ってみました。割と短時間で解いたのですが、単純なロジックを繋ぎ合わせただけです。

```ruby
puts "  B |  I |  N |  G |  O"

def rand_b
  b = rand(1..15)
  if b <= 9
    print "  #{b} |"
  else
    print " #{b} |"
  end
end

def rand_i
  i = rand(16..30)
  print " #{i} |"
end

def rand_n
  n = rand(31..45)
  print " #{n} |"
end

def rand_g
  g= rand(46..60)
  print " #{g} |"
end

def rand_o
  o = rand(61..75)
  print " #{o} "
end

5.times do |count|
  rand_b
  rand_i
  if count == 2
    print "    |"
  else
    rand_n
  end
  rand_g
  rand_o
  puts "\n"
end
```

　ずいぶん長いコードとなりましたが、理屈としてはこういうことです。

```ruby
5.times do
  print rand(1..15)
  print rand(16..30)
  print rand(31..45)
  print rand(46..60)
  print rand(1..75)
  puts "\n"
end
```

　このコードに、空欄に関する条件を色々と付け加えただけです。
#####　　しかしながら、このコードには、重複する値が出てしまうという、重大な欠陥がございました。その問題を解消したスマートな解答に関してはコメント欄を参考にしてください。

　ただし、コメントをそのまま真似するのではなく、ちゃんと自分でもう一度考えて、値の重複を避けたコードを書きたかったため、初めに解いた時と同じ思考スタイルを適用しながら、解き直してみました。

```ruby
puts "  B |  I |  N |  G |  O"

b = (1..15).to_a.sample(5)
i = (16..30).to_a.sample(5)
n = (31..45).to_a.sample(5)
g = (46..60).to_a.sample(5)
o = (61..75).to_a.sample(5)

5.times do |count|
  printf("%3d", b[count])
  print " |"

  print " #{i[count]} |"
  if count == 2
    print "    |"
  else
    print " #{n[count]} |"
  end
  print " #{g[count]} |"
  print " #{o[count]}  "
  puts "\n"
end
```

　それがこのコードです。「rand」ではなく「sample」を用いて重複を避けた形です。あくまでもとりあえず「動くだけ」であり、シンプルでスマートな解答ではありません。

　優秀なプログラマーであれば、どのような思考プロセスを経て、どのような答えに辿り着くのかを教えてくださると嬉しいです。
STM32F767とMCP9701で温度を128x32 OLEDに出力 (Arduino)


x MCP9701-E/TO 販売コード 103199

x あまり正確では、ない
x たまにOLEDのリセットに失敗する　全体の電源を数回入れ直す
x UNO と　767違いは、ADCの最大電圧が5V,3.3V
x U8glibとU8g2があるから各自、確認の事

目的
秋月で売っている安価なMCP9701(約25円)を使って温度を出力する。

構成
MCP9701-E/TO I-03199
AL12832AWWB-H-U02 P-14686

説明
説明すると長くなるので戦いの記録は、たぶん全て書いてあるので
各自勝手に調べて
ヒント　MCP9701 AL12832AWWB

![i2c_oled_9701_767_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a62f56b2-6792-5064-582a-9f5579c648f7.jpeg)



ArduinoUNOとMCP9701で温度を128x32 OLEDに出力 (Arduino)

https://qiita.com/caa45040/items/c17eb94921878edc47e8

```c++

#include <Arduino.h>
#include <U8x8lib.h>

U8X8_SSD1306_128X32_UNIVISION_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);   // Adafruit ESP8266/32u4/ARM Boards + FeatherWing OLED

int     cursor1;      //カーソルの位置
char    data_read[8]; //i2cバッファー

void i2c_oled_w(char *s)
{
            //文字の表示
            u8x8.drawString(
            ((cursor1-0) & 0x07  )*2, // x
            (cursor1>>3)*2,           // y
            s);
            
            while(s[0] != 0) {
              s++;
              cursor1++;
            }
            
            //cursor1=cursor1 + 3; 
} //i2c_oled_w

//初期化
void setup(void) {

  delay(2000); //oledのリセット時間

  u8x8.begin();

  u8x8.setFont(u8x8_font_px437wyse700a_2x2_r);

  //スタートロゴ
  cursor1 = 0;
  i2c_oled_w("START");
  delay(500);

  //画面の初期化
  u8x8.drawString( 0,0,"        ");
  u8x8.drawString( 0,2,"        ");
  cursor1 = 0;

} //setup

int s;                //ADCの値
int n0;               //温度　小数点以上
int nt[] = {0,2,5,7}; //温度

void loop(void) {

//  //画面の初期化
//  u8x8.drawString( 0,0,"        ");
//  u8x8.drawString( 0,2,"        ");
  //カーソルのクリア
  cursor1 = 0;

  //adcの読み込み 0から4096
  analogReadResolution(12);
  s = analogRead(A0);

  //電圧を温度に変換 ex 20.0 -> 200 温度の十倍を出力
  s=((s*1692)>>12)-205;

  //小数点以上と小数点以下を分ける
  n0=s/10;    // 小数点以上
  s =(s-(n0*10)); // 小数点以下
 
  //画面に表示
  i2c_oled_w("TMP=");
  data_read[0] = '0' + n0/10;;
  data_read[1] = '0' + (  n0-(  (n0/10)  *10)  );
  data_read[2] = '.';
  data_read[3] = '0' + s;
  data_read[4] = 0; 
  i2c_oled_w(data_read);

  //1秒待つ
  delay(1000);
} //loop



```
SRA Toolkitの使い方 (インストールと設定 )


#環境
iMac (2017)
macOS Big Sir ver 11.4

#SRA Toolkitの用途
SRA Toolkitとは、SRA(Sequence Read Archive)を解析するツール。
NCBIから次世代シーケンサーの配列データをダウンロードする場合に必要です。


NCBIのデータベースは登録されたRNAシーケンスデータはFastqファイルです。
しかしFastqファイルは容量が大型であり、直接ブラウザからダウンロードすることができません。
実際にダウンロードするのはファイル容量の小さいSRAファイルです。
SRA　Toolkitがあれば、SRA形式からFastq形式への変換が可能です。

#SRA Toolkitのダウンロードして展開
1, 以下のダウンロードページから「MacOS 64 bit architecture」を選択してダウンロード。
https://trace.ncbi.nlm.nih.gov/Traces/sra/sra.cgi?view=software

2, ファイルを展開

```:terminal
% tar zxvf ~/Downloads/sratoolkit.2.11.0-mac64.tar.gz
```
注意：ダウンロードされたファイル名はバージョンによって異なるので都度確認

###SRA Toolkitの設定

```:terminal
% vdb-config --interactive
```
注意：カーソルの移動は 赤で示されている一文字を入力する

1, MAIN画面は、Enable Remote Accessが選択した状態
2, cを入力して、キャッシュの画面へ
3, uを入力してRAM used を選択
4, +を入力すると使用するRAMの値が増えていく、1MB使用とした。
5, sを入力して設定をセーブして、xを入力してvdb-configを終了すれば設定完了

###参考
以下の記事を参考にしました。
https://akiomiyao.github.io/ped/sratoolkit/index_ja.html
https://kimbio.info/461854993-html/
SQL Serverトランザクションログファイルの縮小

#はじめに
SQL Serverのトランサクションログが肥大化した場合の対応方法に関して記述しています。データー復旧モードが完全のデーターベースの場合、トランザクションログは、DBおよびトランサクションログの完全バックアップ時に切り捨てられます。
このため、バックアップをスケジュール化しておけば、DBのトランサクションログは、切り捨てられて適切な大きさに保たれるはずです。
　しかしながら、トランサクションログのファイルサイズが想定以上に大きくなってしまう問題が発生し、SSMS（SQL Server Management Studio）でもうまく縮小できない事象が発生しました。
　具体的には、１つのDBのトランサクションログファイルが、数百Gまで拡張してしまい、ストレージを圧迫する問題が発生していました。一時的に、ストレージを拡張して対処しましたが、そもそも、完全バックアップを取得しているため、このまま放置してもトランサクションログファイルが肥大化するのでは、どうしようもなくなるので対応を行っています。
　サーバー構成は、SQL Server 2016 AllwaysON 可用性構成のサーバーです。

#SSMSでの手順（失敗）
SSMS上のファイルの圧縮機能を利用してファイルの圧縮を試みます。操作は、SQLのプライマリー側で作業を行います。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526427/f3fc0a9c-b537-dc98-08ef-5d927d447acf.png)
対象のデーターベースを選択して右クリック　「タスク」「圧縮」「File」を選択します。

![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526427/1009351e-80e2-084c-8dfc-13a9876c9d57.png)

　ファイルの種類で「ログ」を選択します。　「未使用の領域を解放する」（デフォルト）を選択します。
　「OK」をクリックします。

　本来これで、ファイルが解放されて、トランサクションログファイルが小さくなるはずです。しかしながら、ファイルサイスに変化がありませんでした。

#対応方法
SSMSで下記のコマンドを実行します。

```
SELECT name, size, size * 8 AS size_kb FROM sys.database_files WHERE type = 0
DBCC SHRINKFILE (N'PIFD_log' , 0, TRUNCATEONLY)
SELECT name, size, size * 8 AS size_kb FROM sys.database_files WHERE type = 0
```
　有効なコマンドは、DBCC SHRINKFILE です。このコマンドは、２つの動作モードがあって、ファイルの最後の空き領域を解放する（今回のコマンド）機能と、ファイルの中身を移動して、ファイルの空きを作るモードの２つがあります。
　後者のモードを利用する場合、DBCC SHRINKFILE (N'PIFD_log' , ターゲットサイズ（MB）) となります。こちらのモードを利用する場合、ページ単位でデーターをファイルの前のほうの空きに移動します。この時にトランサクションログをとるようなので、すると、トランサクションログを小さくするのにトランサクションをとってしまうというわけのわからない状況になりそうなので、利用しませんでした。

上記コマンドを実行することで、トランサクションログファイルの縮小ができました。

　本操作をプライマリー側で実施することで、セカンダリ側のトランサクションログファイルの大きさも小さくなります。
Mapbox GL JS で地理院標高タイル (ServiceWorker編) その2

# はじめに

この記事は [Mapbox GL JS で地理院標高タイル (ServiceWorker編)](https://qiita.com/frogcat/items/d12bed4e930b83eb3544) の続編です。

元記事は 2018 年に書かれたものなのですが、その後 2020年末に [mapbox-gl-js](https://github.com/mapbox/mapbox-gl-js) がオープンソースからの方針転換をしたり、mapbox-gl-js version 2.x での terrain のサポートが始まったりなど、いろいろな変化がありました。

また、元記事を書いた当時は raster-dem はせいぜい hillshade (陰影) を表現するくらいしか使いみちがなく、わりと「やってみた」というネタに近いものでしかなかったと記憶しているのですが、現在は以下の面から有用性が出てきたのではないかと思っています。

- OSS でなくなったために、ソースコードを直接改変して地理院標高タイル対応をすることが困難になった。変換サーバを用意したり、変換したコンテンツをホストすることで対応は可能だが、コストが大きい。 ServiceWorker であれば mapbox-gl-js に対する改変が生じないし、ブラウザだけで変換ができるのでサーバに関わるコストを考えないでよいのは利点。
- terrain が導入されたことで raster-dem の価値が高まった。しかし、mapbox の tile service (含む raster-dem) は、課金対象なのでお財布が心配。また、mapbox の raster-dem と地理院標高タイル、どちらが高精度かというと？

# リライト

元記事から参照されている <https://github.com/frogcat/sw-gsidem2mapbox> について、
現在の状況に合わせてリライトをかけました。

- mapbox-gl-js v2.3.1 へのアップデート
- 地理院標高タイル dem5a_png / dem5b_png / dem5c_png への対応

使用方法含め、詳しくは <https://github.com/frogcat/sw-gsidem2mapbox/blob/master/README.md> を参照してください。

# デモ


[![sw-gsidem2mapbox
](https://repository-images.githubusercontent.com/158367018/b931db00-e0ca-11eb-9b06-c81922777634)](https://frogcat.github.io/sw-gsidem2mapbox/)

- <https://frogcat.github.io/sw-gsidem2mapbox/>

地理院標高タイルを使った terrain 表現ができていますね。

# まとめ

ということで、更新記事でした。

思いがけず有用性が増した、と個人的に思っている ServiceWorker ですが、
たとえば「この地域だけはこっちの高精度 DEM を使いたい」みたいな用途でも使いみちがあるかもしれません。

terrain やってみたいけど課金が怖い、という方もぜひどうぞ。
[Rails] エラーメッセージの出力方法

##はじめに
投稿機能やユーザー登録、ログインなど様々な場面で、うまく登録できなかった際にエラーメッセージの出力はあったほうが断然いいですよね。

私が開発中のオリジナルアプリで、少しアプリの中が複雑化していたこともあり、なかなかきれいにエラー文を出力できるまで時間がかかってしまいました。エラーメッセージやその周辺知識をこれから少しずつ発信できたらと考えています。

今回は、超基礎編、そもそもエラーメッセージをどうやって出力させるのか説明していきます。
よろしくお願いします。

##バリデーション
まずはバリデーションをモデルに書いてあげます。
バリデーションは、データベースに値を保存する際に、条件を満たしているかをチェックして、満たしていなかったら弾いてくれる、フィルター的役割をしてくれているものですね。

弾いた時に、なぜ登録できなかったのか、エラーメッセージを出力して知らせてあげることが今回の目標です。

例として、商品投稿機能のバリデーションを簡単に書いてみます。

```ruby
class Item < ApplicationRecord
  validates :name, presence: true
  validates :description, presence: true
end
```

presenceを使って各カラムに空白だと弾けよ！というバリデーションを記述しました。

ちなみに正規表現などでもバリデーションを書くこともできます。任意の文字列だけを許可する、もしくは弾くといったような処理が可能になりますのでかなり便利です。


##エラーメッセージの表示
エラーメッセージを表示させる時には、フォームで情報を送信する時だと思います。

なのでビューではform_withメソッドを使ってフォームを実装していると仮定します。

```erb
<%= form_with(model: @item, local: true) do |f| %>

<%# 省略 %>

<% end %>
```

↑ビューではこのような記述でフォームを実装しているとします。

```model: ＠item```という記述でitemモデルへ渡しているのですが、
createアクションで必ず＠itemを定義してなければなりません。

```ruby:items_controller.rb
  def create
    @item = Item.new(item_params)
    if @item.save
      redirect_to root_path
    else
      render :new
    end
  end
```

renderを使ってnewアクションをルーティングを介さずに実行させることで、もしバリデーションで弾かれた時に、書きかけのフォームをそのままに、エラーメッセージと共に再度newアクションのページが表示されます。

最後にビューのform_withの直下にこの記述をすれば完了です。

```erb
<%= form_with(model: @item, local: true) do |f| %>
<% if @item.errors.any? %>
<div class="error-alert">
  <ul>
    <% @item.errors.full_messages.each do |message| %>
    <li class='error-message'><%= message %></li>
    <% end %>
  </ul>
</div>
<% end %>
<%# 省略 %>　
<% end %>
```

##汎用的に使用できるようにする
これでエラーメッセージは出力できるようになったかとは思いますが、あまり実用的ではありません。
なぜなら、ユーザー管理機能や他の機能にも同じようにエラーメッセージを出力させたい場合、何度もエラーメッセージの記述を書かなければなりません。

なのでいろんな場面で一つの文で汎用的に使えるようにしたいと思います。
問題はこの文ですね↓

```erb
<% if @item.errors.any? %>
<div class="error-alert">
  <ul>
    <% @item.errors.full_messages.each do |message| %>
    <li class='error-message'><%= message %></li>
    <% end %>
  </ul>
</div>
<% end %>
```

この文を切り出します。
viewフォルダの中に「shared」というフォルダを作成します。
その中に「_error_messages.html.erb」というファイルを作成します。
```app/view/shared/_error_messages.html.erb```という構造になっていればOKです。

そのファイルにまるまる先ほどの記述を放り込んで、＠itemの記述を下記のように書き換えます。

```erb:app/view/shared/_error_messages.html.erb
<% if model.errors.any? %>
<div class="error-alert">
  <ul>
    <% model.errors.full_messages.each do |message| %>
    <li class='error-message'><%= message %></li>
    <% end %>
  </ul>
</div>
<% end %>
```

そして、元々この記述があったform_withの直下に下記のように記述します。

```erb
<%= form_with(model: @item, local: true) do |f| %>
<%= render 'shared/error_messages', model: f.object %>

<%# 省略　%>

<% end %>
```

これでいろんな場面でform_withの直下にこの2行目の記述を書いてあげることでエラーメッセージを出力することができます。
記述量が大幅に削減できますし、コードがすっきりしましたね。

##最後に
今回はエラーメッセージを出力させることだけをやりましたが、他にもエラーメッセージに関わる周辺的な知識もやっていこうと思っています。
ここでの説明は私なりの解釈や理解に基づいていますので、ご指摘あれば突っ込んでいただけると幸いです。
Flutter × Firestore 取得サンプル


# DocumentSnapshot編

## コレクションを取得

DocumentSnapshot {users}/{myId}

```dart

static Stream<DocumentSnapshot> getProfile(String myId) {
   return FirebaseFirestore.instance.collection('users').doc(myId).snapshots();
}

```

## サブコレクションを取得

```dart

static Stream<UserDetail> getDetail() {
  final myId = FirebaseAuth.instance.currentUser!.uid;
  return FirebaseFirestore.instance
      .collection('users').doc(myId)
      .collection('detail').doc(myId)
      .snapshots()
      .map((DocumentSnapshot snapshot) {
    /// map型に変換
    UserDetail _userDetail = UserDetail(
        selfIntr: snapshot.get('selfIntr'),
        tagList: snapshot.get('tagList')
    );
    return _userDetail;
  });
}

```
機械学習に必要な数学の復習

#【科目：応用数学】
##第１章：線形代数
###要点
線形代数とは、数式や幾何学から発展した代数学であり、主に行列を取り扱う。
行列を扱うことで複雑な数式の計算をシンプル化し、図形的にイメージすることが可能となる。
行列を用いた計算の活用例としては、固有値分解及び特異値分解がある。

###固有値・固有ベクトル
ある行列Aに対し、以下の関係が成り立つようなベクトル$\overrightarrow{x}$が存在する時、
$$
\large A\overrightarrow{x}=\lambda\overrightarrow{x}
$$
$\lambda$を行列Aの固有値、$\overrightarrow{x}$を行列Aの固有ベクトルという。

###固有値分解
ある正方行列Aの固有値を対角に並べた行列を$\Lambda$、固有ベクトル$\overrightarrow{v}$を並べた行列をVとすると、
以下のように表現できる。

```math
\begin{eqnarray}
\Lambda = \left(
\begin{array}{cccc}
\lambda_{ 11 } & 0 & \ldots & 0 \\
0 & \lambda_{ 22 } & \ldots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \ldots & \lambda_{ mn }
\end{array}
\right)
\end{eqnarray}
```
```math
\begin{eqnarray}
V = \left(
\begin{array}{cccc}
\overrightarrow{v}_{1}  & \overrightarrow{v}_{2} & \ldots
\end{array}
\right)
\end{eqnarray}
```

このとき、
$$
\Large A＝V\Lambda V^{-1}
$$
上記の式のように行列の３つの積の形に分解することを固有値分解という。

###特異値分解
正方行列ではない行列Mがあるとき、次の式のように分解することを特異値分解という。
$$
\Large M＝U S V^{-1}
$$
ここで、Uを左特異ベクトル、$V^{-1}$を右特異ベクトルという。
各特異ベクトルの求め方は、$MM^{T}$を固有値分解することで左特異ベクトルと特異値を求めることができ、$M^{T}M$を固有値分解することで右特異ベクトルを求めることができる。

##第２章：確率・統計
###要点
確率には、発生する頻度を表す「頻度確率」と信念の度合いを表す「ベイズ確率」と呼ばれるものがある。
また、ある事象が与えられたときの確率を「条件付き確率」と言い、お互いに因果関係のない「独立な事象の確率」とは区別される。
条件付き確率には「ベイズ則」を適用することで求めることができる確率がある。

###条件付き確率
ある事象X＝xが与えられたという条件のもとで、Y＝yとなる確率を条件付き確率という。
$$
P(Y=y|X=x)=\cfrac{P(Y=y,X=x)}{P(X=x)}　・・・①
$$

###ベイズ則
上記の条件付き確率の視点を変えて、Y=yのとき、X=xとなる確率は次の式で表現できる。
$$
P(X=x|Y=y)=\cfrac{P(Y=y,X=x)}{P(Y=y)} 　・・・②
$$
ここで、①と②の同時確率は同じであるので、２式をまとめると以下のベイズ更新式が求められる。
$$
P(Y=y|X=x)=\cfrac{P(X=x|Y=y){P(Y=y)}}{P(X=x)}　
$$
###期待値と分散
期待値：ある分布における確率変数の平均値
$$
離散型：\Sigma = P(X=x)f(X=x)　連続型： \int P(X=x)f(X=x)dx
$$
分散：データの散らばり具合
$$
V(X)=E(X^2)-(E(X))^2
$$
###確率分布
２項分布とベルヌーイ分布
成功する確率がPのベルヌーイ試行をn回繰り返したとき、その確率分布は次の２項分布で与えられる。
ここで、n＝１のとき、ベルヌーイ分布となる。
$$
P(X=x)={}_nC_x P^{x}(1-P)^{n-x}
$$
正規分布（ガウス分布）
ある確率変数Xが平均$\mu$分散$\sigma^2$に従うとき、次の確率密度関数で表される分布を正規分布という。
$$
f(x)=\cfrac{1}{\sqrt{2\pi\sigma^2}}exp[-\cfrac{(x-\mu)^2}{2\sigma^2}]
$$


##第３章：情報理論
###要点
自己情報量とは、情報の珍しさを数値で表現したものであり、対数を用いる。
シャノンエントロピーとは、自己情報量の平均（期待値）。
カルバック・ライブラー・ダイバージェンスとは、２種類の確率分布の差異を示す距離の概念。
交差エントロピーとは、ＫＬ情報量のうち、片方の自己情報量をもう一方の分布で平均したもの。

###自己情報量とシャノンエントロピー
ある事象が確率Pで生起するとき、情報量は以下で表される。
$$
log_{} \cfrac{1}{P}=-log_{}P　単位：底が２のとき[bit]、eのとき[nat]
$$
情報量の期待値をエントロピーという。
$$
H(X)=-\Sigma (P(X)log_{}P(X))
$$

###KLダイバージェンス
カルバックライブラーダイバージェンスとは、２つの確率分布がどの程度似ているかを示す尺度。
$$
KL(p||q)=\int_{-∞}^{∞} p(x)log_{} \cfrac{p(x)}{q(x)}dx
$$
２つの確率分布が同じとき、解は０となる性質を持つ。

###交差エントロピー
２つの確率分布をP、Qとするとき、エントロピーとKLダイバージェンスの定義から交差エントロピーは次の式で表せる。
$$
H(P,Q)=-\Sigma p(x)logq(x)=H(P)-KL(p||q)
$$
この交差エントロピーは、交差エントロピー誤差として分類問題における損失関数の計算に用いられることがある。
【Ionic/Angular Universal】本番環境のみ強制SSL(httpsリダイレクト)の設定

## 背景
Angularアプリケーションを、Google App Engineの環境にデプロイした利用しているアプリで、公式ドキュメントにある設定を試しても強制SSLが対応できなかった

https://cloud.google.com/appengine/docs/standard/nodejs/application-security?hl=ja

※ 一部抜粋

```yaml:app.yaml
handlers:
- url: /.*
  script: auto
  secure: always
  redirect_http_response_code: 301
```

そのため、以下のAngularUniversalの設定ファイルにロジックを追記して、https以外のプロトコルの場合は強制的にhttpsにリダイレクトさせる設定を追加した

## 設定内容

```ts:server.ts
import { environment } from './src/environments/environment';

　~~ 中略 ~~

// The Express app is exported so that it can be used by serverless Functions.
export function app(): express.Express {

  ~~ 中略 ~~

  // All regular routes use the Universal engine
  server.get('*', (req, res) => {
    // 本番環境のみhttps強制リダイレクト
    if (environment.production && req.headers['x-forwarded-proto'] !== 'https') {
      return res.redirect(['https://', req.get('Host'), req.url].join(''));
    }

    res.render(indexHtml, {
      req,
      providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }],
    });
  });

  return server;
}
```

※ ローカル環境はhttpのままアクセスさせたかったので、本番環境のみhttpsにリダイレクトさせるようにした

## 参考

https://masahiro.me/2020/05/angular9-universal-https-redirect-heroku/