OmniAICreator/Qiita-1.07M huggingface dataset:
Python3.11 x Flaskで開発環境を構築する。

本投稿はMIXI DEVELOPERS Advent Calendar 2023の16日目の記事です。
他の記事も面白いものが多いのでぜひ見てください！


https://qiita.com/advent-calendar/2023/mixi

## 目的
LambdaでちょっとしたAPIを作りたいって時ありますよね？
私はPythonを選択する時が多いのですが、ここではPythonとAPI作成でよく使用するFlaskの開発環境を構築していきます。

## 前提条件
- macユーザ
- Homebrewがインストール済

## 手順
## pyenv
Pythonのバージョンを管理するpyenvをインストールする。
```
$ brew install pyenv
```

## Python
pyenvを使用してPythonをインストールする。
今回はlambdaに使用したいので、[こちらのページ](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html)から利用できる最新版をインストールする。

```
 % pyenv install 3.11  
python-build: use openssl@3 from homebrew
python-build: use readline from homebrew
Downloading Python-3.11.7.tar.xz...
-> https://www.python.org/ftp/python/3.11.7/Python-3.11.7.tar.xz
Installing Python-3.11.7...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.11.7 to /Users/satoshi.baba/.pyenv/versions/3.11.7
```

pyenvでインストールしたPythonへのパスを通す。
```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
$ source ~/.zshrc
```

全体で使用するPythonのバージョンを指定する。
```
$ pyenv global 3.11.7

$ python --version
Python 3.11.7
```

## pipenv
依存関係管理をしてくれるpipenvをインストールする。
```
$ brew install pipenv
==> Installing dependencies for pipenv: gdbm, sqlite, xz and python

(中略)

zsh completions have been installed to:
  /opt/homebrew/share/zsh/site-functions
```

## Flask
PythonでAPIを作るときに割とベターなFlaskを導入する。

適当なディレクトリに移動する。
```
$ cd ProductName
```

pipenvでFlaskを突っ込む。

```
$ pipenv install flask
```

HelloWorldを出力するソースを置いてみる。

``` HelloWorld.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    name = "Hello World"
    return name

if __name__ == "__main__":
    app.run(debug=True)
```

pipenvコマンドで仮想マシンを立てて実行する。
```
$ pipenv run python HelloWorld.py 
 * Serving Flask app 'HelloWorld'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 120-449-468
```

途中で出力されているURLをブラウザで開くとHello Worldが表示される。
http://127.0.0.1:5000/

これ環境構築終わり。
PLC 信号のON時間(MAX,MIN)を計測するファンクションブロック

# ファンクションブロックをつくってみた

タイトルの通り、信号のON時間(MAX,MIN)を計測するファンクションブロックをつくってみました。
以下のように動作します。

使い方：時間を測定したい信号をON→OFFさせる。OFF時にMAXとMINが更新されます。
出力される時間の単位は[10ms]です。
初期化したい場合はリセット信号を入力します。

![MeasureSignal.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/f089fd12-566d-b704-245a-576f2ce4bbdb.gif)


# ローカルラベル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/a4e28029-60bf-22c5-387c-a3c2fa918437.png)

```textsv:コピー用
i_Signal	ビット	VAR_INPUT	FALSE		[入力]信号
i_bReset	ビット	VAR_INPUT	FALSE		[入力]リセット信号
o_MaxTime	ダブルワード[符号なし]/ビット列[32ビット]	VAR_OUTPUT	0		[出力]処理時間 最大値(10ms)
o_MinTime	ダブルワード[符号なし]/ビット列[32ビット]	VAR_OUTPUT	0		[出力]処理時間 最小値(10ms)
o_CurrentTime	ダブルワード[符号なし]/ビット列[32ビット]	VAR_OUTPUT	0		[出力]処理時間 現在値(10ms)
mMeasureTime	ダブルワード[符号なし]/ビット列[32ビット]	VAR	0		計測用_処理時間(10ms)
mInit	ビット	VAR	FALSE		初期化フラグ
mProcessing	ビット	VAR	FALSE		処理中
mProcessingEnd	ビット	VAR	FALSE		処理終了
```

# プログラム本体

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/ad1920e9-050f-d75b-cade-689be499fee2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/327a81b4-8162-2951-cd01-f79d5fd9729f.png)

# 最後に

もっとこうした方が良い、機能追加したほうが良いなどアドバイス頂けると嬉しいです。
次はSTで記述してみます。
DevOps Center : Promotion Blocked 


+ [Promotion Blocked Due to "discrepancy in the branch in the source control system"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T2l8L)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/567c433d-a545-afb6-6d67-aa458bfe4b54.png)

:::note
Okay, so at some point when you are able to, you will need to do a full stage promotion to get that WI moving again. The resolution to the PR's conflicts will move along only when you do a full stage promotion. If this is not possible, there will likely need to be some more complex steps involved at which point I'd recommend officially opening up a support case so our team can take a look into your data model to fix things directly. 

さて、可能になった時点で、WI を再び動かすために、フルステージのプロモーションを行う必要があります。 PR の対立の解決は、完全な段階でプロモーションを行った場合にのみ進みます。これが不可能な場合は、より複雑な手順が必要になる可能性が高く、その時点で正式にサポート ケースを開始し、私たちのチームがデータ モデルを調べて問題を直接修正できるようにすることをお勧めします。 
:::

+ [DevOps パイプライン プロモーション エラー](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JeB1N)
+ [バグを検証してくれています](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JfoVl)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3d397100-0947-17c1-78be-a6a7110101f2.png)

+ [ The source control system is still processing the change request for one or more of the work items being promoted.](https://qiita.com/Keiji_otsubo/items/e1edebbac3603623342e)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5cab9af2-cfa1-9bc6-e4b1-38406e822e44.png)


+ [Dev Ops Center を別の既定の GitHub リポジトリに接続するにはどうすればよいですか?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JeJ9O)

私の理解が正しければ、あなたは別のアカウントを使用して GitHub に接続したいと考えています。再認証の手順が記載されているこの投稿を参照してください 管理者以外のユーザーは、作業項目のファイルを GitHub リポジトリにコミットできません。  また、明確にするために、DevOps Center はリポジトリではなくユーザーで認証します。その後、認証されると、既存のリポジトリ (ユーザーがアクセスできる) にアクセスして、それらを新しいプロジェクトのソースとして使用したり、新しいプロジェクトを作成したりできます。

+ [Promotion Blocked Due to "discrepancy in the branch in the source control system"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T2l8L)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7c425545-52f9-6977-1c8e-6b2b912aeeb2.png)


:::note
Okay, so at some point when you are able to, you will need to do a full stage promotion to get that WI moving again. The resolution to the PR's conflicts will move along only when you do a full stage promotion. If this is not possible, there will likely need to be some more complex steps involved at which point I'd recommend officially opening up a support case so our team can take a look into your data model to fix things directly. 

て、可能になった時点で、WI を再び動かすために、フルステージのプロモーションを行う必要があります。PR の対立の解決は、フルステージでプロモーションを行った場合にのみ前進します。これが不可能な場合は、より複雑な手順が必要になる可能性が高く、その時点で正式にサポート ケースを開始し、私たちのチームがデータ モデルを調べて問題を直接修正できるようにすることをお勧めします。 
:::

+ [Promotion to prod blocked, pull request to main is missing](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jf888)
効率の良いソートアルゴリズム クイックソートとマージソートをGoで実装

# ソートアルゴリズムは効率良くできるか

前回基本ソートアルゴリズムの解説をした。

その時の計算量はO(n ^ 2)であり、基本的には効率は良くない。

ではもっと効率の良いアルゴリズムはあるか。

実際ある。

しかし少し難しくなるのでこの記事で理解を深めてほしい。

## 再帰

ソートアルゴリズムの解説に入る前に再帰の説明をさせてほしい。

この後に紹介するアルゴリズムではこの再帰を用いて効率性を上げている。

さて、再帰とは「あるプロシージャの処理の中でそのプロシージャ自身を呼ぶこと」を指します。

これによって特定の問題をより小さなサブ問題に分割して解決するための手法となる。

再帰はループを使用する代わりに、特定のタスクを繰り返し実行するためによく使用される。

再帰の基本的なパターンは次のようになる。

基本ケース：再帰の終了条件。これがないと、関数は無限に自分自身を呼び出し続け、スタックオーバーフローを引き起こします。

再帰ケース：関数が自分自身を呼び出すケース。ここでは、問題をより小さなサブ問題に分割します。

例えば再帰を使用して階乗を計算するGoのコードを見てみよう。

このコードでは、factorial関数は自分自身を呼び出している。

基本ケースはn == 0で、このときは1を返し、再帰ケースでは`n * factorial(n-1)`を返す。

nの階乗を計算します。

```go
package main

import "fmt"

func factorial(n int) int {
    // 基本ケース
    if n == 0 {
        return 1
    }
    // 再帰ケース
    return n * factorial(n-1)
}

func main() {
    fmt.Println(factorial(5))  // Output: 120
}
```

