OmniAICreator/Qiita-1.07M huggingface dataset:
Windowsでロック画面を表示したときだけディスプレイのスリープ時間を変更する

普段、画面スリープ無効にしているけど、ロックしたときはスリープしてほしいと思っている人用の設定

# 内容
* ロックしたとき、画面スリープ時間1分に設定
* ロック解除したとき、画面スリープ時間0分(無効化)に設定

やっていることはタスクスケジューラーでpowercfgを呼び出すだけ。

# 設定スクリプト
管理者権限ありのpowershellで下記のコマンドを実行する。

```powershell
$ErrorActionPreference = 'Stop'

$taskSessionStateChangeTrigger = Get-CimClass `
    -Namespace 'ROOT\Microsoft\Windows\TaskScheduler' `
    -ClassName 'MSFT_TaskSessionStateChangeTrigger'

# https://docs.microsoft.com/ja-jp/windows/win32/api/taskschd/ne-taskschd-task_session_state_change_type
$onLockTrigger = New-CimInstance `
    -CimClass $taskSessionStateChangeTrigger `
    -Property @{ StateChange = 7 } `
    -ClientOnly

$onUnlockTrigger = New-CimInstance `
    -CimClass $taskSessionStateChangeTrigger `
    -Property @{ StateChange = 8 } `
    -ClientOnly

Register-ScheduledTask `
    -TaskName 'ロック時にディスプレイのスリープ時間を短くする' `
    -Action (New-ScheduledTaskAction -Execute 'powercfg' -Argument '/change monitor-timeout-ac 1') `
    -Trigger $onLockTrigger `
    -Force `
    -User 'SYSTEM'

Register-ScheduledTask `
    -TaskName 'アンロック時にディスプレイのスリープ時間を戻す' `
    -Action (New-ScheduledTaskAction -Execute 'powercfg' -Argument '/change monitor-timeout-ac 0') `
    -Trigger $onUnlockTrigger `
    -Force `
    -User 'SYSTEM'

trap { break }

```

# 参考

https://stackoverflow.com/questions/53704188/syntax-for-execute-on-workstation-unlock
「人を動かす」を読んだ感想とメモ書き

# 書籍

https://www.amazon.co.jp/%E4%BA%BA%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99-%E6%96%B0%E8%A3%85%E7%89%88-D%E3%83%BB%E3%82%AB%E3%83%BC%E3%83%8D%E3%82%AE%E3%83%BC-ebook/dp/B00UBSPBPA/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=&sr=


# 全体を通した内容

 * 他人の意見や気持ちを、論理で無理やり変えることはできない。
  その人自らが選ぶよう仕向ける必要がある。
 * そのために、他人を自分のことのように考え、相手の真の望みに気づく必要がある。
 * そして相手にかける言葉は、誠実で本心からの言葉である必要がある。

これらを実践するための、具体的な方法や行ったときの実例が詳しく書かれている。


# 特に印象深いポイント
### 人を動かす原則①批判も非難もしない　

>なるほど、この手紙を出せば、私の気持ちは収まるかもしれない。
>だがミードは、どうするだろうか？
>自分を正当化して、逆にこちらを恨むだろう。

論理的には、自分が正しいと思えることでも、相手を批判することで得られるものは何か？
真っ向から批判をしても、起こしてほしいアクションを起こしてはくれない。

### 人を動かす原則③強い欲求を起こさせる
>この問題について、私は自分の要求を一言も口にしなかったことにご注意願いたい。
>終始、相手の要求について語り、どうすればその要求が満たせるかを話したのである。

自分の要求を相手がしたい、と思わせることで、自分の要求を叶えることができる。
相手の欲求を理解し、その欲求が満たされるように、自分の要求について話す。

引用部分では、ホテルの大広間の使用料を値上げされた時に、どうやって値下げ要求を受け入れてもらったかのエピソードが書かれている。

### 人に好かれる原則②笑顔で接する
>彼はこう言うーーー
「まるでどんちゃん騒ぎでもしているような具合に仕事を楽しみ、それによって成功した人間を何人か知っているが、そういう人間が真剣に仕事と取っ組みはじめると、もう駄目だ。だんだん仕事に興味を失い、ついには失敗してしまう」

この部分、私にとっては腑に落ちたし、素敵だ。
楽しんで仕事をしている人ほど、仕事の質が高くて、成果が出ている気がする。
それに、仕事を楽しんでやっている人が近くにいると、周りまで何だか楽しくて仕事を頑張ってしまうような気がする。

自分も楽しくて、それでいて成功するなら、私もどんちゃん騒ぎくらいの楽しみ方で働きたい！

>有能で真面目で、他人の役に立つ人物になることを心がけ、それを常に忘れないでいる。
すると、日のたつに従って、そのような人物になっていく。
・・・・・・・・心の働きは絶妙なものである。
正しい精神状態、すなわち勇気、率直、明朗さを常に持ち続けること。
正しい精神状態は優れた創造力を備えている。
全ての物事は願望から生まれ、心からの願いは全てかなえられる。
人間は心がけたとおりになるものである。

行動することが、自分自身を創り出す。
いかにも幸福そうな自分でいることで、本当に幸せになれてしまうなら、幸福そうな私でいよう。

### 人に好かれる原則⑥心からほめる
>他人を喜ばせたり、ほめたりしたからには、何か報酬をもらわねば気が済まぬというようなけちな考えを持った連中は、当然、失敗するだろう。

本書の全体を通して、これが言える。
「人を動かす」方法について書かれているが、決して小手先のテクニックが書かれた本ではない。
ただのお世辞ではなく、心から誠意を込めた賞賛だからこそ、「人を動かす」ことができる。

### 人を説得する原則①議論に勝つ唯一の方法として議論を避ける。
>その結果、議論に勝つ方法は、この世にただ一つしかないという結論に達した。
その方法とはーーー議論を避けることだった。

>議論に勝つことは不可能だ。
もし負ければ負けたのだし、たとえ勝ったにしても、やはり負けているのだ。
なぜかと言えばーーー仮に相手を徹底的にやっつけたとして、その結果はどうなる？ーーー
やっつけたほうは大いに気をよくするだろうが、やっつけられたほうは劣等感を持ち、自尊心を傷つけられ、憤慨するだろう。
ーーー「議論に負けても、その人の意見は変わらない」

議論ではなく、まずは相手の言葉に耳を傾けるべきだ。
相手のほうが正しいのではないか？少なくとも正しい部分があるのではないか？
という視点で相手の主張を聞き、よく考えてみることから始めるのが良い。

相手の行動や考えには、それ相応の理由がある。
その理由を探し出し、本当に相手の身になってみる。

### 人を変える原則②遠回しに注意を与える。

>人を批判する際、まずほめておいて、次に"しかし"をいう言葉をはさんで、批判的なことを言いはじめる人が多い。
(中略)
ところが、"しかし"という言葉を聞いたとたん、今のほめ言葉が果たして本心だったのかどうか疑いたくなる。
結局は批判するための前置きにすぎなかったように思えてくる。
(中略)
この失敗は"しかし"という言葉を、"そして"に変えると、すぐに成功に転じる。

他人を批判するときに、最初から言うのは気がひけるので、良い言葉を言ったあとに「しかし」と続けがちだ。
これを「そして」にするだけで、相手が素直に耳を傾けられるようになる。

### 人を変える原則④命令をせず、意見を求める。
>彼の部下が書いた手紙に目を通して
「ここのところはこういう言い方をすれば、もっとよくなるかもしれないが、どうだろう？」
と言うこともよくあった。
>
>彼はいつも自主的に仕事をやらせる機会を与えたのだ。
決して命令はせず、自主的にやらせる。
そして、失敗によって学ばせた。

言う方も、言われる方も、こんな言い方なら仕事をしやすいだろうな、と感じる。
こんな風に言われたら、仕事の責任範囲はあくまで自分で、上司ではないと思えるし、
自分自身がコントロールできるもの、と認識できるようになる。


### 幸福な家庭をつくる原則⑥礼儀を守る。
本書では、付録として、家庭についても言及している。
著者の男女観が反映されていて、まるっと同意できる内容ではないが、参考にするべき部分は多い。

>彼はどんな不愉快な気分におちいっても、決してそれを家族に見せなかった。
不愉快な気分は自分だけでたくさんだ
ーーー他の者まで不愉快になられては、たまったものでないというわけだ。

友人関係や、職場では、不愉快な気分でも、それを周りに当たり散らさなくても、家だとそれを当たり散らしてしまうことがある。
それを心のままに当たり散らして、家庭内の空気が悪くなるよりも、家族が笑顔でいるほうが、よほど家庭での居心地は良いだろう。
自分ひとりに溜め込みすぎて、不機嫌になるのも、それはまた家庭内の雰囲気は悪くなるだろう。

他人と同様に、家族にも礼儀を守ることが大事である。
キーボードからの入力を16進数で解釈（utf8で解釈も参考）


事前準備
``` 
extension String {
    func splitInto(_ length: Int) -> [String] {
        var str = self
        for i in 0 ..< (str.count - 1) / max(length, 1) {
            str.insert(",", at: str.index(str.startIndex, offsetBy: (i + 1) * max(length, 1) + i))
        }
        return str.components(separatedBy: ",")
    }
}
```
入力された内容を16進数と解釈
```
   func send(text1: String) { 
        // 16進数キーボード前提
        let text2 = text1.splitInto(2) // [String]
        let text3 = text2.map { UInt8($0, radix: 16)! }  //[UInt8]
        let data1 = Data(text3) // [Data.Element]

　　　　　//ラベルに表示
        label1.text = String(data1[0], radix: 16) // 16進数
        label2.text = String(data1[1], radix: 16) // 16進数
        label3.text = String(data1[2], radix: 16) // 16進数
    }
```

