OmniAICreator/Qiita-1.07M huggingface dataset:
STマイコンでI2C通信する方法

# ハード構成について
執筆中

# STマイコンのI2C通信での注意点
1. コードジェネレーターでジェネレートを行うと、ソースコードが生成されますが、IDE側のバグ？でI2C通信の初期化設定が正しくないです。
```stm32c0xx_hal_msp.c
void HAL_I2C_MspInit(){
    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;     /*$ <-- ここが誤り $*/
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF6_I2C1;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
```
I2C通信を行う際は、プルアップ抵抗が必ず必要なので、メンバー変数Pullの設定が誤っています。よって、以下のように設定し直してください。
```stm32c0xx_hal_msp.c
void HAL_I2C_MspInit(){
    GPIO_InitStruct.Pull = GPIO_PULLUP;
}
```
2\. スレーブアドレス設定の注意点1。
まず、スレーブアドレスはコントロールレジスタの1ビット目～7ビット目までの7ビットで指定します。 その為、スレーブアドレスをスレーブ側のSTマイコンで設定する際には、設定するスレーブアドレスから<font color="red">**1ビット左シフト**</font>した値を設定する必要があります。

例えば、スレーブアドレスが0x6F(111)の場合は、コーディング上では左に1ビットシフトした0xDE(222)を設定する必要があります。
```main.c
MX_I2C1_Init(){
  hi2c1.Init.OwnAddress1 = 0xDE;
}
```
3\. I2C通信をする際は、エラー処理を忘れずに。
I2C通信を行うと、何かしらの原因で通信エラーとなる事があります（HAL関数の場合、戻り値がHAL_ERRORになる）。この時、通信の初期化処理を行わないと、通信エラーが永遠に続きます（原因は不明ですが、私の測定環境ですと20分ぐらい連続でI2C通信を行うとこの現象になります）。

ですので、以下のように通信エラーになった時の処理を設けておきましょう。
```main.c
dummy_func()
  ret_val = HAL_I2C_Master_Transmit();
  if( ret_val == HAL_ERROR ){
      I2C_RESET() ;
  }

void I2C_RESET( void ){
  HAL_I2C_DeInit(&hi2c1) ;
  HAL_I2C_Init(&hi2c1) ;
}
```

# ソースコード
マスタ側マイコンのmain.cの主な処理は以下の通り
```main.c
int main(void){
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET) ;

	/*$ I2Cマスター送信を行う $*/
	ret_val = HAL_I2C_Master_Transmit(&hi2c1, slave_add, (uint8_t *)buf, 1, 3000);

	/*$ マスター送信を正しく行えた場合 $*/
    if( ret_val == HAL_OK ){
	    /*$ スレーブからデータを取得する $*/
	   	ret_val = HAL_I2C_Master_Receive(&hi2c1, slave_add, (uint8_t *)buf, 1, 3000);
	    /*$ マスター受信を正しく取得出来た場合 $*/
	   	if( ret_val == HAL_OK ){
	    	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET) ;
	    	HAL_Delay(100) ;
	    } else {
		     I2C_RESET() ;
		 }
	 } else {
	     I2C_RESET() ;
	 }
	/*$ 1byteを超えた場合 $*/
	if( buf[0] >= 255 ){
	    buf[0] = 0 ;
	}
  }
}
```
スレーブ側マイコンのmain.cの主な処理は以下の通り
```main.c
int main(void){
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	/*$ LEDを点灯 $*/
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET) ;

	/*$ I2C_スレーブ受信 $*/
	ret_val = HAL_I2C_Slave_Receive(&hi2c1, (uint8_t *)buf, 1, 1000) ;

	/*$ 受信が無事に成功出来た場合 $*/
	if( ret_val == HAL_OK ){
	    /*$ 1だけインクリメントする $*/
	    buf[0] += 1 ;
	    /*$ buf[0]をスレーブ送信する $*/
	    ret_val = HAL_I2C_Slave_Transmit(&hi2c1, (uint8_t *)buf, 1, 1000) ;
	    /*$ スレーブ送信が成功した場合 $*/
	    if( ret_val == HAL_OK ){
	    	/*$ 100msecだけLEDを消す $*/
	    	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET) ;
	    	HAL_Delay(100) ;
	    	buf_record[index++] = buf[0] ;
	    	if( index >= 1000 ){
	    		index = 0 ;
	    	}
	    } else {
		     I2C_RESET() ;
		 }
	 } else {
	     I2C_RESET() ;
	 }
  }
```
【Rails】find() での  ActiveRecord::RecordNotFound エラーと原因について

# はじめに
## 記事の内容
* `.find()` を用いてレコードを取得しようとする際の注意点について
*  `ActiveRecord::RecordNotFound` エラーの原因について

## 対象者
* 同じようなエラーに出くわした方

# エラーが出た箇所とエラー文について

```ruby:エラー箇所について
order_likes_ary = PostLike.group(:post_id).order('count(post_id) desc').pluck(:post_id)
@good_posts = published_posts.find(order_likes_ary).in_order_of(:id, order_likes_ary)
```

```:実際のエラー
ActiveRecord::RecordNotFound at /
Couldn't find all Posts with 'id': (86, 103, 104, 140, 114, 102, 116, 129, 143, 98, 145, 99)
[WHERE "posts"."draft_flg" = $1] (found 11 results, but was looking for 12).
```

実際に表示されたエラー画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518714/e3d4f6db-b94c-4207-1764-5846842e4a35.png)

| エラー文 | 翻訳 |
|:-:|:-:|
| "Couldn't find all Posts with 'id'" | 'id' の投稿がすべて見つかりませんでした |
| "found 11 results, but was looking for 12" | 11 件の結果が見つかりましたが、12 件を探していました |

:::note alert
* 検索条件で指定している "id" が原因と分かる
* 11件は検索結果として見つかっているのにエラーとなっている
    * 「12件を探していました」というのがポイント？
:::

# 結論

:::note info
* `find()` で引数に検索条件の "id" の配列に該当する **全てのレコードが取得できない** ためエラーとなっている
    * **全て取得する**必要があるため 1 つでもヒットしない場合はエラーになる
:::

> If one or more records cannot be found for the requested ids, then ActiveRecord::RecordNotFound will be raised.
> 
> 「要求された ID に対して 1 つ以上のレコードが見つからない場合、ActiveRecord::RecordNotFound が発生します。」
> 
> （引用：https://api.rubyonrails.org/v8.0/classes/ActiveRecord/FinderMethods.html#method-i-find）


# 詳細
今回私は以下の図のように<br>『「 publish_flg というフラグカラムが 1 のレコードに絞る」 → 「その中から対象の id だけを検索する」』という処理の流れをしていた

:::note warn
以下が原因だった
1. 絞ったことで対象の id のレコードが検索対象から外れた
    * 実質的に存在しない id レコード(登録されていないレコード、削除されたレコード)を検索しようとしてしまった
1. `.find()` は `.where()` とは異なり検索結果のレコードが無い場合はエラーを返す
    * ヒットしたレコードだけを返すわけでは無い
    * この場合は `.where()` の方が良かった

```ruby
# 修正前
published_posts.find(order_likes_ary).in_order_of(:id, order_likes_ary)

# 修正後
published_posts.where(id: order_likes_ary).in_order_of(:id, order_likes_ary)
```
:::

(図1：条件を絞った後に特定の id だけのレコードを `find` で検索する場合)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518714/c721f4c8-d793-f852-22bd-36725169ea33.png)

(図2：条件を絞った後に特定の id だけのレコードを `where` で検索する場合)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518714/da307df3-b4e3-82a6-8bfb-c5ec8358ad1b.png)



# まとめ

:::note info
* `find()` は検索条件の id には必ず存在するレコードの id を指定しなければならない
* `find()` は検索条件の id に検索してもヒットしないレコードが 1 件でもある場合はエラーになる
    * ヒットしたレコードだけを返さずエラーとなる
* `where()` であれば `find()` と同じように検索条件に `id` を指定して該当レコードが見つからない場合であってもエラーにはならない
:::

---
### 所感
* コンソールでは手軽にレコードを検索する際に使用していたため原因になっているとはすぐに気づけなかった
* ActiveRecord をチェインさせるような検索をする少し複雑な検索をするのであれば `find` では `where` を用いた方が良いと学習できた
    * 何を検索条件としているかを明示している分、可読性の面においても良いと思われる

---
### 参考資料

https://qiita.com/nakachan1994/items/682ae620bf3fa6687d5c

https://railsdoc.com/page/find

https://api.rubyonrails.org/v8.0/classes/ActiveRecord/FinderMethods.html#method-i-find
MkDocsのPDF作成環境をDockerで構築

mkdocs-with-pdfは最終更新が2021年から更新が止まっているので情報が古かったです。

## WeasyPrintを利用するライブラリとバージョン要件

WeasyPrintの情報を確認したところ、記事作成時点では以下の要件になっていました。

- Python ≥ 3.9.0
- Pango ≥ 1.44.0
- pydyf ≥ 0.10.0
- CFFI ≥ 0.6
- tinyhtml5 ≥ 2.0.0b1
- tinycss2 ≥ 1.3.0
- cssselect2 ≥ 0.1
- Pyphen ≥ 0.9.1
- Pillow ≥ 9.1.0
- fontTools ≥ 4.0.0

https://github.com/Kozea/WeasyPrint/blob/main/docs/first_steps.rst

## Docker環境準備

環境違いでマウントパスの書き方を変えるのが手間なので、compose.ymlも作成しています。

※カスタムのCSSやJavascript実行が必要な場合はヘッドレスChromeの環境も必要みたいです

### Dockerfile 作成