上記ケースでは計算量削減のメリットは特にないが、ソートアルゴリズムの効率化には有効になります。

## O(n ^ 2)よりも効率の良いソートアルゴリズム

ここからアルゴリズムを２つ紹介する。

過去に[こちらの記事](https://qiita.com/tsukasaI/items/69f685735946c5240891)で紹介したアルゴリズムは要素数がnの場合の時間計算量は**O(n ^ 2)**だった。

これよりも効率を良くしたアルゴリズムがいくつかある。

今回はクイックソートとマージソートを紹介する。

（ただ２つのアルゴリズムの説明をするとめちゃ長くなるので詳細説明は割愛する。~~筆者がしっかり理解していないわけではない~~）


### クイックソート

クイックソートは基準を一つ決め、その基準よりも小さい値を左に、大きい値を右に移動させるアルゴリズムです。

基準で分割された2つの領域内で更に基準を決めて分割をする動作をする。

コードで示すと以下のようになる。


```go
func quickSort(numbers []int) {
	var _quickSort func(numbers []int, low, high int)
	_quickSort = func(numbers []int, low, high int) {
		if low < high {
			partitionIndex := partition(numbers, low, high)
			_quickSort(numbers, low, partitionIndex-1)
			_quickSort(numbers, partitionIndex+1, high)
		}
	}
	_quickSort(numbers, 0, len(numbers)-1)
}

func partition(numbers []int, low, high int) int {
	i := low - 1
	pivot := numbers[high]
	for j := low; j < high; j++ {
		if numbers[j] <= pivot {
			i++
			numbers[i], numbers[j] = numbers[j], numbers[i]
		}
	}
	numbers[i+1], numbers[high] = numbers[high], numbers[i+1]
	return i + 1
}

```

ここで再帰を使っている。


配列を半分に分割する（log nのステップ）と、各ステップで全ての要素を見る（nの操作）ことから平均計算量は**O(nlog(n))**となり一般的にはバブルソートなどよりは効率は良くなる。

またin-placeな処理であるため追加のメモリをほとんど必要としない。

### マージソート

マージソートは

1. 対象の配列に対してデータを2分割を繰り返し要素数を1にする
1. 要素同士を大小比較をしながら戻す（マージする）

を繰り返すアルゴリズムです。

こちらもコードを見てみよう。

```go
func mergeSort(numbers []int) []int {
	result := make([]int, 0)
	if len(numbers) <= 1 {
		return numbers
	}
	center := len(numbers) / 2
	left := numbers[:center]
	right := numbers[center:]

	r := mergeSort(left)
	l := mergeSort(right)
	i, j := 0, 0

	for i < len(l) && j < len(r) {
		if l[i] <= r[j] {
			result = append(result, l[i])
			i++
		} else {
			result = append(result, r[j])
			j++
		}
	}

	for i < len(l) {
		result = append(result, l[i])
		i++
	}

	for j < len(r) {
		result = append(result, r[j])
		j++
	}
	return result
}
```

クイックソートと同様に再帰を使っている。

配列を半分に分割する（log nのステップ）と、各ステップで全ての要素を見る（nの操作）という操作からマージソートも時間計算量は**O(n log n)**となる。

ただし新しい配列を作成するため、空間計算量はO(n)となる。

## まとめ

機械学習、AIで大量データのやり取りに効率的なアルゴリズムの価値がまた上がっているように思う。

基本的なアルゴリズムを学習して皆さんのサービスを爆速にしてみてください！
CI/CDについて簡単にまとめてみた(おまけ:GitHub Actions)



## CI/CDとは？
CI/CDとは、ソフトウェア開発の各ステージに、自動化されたワークフローを組み込むことで、テストやリリースの工数を削減し、開発をスムーズにするための開発手法です。

CI/CDは、それぞれ

・CI →Continuous Integration：継続的インテグレーション
・CD→ Continuous Delivery、Continuous Deployment：継続的デリバリー、継続的デプロイメント

の略称です。CI（継続的インテグレーション）は、主にテスト段階において、各モジュールやクラスへのビルド、テストの実行を自動化し、効率よく不具合を見つけるために適しています。CDは、テストを行ったコードを自動でリポジトリにリリースし、本番環境に反映させるために行われます。

## CI/CDのメリット

工数削減：マニュアル化された作業を自動化することによって、これまでビルドやテストのために大量に実行していたコマンドを、一括で管理することができます。

リリース加速：リリースの自動化により、ユーザーの元に最新の実装を提供するまでの時間が短縮されます。

テストが簡単になる：テストをマニュアル化することで、バグを見つけたり、修正したりする作業が簡単かつ効率よく行えるようになります。

## CI/CDを行えるツール

・Travis CI
・CircleCI
・Jenkins
・github Actions
・AWS：CodeBuild、CodeDeploy、CodePipeline、etc…
などなど


## GitHub Actions

GitHub Actionsは、GitHub自前のCI/CDツールです。GitHub Actions登場以前は、外部ツールとgitHubを連携して使用することが多かったため、gitHubだけでCI/CDが完結するこのツールは革命的でした。
GitHub Actionsでは、yml ファイルを編集することでワークフローを管理することができ、また、pushなどをトリガーにアクションを動作させることができます。


## 参考サイト、YouTube
・https://www.redhat.com/ja/topics/devops/what-is-ci-cd
・https://www.sbbit.jp/article/cont1/81640
・https://youtu.be/TrpmtrXIe-w?si=ubm4DYcs9jsDpb2I
PLC ファンクションブロックを作成する(GX Works3)

# はじめに

GX Works3を使ってファンクションブロックを作成する方法について記載します。
流れは他のツールでも同じと思いますので参考まで。

# ファンクションブロックの新規作成

FB/FUN上で右クリック→データ新規作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/5409eee3-c626-a266-d20b-df7ad2eb47d0.png)

データ名、プログラム言語などを選択し、OKを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/ed4ec652-e566-79d8-56be-58ade6aee370.png)

新しく作成されたファンクションブロックを編集していきます。
・ローカルラベル
・プログラム本体

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/74405787-48e5-0603-e7ac-de81099936d1.png)

# ローカルラベル

ファンクションブロックで使用するラベルを登録していきます。

VAR：ファンクションブロック内部で使用する変数
VAR_INPUT：ファンクションブロックに入力する変数
VAR_OUTPUT：ファンクションブロックから出力する変数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/0213a8a0-8e48-d49c-0c89-ff58961b1159.png)


# プログラム本体

プログラムを作成します。（自由に書いてください）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/2ad42640-3600-1798-9039-4f114f8ab4fd.png)

変換してエラーが無ければ完了です。これでファンクションブロックが作れました。
次はMainプログラムでファンクションブロックを呼び出します。

# Mainプログラムでファンクションブロックを使用する

・Mainプログラムのローカルラベルでファンクションブロックを登録する（インスタンス）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/acc8af1e-0774-5e7c-44b0-22186a26d091.png)

・Mainプログラム上にファンクションブロックを配置して接続する。
EN：ファンクションブロックを起動する
ENO：ファンクションブロック正常動作（OFFの時は異常または停止）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/bdce84b9-2069-d0a7-40a2-6b822f548f16.png)
仕様をスムーズに決めるためのポイントをまとめてみた