入力された内容をそのままutf8で解釈
```
    func send(text: String) {
        // ASCIIキーボード前提
        let utf8 = text.data(using: .utf8)! // Data

　　　　　//ラベルに表示
        label4.text = String(utf8[0],radix: 16) // utf8
        label5.text = String(utf8[1],radix: 16) // utf8
        label6.text = String(utf8[2],radix: 16) // utf8
    }
```

###参考
>Swift 3 で16進数文字列と整数の相互変換 - Qiita
>https://qiita.com/y13i/items/9af41a1cb507a4b388e0

【Swift5】Data・UInt8のextension備忘録 - Qiita
https://qiita.com/haru15komekome/items/c8d9c3a1a11f0813acdb

【Swift】Data型によるUIntについて
https://zenn.dev/masakunn/articles/c23f64c22f330c

How do I convert UInt8 to Data? | Apple Developer Forums
https://developer.apple.com/forums/thread/119114

```
//UInt8 to Data
let value: UInt8 = 123
let data = Data([value])

//Data to UInt8
let originalValue = data[0]
print(originalValue) //->123

//[UInt8] to Data
let arrValue: [UInt8] = [123, 234]
let arrData = Data(arrValue)

//Data to [UInt8]
let originalValues = Array(arrData)
print(originalValues) //->[123,234]

//Data to String?
let string = String(data: value, encoding : .utf8)  //String?

//Data to String
if let string = String(data: value, encoding : .utf8) {
...
} else {
...
}    //String

```

UInt8の16進数を2桁表示したい
（何も意識せずに処理すると、先頭が0の場合、1桁だけになってしまう）

【Swift入門】数値を文字列(String)にformatする方法 | 侍エンジニアブログ
https://www.sejuku.net/blog/34872

```
String(format: "%02d", i)
```
Route53

# Route53
ドメイン管理機能や権威DNS機能を持つサービス。

# トラフィックルーティング
異なるネットワークにパケットを送信するときに最適な配達経路を決めること。経路選択、経路制御とも呼ばれる。いわゆるルータが担っている機能のこと。
Route53にゾーン情報を登録する際、名前解決の問合せに対してどのように応答するかを決める７種類のルーティンポリシーがある。

1. シンプルルーティングポリシー
1. フェイルオーバールーティングポリシー
1. 位置情報ルーティングポリシー
1. 地理的近接性ルーティングポリシー
1. レイテンシールーティングポリシー
1. 複数値回答ルーティングポリシー
1. 加重ルーティングポリシー

## 加重ルーティングポリシー

指定した比率で複数のリソースにトラフィックをルーティングする際に利用する。

>ABテストとは、「ある特定の期間にページの一部分を2パターン用意して、どちらがより効果の高い成果を出せるのかを検証すること」です。

例えば以下の２パターンにおいてボタンの色はAの方がいいか？Bの方がいいか？を検証するもの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/f93951cd-405a-294b-2a38-eb4fb7c366e1.png)

## フェイルオーバールーティングポリシー
メインに障害が発生していた場合にサブにアクセスするようにルーティングするポリシー。
本番システム障害時に、SorryサーバーのIPアドレスをセカンダリーレコードとして登録しておくと、自動的にSorryコンテンツを表示することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/48e7cb24-0f47-aa9f-544c-36a5077e4904.png)
画像引用：[【AWS初学者向け・図解】Route53ルーティングポリシーを現役エンジニアがわかりやすく解説](https://o2mamiblog.com/aws-route53-routingpolicy-beginner/#toc4)


## 位置情報ルーティングポリシー
ユーザーの位置情報に基づいてトラフィックをルーティングするもの。これを使うことで例えば日本からアクセスは日本語のコンテンツが配置されたWebサーバーへ接続するといった対応ができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/9f12fae3-df05-1b5a-1c69-8c94b24325d8.png)