```dockerfile
FROM python:3.9

# 環境変数設定
ENV LANG=C.UTF-8 \
    TZ=Asia/Tokyo \
    DEBIAN_FRONTEND=noninteractive

# 必要なシステムライブラリをインストール
RUN apt-get update && apt-get install -y \
    libpango-1.0-0 \
    libpangoft2-1.0-0 \
    libffi-dev \
    libopenjp2-7-dev \
    fonts-ipafont \
    fonts-ipaexfont \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# python関連のライブラリ追加
RUN pip install --no-cache-dir \
    weasyprint \
    pydyf \
    cffi \
    tinyhtml5 \
    tinycss2 \
    cssselect2 \
    pyphen \
    pillow \
    fonttools \
    mkdocs \
    mkdocs-material \
    mkdocs-awesome-pages-plugin \
    mdx-gh-links \
    mkdocs-redirects \
    mkdocs-minify-plugin \
    weasyprint mkdocs-with-pdf

WORKDIR /docs
```

### compose.yml 作成

```yaml
services:
  mkdocs:
    container_name: mkdocs
    build: .
    volumes:
      - .:/docs
```

## mkdocsの設定ファイル変更

利用するプラグインに`with-pdf`を追加
※`awesome-pages`より前に記載すると設定が上書きされると警告出るので最後に追加しました

```mkdocs.yml
# --- （省略） ----

plugins:
  - search
  - awesome-pages:
      collapse_single_pages: true
  - with-pdf # ★この行を追加
```

## PDF作成の実行

これでビルドして、PDF作成することができました。
あとは、オプションの調整をして見栄えをどうにかする必要があります。

```bash
$ docker compose run --rm mkdocs mkdocs build
# --- (docker build は長いので省略) ---
INFO    -  Cleaning site directory
INFO    -  Building documentation to directory: /docs/site
INFO    -  Number headings up to level 3.
INFO    -  Generate a table of contents up to heading level 2.
INFO    -  Generate a cover page with "default_cover.html.j2".
INFO    -  Converting <img> alignment(workaround).
INFO    -  Rendering for PDF.
INFO    -  Output a PDF to "/docs/site/pdf/document.pdf".
```

## 補足

最初、pythonのライブラリはバージョン指定でやっていたのですが、WeasyPrintが内部で使用しているpydyfライブラリのバージョン（`pydyf==0.10.0`）で以下の警告出たので、バージョン指定はしていないです。
（環境を安定させるのにバージョンは指定しておいた方が良いけど後でやるつもり・・・

```
INFO    -  DeprecationWarning: PDF objects don’t take version or identifier during initialization anymore. These properties are now stored but ignored, and will be removed and rejected in next version of pydyf. Please pass these properties to the PDF.write()
           method instead.
             File "/usr/local/lib/python3.9/site-packages/weasyprint/pdf/__init__.py", line 119, in generate_pdf
               pdf = pydyf.PDF((version or '1.7'), identifier)
             File "/usr/local/lib/python3.9/site-packages/pydyf/__init__.py", line 450, in __init__
```
Linuxのユーザグループ

Linuxのユーザグループは、システム上のユーザを管理し、アクセス権限を制御するための重要な機能です。ユーザグループを理解し、適切に管理することで、システムのセキュリティと効率を向上させることができます。以下に、Linuxのユーザグループに関する基本的な情報と操作方法を説明します。

## ユーザグループの基本
### グループの種類:

- プライマリグループ: 各ユーザに対して1つのプライマリグループが設定されます。ファイルやディレクトリを作成した際に、その所有グループとして設定されます。
- セカンダリグループ: ユーザは複数のセカンダリグループに所属することができます。これにより、複数のグループに対してアクセス権を持つことができます。
### グループ情報のファイル:
- /etc/group: グループ情報が格納されているファイルです。各行が1つのグループを表し、グループ名、グループパスワード（通常は使われない）、グループID（GID）、グループメンバーが記載されています。

## グループの管理コマンド
### グループの作成:
```
sudo groupadd グループ名
```
例:
```
sudo groupadd developers
```
### グループの削除:
```
sudo groupdel グループ名
```
例:
```
sudo groupdel developers
```
### ユーザをグループに追加:
```
sudo usermod -aG グループ名 ユーザ名
```
-aオプションは追加を意味し、-Gオプションはセカンダリグループを指定します。 例:
```
sudo usermod -aG developers alice
```
### ユーザをグループから削除
直接的なコマンドはありませんが、以下のようにしてユーザをグループから削除できます。
```
sudo gpasswd -d ユーザ名 グループ名
```
例:
```
sudo gpasswd -d alice developers
```
### グループの情報を表示:
```
getent group グループ名
```
例:
```
getent group developers
```
### グループの使用例
ファイルの所有グループを変更:
```
sudo chown :グループ名 ファイル名
```
例:
```
sudo chown :developers project.txt
```
### ディレクトリのグループ権限を設定:
```
sudo chmod g+rwx ディレクトリ名
```
例:
```
sudo chmod g+rwx /var/www/html
```
これらのコマンドと概念を理解することで、Linuxシステム上でのユーザとグループの管理が効率的に行えるようになります。
Winアプデしたら「ブルスク→再起動」のループに入った話

Windows10から11アップデートした際に発生したエラーの備忘録として記載します

経緯
-
就寝前にWindows11へアップデート実行したところ、実行中にエラー発生しブルスク→再起動のループに入りました。

以下詳細ループ内容
1. 黒画面に「コンピューターに対する変更を元に戻しています」が表示される
1. 10分ほど経ったところでブルースクリーンになり以下エラーが表示される
1. 自動で再起動が走り、「インストールの修復を試みています」と一瞬表示される
以下①~③ループ。
できることはBIOSの起動のみ。

停止コード:SYSTEM_SERVICE_EXCEPTION
失敗した内容:Ntfs.sys
![IMG_9939.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329728/8ed00831-5d38-5a72-13d6-8dbe689fb869.jpeg)

解決策
---------------
Windows10をクリーンインストール実施することで解決しました。
1. インストールメディアを保存したUSBメモリを使い、クリーンインストールを実行。
1. Cドライブのデータが初期化されているため、必要なソフト等再ダウンロード
以下サイトを参照し実施しました。

https://pc-karuma.net/windows-10-clean-install/

対策
--
エラーの原因究明には至りませんでしたが、同様の問題を防ぐためには次の対策が有効です。
1. アップデート実行前にストレージやメモリの空き容量を確保する 
1. 回復ドライブを作成する

特に2.はインストールメディアではなく回復ドライブを作成することで、楽に、かつ早く復旧ができます。
今回はインストールメディアを作成しておらず、代わりのPCも持ち合わせていなかったため、先輩に助けていただき、インストールメディアを含んだUSBメモリをお借りすることで対応しました。

まとめ
-
Windowsアップデートを実施する際には、しっかり準備を整えてから行うことが大切です。 今回の事象は、Windows 10が2025年10月14日にサポート終了すると聞き、「ぼちぼち11へアップデートするかぁ」と軽い気持ちで実行した結果発生してしまいました。

サポート終了日が延期されるウワサもありますが、今回の経験を通じて、ゆっくり自分の端末と相談しながら実行することの重要性を実感しました。 
また、USBメモリも1000円以下で購入できるため、保険として回復ドライブを用意しておくべきです。
ByteByteGoでシステム設計を学ぼう

# はじめに

エンジニアのみなさま、日々の学習本当にお疲れ様です！
また本記事まで足を運んでいただき本当に感謝です。
最後まで読んでもらえると幸いです。

# ByteByteGoとは

https://bytebytego.com/

システム設計やプログラミングスキルの向上を目指すオンライン学習プラットフォームになります。

# システム設計｜Freeのコンテンツを見てみる

![スクリーンショット 2024-11-24 22.02.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/47d6b217-13f4-5019-c1ee-94a4e31ad927.png)

ホームからスクロールすると以下のカテゴリーに分かれて全28項目のシステム設計に触れることができます。


**System Design Fundamentals**


**Design a Product**

**Big Data, Storage & Location-based Service**

決済システムやWebクローラー、チャットシステム等の解説がされています。
今回はYouTubeの項目をクリックしてみます。

![スクリーンショット 2024-11-24 22.26.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/b7ec68df-2413-2685-2748-b75f954938fd.png)

![スクリーンショット 2024-11-24 22.25.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/caf459fc-1eb7-0611-defc-666f17be1d9c.png)


設計におけるポイントから始まります。次にシステム設計面接の面接官と応募者を想定したやり取り、見積もりをして図解で説明の流れです。
複雑なシステム設計の概念を分かりやすく解説しています。面接官を顧客、応募者を自分に見立てて、顧客から質問が来ている想定で学習をすればシステム設計の知識が定着しそうです。

課金無しでも閲覧できるものは **「Free」** と書かれているコンテンツのみになります。
課金をすれば全てのコンテンツが閲覧できるようになります。
2024/11/24時点の金額は年額で9,472円になります。

# ニュースレター
システム設計やプログラミングに関する複雑な概念を、シンプルな言葉で解説されている定期配信の内容になります。

![スクリーンショット 2024-11-24 22.36.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/875f1709-9da2-f634-8c04-a36beb045e72.png)

# Discordコミュニティ

課金をすると専用のDiscordコミュニティにも参加できます。
※やり取りは全て英語になります。

Discordコミュニティを通じて

ByteByteGoで紹介されるシステム設計のトピックについて議論したり、深掘りした内容を他の参加者と共有
システム設計に関する疑問点の解消
面接準備に関する具体的なサポートや、模擬面接のパートナー探し

などが出来そうです。

![スクリーンショット 2024-11-24 22.59.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/39525df1-2cbe-bcab-5e0f-dfa6477c1105.png)

# おまけ

弊社のご紹介もさせてください！

### 「日本で一番エンジニアが成長できる会社を創る」

https://prum.jp/

### エンジニアリングの募集

https://www.wantedly.com/projects/1808638

### PM・Webディレクションの募集

https://www.wantedly.com/projects/1355235

### セールス・事業開発の募集

https://www.wantedly.com/projects/1792065

### コーポレート系の募集

https://www.wantedly.com/projects/1752874

### コンサルティングの募集

https://www.wantedly.com/projects/1794481