# はじめに
本記事は[リンクアンドモチベーションAdvent Calendar 2023](https://qiita.com/advent-calendar/2023/lmi)の16日目になります。
プロダクトマネジャーをしている武田です。

これまで私はプロダクトマネジメントをする立場として、エンジニアやデザイナーと仕様のすり合わせをほぼ毎日行ってきました。
意思決定してもらう立場として、自分が仕様を決めるために準備をしていたこと、
意思決定する立場として、こんな人とはスムーズに決められるなと思うポイントをまとめました。


## 意思決定のフレームワーク
複数の選択肢から1つを決めるときは、意思決定マトリクスを使うと効果的です。
選択肢と判断軸を整理して、それぞれの選択肢を評価することで、最も良い選択肢を決めることができます。

|     |     |  選択肢A   |   選択肢B   |   選択肢C   | 
| --- | --- | --- |  --- |  --- | 
| 判断軸①    | must    |   ◯  | ◯| ×| 
| 判断軸②    | want(高) |   ◯  | △| ◯| 
| 判断軸③    | want    |   △  | ×| ○|  


## 仕様を決めるためのポイント

### 1.実現したいことを理解する
「仕様を決めること」を目的にせずに、課題やゴールから考えることが非常に重要です。
- 今回のPJTで何を解決したいのか？
- 今何で顧客は困っているのか？
- 得たい成果（アウトカム）は何なのか？
- それはなぜか？
を理解することで、最適解を考えられることができるようになります。


### 2.仕様を決めるための論点を明確にできる
先ほどの意思決定マトリクスに沿って考えると、
- 選択肢にもれがないか？
- 判断軸にもれがないか？
- 判断軸の優先度（must/want）は適切か？
- それぞれの評価は適切か？
が決まれば意思決定ができるようになっています。

その上で、人によって判断が分かれそうなことを事前に整理して、何が決まれば決まるか？（論点）を明確にすることで、議論をスムーズに進めることができるようになります。
また、複数の論点を1つにまとめて扱う場合は議論が複雑になりがちなので、1つずつどの順番で決めると良いかを考えることも効果的です。例えば、複数の選択肢を選ぶ論点ではなく、YesかNoの2択で答えられる論点にすることで、議論の複雑性を縮減することができます。


### 3.仕様決定の上で、前提条件を明示する
例えば、どの時間軸（ステップ）で開発するのか、今回開発するスコープはどこなのかなど、論点の対象外になることを明示することで、思考の幅を狭めて決めることだけに集中して議論できるようになります。


### 4.顧客と開発者の両方の視点から考える
判断軸をもれなく洗い出すためには、ユーザーと開発者のそれぞれの視点で考えることが必要です。
技術的負債や開発工数に注目しすぎてたり、逆に顧客のことだけを考えて何でもできる仕様になりすぎずに、両面から考えることができていると、合理的な意思決定ができます。


### 5.想像ではなく、ファクトを見る
空論で決めるといざリリースしてから、想定してないことに気づくことになります。
正しい情報で判断するためにも、顧客の利用状況のデータを見たり、意図しない使い方をしている場合に、どんな理由で使っているのかヒアリングすることが大事です。
頼りになるエンジニアは、利用状況ってどうですか？と聞くとパッとデータを出してくれてとてもありがたいと感じています。


### 6.文字だけではなく、図解を使う
「百聞は一見に如かず」という言葉がある通り、文章だけだとわかりづらいことも、視覚的に表現することで、早く正確に相手に伝えることができます。何でも作りすぎると時間がかかってしまいますので、効果的な時に絞ってやることをオススメします。


## 議論をする上で心がけていること

**「たたき台」を作る人にはリスペクトを**

仕様を決定する上で、いろんな視点で考えることが重要です。
選択肢をもれなく出して、決めるための観点を出して、最も良い選択肢の理由を考えて、
と突き詰めれば詰めるだけ、労力と時間がかかります。

その思考をみんながショートカットできるように、「叩き」をつくる人にリスペクトを持つことが大事だと思います。

>イチがなければ、議論もフィードバックもできないわけで、その第一歩にしっかりコミットしてくれたことにリスペクトをすることが超絶大事なんですよ。

https://note.com/azamixx/n/n08c6fc5dd02a

**意思決定ができない（進まない）理由は大きく3つ**

- 決める「人」が明確でない
- 「決め方」が決まっていない
- 決めるための「情報」が足りない、整理されていない

どれかが欠けていると決まらず、経験上ほとんどが3つ目に起因していることが多いです。
逆にうまく情報を集め、整理できると意思決定はスムーズに進みます。

## おわりに
最後まで読んできただき、ありがとうございました。少しでも何か参考になっていれば幸いです。


社内の議論は必要な分だけにして、顧客に向き合う時間を増やすことがチームにとっても顧客にとっても良いことだと信じています。
【忘備録】「UX」の例文

# 背景・経緯
UXを頑張ったUIを作ったことをアピールしようと思ったものの、「UXを頑張りました」では文法的におかしいと感じたため例文を記録した。

# 例文
・UXを高める。
・UXを意識しました。
・貴社のUI/UXデザインに感銘を受けました。
・UXの向上につながる入力フォームのデザインのカスタマイズを行いました。
・UXの最適化を行う。
・UXを設計する。


>【参考にした例文】 
例文1.UXを意識したホームページを制作しました
例文2.WebデザイナーはUI・UXを学ぶのが必須だ
例文3.UXを無視してホームページは作れない
例文4.このサイトはUXを意識していますか
例文5.ユーザーの意見を聞かずにUXデザインとは言えない
by 言葉の手帳[「UX」の使い方や意味、例文や類義語を徹底解説！」](https://www.tutitatu.com/%E3%80%8Cux%E3%80%8D%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%82%84%E6%84%8F%E5%91%B3%E3%80%81%E4%BE%8B%E6%96%87%E3%82%84%E9%A1%9E%E7%BE%A9%E8%AA%9E%E3%82%92%E5%BE%B9%E5%BA%95%E8%A7%A3%E8%AA%AC%EF%BC%81/)

# 参考にした記事
「「UX」の使い方や意味、例文や類義語を徹底解説！」言葉の手帳(2021.6.6)

https://www.tutitatu.com/%E3%80%8Cux%E3%80%8D%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%82%84%E6%84%8F%E5%91%B3%E3%80%81%E4%BE%8B%E6%96%87%E3%82%84%E9%A1%9E%E7%BE%A9%E8%AA%9E%E3%82%92%E5%BE%B9%E5%BA%95%E8%A7%A3%E8%AA%AC%EF%BC%81/

「ユーザーエクスペリエンス（UX）を理解しよう。」株式会社アーティス(2016.03.18)

https://www.asobou.co.jp/blog/web/ux

「優れたユーザーエクスペリエンスを実現するためのUXハニカム」 (2016.06.17)

https://www.asobou.co.jp/blog/web/ux-honeycomb

“User Experience Design”(JUNE 21, 2004 )

https://semanticstudios.com/user_experience_design/
Cognito idTokenをAPIGW＆Lambdaで受け取ってデコードする

Cognito idTokenをAPI GW＆Lambdaで受け取ってデコードする手順についてのメモ書きです。

# やりたいこと
1. Cognitoでログインし、idToken(jwt)を払い出す。
1. 手順１のidTokenを利用し、APIGWで作成された認証必要なAPIを呼び出す。
1. Cognito Authorizerでユーザー認証を行い、バックエンドのLambdaを起動する。
1. Lambdaで手順１のidTokenを受け取り、デコードする（emailなどのユーザー情報を取得する）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/050e7c0f-7fe5-dc09-8773-9ae8bb98a333.png)

# Cognito Userpool
- Userpoolの作成手順は割愛します。
- idTokenの払い出しについて、SDKなどを使うことも可能ですが、今回はホストされたUIを使います。（コールバックURLはいったんlocalhostとします）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/377253bc-649d-cfd3-c13f-fed17d7ef60c.png)

- あらかじめ登録したユーザーでログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/c34b8e01-2850-b29b-c5ae-336836131707.png)

- urlからid_tokenの値をメモっておきます。
![Screenshot 2023-12-14 at 17.14.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/c819ea02-2380-dd70-e081-54b70c19ce32.png)


# Lambda
## レイヤー
レイヤーを作っておきます。今回は「python-jose」というpythonのライブラリを使います。
python-joseをダウンロードし、zip化します。
```bash
$ pip3 install python-jose -t python
$ zip -r9 layer.zip python
```
layer.zipをアップロードしてレイヤーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954734/884a0830-b854-c01b-db15-3867605b4d31.png)

## Lambda関数
下記のLambda関数を作成します。
- ランタイム: Python 3.11
- アーキテクチャ: x86_64
- 基本的な Lambda アクセス権限で新しいロールを作成
- レイヤー: 上記手順で作成したレイヤー
- ソースコード（eventのheadersからidTokenを取り出し、デコードしユーザーのemailを取得）:
    ```python
    import json
    from jose import jwt
    
    def lambda_handler(event, context):
        token = event["headers"]["Authorization"]
        decoded_token = jwt.get_unverified_claims(token)
        email = decoded_token["email"]
        return {
            "statusCode": 200,
            "body": json.dumps(f"Hello, {email}!")
        }
    ```

# APIGW
## オーソライザー
下記のオーソライザーを作成します。
- オーソライザーのタイプ: Cognito
- Cognito ユーザープール: 上記手順で作成したCognitoユーザープールを選択
- トークンのソース: Authorization

## API
下記のAPIを作成します。
- APIタイプ: REST API
- リソース: /
- メソッド: GET
    - 統合タイプ: Lambda 関数(上記手順で作成したLambdaを選択)
- メソッドリクエスト:
    - 認可: 上記手順で作成したCognitoオーソライザーを選択
- 統合リクエスト:
    - マッピングテンプレート:
        - コンテンツタイプ: application/json
        ```
        #set($inputRoot = $input.path('$'))
        {
          "headers": {
            "Authorization": "$input.params().header.get('Authorization')"
          }
        }
        ```

# 動作確認
```bash
$ curl -H "Authorization: <ログイン時に払い出したidToken>" -X GET <APIエンドポイント>
```

```:レスポンス
{"statusCode": 200, "body": "\"Hello, test-user@sample.com!\""}
```
素人なりにJavaScriptを独学してみる話

# 自己紹介と意気込み

文系の学部卒で未経験ながらエンジニアになりました
目にする言語はJava,JavaScript,Delphi,Cobol等々です。

意識しているのは

- 右辺と左辺を分けて整理する
- if文の条件を言語化する
- デバッグして引っかける

