OmniAICreator/Qiita-1.07M huggingface dataset:
バルクインサートについて

## バルクインサート（Bulk Insert）
バルクインサート（Bulk Insert）は、データベース管理システム（DBMS）に大量のデータを効率的に挿入するための手法。

デ一度に大量のデータをデータベースに挿入する場合、一つずつの挿入クエリを実行すると処理が非常に遅くなる可能性があります。
バルクインサートは、この問題を解決するために開発されました。

バルクインサートでは、一括してデータを挿入するための特別な構文やメソッドを使用します。これにより、単一の操作で大量のデータをデータベースに追加することができます。
一般的に、バルクインサートは、データのテキストファイルやスプレッドシートなどからデータを取り込む際に使用されます。


バルクインサートの主な利点は次のとおりです：

１．高速なデータ挿入: バルクインサートは、複数のデータ行を一度にデータベースに挿入するため、単一の挿入クエリよりも高速に処理することができます。これにより、大量のデータをより効率的に取り込むことができます。

２．トランザクションの最適化: バルクインサートでは、トランザクションを最適化するための機能が提供されることがあります。たとえば、トランザクションをバルク単位でコミットすることで、データの整合性を保ちつつ処理速度を向上させることができます。

３．メモリ使用量の削減: バルクインサートでは、データを一時的にメモリに保持することなく、直接データベースに書き込むことができます。これにより、大量のデータを処理する際のメモリ使用量を削減することができます。
<br>
<br>

## DBMSごとの書き方
MySQL:
```
Syntax: LOAD DATA INFILE 'file_name' INTO TABLE 'table_name' [OPTIONS]

Example: LOAD DATA INFILE 'data.txt' INTO TABLE 'my_table' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
```


SQL Server:
```
Syntax: BULK INSERT 'table_name' FROM 'file_name' [OPTIONS]

Example: BULK INSERT 'my_table' FROM 'data.txt' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n');

```

Oracle:
```
Syntax: INSERT INTO 'table_name' SELECT * FROM EXTERNAL 'file_name' [OPTIONS]

Example: INSERT INTO 'my_table' SELECT * FROM EXTERNAL 'data.txt' USING (FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n');

```

PostgreSQL:
```
Syntax: COPY 'table_name' FROM 'file_name' [OPTIONS]

Example: COPY 'my_table' FROM 'data.txt' WITH (FORMAT CSV, DELIMITER ',', NULL '', HEADER);

```
AmazonGuardDuty の重要度 高(High) をランダムで発生させるスクリプトを作った

# 課題
AmazonGuardDuty で擬似アラートを作成する際、AWS CloudShell で都度コマンドを調べて叩くのが面倒くさい。

# 作成した自動スクリプトの仕組み
AWS CloudShell でスクリプトを叩きます。
内容は発生させたい検出結果タイプのリストをランダムに呼び出し、それを引数に AmazonGuardDuty のコマンドを叩く形にしました。

# 発生させたい検出結果タイプのリストを作成しておく
```shell-session
AWS CloudShell $ vim finding-list
AWS CloudShell $ cat finding-list
Backdoor:EC2/C&CActivity.B
Backdoor:EC2/C&CActivity.B!DNS
Backdoor:EC2/DenialOfService.Dns
Backdoor:EC2/DenialOfService.Tcp
<長いので省略>
UnauthorizedAccess:S3/MaliciousIPCaller.Custom
UnauthorizedAccess:S3/TorIPCaller
```

# AmazonGuardDuty の擬似アラートを作成するコマンドを含んだスクリプトを作成する
```shell-session
AWS CloudShell $ vim Random_GuardDuty.sh
AWS CloudShell $ cat Random_GuardDuty.sh
#!/bin/bash

DATE=`date`
RANDOM_LINE=$(shuf finding-list | head -n 1)
echo $DATE = $RANDOM_LINE
aws guardduty create-sample-findings --detector-id $(aws guardduty list-detectors --query 'DetectorIds' --output text) --finding-types "$RANDOM_LINE"
```

# スクリプトを実行してみる
echo で `$`DATE(dateの時刻表示) と `$`RANDOM_LINE(リストでランダムで拾ってきた検出結果) を表示しています。
```shell-session
AWS CloudShell $ sh Random_GuardDuty.sh 
Wed May 24 16:47:32 JST 2023 = Policy:S3/BucketAnonymousAccessGranted
```

# AmazonGuardDuty のコマンド実施内容の説明
(参考) CLIリファレンス https://docs.aws.amazon.com/cli/latest/reference/guardduty/index.html
![GuardDuty.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/74df6db2-d7e2-db30-7f1e-08ee6e836b3c.jpeg)

# 不定期に実施したい
ランダム時間(1秒～900秒) に動いていて欲しいとかであれば以下コマンドで実施できます。
```shell-session
AWS CloudShell $ while true; do sh Random_GuardDuty.sh; sleep $(shuf -i 1-900 -n 1);done
```
Go言語のポインタについて理解する

# Go言語におけるポインタとは
ポインタはメモリ上のアドレスを表し、そのアドレスに格納された値に対して直接アクセスすることができる。

# ポインタの基本をサンプルコードを交えて
```go
func main() {
    var num int = 10

    var pointer *int

    pointer = &num

    fmt.Println("ポインタの値:", pointer)

    fmt.Println("ポインタ経由の値:", *pointer)

    *pointer = 20

    fmt.Println("変更後の値:", num)
}
```

1. 整数型のnumを定義
1. 整数型ポインタ変数pointerを定義
1. pointerにはnumのアドレス情報が格納されている
1. `*pointer = 20`でpointer経由でnumの値を更新できる

### ※注意1
```go
func main() {
    var num int = 10
    fmt.Println("ポインタの値:", *num)
}
```
これはビルド時にコンパイルエラーを吐く
    => `invalid indirect of num (type int)`

原因としては、numはポインタ変数として定義されていないため

### ※注意２
```go
func main() {
    var num *int
    fmt.Println("ポインタの値:", *num)
}
```
これは実行時にコンパイルエラーを吐く
`panic: runtime error: invalid memory address or nil pointer dereference`

# Go言語の参照渡しについてサンプルコードを交えて
Go言語では、参照渡しを用いて、関数内で変数の値を変更することができる。

```go
package main

import "fmt"

func modifyValue(numPtr *int) {
    *numPtr = 20
}

func main() {
    num := 10
    fmt.Println("変更前の値:", num)

    modifyValue(&num)
    fmt.Println("変更後の値:", num)
}
```

実行結果は以下の通り
```
変更前の値: 10
変更後の値: 20
```

`modifyValue`という関数を定義している。
この関数は、ポインタを受け取り、そのポインタを経由して変数の値を変更することができる。

### ※注意
`modifyValue`関数の引数をポインタではなく、通常の値渡しに変更すると、関数内での値の変更が呼び出し元の変数に反映されなくなる。

```go
package main

import "fmt"

func modifyValue(num int) {
    num = 20
}

func main() {
    num := 10
    fmt.Println("変更前の値:", num)

    modifyValue(num)
    fmt.Println("変更後の値:", num)
}
```

実行結果は以下
```
変更前の値: 10
変更後の値: 10
```


通常の値渡しでは、関数に引数として渡された値はコピーされて関数内で使用される。
ゆえに関数内での変更はコピーされた値に対して行われ、呼び出し元の変数自体には影響を与えない。


# Go言語におけるメソッド定義の際も同様である
以下のサンプルコードを用いる

```go
package main

import "fmt"

type Rectangle struct {
    width  float64
    height float64
}

func (r *Rectangle) Scale(factor float64) {
    r.width *= factor
    r.height *= factor
}

func main() {
    rect := Rectangle{width: 10, height: 5}

    fmt.Println("変更前:", rect)

    rect.Scale(2)

    fmt.Println("変更後:", rect)
}
```

実行結果
```
変更前: {10 5}
変更後: {20 10}
```

1. `Rectangle`構造体を定義
1. ポインタが渡るScaleメソッドを定義
1. `main`関数の中でRectangleのメソッドとして呼び出す


# まとめ
Go言語のポインタを理解する上で理解しておくべきことをまとめた

# 参照
https://www.geeksforgeeks.org/pointers-in-golang/
Google Fonts で link タグどう書くんだっけ？ の調べ方。

# 記事の目的

GoogleのWebフォントを使う時に、Google Fonts のサイトを見つけても、あれ？linkタグの例がどこに書かれていたっけ？と思った人に向けています。

希望のフォントのページを見つけても、そこにはlinkタグの例が見当たりません。どうしたらいいかを知ったのでお教えします。

## linkタグ例の表示方法

1. フォントのページを開いたら、右上のアイコンをクリックします。 ![1820b4c314096781021b6d5cabe5e6f1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64861/04ed1de1-8110-c0b4-3588-99cd441f493a.jpeg)
2. クリックすると右側にウィンドウが表示されます。「You don’t have any fonts yet.　Choose a style to get started.」と表示されます。
![381b43ec7c928711bb8f31326722219c.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64861/e711b3aa-4b22-0d63-20c7-5c38293a159d.jpeg)
3. 今回はnormalサイズのフォントについて調べたいので、 「Select Regular 400」 をクリックします。
4. すると右側に欲しかった link タグの例が表示されます。
![a8cd29717eddbd88a7dbf8edf6649596.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64861/c85a7e00-63d6-5bb0-91b8-effa754330c2.jpeg)

## おわりに

Google Fonts の使い方（linkタグの見つけかた）についての記事でした。参考になりましたでしょうか。

なお、2023年現在のUIで説明していますので、今後変更される可能性はあります。
FreeDOSでもJJY

FreeDOSのTerminalアプリでJJYSの出力を見てみました。

```
C:\NET\TERMINAL>term com1 2400
```

![IMG_20230524_155300.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/daf96f29-d6ee-0fd7-74b2-02f860d2748f.jpeg)