弊社メンバーは日々学習した内容をアウトプットしております！
少しでもご興味を持たれた方は求人を見てみてください！
ご応募もお待ちしております！

### 最後までご覧いただき、ありがとうございました！
# 「TPMは検出されませんでした」が原因でWindows 11にアップグレードできなかった話

## 概要
Windows 10が2025年の10月にサポート終了するため、今更ながらWindows 11へのアップグレードを行うことにしました。しかし、TPMが検出されないことによりWindows 11のシステム要件を満たせなかったため、Windows 11にアップグレードできませんでした。
BIOSの設定を変更することでTPMを検出できるようになりシステム要件を満たせたので、そこまでの経緯を記載します。

BIOSの設定変更だけしりたい方は[こちら](#有効にする)。

## Windows 11にアップグレードできない
 Windows 11へアップグレードするために設定のWindows Updateを開くと、システム要件を満たしていない旨の表示がありました。
「PC正常性チェック アプリ」で詳細を確認するよう書いてあったため、そのアプリを使って詳細を確認したところ、どうやらTPMが検出されていないのが原因のようでした。
（「PC正常性チェック アプリ」はタスクバーからの検索で見つけられます。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931306/f7f97eaf-d26f-6be1-701f-77f92c0f399d.png)


### TPMとは？
マザーボードに搭載されているセキュリティチップのことで、暗号化に使用するアルゴリズムや鍵を管理してくれます。Windows 11ではサインインの時に、このTPMの2.0を利用してPINと科認証を行うそうです。

## TPMが有効か確認する
デバイスマネージャ -> セキュリティデバイス　で確認できます。

TPMが有効であればTPMの記載があるようですが、私の環境では記載がありませんでした。
TPMが有効ではなかったようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931306/b04133e2-5901-4031-a3cc-0fe57feb511f.png)

## 有効にする
TPMを有効にすることに。
[Microsofteサポート](https://support.microsoft.com/ja-jp/windows/pc-%E3%81%A7-tpm-2-0-%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B-1fd5a332-360d-4f46-a1e7-ae6b0c90645c)によると、BIOSの設定を変更する必要があるようでした。
早速BIOSを確認すると「詳細」に、TPMの記載がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931306/7cd5bdb6-e19e-2179-085a-e54e43fc46c3.png)

「TPMデバイスの選択」がディスクリートTPMになっていたためファームウェアTPMに変更してWindowsを起動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931306/ff723a33-ad42-8c10-dd06-553e82e3dc19.png)


再度、デバイスマネージャを確認すると無事有効にできました。
(トラステッド プラットフォーム モジュール = TPM)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931306/17a9a768-2c23-c2c6-679b-5fb95a4db7e4.png)

## Windows 11にアップグレードできるか再確認
再度、PC正常性チェックで確認したところ、okがでました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931306/1a40eeca-a00c-8a97-ea77-7e8de67e510b.png)



## 参考
記事作成にあって、下記サイトを参考にさせていただきました。

### PC正常性チェックについて

https://support.microsoft.com/ja-jp/windows/pc-%E6%AD%A3%E5%B8%B8%E6%80%A7%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF-%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95-9c8abd9b-03ba-4e67-81ef-36f37caa7844

### TPMについて

https://pc.watch.impress.co.jp/docs/topic/feature/1334277.html

https://staff.persol-xtech.co.jp/hatalabo/it_engineer/617.html 

https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=4811-2866

https://support.microsoft.com/ja-jp/windows/pc-%E3%81%A7-tpm-2-0-%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B-1fd5a332-360d-4f46-a1e7-ae6b0c90645c
Cloud上のJenkinsの開発時にMySQLでつまづいたこと1

# はじめに
Cloud上のJenkinsで複数あるレポジトリのテストpipelineを作りました。その時最も苦労したパーツの一つであるMySQL containerの開発時につまづいたここと、その解決方法を何回かに分けて書いていきたいと思います。
今回は一番最初にぶつかった、MySQL Containerが起動しない問題の解決方法です。

# 環境
- Cloud上のJenkins
- Harbor
#### ざっくりテストJobの流れ
1. localにあるdocker imageをHarborに上げる
2. HarborのimageをJenkinsのジョブ内で呼ぶ
3. Containerを起動させてテストを実行
 
# MySQL Containerが立ち上がらない
MySQL Containerが全然立ち上がっていなかったようで、Jobがすぐ落ちてしまっていました。
そこでContainerがどのような状態なのか確かめるためにidを出してみると、このようなエラーが返ってきていました。
```groovy
        docker.image(MYSQL_IMAGE).withRun(runArgs(mysqlContainer)) { c ->
            docker.image(env.PHP_IMAGE).inside(runArgs(phpContainer)) {
                sh "docker logs ${mysqlContainer.id}"
            
            }
        }
```
```bash
# Log
standard_init_linux.go:190: exec user process caused "exec format error"
```
調べてみると、どうやらM1 Macで作成したイメージでは起動できなかったのが問題だったようです(arm64でした)。おそらく同僚があげてくれていたので、同僚のパソコンのプロセッサーがM1だったのでしょう。
詳しくはこちらを参考にしました。

https://qiita.com/strings/items/ba4ab40b79b24ca4548d

### 解決方法
私のPCはM1ではなかったので、HarborにMySQL imageを上げなおしました。amd64になったので、先程のエラーは解決しました🥳
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919187/16d57586-9582-fcd6-eb4d-9e818a4960a8.png)


# おわりに
次回はMySQL Containerが立ち上がったはずなのに動いていない問題について書こうと思います。
参考になれば幸いです🍎
melosを使ったマルチパッケージ構成を作ってみた

# 初めに
こんにちは
先日Flutter Kaigiに参加して、以下の発表の構成がとてもいいなと思い、似た構成のサンプルを作ってみました。

https://www.slideshare.net/slideshow/omiai-flutter-flutterkaigi-2024/273516514#25

今回作ったのはこちらです。
ポケモンのAPIを最初に叩いてるだけのアプリです。
https://github.com/shunsukenoguchi/melos_monorepo

また、最近flutterの公式からアーキテクチャーの記事が出たのでそれも参考に作っています。
https://docs.flutter.dev/app-architecture/guide

# アプリの構成
基本的なmelosの構成で`packages`をOmiaiの構成を参考にしています。


```
.
└── melos_monorepo
    ├── apps
          ├── app
               ├── flutterのプロジェクト
    ├── packeages
            ├── app
            ├── base_ui
            ├── domain(今回、使用していない）
            ├── repository
            ├── service
    ├── melos.yaml
    ├── pubspec.yaml
    ├── package-lock.json
    
```

`apps`の`app`からそれぞれpackeageを呼ぶようにしています。

melosを使用することで、 `app`からは`repository`,`repository`からは`service`をパッケージでインポートして使用するように制限できるため、serviceをview側読んでしまうなど、意図しない箇所でのパッケージの使用を防ぐことができます。

# サンプルを作ってみて、
パッケージで分けることで、責務が明確になるのでとても堅牢な作りができて良いなと感じました。
ただ、今回シンプルなアプリなのでここまでしっかりとした作り方だと同じようなデータをの受け渡ししてるだけになるところがあり、冗長になってしまうなと感じました。今回、domainを使わなかったはそれが原因です。
実務の膨大なコードがある前提であればとてもいい構成なんだろうなと思っています。

```
 ├── packeages
            ├── app
            ├── base_ui
            ├── domain(今回、使用していない）
            ├── repository
            ├── service
```

# 終わりに
melosいいですね。melos自体あまり使っていなく、なんで流行ってるのか分かってなかったのですが、今回を機にどんどん使っていこうかなと思っています。
ご覧いただきありがとうございました。
setAttributeとgetAttributeの使い方

```属性の値を取得するために使います。指定した属性が存在しない場合、nullが返されます。Web開発において、HTMLの要素に対して属性を設定したり取得したりすることはよくあります。JavaScriptでは、これを行うためにsetAttributeとgetAttributeというメソッドを使います。この記事では、この2つのメソッドの使い方を分かりやすく説明します。```

# setAttributeとは？

**setAttribute**は、HTML要素に新しい属性を設定したり、既存の属性を更新するために使います。このメソッドを使うことで、簡単に任意の属性を付け加えたり、変更することが可能です。

```Java
要素.setAttribute(属性名, 値);
```

例:
以下のコードは、ボタン要素に新たにidとclass属性を追加しています。

```Javascript
<button id="myButton">Click me</button>
<script>
  const button = document.getElementById("myButton");
  button.setAttribute("class", "btn-primary");
  button.setAttribute("disabled", "true");
</script>
```

上記の例では、

**button.setAttribute("class", "btn-primary");** で、ボタンにクラスを設定しています。

**button.setAttribute("disabled", "true");** で、ボタンを無効化しています。

# getAttributeとは？

構文:
```Java
要素.getAttribute(属性名);
```

例:
以下のコードは、ボタンのid属性の値を取得しています。
```Javascript
<button id="myButton" class="btn-primary">Click me</button>
<script>
  const button = document.getElementById("myButton");
  const className = button.getAttribute("class");
  console.log(className);  // "btn-primary" と表示されます
</script>
```

上記の例では、button.getAttribute("class")でボタンのクラス名（btn-primary）を取得し、それをコンソールに表示しています。

# setAttributeとgetAttributeの違い

**setAttribute: 属性を設定・変更するためのメソッドです。**

**getAttribute: 属性の値を取得するためのメソッドです。**

# まとめ

setAttributeとgetAttributeを使うことで、JavaScriptでHTMLの属性を動的に操作することが可能になります。setAttributeで属性を追加・更新し、getAttributeでその値を取得するという形で使うと便利です。

例えば、フォーム要素の有効化・無効化、リンクのURL変更、またはカスタム属性を利用して要素に特定のデータを持たせることなど、さまざまなシーンでこれらのメソッドを活用できます。