の3つでなんとか業務に食らいついている感じです。

また古い製品を保守する現場なので今風なTypeScriptとかVueといった
ナウでヤングな今風"エンジニア"っぽい言語を目にする機会は業務上なさそうです

とはいえ、せっかくエンジニアというキャリアを歩んでいるので
業務で培った知識を横展開してみよう、ということでJavaScriptを独学してみることにしました！


# 書籍を選ぶ

- 分厚くサンプルコードが多数あり今後辞書代わりにもなる
- ハンズオンがありアプリ開発を経験できる
- オープンソースでGitHub上でも読めてしまう

という点から書籍を購入することにしました。
いい値段がしますが社内の書籍購入制度にお世話になりました。

◆web版はこんな感じです↓

https://jsprimer.net/


◆GitHub上のreadmeでも読んでみたりしました↓

https://github.com/asciidwango/js-primer/blob/master/source/use-case/todoapp/README.md


# 書籍を理解するためにやったこと

- まず一周ざっくりと読む
- アプリ開発の章はデバッグして中身を見る
- コンソール出力して変数の中身を確認する
- わからないソースコードをAIに解読させてみる
- Qiita記事化してみる

スタバで分厚いエンジニア本読んでいる人カッコよくない？と勝手に考えながら外で読むときもありました！（笑）1周目で完璧に理解はできないと思っていたので「へぇそうなんだ～」くらいの気持ちでサクサク読んでいきます。

アプリ開発の章は、Node.jsを引っ張ってきて、勉強用の階層を作り、サンプルコードをコピペして、WSLでコマンドを打って、ローカルサーバーを起動してました。時には`console.log()`を埋め込んで「この変数の中身見てやる！」とかしてました。

特段苦戦したのが、イベントリスナー処理の部分が本当に理解できませんでした。。。そこはAIにファイルごとコピペして何度も解説してもらい、自分でコードを読み理解を深めていきました。おかげさまで「アロー関数がそのまま変数として渡ってそう！」というのに気付けました。（記事執筆中...）

アドカレデビューに向けて試しに書いてみたQiita記事でコメントをいただけたのも学びでした！「`console.dir()`と`console.dirxml()`を使うと出力内容が変化する」というのは頭になかったので、非常にありがたい学びでした。ありがとうございます！！



◆Qiitaデビュー記事でコメントをいただいた↓

https://qiita.com/sairrr_/items/1b50796266087c8f18c9

# 今後やってみたいこと

- アプリ開発の章、最後までやりきる
- ローカルサーバーが立ち上がる仕組みを理解する

npxコマンドでなぜサーバーが立ち上がるのか、結構気になってます。



# 最後に

本当はローカルサーバーの立ち上がる仕組みや、Todoアプリの追加や削除も実装しきって、投稿したかったのですが、時間足らずでした！涙

初学者ポエムになりましたが、何度も読むうちに知識が増えているので、読むたびに発見があり楽しいですね。マイペースに気の向くままに独学は続けてみようと思います！
SQLの実行計画をみて危険を察知できるようになりたい私のためのチェックリスト

# この記事は
 私は初心者で、せっかくSQLの実行計画をみてもわからないことが多すぎてどこから見ればよいのかわかりませんでした。調べても、見るべきポイントが多くて全く覚えられず。

 「初心者でも危険を察知できるようになりたい！」
 
 そんな私のためのチェックリストです。せっかく12月なので、勝手に1人アドベントカレンダー（1日1個追加して更新する）やっていきます。
 
## 危険な実行計画のサンプル
```
+----+-------------+------------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table      | type | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+------------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | large_table| ALL  | NULL          | NULL | NULL    | NULL | 100000 | Using where |
+----+-------------+------------+------+---------------+------+---------+------+--------+-------------+
```

## :warning: 実行計画チェックリスト
チェックリストにの1つでも当てはまったら、危険なクエリかもしれません。
- [ ] typeが、
    - [ ] `all`に設定されていないか？
    - [ ] `index`に設定されていないか？
    - [ ] `range`に設定されており、対象カラムの検索対象範囲が広すぎる懸念がないか？
- [ ] key が、
    - [ ] `NULL`になっていないか？

## 説明
### typeが`all`または`index`または`range`に設定されていないか？
typeという項目は、対象のテーブルにどのようにアクセスするかを表しています。
危険なものから順に、`all` > `index` >> `range`となっています。

type    | index | 説明 |
--------|-------|-----|
`all`   |　無     | なんの手がかり(index)もなく、フルスキャンする。最も遅い。 |
`index` |　有     | indexはあるけど、indexをフルスキャンする。結局遅い。 |
`range` |　有     | indexを使った範囲検索。場合によって激重の懸念（datetime型のカラムを特定の日時で範囲検索するなど）

- 他のtypeは、[MySQL 8.0リファレンスマニュアル: EXPLAIN 結合型](https://dev.mysql.com/doc/refman/8.0/ja/explain-output.html#explain-join-types) を参照

### key が、`NULL`になっていないか？
keyという項目を見ると、インデックスあるか・あれば何が使われているかを知ることができます。
危険なものから順に、`NULL` > `{index_name}` >> `UNIQUE` > `PRIMERY` となっています。

key       | index | 説明 |
----------|-------|-----|
`NULL`    | 無    | インデックスを使用していないのでフルスキャンする。危険。
`{index_name}` | 有 | index_nameが表示される。UNIQUE制約がない。インデックスがあるのでましだけど、警戒。
`UNIQUE`  | 有    | プライマリキー以外のUNIQUE制約があるkeyをインデックスに使用している。NOT NULL制約はない場合があるが、少なくともNULL値は１つしかない。`PRIMARY`より劣るが、まだ安全。
`PRIMARY` | 有    | プライマリキーをインデックスに使用している。UNIQUE制約およびNOT NULL制約がある。最も安全。

似た項目にpossible_keysがありますが、クエリが検討する可能性があるインデックスのリストを出してくれます。結果、選ばれたインデックスはkeyに表示されます。要するにkeyを見れば危険は察知できそうです。

## その他
- [x] INDEXの効かないカラムに対してORDER BY句を使っていないか？


## 最後に
もしコメントや追加依頼等で教えていただけると喜びます。
よろしくお願いします。
2023年のPC環境まとめ（Arch Linux,Neovim,Keyball）

## 2022年の環境
- Windows + WSL2 Ubuntu
- Windows Terminal
- Komorebi
- Neovim

## Arch Linux
Arch Linuxを使おうと決めた理由としては、WSL2 Ubuntuで上手く動かないツールがあったことや、Komorebiを使い始めてタイル型のウィンドウマネージャーに興味を持ったことです。

ブラウザ操作にも[Vimium](https://chromewebstore.google.com/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb)を使っていたりして、キーボードのみで操作することを意識しているため、タイルマネージャーを導入したのですがもっと快適な環境を求めて**Sway**に出会いました。

参考にした記事やサイト

https://zenn.dev/haxibami/articles/wayland-sway-install

https://mako-note.com/ja/sway-desktop-environment-in-archlinux/

https://wiki.archlinux.jp/index.php/インストールガイド

記事等で丁寧に説明されていますが
正直、ChatGPTなしではLinuxでGUIを起動することすら無理だったかもしれません。
ググってもよくわからない時には助けられました。

### Sway

https://wiki.archlinux.jp/index.php/Sway

Waylandで動くウィンドウマネージャーです。
設定がとにかく簡単で気に入っています。
今はSwayFXを使用しています。
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512427/13316a78-186a-ba1a-e8a2-30d5a9b0239e.gif)


#### アドベントカレンダーで書いた記事

https://qiita.com/eve_yoriso/items/677ffeb4308fae4e59b1

#### Waybar

https://github.com/Alexays/Waybar

上部にあるやつですね。
レイアウトはCSSで編集できるので簡単です。
- modules-left 
    - sway/workspaces
- modules-center 
    - sway/window
- modules-right 
    - pacman
    - pulseaudio
    - battery
    - network
    - clock

を表示しています。

#### Wezterm
Rust製のターミナル
luaで設定が簡単にできます。

https://wezfurlong.org/wezterm/index.html

#### Wofi
ランチャー
こちらもCSSで簡単にデザインの編集ができます。

https://hg.sr.ht/~scoopta/wofi

## Keyball44
![IMG_1132.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512427/8f420bc5-fe21-3e4f-f1da-1ca084b436d3.jpeg)

https://shirogane-lab.net/items/64b7a006eb6dbe00346cd0c5

今年一番の神アイテム
Keyballのおかげで手の無駄な動作を最小限に抑えられています。

テンティングに使用しているアイテムはカメラ用です。
- マンフロット　POCKET三脚
- UTEBIT マグネットスタンド

:::note warn
会社で使うと浮きます。
:::

#### QMK Firmware
また、QMK Firmwareはこちらの記事を参考にさせていただき、使わせていただいています。

https://zenn.dev/takashicompany/articles/69b87160cda4b9

トラックボールを動かすと自動的にマウスレイヤーに切り替わるため、マウスレイヤー用のキーを設定する必要がなくなります。

### Filco
分離型のパームレストを使っています。

## Neovimプラグイン
### lazy.nvim

https://github.com/folke/lazy.nvim

Neovim用のモダンプラグインマネージャー
Packerから移行しやすかったのでよかったです。

ここ最近はdpp.vimなども登場しているので乗り換えるか迷い中・・・
年末年始に試してみようかと思います。

https://zenn.dev/shougo/articles/dpp-vim-beta#typescript-設定部分について

### hop.nvim

https://github.com/phaazon/hop.nvim

EasyMotion系のプラグインを使ったことがなく、hopを使い始めました。
病みつきになる操作感です。

### copilot.vim

https://github.com/github/copilot.vim

AIに助けられないと恥ずかしながらRust書けません・・・。
業務では主にPHPやJSを使っていますが、タイプ量が減るので大変助かっています。
### Everforest

https://github.com/sainnhe/everforest

Neovimはもちろん、WeztermやGTKテーマもEverforestで統一しています。
#### Everforest-GTK-Theme

https://github.com/Fausto-Korpsvart/Everforest-GTK-Theme

## まとめ
dotfilesで管理しているものばかりですが
来年は環境構築をもっと楽にできるように、しっかりと整理したいなと思っています。
論文をChatGPTにレビューさせるプロンプト

※ ChatGPTが出力した文章を論文に使って良いのか？という議論はここでは考慮しません。

自分が書いた論文原稿を、学術論文にふさわしい文体に書き直してくれるGPTのプロンプトを紹介する。また、日本語は英語に翻訳してくれる。

元原稿はTexを仮定しているが、すこしいじればTex以外の原稿もいけると思う。

プロンプトは２種類あるがほとんど同じ。違いは数式を変更するなと明示的に指示しているかどうか。数式が混在している原稿には、１つめのプロンプトを使っている。

使い方だが、OpenAI APIのPlaygroundを使うのが推奨。systemにこのプロンプトを貼り付け、Userメッセージに原稿を貼れば、アップデートされた原稿が返ってくる。出力を元原稿とdiffツールなどで比較しながら仕上げていくと良さそう。ちなみに私は、手堅い出力を得るためにtempratureとtop_pのパラメータを低めに設定している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3445203/d2892818-1b85-ed6d-1ad9-f5c58147be35.png)