山形県酒田市で昼間に40KHz,60KHzともにデコードできました。40KHzは近いから当然ですがかなり遠い60KHzはおそらく、経路の半分以上が海上になるために受信できるのではないかと思われます。

参考資料

https://qiita.com/yamori813/items/2674288649e34468960a
【JS】非同期のループ処理が終わるのを待って次の処理に進みたい【Vue.js】

## やりたいこと
配列 'Array'の要素の数だけ、API 'featchData'と通信を行い、その処理が全て終わり次第、後続の処理を行いたい

## 実装サンプル
```js
let Array = [{name: 'Tanaka'},{name: 'Suzuki'}]

const startFunction = async () => {
    for (let item of Array) {
        // featchDataをawaitableにするため、新しいPromiseを作成します
        await new Promise((resolve) => {
            featchData(
                {
                    query: item.name,
                },
                (res) => {
                    console.log('res =====', res)
                    resolve() // 処理が完了したらPromiseをresolveします
                },
                (err) => {
                    console.log('err', err)
                    resolve() // エラーでもPromiseをresolveしてループを続行します
                }
            )
        })
    }
    // 以下は、上記のループが完全に終了した後に実行されます
    console.log('ループ終了！')
}
```

## 解説
async/awaitを使用してループ処理が終わるのを待つことができます。

ただし、forEachだとasync/awaitが期待通りに動作しないため、代わりにfor...ofループを使用しています。


このコードでは、await new Promiseの部分でfeatchDataの処理が完了するのを待つようにしており、こ
れにより、各要素での処理が完全に終了した後に次の要素へ移動、全ての要素の処理が終わった後にconsole.log('ループ終了！')を行っています。


## エラーが発生したときにループを終了したいパターン
上記の場合においては、非同期処理がエラーで終了した場合でもループは続行します。エラーが発生しても特定の処理を停止したくない場合に便利です。

もしエラーが発生したらループを終了（または例外をスロー）したい場合は、rejectとtry/catchを使用して以下のように実装できます。

## 実装サンプル
```js
const startFunction = async () => {
  for (let item of Array) {
    try {
        await new Promise((resolve, reject) => {
            featchData(
                {
                    query: item.name,
                },
                (res) => {
                    console.log('res =====', res)
                    resolve() // 処理が完了したらPromiseをresolveします
                },
                (err) => {
                    console.log('err', err)
                    reject(err) // エラーが発生したらPromiseをrejectします
                }
            )
        })
      } catch (err) {
            // エラーハンドリングをここで行うことができます
            // または、エラーを外部に伝播させるために再度throwすることもできます
            throw err
      }
  }
  // ループが完全に終了した後に実行されます
  console.log('ループ終了！')
}
```

上記では、エラーが発生した場合、そのエラーがcatchされ、処理を停止します。その後、エラーをハンドリングするためのコードを実行できます。


以上です。ぜひ参考にしていただければ幸いです。
Mac VScode 「タブによるフォーカスの移動」を解除する方法

# 概要

- VScodeにて「タブによるフォーカスの移動」のモードを解除するショートカットをまとめておく。