**最後までよんでいただきありがとうございます。
@y-t0910をフォロー,いいねしていただけると嬉しいです！**
Dockerのnetworkを使って別プロジェクトのMySQLコンテナに接続する方法

## はじめに
業務の中で、ローカル環境で様々検証するために、あるコンテナから別のコンテナで立ち上げたMySQLのDBに対して接続をする必要が出てきました。

かなり苦戦してしまったので、その方法について備忘のためにまとめておきます。

## 概要
今回私がやろうとしていた対応の概要は以下のとおりです。

**プロジェクトA** 
アプリ用コンテナ、MySQL用コンテナの2つのコンテナを持つ。

**プロジェクトB**
アプリ用コンテナを持つ。プロジェクトAのMySQL用コンテナに接続したい。

どちらのアプリ用コンテナもNode.js、Express、TypeScipt、Prismaを使用しています。
また、Docker Composeのバージョンは3.5以上であることを想定しています。

## 対応方法
端的にいうと、接続される側と接続する側、双方のコンテナで同じネットワークを使用するようにする、ということになります。

詳細な設定方法を確認します。

### 接続される側
DBのコンテナを持つ側は2つの対応が必要です。
以下はそのコード例です。
```yaml:docker-compose.yml
version: '3.8'

services:
  #　アプリ用コンテナ定義
  app:
    build: .
    ports:
      - "3000:3000"
    # 〜中略〜
    networks:
      - external-mysql

  # DB用コンテナ定義
  db:
    image: mysql:8.0
    ports:
      - "3306:3306"
    # 〜中略〜
    networks:
      - external-mysql

networks:
  external-mysql:
    name: external-mysql  # 明示的に名前をつける
```

`docker-compose.yml`ファイルに対して大きく2つの対応を行っています。

まずはトップレベルの`networks`の定義です。
```yaml:トップレベルのnetworks抜粋
networks:
  external-mysql:
    name: external-mysql
```
これを定義することで、ネットワークが作成されます。
2行目の`external-mysql`はDocker Compose内でこのネットワークを参照するための名前です。
3行目の`name: external-mysql`はDocker上で実際に作成されるネットワークの名前です。
※`name`が指定できるのはバージョンが3.5以上になります。

`name`を指定しない場合、2行目に指定した``external-mysql`に対して、プロジェクト名がプレフィックスとして付与されるため、名前が一定になりません。

次に、サービスレベルの`networks`の定義です。
```yaml:サービスレベルのnetworks抜粋
    networks:
      - external-mysql
```
どちらも名前が`networks`なのでややこしいですが、こちらは`app`と`db`の各サービスに対して設定します。
これはどのネットワークを使用するかの設定になります。

接続される側の設定は以上です。

### 接続する側
接続する側も同じように、トップレベルとサービスレベルの`networks`の定義が必要になります。

```yaml:docker-compose.yml
version: '3.8'

services:
  app2:
    build: .
    ports:
      - "3001:3000"
    environment:
      - DATABASE_URL=mysql://user:password@db:3306/myapp
    # 〜中略〜
    networks:
      - external-mysql

networks:
  external-mysql:
    external: true
    name: external-mysql  # 既存のネットワークに接続
```

サービスレベルの`networks`は先ほどと変わらないので割愛します。

トップレベルの`networks`には先ほどなかった
`external: true`
の記載が増えています。

これは、外部のネットワークを使用する、つまりこのプロジェクトのDockerCompose外のネットワークを使用するという宣言になります。

これにより、接続される側で設定したネットワークを使用することができます。

また、`networks`以外の設定ポイントとして、DB接続情報があります。
```yaml:接続情報抜粋
    environment:
      - DATABASE_URL=mysql://user:password@db:3306/myapp
```
`@`以降は`ホスト名:ポート名`となりますが、ここではホスト名として、接続される側の`docker-compose.yml`の`services`で指定したDBのサービス名である`db`を使用しています。

## まとめ
普段Dockerは触り慣れていないので、設定するのにかなり苦労しました。
同じような悩みにぶち当たっている人の一助となれば幸いです。
非.NET言語勢よ。これが.NET言語のずるい機能だ！

　今回は.NET言語（C#やF#）勢の私が他の言語にはない（C#やF#にはないと思われていたと**思う**）機能を紹介します（Visual Basic .NETは除外）。
# C#のずるい機能
## 1. LINQ
　LINQ to ObjectsとLINQ to SQLはC#3.0に登場したかなりの古参勢です（現在、C#13.0）。
　特にLINQ to Objectsは配列に対する処理に特化しており、繰り返しで複数行必要なところを一行で、しかも高速に処理できます。
　配列全体に決まった処理を行ったり、高階層オブジェクトを平坦化たり、様々なことができます。
## 2. クラス全般
### 2-1. プライマリコンストラクタ
　Javaとかしている人は「C#とJavaの文法は似ているから違いはほとんどない」と思いがちですが、全く違います。もちろん、C#はJavaの書き方と似ています。しかし、プロパティの値を初期化するだけの場合コンストラクタは以下のように
```cs
class Position(int _x, int _y)
{
    public int x = _x;
    public int y = _y;
}
```
クラス宣言時に定義できます。
### 2-2. new式
　上のコードのインスタンスを作るとき、Javaをやっている人だと
```java
class Program
{
    void main()
    {
        Position p = new Position(0, 0);
    }
}
```
見たいな感じで書きますよね。しかし、C#勢は
```cs
class Program
{
    static void Main()
    {
        Position p = new(0, 0);
    }
}
```
と書きます。C#言語は型が明示的に書かれている場合newの後のクラス名を省くことができます。
## 3. 配列の要素の値の取得
　C#8.0では配列のある範囲の要素を取り出すことができます。
## 4. 最上位ステートメント
　非C#勢の人は「JavaとかC#はクラスの中にエントリーポイントを書くから、面倒くさいな」と、思うと思います。C#はそんなことありません。Visual C#9.0(C#9.0)ではエントリーポイントのあるファイルに、エントリーポイントのメソッドとそれを含むクラスを書かなくても良いです。
## 5. メソッド
```cs
int increment(int n)
{
    return n + 1;
}
```
　上のようにC系の言語って値に1を足して返すとかのメソッドを書くときに無駄があるよねって思われますが、C#では=>演算子を使って
```cs
int increment(int n) => n + 1;
```
と書けます。
## 6. out変数
　数値型であれば`TryParse`を使うことで、out変数が作れます。
## 7. コレクション式
　`List<T>`から`T[]`に変換する際、
```cs
using System;
using System.Collections.Generic;

List<int> list = [1, 2, 3];
int[] array = list.ToArray();
```
と書いていたでしょうか。しかし、今では
```cs
using System;
using System.Collections.Generic;

List<int> list = [1, 2, 3];
int[] array = [.. list];
```
と書けます。
# F#のずるい機能
## C#で使える名前空間を全て使える
　当然、C#とF#は.NET言語なのでC#で使えるものはF#でも使えます。
## 型の量が多い
　F#はC#の型に加え、独自の配列やリストといったものがあります。`int list`と`int List`は全く違うものです。`int list`はOCamlの書き方で値を代入しますが。`int List`はコンストラクタを呼ばないといけません。使いやすさとしては`int List`の方が使いやすいです。

## 任意の演算子の定義
　私の中ではこれが一番ずるいと思っています。だって、新しい演算子を作ることができるのですから。例えば、左辺の文字列を右辺の文字でトリミングする`--`演算子を作るとしましょう。
```fsharp
let (--)(baseStr: string, trim: char) = String.trim(trim, baseStr)
```
と書けばできます。
## 地味に便利なfunction
```fsharp
let rec printList lst =
    match lst with
    | [] -> ()
    | h :: t ->
        printfn "%A" h
        printList t |> ignore
```
を
```fsharp
let rec printList lst = function
                        | [] -> ()
                        | h :: t ->
                            printfn "%A" h
                            printList t |> ignore
```
本当に地味に便利です。
## まあメタいったらありゃしない
　C#でもあったかもしれませんが、F#では
```fsharp
let inline fuga<^T when ^T : (static member hoge: int -> int)> i =
    (^T : (static member hoge: int -> int) i)