ChatGPTを使っている場合は、最初にこのプロンプトを投げて、２回目以降に原稿を投げると良いと思う。その場合は、プロンプトを若干いじったほうが良いかも。

注意点として、長い文章は最大トークンを超えてしまうため、細切れにして入力する必要がある。ぼくの原稿の例だと、GPT-4 turbo（gpt-4-1106-preview）を使っても、５ページくらいが限界だった。（数式はtokenの消費量が多いようだ）

以下、あくまで個人の感想。伝わる文章に改善する能力は、Editageの人間レビュワーよりもはるかに高い。DeepLやGrammerlyはまったく及ばない。ワーディングも「論文でよく見かける単語だが、高校英語では習わない」のような見栄えのする単語を使ってくる。総じて、今後は
おカネに恵まれない
若手研究者が、Editageを通さずに投稿すること増えそうだ。

## 数式は変更禁止だと明示するプロンプト

You are a distinguished physicist who are very good at writing academic papers in English. You are asked to paraphrase a part of my manuscript using LaTeX formatting.

Since this will be published in an academic journal in the field of physics, please adhere to the appropriate academic style, terminology, and expressions. If you come across any Japanese text, please translate it into English.

### Requirements

Never change the mathematical expressions and blocks. For example, if you see the following text:

$a = b$
以上の結果から、
\begin{IEEEeqnarray}{lCl}
\UhenComp
&=&\Sum{i=2}{\Nx}\turiB{i}\mid \plusI.
\end{IEEEeqnarray}
がただちに得られる。

You have to ignore $a = b$ and the math block below

\begin{IEEEeqnarray}{lCl}
\UhenComp
&=&\Sum{i=2}{\Nx}\turiB{i}\mid \plusI.
\end{IEEEeqnarray}

Never change the latex commands. For example, if you see the following text:

\newcommand{\ib}{\ell}
\cite{abc}
\begin{xyz}

you have to remain these latex commands as they are.

## 数式について触れないプロンプト

You are a distinguished physicist who are very good at writing academic papers in English. You are asked to paraphrase a part of my manuscript using LaTeX formatting.

Since this will be published in an academic journal in the field of physics, please adhere to the appropriate academic style, terminology, and expressions. If you come across any Japanese text, please translate it into English.

### Requirements

Never change the latex commands. For example, if you see the following text:

\newcommand{\ib}{\ell}
\cite{abc}
\begin{xyz}

you have to remain these latex commands as they are.
CSSのメモ

# CSSの基本文法
```css:基本文法
セレクタ {
    装飾の内容 ;
    }
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3321301/98ae6bd0-5725-7c57-e486-e05fdd0b9827.png)

# easingについて

`linear` : 等速で変化する。安定型
`ease-in` : 徐々に加速する。勢い型
`ease-out` : 徐々に減速する。余韻型
`ease-in-out` : 加速してから減速する。

## 最近使用したCSSの種類一覧

- [x] transition
- [x] pointer-events
- [x] vertical-align




## その他

#### googleフォントの読み込みCSS

 ```css
url('https://fonts.googleapis.com/css2?family=Inter:wght@700&display=swap');
 ```
lambdaからRDS(PostgreSQL)に接続

#  LambdaからRDSへの接続設定が簡単になったのでやってみる

## 前提
言語（バージョン）：Python3.8
RDS：PostgreSQL
※RDSは作成済みとする
ライブラリ：psycopg2

## 全体の流れ
・ Lambda関数の作成
・ コードの作成
・ 環境変数の設定
・ レイヤーの追加
・ RDS接続設定


## 関数作成
・　一から作成を選択
・　任意の関数名を入力
・　ランタイムはpython3.8を選択
※理由は後述
・ アーキテクチャはx86_64を選択

関数の作成を押下


## コードを作成しDeploy

```
import psycopg2
import os

# 環境変数から接続情報を取得
db_endpoint = os.environ['DB_ENDPOINT']
db_username = os.environ['DB_USERNAME']
db_password = os.environ['DB_PASSWORD']
db_name = os.environ['DB_NAME']

def lambda_handler(event, context):
    # データベースに接続
    conn = psycopg2.connect(
        dbname=db_name,
        user=db_username,
        password=db_password,
        host=db_endpoint
    )

    # カーソルの作成
    cur = conn.cursor()

    # SQL の実行
    cur.execute('SELECT *  FROM テーブル名;')
    records = cur.fetchall()

    # カーソルと接続のクローズ
    cur.close()
    conn.close()

    # 結果の返却
    return {
        'statusCode': 200,
        'body': records
    }