![import_{_•_Untitled-1_—_temposmart-next-src.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/aaa1c1c2-e12e-ff5a-9520-d7e14844e170.png)


# 方法

- 「control」 + 「shift」 + 「m」で解除できる。
- 解除状態で上記のキーを押下すると「タブによるフォーカスの移動」モードをONにできる。
業務における質問の仕方について

　業務における質問の仕方が下手な人が多いなというように感じたので、質問を行う基準や話し方をまとめたいと思います。
<img src="https://4.bp.blogspot.com/-6Z_bn3OBtt8/XAnvVYu5lsI/AAAAAAABQnQ/-Tv5U4Hbxt44cIRVfhFRJZrQ5qgNLgsowCLcBGAs/s800/business_woman3_1_question.png" width=100 border=0/>

# はじめに
　この記事は初心者エンジニア含む全ての人に向けた記事です。もし、同じ会社の人でわかりづらい質問をしてくる人がいた場合はこの記事見せてみてください。
　また、この記事は気づいたことやコメントによってより良い記事にしていくため定期的にアップデートします。

# 「結論から話せ！！」
<img src="https://thumb.ac-illust.com/1c/1c887606fb1e2b4e998ef6c17639ee1c_w.jpeg" width=100/>

　まぁ、これがこの記事の結論ではあるんですが「結論から話せ！！」ってなりますよね？例えば学校の授業中に、「先ほど、紅茶を飲み過ぎてその紅茶の利尿作用と飲んだ量の影響でお手洗いに行きます。」というのと「トイレに行きます。」というのは意味に違いはなくどっちでも教員はOKしますよね？
　つまり、意思を伝えるのには結論から話すのが最適な方法なのです。
　ちなみに、優秀なコンサルの会社では最初にこれを教えるらしいです。

# あなた、解決のための努力した？
<img src="https://3.bp.blogspot.com/-qRt6UrnektI/Wc8f7Ps8Y5I/AAAAAAABHJQ/0fvRqb00sYgut77lyvAp0W8nMfeZAcf4wCLcBGAs/s800/study_man_normal.png" width=100>

　「素人なのでわからない」は正しいのですが努力ってしました？あなたが質問をするということは、被質問者の時間を使ってもらうことになります。当然ですが締め切り２時間前とかになると努力をせずに、すぐに質問をした方がベターなのですが、余裕があるときは「解決するための努力をしましたか？」となります。また、前述した[「結論から話せ！！」](「結論から話せ！！」)に書いた結論を伝えた後に何をしたかという努力を伝えると相手も「自分の思いついていた方法ではできないのか」ということに気づけます。
　「じゃあ、今後努力するのでどのタイミングまで分からなければ質問をすれば良いでしょうか？」となりますが、Googleの社員さんの話をすると「15分は自己努力、15分は検索して努力、それから質問」らしいです。自分はこれを参考に「15分は自己努力、15分は検索して努力、トイレで思考、それから質問」にしているのですが、意外とトイレで思考で解決策が出るので質問に到達しづらいですね。

# 質問をすることは悪ではない
　たまに、申し訳ないような態度で質問してくる人がいます。また、「お時間よろしいでしょうか？」みたいな枕詞をつけて質問を始めてきます。時間の無駄なので「〜〜さん、〜〜についてお聞きしたいのですが〜〜〜」という話し方の方がスムーズです。被質問者は「お時間」がなかった場合には、名前を呼んだタイミングで「ちょっっと待って」というはずなので何も気にせずに質問に入りましょう。
　むしろ、質問をせず無駄に時間を消費することが最も悪であると認識しましょう。

# 結論？
　上に書いたことが全てですが、努力をした上で「結論→何をしたか？」の順で話しましょう。
　また、質問をしないことで効率を下げるくらいなら他人に質問をして解決に向かいましょう。
【個人開発】 自分でつくる英単語帳アプリをリリースしました

# 背景
自分でつくる単語帳アプリをリリースしました。
https://tes-tan.me/
![testan-vision.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3445220/101d2881-c099-cce8-343c-2bb2a1e2e470.png)
アプリといってもWebサービスです。
未経験でフロントエンジニアになろうと思い、Progateやドットインストールで独学をすすめていたのですが、就職のために1つくらいプロダクトを開発する経験をしようと思いつくりました。
単語アプリをつくった理由は、英会話の勉強をしている姉が、苦手な単語を覚えるのに苦労していたことです。
英単語って、苦手な単語・覚えられない単語はいつまで経っても覚えられないし、覚えた単語に時間を使うのももったいない。
そこで、復習にフォーカスできる英単語アプリをつくろうと思いました。

# 機能
提供する機能は、初めての開発ということもあり、できるだけシンプルにしました。

①単語登録 画像 単語を登録できます。英語-日本語の登録ができます。
②テスト機能 画像 登録した単語をランダムに出題します。
正答率などに応じて、苦手そうな単語から順番に出題します。
③単語一覧 画像 登録した単語の一覧が見れます。
正答率の確認や、覚えた単語は出題停止もできます。
![testan-contents.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3445220/bacc9391-4779-77fc-f76d-349e2a426382.png)


# 技術的な話
技術的な話も少しだけ書きます。 
技術的な部分はあまり深くは書けないのですが、私は独学でフロントエンジニアになろうと思っていたので、できるだけJSに触れたいと思いNode.jsを使いました。（Progateでコースが準備されていたのも大きな理由です） 

#### 主な使用言語など
・HTML 
・CSS
・JavaScript（Node.js/Express）
・MySQL
・さくらのVPS 

#### 開発期間
2月〜5月（約4ヶ月）

#### 体制
体制 個人開発なのですが、就職のためにチーム開発の経験をしてみました。
WBSの運用、要件定義、仕様書作成、チャットでのやりとり、オンライン会議、テスト設計、GitHubでのソース管理、デバックなど極力実践に近い形での開発をしました。 
PM・デザイン：姉夫婦
フロント・バック実装：わたし 

# 難しかったこと・苦労したこと
#### テスト機能の実装
ユーザーの登録した単語をランダムで10問出題する機能を作りました。
回答後はDB上の正解あるいは不正解の数をカウントします。
10問テスト結果も最後に表示できるようにしました。
はじめは画面遷移なしで10問出題し、10問終わったら画面を遷移して結果を表示するという方法を考えていました。
しかし画面遷移なしでそれぞれの結果をDBとやり取りする方法が難しかったです。
10問テスト結果の表示の方法もわからず苦戦しました。 以下の方法で解決しました。 
１：MySQLの単語を登録してあるテーブルに「test_process」というカラムを用意する。デフォルト値は０。 
２：テスト開始と同時にランダムで10個の単語に「test_process = 1」を付与。 
３：「test_process = 1」の中からランダムで１問選択して出題。 
４：回答したらDBに正解あるいは不正解のカウント追加。「test_process = 問題番号+1」を付与。 
５：「test_process = 1」がDBからなくなった時点で結果画面に遷移させる。 
６：テスト結果は「test_process >= 2」のものを順番に表示。
このようにテスト機能を実装しました。 

#### 単語リストのソート機能・絞り込み機能の実装 
DBからデータを表示させたものをそのままソートすることができないので苦戦しました。
データをJavaScriptを用いて配列化した後にソートや絞り込みをできるようしました。
実装はできたものの、別画面から戻った時にはソートと絞り込みがリセットされてしまったり、 単語詳細画面での「次の単語」「前の単語」はDB順にしか作動しないというところは解決できませんでした。
勉強してここも解消したいと考えております。

#### 環境構築 
Node.jsやMySQLをつなぐこと、さまざまなパッケージを導入すること、サーバー契約をしてサーバーにつなぐこと、ドメインを導入することなどの環境構築は難しく、時間がかかりました。調べながら行いました。 

# 最後に 
まだまだ追加したい機能や落とした機能もあります。
これからさらにスキルアップして実装していけるようにしていきたいです。
【自分用のめも】踏み台サーバからRDPした環境でユーザのパスワードをリセットする方法

踏み台サーバからRDPした先のサーバで、ローカルユーザーのパスワードを変更したかったのですが、該当の記事を探すのに苦労したので、自分の備忘録として記載します。
下記の記事の通りに設定すれば、OKです。
https://it-study.info/multi-segment-connection-server-password-change/
パーマをすると髪の毛は禿げるのか？

パーマをすると髪の毛は禿げるのか？　という疑問を持つ方も多いかもしれません。今回は、パーマによる髪の毛の脱毛やダメージについて解説します。

まず、パーマは髪の毛の形状を変えるために行われる施術です。パーマ剤には髪の毛を柔らかくするためのアルカリ剤や髪の毛を形状維持するための中性化剤が含まれています。この化学物質が髪の内部構造に作用し、カールやウェーブを形成します。

一部の人にとって、パーマによる髪の毛のダメージが気になるかもしれません。正しい施術方法やアフターケアを行えば、髪の毛を健康に保ちながらパーマを楽しむことができます。

ただし、適切なケアを怠ったり、過度な熱や化学物質の使用が続いたりすると、髪の毛にダメージが蓄積される可能性があります。パーマ剤の過剰な使用や施術の頻度、熱スタイリングツールの乱用は髪の毛を傷める原因となります。

また、パーマをかける際に髪の毛の脱毛が起こることは稀です。しかし、適切な施術を行っていても、パーマ剤や熱によって髪の毛が傷つくことがあるため、個人の髪質や頭皮の状態によっては、一時的な抜け毛や脱毛が起こることがあります。これは一時的な現象であり、通常は髪の成長サイクルによって新しい髪の毛が生えてくることで回復します。

したがって、パーマをする際には、経験豊富なヘアスタイリストに相談し、髪の状態やクセ、希望するスタイルに合わせた施術方法を選ぶことが重要です。また、パーマ後の適切なケアやヘアケア商品の使用も忘れずに行いましょう。

パーマは個人の好みやスタイルによって選ぶものですが、適切なケアを心掛ければ、髪の毛を健康に保ちながら楽しむことができます。以下に、パーマ後の髪の毛のケアポイントをご紹介します。

洗髪時の注意：パーマ後は髪の毛がデリケートな状態ですので、優しくシャンプーしましょう。アルカリ剤を中和するために酸性のシャンプーやトリートメントを使用することもおすすめです。また、熱いお湯ではなく、ぬるま湯で洗髪することで髪の毛を傷めずに済みます。

ヘアケア商品の選択：パーマ後は髪の毛が乾燥しやすくなるため、保湿成分の豊富なシャンプーやコンディショナーを選ぶと良いでしょう。また、パーマキープ効果のあるヘアトリートメントやヘアオイルを使用することで、髪の毛のうねりやパサつきを防ぐことができます。

熱スタイリングの制限：パーマ後は髪の毛がダメージを受けやすい状態ですので、できるだけ熱スタイリングツールの使用を控えましょう。もし使用する場合は、熱から髪の毛を守るためにヒートプロテクタースプレーを使用することをおすすめします。

定期的なトリートメント：パーマ後は定期的なトリートメントが必要です。ヘアサロンでのトリートメントやヘアパック、ヘッドスパなどを受けることで、髪の毛に潤いを与え、ダメージを修復することができます。

最後に、パーマをする際には、髪の毛や頭皮の状態をしっかりとチェックしてくれる信頼できるヘアサロンを選ぶことが大切です。ヘアスタイリストに希望や悩みを相談し、適切な施術方法を選んでもらいましょう。

パーマは髪の毛のスタイルを楽しむための方法の一つですが、正しいケアを行いながら楽しむことが大切です。適度なケアと定期的なトリートメントによって、美しいウェーブやカールを持つ髪の毛を長く楽しむことができます。また、パーマをすることで髪の毛にボリュームや立体感を与えることもできます。

最後に、パーマをする際には自分自身の髪の毛の状態やクセ、ヘアスタイルの希望をしっかりと伝えましょう。ヘアスタイリストとのコミュニケーションを大切にし、パーマによる髪の毛の変化やケア方法を理解しておくことが重要です。

パーマは髪の毛を楽しくスタイリングする方法の一つですが、適切なケアや施術方法を選ぶことで、髪の毛を健康に保ちながら美しいスタイルをキープすることができます。ヘアスタイリストのアドバイスに従い、自分に合ったパーマスタイルを見つけましょう。

以上が、「パーマをすると髪の毛は禿げるのか？」についての解説です。パーマによる髪の毛のダメージを最小限に抑え、美しいウェーブやカールを楽しむために、適切なケアを心掛けましょう。ヘアサロンでの相談やアドバイスを受けながら、自分自身の髪の毛を大切にしてください。



参考記事

https://scalp-shinjuku.co.jp/column/704
巻き爪は何科にいけばいい？受診先を調べた

こんにちは、みなさん！最近、巻き爪について気になっていませんか？私も最近、巻き爪の問題に直面し、受診先がわからなくて困っていました。そこで、ネットで調べて分かった情報をシェアしたいと思います。

巻き爪の受診先は、一般的には以下の科になります。

整形外科：
巻き爪が進行して痛みや炎症がある場合は、整形外科が適しています。専門医が処置方法や治療についてアドバイスしてくれます。

形成外科：
より重度の巻き爪で手術が必要な場合は、形成外科を受診することもあります。手術によって爪の形状を修正し、再発を予防することができます。

ポディアトリスト（足の専門家）：
巻き爪の予防やケアを専門とするポディアトリストに相談するのもおすすめです。爪の適切な切り方やケア方法を教えてもらえます。

ただし、巻き爪が他の病気や合併症と関連している場合は、それぞれの専門科を受診する必要があります。例えば、糖尿病や循環器系の疾患と巻き爪が関連している場合は、それぞれの専門医に相談しましょう。

また、巻き爪を予防するためには、日常的なケアが重要です。爪の正しい切り方や適切な靴の選び方などを意識することで、巻き爪の発生を予防することができます。

私自身も巻き爪で悩んだ経験がありますが、適切な受診先を見つけることで解決への一歩を踏み出せました。皆さんも気になる症状がある場合は、迷わず受診して専門医のアドバイスを受けてください。

健康な足で快適な生活を送るために、巻き爪について知識を深め、適切なケアを心掛けましょう。みなさん、巻き爪の問題についての情報がお役に立てれば嬉しいです。ただし、個々の状況によって異なる場合もありますので、症状が気になる場合は医師に相談してください。

私たち女性は足元の美しさや健康にも気を配りたいものですよね。巻き爪は見た目の問題だけでなく、痛みや炎症を引き起こすこともあります。早めの対処と適切な受診先の選択が大切です。

私自身も巻き爪の治療を経験しました。受診先を知ることで、専門家の助言や適切な治療方法を受けることができました。その結果、症状が改善し、足の健康と美しさを取り戻すことができました。

巻き爪に悩む方々に向けて、受診先の情報を共有することで少しでもお手伝いができれば幸いです。足元の健康を守りながら、自信に満ちた歩みを続けましょう。

皆さんも巻き爪の症状に悩んでいる場合は、迷わず受診して専門医のアドバイスを受けてください。素敵な足元で自信を持って日々を過ごしましょう！

以上、巻き爪の受診先についての情報をお伝えしました。健康な足で快適な生活を送りましょう。お読みいただき、ありがとうございました。


参考記事

https://makidume-repos.com/column/805/
AWS CodeDeployを用いたblue green deploymentイメージおよびscript例


## contents
AWS CodeDeploy、AWS CodeBuild 、Fargate、Auroraを用いた、
blue green デプロイ環境、およびフローイメージ図
また、stg環境、dev環境、prod環境などでデプロイメントを使い分けるための参考に

## 対象者
CodeDeployを用いた環境構築を一旦一例でざっくり掴みたい方
環境で同一のスクリプトを使ってみる参考に

## イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/cc7a5879-086f-3bc9-07b5-168a11d513ce.png)



## codeDeployのデプロイ処理開始例(updateProdECSService.shは後述)
```bash
bash ./scripts/updateProdECSService.sh --ENVIRONMENT_NAME prod --AWS_ACCOUNT_ID
hoge --SERVICE_NAME hoge --PORT_NUM hoge --TASK_REVISION_NUM hoge
hoge
```

### script例：updateProdECSService.sh
```bash
#　本番環境のECSサービスをcodedeployで更新するための処理

# shの使用方法説明関数
function usage() {
    cat <<EOS
  Usage: $0 [REQUIRED OPTIONS]
  [REQUIRED OPTIONS]
    --ENVIRONMENT_NAME          : ENVIRONMENT_NAME
    --AWS_ACCOUNT_ID            : AWS_ACCOUNT_ID
    --SERVICE_NAME              : SERVICE_NAME
    --PORT_NUM                  : PORT_NUM
    --TASK_REVISION_NUM         : TASK_REVISION_NUM
EOS
    exit 1
}


# 引数から変数への格納部分 --** という引数を明示するために必要
ARGS=($@)
for ((i = 0; i < ${#ARGS[@]}; i++)); do
    case "${ARGS[$i]}" in
    "--ENVIRONMENT_NAME")
        i=$(expr $i + 1)
        readonly ENVIRONMENT_NAME="${ARGS[$i]}"
        ;;
    "--AWS_ACCOUNT_ID")
        i=$(expr $i + 1)
        readonly AWS_ACCOUNT_ID="${ARGS[$i]}"
        ;;
    "--SERVICE_NAME")
        i=$(expr $i + 1)
        readonly SERVICE_NAME="${ARGS[$i]}"
        ;;
    "--PORT_NUM")
        i=$(expr $i + 1)
        readonly PORT_NUM="${ARGS[$i]}"
        ;;
    "--TASK_REVISION_NUM")
        i=$(expr $i + 1)
        readonly TASK_REVISION_NUM="${ARGS[$i]}"
        ;;
    *)
        usage
        ;;
    esac
done

# 引数をチェック。必要な引数がない場合は使用方法を説明
if [ -z "${ENVIRONMENT_NAME}" -o -z "${AWS_ACCOUNT_ID}" -o -z "${SERVICE_NAME}" -o -z "${PORT_NUM}" -o -z "${TASK_REVISION_NUM}" ]; then
    usage
fi

readonly ECS_CLUSTER_NAME="sample-${ENVIRONMENT_NAME}-cluster"
readonly ECS_SERVICE_NAME="sample-${ENVIRONMENT_NAME}-${SERVICE_NAME}"

readonly APPLICATION_NAME="AppECS-${ECS_CLUSTER_NAME}-${ECS_SERVICE_NAME}"
readonly DEPLOYMENT_G_NAME="DgpECS-${ECS_CLUSTER_NAME}-${ECS_SERVICE_NAME}"

TASK_JSON_DATA=$(cat << EOS | jq
{"revisionType": "AppSpecContent", "appSpecContent": {"content": "{\"version\": 1, \"Resources\": [{\"TargetService\": {\"Type\": \"AWS::ECS::Service\",  \"Properties\": {\"TaskDefinition\": \"arn:aws:ecs:ap-northeast-1:${AWS_ACCOUNT_ID}:task-definition/${ECS_SERVICE_NAME}:${TASK_REVISION_NUM}\", \"LoadBalancerInfo\": {\"ContainerName\": \"${SERVICE_NAME}\", \"ContainerPort\": ${PORT_NUM}}}}}]}"}}
EOS
)

# codeDeployのデプロイ処理開始
aws deploy create-deployment --application-name "${APPLICATION_NAME}" --deployment-group-name "${DEPLOYMENT_G_NAME}" --revision "${TASK_JSON_DATA}"
```


### 補足：
フロントアプリに関して、
テストポートへのアクセスに関して、フロント及びバックエンドサーバーもテスト用のものにアクセスしたい場合があると思う、そういった場合はもしaxiosなどを使っていたらaxios.tsなどを変更してあげる必要がある。
e.g. hostNameを見て向き先やポート番号、プロトコルを修正するなど
絵描きのためのAllusion / Connecter + Google Driveによるリファレンス管理

複数案件 / または大規模に　自宅や会社 / その他の複数の場所で同じリファレンスを管理する場合　有効な手段として以下がある
- **Allusion**
UIがシンプルで画像管理に特化しており　PureRefとの連携ができる

- **Connecter**
多機能でデジタルアセット全般をカバーしている　アカウント登録が必要

これらのリファレンス管理ツールに Desktop版 Google Drive を組み合わせることで、Drive内のファイル / フォルダを仮想ディスクとしてPCにマウントしてエクスプローラ上で管理することができる

マウントしたフォルダをビューアで指定してあげることで　複数の端末でもリアルタイムにリファレンスの入ったフォルダを同期して作業を行うことが可能

## Google Drive for Desktop
Google DriveをWindowsエクスプローラ上にマウントして管理できる
ダウンロードは以下 (インストールには管理者権限が必要になります)
Download : https://www.google.com/intl/ja_jp/drive/download/

セットアップが終わるとマウントするイニシャルを選択できる
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634498/e1a23e1e-cee4-d462-8feb-cea914c11ca7.png)
ブラウザから見た様子
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634498/f9d7e611-3715-360c-182a-048f7cbdaf1f.png)
仮想マウントが完了しDesktop版から見た様子
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634498/bf504788-f01c-6d98-0fa2-884741a9bc42.png)