```
と書け、`int -> int`の`hoge`関数を実装している型のみ実行でき、インターフェースとかめんどい時に使えるます。
## 標準ライブラリ
　F#とだけあって標準ライブラリの量が多いです。逆に多すぎて「何ができる？」と思います（個人的に元は.NET言語ではなかったからだと思ってます）。
# C#とF#
## 作れるもの
　C#、F#で作れるものはコンソールアプリ、フォームアプリケーション、Webサイトなどです。なので、なんでも作れます。
## 連携
　C#とF#はランタイムが同じなので、Visual Studioではファイル参照で連携が可能です。ということはフォームアプリケーションなら描画をC#で、内部をF#で作ることができます。また、C#では限界のあることをF#を組み込むことで補い、逆にF#では限界のあることをC#で補うことができます。
# まとめ
　C#とF#の他には無い機能について知れましたか。頭に浮かんだことを書いただけなので、他にもC#とF#の他の言語には無い機能があると思います。もしまだ私が書いていないC#やF#の他の言語にはない機能、自分の愛用している言語の他の言語には無いと思う機能があれば、是非コメントしてください。
テスト自動化エンジニアシラバス：テスト自動化のリスクと保守

# はじめに

テスト自動化エンジニアのシラバスを再度読み直し、各章をDailyで読めるようにしてみた

https://www.istqb.org/certifications/test-automation-engineer

4.2 Risks Associated with Test Automation Development と 4.3 Test Automation Solution Maintainability を今回は翻訳・解説する

# テスト自動化デプロイメントのリスク

テスト自動化のデプロイとは、開発したテスト自動化スクリプトを実際のテスト環境に導入し、実行することです。
このフェーズでは、単にスクリプトが動くだけでなく、テスト対象システムとの連携、テスト結果の収集、そして継続的な実行のための環境構築などが含まれる。
このテスト自動化のデプロイには、様々なリスクが伴います。

そのリスクと緩和策を挙げる



## 技術的なリスク
- パッケージング
 テストスクリプトを適切にパッケージングし、共有できる状態にする必要があります。
- ロギング
 テスト結果を適切に記録し、分析できるようにする必要があります。
- テスト構造
 テストケースを効率的に管理し、再利用できるように構造化しなければなりません。
- 更新
 テスト環境やテストスクリプトの更新に伴う問題が発生する可能性があります。

## 環境的なリスク
- ネットワーク
 ネットワーク障害や遅延によってテストが中断する可能性があります。
- リソース
 テスト実行に必要なCPU、メモリなどのリソースが不足する可能性があります。
- セキュリティ
 ファイアウォール設定やアクセス権限の問題が発生する可能性があります。

## リスクの緩和策
これらのリスクを軽減するために、以下の対策を検討する必要があります。

- 計画的なパッケージング
 バージョン管理システムを活用し、テストスクリプトを適切に管理します。
- 詳細なロギング
 テスト実行中の詳細な情報を記録し、問題発生時の原因究明に役立てます。
    - 致命的エラー
 テスト実行を中止する可能性のあるエラーイベントを記録します。
    - エラー
 条件やインタラクションが失敗し、テストケースも失敗した場合に記録されます。
    - 警告
 予期しない条件やアクションが発生した場合に記録されますが、テストケースの流れを中断しません。
    - 情報
 テストケースの基本情報とテスト実行中のイベントを記録します。
    - デバッグ
 基本的なログには不要ですが、テスト失敗の調査に役立つ実行の詳細を記録します。
    - トレース
 デバッグと似ていますが、さらに詳細な情報を記録します。
- モジュラーなテスト構造
 テストケースを小さな単位に分割し、再利用性を高めます。
    - テストハーネス (Test Harness)
テストハーネスは、テストケースを実行するためのフレームワークです。テストケースの実行環境を制御し、テスト結果を収集・分析する機能を提供します。
    - テストフィクスチャ (Test Fixture)
テストフィクスチャは、テストケースの実行に必要な初期状態と終了状態を定義するものです。
事前条件: テストケースを実行する前に必要な環境やデータを設定します。
例: データベースの初期化、ファイルの作成、システムの起動
事後条件: テストケース実行後に環境を元の状態に戻します。
例: データベースのロールバック、ファイルの削除、システムの停止
- 定期的な更新
 テスト環境やテストスクリプトを定期的に更新し、最新の状態で保ちます。
- 安定したネットワーク環境
 高速で安定したネットワーク環境を構築します。
- 十分なリソースの確保
 テスト実行に必要なリソースを事前に確保します。
- セキュリティ対策
 ファイアウォール設定やアクセス権限を適切に設定します。


# テスト自動化の保守性

テスト自動化は、ソフトウェア開発の効率化に大きく貢献しますが、その効果を維持するためには、継続的な保守が不可欠です。ソフトウェアの変更、新しい技術の導入、環境の変化などに伴い、テスト自動化も適応させていく必要があります。

## テスト自動化の保守の種類

テスト自動化の保守は、大きく以下の4つの種類に分けられます。

- 予防保守 (Preventive maintenance)
 異なるテストタイプや、インターフェースやバージョンに対応して、テスト範囲の拡大をはかる

- 修正保守 (Corrective maintenance)
 テスト自動化スクリプトや環境設定に発生したバグを修正する。定期的に保守実行して確認を行い、リスクを減らすのがベストプラクティス

- 改善保守 (Perfective maintenance)
 テスト自動化のパフォーマンスやユーザビリティ、耐久性、保守性を目的とした改善

- 適応保守 (Adaptive maintenance)
 環境変化への対応(新しいハードウェア、ソフトウェア、規制)
 技術革新への対応(新しい技術やツールの導入)

## テスト自動化の保守のスコープとアプローチ

テスト自動化の保守の範囲は、以下の要素によって決まります。

- テスト自動化の規模と複雑さ
 システムが大きくなればなるほど、保守の範囲も広くなります。
- 変更の規模
 小規模なバグ修正から大規模な機能追加まで、変更の規模によって作業量が大きく異なります。
- 変更によるリスク
 変更によって既存の機能に影響が出ないか、慎重に評価する必要があります。


## 保守のアプローチ

- 影響分析
 変更がシステムにどのような影響を与えるかを事前に分析します。
- 段階的な変更 
 小さな単位で変更を行い、その都度テストを実施することで、リスクを軽減します。
- 自動化 
 可能な限り、保守作業を自動化することで、効率化を図ります。


## 保守のベストプラクティス

- ドキュメント化
 テスト自動化の仕組み、手順、利用方法などを詳細に文書化します。
- モジュール化
 テストコードをモジュール化することで、変更が容易になります。
- バージョン管理
 テストコードをバージョン管理システムで管理し、変更履歴を記録します。
- CI/CDの導入
 継続的インテグレーション/継続的デリバリー（CI/CD）を導入することで、自動化されたテスト環境を構築します。
- サードパーティの依存管理
 サードパーティのライブラリやツールへの依存を明確にし、更新情報を常に把握します。

## ネーミング規則とドキュメント
- ネーミング規則
 可読性が高く、一貫性のあるネーミング規則を定めることで、保守性を向上させます。
- ドキュメント 
 テストケース、テストシナリオ、テストデータなど、すべての情報をわかりやすくドキュメント化します。

## トレーニング

- 定期的なトレーニング
  テスト自動化に関する知識をチームメンバーに共有し、スキルアップを図ります。
- 実務経験
 実務を通して、テスト自動化のスキルを習得できるようにします。
Blender bmesh_simple_editmodeテンプレート解析

blenderのpythonTemplatesの１つであるBmesh Simple Editmodeについて解説を行う
基本的な動きについては単純だが要所要所でbpy特有の用語があるためその棚卸を行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/f4fa2255-7123-1394-f5c5-49ec0d4bb108.png)


```python
# This example assumes we have a mesh object in edit-mode

import bpy
import bmesh

# Get the active mesh
obj = bpy.context.edit_object
me = obj.data


# Get a BMesh representation
bm = bmesh.from_edit_mesh(me)

bm.faces.active = None

# Modify the BMesh, can do anything here...
for v in bm.verts:
    v.co.x += 1.0


# Show the updates in the viewport
# and recalculate n-gon tessellation.
bmesh.update_edit_mesh(me, loop_triangles=True)