```

## 環境変数の設定
設定　→ 環境変数より以下を設定する
・ DB_ENDPOINT
　　　　RDSのエンドポイントを指定する
・ DB_USERNAME
　　　　接続用のユーザ名を指定する
・ DB_PASSWORD
　　　　接続用のパスワードを指定する
・ DB_NAME
　　　　接続先のDB名を指定する

## レイヤーを追加する
・ レイヤーソース：「ARNを指定」を選択
・ 下記サイトからARNをコピーして入力
・ 検証を押下後、追加を押下

※　psycopg2-lambda-layer
https://github.com/jetbridge/psycopg2-lambda-layer
※東京リージョンのPython3.8の場合は↓
arn:aws:lambda:ap-northeast-1:898466741470:layer:psycopg2-py38:1
※　pythonのバージョンを3.8にしている理由はここです。
2023年12月時点で3.8が最新バージョン

## RDS接続設定
・ 設定　→　RDSデータベース
・ RDSデータベースに接続　を押下
・ 事前に作成したデータベースを選択する
・ プロキシは使用しないを選択
　　　（今回はテストのためプロキシは使用しない）
・ 作成を押下

## 完成
Testを押下して実行してみよう
※ イベントは適当（デフォルトのまま）で作成でOKです。

以上です。
Microsoft の新しい認定スキル "Microsoft Applied Skills" とは

需要の高い技術スキルを証明するための新しい資格である Microsoft Applied Skills を発表しました。
https://techcommunity.microsoft.com/t5/microsoft-learn-blog/announcing-microsoft-applied-skills-the-new-credentials-to/ba-p/3775645

Microsoft Applied Skills は、ビジネスの目標と目的に沿った重要なプロジェクトを実装するために必要な対象を絞ったスキルを持っていることを証明する、新しい検証可能な資格です。応用スキルは、スキルを主役に据える新しい機会を提供し、組織内の主要なプロジェクトに何ができるか、何をもたらすことができるかを示す力を与えます。

Microsoft Applied Skills 認定資格を取得する方法：新しい資格を取得するプロセスは簡単で柔軟です

1. 無料の自習型ラーニング パス (Microsoft Learn で現在利用可能) やインストラクター主導のトレーニング (2024 年初頭に提供予定) など、オプションのトレーニングで準備します。
2. Microsoft Azure や Microsoft Power Platform などの製品で一連のシナリオベースのタスクを解くオンラインの対話型ラボベースの評価に合格して、認定資格を取得します。ラボ評価は、Microsoft Learn から直接利用できます。
3. 新しい資格とスキルを祝い、共有します。評価に合格すると、LinkedIn プロファイルで簡単に共有できる Microsoft によって検証された資格情報を受け取り、プロフェッショナル ネットワークにスキルを披露する機会を提供します。

Microsoft Credentials: 認定資格、応用スキル、またはその両方30年以上にわたり、業界で認められている当社の認定資格は、需要の高い職務において世界クラスの技術力の証明を提供してきました。今日の絶え間なく変化するビジネス環境では、応用スキルの資格によって提供されるように、検証済みのプロジェクト固有のスキルが必要な場合もあります。 
補完的な Microsoft 認定資格と Microsoft 応用スキルは、キャリアを担当し、不可欠な存在になるために必要なすべてです。そして、どの道が自分に適しているのか、どのように組み合わせることができるのか疑問に思うかもしれません。 
ここでは、あなたが決定するのに役立つ簡単なインフォグラフィックを紹介します。また、「Microsoft 資格情報の選択」でも確認できます。
https://aka.ms/ChooseYourMicrosoftCredential
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525368/9429e031-4c89-eef6-9107-2c312eb4e1b4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525368/f0a89a2e-89b5-4221-fba7-d23c5f225dec.png)

新しい、Microsoft Applied Skills と Microsoft Certification を比較したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525368/03061fbd-6c6f-0899-44ff-da78f9d0a838.png)

応用スキル認定資格の多くは、認定試験の準備に役立てることができます。
応用スキルはラボでの成績に基づいて授与されるため、その経験が認定資格で成功するための準備となる可能性があります。すべてのロールベースの認定試験には経験が必要なため、応用スキル認定資格を取得することは、試験に合格するために必要な経験を積む方法の 1 つです。
ただし、認定試験で評価されるすべてのスキルに応用スキル評価ラボが関連付けられているわけではないため、応用スキルだけに頼るべきではありません。
認定試験の準備方法をご覧ください。
https://learn.microsoft.com/en-us/credentials/certifications/prepare-exam
Pythonでテキストに含まれる数字を抜き出す

以下のようなパターンでテキスト内に含まれている数字を抜き出すのに、以下の正規表現を使用します
```
pattern = r'[^+\-\d]*([+-]?\d+([.,]\d+)?).*'
```

パターン1: 正の整数の場合
```
text = '123`
result = re.match(pattern, text)
print(result[1])  # => 123

text = '+123`
result = re.match(pattern, text)
print(result[1])  # => +123
```

パターン2: 負の整数の場合
```
text = '-123`
result = re.match(pattern, text)
print(result[1])  # => -123
```

パターン3: 小数を含む場合
```
text = '123.456`
result = re.match(pattern, text)
print(result[1])  # => 123.456

text = '+123.456`
result = re.match(pattern, text)
print(result[1])  # => +123.456