画像引用：[Amazon Route 53 位置情報ルーティング の動作確認ってどうやる？](https://blog.serverworks.co.jp/route53_Geolocation_routing)

## レイテンシールーティングポリシー
複数箇所にサーバーが分散されて配置されている場合に、遅延が最も少ないサーバにリクエストをルーティングするもの。特定のサーバに負荷がかかっている中で、他に返答が早いサーバがある場合に、そちらへリクエストを投げるもの。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/eeabd6d1-642a-2aa1-48b8-c4990d49f307.png)
画像引用：[https://blog.serverworks.co.jp/2022/03/22/150454](https://blog.serverworks.co.jp/2022/03/22/150454)


# 参照
・[Route53のルーティングポリシーは何があるの?](https://qiita.com/miyuki_samitani/items/0b2f155da75350629c7c)

・[【AWS初学者向け・図解】Route53ルーティングポリシーを現役エンジニアがわかりやすく解説](https://o2mamiblog.com/aws-route53-routingpolicy-beginner/#toc4)
色んな高さの「ピー」音のファイルを沢山作る（Python3）

# きっかけ
　超基礎的な音感トレーニングアプリを作ってみたかった。でも、ピアノ音のファイルが見つからなかった（1オクターブ分くらいはあったけど）。
　困ったので自分で作りました。ピアノの音色ではなく「ピー」音ですが、音感トレーニング用なら悪くない？(素人なので分からない)

# 気づき
ピアノの鍵盤って、一つ隣の音との周波数の比はどこも同じらしいです。ということは **周波数だけ考えると鍵盤の白と黒って特に意味ない** ってことですよ。レ(白)→レ#(黒)と、ミ(白)->ファ(白)の周波数比は同じなんですよ。黒はちょっとしか上がらないんだと思ってました。びっくりですよね。

# サンプルコード
**ラ(440Hz)から始まり、ラ#、シ、ド、ド#・・・ラ(1760Hz)と2オクターブ上まで1ファイル ずつ作ります**
- もっと沢山作りたい場合は`np.arange`の25を増やせばok
- 出力先のディレクトリ(`OUTPUT_DIRECTORY`)は先に作っておかないとエラーになります。もしくは`OUTPUT_DIRECTORY = './'`に変えちゃえば動きます
- importしてるものが無ければ`pip install`などで入れてくださいね

```python
# Python 3.9.13
import numpy as np
from scipy.io.wavfile import write
from playsound import playsound

# 変更不要 >>>>>>>>>>>>>
SAMPLING_RATE = 44100 # 1秒あたりのデータ点数
FREQUENCY_RATIO = pow(2 , 1/12)  # 隣合う音の周波数比。12回で2倍になることから計算
# <<<<<<<<<<<< 変更不要

# 適宜変更してね >>>>>>>>>>>>>>>
OUTPUT_DIRECTORY = './test_output/'  # 出力先フォルダ。あらかじめ作ってないとエラーになるよ
AMPLITUDE = 16384  # 音の大きさ
START_FREQUENCY_HZ = 440  # 開始周波数(Hz)
DURATION_SEC = 2 # 音を何秒間鳴らすか
lamda = 2.5  # 音のフェードアウト具合。適当に調整する
# <<<<<<<<<<<<<< 適宜変更してね

# 時間軸データの生成
time_array = np.linspace(
    0, 
    DURATION_SEC,
    int(SAMPLING_RATE * DURATION_SEC)
)

# 周波数を変えてファイル生成するループ
for i in np.arange(0, 25, 1):  # 0から24(2オクターブ上)まで1刻み
    # 周波数
    frequency_hz = START_FREQUENCY_HZ * pow(FREQUENCY_RATIO, i)

    # 波形生成
    amplitude_array = (
        AMPLITUDE
        * np.sin(2 * np.pi * frequency_hz * time_array) # SIN関数
        * pow(np.e, -time_array * lamda)  # 適当にフェードアウトさせる
        )

    # 出力先ファイルパス
    fname = f'{i}'
    path = f'{OUTPUT_DIRECTORY}{fname}.wav'

    # 書き出し
    write(path, SAMPLING_RATE, amplitude_array.astype(np.int16))
    print(f"output: {i}, {frequency_hz}, {path}")
```
【TypeScript】タプルについて


## 配列の型付けをする時にタプルを使える時は積極的に使う
タプル（tuple）　は配列のサブタイプ。
固定長の配列を型付けするための特別な方法。
不均一なリストを`安全に`コード化するだけでなく、それが型付けするリストの長さを限定する。

#### シンプルな使い方

```
let a: [number]  = [1];

// [苗字, 名前,  生まれ年]のタプル
let b: [string, string, number] = ['鈴木', '太郎', 1989];

b = ['佐藤', '一郎', '愛知県', 1963];  // 愛知県は型付けされていないためエラー
```  

#### ?（オプション）を使った省略   

```  
let a: [number, number?][] = [
  [1],
  [3, 4],
  [5]
];
``` 

#### 最小限の長さをもった制約をつける  
```  
// 少なくとも1つの要素（ともにそれに続く可変長さの要素）をもつ文字列のリスト
let a: = [string, ...string[]] = ['太郎', '二郎', '三郎'];　　

// 不均一なリスト
let b: = [number, boolean, ...string[]] = [1, false, 'a', 'b', 'c'];
```
ステータスコード503,405ってどうやって解消するんだ？

こんにちは。Jです。

前回、[LINE Messaging APIでbotを作ろうとしたら普通につまづいた。](https://qiita.com/J_Program_now/items/2352a3644c6e2ddd617e)という記事を書きまして、**またつまづきました。**
なんでよぉぉ～～～～～～～～～。
~~またまた現実逃避がてらに記事を書こうと思います。~~

とりあえず、APIも使ったことないし、HerokuもGitも使ったことないからつまづくのは当たり前なんですよね。

想定内のことなんですけど、三日くらい格闘して改善できておりませぬ。

それでも色々なことが勉強できたのでそのことを書いていきます。

前回はソフトについて書いたので、今回は**ソフトをどのように繋ぐのか**、bot公開までの流れを書いていきます。


# bot公開までの一連の流れ

登場人物は**プログラムくん、LINE Messaging APIくん、Herokuくん**です。
赤文字で書いてあるところが、ソフトを連携させる部分です。

1. LINE developersにてLINE Messaging APIのチャンネル作成

2. Herokuアカウント作成&アプリ作成

3. <font color="Red">Herokuのアプリに、LINE Messaging APIの**チャネルシークレット**と**アクセストークン**を登録。そして**webhook**に**Herokuのアプリのリンク**を登録。</font>ここでLINE Messaging APIくんとHerokuくんが手を繋ぎます。

4. コードを書く。

5. <font color="Red">Gitを使ってHerokuにファイルをプッシュ。</font>ここで、プログラムくんとHerokuくんが手を繋ぎます。これで全員が手を繋げました。

6. おしまい。

これが一連の流れでございます。***わかりやすいね！！***



# さぁ僕がつまづいたことについて書こうか

さて、つまづいた原因なのですが、前章の5.までは出来ました。問題なくプッシュできて、ビルドも完了しました。

**しかし、LINE developersの方でwebhookの検証を行うとエラーが発生するのです。**

エラー文を読むと **「HTTPのステータスコードがおかしいで」** という感じのことが書いてあります。HTTPのステータスコードについて調べてみると、**サーバーにリクエストを行った際に返信されるものがステータスコード**の様です。

はつみみぃぃ～～～～～（IKKOさん最近見ないね）

ということで、自分のアプリのステータスコードを確認してみました。 **404や503が出てきます。**
それぞれの状態は以下の通りです。

>> 405 Method Not Allowed
サーバーがリクエストメソッドを理解しているものの、無効にされており使用することができません。例えば、 API がリソースを DELETE することを禁止できます。 GET および HEAD の 2 つは必須で、無効にすることができず、このエラーコードを返してはいけません。
> [MDN Web Docsより](https://developer.mozilla.org/ja/docs/Web/HTTP/Status)

>> 503 Service Unavailable
サーバーはリクエストを処理する準備ができていないことを示します。 一般的な原因は、サーバーがメンテナンスや過負荷でダウンしていることです。 このレスポンスとともに問題について説明する、ユーザーにわかりやすいページを送信するべきであることに注意してください。 このレスポンスは一時的な状況について使用するものであり、また可能であれば、サービスが復旧する前に HTTP の Retry-After ヘッダーに予定時刻を含めてください。 また、これら一時的な状況のレスポンスは通常キャッシュされるべきではないことから、ウェブ管理者はこのレスポンスとともに送られるキャッシュ関連のヘッダーに注意しなければなりません。
> [MDN Web Docsより](https://developer.mozilla.org/ja/docs/Web/HTTP/Status)

~~余談ですが、「404 Not Found」もステータスコードのことでした。親の顔より見た数字。~~

ステータスコード"200"は「正常に動くよー」という状態を表すものらしいです。

***わからん！！！***

***どうやったら200になるんだよ！！！！！！！***

ここでつまづいてます...
色々いじっても治りません。
ということで気が済んだので、僕はまた戦闘に戻ろうと思います...
進捗があればまた書きます。それでは。<br><br>
【余談】27インチのモニター買って作業効率爆上がりです。缶のサイダーも箱買いしたのでスカッとしながら作業してます。みんな熱中症に気を付けてね！<br><br>
【bot作成の参考にさせていただいた記事】
[PythonでLINEの「Messaging API」でテンプレートメッセージを実装してみた](https://qiita.com/kotmats/items/c4e651f1cb6c4490f4b8)
CCXTでBinanceのAPIをたたくと出る「Timestamp for this request is outside of the recvWindow.」について


# 導入

各種仮想通貨業者のAPIをまとめて使えるのがCCXT。

これをPython環境で使ってBinanceのAPIを利用しているのですが、何もプログラムを変更していないのに「Timestamp for this request is outside of the recvWindow.」というエラーを吐くことがありました。

内容としては、リクエストした時点の時間から許容するタイムラグ以上の時間が過ぎているよ、だから処理しないよっていうものです。

# 解決方法

プログラムを動かしているPCの時間を、NTPと手動で同期させるとエラーはかなくなりました。

# 原因

Windowsの時間の同期は通常１週間に１回です。
そのため、Binanceのサーバの時間とPCの時間がずれてしまうことから起きてしまう事象のようです。

ccxtを使わずにBinanceが提供しているモジュールを使う場合はサーバの時間をとってきて、PCとのずれを計算してタイムスタンプとして乗せることもできますが、それについては別の機会に。
文字の表現方法　

コンピュータは```文字に数値を割り当てる```ことで、文字データを表現します。
文字コードは各文字に割り当てられる数値のこと。
しかし
数値の当て方にはそれぞれ```方言```があり、ひらがなカタカナ漢字を使う日本みたいな多くの```種類```の文字を使う国もある。
それぞれを２５６通りで表現できないために```文字コードにはいろいろな種類```がある。

## 気づき
方言とは？
どんな種類だろうか？

## 文字コード表を見てみよう。
最もポピュラーなASCIIのコード表を見てみる。
縦横を使い１と０で表現されている。
例えばAを表示するときは
```01000001```で表す。
後ろから
```0001```は行の数値
```100```は列の数値
最初の```0```はデータの誤りを検査するのに使う。

## 文字コードの種類とその特徴
### ASCII(アスキー)
かなり基本的な文字コード。
含まれている文字は```アルファベット```、```数字```、```いくつかの記号```のみ。
文字を1文字７ビットで表す。

### EBCDIC（エビシディック)
一文字を```８ビット```を使って表現。
大型汎用コンピュータなどで使われている。

#### 疑問 大型の汎用コンピュータとは？
* メインフレームとは、大企業や官公庁などの基幹情報システムなどに用いられる大型のコンピュータ製品。最も古くから普及している製品カテゴリーで、多数の利用者や業務で共有し、大量の重要なデータや処理を扱うため、極めて高い性能や信頼性を実現している。
出典 https://e-words.jp/w/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0.html

* 汎用コンピュータとは、パソコンなど、科学技術計算、事務処理、制御用など、ソフトウェア次第で様々な用途に利用することができる大型のコンピュータのことである。基幹業務処理において利用されることが多い。メインフレームとも呼ばれる。
出典 https://www.weblio.jp/content/%E5%A4%A7%E5%9E%8B%E6%B1%8E%E7%94%A8%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF

大きい且つ重大なコンピュータなのか。

### シフトJISコード(S-JIS)(シフトジスコード/エス-ジス）
```ASCIIのコード体系の文字と混在```させて使えるようになっている```日本語文字コード```です。
```ひらがな、カタカナ、漢字など```を扱える。
1文字を```2バイト```で表す。

### ECU
拡張UNIXコードとも呼ばれる。
UNIXというOSでよく使われる日本語コード。
基本的には1文字２バイト。補助漢字などは3バイト使う。

#### 疑問 補助漢字とは?
* JIS X 0208で利用できない文字を集めた文字セットのこと。
漢字5,801文字のほか、非漢字266文字を含みます。文字セットとしては、一般的に「JIS X 0212-1990」と呼ばれます。
出典 https://www.morisawa.co.jp/culture/dictionary/1940#:~:text=JIS%20X%200208%E3%81%A7%E5%88%A9%E7%94%A8,1990%E3%80%8D%E3%81%A8%E5%91%BC%E3%81%B0%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

* JIS第一水準、第二水準では絶対的な漢字の量が不足しているため、1990年に「情報交換用漢字符号-補助漢字(JIS X 0212)」として5801文字が規定されたもの。
出典 https://kotobank.jp/word/%E8%A3%9C%E5%8A%A9%E6%BC%A2%E5%AD%97-11854

利用できない文字を集めた文字セット

#### 気づき
補助漢字を3バイトで表すのか。

### Unicode(ユニコード)
```全世界の文字コードを一つに統一```したもの。
```各国のあらゆる文字を一つのコード体系で表そうとした文字コード```。
最初は2バイトだったが今は4バイトまで拡張している。

### 疑問　コード体系
* コード体系
ID とコードは、Oracle にすれば無関心?なのであるが、人間には、そのデータの位置付けは大きく異なる。
コード
ある文字列や数字列において、1 つ、または、複数のパートによって意味づけされた文字・数字の集合。
識別子(ID)
コードのような体系の無い(一意に識別するための)番号もしくは文字列をあらわす
文字列と文章の違いを考えればわかりやすい。
出典 https://www.shift-the-oracle.com/words/code-structure.html#:~:text=%E3%81%82%E3%82%8B%E6%96%87%E5%AD%97%E5%88%97%E3%82%84%E6%95%B0%E5%AD%97,%E3%81%9F%E6%96%87%E5%AD%97%E3%83%BB%E6%95%B0%E5%AD%97%E3%81%AE%E9%9B%86%E5%90%88%E3%80%82&text=%E6%97%A5%E6%9C%AC%E3%81%A7%E3%81%AF%20%E8%B2%A1%E5%9B%A3%E6%B3%95%E4%BA%BA%20%E6%B5%81%E9%80%9A,%E4%B8%80%E5%85%83%E7%AE%A1%E7%90%86%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82

* 例えば型番（品番）が「TXD11-100×60-R」で、「TXD11」は製品のシリーズを表し「100×60」はサイズを表し「R」は色を表すというようなコード体系があります。
出典 https://www.synapse-i.jp/public-relations/201708056745#:~:text=%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82-,%E4%BE%8B%E3%81%88%E3%81%B0,-%E5%9E%8B%E7%95%AA%EF%BC%88%E5%93%81%E7%95%AA%EF%BC%89%E3%81%8C

英数字の文字列の構造のことをコード体系というのかな。（？）
そうしておこう。

## コンピュータで使われている文字符号の説明のうち、適切なものはどれか？
### 疑問　文字符号とは？
検索したがなかなかその単語では表示されなかったために近いであろうもので理解する。
しかし今まで文字コードの説明を受けていたので文字コードのことだろうと考える。

#### 文字符号化方式とは
コンピュータさんが使う「『文字に割り当てた番号』と『実際にコンピュータさんが扱う数字』の対応表」のこと
出典 https://wa3.i-3-i.info/word15292.html
Github EnvironmentのススメとWorkload Identityの問題

# 読者対象
GtihubActionsを軸にCI/CDやDevOpsの起点を作っているプロダクトチーム
## Github Actions Secretのイケてないところ
- Github ActionsはDefaultブランチにactionsの定義ファイルがある場合､任意のFeatureブランチで､そのactions定義ファイルを編集し､commitするだけで､任意のActionsが実行できてしまう｡
- 環境別で処理を記述する場合､`if: env.environment == "development"`といった条件分岐が必要で､記述する必要のあるstepが環境分増えてしまい冗長になりがち｡
:::note warn
つまるところ
- ブランチの作成権限をもつ全てのユーザは任意のActionsを実行できてしまう
- ブランチの作成権限をもつ全てのユーザは任意のSecretにアクセスできてしまう
- 大量のif分岐が発生する
- インフラ構成などに関するActionsのデバッグを試しづらい
(.yamlファイルの書き間違いや分岐処理のミスで､Production環境のSecretを利用してしまう恐れがある｡)
:::

## Github Actions Environmentのメリット

Secretではブランチの作成権限を持つ全てのユーザに等しくセキュア情報へのアクセス・利用を可能にしていた｡
`Environment`を導入し､Branch Protectionを有効にすることで､Secret情報へのアクセスをBranch単位で制限をかけることができる｡

:::note
- 指定したブランチでしかProductionのSecretへアクセスできなくなり､積極的なDeploy検証がしやすくなる
- if分岐を記述せずに､stepに`environment: hogehoge`を加えるだけで`hogehoge`環境のsecretへアクセスできる
:::

## 課題１：Github Actions EnvironmentとWorkload Identity Providerとの相性の悪さ
### Workload Identityとは
例えば､GithubでGoogleCloudの認証を突破し､何らかのAPIを叩きたいとき､
従来の事前合意したキーを用いた認証と異なり認証側(例えばGoogleCloud側)で､どのドメイン､どのユーザ､リポジトリetc([トークンが持つ属性](https://github.com/google-github-actions/auth#github-token-format))を指定して､それに合致するトークンだけを認証する方式｡
キーレスなためセキュアで､サービス連携の際に推奨されている｡

### Actions側からの指定方法

すでに､Google側でトークンの指定が完了しており､
Github側でWIP(=Workload Provider Identity）を利用するには
以下の2つだけで良い｡

- `projects/{プロジェクト番号}/locations/global/workloadIdentityPools/my-pool/providers/my-provider`
- `my-service-account@{プロジェクトID}.iam.gserviceaccount.com`
:::note alert
この２つは別にクレデンシャルでもなんでもないので､特権を持たないユーザがActionsに記述してしまうと､かんたんにProduction環境アクセスできてしまう
→折角Environmentで保護したのに､意図的にアクセスできてしまう｡
:::

### 対策
Google側でカスタムトークンの属性を指定できるので､
- リポジトリ(repo)
- ワークフロー(workflow)
- ブランチ(ref)
- 実行ユーザ(actor)
などを指定して縛る
> ref == ref/heads/main
> workflow == MyWorkflow

とか指定してみると､セキュアになる

## 課題２：Github Actions Environment でTerraform Planしづらい
Environmentを導入することで､mainブランチ以外はProduction Secretにアクセスできなくなってしまう｡
Plan用のEnvironmentを追加してやればいいのですが､実際に付与する権限が難しい｡
IAMをViewer権限でざっくり付与してやるだけではうまくいかず､一部サービスに対してはWrite権限が必要｡
でも､そうなると､インフラの操作もできてしまったり､､､答えは､､､なし､､､
7.8 (標準) 尤度比検定8

## 答案

![7.-26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/8eb95738-1f2b-34b8-86b3-844a171ea767.jpeg)
![7.-27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/ca979bd9-8c7d-69c7-7ce2-cd4a6ceb70f6.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
RaspberryPiPicoのUARTでエコーバック

# やりたこと

RaspberryPiPicoのUARTでエコーバック。


# 手順

```C:main.c
#include "pico/stdlib.h"
#include "hardware/uart.h"
#include "hardware/irq.h"

// UART RXのIRQハンドラ
void on_uart_rx() {
    while(uart_is_readable(uart0)) {
        // １文字読む
        uint8_t c = uart_getc(uart0);
        if(uart_is_writable(uart0)) {
            // 読み込んだ文字を書き込み
            uart_putc(uart0, c);
        }
    }
}

// main
int main() {
    
    // GPIOの初期化
    gpio_init(PICO_DEFAULT_LED_PIN);
    // 入出力の設定
    gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);

    // UART0の初期化
    uart_init(uart0, 115200);
    // GPIOの設定
    gpio_set_function(0, GPIO_FUNC_UART);
    gpio_set_function(1, GPIO_FUNC_UART);
    
    // ボーレートの設定
    // 第２引数：　CTSを使うかどうか
    // 第３引数：　RTSを使うかどうか
    uart_set_hw_flow(uart0, false, false);
    // データフォーマットの設定
    // 第２引数：　データビット数
    // 第３引数：　ストップビット
    // 第４引数：　パリティビットを使うかどうか
    uart_set_format(uart0, 8, 1, UART_PARITY_NONE);
    // FIFOバッファを使うかどうか
    uart_set_fifo_enabled(uart0, false);
    // IRQハンドラの設定
    irq_set_exclusive_handler(UART0_IRQ, on_uart_rx);
    // IRQの有効化
    irq_set_enabled(UART0_IRQ, true);
    // RXのみ設定
    // 第２引数：　RXのIRQ
    // 第３引数：　TXのIRQ
    uart_set_irq_enables(uart0, true, false);

    while (true) {
        // HIGHを出力
        gpio_put(PICO_DEFAULT_LED_PIN, 1);
        sleep_ms(300);
        // LOWを出力
        gpio_put(PICO_DEFAULT_LED_PIN, 0);
        sleep_ms(300);
    }
}
```

```cmake:CMakeLists.txt
# CMakeのバージョン
cmake_minimum_required(VERSION 3.12)

# SDKパス/pico_sdk_init()の定義のパス
set(PICO_SDK_PATH $ENV{PICO_SDK_PATH})
set(PICO_SDK_INIT_CMAKE_FILE ${PICO_SDK_PATH}/pico_sdk_init.cmake)

# PICO SDKのCMakeを読み込み
include(${PICO_SDK_INIT_CMAKE_FILE})

# プロジェクト名
project(sample_blink CXX C ASM)

# C Compilerのバージョン
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

# PICO SDK CMakeの初期化
pico_sdk_init()

# コンパイルターゲット
add_executable(main
        main.c
        )

# リンクターゲット
target_link_libraries(main pico_stdlib hardware_uart)

# USBシリアルの設定
pico_enable_stdio_usb(main 0)
pico_enable_stdio_uart(main 1)

# 出力ファイル
pico_add_extra_outputs(main)
```

割り込みハンドラで１文字読み込んで１文字書き込むを繰り返すことで、エコーバックする。

動かすための手順はこちら。

https://qiita.com/ryot0/items/43bdf2c8f137fd26da86

screenコマンドでエンターキーを入力すると、CRが入力され、Ctrl-jでLFが入力される。
AWS セキュリティの設計原則とAWS WAF・AWS Shieldについて（自分用メモ

セキュリティの設計原則は7つ。
・強力なアイデンティティ基盤を実装する … 最小権限の原則を実装し、AWSリソースの使用に適切な認証をします。最小権限の原則とは、ユーザーやプログラムが作業を完遂するために必要な最低限の権限で操作を行うことです。
・トレーサビリティを実現する … システムに対してリアルタイムでの監視、通知、監査を行うことにより、問題が発生した場合に素早く対応できます。
・全レイヤーでセキュリティを適用する … 一部の機能に対して重点的にセキュリティを実装するのではなく、仮想サーバー、ネットワーク、ロードバランシング、アプリケーション、コードなど、利用する全てのレイヤーに渡ってセキュリティを実装します。
・セキュリティのベストプラクティスを自動化する … セキュリティの仕組みをソフトウェアベースで自動化することによって、安全にシステム化を迅速にしつつコスト効果を高くします。
・転送中および保管中のデータを保護する … データの機密性レベルに応じた、暗号化、トークン分割、アクセスコントロールなどを適用します。
・データに人の手を入れない … データへの直接アクセスや手動作業を減らすことで、機密性の高いデータの消失など人為的ミスのリスクを軽減します。
・セキュリティイベントに備える … システムの要件に合わせたインシデント発生後のプロセス（検出、調査、復旧）とインシデント管理の方針を決めて、セキュリティイベントに備えます。


・AWS WAF（Web Application Firewall）
脆弱性を突く攻撃（クロスサイトスクリプティングやSQLインジェクションなど）から、Webアプリケーションを保護するサービス。「Web ACL」というアクセスコントロールリストで、IPアドレス、HTTPヘッダー、HTTP本文、URI文字列などに対してフィルタリングの条件を設定できます。また、Web ACLには接続元のIPアドレスから国別にアクセスを制限できる機能もあります。
AWS WAFは、Amazon CloudFront、ALB、Amazon API Gateway、AWS AppSyncに割り当てて利用します。


Amazon CloudFrontには、「地理的制限」というクライアントからのアクセスを国別に制限できる機能があります。クライアントの接続情報から接続元の国を判別して、ホワイトリストに設定した国からのアクセスは許可、ブラックリストに設定した国からのアクセスは拒否します。

また、AWS WAFの「Web ACL」にも地理的制限と同等の機能があります。


・AWS Shield
AWS Shieldは、DDoS攻撃からの保護に特化したサービスです。すべてのAWSユーザーが無償で利用できる「AWS Shield Standard」と、有償版の「AWS Shield Advanced」があります。

○AWS Shield Standard
ネットワーク層およびトランスポート層への一般的なDDoS攻撃からAWSリソースを保護します。デフォルトで有効になっています。

○AWS Shield Advanced
Amazon CloudFront、Amazon Route 53、AWS Global Acceleratorなどを標的としたDDoS攻撃に対して、高度な保護サービスを利用できます。例えば、DDoS攻撃発生時のモニタリングやレポート、AWSのDDoS対応チームによるサポート、攻撃によって増加したAWS利用料金の補填などがあります。
viteでfirebase v9のenvを書くときの注意

## 結論
viteを使う場合は
envの書き方が違う


.env

```
VITE_apiKey=""
VITE_authDomain=""
VITE_projectId=""
VITE_storageBucket=""
VITE_messagingSenderId=""
VITE_appId=""
```


src/firebase.js (名前は仮)

```
//Firebase ver9 compliant (modular)
import { initializeApp } from "firebase/app";
import { getAuth } from "firebase/auth";
import { getFirestore } from "firebase/firestore";


const firebaseApp = initializeApp({
  //ここがviteの場合が違う ⇨ ipmort.meta.env
  apiKey: import.meta.env.VITE_apiKey,
  authDomain: import.meta.env.VITE_authDomain,
  projectId: import.meta.env.VITE_projectId,
  storageBucket: import.meta.env.VITE_storageBucket,
  messagingSenderId: import.meta.env.VITE_messagingSenderId,
  appId: import.meta.env.VITE_appId,
});

//Firebase ver9 compliant (modular)
export const auth = getAuth(firebaseApp);
export const db = getFirestore(firebaseApp);

```


## ドキュメント
https://vitejs.dev/guide/env-and-mode.html#env-files


## まとめ
REACTの場合のプロジェクトの場合は

```REACT_APP_FIREBASE_APIKEY=""
REACT_APP_FIREBASE_DOMAIN=""
REACT_APP_FIREBASE_PROJECT_ID=""
REACT_APP_FIREBASE_STORAGE_BUCKET=""
REACT_APP_FIREBASE_SENDER_ID=""
REACT_APP_FIREBASE_APP_ID=""
```

みたいに書いていたが
Viteを使うときは説明書をみなくてはだめですね！反省！
XPP AUTで出力されるdatファイルの見方


# 概要
分岐解析用ソフトXPP AUTにおいて、標準のeps出力機能を用いずに、datファイルを出力してそれをpythonのmatplotlibを用いてpdfに変換したほうが見やすい場合があります。しかし、XPP AUTで出力されるdatファイルのどの列が何を表しているのかを毎回忘れてしまうので、ここに記します。XPP AUTで出力できるdatファイルにはdiagram.datとall info.datの2種類があります。

[追記]
パラメータの値に対して各変数の初期値が記入されたinitdata.datというものも存在します。



# datファイルの具体例
[diagram.datの場合]
6.00084 0.995252 0.995252 2 2 0
4.29298 0.947896 0.947896 4 7 0
...



[all info.datの場合]
2 2 0 6.00084 5 6.80197 0.995252 0.622961 0.364544 0.500457 0.561709 0.995252 0.622961 0.364544 0.500457 0.561709 1.07148e-05 0 0.657274 0.869888 0.657274 -0.869888 0.00131335 0 0.52549 0 
4 -7 0 4.29298 4.29298 6.04366 0.947896 0.602789 0.411466 0.465021 0.533905 0.947896 0.602789 0.411466 0.465021 0.533905 1.07148e-05 0 0.657274 0.869888 0.657274 -0.869888 0.00131335 0 0.52549 0
...



# 各列の意味
[diagram.datの場合]
一列目：その点の横軸の値
二列目：その点の縦軸の値（上限）
三列目：その点の縦軸の値（下限）
四列目：その点の安定性を表す。具体的には以下の通り。

| 1 | 2 | 3 | 4 |
| :-: | :-: | :-: | :-: |
| 安定平衡点 | 不安定平衡点 | 安定周期解 | 不安定周期解 |

五列目：ブランチ br（その枝分かれが始まったラベルのこと。例えば下図のように割り振られる。）
![ラベルと枝分かれの対応.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727139/4cf247bb-b37c-793b-9efd-8fedeb4a947e.jpeg)
六列目：2パラ分岐図を作成した際に関与するパラメータ（分岐点の種類？）

平衡点の場合は二列目と三列目の値は必ず同じになります。

[all info.datの場合]モデルの次元をnとする.
※一列目〜三列目はdiagram.datの四列目〜六列目と同等
一列目：安定性
二列目：ブランチ br
三列目：分岐点の種類
四列目：第一パラメータ
五列目：第二パラメータ
六列目：period
(6+1)列目〜(6+n)列目：各変数の値（上限）
(6+n+1)列目〜(6+2n)列目：各変数の値（下限）
(6+2n+1)列目〜(6+4n)列目：各固有値の実部、虚部が交互に書かれている

計(6+4n)列のファイルになっていると思います。
【C++】基礎を学ぶ⑳～多態性～

# 多態性
**多態性**とは、同じ名前の関数を呼び出して異なる処理を実行すること
**ポリモーフィズム**とも呼ばれる
**オーバーロード**と**オーバーライド**で実現することができる

## オーバーロード
**1つ**のプログラムに**同じ名前**で**引数の数**や**型が**違う関数を作成すること

## オーバーロードを用いたプログラム
```cpp
#include <iostream>
using namespace std;
 
class Human {
  public:
    void show(){
      cout << "引数なしのshow関数" << endl;
    }
    void show(string str){
      cout << "引数が" << str << "のshow関数" << endl;
    }
};

int main() {
  Human human;
  human.show();
  human.show("Taro");
  return 0;
}
```
```
引数なしのshow関数
引数がTaroのshow関数
```

## オーバーライド
基底クラスで関数を**継承**した派生クラスで**独自**に定義しなおして**上書き**すること
**基底クラス**のオーバーライドする関数に`virtual`をつける
基底クラスでオーバーライドされる関数のことを**仮想関数**という

## オーバーライドを用いたプログラム
```cpp
#include <iostream>
using namespace std;
 
class Human {
  public:
    virtual void show(){
      cout << "Human class" << endl;
    }
};

class Student : public Human{
  public:
    void show(){
      cout << "Student class" << endl;
    }
};

int main() {
  Human human;
  human.show();
  Student student;
  student.show();
  return 0;
}
```
```
Human class
Student class
```

### 派生クラスから仮想関数を呼び出す
以下のように書くことで**派生クラスから**継承元の基底クラスの**仮想関数**を呼び出すことができます
```cpp
派生クラスのオブジェクト.基底クラス::仮想関数名;
```
## サンプルプログラム
```cpp
#include <iostream>
using namespace std;
 
class Human {
  public:
    virtual void show(){
      cout << "Human class" << endl;
    }
};

class Student : public Human{
  public:
    void show(){
      cout << "Student class" << endl;
    }
};

int main() {
  Student student;
  student.Human::show();
  return 0;
}
```
```
Human class
```

## 次の記事
[【C++】基礎を学ぶ㉑～テンプレート～](https://qiita.com/rapirapi/items/31e424dbd8b1df8edbcb)
Octave で相関係数行列，分散共分散行列

# Octave で相関係数行列，分散共分散行列

データ行列のすべての 2 列の組み合わせで，相関係数，分散共分散を計算する。

    usage:
    corr (x)
    corr (x, y)

    cov (x)
    cov (x, y)

    x, y: データ行列


## 使用例


```matlab
pkg load statistics % statistics が必要
```


```matlab
format long % 表示精度を高くする（任意）
x = csvread("iris.csv")(2:151, 2:5);
```

## 相関係数行列


```matlab
corr(x)
```

    ans =
    
       1.000000000000000  -0.117569784133002   0.871753775886583   0.817941126271576
      -0.117569784133002   1.000000000000000  -0.428440104330540  -0.366125932536440
       0.871753775886583  -0.428440104330540   1.000000000000000   0.962865431402796
       0.817941126271576  -0.366125932536440   0.962865431402796   1.000000000000000
    



```matlab
a = x(:, 1:2);
b = x(:, 3:4);
corr(a, b)
```

    ans =
    
       0.871753775886583   0.817941126271576
      -0.428440104330540  -0.366125932536439
    


## 分散共分散行列


```matlab
cov(x)
```

    ans =
    
     Columns 1 through 3:
    
       6.856935123042505e-01  -4.243400447427291e-02   1.274315436241610e+00
      -4.243400447427291e-02   1.899794183445188e-01  -3.296563758389263e-01
       1.274315436241610e+00  -3.296563758389263e-01   3.116277852348994e+00
       5.162706935123044e-01  -1.216393736017898e-01   1.295609395973154e+00
    
     Column 4:
    
       5.162706935123044e-01
      -1.216393736017898e-01
       1.295609395973154e+00
       5.810062639821029e-01
    



```matlab
cov(a, b)
```

    ans =
    
       1.274315436241611   0.516270693512304
      -0.329656375838926  -0.121639373601790
cookiecutterを使って自分専用のpythonプロジェクトテンプレートを作る


## 概要 
cookiecutter(クッキーカッター)を使いpythonの自分専用のプロジェクトのひな型をつくり、そこからプロジェクトを作成する。

## インストール
```shell
pip install cookiecutter
```



## 利用
プロジェクトを作りたいフォルダで以下を実行する。
プロジェクト名などの質問が来るので答えていく


* フル版
```shell
python -m cookiecutter gh:audreyfeldroy/cookiecutter-pypackage
```

* 簡易版
```shell
python -m cookiecutter gh:asweigart/cookiecutter-basicpythonproject
```

## 自分専用のテンプレートを作りgithubにアップして使う
* githubに自分のアカウントがあることが前提とします。(hirayama-yuuichiの所はご自分のgithubの値で読み替えてください)
* まず、元となるテンプレートをforkする。
[asweigart/cookiecutter-basicpythonproject](https://github.com/asweigart/cookiecutter-basicpythonproject)を開き右上の「fork」をクリック「+Create a new fork」よりforkを作成する。
* 先ほどforkしたcookiecutter-basicpythonprojectのcloneを作る。
  localにて
  
  ```shell
  git clone https://github.com/hirayama-yuuichi/cookiecutter-basicpythonproject.git
  ```

* 修正の必要な部分を修正する（今回は例としてauthor_nameを固定の名前にする）
  * cookiecutter.json　から 
    "author_name": "Susie Softwaredeveloper" の行をさがし、入力例「"Susie Softwaredeveloper"」の部分を「hirayama yuuichi」(自分の環境にあった名前にしてください)に変更する
  * 他の部分も同様に置き換える。


* commitする
```shell
cd  cookiecutter-basicpythonproject/
git commit -am "Changed the parameters of name"
```

応答メッセージ
```shell 
[master de37b0d] Changed the parameters of name
 7 files changed, 11 insertions(+), 15 deletions(-)
```

* githubにpushする
```shell
git push
```

応答メッセージ
```shell 
Enumerating objects: 24, done.
Counting objects: 100% (24/24), done.
Delta compression using up to 12 threads
Compressing objects: 100% (13/13), done.
Writing objects: 100% (13/13), 1.42 KiB | 161.00 KiB/s, done.
Total 13 (delta 7), reused 0 (delta 0)
remote: Resolving deltas: 100% (7/7), completed with 7 local objects.
To https://github.com/hirayama-yuuichi/cookiecutter-basicpythonproject.git
   c29a556..de37b0d  master -> master
```
* 使ってみる

```shell
python -m cookiecutter gh:hirayama-yuuichi/cookiecutter-basicpythonproject
```

応答メッセージ(例として「XYZ Loder」というプロジェクトを作る)
```shell
project_name [Basic Python Project]: XYZ Loder
module_name [basicpythonproject]: xyzloder
project_version [0.1.0]: 
project_short_description [A basic Python project.]: load xyz tool
```


## 参考
[きれいなPythonプログラミング クリーンなコードを書くための最適な方法](https://book.mynavi.jp/ec/products/detail/id=127578)
[ORGANIZING YOUR CODE PROJECTS WITH GIT](https://inventwithpython.com/beyond/chapter12.html)
[audreyfeldroy/cookiecutter-pypackage](https://github.com/audreyfeldroy/cookiecutter-pypackage)
[cookiecutter](https://cookiecutter.readthedocs.io/en/stable/)
Windows11 コンテキストメニューを Windows10 以前の仕様に戻す

# これは何？
~~こいつを叩き潰し~~「その他のオプションを表示」を選択した際に出るコンテキストメニューに標準化する方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/e638fad1-a4d9-7c34-c0a8-76707ed242d9.png)

# 結論

以下のレジストリ キー を追加します。
HKEY_CURRENT_USER\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32 

その後、レジストリ エントリの "(既定)" について、値を空に設定します (= "(値の設定なし)"では NG です)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/b9d541f9-6c9e-c7ce-59a9-1c153e0b4cfb.png)

※ NG 例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/9b236658-12bd-5813-0239-2f4df43b2f2a.png)

レジストリ更新後、**再起動**でコンテキスト メニューが変更されます。

下記コマンドがレジストリ登録においての同等の処理となります(再起動は手動で行うこと)。

```cmd:context_menu_change2win10.bat
reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32 /f /ve
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/aa651464-5487-b875-78b7-70716fb29322.png)

# 戻し方

当該レジストリ削除後、再起動で Windows11 コンテキストメニューに復帰します。

下記コマンドが同等の処理となります。
```cmd:context_menu_back2win11.bat
reg delete HKEY_CURRENT_USER\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2} /f
```

# 補足(というか推測)
・CLSID は、COM クラス オブジェクト識別用の OS 全体で一意の識別子。
・レジストリ キー CLSID における InprocServer32 の役割は下記の通り。
>Registers a 32-bit in-process server and specifies the threading model of the apartment the server can run in.
>(32ビットプロセス内サーバーを登録し、そのサーバーのアパートメントが実行可能なスレッドモデルを指定します)

・InprocServer32 は値が設定されていない or 存在しない場合と 何かしら構成されている場合で挙動が変わる
　(これが"値の設定なし"のままではNGな理由)。
>If ThreadingModel is not present or is not set to a value, the server is loaded into the first apartment that was initialized in the process. 
>(ThreadingModel が存在しない、または値が設定されていない場合、サーバーはプロセス内で初期化された最初のアパートメントにロードされます)

{86ca1aa0-34aa-4e8b-a509-50c905bae2a2} は コンテキストメニューを指す。
また、デフォルトでの挙動で Windows11 用のコンテキストメニューを呼び出す処理がある。
この設定は InprocServer32 に値を何かしら設定することでアパートメントへの呼び出しを回避する、というところか。

再起動でないと反映されない Process Monitor タイプの設定なのでちょっと追いにくいのでここまで。
気が向いたらおいおい調べてみる。かも。

# 出典 
https://docs.microsoft.com/en-us/windows/win32/com/clsid-key-hklm

https://docs.microsoft.com/en-us/windows/win32/com/inprocserver32
複数画像を想定したCarrierWaveの使い方

## 概要
ファイルアップロード機能を提供するGem。
いろいろなアップロード機能を提供するGemはあるが、その中の一つ。

## 導入手順
まずはGemfileに追加。
```
gem 'carrierwave', '~> 2.0'
```
<br>
<br>

uploaderクラスを作成。
```
rails generate uploader Avatar
```
<br>
<br>

そうすると以下のファイルが作成される。
app/uploaders/avatar_uploader.rb
```
class AvatarUploader < CarrierWave::Uploader::Base
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  def default_url
    'sample.jpg'
  end
  
  def extension_allowlist
    %w(jpg jpeg gif png)
  end
end
```
<br>
<br>

次に以下のコマンドで画像を保存するカラムを作成する。
```
rails g migration add_avatar_to_users avatar:string
rails db:migrate
```
これだと該当のテーブルに画像カラムを作成しているが、画像を複数保存する場合は画像保存ように別テーブルを作成することをお勧めする。
(一応、公式でもMultiple file uploadsにてJSON型のカラムを作り、そこに複数件保存するよう書かれているが、ハッシュ化までは考慮されていない。)
[参考記事[1]](https://qiita.com/yuya-yuya/items/2a42782ea4c2c1f38125)
<br>
<br>

次にモデルに以下を追加する。
```
class User < ApplicationRecord
  mount_uploader :avatar, AvatarUploader
end
```
これによりレコードの保存時に自動的に画像ファイルをpublic/uploads配下に保存できるようになる。そして、DBのavatarカラムには画像ファイル名のみ保存される。
しかし、これだけではファイルがそのままの名前で保存されるので、uploaderクラスでfilenameメソッドを定義し、ハッシュ化することをお勧めする。
[参考記事[2]](https://keruuweb.com/rails-carrierwave%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)
<br>
<br>

そして、コントローラーにパラメーターとして追加する。
```
params.require(:user).permit(:email, :last_name, :first_name, :avatar)
```
<br>
<br>

最後にview側
```
投稿フォーム
<%= f.file_field :avatar %>
    
表示方法
<%= image_tag(@user.avatar_url) if @user.avatar? %>
```
c++ template sizeof() windows linux 注意

c++ templeteでsizeof()を使っている時の注意事項

windowsで開発されていたコードをlinux化するというのは開発現場ではよくあることなのだが、仕事中にハマった事について

windowsからlinux化したプログラムの場合、データ型32bit/64bit環境のデータ型の範囲の違いによってバグが出てしまうことがある。
※著者はaws linux2化の開発でハマった。

![整数型.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733821/6e388a7e-cc4b-f254-65f1-85215bf127ba.jpeg)

上記表の通り(下記参考URLより抜粋)、
windowsの場合、long型の変数は4byte(32bit/64bit)として扱われるが、
aws linux2の場合は、8byte(64bit)として扱われてしまうことになる。

その場合、以下のようにtemplete,sizeof()を使ってコードを組んでしまうと、開発環境のデータ型範囲の差異によってバグになってしまうことがある。

```
void templete <class T> test(T _in)
{
    for( int i = 0; i < sizeof(_in) ; i++)
    {
        // 1btyeずつ処理するxxx()という関数を呼び出す場合
        xxx();
    }
}

```

windowsの場合   ：sizeof(_in)=4byteデータとして処理される
aws linux2の場合：sizeof(_in)=8byteデータとして処理される

よって、windowsの場合は4byteデータとして処理されるように実装している為問題ないが、
aws linux2の場合は8byteデータとして処理されるようになってしまうことによって、
xxx()関数内でバグを出してしまう事がある。

よって、windowsからlinux化する時は、sizeof()を使って処理している箇所に問題がない事を検証する事。


(参考URL)
https://marycore.jp/prog/c-lang/data-type-ranges-and-bit-byte-sizes/
How to use GitHub

In order to avoid forgetting how to commit my code to GitHub, I will write down the process as a memo.
# Commit to New Repo

1. Open the Terminal (on the VS code)
1. Going to directly that you would like to commit (write "cd" and just drag and drop the file that you want to commit)
1. Write below on the Terminal
```
1. git init
2. git remote add origin (URL from git Repo)
3. git add .
4. git commit -m 'first commit'
5. git push origin master
```

# To change the Contents
```
1. git add .
2. git commit -m 'first commit'
3. git push origin master
```
Ring Video Doorbell 4 と Amazon Echo Show 15を接続する

## 1. はじめに

Ring(Amazonのグループ企業) Video Doorbell 4 と Amazon Echo Show 15 を Amazonプライムデーで購入したため、セットアップしました。
一戸建ての既存のインターホンの音量が最近なぜか小さくなって、三十数年経過して調子が悪いようなので、ちょうどよいのでインターホン子機を入れ替えました。

ただ、インターホンのボタンの反応が鈍く、実用性が落第です。

## 2. 機材

## 2-1. Ring Video Doorbell 4

Ring Video Doorbell 4 - 外出先でも映像確認や通話が可能なドアベル
https://www.amazon.co.jp/dp/B09HSNXH5P
[<img src="https://m.media-amazon.com/images/I/6196qk2YVHL._SX300_SY300_.jpg">](https://www.amazon.co.jp/dp/B09HSNXH5P)

## 2-2. Chime Pro

Amazon.co.jp: 【新登場】Ring Chime Pro（チャイムプロ） : Amazonデバイス・アクセサリ
https://www.amazon.co.jp/dp/B09G96V3WM
[<img src="https://m.media-amazon.com/images/I/41y+WHKDniL._SX300_SY300_.jpg">](https://www.amazon.co.jp/dp/B09G96V3WM)

## 2-3. カバー

Amazon.co.jp: 【Ring Video Doorbell 4用】 既設ドアホン取替用カバー (1個用ボックス対応) | ブラック : Amazonデバイス・アクセサリ
https://www.amazon.co.jp/dp/B09HSPPDDS
[<img src="https://m.media-amazon.com/images/I/61oernM-lGL._SX300_SY300_.jpg">](https://www.amazon.co.jp/dp/B09HSPPDDS)

## 2-4. Amazon Echo Show 15

Amazon | Echo Show 15 - スマートディスプレイ
https://www.amazon.co.jp/dp/B08MQNJC9Z
[<img src="https://m.media-amazon.com/images/I/71+cUtOuj1L._AC_SX300_SY300_.jpg">](https://www.amazon.co.jp/dp/B08MQNJC9Z)

## 3. 設定

試行錯誤した結果の概要です。細部を忘れていて詳細は書けません。

1) Ringアプリをスマホかタブレットにインストール
2) Ringアカウント作成(Amazonアカウントとは別)
3) 二段階認証等
4) Amazonアカウントと連携
5) Alexaアプリに「Ring」スキルをインストール
6) RingアプリでRing Video Doorbell 4のデバイスの設定
  a) ビデオの設定
　　HDR：ON
　　録画時間の設定：録画時間 20秒→15秒
  b) スナップショットの撮影
　　1時間ごと→14分ごと
7) Chime Proと連携、Chime Proの中継機経由でRing Video Doorbell 4を接続

## 4. 設置

既存のインターホン子機を、Ring Video Doorbell 4＋純正カバー に入れ替えました。入れ替え工事は地元の電器屋に依頼しました。工事費＋出張料＋若干の部材追加で8千円ちょっと。近所なので出張料がとても安いです。

既存インターホン子機についていたケーブル2本をRing Video Doorbell 4の8-24V端子2つにつけてもらい、常時給電できるようになりました。バッテリーはつけたままですが、充電のための交換は不要です。
既存インターホン親機のベルは鳴らなくなりました。

## 5. 問題点

- インターホンボタンを連打しても反応しません。
- インターホンボタンを押してからEcho Show 15の画面が切り替わるのに10秒くらいかかって、ビデオは使い物になりません。
- Echo Showに予めインターホンのビデオを表示できますが、数分で自動的にホーム画面に戻ってしまいます。
- Chime Proで選択できる音に「ピンポーン」がなく、イマイチです。好きな音は設定できません。
- 既存配線でRing Video Doorbell 4 に給電できていると思ったら、バッテリー残量30%警告がiPadに届いていて、電源が落ちたようで無反応になりました。ただ、インターホンのビデオをかなり見ていたりしたわりに1週間以上もっているので、全く給電されずにバッテリーのみで動いていたとも思えません。よく分からないですがとりあえずバッテリーを充電しています。

## 6. 撤去

なぜかRing Video Doorbell 4が鳴ったり鳴らなかったり、Chime Proが鳴らなくなったりしたので、撤去しました。従来型のインターホン子機に付け替えます。
2022-07-11 apache から file_put_contents で /tmp に書き込んだファイルが見当たらない

<!-----

Yay, no errors, warnings, or alerts!

Conversion time: 0.473 seconds.


Using this Markdown file:

1. Paste this output into your source file.
2. See the notes and action items below regarding this conversion run.
3. Check the rendered output (headings, lists, code blocks, tables) for proper
   formatting and use a linkchecker before you publish this page.

Conversion notes:

* Docs to Markdown version 1.0β33
* Wed Jul 13 2022 23:24:58 GMT-0700 (PDT)
* Source doc: 2022-07-11 apache から file_put_contents で /tmp に書き込んだファイルが見当たらない
* Tables are currently converted to HTML tables.
----->


## 発生した問題

パーミッションは 777 なのに、 /tmp 以下に書き込んだファイルが見当たらない。

`file_put_contents()` の返り値は false でなく数値であり、エラーは発生していないように見える。


## 解決方法

結果として、 systemd-private 以下のディレクトリに保存されていた。


```
[vagrant@localhost ~]$ ls -l /tmp/
total 160
drwxrwxrwx. 3 root    root        17 Jul  8 01:25 systemd-private-2b77b18c2f424fe7afeecfea34d56ab2-chrony
d.service-iIjYVL
drwxrwxrwx. 3 root    root        17 Jul  8 01:32 systemd-private-2b77b18c2f424fe7afeecfea34d56ab2-httpd.
service-ZR83lg
drwx------  3 root    root        17 Jul 11 05:12 systemd-private-646261b943474726b11dec82b8a10c44-chrony
d.service-10BqpD
drwx------  3 root    root        17 Jul 11 05:12 systemd-private-646261b943474726b11dec82b8a10c44-httpd.
service-j3gQ6f
-rwxrwxrwx. 1 vagrant vagrant    112 Jul  8 01:27 vagrant-shell
-rwxrwxrwx. 1 root    root    156589 Jul  8 01:33 x-mon_install_log.txt
[vagrant@localhost ~]$ ls -ld /tmp/
drwxrwxrwt. 11 root root 4096 Jul 11 06:08 /tmp/
```



```
[vagrant@localhost ~]$ sudo ls -l /tmp/systemd-private-2b77b18c2f424fe7afeecfea34d56ab2-httpd.service-ZR8
3lg/tmp/
total 8
-rwxrwxrwx. 1 apache apache 1037 Jul  8 09:05 output2.json
-rwxrwxrwx. 1 apache apache 1006 Jul  8 09:05 output.json
```


作成した output.json は phpunit からコマンドライン経由で呼び出して利用したかったのだが、 /tmp/output.json のパスではアクセスできなかった。

/opt/ 等に適当なディレクトリを作り、そちらに保存することによって解決した。


## 解説

[php - Why can't write info into /tmp directory instead of /var/www/html? - Stack Overflow](https://stackoverflow.com/questions/53700985/why-cant-write-info-into-tmp-directory-instead-of-var-www-html)

systemd が、apache プロセスが利用する用にディレクトリを作成してくれているらしい。
Youtubeの構造化データ用VideoObjectのJsonプロパティ一覧の備忘録

# VideoObjectのJsonプロパティ一覧をJson形式で記載

```
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "SEOで自分の動画のクリック数を上げる施策！？",
  "description": "今回のテーマでは、SEOで自分のYoutubeの動画のクリック率が上がりやすくなる施策をお伝えいたします。
現在、Googleで検索した際に記事ではなく、動画が出てくることがありますが、動画の下に、多少情報が載っていることがあります。これ、実はYoutubeに載っている情報が一部抜粋されて、検索画面上にも出ています。",
  "thumbnailUrl": "http://img.youtube.com/vi/abcdEFG/sddefault.jpg",
  "uploadDate": "2021-05-13",
  "duration": "PT00H30M5S",  
  "publisher": {
    "@type": "Organization",
    "name": "https://自社サイトかsnsのURLなどを追加",
    "logo": {
      "@type": "ImageObject",
      "url": "https://logourl.com",
      "width": 50,
      "height": 50
    }
  },
  "contentUrl": "https://www.youtube.com/watch?v=abcdefg",
  "embedUrl": "https://www.youtube.com/embed/abcdefg",
  "potentialAction": {
    "@type": "SeekToAction",
    "target": "https://www.youtube.com/watch?abcdefg?t={seek_to_second_number}{seek_to_second_number}",
    "startOffset-input": "required name=seek_to_second_number"
  }
   "hasPart": {
    "@type": "Clip",
    "name": "Cat jumps",
    "startOffset": 30,
    "url": "http://www.example.com/example?t=30"
  }
  "interactionStatistic":
  {
    "@type": "InteractionCounter",
    "interactionType": { "@type": "WatchAction" },
    "userInteractionCount": 12345
  }
}
</script>
```

※target欄には、Youtube URLの末尾に?t={seek_to_second_number}をつける。
※hasPartはclip
※ClipとSeekToActionは同時に載せてもいい？?
　上記のように同時に載せたらどうなるでしょうか？知っている方教えてください！
※interactionStatisticは再生回数
※PT00H30M5S = 30分5秒」の再生時間を表します。
※contentUrl=一般的な視聴者が視聴しているURL
※embedUrl = webサイト記事に埋め込む用のURL
※contentUrlの記載は現在も必須???↓過去記事参考
https://www-suzukikenichi-com.webpkgcache.com/doc/-/s/www.suzukikenichi.com/blog/contenturl-property-is-required-for-guided-recipes/
※ちなみに、載せているURL等々は適当です。


## ClipとSeecToActionのざっくりの違い
・Clipは手動
・SeecToActionはYoutubeに登録された情報をもとにGoogleに自動で識別させる
違っていたらすみません・・・・。

以上です。
間違ってるよー！ここはこうした方がいいかも！等々ございましたら、ご指摘いただけますと嬉しく励みになります。
最後まで見ていただいた方、ありがとうございます。
RaspberryPiPicoでhello, world

# やりたいこと

RaspberryPiPicoのUART0を使ってhello, worldする。


### 手順

```C:main.c
#include "pico/stdlib.h"

int main() {
    // stdioの初期化
    stdio_init_all();
    // GPIOの初期化
    gpio_init(PICO_DEFAULT_LED_PIN);
    // 入出力の設定
    gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
    while (true) {
        // HIGHを出力
        gpio_put(PICO_DEFAULT_LED_PIN, 1);
        sleep_ms(300);
        // LOWを出力
        gpio_put(PICO_DEFAULT_LED_PIN, 0);
        sleep_ms(300);
        // uartでhello, worldを出力
        printf("hello, world.\n");
        sleep_ms(300);
    }
}
```

```cmake:CMakeLists.txt
# CMakeのバージョン
cmake_minimum_required(VERSION 3.12)

# SDKパス/pico_sdk_init()の定義のパス
set(PICO_SDK_PATH $ENV{PICO_SDK_PATH})
set(PICO_SDK_INIT_CMAKE_FILE ${PICO_SDK_PATH}/pico_sdk_init.cmake)

# PICO SDKのCMakeを読み込み
include(${PICO_SDK_INIT_CMAKE_FILE})

# プロジェクト名
project(sample_blink CXX C ASM)

# C Compilerのバージョン
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

# PICO SDK CMakeの初期化
pico_sdk_init()

# コンパイルターゲット
add_executable(main
        main.c
        )

# リンクターゲット
target_link_libraries(main pico_stdlib)

# USBシリアルの設定
pico_enable_stdio_usb(main 0)
pico_enable_stdio_uart(main 1)

# 出力ファイル
pico_add_extra_outputs(main)
```

ポイントは、pico_enable_stdio_usbとpico_enable_stdio_uartでprintfの向き先を制御すること。
両方ONにすることもできて、その場合は両方に出力される。

これをデプロイして、AE-TTL-232Rを使ってMacとシリアルで通信する。
接続は以下の通り。

 - PICO GND - AE-TTL-232R GND
 - PICO URART0 TXD - AE-TTL-232R RXD
 - PICO URART0 RXD - AE-TTL-232R TXT

3.3Vで通信する必要があるので、AE-TTL-232RのSW2はOFFに設定しておく。


### テスト

Macから以下のコマンドでシリアルポートに接続すると、hello, worldが出力されているはず。

```shell
screen /dev/cu.usbserial-A1032LOB 115200,,cs8,-parenb,-cstopb
```
フナイ Fire TV搭載テレビF340とAmazon Echo Show 15を接続

## 1. はじめに

フナイF340/F140とAmazon Echo Show 15をAmazonプライムデーで購入したため、F340とEcho Show 15を接続することにしました。あと、F140とEcho Show 5を接続します。

## 2. 機材

## 2-1. フナイ F340 55型

Amazon.co.jp: フナイ 55V型 4K液晶テレビ Fire TV 搭載 Alexa 対応 4K ダブルチューナー 内蔵 外付けHDD対応(裏番組録画可能) FL-55UF340 2022年モデル メーカー3年保証 : 家電＆カメラ
https://www.amazon.co.jp/dp/B09R4NCBBL
[<img src="https://m.media-amazon.com/images/I/71tTMYesKRL._AC_SX300_SY300_.jpg">](https://www.amazon.co.jp/dp/B09R4NCBBL)

## 2-2. フナイ F140

Amazon.co.jp: フナイ 32V型 液晶テレビ Fire TV 搭載 Alexa 対応 ダブルチューナー 内蔵 外付けHDD対応(裏番組録画可能) FL-32HF140 : 家電＆カメラ
https://www.amazon.co.jp/dp/B09R4M4F3D
[<img src="https://m.media-amazon.com/images/I/71rNZVecuaL._AC_SX300_SY300_.jpg">](https://www.amazon.co.jp/dp/B09R4M4F3D)

## 2-3. Amazon Echo Show 15

Amazon | Echo Show 15 - スマートディスプレイ
https://www.amazon.co.jp/dp/B08MQNJC9Z
[<img src="https://m.media-amazon.com/images/I/71+cUtOuj1L._AC_SX300_SY300_.jpg">](https://www.amazon.co.jp/dp/B08MQNJC9Z)

## 3. 設定

スマホ、タブレットのアレクサアプリで、
「TV・ビデオの設定」-「Fire TV」-「デバイスをリンクまたは管理」- Fire TV端末を選択 - 「次へ」 - Echo Show 15を選択 - 「デバイスを接続」

## 4. 音声操作

## 4-1. Amazon Echo Show

「アレクサ、テレビをつけて」
「アレクサ、テレビを消して」
「アレクサ、テレビオン」
「アレクサ、テレビオフ」
「アレクサ、テレビ音量アップ」(5上がる)
「アレクサ、テレビ音量ダウン」(5下がる)

F340の記事のメーカー説明だとチャンネルを進めるのはできるそうだけど、方法が見つからず。
「1チャンネル」などでの指定もできず。

## 4-2. フナイF340

アレクサボタンを押しながら
「ユーチューブ」
AWS: Amplify で React をデプロイ

React を S3 にデプロイする方法です。
Amplify を使います。

プロジェクトの作成

```bash
npx create-react-app react05
cd react05
yarn start
```

ページを修正

```src/App.js
import './App.css';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
	  <p>こんにちは</p>
	  <blockquote>
	  <p>Jul/17/2022 PM 12:25</p>
	  </blockquote>
      </header>
    </div>
  );
}

export default App;
```

Amplify の設定

```bash
amplify init
amplify add hosting
```

設定ファイルの修正
"DomainName" を "RegionalDomainName" にします。

```json:amplify/backend/hosting/S3AndCloudFront/template.json
(省略)
"Origins": [
            {
              "DomainName": {
                "Fn::GetAtt": [
                  "S3Bucket",
                  "RegionalDomainName"
                ]
              },
(省略)
```

デプロイ

```bash
amplify publish
```

実行の様子

```text
$ amplify publish
⠧ Fetching updates to backend environment: dev from the cloud.Overrides functionality is not implemented for this category
✔ Successfully pulled backend environment dev from the cloud.

    Current Environment: dev
    
┌──────────┬─────────────────┬───────────┬───────────────────┐
│ Category │ Resource name   │ Operation │ Provider plugin   │
├──────────┼─────────────────┼───────────┼───────────────────┤
│ Hosting  │ S3AndCloudFront │ No Change │ awscloudformation │
└──────────┴─────────────────┴───────────┴───────────────────┘

No changes detected

? Do you still want to publish the frontend? Yes

> react05@0.1.0 build
> react-scripts build

Creating an optimized production build...
Compiled successfully.

File sizes after gzip:

  46.52 kB  build/static/js/main.a665071d.js
  1.78 kB   build/static/js/787.edd8f98f.chunk.js
  541 B     build/static/css/main.073c9b0a.css

The project was built assuming it is hosted at /.
You can control this with the homepage field in your package.json.

The build folder is ready to be deployed.
You may serve it with a static server:

  npm install -g serve
  serve -s build

Find out more about deployment here:

  https://cra.link/deployment

frontend build command exited with code 0
Publish started for S3AndCloudFront
✔ Uploaded files successfully.
Your app is published successfully.
https://drqynl1******.cloudfront.net
```

ブラウザーでアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5fa916b5-001f-117a-cefc-635d7093f22d.png)