```

## import bpy
bpyのインポートを行っています。
bpyはpythonでblenderを呼び出すことができるAPIのことです。
bpyを用いることでblenderの機能をpythonで制御することができます。

https://yuni-wiki.com/blender/blender_python_api/

https://docs.blender.org/api/current/index.html

## import bmesh
メッシュへのアクセスを提供するAPIです。
メッシュに対して影響を及ぼすことができるようになります。

> Introduction
This API gives access the Blender’s internal mesh editing API, featuring geometry connectivity data and access to editing operations such as split, separate, collapse and dissolve. 

この API は、ジオメトリ接続データと、分割、分離、折りたたみ、溶解などの編集操作へのアクセスを備えた Blender の内部メッシュ編集 API へのアクセスを提供します。

https://docs.blender.org/api/current/bmesh.html

## obj = bpy.context.edit_object
editモードのオブジェクトを選択しobjに格納します。

https://tamaki-py.hatenablog.com/entry/2019/05/28/180042

https://docs.blender.org/api/current/bpy.context.html#bpy.context.edit_object

## me = obj.data
対象のデータにへのアクセス
今回は編集モードのオブジェクトに対してそのデータにアクセスされます。

https://sites.google.com/site/blugjp/blenderpython/data_context_ops

## bm = bmesh.from_edit_mesh(me)
エディットモードのメッシュに対する操作を行えるインスタンスを作成します。


https://takunoji.hatenablog.com/entry/2018/03/26/225317

## for v in bm.verts:
全ての頂点に対してfor文で処理を行う
なおvertsはすべての頂点を表すリストのようなもの。

## v.co.x += 1.0
x軸に対して1をインクリメントする。

## bmesh.update_edit_mesh(me, loop_triangles=True)
有益な情報が見つけられなかったためgeminiで質問した。
> bmesh.update_edit_mesh(me, loop_triangles=True): この行は、BMeshで行った変更を元のメッシュに反映し、ビューポートに表示を更新します。loop_triangles=Trueは、n-gon（多角形）を三角形に分割するオプションです。

実際にこのコードを削ったところ移動は実施されなかったため何らかの反映の更新を行っていると考えられる。
【Advent Calendar 2024 #1日目】Advent Calendar 2024 参加の意気込み

# はじめに
本記事は、「初めての一人アドベンドカレンダー2024 by hohe」の1日目の記事となります。
Advent Calendar 期間中は、AWSの生成AI/ML関連を中心に記事を投稿していく予定ですが、
今回は初回ということで、Advent Calendarへの意気込みについて投稿します。

# 参加の背景
今回、Qiita Advent Calendar 2024 に参加した背景としては、ANGEL Dojo 2024参加の影響が大きいです。

ANGEL Dojoとは、参加企業から選出された4〜6名のメンバーでチームを組み、3ヶ月間でサービスの企画から開発まで行うハッカソン型トレーニングとなります。チームメンバーと協力してAWSを活用したモノづくりを体験し、開発プロジェクトで活躍できる人材を輩出する狙いがあります。

https://aws.amazon.com/jp/blogs/psa/2024-07-angel-dojo-kickoff/

この活動の中では、主活動である企画・開発の他にも、有志によるブログリレー企画などの取り組みがありました。私自身もこの取り組みへの参加者の一人として記事を投稿して、情報発信の最初の一歩を踏み出せたと共に、アウトプットすることの重要性を強く感じました。

一方で、このアウトプットについては「重要性を強く感じた」という感想で終わらせるのはもったいなく、実際にアウトプットという行動を継続することこそが重要だと思ったため、その手段の１つとして、今回 Qiita Advent Calendar 2024への参加することに決めました。

ちなみに、ANGEL Dojo 2024のブログリレー企画で投稿された記事一覧は、下記のリンクから閲覧できるので、ご興味がある方はチェックしてみてください！

https://qiita.com/organizations/2024-angel-dojo

# 意気込み
### Qiita Advent Calendar 2024 では以下の達成を目的に活動します。

1. 継続的に記事を投稿することでアウトプットの習慣を身につける
2. AWS特に生成AI/MLのサービスを中心として学習・整理した内容を記事を投稿し、体系的な知識を身につける

### 具体的な結果としては、以下を達成します。
1. 毎日継続的に記事を投稿することで、完走賞(期間中25以上の記事投稿が条件)を獲得する
2. AWSの以下の認定資格を期限内に取得する
    - AWS Certified AI Practitioner (12月中)
    - AWS Certified Machine Learning Engineer - Associate (12月中)
    - AWS Certified Machine Learning - Specialty (1月中)

# おわりに
今回はAdvent Calendar 1日目の記事として参加の背景と意気込みについて投稿しました。
掲げた目標を達成できるように残り24日間分の投稿についても頑張ります。
brew upgradeが途中で止まって進まない時の対処法

# TL;DR
``` bash
ssh-keygen -p
```
でsshのパスフレーズを一時的に削除する
# 問題
brew upgradeで
```
==> Cloning https://github.com/webmproject/sjpeg.git
Cloning into '/Users/admin/Library/Caches/Homebrew/jpeg-xl--sjpeg--git'...
```
ここから進まない症状が発生しました。

実際にHomeBrewのCacheのフォルダを見ると、フォルダは空のままでファイルが重すぎてダウンロードに時間がかかっているとかいうわけではなさそうです。


https://github.com/libjxl/libjxl/issues/2461

ここらへんのissue見ると、Intel + 古いMacOSでそんなことが起こります〜とか
``` bash
brew install gcc
```
でgccを更新した後に
``` bash
brew install jpeg-xl --force --cc gcc-13
```
実行すると治るよ！
とか書いてあったんですけど、あんまし効きませんでした

# 解決
ひとまず止まってるフォルダを自力でcloneしに行きました

``` bash
git clone https://github.com/libjxl/libjxl/issues/2461
```

そうすると、いつも通りsshのパスフレーズを入力して特に問題なくclone出来ました。

ただ、このフォルダをCacheのフォルダに置いてあげても、
```
==> Cloning https://github.com/webmproject/sjpeg.git
Updating '/Users/admin/Library/Caches/Homebrew/jpeg-xl--sjpeg--git'...
```

となって同様に止まってしまいます

こっから20分くらい悩んだんですが(正確にはこの間に--force -cc gcc-13とか試してた)、一つ閃いたのが、「sshのパスフレーズ入力するフローがbrewに設定されていないのでは？」という過程

そこでダメもとで試してみたら通りましたとさ。

ちゃんちゃん
HonoがJSXを提供しているので使ってみた

# はじめに
HonoはTypeScriptファーストのWebフレームワークとして知られていますが、JSXもサポートしているので、それについて書いていきます。

https://hono.dev/docs/guides/jsx

# Honoとは
Honoとは何かについては、以下の記事に記載されています。

https://qiita.com/hukuryo/items/ed2cda9b1c42d3c6ff6a#hono%E3%81%A3%E3%81%A6%E4%BD%95

ちなみに、Honoが提供しているJSXは、Reactと同じ文法をしていますが、開発者は、あえてReactのソースは見ずに実装をしているみたいです。

https://github.com/honojs/hono

# セットアップ
まず、必要なパッケージをインストールします。
```
npm install hono @hono/jsx
```
次に、TypeScriptの設定を行います。tsconfig.jsonに以下の設定を追加します。

``` tsconfig.json
{
  "compilerOptions": {
    "jsx": "react-jsx",
    "jsxImportSource": "hono/jsx"
  }
}

```
もしくは、以下のようにプラグマを記載することで利用できます。

```tsx
/** @jsx jsx */
/** @jsxImportSource hono/jsx */
```

# 簡単な画面を作成
最初は、以下のコードで簡単な動作確認をしていきましょう。
「/」がリクエストされた際に、HTMLをレスポンスします。
``` index.tsx
import { Hono } from 'hono'
import type { FC } from 'hono/jsx'

const app = new Hono()

const Layout: FC = (props) => {
  return (
    <html>
      <body>{props.children}</body>
    </html>
  )
}

const Top: FC<{ messages: string[] }> = (props: {
  messages: string[]
}) => {
  return (
    <Layout>
      <h1>Hello Hono!</h1>
      <ul>
        {props.messages.map((message) => {
          return <li>{message}!!</li>
        })}
      </ul>
    </Layout>
  )
}

app.get('/', (c) => {
  const messages = ['Good Morning', 'Good Evening', 'Good Night']
  return c.html(<Top messages={messages} />)
})