## Allusion
対応OSはWindows / Mac / Linux
Allusion は画像管理に特化したオープンソースリファレンスビューアで、**PureRef** (詳細は[3D人の記事](https://3dnchu.com/archives/pureref/)を参照) と連携しており、D&Dで画像を持っていって固定できる
対応している形式は現状 png / jpg / gif などの基本的な画像フォーマットのみ(今後増えるとのこと)

ダウンロードは以下
Download : https://allusion-app.github.io/
Github : https://github.com/allusion-app/Allusion

UIはこんな感じです　直感的に操作できるので私はこちらを愛用しています
![all.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634498/d2e9c96e-1099-7fd7-c328-ce0b9fc7c5b9.png)


## Connecter
Connecter はDesign Connected社が開発している3Dアーティスト向けのアセット管理ビューアで　リファレンス管理にも活用できます
対応している形式は BIM / マテリアル(substance) / HDRI / 画像 / mp4 など幅広くカバーしています　対応OSはWindowsのみ

ダウンロードは以下　アカウントの登録が必要です
Download : https://www.designconnected.com/connecter

UIはこんな感じです　右にあるスフィアでマテリアルビューや　HDRIの照り返しなどを確認できるので、3D作業も頻繁に行う人にはおすすめです
![con.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2634498/f6262ab7-a4a9-ecc2-85f2-a5db33002a5d.png)

----

他にも調べれば色々リファレンス管理ツールはあると思うので、自分の作業に合うものを任意に探してみてください
Google ColabでPairplot ＆ dtreeviz 実行するとエラーになるのはこれでは？

scikit-learn の Ver.up により、pairplot実行時にエラーが出ることがわかりました。

```Python:scikit-learn ver指定してインストール
!pip install scikit-learn==1.1.3
```

上記のようにVer.指定してインストールすると、いけました。

***

同じく、dtreevizでもエラーが・・・
私の環境では、dtreevizもver.指定することでいけました。

```Python:dtreeviz ver指定してインストール
!pip install dtreeviz==1.4.1
```

なお、scikit-learn のVer.指定してインストールすると、「RESTART RUNTIME」（ランタイム再起動）を求められることがあります。この場合は **「RESTART RUNTIME」ボタンをクリックし、ランタイムの再起動を実行しましょう。**
ROS bridge suite導入

# はじめに
Ubuntu18.04
ROS Melodic

# rosbridgeをインストール
```
$ sudo apt-get install ros-melodic-rosbridge-suite
```
# rosbridgeを実行
```
$ roslaunch rosbridge_server rosbridge_websocket.launch
```
このときroscoreも勝手に立ち上がる

# 参考文献
https://symfoware.blog.fc2.com/blog-entry-2288.html
Pythonで複数のPDFファイルを結合する方法


# プログラムについて
スキャンしたPDFを1つのPDFにまとめるためのプログラムです．

# 環境
- Python 3.8.10

# プログラム

パス名は自分の環境に合わせて変更してください．

コメント欄でご指摘いただいた通り，プログラムに冗長な部分があったため修正しました(2023/5/25)

```python:merge.py
import glob
from PyPDF2 import PdfMerger

merge = PdfMerger()

for filename in sorted(glob.glob('*.pdf')):
    merge.append(filename)
    print(filename)

merge.write('merge.pdf')

merge.close()
```

# 実行方法
```
python3 merge.py
```

# 実行結果
merge.pdfというファイルが出力されているはずです．
IBM Blueworks Live からIBM Process MiningにBPMNファイルを連携する方法

<h2>はじめに</h2>
本記事では、IBM Blueworks Liveから取り出したBPMNファイルをIBM Process Miningに連携する方法をご紹介します。
<br>
<br>
参考：「IBM Process mining から IBM Blueworks Live にBPMNファイルを連携する方法」は<a href="https://community.ibm.com/community/user/automation/blogs/momoko-furukawa/2023/04/27/ibm-process-mining-ibm-blueworks-live">こちら</a>から
<br>
<h2>前提</h2>
記事の中で画像として添付しているIBM Blueworks LiveとIBM Process Miningのプロセス図式は、記事のためサンプルとして作成しているものになります。

<h2>手順</h2>
<b>① IBM Blueworks LiveにてBPMNファイルとして抽出する</b>
<br>※こちらで抽出しているプロセスは、元々IBM Process Miningにて利用していた「My Order Processing」のプロセスを利用しております。今回はIBM Blueworks LiveとIBM Process Miningの連携をお見せするため、IBM Process Miningの「My Order Processing」のタスクをいくつか削除したり、名前を変更して参考のために特別に用意したプロセスになります。なので、実際に提供するソリューションのプロセスとは異なります。

- プロセスのエクスポート をクリック<br>
- Business Process Model and Notation (BPMN2.0)」を選択し、「エクスポート」をクリック
- 抽出したzipファイルを確認し、解凍する<br>※zipファイルは参照モデルとしてIBM Process Miningにアップロードできないので、zipファイルを解凍し、bpmnファイルにしておきます。

**② IBM BlueworksLive から 抽出したBMPNファイルをIBM Process miningの参照モデルとしてインポートする**
- 「参照モデルのアップロード」から「ファイルの追加をクリック」
- IBM Blueworks Liveから抽出したbpmnファイルを選択し、「参照モデルの追加」をクリック
- 「データ派生モデル」と「参照モデル」の確認<br>「データ派生モデル」では元々のIBM Process Miningで分析していた業務プロセスを確認することができます。また「参照モデル」からは、IBM Blueworks Liveで作成したプロセスを見ることができます。
-  両モデルの比較を行う<br>両モデルを比較することで、プロセスにかかるリソース（コストや時間等）を比較することができます。比較することで、理想的なプロセスに対して必要なタスクと不要なタスクを識別することができたり、また、自身では想定することのできなかったプロセスの流れを知るといった新たなプロセスの発見を行うことが可能です。

<h2>最後に</h2>
今回は、「IBM Blueworks LiveからBPMNファイルを抽出し、それをIBM Process miningに取り込み、両プロセスの比較」を実施しました。<br>
IBM Process Miningを利用することで、IBM Blueworks Liveからインポートしたプロセスを分析することができます。また、元々利用されているプロセスをIBM Process Miningで分析しつつ、それをIBM Blueworks Liveを使って理想的なプロセスに変更し、再度IBM Process Miningを使ってIBM Blueworks Live上で作成したプロセスを分析し、最も最適なプロセスを作成することも可能です。

<h2>おまけ</h2>
IBM Business Automation製品について詳しく知りたい方は、下記のCommunityにご登録いただけたらと思います。IBM IDを作っていただけたら、どなたでもご参加できます。<br>
<a href="http://ibm.biz/JPBizAutomationUG">IBM Business Automation Community Group</a>
(リンクだけです)「逆三角関数の主値(英:Principal values)」を調べた。

電卓のarcの計算? 主枝(英:Principal branch)?
電卓の逆三角関数は(象限の)右半分だけをみている?

主値

https://ja.wikipedia.org/wiki/逆三角関数#主値

Principal values

https://en.wikipedia.org/wiki/Inverse_trigonometric_functions#Principal_values

# 教科書より

**「2直線のなす角」** を
数Ⅱの教科書の「正接の加法定理」の次頁に見つけました。
https://www.deepl.com/ja/translator#ja/en/「ただし」「普通」がくせ者?でした。
「2直線のなす角θ...。ただし、0≦θ≦π/2」
又は、
「普通..の範囲にあるものとする。したがって...の場合は...」
  

# 過去問
"主値"との一致はありません。

主値　＜　大学入試数学問題集成様の内部検索

https://cse.google.com/cse?cx=a8908fbc24340ebc5&q=%E2%80%9D%E4%B8%BB%E5%80%A4%E2%80%9D&oq=%E2%80%9D%E4%B8%BB%E5%80%A4%E2%80%9D&gs_l=partner-web.12..0i512l2.10640.15229.1.18356.4.4.0.0.0.0.113.428.0j4.4.0.csems%2Cnrl%3D10...0....1j4.34.partner-web..1.18.2003.eEQeWpjvVlo

https://www.google.com/search?q=site%3A%2F%2Fkamelink.com+%22%E4%B8%BB%E5%80%A4%22&rlz=1CAUHAM_enJP1038JP1038&oq=site%3A%2F%2Fkamelink.com++%22%E4%B8%BB%E5%80%A4%22&aqs=chrome..69i57j69i58.845j0j9&sourceid=chrome&ie=UTF-8

https://www.google.com/search?q=site%3A%2F%2Fmathmathmass.exblog.jp+%22%E4%B8%BB%E5%80%A4%22&rlz=1CAUHAM_enJP1038JP1038&oq=site%3A%2F%2Fmathmathmass.exblog.jp+%22%E4%B8%BB%E5%80%A4%22&aqs=chrome..69i57j69i58.38548j0j4&sourceid=chrome&ie=UTF-8

# 参考

https://qiita.com/mrrclb48z/items/42a8f5e8e6ff63303a50
「延期タスク」を利用してタスクの状況を変更せずに一時停止する方法

<h2>実施したいこと</h2>
現在、調達要求作成書を作成しているところです。
作成書の記入欄の必要項目を途中まで記入して、一時的に保存したいと考えました。
下書きボタンをクリックすることで、その記載した記入事項を「一時的に保存すること」「下書き状態にすること」が今回行いたいことです。


<h2>手順</h2>
1. 「ダイアグラム」をクリック<p>
2. 右側にあるパレットから、「中間イベント」を選択<br>
3. 「中間イベント」をダイアグラム上の適当な位置にドラッグ&ドロップ<br>
4.「Coach」から「中間イベント」を線で繋げる<br>
※ 線の繋げ方は、「Coach」（線の接続元）を長押しして、「中間イベント」（線の接続先）の方にカーソルを持っていく。そうすると自動的に線が画面に表示され、「Coach」と「中間イベント」を線で結ぶことができる。<br>
5. 「中間イベント」を選択して「実装」から「延期」を選択<br>
6. 「Coach」から「中間イベント」に繋がっている線をクリックし、「一般」>「終了状態のバインディング」>「選択」をクリック<br>
7. 「Coachビュー」の「下書き」ボタン（今回クリックしてそのページにとどまるようにしたいボタン）を選択し、「終了」をクリック<br>
8. 「中間イベント」→「Coach」を線で繋げる<br>
9. フローが定義されているプロセスの画面にいき、「実行」をクリック<br>
10. 試験的に入力必要項目をいくつか記載し、「下書き」をクリック<br>
11. 「[調達要求作成]サービスは延期されました」が表示されていることを確認<br>
12. フローが定義されているプロセスの画面に戻り、「インスタンスの詳細UI」をクリック<br>
13. プロセスポータルにアクセスし、「Step：調達要求作成」をクリック<br>
14. 下書きした項目が表示されていることを確認<br>


<h2>最後に</h2>
今回は、BAWのCoachビューで作成した「下書き」ボタンをクリックすると、下書きした項目が一時的に保存される状態を作りました。（「延期タスク」を利用してタスクの状況を変更せずに一時停止する方法を試しました。）
<br>
皆さんもぜひ試してみてください。
<br>
<br>
参考文献：<a href="https://www.ibm.com/docs/ja/baw/20.x?topic=deprecated-server-side-service-components">IBM Business Automation Workflowマニュアル</a>
<br>
<h2>おまけ</h2>
IBM Business Automation製品について詳しく知りたい方は、下記のCommunityにご登録いただけたらと思います。IBM IDを作っていただけたら、どなたでもご参加できます。<br>
<a href="http://ibm.biz/JPBizAutomationUG">IBM Business Automation Community Group</a>
Pythonの仮想環境構築

# はじめに
Windows10でPython仮想環境構築した。

# VScodeのPowerShellで以下を順に入力
```
python -m venv .venv
```
```
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
```
```
.venv\Scripts\activate.ps1
```
ディレクトリが（.venv）となったことを確認

# パッケージのインストール
```
python -m pip install roslibpy
python -m pip install keyboard
```
ここではroslibpyとkeyboardをインストールした

# 仮想環境の共有
```
python -m pip freeze > requirements.txt
```
これでrequirements.txtにインストールしたパッケージの一覧が作成される


# 仮想環境の終了
```
deactivate
```

# もう一度仮想環境に入るとき
以下を入力すればOK
```
.venv\Scripts\activate.ps1
```



# 参考文献
https://www.python.jp/install/windows/venv.html
【GAS】Gmail APIを使わずにGmailをAPI経由で取得する


以下のような構成を取ればいい。

```mermaid
flowchart LR
A[Gmail] -- 取得 --> B[Google Apps Script]
B -- API --> C
```


## Gmail APIの面倒さ

Cloud Functionsを使ったとしても、Gmail内容はAPIとして取得できない

CloudFunctionsから

* 「API とサービス」 「認証情報」
* 「認証情報を作成」「OAuth クライアント ID」の取得
* ...ClientサイドでAuthのコード書き、トークンの取得してGmailのAPIを叩く

面倒。

## GasをWebアプリケーションとして公開してAPI公開


```javascript
const FAIL = { ok: false, code: null };

const output = ContentService.createTextOutput();
output.setMimeType(ContentService.MimeType.JSON);
output.setContent(JSON.stringify(FAIL));

/**
 * 認証ラベルがついたGmailを取得します
 * queryの例: https://blog.synnex.co.jp/google/gmail-gas/
 */
function getGmail(id, date = '2023-04-17T11:00:00.000Z') {
  // 認証ラベルの付いた、アカウントIDが本文にはいっているメールを1件取得する
  const newestThread = GmailApp.search(`${id} label:タイトルXXX`, 0, 1)[0];

  // スレッドが存在しない
  if (!newestThread) {
    Logger.log("スレッドが存在しません");
    return output;
  }

  let messages = newestThread.getMessages();
  Logger.log(`messages length: ${messages.length}`);
  messages = messages.filter((message) => message.getPlainBody().includes(id))
  // date(Instagramクリック日時)) < メール（message）受信日時
  messages = messages.filter((message) => (new Date(date)).getTime() < message.getDate().getTime());
  Logger.log(`messages length: ${messages.length}`);

  const message = messages[0];

  // 指定時間より前のメールは無視する
  if (!message) {
    Logger.log("期間内のメールが存在しません");
    return output;
  }

  const code = getCode(message.getPlainBody());
  Logger.log(code)

  output.setContent(JSON.stringify({ ok: true, code }))
  return output;
}

/**
 * param:  {
 *   "id": "",
 *   "data": "2023-04-17T16:18:00.173Z",
 *   "pass": "ベアラートークンみたいなの"
 * }
 */
function doGet(e) {
  Logger.log(e);
  const params = e.parameter;
  if (params?.pass !== 'ベアラートークンみたいなの' ) {
    Logger.log("passが間違いです。");
    output.setContent(JSON.stringify(FAIL));
    return output;
  }

  return getGmail(params?.id, params?.date);
}
```

Clientサイド

```js
　　const deployId = 'GAS画面からデプロイしたときのID_デプロイするたびに変わる';
  const res = await axios.get<{ ok: true, code: string }>(
    `https://script.google.com/macros/s/${deployId}/exec`,
    {
      params: {
        pass: 'ベアラートークンみたいなの',
        date,
        id,
      },
    }
  );
```

ベアラートークンみたいなのは任意の文字列128文字とか適当にジェネレートしたものを使って、絶対に推測できないものにしてください。UUIDに合わせると英数字の３２桁です。

UUIDが16進数で32桁ですが、特定させるにはどれくらいの時間がかかるかを示した計算を参考にするのがいいかと思います。

https://zenn.dev/kiyocy24/articles/uuid-duplicate-time

デプロイ方法はこんな感じ

上部のデプロイボタンからウェブアプリとして公開

![スクリーンショット 2023-05-24 13.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/7e84ea79-6627-20d5-541b-5f549684cdc4.png)

もろもろ認証でOKを押したら

![スクリーンショット 2023-05-24 13.58.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/f6f10285-d959-86df-944b-6a46af34f2bc.png)




## 注意

APIとして公開すると、パスワードが漏れると、自分のGmailが全世界に公開される可能性があることを考慮のうえ使ってください。
その意味では、普通のGoogleのID/Passが漏れた場合と同じですが、その場合はGoogle側で不審なログインはブロックしてくれたりしますが、このAPIの場合は不審なログインは弾かれません。

毎回変わるデプロイIDもかなりの桁数なので、基本的にこれだけでもかなり有効なURLを見つけるのは大変なはずですがちゃんと理解した上で使ってください。

↓以下のdeployIdは32桁超えているので、UUIDよりも特定は難しいはず。 `https://script.google.com/macros/s/${deployId}/exec`
「Pythonで学ぶ音声合成」の Tacotron2 のメルスペクトログラム合成を LSTM から Transformer に改修した。

## 報告の概略

今回の報告は、最終的な形ではなく、LSTM で行っていたことを Transformer で行うことが可能だったという第一報です。合成されたログメルスペクトログラムと development 用データを推論した音声とプログラムを掲載します。

## 改修の動機

音声認識において、「Python で学ぶ音声認識」(LSTMでの音声認識が解説されている）を勉強しながら、

https://tensorflow.classcat.com/2022/06/27/keras-2-examples-audio-transformer-asr/


のページ（Transformer での音声認識）を勉強したり、OpenAI の Whisper のソース（Transformer での音声認識）を勉強していました。LSTM で行っていたことを Transformer に置き換えられそうだったので、 音声合成の Tacotron2 (LSTM)のメルスペクトログラムの合成を Transformer でできないかという発想です。Transformer を用いているので、改修したプログラムを Transtron と呼んでいます。

## 合成されたログメルスペクトログラム


![Qiita_fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958180/4073f445-eba4-958f-f056-7b31d87b0dbe.png)


図に合成したログメルスペクトログラムを掲載します。一番上のスペクトログラムが、テストデータの音声をログメルスペクトログラムに変換したものです。二番目のスペクトログラムが、テキストの韻律記号付き音素と decoder_targets として時間的な最初に0を入れて時間方向に1だけずらしたメルスペクトログラムを入力とした teacher forcing の方法で予測したスペクトログラムです。三番目がテキストの韻律記号付き音素と 0 を ( 1,1,80 )だけ並べた decoder_targets を初期値として、自己回帰モデルで予測したメルスペクトログラムです。なんとか、予測できていると思われます。

三番目のスペクトログラムの時間的に終わりの方（右側）が、一番目のスペクトログラムに似ていないという点は、自己回帰モデルであるのでスペクトログラムを時間的に最初の方から予測していくため、後の方は誤差がたまり似ていないのではないかと考えられます。解決策としては、Encoder 4層＋Decoder 4層を、Encoder 6層＋Decoder 6層とモデルを精緻にして、学習回数を増やすことで、誤差が少なくなるのではと考えます。

## 合成された音声。

こちらが元の音声で
https://drive.google.com/file/d/1IlOlF8lZ0yXOQZ3lV83rc1QuUMo4Y1L8/view?usp=sharing

推論した音声
https://drive.google.com/file/d/1tIc6VLqzPSNYFRx2fFPlBq0zwzl98NIR/view?usp=sharing

です。なんとか、それらしいと思います。ボコーダーには、「Python で学ぶ音声合成」の WaveNet ボコーダーを使いました。

## 学習について。

学習データは、教科書「Ptyhonで学ぶ音声合成」に準拠しました。JSUT 1.1 の BASIC5000 発話の 4700 発話が train で、200発話が development です。損失の学習曲線を掲載します。図

![Qiita_fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958180/5655b969-0287-e42b-d3c5-4894b9912bea.png)

が train の損失です。epoch は635 で step は186690 です。batch_size は 16です。図

![Qiita_fig3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958180/62148b80-5a40-d322-30d2-57da94e91fd4.png)

が development の損失です。epoch は 634 で、step は8242 です。batch_size は 16です。epoch 630 くらいから train loss が増え始めたので途中で停止させました。

## プログラム。

学習プログラムは、「Python で学ぶ音声合成」に準拠し、ttslearn-master/notebook フォルダで、 ch28_learning_transtron.ipynb として実行しました。レシピの run.sh の形ではなく、ブラウザ上で実行しました。教科書の ttslearn-master フォルダの recipes フォルダの tacotron フォルダをコピーして transtron フォルダを作ってください。tacotron フォルダは、一度、レシピを実行したものをコピーしてください。

ch28_learning_transtron.ipynb は、github においておきます。
https://github.com/toshiouchi/transtron

よろしくお願いします。
Laravel Sailで環境構築をしてGitHub上で共有するまでの流れ

# はじめに
<!-- 発端や概要を記載 -->
Laravelでチーム開発をするにあたって行った環境構築の流れを残しておきます。簡単です。
# 目次
<!-- タイトルとアンカー名を編集 -->
- [Laravel Sailの環境構築](#Chapter1)
- [clone/pullした人がやること](#Chapter2)
- [終わりに](#Chapter3)
- [参考文献](#Chapter4)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# Laravel Sailの環境構築
### Docker Desktopのインストール
以下のリンクからインストールできます。

https://www.docker.com/products/docker-desktop/

### Laravelのインストール
以下のコードを実行するだけです。まあまあ時間かかります。

```
curl -s "https://laravel.build/app-name" | bash
```

Laravelがインストールできたら以下のコードでLaravel Sailを起動できます。
```
cd example-app

./vendor/bin/sail up
```

`http://localhost`にアクセスすることでlaravelが起動できます。

![スクリーンショット 2023-05-24 13.41.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126516/b350076b-c259-e051-5221-52d03513cc96.png)



<a id="#Chapter2"></a>
# clone/pullした人がやること 
### 1.Docker Desktopのインストール
以下のリンクからインストールできます。

https://www.docker.com/products/docker-desktop/

### 2.composerのインストール
Laravelのディレクトリに移動して以下のコードを実行する。
```
docker run --rm \
    -u "$(id -u):$(id -g)" \
    -v $(pwd):/var/www/html \
    -w /var/www/html \
    laravelsail/php81-composer:latest \
    composer install --ignore-platform-reqs
```

ローカルを汚さないようにComposerとPHPを含むdockerコンテナを作成する。

### 3.envファイルの作成
`.env.example`を元に`.env`を作成する

```
cp .env.sample .env
```

### 4.Sailを起動
docker desktopを立ち上げて、以下のコマンドでSailを起動する。

```
./vendor/bin/sail up -d
```
以下のコマンドでデータベースを作成
```
sail artisan migrate
```
`http://localhost`にアクセスしてlaravelを起動　

<a id="#Chapter3"></a>
# 終わりに
Laravel Sailが便利すぎました。データベースなども全てまとめてやってくれるのでお手軽に環境が構築できます。

<a id="#Chapter4"></a>
# 参考文献

https://readouble.com/laravel/10.x/ja/installation.html

https://chigusa-web.com/blog/laravel-github-clone

https://qiita.com/kazumakishimoto/items/aeedd2abf23780ef3942
Microsoft Build 2023、GitHub Copilot セッションのレポート

# はじめに
MSBuild Day1 の Keynote、すごかったですね！　個人的な感想として、Windows Copilot には興奮しつつも身の引き締まる思いで、Github Copilot にはワクワクが100%でした。

![P_20230524_023129.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361516/baf25866-d679-6448-ebca-27083e6aa12a.jpeg)


# 連携Plugin開発のジレンマ
Windows Copilotには身の引き締まる思い、という点について、これはおそらく割と一般的なジレンマというか、共感してくださる方も多いのではと思うのですが、たとえばCopilotから LinkedIn に投稿する Plugin が KeyNote で例示されていましたけども、あれって冷静に考えれば LinkedIn にとっては開発コストの二重負担というか、純粋に作るものが増えちゃってますよね？　Plugin を提供することで数億のユーザーにリーチできるのは結構なことですけれども、私としてはユーザーを自分のアプリに囲い込んだほうが楽ですし、私が楽ということはそれだけ私の時間をユーザーに新たな価値を届ける活動に使えるので、ユーザーにとっても嬉しい、というのが基本原則だと思います。ただ、原則を持ち出すならば言うまでもなく私の責務はユーザーに価値を届けることであるからして、ユーザーが望みユーザーの生産性が上がるのであれば私のアプリの Plugin を提供するのは全くやぶさかでないけれども、しかしそれによって増加するメンテナンスコストを Plugin の利益を享受しないユーザーにも負担させるのは筋が通るのだろうか？　結果的にそれは私のアプリの競争力を削ぐことになりはすまいか？　とか、そんなことを考えながら、身の引き締まる思いで聞いていました。


# GitHub Copilot 活用テクニック
その一方で GitHub Copilot の Breakout セッション、これは期待どおり面白かったので、みなさんぜひ後日視聴していただきたいですが、速報として私なりのサマリを書いておきます。

###### [Pragmatic techniques to get the most out of GitHub Copilot（GitHub Copilotを最大限活用するための実用的テクニック） | 24(水) | 9:15 AM - 10:00 AM JST](https://build.microsoft.com/en-US/sessions/7a726a0f-5433-46a4-a91d-7d427ffb5b30)
![P_20230524_095353.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361516/6418912a-fdf6-a709-ed51-61f4c513dc0c.jpeg)
（サマリここから）
LLMは「超スゴイAutoComplete」でしかなく、プログラム言語のシンタックスを理解しているわけではない。GitHub Copilot をうまく活用するためのベストプラクティスは「３つのS」、Single - 一度にひとつのことだけをする、Specific - 要求は明確に、Short - アウトプットが短くなるようにする、である。たとえば「`//HTMLをサニタイズする関数`」という要求は「サニタイズ」が明確でないので、うまくいかない。「`//文字列からHTMLタグを除去する関数`」のほうがより明確である。

限界があるいっぽうでパターン認識は非常に得意で、これは言い換えれば「開発者がすぐ忘れちゃうようなこと」、たとえば正規表現やCSSやCRONなどに絶大な威力を発揮する。ただし「信頼しつつ検証せよ」、Copilot の提案を検証なしに採用してはならない。Copilotはあくまで副操縦士であり、操縦席に座るのはあなたである。

現在の Copilot は、プロンプトサイズに上限があるので、プロジェクト内に存在するすべてのコードを見てくれているわけではない。材料として使っているのはファイル名と、現在開いているファイル。あなたが Copilot に与えた情報がダイレクトに結果に影響する。良い結果を一回で得ようとするのではなく、結果を見ながら反復して情報を与えていくとよい。関数の説明をコメントで書いて、結果が期待に近づくようにコメントを修正するサイクルを反復する。このコメントはそのまま将来の開発者（あるいは将来のあなた）の助けにもなる。

Copilotのトライアルは下記、これとは別に30days free trialもある。

https://resources.github.com/copilot-demo/

（サマリここまで）

# おわりに
GitHub Copilot Chat は単にコード生成などの機能が強力というだけでなく、KeyNoteでも何度か言われていた「フローに留まることを助ける」という点も魅力だと思います。すぐ忘れちゃうような記法を調べようとしてエディタから離れたらたまたまチャット通知が目に入ってしまい、そのままフローが終わってしまった、という体験は誰しもあると思いますが、これが Github Copilot Chat であれば VSCode から出ずに Copilot と対話しながらコーディングを継続でき、開発者が最大限フローに留まれる、という体験の部分も大きな魅力であって、単なるコード補完と考えるとちょっと見誤るのかなと思います。はやく業務利用したいですね！

明日はDay2、Keynote では Windows Copilot の話が多くなりそうなので、私にとってはまた興奮しつつも身の引き締まる感じになりそうです。引き続きレポートしていけたらと思います。
git リモートブランチのブランチの切り方

プロジェクトが始まり、
「さて、ブランチをリモートから切ろうか」となったときに、「あれ？どうやるんだっけ？」となったので忘備録です。

# fetchでリモートブランチを取得
`git fetch`

設定によってなのか、この`git fetch`を必要とせずいきなり`git switch develop`で勝手に取得とスイッチをやってくれる人もいるみたいです。どういう設定なんだろうか...

# remote branch を確認
`git branch -r`

# switchでリモートブランチへスイッチ
`git switch develop`
eksctlがコールできない

Windows 上で `eksctl` を使用するには、以下の手順に従ってインストールします。

1. Chocolatey のインストール:
   Chocolatey は、Windows 上でソフトウェアパッケージを管理するためのパッケージマネージャーです。まだインストールされていない場合は、以下の手順で Chocolatey をインストールします。
   
   - 管理者権限で PowerShell を開きます。
   - 以下のコマンドを実行します:
     ```
     Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
     ```

2. eksctl のインストール:
   Chocolatey を使用して `eksctl` をインストールします。

   - 管理者権限で PowerShell を開きます。
   - 以下のコマンドを実行します:
     ```
     choco install eksctl
     ```

   インストールが完了すると、`eksctl` が利用可能になります。以下のコマンドを使用してバージョンを確認できます:
   ```
   eksctl version
   ```

   バージョン情報が表示されれば、`eksctl` が正常にインストールされました。

3. AWS CLI のインストール:
   `eksctl` を使用するには、AWS CLI もインストールする必要があります。AWS CLI のインストール手順については、以下のリンクを参考にしてください: [AWS CLI インストールガイド](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html)

以上の手順を実行することで、Windows 上で `eksctl` を使用できるようになります。
Rails and PostgreSQL: Role postgres does not exist　エラーに悩まされた

postgresをバージョンアップして、railsサーバーを立ち上げようとしたら
`Role postgres does not exist　`というエラーが出てきた。

色々調べたら以下のコマンドで解決できました。
`createuser -s -r postgres`

postgresにはロールが存在して、ロールによって権限を変えたり所有物が異なったりするらしい。
で、postgresというロールはおそらく大元のデータベースを作成するやつみたいですが、それが今回は存在しなかったらしい。理由はわかりません。。。。

そこで、ロールを作成したら解決したということですね。

https://eng-entrance.com/postgresql-role#PostgreSQL

https://stackoverflow.com/questions/7863770/rails-and-postgresql-role-postgres-does-not-exist
EC2インスタンスへPuTTyでSSH接続した際、実際と異なるIPが表示される

# ■概要（発生した問題）
PuTTyを利用したSSH接続を行うと、画面上部（白帯部分）のIPが実際の接続先とは違うIPが表示されてしまう。

![](https://storage.googleapis.com/zenn-user-upload/021c982fdc26-20230319.png)

こちらは複製したEC2インスタンスに対して、SSH接続した際に発生しました。

# ■原因
内部のどこかの設定だろうなあとは思っていたんですが、原因は「Hostname」の設定でした。
下記に設定があります。

```
/etc/hostname
```

下記で書き換えが可能です。
恐らく再起動の必要はなく、接続をやり直すと表示が変わっています。

```
sudo hostnamectl set-hostname <HOSTNAME>
```

# ■最後に
サーバー同士の接続等では、不具合の原因にもなります。
注意しましょう！
(リンクだけです)「著作権（英:Copyright law of Japan）」を調べた。


https://www.deepl.com/ja/translator#ja/en/非常に奥が深そうなので、さわりだけにしました.

# wikipedia

https://ja.wikipedia.org/wiki/%E8%91%97%E4%BD%9C%E6%A8%A9%E6%B3%95

https://en.wikipedia.org/wiki/Copyright_law_of_Japan

# 参考

https://elaws.e-gov.go.jp/document?lawid=345AC0000000048

https://ja.wikibooks.org/wiki/%E3%82%B3%E3%83%B3%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%AB%E8%91%97%E4%BD%9C%E6%A8%A9%E6%B3%95

https://qiita.com/t13801206/items/85d33379742bcf3dc0bd


# 参考(ゲーム)

「著作権」をまもろう＜

https://puyo.sega.jp/program_2020/#begin
Azure VMのハードディスクのスナップショットを取得する

### OSディスクのスナップショットを取得する

複製したい仮想マシンのディスクからスナップショットを作成します。
![snapshot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/fbd2446a-87a7-d544-c2d1-7cfe7842b984.png)

### スナップショットからマネージドディスクを作成する

作成したスナップショットからマネージドディスクを作成します。
![snapshot2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/0fe2a9da-bc7d-1934-edbe-1ed670f7c19d.png)

### OSディスクをスワップする

障害時にOSディスクをスワップすることで復旧させることが可能です。
![snapshot4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/1468b0d2-f00f-63b6-a333-15dde625e6c6.png)

### マネージドディスクからVMを作成する

スナップショットから作成したマネージドディスク（OSディスク）からVMを作成できます。こちらであれば仮想マシンの構成を作り直すことができます。
![snapshot3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/ce03f4c0-d126-1f8d-50b7-860d8d607c22.png)

### 参考
- [Azure 仮想マシンの複製方法について](https://www.guri2o1667.work/entry/2020/03/31/Azure_%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%AE%E8%A4%87%E8%A3%BD%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
- [AzureVMのOSディスクをスナップショットから復旧する](https://qiita.com/kuroneco/items/f107bcc15a4fcfdccdcf)
- [仮想ハード ディスクのスナップショットを作成する](https://learn.microsoft.com/ja-jp/azure/virtual-machines/snapshot-copy-managed-disk?tabs=portal)
パイプを使い、入力ファイルの特定の行に置換処理を行なってから出力したい

# やりたいこと

PostgreSQLの`pg_dump`によって、SQLクエリのコマンドが得られる。
このテキストファイルの中から、`CREATE FOREIGN TABLE`から始まる行のクエリをコメントアウトした上で、出力をファイルに書き出したい。


# 解決法

pg_dump のオプションは省略。

```sh
$ pg_dump | sed -E "s/(CREATE FOREIGN TABLE*)/-- \1/g"\ > output.txt
```
シェルスクリプト（Shell Script）内で引数（$1、$2...）を設定する方法

# 問題の所在

シェルスクリプトでは、引数を付けて起動すると、引数`$1`、`$2`...として使うことができます。

例えば、

``` sh script
#!/bin/sh
echo "$1"
echo "$2"
```

というシェルスクリプトを"`test.sh`"という名前で作り、

```
> test.sh foo bar
```

と実行すれば、

```
> test.sh foo bar
foo
bar
```

という実行結果が得られます。

通常はこれで十分なのですが、まれにシェルスクリプト内で引数を設定したい場合があります。
例えば、引数がない場合には、デフォルトの値を使うような場合です。

# ダメな方法

引数がない場合は、引数`$1`に"`baz`"を、引数`$2`に"`qux`"を設定する場合を考えてみます。

そのような場合に、通常の変数の設定と同じように、

``` sh script
#!/bin/sh
if [ $# -eq 0 ]; then
    1=baz
    2=qux
fi
```

などとすると、エラーになります。シェル変数の名前には、先頭の文字に数字は使えないというルールがあるためです。

# 正しい方法

このような場合には、`set`を使い、

``` sh script
#!/bin/sh
if [ $# -eq 0 ]; then
    set -- baz qux
fi
```

とします。これで、引数`$1`に"`baz`"が、引数`$2`に"`qux`"が設定されます。

あまり使わないのですが、あまり使わないだけに、使いたいときに思い出せずに困るので、備忘のためにも記事にしておきます。

注）"`foo`"、"`bar`"、"`baz`"、"`qux`"は、日本語の"〇〇"とか"なになに"とかと同じで、特に意味のない文字列です。
React×Railsの計算アプリで、裏でPythonに計算してもらう。

タイトルの通り、裏でpythonに計算してもらうWebアプリを作る準備です。
pythonでバックエンドを書けば楽に実装できますが、Railsを使ってみたかったので、こうしました。

実装方法さえわかればいいと思うので、簡単な整数の足し算とその結果を画面に出力するための準備をします。

# プログラム

## フォームコンポーネント
```tsx:CalclationForm.tsx
import React, { useState } from "react";

export const CalclationForm = () => {
  const [value1, setValue1] = useState("");
  const [value2, setValue2] = useState("");
  const [result, setResult] = useState("");

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault();
    
    try {
      const response = await fetch("/calculation", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({ value1, value2 }),
      });
      
      if (!response.ok) {
        throw new Error("Calculation failed.");
      }
      
      const data = await response.json();
      setResult(data.result);
    } catch (error) {
      console.error(error);
    }
  };

  return (
    <div>
      <form onSubmit={handleSubmit}>
        <input
          type="number"
          value={value1}
          onChange={(e) => setValue1(e.target.value)}
        />
        <input
          type="number"
          value={value2}
          onChange={(e) => setValue2(e.target.value)}
        />
        <button type="submit">Calculate</button>
      </form>
      {result && <p>Result: {result}</p>}
    </div>
  );
};
```
## コントローラ
```ruby:CalculationsController
require 'open3'

class CalculationsController < ApplicationController
  protect_from_forgery with: :null_session
  
  def calculation
    value1 = params[:value1].to_i
    value2 = params[:value2].to_i

    command = "python app/python/Calculation.py #{value1} #{value2}"
    stdout, stderr, status = Open3.capture3(command)

    if status.success?
      result = stdout.to_i
      render json: { result: result }
    else
      render json: { error: stderr }, status: :internal_server_error
    end
  end
end
```
## Python
```python:Calculation.py
import sys

value1 = int(sys.argv[1])
value2 = int(sys.argv[2])
sum = value1 + value2
print(sum)
```

# 補足
CalclationForm.tsx は単純なフォームで、足し算するvalue1とvalue２を入力します。
body: JSON.stringify({ value1, value2 })で送信した2つの数値を
```ruby
    value1 = params[:value1].to_i
    value2 = params[:value2].to_i
```
で2つの変数に格納し、

```ruby
command = "python app/python/Calculation.py #{value1} #{value2}"
```
でpythonを呼び出して、値を渡しています。app/python/Calculation.py は計算するpythonスクリプトのパスです。

重要なのはこの
```ruby
require 'open3'
```
を呼び出している部分で、rubyの、外部プログラムを実行し、その入力・出力・エラー出力を制御するための機能を提供する標準ライブラリです。pythonを呼び出すのに必要になります。

以上
エンジニアのメンタルストレス対策

# エンジニアのメンタルストレス対策
## ストレスとうまく付き合う
　エンジニアは様々な大きさ、粒度の問題を解決するのが仕事なのでストレスがつきものです。問題の複雑さや重大さとは関係なく、エンジニアが「感じる」ストレスも、状況と場合によって異なります。そのストレスが体調を悪くするほどのものになってしまうと悪影響になります。場合によっては仕事の成果に影響が出たり、休職せざるを得ない自体になってしまうかもしれません。
　カンではなく、まぐれでもなく、エンジニアがどうやってストレスを乗り越えていけるのか、という点を考えてみたいと思います。

## Qiita のストレスタグ
ここにもいい記事が集まってきそう！
https://qiita.com/tags/%e3%82%b9%e3%83%88%e3%83%ac%e3%82%b9

## ストレス、という用語
　Qiitaで「ストレス」を検索すると「ストレステスト」の記事がよく登場します。ITエンジニアにとって、「ストレステスト」とは「ある製品に負荷をかけた場合にきちんと動作するかを確認するテスト」のことなので、この記事の趣旨とは違うものですね。

## Qiitaでメンタルストレス関連の情報を検索
　「メンタルケア」、「メンタルストレス」などのタグで検索すると、いちばん近い記事が出てくるようです。
[■Qiitaで、「メンタルケア」、「メンタルヘルス」、「メンタルストレス」のタグ検索](https://qiita.com/search?sort=created&q=tag%3A%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AB%E3%82%B1%E3%82%A2+or+tag%3A%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AB%E3%83%98%E3%83%AB%E3%82%B9+or+tag%3A%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AB%E3%82%B9%E3%83%88%E3%83%AC%E3%82%B9)

## プログラマ的にストレスマネジメント、ストレスコーピングを理解する
　自分をWindowsに例えると、タスクバーで確認できる「CPU使用率が一気に上がった状態」がストレスのかかった状態と言えるかもしれません。少々上がっても動作に問題はありません。でも、ずーっと 100%が続いている（ように体が体感している）場合には、少々調整することが必要ですね。それが続くとCPUの温度がどんどん上がってしまい、最悪「熱暴走」が発生してしまいます。そうなる前に対策を打てれば、長く動作を継続でき（＝エンジニアとしての仕事を続けられ）そうです。

・「ストレスコーピング」は、「自分の負荷が上がったことに敏感に気づき、対策をすぐに打てる」技術のことらしいです。
・「ストレスマネジメント」は、「そもそも自分の能力（PCスペック）に対する現在の状態を考えて、バランスが取れているのかを管理する能力」とも言えますかね。

## 知る必要があること
・どうやってストレスが瞬間的に上がったことに**気づける**のか（心の中のデーモンプログラムでポーリングするとか、イベント駆動で何かをトリガーにして気がつくとか。）
・どうやって、瞬間的に上がった**ストレスに対応する**のか（ストレスに気がついた時の対応ロジック、アルゴリズム。）

世の中には色々良書がありますので、エンジニア的解釈を施して応用してみたいと思います。

## 今後、書きたいこと
・「アンチウイルスソフト」のように「アンチストレス」処理を自分にインストール！（トレーニングで実装できる。まずは深呼吸メソッドから。）
・負荷がなければいいわけじゃない、ストレスは悪いだけじゃない
・良いコミュニケーション。メニューから操作することもできるけど、ショートカットキーとマクロもあるはず。（上手なコミュニケーションの仕方を学ぶ）
・ログ（記録）から気づきと学びを得る！
・無限ループから抜け出すための、心の処理の"break"コマンド
・プログラム（問題、タスク）がOS（私）を支配するのではなく、OSがプログラムをコントロールする。

## ChatGPTに聞いてみた
>プログラミングをするエンジニアがメンタルケアを考える上で役立つ、メンタルコーピングの例を以下に示します。
>
>マインドフルネス：日常のプログラミング作業に集中し、現在の状況に注意を払うことでストレスを軽減します。
エクササイズ：定期的な運動やストレッチを取り入れることで身体的なリフレッシュを図ります。
ペースの調整：作業の時間管理や休憩のスケジュールを設定し、効果的な働き方を実践します。
問題解決の分割：大きな問題を小さなタスクに分割して取り組むことで、ストレスや圧迫感を軽減します。
コミュニケーション：同僚や上司とのコミュニケーションを活発に行い、困難な状況や感情を共有することで負担を軽くします。
プロジェクトの優先順位付け：タスクやプロジェクトの優先順位を明確に設定し、焦りやストレスを軽減します。
リラックス法の活用：深呼吸、瞑想、ヨガなどのリラックス法を活用して、緊張や不安を和らげます。
趣味や興味の追求：プログラミング以外の趣味や興味を追求することで、心のリフレッシュを図ります。
タイムマネジメント：プログラミング作業に適切な時間枠を設定し、予定外の残業やストレスを減らします。
チームサポートの活用：チームメンバーやマネージャーと協力し、仕事の負荷を分散させることでストレスを軽減します。
これらのメンタルコーピング戦略は、プログラミングをするエンジニアが日常的に適用することで、メンタルケアとストレス管理に役立つでしょう。

## 参考になるリンク
・[厚生労働省　働く人のメンタルヘルス・ポータルサイト ストレスタグ](https://kokoro.mhlw.go.jp/common_tags/%E3%82%B9%E3%83%88%E3%83%AC%E3%82%B9/%E3%82%B9%E3%83%88%E3%83%AC%E3%82%B9/)
・[東京都労働相談情報センター　働くあなたのメンタルヘルス](https://www.kenkou-hataraku.metro.tokyo.lg.jp/link/)
・[メンタルケア協議会](http://www.npo-jam.org/library/link.html)
# Flutter/Riverpodで値が更新されないときの原因（特にリスト）

# 処方箋

特にリストだけが更新されない場合は以下のようにしてないか確認してください

ダメな例↓
```dart:main.dart
ref.read(listProvider.notifier).state = list;　//NG
```

OKな例↓
```dart:main.dart
ref.read(listProvider.notifier).state = [...list]; //OK
```

## 原因
riverpodはリストの中身の変更を監視していません。

以下参照

https://riverpod.dev/ja/docs/providers/state_notifier_provider


```dart
// Todo の追加
  void addTodo(Todo todo) {
    // ステート自体もイミュータブルなため、`state.add(todo)`
    // のような操作はできません。
    // 代わりに、既存 Todo と新規 Todo を含む新しいリストを作成します。
    // Dart のスプレッド演算子を使うと便利ですよ!
    state = [...state, todo];
    // `notifyListeners` などのメソッドを呼ぶ必要はありません。
    // `state =` により必要なときに UI側 に通知が届き、ウィジェットが更新されます。
  }
```