text = '-123.456`
result = re.match(pattern, text)
print(result[1])  # => -123.456
```

パターン4: 数字と数字以外の文字が含まれている場合
```
text = '今日の気温は-10.5度でした`
result = re.match(pattern, text)
print(result[1])  # => -10.5
```

パターン5: 小数点が,の場合（ヨーロッパで使用されている表記）
```
text = '今日の気温は-10,5度でした`
result = re.match(pattern, text)
print(result[1])  # => -10,5
```
WAI-ARIA（ウェイ-アリア）の基本調べてみた

## WAI-ARIAとは？

WAI-ARIA（ウェイ-アリアと発音）とは **Web Accessibility Initiative Accessible Rich Internet Applications** の頭文字からできた言葉です。
W3Cが発行しているWebアプリケーションをよりアクセシブルにするための仕様です。

HTMLはタグ一つひとつの要素にセマンティクス（意味）を持っています。
ただ、HTMLだけではどうしても表現できないことがあります。
それを補完するのがWAI-ARIAです。

スクリーンリーダーなどの支援技術を通して、障がいを持った人でも適切に情報を取得することが可能になります。

## WAI-ARIAの機能

WAI-ARIAには主に3つの機能があります。

- **WAI-ARIAロール** 要素の役割を定義します
    - `role="navigation"`、`role="button"`など
- **WAI-ARIAプロパティ** 要素の性質を定義します
    - `aria-required="true"`、`aria-label`など
- **WAI-ARIAステート** 要素の状態を定義します
    - `disabled="true"`、 `checked="checked"`など

## いつWAI-ARIAを使えばいい？

[WAI-ARIAの基本 - ウェブ開発を学ぶ | MDN](https://developer.mozilla.org/ja/docs/Learn/Accessibility/WAI-ARIA_basics)によると4つの場面があります。

1. 道しるべ/ランドマーク
    - `nav`、`search`、 `tablist`、 `tab`、 `listbox`
1. 動的コンテンツの更新
    - プログレスバーなど、`aria-live`属性で伝える
1. キーボードのアクセシビリティ向上
    - `tabindex` でtabキーでフォーカスをコントロールする
1. 意味論的ではないコントロールのアクセシビリティ
    - `div`や、Javascriptによって大きく変更されているHTMLタグなど、アクセシビリティの提供が困難になるので、`role`を組み合わせたり`aria-required`や`aria-posinset`などで補います 

## WAI-ARIAの注意点

WAI-ARIAは補完するものです。
WAI-ARIAは必要な場合のみ使用すると良いようです。

1. セマンティックなHTMLを優先的に使う
1. HTML要素の意味はむやみに変えない
1. キーボードで操作できるようにする

## 参考

- [WAI-ARIAの基本 - ウェブ開発を学ぶ | MDN](https://developer.mozilla.org/ja/docs/Learn/Accessibility/WAI-ARIA_basics)
- [Accessible Rich Internet Applications (WAI-ARIA) 1.2 日本語訳](https://momdo.github.io/wai-aria-1.2/)
- 井原力也.小林大輔.益田草一山本伶.「Webアプリケーションアクセシビリティ今日から始める現場からの改善」.技術評論社,2023
Git Stashを使って自分のコードを簡単に保存しよう

# はじめに

ある作業をしている時に何らかの理由で他の作業を先にやらなきゃいけない場合があります。しかし、まだ完了していない作業をcommitしたくはないですね。

- commitはしないけど、作業内容を保存しておきたい！

この時に、役に立つのが**Git Stash**です！

# git stashとは

まだ終わっていない作業をスタックに保存するコマンドです。 これを通じてまだ完了していない作業をcommitせずに、後で再び取り出してきて作業を続けることができます。

git stashの対象ファイルは以下となります。

- ワーキングディレクトリで修正したファイル
    - modifiedでありながら、Tracked状態のファイル
- Staging Areaにあるファイル
    - Staged状態のファイル

※新しく作成したファイルはgit stashの対象ファイルになりません。git stashの対象としたい場合はそのファイルをStaging Areaにあげましょう。

# git stash

作業していたことをスタックに保存するコマンドです。`git stash`もしくは、`git stash save`コマンドで実行できます。


```
# git stash　←　実行結果
Saved working directory and index state WIP on tmp_branch: ce54b7b tmp commit
```

これで作業を保存することはできます。しかし、保存するものが増えると何が何か分からなくなります。なので、各保存したスタックに自分が見たら分かるようなメッセージを書いておきましょう。

`git stash -m [メッセージ]`もしくは、`git stash save [メッセージ]`コマンドで実行できます。

```
# git stash -m 臨時メッセージ　←　実行結果
Saved working directory and index state WIP on tmp_branch: 臨時メッセージ
```

# git pop

保存したスタックを取り出したい時に使うコマンドです。このコマンドを実行すると一番最近に保存した作業が取り出しされます（保存内容はスタックからなくなります）。最近のものではなく、特定の保存内容を取り出したい場合は、`git pop [スタック番号]`コマンドを使えば可能です。

スタック番号は次のgit stash listコマンドで確認できます。

# git stash list

git stashされている一覧を表示するコマンドです。

```
# git stash list　←　実行結果
stash@{0}: WIP on tmp_branch: メッセージ２
stash@{1}: WIP on tmp_branch: テスト
stash@{2}: WIP on tmp_branch: 臨時メッセージ
```

`{}`に中にある番号がスタック番号となります。

# git stash apply

git popと同じく保存内容を現在のワーキングディレクトリに適用するコマンドですが、保存内容はスタックからなくなりません。つまり、スタックを維持したまま、保存したスタックを使いたい時に良いものです。

このコマンドも`git stash apply [スタック番号]`で特定の保存内容を指定することができます。

# git stash drop 

スタックを削除するコマンドです。一番最近のものを１つ削除します。
`git stash drop [スタック番号]`コマンドで特定のスタックを削除することができます。

# git stash clear

全てのスタックを削除するコマンドです。全ての保存が要らなくなった場合使ったら良いでしょう。

# 最後に

git stashはコマンドも簡単で凄く便利です。私は他の作業をしたり、他のブランチに移動したい時に結構使っています。作業中、他の作業をする必要がある時にぜひ使ってみてください！
Platform API Basics 



# Use SOAP API

+ [Problem with Platform API Basics Use SOAP API](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Pg3uBSAR)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/01665ae7-36c0-b443-92ac-e08db38498c9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f8f96c54-bb5e-8ddf-e814-5730bbf7297c.png)

:::note
Ok, so the thing is, the instruction is missleading.

First, we should save the URI from the login response.

Than later it says: " The endpoint URI looks something like this: https://MyDomainName.trailblaze.develop.my.salesforce.com/services/Soap/c/36.0."

As I was trying to use what I got during the login, and using this format of my URI:

https://mindful-unicorn-81efjx-deved.trailblaze.my.salesforce.com/services/Soap/c/59.0, I got errors all the time.

Then I was super annoied, and simply copied my URL from the browser, and added the "/services/Soap/c/59.0" part to the end. It looked like this:

https://mindful-unicorn-81efjx-dev-ed.trailblaze.lightning.force.com/services/Soap/c/59.0

問題は、その指示が誤解を招くということです。

まず、ログイン応答から URI を保存する必要があります。

:::
【Cursor（カーソル) 】VSCodeにAIが搭載されたIDE【始めました】

## はじめに
こんにちは!
優磨です。

[Cursor](https://cursor.sh/)を知っていますか？

X（旧：Twitter）を見ていると、VSCodeを超えた！
という風に話題のIDEです。

一言で言うと、
VSCodeにAIが搭載されたIDE
です。

GPT3.5ベースのAIとチャットをして、
コードを生成できます。
VSCodeをフォークして作られているので、
**VSCodeの拡張機能が使える**のが、嬉しい点です。

使えるようになることで、生産性がすごく上がると思っています。

そこで、今回は、2本だてでお送りします。
1. Cursorを使えるところまで
1. Cursorの特徴や料金

よかったなと思ったら、いいね！
いただけると励みになります！！

## 1章：始め方
まずは、ダウンロード！

https://cursor.sh/

![スクリーンショット 2023-12-15 8.19.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559163/28161542-b7e0-4897-8f8d-faaaa1c9b6ac.png)

僕の環境では、Macなので、Mac版をダウンロードします。
ダウンロードしたzipファイルを開くとインストーラーが開くので、
インストーラの指示に従って、インストールします。
![スクリーンショット 2023-12-15 8.22.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559163/d20ef4e3-ff92-32ec-0701-35884fab531b.png)

インターネットから ダウンロードしたアプリを起動してもよろしいですか？
と言う文章が出てきたら「開く」をクリック

これでインストールは完成です。

### UIの説明
左側に
- エクスプローラー
- 検索
- ソース管理
- 実行とデバック
- 拡張機能
- リモートエクスプローラー

ファイル構成

が列挙されている。
右側に、Chat欄と、Chatnの内容を設定できる項目があります。


![スクリーンショット 2023-12-15 8.26.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559163/80ab3552-4d87-0c10-17a3-123cf9f30dc9.png)

Chatして、 コードを作成した結果、こちらです。
コマンドYボタンをクリックすると チャットで得られたコードを反映することができます。
GitHubとかの見た目に近いので、視認性が高いです。


![スクリーンショット 2023-12-15 8.51.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559163/4d981675-6064-a51b-1daa-0552d49831e3.png)

## 2章：Cursorの特徴と料金
### 特徴
主な特徴は、2つです。

:::note info
- [ChatGPT](https://chat.openai.com/)のサポートをリアルタイムで受けることができる
- VSCodeの拡張機能のストアが使えるため、拡張性が高い。

:::

Cursorは、コードの自動生成からエラーの自動検出と修正まで
リアルタイムのコーディングアシスタント
として使うことができる。

さらに、[GitHub Copilot](https://docs.github.com/ja/copilot/using-github-copilot/getting-started-with-github-copilot)を併用して使うことができるため、
コードの修正とかの検出が簡単にできます。

### 料金
料金は[こちら](https://cursor.sh/pricing)となっています。


|                        | Basic            | Pro                  | Business           |
|------------------------|------------------|----------------------|--------------------|
| **価格**                  | 無料             | $20 / 1ヶ月           | $40 / 1人 / 1ヶ月   |
| **GPT 3.5の使用許容量**   | 200              | 無制限               | 無制限             |
| **GPT 4の使用許容量**     | slow 50          | slow 無制限 / fast 500 | 無制限             |
| **AIを使ったコーディング** | ◯                | ◯                    | ◯                  |
| **データのプライバシー確保** | ◯                | ◯                    | ◯                  |

無料だと、月に200回ほどGPT3.5が使える形です。
ChatGPTの有料版と同じ20ドルを払えば、
無制限にChatGPT3.5が使えそうです。


また、サブスクで課金するのが嫌な場合は、
OpenAIのAPIキーを入れることで、Cursorは無料で使うことができます。

## まとめ

Curosrは、 無料で使い始めることができるAIを活用したエディタです。
VSCodeの拡張機能も使うことができるので、
VSCodeを使っている人は乗り換えを検討してみてもいいと思います。
それでは良きAIライフを！！

## お願い
記事がよかったなと思ったら、いいね！
いただけると励みになります！！

ぜひ、既読感覚でいいね！を押していただけると嬉しいです！
デイリーミッションをこなそう

この記事は [一分で読める小ネタのカレンダー | Advent Calendar 2023 - Qiita](https://qiita.com/advent-calendar/2023/raki) の２３日目

# デイリーミッション

- 毎日のルーティンにする何か
- ゲームのデイリーミッションと同じ
- til に日記をつけるのもそう
- １つじゃなくていい。むしろたくさん追加していく。すると日々できることやったことが増えていく（＝成長）
- 自己成長のためのゲーミフィケーション
- 飽きた時がさらなるチャンス。飽きたものはやめて新しいことを始める。何が好きで何が好きじゃなくて、何が続けられて何が続けられないかがわかるようになる
- これまでの記事で書いてきたように、やってみること、試してみることが大事。考えるふりをして手を動かさないよりも、何か１つでも手を動かしたほうが自信に繋がる
- マイルールにデイリーミッションをこなす、を加えよう、という話

本文はここまで。以下は時間外

# デイリーのルール

- 毎日絶対にやるものを決める（１軍）
- それ以外のものはやりたいときにやる（というルールにしておく）
- 時間がある時に優先してやるルールを決めておく（２軍）
- 予備のルールをリストしておく（３軍）
- ロングボーナスは各自で用意ｗ

# １軍の例

- 難しくないもの
- さっとできるもの
- ５分以内、可能なら１分以内に処理できるもの
- 可能ならやる時間も決めてしまう

のような条件を決める。
ゆるく作ってしっかりこなすのが継続のコツなのかなって最近思う。

- [ ] my-til に日記を書く
- [ ] パズルを解く

# ２軍の例

- 毎日できなくてもかろうじて許せるもの
- 少し時間がかかるかもしれないもの
- こなす価値があると自分が信じているもの

扱いは１軍と同じというか、ゆるさのグラデーションがここにでるようにする。
継続できるものしたいものは１軍へ、できないものしたくないものは３軍へ、という緩衝地帯

- [ ] Trello を更新する
- [ ] issue を確認する
- [ ] PR をだす
- [ ] 次のことの準備をする（いつかやることリスト更新する意）

# ３軍の例

- 毎日のルーティンには乗らないけど週次くらいではやるもの
- ウィークリーミッションにしてもいいかもね
- デイリーミッションには厳しいかもしれないもの
- デイリー落ちを残しておく

（デイリーで）できなくても自分を責めないけど、やったほうがいいもの、を残しておいて、やる気がある時にやる。
マイルールと合致する何か。

- [ ] OSS貢献する（good first issue ラベルをチェック）
- [ ] 集中して何かを完成させる
- [ ] 断捨離

# ロングボーナス

- ソシャゲなら継続して何日目ボーナス、みたいなやつ
- 定期的なご褒美は誰にでも必要
- 週次、月次、半年、年次、好きなタイミングでご褒美を用意する
- こなせてないなって自分で思ったら制限する
- 要は自分を甘やかすための言い訳

# 目指すところは自分で決める

- デイリーミッションをこなして何になるかは自分で決める
- ゲームなら与えられたものに文句つけながら受け入れれば済むけど、ゲーミフィケーションは自己責任で組み立てる
- この辺の意識を作っていくこと自体がデイリーミッションの効果なのかもしれないね

# やり方の工夫

- til や日記のテンプレに入れておいてやったらチェック（同じのが残るから逆にやったら消しちゃうほうがいいかも）
- todo 系アプリの繰り返し機能
- issue にして自動で毎日生成（テンプレをコミットしておくことで変遷がわかるんだけど、チェックが終わってないのにcloseするのがちょっとね。。。）


# 改善依頼

- デイリーでこれやってるぜとか
- こんなツール使ってるぜとか
パスワードのマスクつけたりはずしたり、"TxTogglePassword"

[Symfony Component Advent Calendar 2023](https://qiita.com/advent-calendar/2023/symfony-component)の18日目の記事です。

## パスワードのマスクつけたりはずしたり、"TxTogglePassword"

[TxTogglePassword](https://symfony.com/bundles/ux-toggle-password/current/index.html)は、フォームのパスワード欄のマスクをつけたりはずしたりできるSymfony UXコンポーネントです。
フォームに関連するので、[Twig](https://qiita.com/ippey_s/items/a81cf9980ed0f8c63a3e)、[Form](https://qiita.com/ippey_s/items/378ea7315c0ebbf5cde2)が必要になります。

### インストール

```shell
composer require symfony/ux-toggle-password
```

### 使い方

見た目きれいな方がよいので、フォームのレイアウトにBootstrapを使います。

```diff:config/packages/twig.yaml
twig:
    default_path: '%kernel.project_dir%/templates'