export default app
```
「npm run dev」を実行し、http://localhost:8787 をブラウザで開いてみましょう。
以下のような画面が表示されるはずです。
![スクリーンショット 2024-11-24 20.56.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/cebb152c-8e74-948f-79ed-c620dda5ff1c.png)

# HonoとNext.jsを比べると
Next.jsはフロントからきているフレームワークなので、基本的なバックエンドの機能が弱い部分があります。例えば、ロギングがまともにできない点であったり、ミドルウェアの機能が使いづらい(Node.jsの機能が全て使えない等)などの弱さがあります。(Honoは普通にできる。)
これに対して、Honoは、バックエンドからきているフレームワークなので、Next.jsの弱い部分であるバックエンドの機能については、一通り揃っているのではないかと思いますが、一方でReactを使ってUIを構築していくとなると、Next.jsはReactのフレームワークとしての機能が揃っているため、そちらも捨て難いなと思います。
なので現状は、要件によって、フロントエンドとバックエンドのどちらに重きをおくかで、技術選択としては、変わってくるのではないかなと思います。

# まとめ
Honoはサーバーサイドフレームワークとして誕生しましたが、こういったJSXもサポートしているということで、これからさらにシェアが広がっていく技術になっていくのではないかと思います。

# 最後に
他にも色々な記事を書いているので、よければ読んでいってください！

https://qiita.com/hukuryo/items/97797a91d7e2ee0bcabc

https://qiita.com/hukuryo/items/2c07c52ff3386d5d75b9

https://qiita.com/hukuryo/items/ebeb26823f944f143b11
AWSスキルを持った人が最短でGCP PCAを取るための方法

## こんな人におすすめ
- AWSのスキルを持っている。
- GCP無経験ながら、Professional Cloud Architectを取りたい人

## 背景
AWS SAPを持っているのですが、最近特にデータサイエンス周りでGCPが利用されているイメージがあったので、勉強のためPCAを受験しました。
いくつか寄り道しましたが、GCP未経験でも、大体20時間くらいの勉強で合格できました。
結構有用な勉強法を道中見つけたので、紹介します。（最初からこの道辿ってれば、10時間で行けた気がする。）

## おすすめ勉強法
### 概要把握
下記サイトを斜め読みする。https://blog.g-gen.co.jp/entry/professional-cloud-architect

無料なのが申し訳ないぐらい、良かったです。
特にAWSとの読み替えを意識してくれている記事も多くて、ストレスなく全体像を把握することができました。
特定のサービスについても、ブログ内検索で結構体系的にまとまったものが出てくるので、

### udemyの模擬試験
この問題集がおすすめです。https://www.udemy.com/course/google-cloud-professional-cloud-architect-i/?couponCode=ST2MT110724BNEW

有料ですが合格効率考えたら、かなり有用だと思います。
本番試験についてどこまで言って良いのかわからないので詳しい言及は避けますが、難易度がかなりいい感じでした。
Udemyあるあるだと思いますが、Udemy内でGCPで検索したりなんらかルート取ると、急にタイムセール始まって、自分はディスカウントで購入できました。

ただ、1つ欠点があって、解説の情報量が少ないです。
これを埋めるために、生成系AIを利用しました。主にperplexityです。
「AWSでいうとどんな技術ですか？」と聞けるのがかなり効率良かったです。
もちろん上記に当てはまらない技術もありますが、PCAの範囲ならほとんどが読み替え可能です。

## GCP PCA総評
試験勉強としては、個人的にはAWS SAPより好きでした。
試験難易度はAWS SAPよりもだいぶ低めに感じました。
AWSはサービスごとの特徴を結構知っていないといけないんですが、GCPはベストプラクティス知っていれば、雰囲気で解ける印象で、暗記が少なく済んだ気がします。

あと、AWSとGCPの思想の違いを結構感じるので、その点かなり楽しかったです。（リージョン、VPC、サブネットなどのネットワーク系は特に）
次はPMLE頑張ろうと思っています。
MCTへの道：トレイン・ザ・トレーナー2-4日目

趣味でマイクロソフト認定トレーナー（通称MCT）を目指しています。

研修中は、研修1日目にブログを投稿し、最終日まで毎日投稿しよう！と思っていました。が、気づけば放置し１か月…(笑)期間中は毎日終日の研修がハードだったのと、毎日何かしら予定が入り投稿できておりませんでした。。

https://qiita.com/ponponmikankan/items/cd88d4adcd226b16aa19

そんな言い訳はここまでにして、のこりの2‐4日分についてどんなことを感じたか書ければと思います。研修の概要については1日目の記事をご覧ください。

## 2-4日目のカリキュラム

1日目に成人学習を学んだあとは、2－3日目は研修の手法や話し方、進め方等を実習を交えながら学んでいきます。最終日は3日間で学んだことを使って、自分の好きなジャンルで10分間のミニ研修を自ら企画して実践していきます。

研修準備：学習目標の設定方法
  - 学習目標の構成要素と作成時の留意点（個人演習あり）

研修準備：教育手法の選択
  - 学習目標に合わせた教育手法の選択（プレゼンテーション演習あり）にふぃ
  - 分かりやすい指示の与え方（個人演習あり）

研修準備：教授戦略プランの作成
  - 研修実施の具体的手順のまとめ方（個人演習あり）

研修の進め方
  - 学習環境の整え方
  - 開始時に受講者の学習意欲を高め、動機づけをする方法（プレゼンテーション研修あり）
  - 講義の展開方法で受講者の学習を促進する
  - より分かりやすい講義を行うためのテクニック

具体例と喩え話
  - 研修内で具体例や喩え話を取り入れる理由と活用時の留意点（個人演習あり）

発問の有効利用
  - トレーナーから受講者に対する効果的な問いかけ方法
  - 問いに対する受講者の回答への対処手順と留意点（個人演習あり）

効果的ほかのめんば＾な質疑応答
  - 受講者の質問を丁寧に受け取る手順
  - 受講者からの質問に5つの回答方法を用いて答える（プレゼンテーション演習あり）

視聴覚教材の作成と活用
  - 作成時の留意点
  - ポインタ（指し棒）活用時の留意点

プレ１＾ゼンテーション演習（動画撮影あり）
  - 一人10分程度のプレゼンテーション演習と参加者相互のフィードバック

研修内での様々な問題解決
  - 時間管理（ディスカッション演習あり）
  - 扱いにくい受講者の対処（ディスカッション演習あり）

まとめとふりかえり

## 2-4日目の振り返り
基本的に講義→演習というスタイルは変わらずで、テキストを少し読んでから毎回ペアやグループで演習をしていきます。

### 学習目標の設定の大切さ
トレイン・ザ・トレーナーを受講してから自分が受講してきた社内外の研修を振りかえって感じたことは、たまに学習目標を設定していない研修があること。（そして自分も数年前まではあんまり意識していなかった…）学習目標とは最終的に受講者に期待される行動を記述したもので、行動・条件・基準が明確に示される必要があります。またしつこいくらい伝えるのも大事。
カリキュラムはあるけど、学習目標が明言されていない、もしくは学習目標はあるけど行動・条件・基準があいまいな研修ってたまにあるなと気づきました。ふんわり勉強が始まる感じ。
学習目標を設定することで、受講者とのゴールのすり合わせができるだけでなく、研修が簡単すぎる、難しすぎる等で研修への期待の乖離が発生しづらくなる利点もありますね。

### 研修に合った教育手法の選択
講義のほか研修を双方向にする手法として、ディスカッションやダイアログ、ブレスト、ロールプレイ、ディスカッション、ケーススタディ等いろいろな手法があることも学びました。
実際にほかのメンバーを受講者に見立てて場にあった教育手法を実践する場面があるのですが、いかに受講者の学習に役立つかを考えて選択・テーマを与えるかが難しかったです。なんとなくディスカッションさせるのではなく、ちゃんと学習目標に合った設計・時間配分が必要になります。

### ド緊張！4日間の集大成研修プレゼン
最終日には三日間学んだことを受けて、自分で研修を設計して10分間プレゼンをします。普段人前に立つことに慣れていても、難しかったです。というのも、研修で学んだポイントを入れたり、自分が直したいと思っている話し方を矯正しながら実践するのでめっちゃくちゃ緊張しました。ちなみに録画されるので、あとでSDカードいただけます。
十人十色で皆さん思い思いの研修を実践するのですが、中にはハプニング（用意していた動画が流れない、時間切れ、言葉に詰まってしまう等）もあり、そういったトラブルも研修を実施する上で起こりうるので勉強になりました。
プレゼン中は一人ひとりにフィードバックコメントシートを書きます。なかなか普段の社内勉強会ではもらえない研修設計者・研修講師・プロ受講者（？）視点でのコメントがもらえるのでためになりました。一生大事にします。

### MCTの要件ではあるけれど…。
今回はMCTの資格要件として、指導スキル証明書プロバイダー (ISCP) プログラムを受講完了する必要があり、「トレイン・ザ・トレーナー」を受講しました。しかしながら、MCTや研修講師・研修設計者でなくても「誰かに何かを伝えるような立場にいる人」には大変お勧めできる研修だと個人的には思います！
テンソルとは？

# 概要
ChatGPT4曰く...
|Pythonでの「テンソル」とは、主に数値データを格納するために使用される多次元配列です。Pythonでテンソルを操作する際には、通常、NumPyライブラリや深層学習フレームワークであるTensorFlowやPyTorchが使用されます。|
|:-|

・NumPyにおいては、ndarrayオブジェクトがテンソルとして機能します。これは任意の次元の配列を作成・操作するためのもの.

```python
import numpy as np
tensor = np.array([[1, 2], [3, 4]])
```

・TensorFlowやPyTorchでは、より高度なテンソル操作が可能です。これらはGPUを利用して計算を高速化することができ、深層学習で広く利用されています。


```python
#TensorFlowでの例
import tensorflow as tf
tensor = tf.constant([[1, 2], [3, 4]])
```
```python
#Pytorchでの例
import torch
tensor = torch.tensor([[1, 2], [3, 4]])
```

# つまり
テンソルはベクトルや行列の一般化
Vue3で背景画像が設定できない

##   Vueにてbackground-imageで背景画像を指定
```
<template>
  <div class="hoge">
  </div>
</template>

<script>
export default {
  data() {
    return {
    }
  }
}
</script>

<style scoped>

.hoge{
  width: 100%;
  height: 100vh;
  background-image: url('@/assets/images/background.png');
  background-repeat: no-repeat;
  background-size: cover;
}
</style>
```
Vue3でassets/images配下に画像を入れて、
上記コードを記述してみると、背景が真っ白。
検証ツールを見てみると、404のエラーが発生している。

## 試したこと
https://tesao.work/posts/vue_background-image_path/

https://qiita.com/skmtko/items/a83f836b48f24309916d/
上記を参考に変数にしてみたり、HTML側に直接styleを記述したり
してみるもうまくいかず、、、

## 解決方法
試しにjavascriptファイルの中にimagesファイルを新たに作り、
その中に画像を入れてみた。
```
<template>
  <div class="hoge">
  </div>
</template>

<script>
export default {
  data() {
    return {
    }
  }
}
</script>