+     form_themes: ['bootstrap_5_layout.html.twig']
when@test:
    twig:
        strict_variables: true

```

続いて、フォームのパスワード欄にトグルを有効にするためのオプションを追加します。

```php:SampleForm.php
<?php

class SampleFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            // ↓ ここで['toggle' => true]を追加
            ->add('password', PasswordType::class, ['toggle' => true])
        ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            // Configure your form options here
        ]);
    }
}

```

あとは、普通にフォームを表示するようにテンプレートを用意します。

```twig:form.html.twig
<div class="container">
    <div class="row">
        <div class="col-6 bg-light">
            {{ form_start(form) }}
            {{ form_row(form) }}
            {{ form_end(form) }}
        </div>
</div>
```

おしまいです。

マスクしたり、
![スクリーンショット 2023-12-15 8.52.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9882/1f2e4920-660b-db81-38bb-2721bad8ef46.png)

はずしたりできます。
![スクリーンショット 2023-12-15 8.53.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9882/34afa9e5-55d7-8529-d1d1-29ef58041f93.png)

## まとめ
今回は"TxTogglePassword"でした。Symfony UXはこんな感じの『ちょっと作るの面倒だけどあるといいよな』ってコンポーネントを用意してくるので好きです。
Udemyで学ぶセキュリティのおすすめ講座

# はじめに
本記事は[Udemyおすすめ講座をシェアしよう！ by Udemy Advent Calendar 2023](https://qiita.com/advent-calendar/2023/udemy)に基づいて、Udemyで学ぶセキュリティのおすすめ講座について記載しています。

セキュリティは幅広く奥が深い分野ですが、Udemyでは多様なコースが用意されています。

Udemyについて知らない方は、去年のアドベントカレンダーで書いた[「これから新人エンジニアになるあなたへ　本質的な勉強法」](https://qiita.com/Brutus/items/34cf3c74f3351ad891e0)の記事をご参照ください。

## Udemyの使い方
書籍を買っても読まずに積読する場合もあると思いますが、デジタルツールも同じです。

せっかくお金をかけて購入しても、使わなければ意味がありません。学びを習慣化するためには、仕組みが重要です。Udemeyには学習スケジュールという学習ツールが用意されているので活用しましょう。

コースを購入後「学習スケジュールを立てる」の画面が表示されたら「開始」を押して始めます。またはマイラーニングの学習ツールから「学習スケジュールを立てる」を押します。

![スクリーンショット 2023-12-01 23.09.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/db221602-54d8-9337-10d3-c3eff83c6788.png)

購入したコースが表示されるので任意のコースを選択して「次へ」を押します。

![スクリーンショット 2023-12-01 23.09.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/430cd580-9738-dec5-6bf1-a722963abe8a.png)

頻度や時間を選択して「次へ」を押します。

![スクリーンショット 2023-12-01 23.10.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/6f9a137c-1e97-3c61-eb95-fe5c0dbfda2b.png)

Googleカレンダーなどと同期できます。

![スクリーンショット 2023-12-01 23.12.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/941c6cd3-b535-c0e8-49a6-bf7e999d592a.png)

「完了」を押します。

![スクリーンショット 2023-12-01 23.13.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/55201e02-3609-f513-e3a9-f06848452028.png)

:::note
まずは勉強する時間をきちんと確保して、勉強する時間を生み出しましょう。
:::

## セキュリティの学習
サイバーセキュリティの基礎を学ぶにあたっておすすめ講座を以下に記載しています。

### TryHackMeとHack The Boxを使った演習
攻撃者観点で倫理的なハッキングについて学びたい場合は、以下のコースがお勧めです。

具体的な攻撃手法を習得するために「TryHackMe」と「Hack The Box」を使った演習を行います。

https://www.udemy.com/course/boot2root-easy/

::: note
一般的なセキュリティフレームワークに基づく偵察行為から、脆弱性を発見して攻撃するまでの一連の流れについて学ぶことができます。
:::

### WordPressの堅牢化
WordPressの基本を学びたい場合は、以下のコースがお勧めです。

なぜ堅牢化を学ぶかその理由やWordPressが狙われ続けている理由について、丁寧に解説されています。

https://www.udemy.com/course/boot2root-wordpress/

::: note
TryHackMeのBlogのルームが使用されていますが、このルームは無料で使用可能です。Uemeyでインプットした後に実際に自分で手を動かして試すこともできます。
:::

### ファームウェア解析と組み込みLinuxのセキュリティ
ファームウェア解析について興味がある場合は、以下のコースがお勧めです。

ファームウェアを解析するための手法や組み込みLinuxのセキュリティについて学びます。

https://www.udemy.com/course/bugbounty-firmware/

::: note
市場で流通しているホームネットワークデバイスから脆弱性を見つける内容になっているため、脆弱性を発見するための考え方について身につけることができます。
:::

# おわりに
セキュリティ分野は学習が難しいですが、セキュリティを専門とする方によるUdemyの講座を活用することで、独学での学習も可能です。

サイバーセキュリティについて興味がある場合は、以前書いた[「Hackerとは　サイバーセキュリティのキャリアのはじめ方」](https://qiita.com/Brutus/items/4549046447be36ae6c02)の記事をご参照ください。セキュリティの学習に役立つ情報を記載しています。
Customize Opportunity Stages 商談のUIの問題



+ [Help with Customize Opportunity Stages](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T6Jyh)

アクションのボタンがない？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/281353d0-a87b-e05c-a47c-8dab63c6c6ac.png)

:::note
Please check this article. 

Apply the Action to the Object’s Page Layout 
https://help.salesforce.com/s/articleView?id=sf.bi_explorer_apply_action_to_page_layout.htm&type=5
:::

+ [In Customize Opportunity Stages. When editing the Record United Oil Plant Standby Generators, the Save button does not appear](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Jft9m)

保存ボタンがない？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f452e255-2600-7cf6-641a-8dedb385f3c0.png)
Pythonで「リストへの要素の追加と別のリストとの結合」の動作を確認してみた

# 概要

Pythonで「リストへの要素の追加と別のリストとの結合」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/list/index6.html

# 実装

以下のファイルを作成しました。
```sample.py
mylist = ["Blue", "Red", "Green"]
mylist.append("White")
print(mylist)
mylist.append("Black")
print(mylist)

kantoulist = ["Tokyo", "Kanagawa", "Chiba", "Gunma"]
addlist = ["Saitama", "Ibaraki", "Tochigi"]
# kantoulist に addlist の要素を追加する
kantoulist[len(kantoulist):len(kantoulist)] = addlist
print(kantoulist)

eastlist = ["Tokyo", "Kanagawa", "Chiba"]
westlist = ["Osaka", "Nagoya", "Fukuoka"]
# eastlist に westlist の要素を追加する
eastlist.extend(westlist)
print(eastlist)

redlist = ["Orange", "Strawberry"]
yellowlist = ["Lemon", "Banana", "Grapefruit"]
# redlist と yellowlist を結合する
fruitlist = redlist + yellowlist
print(fruitlist)

baselist = ["Yes", "No"]
datalist = baselist * 4
print(datalist)
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
['Blue', 'Red', 'Green', 'White']
['Blue', 'Red', 'Green', 'White', 'Black']
['Tokyo', 'Kanagawa', 'Chiba', 'Gunma', 'Saitama', 'Ibaraki', 'Tochigi']
['Tokyo', 'Kanagawa', 'Chiba', 'Osaka', 'Nagoya', 'Fukuoka']
['Orange', 'Strawberry', 'Lemon', 'Banana', 'Grapefruit']
['Yes', 'No', 'Yes', 'No', 'Yes', 'No', 'Yes', 'No']
```

# まとめ

何かの役に立てばと。