<style scoped>
.hoge{
  width: 100%;
  height: 100vh;
  background-image: url('@/images/background.png');
  background-repeat: no-repeat;
  background-size: cover;
}
</style>
```

background-imageのurlのパスを少し修正。
すると、背景画像が現れました。
GitのメリットをSubversionと比較してまとめた

## はじめに
バージョン管理システムとしてGitが選ばれる理由を知りたくなり比較することにした。

## 集中型と分散型
### 集中型について
集中型は、開発者全員がひとつのリポジトリを使ってバージョン管理するという特徴があり、またオンライン接続が必要という特徴がある。

Subversionは集中型バージョン管理システムである。

### 分散型について
分散型は、開発者それぞれがローカルにリポジトリを持つことが出来るという特徴がある。

Gitは分散型バージョン管理システムである。

### メリット1
オフラインでの作業が可能

## 平行作業
Subversionではひとつのリポジトリを使っているのでコミットが即時に反映されるためお試しや実験をしにくい。

対してGitはそれぞれのリポジトリを使うこともできるのでお試しや実験がしやすい。

### メリット2
お試しや実験を容易にできる

## 情報量
GitはSubversionよりも主流である。またGitHub、GitLabなど開発ツール、プラットフォームが広く普及している。
Qiitaの記事数からも需要が明らかである。

Qiita記事数(2024/11/24 20:35現在)
+ Git       ：17149記事
+ Subversion：379記事

### メリット3
インターネット上の情報量が多い

## まとめ
1\. オフラインでの作業が可能
2\. お試しや実験を容易にできる
3\. インターネット上の情報量が多い

## 参考資料
[改訂2版 わかばちゃんと学ぶ Git使い方入門](https://www.c-r.com/book/detail/1409 "改訂2版 わかばちゃんと学ぶ Git使い方入門")
テスト自動化エンジニアシラバス：テスト自動化の導入

# はじめに

テスト自動化エンジニアのシラバスを再度読み直し、各章をDailyで読めるようにしてみた

https://www.istqb.org/certifications/test-automation-engineer

4.1 Test Automation Development を今回は翻訳・解説する

# テスト自動化の導入プロセス

ソフトウェアの開発において、品質を確保するためにテストは欠かせません。ただ、このテストを手動で行なっていては時間がかかり、人的ミスも起こりやすいため、テストの自動化が求められている。

テスト自動化パイロットとは、テスト自動化を実際に導入する前に、その効果や課題を検証するための小規模なプロジェクトのことです。このパイロットを通して、本格的なテスト自動化への移行をスムーズに進めることができる。

## テスト自動化パイロットの目的

パイロットプロジェクトの主な目的は以下のとおりである。

- テスト自動化に関して詳細を学ぶ
 現在の手動テストプロセスと比較して、自動化がどのように効率化を図れるかを理解する。
 自動化ツールの選定やスクリプトの作成方法を学ぶ。
- 現在のプロセス、ツールのどこに適合するか、どんな変化が起きるかを見極める
 自動化が既存の開発プロセスやツールチェーンにどのように統合されるかを評価する。
 自動化導入によるプロセスの変化や必要な調整を予測する。
- テスターに合った自動化I/Fを設計する
 テスターが使いやすいインターフェースを設計し、効率的に自動化スクリプトを作成・管理する。
 ユーザビリティを重視し、テスターの負担を軽減する。
- 自動化の利用の標準を決める
 自動化のベストプラクティスや標準手順を確立し、チーム全体で共有する。
 一貫性のある自動化プロセスを構築する。
- テスト自動化の利用状況、有用性、保守性、拡張性などをモニタリングするためのメトリックスを決める
 自動化の効果を測定するための指標（例：テストカバレッジ、バグ検出率、テスト実行時間）を設定する。
 定期的に評価し、改善点を見つける。
- 妥当コストで効果があるかを評価する
 自動化ツールの導入コストと得られる効果を比較し、コスト対効果を評価する。
- どんなスキルが必要で、現在そのスキルを満たしているかどうかを見極める
 自動化に必要なスキルセットを特定し、チームメンバーのスキルレベルを評価する。
 必要に応じてトレーニングやスキルアップの計画を立てる


## テスト自動化パイロットのスコープ定義

テスト自動化パイロットを開始する前に、以下の要素を明確にする必要があります。

- 対象システム (SUT)
 自動化の対象となるシステムを特定。
- プログラミング言語
 テストスクリプトを作成するプログラミング言語を選択。
- 自動化ツール
 適切なテスト自動化ツールを選択
- テストレベル
 単体テスト、統合テスト、システムテストなど、どのレベルのテストを自動化するかを決定
- テストケース
 自動化するテストケースを厳選
- テストケース開発アプローチ
 テストケースの作成方法を決定

なお、テスト自動化のプロジェクトを選ぶ時、２点考慮する
- 重要なプロジェクトで、テスト自動化の結果が影響するプロジェクトを避ける。テスト自動化がうまくいかないリスクを考慮する
- かんたんなプロジェクは、主だった成果を得られず、またこれから自動化にかかる工数や見積もりなどを学習できないため、避けた方が良い


## パイロットプロジェクトの実行

- 初期プロトタイプの作成
 異なるアプローチで複数のプロトタイプを作成し、比較する。
- タイムラインの定義
 パイロットプロジェクトのスケジュールを明確にする
- CI/CDへの統合
 テスト自動化を継続的インテグレーション/継続的デリバリー（CI/CD）パイプラインに組み込む
- 非技術的な要素の評価
 チームメンバーのスキル、チーム構造、ライセンスなど、非技術的な要素も評価対象とする


## パイロットプロジェクトの評価

パイロットプロジェクトが完了したら、以下の点を評価し、本格的なテスト自動化への移行を決定します。
レビューする時は、ステークホルダー全員を呼んで行うことが重要である。

- テスト効率の改善
 テスト実行時間がどれくらい短縮されたか。
- テストカバレッジの向上
 どの程度のテストケースが自動化されたか。
- バグ検出率の向上
 自動化によって、どれだけのバグが検出されたか。
- チームの反応
 チームメンバーは自動化に対してどのような反応を示したか。
- コスト対効果
 自動化ツールの導入コストと、得られる効果を比較します。

## テスト自動化の成功要因

本導入するときに、以下の点を考慮すると、テスト自動化がうまく軌道になる

- 他の組織に展開し、新たなユーザーをサポートする。これは自動化の拡大を意味している。考えうるボトルネックは、起きる前に先んじて解決する。
- プロセスを適合するように修正・改善する。
- 新しいユーザーへのトレーニングを提供する。
- 利用ガイドラインを整備する。FAQなどを用意し、質問へのサポートの負担を軽減する。
- 実例を集め、自動化がどの部分で使われたかを示す。
- 自動化のメリットとコストをモニタリングし、ビジネスへの貢献を可視化する。
- テストチームやデプロイチームを支援する。
- 全チームで評価し、学んだことを明示化し、さらに改善につなげる。
- 評価結果から改善ステップに進む。
Pythonのコンストラクタとは？

# 概要
ChatGPT4さん曰く...
|コンストラクタは、オブジェクト指向プログラミングにおいて、クラスのインスタンスが生成される際に自動的に呼び出される特殊なメソッドです。このメソッドはクラスが新しいオブジェクトを作成するときに、そのオブジェクトの初期状態を設定するために使用されます。コンストラクタは通常、オブジェクトのプロパティや変数の初期値を設定したり、オブジェクト生成時に必要な前処理を行ったりするのに使われます。|
|:-|
VSCodeで作成されたはずのファイルが見つからない

## 初めに

疑問に思ったことや上手くいかなかったことのアウトプットをしています。
自分なりの理解でアウトプットしていきます。初学者なので誤りもあると思います。
その際はご指摘いただけると幸いです。

## .gitignoreファイルとは？
こちらに記述すると、Gitにアップされないようにできるファイルです。

## VSCodeでは
設定によってはファイルが非表示になる場合があります。

**以下の手順で非表示を解除できます。**
1．歯車アイコンをクリック
2．Explorer: Exclude Git Ignoreと検索する。
3．Explorer: Exclude Git Ignoreのチェックボックスがサインされていないか確認。
サインされていたらサインをオフにする。
4．設定を変更後、再読み込みをする。
GIthubのレポジトリ名変更

# GitHubリポジトリ名を変更し、ローカルリポジトリを更新する方法:point_up_tone1:

GitHubでリポジトリ名を変更した後、ローカルリポジトリとの接続を更新する必要があります。このガイドでは、その手順をステップごとに説明します。

---
## GitHub上でリポジトリ名を変更する

1. GitHubで該当するリポジトリを開きます。
2. **Settings** タブをクリックします。
3. **General** セクションに移動し、リポジトリ名を変更します。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929278/12d18e83-3cfb-e77a-10b6-678c564181b8.png)


---

## ローカルリポジトリの設定を更新する

### 手順1: 該当するローカルリポジトリに移動
リポジトリを変更するには、まずターミナルで該当するローカルリポジトリに移動します。(Git bashもしくは、パソコン上のcommandline)

```bash
cd <your-local-repository-path
```
### 手順2: 現在のリモートURLを確認
リモートURLが現在どのように設定されているか確認します。

```bash
git remote -v
```

出力例:
```bash
origin  https://github.com/username/old-repository-name.git (fetch)
origin  https://github.com/username/old-repository-name.git (push)
```
### 手順3: リモートURLをローカルリポジトリで更新
リポジトリ名を変更した後、リモートURLを新しいURLに更新します。

```bash
git remote set-url origin https://github.com/username/new-repository-name.git
```

### 手順4: 新しいリモートURLが設定されたか確認
更新されたリモートURLを確認します。
```bash
git remote -v
```

出力例:
```bash
origin  https://github.com/username/new-repository-name.git (fetch)
origin  https://github.com/username/new-repository-name.git (push)
```
### 手順5: リモートリポジトリへの接続を確認
```bash
git pull origin main
```
注意: デフォルトブランチが main でない場合は、適切なブランチ名（例: master）を使用してください。

出力例:
```bash
Already up to date.
```
---
### 注意事項
- 他のチームメンバーがリポジトリにアクセスしている場合は、リポジトリ名の変更を通知しましょう。
- CI/CDパイプラインやWebhooksを使用している場合、関連する設定を更新する必要があります。

---
これで、GitHubリポジトリ名の変更とローカルリポジトリ設定の更新が完了しました！
Docker ビルドコンテキスト

**【学習備忘録】**
ビルドコンテキストの意味について、やっと理解できたので備忘録を記す

Docker image build のコンテキストの意味
　→　dockerデーモンにDockerfileと一緒に送るファイルのこと。

docker image build {ビルドコンテキストのパス}
　→　このコマンドでどのファイルやディレクトリをdockerデーモンに送るのかを指定している。デフォルトでビルドコンテキストと同じ階層にDockerfileがあるものとしてdockerデーモンはDockerfileを探しにいく。

doker image build -f hoge/Dockerfile .
　→　このコマンドで現在のディレクトリ配下全てをdockerデーモンへ送る。また現在のディレクトリにDockerfileがないことから、fオプションでhogeディレクトリの配下のDockerfileを探すように指定している。
chmod 777とchmod 2777の違い

chmodコマンドは、ファイルやディレクトリのアクセス権限を変更するために使用されます。chmod 777とchmod 2777の違いは、設定される特別なビットにあります。以下にそれぞれの詳細を説明します。

### chmod 777
- 意味: ファイルやディレクトリに対して、所有者、グループ、その他のユーザーすべてに読み取り（r）、書き込み（w）、実行（x）の権限を与えます。
- 権限: rwxrwxrwx
  - 所有者（user）：読み取り、書き込み、実行
  - グループ（group）：読み取り、書き込み、実行
  - その他（others）：読み取り、書き込み、実行
### chmod 2777
- 意味: chmod 777の権限に加えて、セットGID（Set Group ID）ビットを設定します。セットGIDビットは、ディレクトリに対して特別な動作を指定します。
- 権限: rwxrwsrwx
  - 所有者（user）：読み取り、書き込み、実行
  - グループ（group）：読み取り、書き込み、実行（セットGIDビットが設定される）
  - その他（others）：読み取り、書き込み、実行

セットGIDビットの効果
- ディレクトリの場合:
  - セットGIDビットが設定されたディレクトリに新しく作成されたファイルやサブディレクトリは、その親ディレクトリのグループIDを継承します。これにより、同じグループのユーザーがファイルやディレクトリを共有しやすくなります。
- ファイルの場合:
  - セットGIDビットが設定された実行ファイルは、そのファイルを実行するユーザーが一時的にそのファイルのグループIDで実行されます。これは特定のシステム管理タスクで使用されることがありますが、セキュリティリスクが伴うため、慎重に使用する必要があります。

例
- chmod 777 example.txt:
example.txtファイルに対して、すべてのユーザーに読み取り、書き込み、実行権限を与えます。
- chmod 2777 /example_directory:
/example_directoryディレクトリに対して、すべてのユーザーに読み取り、書き込み、実行権限を与え、さらにそのディレクトリ内で作成されるすべてのファイルやサブディレクトリが親ディレクトリのグループIDを継承するようにします。

注意点
- セキュリティ: chmod 777やchmod 2777は非常に広範な権限を与えるため、セキュリティリスクが高まります。特に公開サーバーや共有環境では慎重に使用する必要があります。
- セットGIDビット: セットGIDビットは便利な機能ですが、誤って設定すると予期しない動作を引き起こす可能性があります。設定する前にその効果を十分に理解しておくことが重要です。

これらの違いを理解することで、適切な権限設定を行い、システムのセキュリティと運用効率を向上させることができます。