OmniAICreator/Qiita-1.07M huggingface dataset:
ActiveRecord::Relationにおける present? exists? blank? empty?

## 結論

- 条件に合致するレコードが１件以上存在するかどうかを確認したい場合
    - `exists?`メソッドを使う
- 条件に合致するレコードが１件も存在しないかどうかを確認したい場合
    - `empty?`メソッドを使う

## 使用データ

```rb
irb(main):001> ExternalUser.all
  ExternalUser Load (2.1ms)  SELECT `external_users`.* FROM `external_users`
=>
[#<ExternalUser:0x0000000109a00000
  id: 1,
  name: "external_user_1",
  email: "external_user_1@example.com",
  created_at: Tue, 16 Apr 2024 16:30:12.429205000 JST +09:00,
  updated_at: Tue, 16 Apr 2024 16:30:12.429205000 JST +09:00>]
```

## 実行結果

### present?

```rb
irb(main):001> ExternalUser.all.present?
  TRANSACTION (0.1ms)  BEGIN
  ExternalUser Load (1.5ms)  SELECT `external_users`.* FROM `external_users`
=> true
```

### exists?

```rb
irb(main):001> ExternalUser.all.exists?
  ExternalUser Exists? (0.7ms)  SELECT 1 AS one FROM `external_users` LIMIT 1
=> true
```

### blank?

```rb
irb(main):001> ExternalUser.all.blank?
  ExternalUser Load (1.2ms)  SELECT `external_users`.* FROM `external_users`
=> false
```

### empty?

```rb
irb(main):001> SESEvent.all.empty?
  SESEvent Exists? (1.1ms)  SELECT 1 AS one FROM `ses_events` LIMIT 1
=> true
```
【OOTBベースのプロジェクトにおけるメリットと気をつけるポイント】

## OOTBベースのプロジェクトにおけるメリットと気をつけるポイント
　ServiceNowのプロジェクトを今まで経験していない方に向けて、ServiceNowが推奨している、OOTBという概念を念頭に置いて開発する際のメリット/デメリットをお伝えすることで、プロジェクトの進め方で悩まないようにお伝えできればと思います。

　私のバックグランドとしては、これまでSalesforceやKintone、HubSpotの開発プロジェクトを経験していたので、そのほかのパッケージ開発と比較して、ServiceNowならではの部分にも触れながら、説明できればと思います。

### アジェンダ
1. OOTBとは
1. OOTBベースプロジェクトのメリット
1. OOTBベースプロジェクトのデメリット
1. まとめ

### 1. OOTBとは
　ServiceNowは、OOTB(Out of the Box)という、できる限り標準機能を利用して、カスタマイズを少なくすることを推奨しています。
※箱から出してそのまま使えるという意

　ServiceNowのプロジェクトはOOTBを基準とした進め方を念頭に置いて、利用開始までの初期構築期間を短くしつつ、メンテナンスコストをできる限り下げることを目標に実装を進める点が特徴的です。

　多くのパッケージ製品では、顧客の業務内容に合わせてシステムをカスタマイズする場合が多いと思いますが、この点はServiceNow開発の特徴だと思います。


### 2. OOTBベースのプロジェクトにおけるメリット
　OOTBベースのプロジェクトにおけるメリットを、他パッケージの開発プロジェクトとの違い/共通点を基に説明できればと思います。

### ●メンテナンスコストの低下
　OOTBベースで構築を行うことで、追加要件の実装や改修が必要になった際の影響範囲の調査やテスト項目の設計にかかる工数を削減できます。

#### ●アップデート時の不具合回避
　ServiceNowは年に2回アップデートされます。これらのアップデートでは、カスタムスクリプトや追加開発された機能がServiceNowの標準機能と互換性を失い、不具合が生じる可能性があります。その際、エンジニアはスクリプトを手動で確認し、不具合のある箇所を特定する必要があります。このプロセスはアップデートのたびに繰り返され、多くの工数を必要とします。
 OOTBベースで開発を進めることで、上記の工数を削減できます。


#### ●追加リリース機能との高い親和性
 ServiceNowは、様々な追加機能を、毎回のアップデート時にリリースします。
最近だと生成AI機能等が目玉機能として紹介されています。
参考：https://docs.servicenow.com/ja-JP/bundle/vancouver-intelligent-experiences/page/administer/now-assist-platform/concept/platform-now-assist-landing.html

　ServiceNow上に、独自に開発してしまっている場合は、追加開発箇所に格納されたデータに対して、新たな機能が利用できないなどのデメリットが生じる可能性があります。
 　その場合だと、ライセンス費用は変わらないにも関わらず、便利な機能が利用できないという可能性が出てきます。OOTBベースでプロジェクトを進めると、こうした機会損失を避けられます。

### 3. OOTBベースプロジェクトのデメリット
#### ●機能開発に制限がある
　当たり前と思われる方も多いと思いますが、OOTBで進める際には、できるカスタマイズに制限があります。設定ベースで行える業務領域だけでは、お客様の要望をかなえることが難しい場合もあります。
　例としては、画面のデザインを凝りたい、同じフォームからテーブルに書き込むけれども、ログインするユーザーによって表示する項目を変えたい等の要望があげられます。

#### ●他システムとの連携時にサポートされていない場合がある。
　他システムとのインテグレーションの際に、外部アプリの利用やコードを書く必要がある場合があります。Slackに通知を送りたい、AWSにデータを流したいなどの要望は一定数発生しますが、OOTBでは対応していない場合があります。

### 4.まとめ
　OOTBベースでのプロジェクトにおけるメリット/デメリットを明確に把握いただけたと思います。OOTBに関してもっと知りたい方がいらっしゃいましたら、NowCreateを参照いただけると、より詳細な情報を得られると思いますのでご参考ください.
 

参考：https://nowlearning.servicenow.com/nowcreate
streamlitメモ①


## 1. はじめに
Streamlitは、Pythonを用いたデータアプリケーションを迅速に構築するためのオープンソースフレームワークだぬ。データサイエンティストや開発者が簡単に美しいUIを持つアプリケーションを作成できることが特徴だぬ。この記事では、Streamlitの基本的な使い方と簡単なデモアプリケーションの作成方法を紹介するだぬ。

## 2. Streamlitのインストール
StreamlitはPythonのパッケージとして提供されているだぬ。以下のコマンドを実行してインストールしようだぬ。
```bash
pip install streamlit
```

## 3. 最初のStreamlitアプリ
Streamlitでのアプリ開発は非常にシンプルだぬ。まずは、基本的なアプリを作成してみようぬ。以下のコードを`app.py`として保存しようだぬ。
```python
import streamlit as st

st.title('Streamlit 入門')

st.write('これはStreamlitアプリのデモだぬ。')
```
保存した後、コマンドラインで以下を実行しようだぬ。
```bash
streamlit run app.py
```
これで、ブラウザが開き、指定したタイトルとテキストが表示されるStreamlitアプリが起動するだぬ。

実行結果だぬ👇
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951968/82162b6d-4ed7-0f03-a20f-af683039b866.png)

## 4. コンポーネントの追加
Streamlitは多様なウィジェットを提供しており、これらを使ってインタラクティブなアプリケーションを簡単に作成できるだぬ。例えば、ボタンやテキスト入力、グラフ表示などがあるだぬ。以下に、いくつかのウィジェットの使用例を示すだぬ。
```python
st.button('押してくださいだぬ')
st.text_input('あなたの名前を入力してくださいだぬ')
st.slider('あなたの年齢', 0, 100, 25)
```

先ほどと同様に、ターミナルで以下を実行するだぬ。
```bash
streamlit run app.py
```

実行結果だぬ👇
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951968/8d0e9de8-dc89-07f1-7ae4-eb85fc94bd38.png)

## 5. データの可視化
Streamlitはデータの可視化も簡単に行えるだぬ。以下のコードは、ランダムなデータを生成し、それをグラフとして表示するだぬ。
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# データ生成
data = pd.DataFrame(
  np.random.randn(100, 2),
  columns=['a', 'b']
)

st.line_chart(data)
```

先ほどと同様に、ターミナルで以下を実行するだぬ。
```bash
streamlit run app.py
```

実行結果だぬ👇
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951968/21fd3d89-4cd2-ecd6-5f65-a8075193fe5c.png)

## 6. ソースコード最終版
最終的なソースコードは以下の通りだぬ。
```python
import streamlit as st
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

st.title('Streamlit 入門')
st.write('これはStreamlitアプリのデモだぬ。')

st.button('押してくださいだぬ')
st.text_input('あなたの名前を入力してくださいだぬ')
st.slider('あなたの年齢', 0, 100, 25)

# データ生成
data = pd.DataFrame(
  np.random.randn(100, 2),
  columns=['a', 'b']
)

st.line_chart(data)
```

## まとめ
Streamlitを使えば、Pythonのコードのみでデータアプリケーションを手軽に開発できるだぬ。今回は基本的なコンポーネントの使用方法を紹介しただぬが、Streamlitにはさらに多くの機能があるだぬ。公式ドキュメントやコミュニティを活用して、より複雑なアプリケーションの開発に挑戦してみるだぬ。

---

備考：カワウソ好きな筆者です。
可愛い嘘のカワウソというキャラクターが好きで、それに感化されて文末を「だぬ」にしています。読みにくいかもしれませんが、筆者なりに楽しく執筆をするための工夫ですので、温かい目で見ていただけると嬉しいです。
PMBOKってなんだっけ？

# PMBOKの概要

PMBOK（Project Management Body of Knowledge）の略
ピンボックって読む

プロジェクトマネジメントの知識を体系化したもの
6版までは10の知識エリア、5つのプロセス群
7版からは12の原則、8つのパフォーマンス・ドメインから定義されている
最新は第7版

# 6版から7版への変更点

参考

https://products.sint.co.jp/obpm/blog/pmbok7

# 6版までの構成
個人的にプロジェクトマネジメントっていうとこっちの馴染が深い

## 知識エリア
### 統合・マネジメント
プロジェクトマネジメント・プロセス群内の各種プロセスとプロジェクトマネジメント活動の特定、定義、結合、統一、調整等を行うために必要なプロセスおよび活動。

### スコープ・マネジメント
プロジェクトを成功のうちに完了するために必要なすべての作業を含み、かつ必要な作業のみを含むことを確実にするために必要なプロセス。

### スケジュール・マネジメント
プロジェクトを所定の時間で完了するようにマネジメントする上で必要なプロセスからなる。
### コスト・マネジメント
プロジェクトを承認済みの予算内で完了するための、計画、見積り、予算化、資金調達、財源確保、マネジメント、およびコントロールのプロセス。
### 品質・マネジメント
ステークホルダーの期待を満たすために、プロジェクトとプロダクトの品質要求事項の計画、マネジメント、およびコントロールに関する組織の品質方針を組み込むプロセス。
### 資源・マネジメント
プロジェクトを成功裏に完了させるために必要な資源を特定し、獲得し、そしてマネジメントするプロセス。
### コミュニケーション・マネジメント
プロジェクト情報の計画、収集、生成、配布、保管、検索、マネジメント、コントロール、監視、そして最終的な廃棄を適時かつ適切な形で確実に行うために必要なプロセス。
### リスク・マネジメント
プロジェクトに関するリスク・マネジメントの計画、特定、分析、対応計画、対応策の実行、およびリスクの監視を実施するプロセス。
### 調達・マネジメント
プロダクト、サービス、所産をプロジェクト・チームの外部から購入または取得するプロセス。
### ステークホルダー・マネジメント
プロジェクトに影響を与えたりプロジェクトによって影響を受けたりする可能性がある個人やグループまたは組織を特定し、ステークホルダーの期待とプロジェクトへの影響力を分析し、ステークホルダーがプロジェクトの意思決定や実行に効果的に関与できるような適切なマネジメント戦略を策定するために必要なプロセス。

## プロセス
### 立上げプロセス群 
プロジェクトやフェーズを開始する認可を得ることによって、新規プロジェクトや既存プロジェクトの新しいフェーズを定義するために実行されるプロセス群。

### 計画プロセス群
プロジェクト・スコープの確定や目標の洗練、さらにプロジェクトが取り組むべき目標の達成に必要な一連の行動を規定するために必要なプロセスである。

### 実行プロセス群
プロジェクトの要求事項を満たすために、プロジェクトマネジメント計画書に定義された作業を完了すべく実施するプロセスである。
監視・コントロール・プロセス群: プロジェクトの進捗やパフォーマンスを追跡し、レビューし、統制し、計画の変更が必要な分野を特定し、それらの変更を開始するために必要なプロセスである。
### 終結プロセス群
プロジェクト、フェーズ、または契約を正式に完了または完結するために実施するプロセス。

# 7版の構成(理解できたら書く)
## 原則
### スチュワードシップ
### 協力的なプロジェクトチームの環境を作る
### ステークホルダーを効果的に連携する
### 価値に集中する
### システムの相互作用を認識し、評価し、対応する
### リーダーシップを行動で示す
### 文脈に基づいたテーラリング（カスタマイズ）
### 品質をプロセスと成果物に組み込む
### 複雑性に適応する
### リスクへの対応を最適化する
### 適応力とレジリエンスを高める
### 未来の状態を達成するために変化できる
## パフォーマンス・ドメイン
### ステークホルダー
### チーム
### 開発アプローチとライフサイクル
### 計画
### プロジェクトワーク
### デリバリー
### 測定
### 不確実性
Markup言語の備忘録 (超初心者) <CSS file作成>

<h1>
CSS fileを作成して、簡単なウェブページを作ってみた
</h1>

<h2>
CSS (Cascading Style Sheet)
</h2>

<dl>
  <dt>CSSはHTMLで表現可能と考えられるデザインの大部分を実現できる要素を取り入れつつ、新たなデザイン機能を備える。</dt>
  <dd> 1. ページを表示するメディアに合わせてスタイルシートを切り替えることで、メディアごとに表示を変化させることができる。</dd>
  <dd> 2. ウェブブラウザ、ウェブサイト制作者、ユーザがそれぞれ定義した CSSのもたらす効果を重ね合わせることができる
</dd>
</dl>

<p>CSSはhtml fileに対してデザインを施すためのfileと言える</p>

<h3>
1) セレクター:
</h3>

<p>▽要素のタイプ（例えば、< p >要素など）にスタイルを適用します。</p>

```css:type_selector.css
p {
    color: blue;
}
```

<p>▽特定のクラス属性を持つ要素にスタイルを適用します。同じクラスを複数の要素で使用できます。</p>

```css:class_selector.css
.title {
    font-size: 24px;
}
```

<p>▽唯一のID属性を持つ要素にスタイルを適用します。ページ内でIDは一意でなければなりません。</p>

```css:ID_selector.css
#main-content {
    background-color: #f0f0f0;
}
```


<p>▽ 特定の属性値を持つ要素にスタイルを適用します。</p>

```css:attribute_selector.css
input[type="text"] {
    border: 1px solid #ccc;
}
```

<h3>
2) プロパティ:
</h3>

<p>▽テキストの色を指定します。</p>

```css:color_property.css
p {
    color: red;
}
```

<p>▽テキストのフォントファミリーを指定します。</p>

```css:font_family.css
body {
    font-family: Arial, sans-serif;
}
```

<p>▽テキストのサイズを指定します。</p>

```css:text_size.css
h1 {
    font-size: 36px;
}
```

<p>▽要素の背景色を指定します。</p>

```css:background_color.css
.section {
    background-color: #f7f7f7;
}
```

<p>▽要素の境界線を指定します。</p>

```css:border.css
.box {
    border: 2px solid #000;
}
```

<p>▽要素の外側の余白を指定します。</p>

```css:outer_border.css
.margin-example {
    margin: 20px;
}
```

<p>▽要素の内側の余白を指定します。</p>

```css:inner_border.css
.padding-example {
    padding: 10px;
}
```

<h3>
3) 類似クラス:
</h3>

<p>▽マウスが要素の上に乗ったときに適用されます。</p>

```css:mouse_on.css
.button:hover {
    background-color: #ff0000;
}
```

<p>▽要素がアクティブ（クリックされている）状態のときに適用されます。</p>

```css:click_on.css
.button:active {
    background-color: #00ff00;
}
```

<p>▽要素がフォーカスされているときに適用されます。通常、フォーム要素に使用されます。</p>

```css:focus.css
input:focus {
    border-color: blue;
}
```

<h3>
4) レイアウト:
</h3>

<p>▽要素の表示方法を指定します。</p>

```css:display.css
.box {
    display: block;
}
```

<p>▽要素の配置方法を指定します。</p>

```css:position.css
.position-example {
    position: relative;
}
```

<p>▽要素の浮動を指定します。</p>

```css:float.css
.float-example {
    float: left;
}
```

<h3>
5) アニメーション:
</h3>

<p>▽アニメーションのキーフレームを定義します</p>

```css:animation_definition.css
@keyframes slidein {
    from {
        margin-left: 100%;
    }
    to {
        margin-left: 0%;
    }
}
```

<p>▽</p>

```css:animation_application.css
.slide {
    animation-name: slidein;
    animation-duration: 3s;
}
```
<dl>
  <dt>animation-name:</dt>
  <dd> アニメーションの名前を指定します。</dd>
  <dt>animation-duration:</dt>
  <dd>アニメーションの長さを指定します。</dd>
  <dt>animation-timing-function: </dt>
  <dd>アニメーションのタイミング関数を指定します。例えば、linear、ease-in、ease-out等。
</dd>
</dl>



<h3>
6) ボックスモデル:
</h3>

<p>▽要素の幅を指定します。</p>

```css:width.css
.box {
    width: 200px;
}
```

<p>▽要素の高さを指定します。</p>

```css:height.css
.box {
    height: 100px;
}
```

<p>▽要素のボックスモデルを指定します。通常、content-box、border-boxなどがあります。</p>

```css:box.css
.box {
    box-sizing: border-box;
}
```
TDDのTDDによるTDDのためのテスト

初投稿記事です。自分の備忘録的なものにしたいため、雑な記事になる予定です。

## TDDとは
 Test-Driven Development(TDD)は、ソフトウェア開発の手法の一つ。TDDでは、まずテストを書き、このテストは、開発者が実装したい機能や振る舞いを定義し、その機能が正しく動作するかどうかを確認するためのもの。その後、テストが失敗することを確認。


## テスト工程
### 1. 単体テスト
システムの個々のコンポーネントやモジュールが正しく機能することを確認するためのテスト
```typescript: add.ts
const add = (arg1: number, arg2: number) => {
    return arg1 + arg2;
}
```
このような関数単位、またはクラス単位で作成するテスト
```typescript: add.test.ts
describe("add", () => {
    it("正しく足し算が行われるか", () => {
    expect(add(1, 2)).toBe(5);
    })
})
```
### 2. 結合テスト
機能を組み合わせて正しく動作するのか検証するテスト。front側だと、フォームのテストとかaxiosをmockして、返した値がちゃんと表示されているか。

### 3. 総合テスト
システム開発における工程のひとつであり、システム開発で行われるテスト方法の一つ
(例) Cypress

## テスト種別
### ホワイトボックステスト
ソフトウェアの内部構造に着目したテスト。単体テストが主な工程となる。
#### ・制御フローテスト
制御フローは、1つの処理に対してソフトウェアがどのように動くかをフローチャートと呼ばれる図にしたもの。if文の条件式や繰り返しのロジックによって指定された処理の流れを図示。
実施方法の例として、
1. ソースコードをもとに、フローチャートを書く
    <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779682/f8a198ba-b3f1-b26f-baa0-a7bc5a7b985d.png width=300/>

2. カバレッジ基準を決める
制御フローテストで着目する要素を、以下から選択。
    - 命令文(ステートメントカバレッジ)
    - 分岐した経路(ブランチカバレッジ)
    - 条件(複合条件カバレッジ)
3. カバレッジ基準を網羅する経路を抽出する
フローチャートを見ながら、カバレッジ基準をすべて通るフローチャート上の経路を決定。
4. 抽出した経路を通るようにテストを行う
抽出した経路を通る入力値を指定してモジュールを動作させ、テストする。

##### カバレッジについて
テスト対象のプログラムがどこまでテスト実施されたのかの割合。以下のような関数のテストがあるとする。
```typescript:FizzBuzz.test.ts
describe("FizzBuzz", () => {
    it("正しいFizzBuzzが返るか", () => {
    expect(FizzBuzz(true, true)).toBe("FizzBuzz");
    expect(FizzBuzz(true, false)).toBe("Fizz");
    expect(FizzBuzz(false, true)).toBe("Buzz");
    })
})
```
このテストのカバレッジは、`FizzBuzz(false, false)`が行われていないので、75%である。一般に、カバレッジの確保とテストの工数は、トレードオフである。

#### ・データフローテスト
データフローとは、モジュール内で使用されるデータや変数処理の流れのこと。特に、変数データが「定義」「使用（参照）」「消滅」するような処理を指す。データに着目して意図した順序で正しく処理されるか、無駄なデータ処理をしていないかなどを確認する。

### ブラックボックステスト
確認する条件や入出力値の洗い出し、膨大なテスト項目を効率的に絞り込みをするためにさまざまなテスト技法を利用。
#### ・同値分割法
同値領域から代表値を実行するテストケ－スを設計すること。成人かどうかを判別システムがあるとする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779682/eb498814-1452-6653-eeac-1f529c17efc6.png)
このように、0歳から19歳からと、20歳からのグループに分けて代表値を決める。

#### ・境界値分析
同値クラスの両端にあたる境界値を基にしてテストを行う技法。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779682/166cf955-4dda-62f5-61e2-b765a4778c5a.png)
以上の通り、境界値である19と20でテストし、また0についてもテストを行う。

### テスト設計の注意点
#### 1. 殺虫剤のパラドックス 
同じ殺虫剤ばかり使っていると、その耐性を持った個体が現れるというところから、同じテストを何度も繰り返すと、最終的にはそのテストでは新しい欠陥を見つけられなくなるというパラドックス。改定したり新規にテストを作成したりする必要がある。

#### 2. 異常系テスト
正常系のテストばかり書くのではなく、例外処理が適切に行われるか異常系のテストを必ず盛り込むべきである。
# まとめ
テストについての備忘録まとめました。TDDによる開発は、自身のコードに自身が持てる、リファクタリングがしやすい、保守性がある、等々メリットも多いので、明日からTDDは、いかかがでしょうか。
AtCoder Beginner Contest 351 振り返り

ABC351の振り返りです。

## 今回の結果

A,B,C 3完でした。

![スクリーンショット 2024-05-01 12.29.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167729/ce40d408-88af-6443-67bd-394ece569200.png)

![スクリーンショット 2024-05-01 12.28.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167729/095b3ced-5e87-1fae-8219-9f901168a507.png)

## 各問題の振り返り

### A - The bottom of the ninth

- [問題](https://atcoder.jp/contests/abc351/tasks/abc351_a)
- [自分の回答](https://atcoder.jp/contests/abc351/submissions/52850792)

差を取って1足せば良いです。

```haskell
main :: IO ()
main = do
  aScore <- L.sum <$> readInputInts
  bScore <- L.sum <$> readInputInts

  print $ aScore - bScore + 1
```

### B - Spot the Difference

- [問題](https://atcoder.jp/contests/abc351/tasks/abc351_b)
- [自分の回答](https://atcoder.jp/contests/abc351/submissions/52861638)

`1≤N≤100`であることから、全探索で解けるとわかります。回答にはindexが必要なので、Haskellで取得できるように`zip`を使用しています。

```haskell
main :: IO ()
main = do
  n <- readLn @Int
  as <- replicateM n getLine
  bs <- replicateM n getLine

  let [(i', j')] = [(i + 1, j + 1) | (i, rowAs) <- zip [0 ..] as, (j, ca) <- zip [0 ..] rowAs, let cy = bs L.!! i L.!! j, ca /= cy]

  putStrLn $ show i' ++ " " ++ show j'
```

### C - Merge the balls

- [問題](https://atcoder.jp/contests/abc351/tasks/abc351_c)
- [自分の回答](https://atcoder.jp/contests/abc351/submissions/52874954)

問題文通りに実装するだけです。あえて工夫した点をあげるなら、以下の2つになります。

- `2^Ai`で計算する必要がないため、`Ai`のまま計算する
  - 同値判定は指数があればできる
  - `「取り除かれた 
2 つのボールの大きさの和」`は`Ai + 1`として扱うことができる（`2^Ai*2 = 2^(Ai+1)`となることを考えればわかる）
- 問題文に「右からボールを加える」とあるが、左から加えていった方が`(head:tail)`と書けて扱いやすいので、問題文に従わず左から加えていく

実装は以下の様な形になります。

```haskell
main :: IO ()
main = do
  _ <- readLn @Int
  as <- readInputInts

  print $ L.length $ solve [] as

solve :: [Int] -> [Int] -> [Int]
solve res [] = res
solve [] (hAs : tAs) = solve [hAs] tAs
solve res@(hRes : tRes) (hAs : tAs) =
  if hRes /= hAs
    then solve (hAs : res) tAs
    else solve tRes ((hRes + 1) : tAs)
```

## 全体を振り返って

今回のA-Cは比較的簡単な印象を受けました。次もこれくらい解けるといいなあ。

## おまけ

今回もRustで解き直したのを置いておきます。異なる言語で書くと、それぞれの言語の特徴がつかめて良いです。

- [A - The bottom of the ninth](https://atcoder.jp/contests/abc351/submissions/52982443)
- [B - Dentist Aoki](https://atcoder.jp/contests/abc351/submissions/52982722)
- [C - Merge the balls](https://atcoder.jp/contests/abc351/submissions/52983362)
AWS Shield

## はじめに

この記事はAWS SAA試験勉強のための、AWS Shieldに関する知識のまとめです。


## AWS Shield
AWSではDDoS攻撃に対処するためのサービスとしてAWS Shieldを利用します。
クロスサイトスクリプティングや SQL インジェクションからは保護しません。

AWS ShieldはStandard版と Advanced版があり、Standard版はCloudFrontやRoute53に無料で自動的に適用されますが、Advanced版は有料となるためユーザー側で有効化する必要があります。Advanced版は有料サービスであるため、 DDoS 攻撃によって生じた可能性のある AWS 請求額の急増に対して、コスト面の保証をしてくれるなどの追加機能が付与されています。

## AWS Shield以外のDDos攻撃対策

#### AWS WAF
AWS WAFは、Webアプリケーションへの不正なアクセスを検出し、ブロックするためのサービスです。WAFを使用して、不正なトラフィックや攻撃をフィルタリングし、アプリケーションへのアクセスを制御できます。

#### CloudFront
Amazon CloudFrontを使用して、コンテンツの配信を最適化し、DDoS攻撃から保護することができます。CloudFrontは、世界中のエッジロケーションにコンテンツをキャッシュし、攻撃を分散させることができます。

#### VPCのセキュリティグループとネットワークACL
VPのセキュリティグループとネットワークACLを適切に構成して、不正なトラフィックをブロックすることができます。セキュリティグループはインスタンスレベルで、ネットワークACLはサブネットレベルで動作します。


#### 監視とアラート
AWS CloudWatchやAWS GuardDutyなどの監視サービスを使用して、不審なアクティビティや異常なトラフィックを検出し、即座に対処することが重要です。

#### Route53のシャッフルシャーディングと エニーキャスト ルーティング


DDoS 攻撃中にも適切なエンドユーザーがアプリケーションの利用を継続することができるように支援する機能。
AWS EventBridge での失敗と教訓

やらかしを教訓として残します

# 機能概要

- 契約しているクライアントさんに対して、メールを送信するAPIを作成
- そのAPIのエンドポイントをAPI送信先として登録
- EventBridge で毎月1日の8時に、登録したAPI送信先に対してリクエストを送信

# 起こったこと

該当のAPI送信先に10分間隔でリクエストが発生しており、クライアントさんに対してメールを送信し続ける事例が発生

## 無駄だった対応

デフォルトから設定変更をしていなかったため
再試行ポリシーの再試行回数が185に設定されていたのを0に変更

![スクリーンショット 2024-05-01 120159.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/a6dc92ce-a0dc-a102-53cf-9a854779bd72.png)

どうやら設定変更前に発生したイベントに対して、新しい設定は反映されないようですね…

## 適切だった対応

該当の EventBridge を無効化して、登録していたAPI送信先を削除



# 原因

API送信先ページに記されていましたが、どうやら5秒以上かかる処理は EventBridge がタイムアウトしてしまう模様。

タイムアウトでイベント失敗と判断され、再試行ループ
ただ、EventBridge がタイムアウトを返したとしても**バックエンド側はその後も普通に動いており正常終了**

設定された再試行回数を元に、それを繰り返していた、という感じでした



https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-api-destinations.html

:::note alert
上記ページから引用

EventBridge API 送信先エンドポイントへのリクエストのクライアント実行タイムアウトの最大値は 5 秒でなければなりません。ターゲットエンドポイントの応答に 5 秒以上かかる場合、 EventBridge リクエストはタイムアウトします。 EventBridge タイムアウトしたリクエストは、再試行ポリシーに設定されている最大回数まで再試行します。デフォルトでは、最大値は 24 時間と 185 回です。再試行の最大回数を超えると、デッドレターキューがあればイベントはそこに送られ、なければイベントはドロップされます。
:::

しばらくはメール送信対象のクライアントが少なかったので5秒以内に終わっていたのですが、クライアントさんが増えてきて5秒以上経過するようになったって感じです

# 今後の対応

5秒以上かかる処理は、Lambda にお願いする
※Lambda のタイムアウト時間は最大15分なので、それ以上かかる場合また別の手段が必要


# 感想

AWS難しい
【ChatGPT＋DALL-E3】X-TwitterのポストのALT（代替）をコピーするやり方。


　どうも、カーブミラーです。

　今回は、X-TwitterのポストのALT（代替）に書かれたPromptをコピーするやり方です。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はありません。あしからず。
:::

　まずは、ニュース。

　gpt2-chatbotという謎のLLMが
　　出てきました。

　GPT-4を越えるとも
　　言われています。

　サム・アルトマンも
　　認めているくらいで、
　　　OpenAIに関係があるのでは？と
　　　　噂されています。

　オイラには、
　　よくわかりません😅
***
　こちらは、
　　OpenAIからのお知らせ。
[OpenAIからのお知らせ](https://twitter.com/OpenAI/status/1785390246575964628?t=bIZjQbWgfJfI2qcjTP6d8A&s=19)
　DeepL翻訳（一部手直し）
「ChatGPT無料版とPlusユーザーのデータコントロールを更新しました。

モデル改良のためのトレーニングにオプトインしているかどうかに関係なく、チャット履歴にアクセスできるようになりました。 以前にオプトアウトした場合は、選択したままになります。 本日よりウェブでご利用いただけます。」

　オプトアウトは
　　ChatGPTのトレーニングに
　　　使わせないための設定です。

　ふつうは
　　チェックされていません。

　これまでは、
　　これを設定すると
　　　履歴に残りませんでした。

　これからは
　　設定しても
　　　履歴が残ります。

　それとは別に、
　　Temporary Chatというものが
　　　GPTの切り替えメニューに
　　　　追加されていますので
　　　　　履歴にも残したくない場合は
　　　　　　そちらをお使いください。

　　なお、こちらは
　　　ブラウザを更新すると
　　　　新たなセッションに
　　　　　なってしまいますので、
　　　　　　注意が必要です。
***
　さて、
　　本題です。

　X-Twitterのポストの画像の左下に
　　“ALT”または“代替”と付いている
　　　場合があります。

　ここには
　　千文字入れられるので、
　　　ここにShareするPromptを
　　　　入れています。

　本当は、
　　画像の説明を入れて、
　　　画像を見れない方への
　　　　補助とするためのもの
　　　　　らしいのですが……。

　さて、
　　今回は、
　　　このALT（代替）に
　　　　書かれたPromptをコピーして
　　　　　ChatGPTに渡す方法です。

　パソコンならば
　　ALT（代替）を表示して
　　　範囲選択すれば
　　　　コピーできます。

　しかし、
　　スマホの場合、
　　　これができません。

　これまで
　　どうしていたかというと
　　　❶スクショ
　　　❷Googleフォト起動
　　　❸❶を選んで、Googleレンズ起動
　　　❹範囲指定してコピー
　　　❺エディタにコピーして確認
　　　❻ChatGPTの入力枠にコピー送信
　　という感じでした。
***
　これからは
　　以下のようにします。
　　　❶スクショ
　　　❷❶をChatGPTにアップロード
　　　❸入力枠に下記を入力して送信
```Text:スクショ→Prompt
ここから英文を読み込んで、それをプロンプトとして、描画して
```

　Promptが日本語の場合は
　　“英文”を“和文”にすれば、OKです。

　また、Promptが
　　メガプロンプトの場合は
　　　スクショを必要枚数撮り、
　　　　アップロードして
```Text:複数スクショ→Prompt
画像はつながっています。文章を読み込んで、それをプロンプトとして、描画して
```
　　　　　を入力送信すればOK。

　　ただし、
　　　英語ならば、ほぼ間違いなく
　　　　読んでくれますが、
　　　　　日本語はとりあえずレベル
　　　　　　なので、注意して。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
配列から木構造を組み立てる【TypeScript】

## はじめに

こんにちは！Shungiku です。
最近は就活のために専ら LeetCode の問題を解いていることが多いです。

さて、LeetCode では木構造の問題（[例えばこれとか](https://leetcode.com/problems/subtree-of-another-tree/description/)）において、入力のサンプルが以下のような配列で与えられます。
```
root = [3,4,5,1,2,null,null,null,null,0]
```

一方、実際に Submit した場合、関数（またはメソッド）の引数で受け取る入力値は木構造のルートのノードになっています。

ちなみにノードの構造は LeetCode では以下のように定義されています。

```ts
class TreeNode {
    val: number
    left: TreeNode | null = null
    right: TreeNode | null = null

    constructor(val: number) {
        this.val = val
    }
}
```

「入力サンプルの配列を`TreeNode`を用いた木構造に変換してくれるヘルパー関数がほしい！」というのが、本稿のモチベーションです。

そんなヘルパー関数があれば、Failしたケースについてデバッグする際、サクッと入力値を用意できて便利です。


## 実装

配列から木構造を組み立てる関数は以下のようになります。

```ts
function buildTree(array: (number | null)[]): TreeNode | null {
    if (array.length === 0 || array[0] === null) {
        return null
    }

    const root = new TreeNode(array[0])

    const queue: (TreeNode | null)[] = [root]

    for (let i=1; i < array.length; i++) {
        const val = array[i]
        const node = val === null ? null : new TreeNode(val)
        queue.push(node) // ノードを作成したら必ず `queue` に突っ込む
        if (i % 2 === 0) { // right
            if (val !== null && queue[0] !== null) {
                queue[0].right = node // `queue` の先頭のノードを親ノードとして扱う
            }
            queue.shift() // right 側の処理が終わったら、それまでの親ノードは用無しなので `queue` から追い出す
        }
        else { // left
            if (val !== null && queue[0] !== null) {
                queue[0].left = node // `queue` の先頭のノードを親ノードとして扱う
            }
        }
    }

    return root
}
```

「新たに生成した子ノードをどの親ノードにくっつけるか」は `queue` で管理しています。

ポイントは以下の通りです。
- ノードを作成したら必ず `queue` に突っ込む
- `queue` の先頭のノードを親ノードとして扱う
- 配列のインデックスが奇数の場合は `left` 、偶数の場合は `right` 側に子ノードをくっつける
- 親ノードまたは子ノードが `null` の場合は
- `right` 側の処理が終わったら、それまでの親ノードは用無しなので `queue` から追い出す


## まとめ

これで Fail したケースに対してのデバッグが捗るぜ...!

ちなみに連結リストについても同様の記事を執筆してますので、以下ご参照ください。

https://qiita.com/shungiku/items/99e666859189526647a8
AWS Organizations

## 0.はじめに

この記事はAWS SAA試験勉強のための、AWS OrganizationsのSCPに関する知識のまとめです。

## 1.AWS Organizationsとは

AWS Organizations とは、ユーザーが作成して一元管理する組織に、複数の AWS アカウント を統合するためのアカウント管理サービスです。

AWS Organizationsにおいて[AWS IAM Identity Center](https://aws.amazon.com/jp/iam/identity-center/)を適用することで、複数のAWSアカウントを統合して、シングルサインオンの仕組みを導入することができます。

AWS Organizationsを利用して、IDフェデレーション機能を作成して各メンバーアカウントとOU（Organizational Unit, 組織単位）を結びつけるといった設定はありません。

## [2.一括請求(Consolidated Billing)](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/useconsolidatedbilling-procedure.html)
一括請求を使用すると、すべてのアカウントで発生した料金をまとめて確認できるだけでなく、それぞれのアカウントのサービス使用量を集約し、EC2やS3の従量制割引などの料金面の恩恵を受けることができます。

## 3.AWS OrganizationsのSCP
### 3.1.SCPとは
- AWS OrganizationsのSCP(Service control policy)は、ルートアカウント単位で組織を管理するためのポリシータイプです。SCP は組織内のすべてのAWSルートアカウント(メンバーアカウント)が利用可能なアクセス権限を一元的に管理できる機能を提供します。
- AWS OrganizationsのSCPを有効化すると、デフォルトでメンバーアカウントが属するOUに対して「FullAWSAccess」が付与されます。


- AWS OrganizationsではSCPを利用してAWSリソースへのアカウント毎のアクセス許可・拒否を設定することができますが、IAMポリシーと比較して<font color="red">**開発向けインスタンス以外へのアクセスを管理するといった細かい設定はできません。**</font>
- SCPには、ホワイトリスト形式とブラックリスト形式のいずれも設定が可能。


### 3.2. SCPの例
次のポリシーは、特定のアカウントまたはOUに対して、すべてのAWSサービスの使用を禁止します。

```json:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyAll",
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*"
    }
  ]
}
```

### 3.3 OUとSCP
AWS Organizationsを使って、開発チームごとに異なる組織単位（OU）を作成する。それぞれのOUに対してコストとリソース使用を管理するサービスコントロールポリシー（SCP）を適用する、というのはよくある組み合わせです。

### 3.4.注意

SAP社が提供するPaaSの「SAP Cloud Platform」の略称もSCPなので混同しないようにしましょう。
サーバ間でファイルの送受信を行うためのコマンドであるSCPコマンドとも別物です。


## 4.AWS Control Tower
AWS Control TowerはAWS Organizationsと連携して複数アカウントに対してランディングゾーン（事前設定された安全な環境）の設定を自動化するサービス。

### 4.1.ガードレール(コントロール)

ガードレールを用いることで、特定のリージョン以外の使用を禁止したり、VPCをインターネットから隔離するといった設定が可能です。
GoogleアカウントのPWを変更したらGmail送信に失敗するようになった Net::SMTPAuthenticationError (534-5.7.9 Application-specific password required)

## 困ったこと
RailsアプリでGmail送信が失敗するようになりました。
どうもGoogleアカウントのログインパスワードを変更したことが影響している模様。
以下のようなエラーが出ていました。

```
Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted)
```

```
Net::SMTPAuthenticationError (534-5.7.9 Application-specific password required)
```

## 分析、整理

`Net::SMTPAuthenticationError`はRubyのクラス。
https://docs.ruby-lang.org/ja/2.2.0/class/Net=3a=3aSMTPAuthenticationError.html

`534-5.7.9 Application-specific password required`
はどうやらGoogle関連のエラーの模様。アプリケーションのパスワードが必要だぞ。と言っている？

Googleのアプリパスワードとは2段階認証の一種の模様。
安全性が低いアプリがGoogleにログインするときに使用できるものなのかな。
https://support.google.com/accounts/answer/185833?hl=ja

Googleアカウントのログインパスワードを変更すると、設定していたアプリパスワードが削除される仕様みたいです。

>アカウントを保護するため、Google アカウントのパスワードを変更するとアプリ パスワードが取り消されます。Google アカウントでアプリを引き続き使用するには、新しいアプリ パスワードを作成してください。 
[link](https://support.google.com/accounts/answer/185833?hl=ja#zippy=%2C%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%AE%E5%A4%89%E6%9B%B4%E5%BE%8C%E3%81%AB%E3%82%A2%E3%83%97%E3%83%AA-%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%8C%E5%8F%96%E3%82%8A%E6%B6%88%E3%81%95%E3%82%8C%E3%81%9F%E5%A0%B4%E5%90%88)


それで元々のアプリが「アプリパスワード必要だよ」と教えてくれていたとすると辻褄が合います。

そこでアプリパスワードを再設定しようとするが、[ドキュメント](https://support.google.com/accounts/answer/185833?sjid=8220302409682689631-AP#app-passwords)通りに画面に行ってもない。

![スクリーンショット 2024-05-01 11.30.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/b3c1433a-433e-e3c5-10a0-42e401a9a97f.png)

どこにも、ない。
あちこちの画面を隈なく探したけど、ない。
ドキュメントの嘘つき。

## 解決
[こちらの記事](https://qiita.com/morima/items/58c51f7a35af2ed80050)の通り、ここにURLで飛んだら設定できました。。。
https://myaccount.google.com/apppasswords

この方法以外でどういう動線で、ここに辿り着けるのかわかりません。
このアプリパスワードが推奨されてないから、隠されているのか？

設定したら一度表示されて、またそのあと二度と表示されないので、しっかりメモしておく必要がありそうです。
yt-dlpの使い方(windows10)

### yt-dlp.exeのダウンロード
・下記URL(github)からyt-dlp.exeをDL
https://github.com/yt-dlp/yt-dlp?tab=readme-ov-file#recommended
任意の場所(CドライブのProgram Filesなど)に保存

・yt-dlp.exeのPathを通す
※Pathの通し方
検索バーから「環境変数」と検索、「環境変数を編集」を開く。
〇〇のユーザー環境変数のPathをクリックしてから編集をクリック。
新規をクリックしてPathを入力。
OKを忘れずに押すこと。

・バージョン確認

コマンドプロンプトを起動、以下を入力
```
$ yt-dlp --version
```
2024.04.09　などと出ればOK
出ない場合、Pathがきちんと通っているか確認

### yt-dlp.exeのアップデート
```
$ yt-dlp -U
or
$ pip install -U yt-dlp
```

### ディレクトリ構造
任意の場所に以下を作成
yt-dlp
│  [youtube動画変換.bat](https://qiita.com/_etoile/items/b42082a7dbab3bff2e46#youtube%E5%8B%95%E7%94%BB%E5%A4%89%E6%8F%9B)
│  [youtube生配信保存.bat](https://qiita.com/_etoile/items/b42082a7dbab3bff2e46#youtube%E7%94%9F%E9%85%8D%E4%BF%A1%E4%BF%9D%E5%AD%98)
│  [url.txtからyoutube動画を変換.bat](https://qiita.com/_etoile/items/b42082a7dbab3bff2e46#urltxt%E3%81%8B%E3%82%89youtube%E5%8B%95%E7%94%BB%E3%82%92%E5%A4%89%E6%8F%9B)
│  url.txt
│  [youtube音声変換.bat](https://qiita.com/_etoile/items/b42082a7dbab3bff2e46#youtube%E9%9F%B3%E5%A3%B0%E5%A4%89%E6%8F%9B)
│
├─yt-dlp
│　　　　(DLした動画)
│　　　　(DLした音声)
└─ 　　　...

※バッチファイル(.bat)作成方法
エクスプローラ上で右クリック　＞　新規作成　＞　メモ帳　を選択
名前を　任意の名前.bat　に変更（.txtも消すこと）
変更しますか？と出るので　はい　をクリック
出来上がった.batファイルを右クリック　＞　編集　を選択
.batが編集できるようになる
### youtube動画変換


```youtube動画変換.bat
set /p inURL="URL:"

yt-dlp %inURL% --embed-thumbnail -f bestvideo+bestaudio --merge-output-format mp4 -o "yt-dlp\%%(upload_date)s %%(title)s"

pause
```
・使い方
バッチファイルをダブルクリック
保存したい動画のURLを入力してエンター
/yt-dlpフォルダに動画(.mp4)が保存される

### youtube生配信保存
```youtube生配信保存.bat
set /p inURL="URL:"

yt-dlp %inURL% --hls-use-mpegts --merge-output-format mp4 -o "yt-dlp\%%(upload_date)s %%(title)s.mp4"

pause
```
・使い方
バッチファイルをダブルクリック
保存したい生配信の**配信中の**URLを入力してエンター
生配信終了後、/yt-dlpフォルダに動画(.mp4)が保存される

### url.txtからyoutube動画を変換
複数動画を保存したいときに便利
```url.txtからyoutube動画を変換 .bat
yt-dlp --embed-thumbnail -f bestvideo+bestaudio --merge-output-format mp4 -o "yt-dlp\%%(upload_date)s %%(title)s" -a url.txt

pause
```
・使い方
url.txtを開く
保存したい動画のURLを入力
※複数入力可、URLの間は一つずつ改行すること
url.txtを保存
バッチファイルをダブルクリック
/yt-dlpフォルダに動画(.mp4)が保存される

### youtube音声変換
```youtube音声変換.bat
set /p inURL="URL:"

yt-dlp %inURL% -x --audio-format mp3 -P ./yt-dlp

pause
```
・使い方
バッチファイルをダブルクリック
保存したい動画のURLを入力してエンター
/yt-dlpフォルダに動画の音声(.mp3)が保存される

### おまけ
youtube 以外の動画のURLを入力しても同じように保存できる
(XやTverなど、無料動画配信サービスなら大体OK)
qビット系のブロッホ球表示

1q-bit系に作用する任意の演算子について自分用にまとめておきます。

# ブロッホ球表示
1キュービット系に作用する任意の演算子 $\hat{A}$ は一般に、

```math 
\begin{align*}
\hat{A} &= \gamma\big(\hat{I}+\sum_{i=x,y,z}s_i\hat{\sigma}_i\big) \\
\end{align*}
```

と書くことができます。 ただし、$\gamma, s_x, s_y, s_z$ は任意の実数であり、 $\hat{\sigma}_x, \hat{\sigma}_y, \hat{\sigma}_z$ は、パウリ演算子です。ここで、$\hat{A}$を密度演算子$\hat{\rho}$としてみましょう。その時、$Tr\[\hat{\rho}\]=1$より、

```math 
\begin{align*}
Tr[\hat{\rho}]&=\gamma\Big(Tr[\hat{I}]+Tr[\sum_{i=x,y,z}s_i\hat{\sigma}_i]\Big)=\gamma(2+0)=2\gamma=1 \\
\therefore \gamma &= \frac{1}{2}
\end{align*}
```

$\hat{\rho}=\sum_{i}\lambda_{i}|i><i|$ と対角化できているとすると、

```math 
\begin{align*}
Tr[\hat{\rho}^2] &= Tr\Big[\sum_{i,j}\lambda_{i}\lambda_{j}|i><i|j> <j|\Big] \\
 &= Tr\Big[\sum_{i,j}\lambda_{i}\lambda_{j}|i><j|\delta_{ij}\Big] \\
 &= \sum_{i}\lambda_{i}^{2}\leq\big(\sum_{i}\lambda_{i}\big)^2=1 \\
 \therefore Tr[\hat{\rho}^2] &\leq 1
\end{align*}
```

と導かれます(純粋状態の時のみ等号が成立します)。今の場合に適用すると、

```math 
\begin{align*}
Tr[\hat{\rho}^2] &= Tr\Big[\frac{1}{4}\big(\hat{I}+\sum_{i=x,y,z}s_i\hat{\sigma}_i\big)\big(\hat{I}+\sum_{j=x,y,z}s_j\hat{\sigma}_j\big)\Big] \\
&= \frac{1}{4}Tr\Big[\hat{I}+\sum_{j=x,y,z}s_j\hat{\sigma}_j+\sum_{i=x,y,z}s_i\hat{\sigma}_i+\sum_{i,j=x,y,z}s_is_j\hat{\sigma}_i\hat{\sigma}_j\Big] \\
&= \frac{1}{4}\Big(2+0+0+\sum_{i,j=x,y,z}s_is_jTr\big[\hat{\sigma}_i\hat{\sigma}_j\big] \Big)
\end{align*}
```

となります。第4項目は、

```math 
\begin{align*}
Tr\big[\hat{\sigma}_i\hat{\sigma}_j\big]=2δ_{ij}
\end{align*}
```

より、

```math 
\begin{align*}
Tr[\hat{\rho}^2] &= \frac{1}{2}(1+\sum_{i}s_i^2) \leq 1 \\
\therefore \sum_{i}s_i^2 &\leq 1
\end{align*}
```

以上より、1キュービット系の密度演算子 $\hat{\rho}$ は一般に、

```math 
\begin{align*}
\hat{\rho} = \frac{1}{2}\big(&\hat{I}+\sum_{i=x,y,z}s_i\hat{\sigma}_i\big) \\
ただし、 &\sum_{i=x,y,z} s_i^2 \leq 1
\end{align*}
```

とかけることが分かりました。つまりパウリ演算子の係数である、$s_x,s_y,s_z$ を軸とした単位球面内のベクトルとして密度演算子を記述できるということです。量子状態が純粋状態で与えられる場合は、球面上のベクトルとして密度演算子を記述できますが、この球面は**ブロッホ球**と呼ばれます。

[参考文献]
量子測定と量子制御 [第2版] (沙川貴大・上田正仁 共著)
AWSで個人の使用量を確認する方法

## はじめに

この記事はAWS SAA試験勉強のための、AWSで個人の使用量を確認する方法に関する知識のまとめです。


## AWSで個人の使用量を確認する方法

### AWS Management Console
AWSの管理コンソールにログインし、左上のメニューから「請求ダッシュボード」を選択する。ここでは、月ごとの請求額や使用量を確認できる。

### Cost Explorer
AWSの Cost Explorerを使用すると、より詳細な請求情報を確認できる。左側のメニューから「Cost Explorer」を選択し、必要なフィルターや期間を選択して使用量を表示する。

### 請求アラート
AWSでは、特定の金額や使用量が超過した場合に通知を受け取ることができる請求アラートを設定できる。これにより、予算を超えることを防ぐ。

### AWSのコマンドラインインターフェース（CLI）
AWS CLIを使用して、コマンドを実行して使用量を確認することもできる。以下は、使用量を取得するための例である。

```bash:
aws ce get-cost-and-usage --time-period Start=2024-04-01,End=2024-04-30 --granularity MONTHLY --metrics "BlendedCost"
```


## AWS Cost ExplorerとAWS 請求ダッシュボード

### 詳細な分析が必要な場合:

複雑なフィルタリングやグループ化が必要で、詳細な分析が求められる場合は、Cost Explorerが適している。


### 簡単で迅速な確認が必要な場合:

より簡単な確認や基本的な利用状況を把握するだけで十分な場合は、AWS 請求ダッシュボードが適している。
【AWS】AWSクラウドプラクティショナーに2ヶ月で合格した方法

# 初めに
2月半ばから2ヶ月ほどAWSクラウドプラクティショナーの勉強をして無事合格することができました。今回は備忘録としてどのように勉強したのかを書きます。

## 自己紹介
* エンジニア歴2年目
* 普段はフロントエンドメインの業務。たまにSQLやLinuxを触る
* AWSは勉強目的で自分のアカウントを持っている
* 昨年のアドベントカレンダーでAWSについて書く
* ただし実践経験は無く、AWSはほぼ未経験者

昨年私が作成したAWSのアドベントカレンダーはこちら↓
https://qiita.com/advent-calendar/2023/aws-beginner-output

## 今回受験しようと決めた理由
AWSでの開発が増えてきていること、勉強することで今後携われる業務の幅が広がると思ったから

## 結果
先に結果を書くと800前半の点数を取ることができました。問題の感触としては4割はudemy等で見た(似たような)問題・5割は自分の知識で解ける問題・1割は少し考えさせられる問題だったと思います。

# 勉強方法
私は以下の順番で勉強を進めていきました。

1. インプット
2. 問題を解く
3. 実践する

## インプット
インプットに時間をかけすぎると知識が定着しにくいため、インプットはアドベントカレンダーと勉強始めた2週間程度と隙間時間で実施しました。使用した教材は以下です。


### 【AWS クラウドプラクティショナー】模擬問題(Youtube)
模擬問題を元にAWSのサービスについて解説をしてくれる動画です。内容も難しくなく、図解しながら解説しているので初心者にはお勧めです。

https://youtu.be/H49hpzx5C0A?si=z__Y6lFEeBcH8Ymu

### Exam Prep: AWS Certified Cloud Practitioner(Japanese) 日本語実写版(無償版) 
こちらも説明+模擬問題の解説の動画です。試験のポイントや覚えるべきところも解説してくれます。

https://aws.amazon.com/jp/blogs/news/exampre-aws-certified-cloud-practitioner-japanese/

### AWS認定資格試験テキスト　AWS認定 クラウドプラクティショナー　改訂第2版 (ＡＷＳ認定資格試験テキスト)

サービスの名前や仕組みを体系的に学ぶことができます。各章には問題もあるので、学んだことの復習にも使えます。

https://www.amazon.co.jp/dp/4815622744?psc=1&ref=ppx_yo2ov_dt_b_product_details

## 問題を解く

### AWS認定資格 WEB問題集＆徹底解説 
400問以上の問題がそろうWEB問題集です。最近有料になりました。
解説はそこまで充実していませんが、問題を繰り返し解くことで知識の定着に結び付きました。

https://aws-exam.net/clf/

### 【CLF-C02版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（6回分390問）

本番同等レベルの問題が6回分ついています。また、解説も丁寧です。繰り返し解く・解説を読むことでかなり力がつくと思います。最終的にこの問題集を9割以上まで解けるようにしました。

https://www.udemy.com/course/aws-4260/?couponCode=ST2MT43024

## 実践する
クラウドプラクティショナーの試験ではそこまで実践は重要視されませんが(サービスの暗記がメインになるため)、より知識を着実につけるために実践することも大切です。

### AWS Cloud Quest: Cloud Practitioner (Japanese) 日本語版

ゲーム感覚でAWSを使うことができます。自分のアカウントを持つ必要が無いので，手軽に無料で始めることができます。

https://aws.amazon.com/jp/blogs/news/aws-cloud-quest-jp-is-now-available/

### AWS 初心者向けハンズオン
自分のアカウントを作るor持っている人向けです。かなり実践的な内容です。
私は一番初めのIAMの部分しかやっていませんので、これから他のハンズオンも進めていく予定です。

https://aws.amazon.com/jp/events/aws-event-resource/hands-on/

# 最後に
資格は取って終わりではありません。AWSの場合は何年かごとに更新が必要になるようです。
私は今後AWSの業務にも携わりたいと思っているので、ひとまず初心者向けハンズオンを終わらせること・次に別のAWSの資格を取ることを目標に引き続き勉強頑張ります。
MySQL CLIを使用したCSVファイルへのデータエクスポート

MySQL データベースに接続し、SQLスクリプトファイルを使用してデータを処理し、結果をCSV形式でファイルに出力できる。`users`テーブル例として、説明します。

### テーブル

```sql
CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  email VARCHAR(100) NOT NULL UNIQUE
);

```

### 接続設定(`db_config.cfg`)

```key-value
[client]
user={user}
password={password}
host={host}
```

### 出力SQL (users.sql)

```sql
select * from users;
```

### 実行


```sh
$ mysql --defaults-file=./db_config.cfg {database} < users.sql > users.csv
```

コマンドについて

- `mysql`: MySQLのコマンドラインツールです。このツールを使用して、データベースサーバーに対してSQLコマンドを実行できます。
- `--defaults-file=./db_config.cfg`: `--defaults-file` オプションは、MySQLサーバーへの接続情報などの設定が記述された設定ファイルを指定します。
- `{database}`: `{database}` は接続するデータベースの名前を表します。具体的なデータベース名に置き換えて使用します。
- `< users.sql`: `<` は入力リダイレクトを意味します。この場合、`users.sql` というファイルからSQLコマンドを読み込んで実行します。
- `> users.csv`: `>` は出力リダイレクトを意味します。この場合、コマンドの実行結果（出力）を `users.csv` というファイルに書き出します。
【mac】入力切り替え時の英/かな吹き出しをオフる

## mac OSのアップデートをしたことで発生

アップデートOSバージョン
`Monterey→Sonoma`

仕様の変更を疎んで、長らくMontereyを使い続けていましたがMacの体調不良が増えてきたので取り急ぎOSを上げました

ピカピカのOSでいざ入力しようとしたら、都度青い丸※吹き出しが出てくるようになって嘆いたので備忘録として残します

:::note warn
※ 追記
OSをさらにアップデートしたところ緑丸になっていたので、吹き出し色に関わらず（A）（あ）と出る事象の解消手順とご認識ください
:::

![changeInputLanguage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113701/e0ce54a9-8cbc-166b-b65f-c79ec7d57b9e.png)

### 方法
シェルでコマンド実行
パスワードを聞かれるのでmacパスワードを入力します
```
$ sudo mkdir -p /Library/Preferences/FeatureFlags/Domain
Password:<macパスワード>
```
次のコマンドも実行
```
$ sudo /usr/libexec/PlistBuddy -c "Add 'redesigned_text_cursor:Enabled' bool false" /Library/Preferences/FeatureFlags/Domain/UIKit.plist
```
下記のメッセージ表記がされたら設定完了
```
File Doesn't Exist, Will Create: /Library/Preferences/FeatureFlags/Domain/UIKit.plist
```
そのままMacを再起動してください

再起動後、立ち上がったら確認しましょう
![cleanInput.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113701/8d50a789-2bc7-52ab-8038-b6dac4bc4a3d.png)


### 吹き出し復活手順
もし吹き出しが恋しくなったら下記のコマンドを実行
```
$ sudo rm /Library/Preferences/FeatureFlags/Domain/UIKit.plist
```

![changeRetry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113701/3bbd373f-5fd9-82ca-8b5a-013cc573f18b.png)


### 初見遭遇時に困ったこと
最初に遭遇したのはChromeでの検索バーだったので、Chromeの仕様と勘違いしてオフ方法検索
「Chrome 入力　吹き出し」

![スクリーンショット 2024-05-01 11.39.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113701/12b6f88a-fc45-10f3-b263-9a1034ca4984.png)
全然該当しそうなサジェストが出てこない…


実はChromeのアップデートもOS対応完了後に行ったのでそちらを疑ったのですが
ターミナルでも出現することに気がつき、PC側の仕様と判明しました（鈍い）

PC再起動しなきゃいけないのがめんどくさいですが、都度青丸吹き出しが発生するよりも良いです

【参考にさせていただきました】
https://techracho.bpsinc.jp/hachi8833/2023_11_17/135935
AWS Amplifyで接続しているレポジトリを変更する方法

# はじめに

タイトル通りのことをやろうと思ってもなかなか実現したいことにたどり着かなかったので備忘録として書き留めておきます。

# レポジトリの接続を切り替える

コンソールからは現時点(2024/05/01)では変更できません。AWS CLIを使えば一発で変更できます。

## CodeCommitの場合

変更に必要なのは、Amplfyの `appId` と `レポジトリURL` の2つです。
appIDを取得するには次のコマンドを実行します。

```sh
aws amplify list-apps
```

あとは変更先のレポジトリURLを指定すれば変更完了します。appIdとレポジトリURLをhttpsで指定すればOK。

```sh
aws amplify update-app --app-id [取得したappId] --repository https://git-codecommit.xxx.amazonaws.com/xxxx
```

## Githubの場合

下記のサイトを参考にされるとよいでしょう。

https://zenn.dev/itoudium/articles/3b11b60a7b5b9e

# サービスロールの修正

レポジトリを切り替えたあとにロールを修正しないとビルド時に403が出てpullできない。 `アプリの設定 > 全般 > サービスロール` で指定されてるロール名をコピーしてIAMから接続しているレポジトリを修正しましょう。

# おわりに

AWS CodeCommitを使っていればとても簡単ですね!
とはいえ、管理コンソールから変更できないのは不便なので改善されることを期待してます。

# Note

https://docs.aws.amazon.com/ja_jp/cli/latest/reference/amplify/update-app.html
【Jest+React Testing Library】結合テストを書いてみる

# はじめに
バックエンドに続いてフロントエンドのテストも導入したので、簡単にまとめておきたいと思います。

# テストの流れ
①テスト対象のコンポーネントをレンダリング
②レンダリングするとDOMが生成されるのでテスト箇所のidを探しに行く(data-testidを付与しておく)
③testing-libraryのuserEventを使ってユーザアクションを実施
④実施したことで書き換わったDOMをベースに、期待するテストを実施


# テストのコード(例)
```jsx:frontend/__tests__/new_spec.jsx
import { render, screen, waitFor, cleanup, fireEvent } from '@testing-library/react';
import { toast } from 'react-toastify';
import '@testing-library/jest-dom'
import userEvent from '@testing-library/user-event'
import App from '../pages/new';

const textfile = new File(['これはファイル内容です'], 'test.txt', {
  type: 'text/plain',
});

describe('ファイルをアップロードしたとき', () => {
  
  afterEach(() => {
    cleanup();
    toast.warning.mockClear();
    });

    it('ファイル名が表示されること', async () => {
      render(<App />);
  
      const fileInput = screen.getByTestId('testfile-upload');
      userEvent.upload(fileInput, textfile);
  
      await waitFor(() => {
        const spanElement = screen.getByTestId('uploaded-testfile');
        expect(spanElement).toBeInTheDocument();
      }); 
    });
  
    it('txt以外のファイルはエラーになること', async () => {
      render(<App />);
  
      const imgfile = new File(['テストファイル'], 'image.png', {
        type: 'image/png',
      });
  
      const fileInput = screen.getByTestId('testfile-upload');
  
      fireEvent.change(fileInput, { target: { files: [imgfile] } });
    
      await waitFor(() => {
        expect(toast.warning).toHaveBeenCalledWith(
          'エラーメッセージ',
          expect.anything()
        );
      });
    });

  it('ファイル内容確認のためのモーダルが表示されること', async () => {
    render(<App />);

    const fileInput = screen.getByTestId('testfile-upload');
    userEvent.upload(fileInput, textfile);

    await waitFor(() => {
      expect(document.getElementById('confirmHundleTestFile')).toBeInTheDocument();
      expect(screen.getByText('ファイルアップロード')).toBeInTheDocument();
      expect(screen.getByText('これはファイル内容です')).toBeInTheDocument();
    }); 
  })
})
```

# おわりに
フロントエンドのテストは初めて学んだのですが苦ではなかったので楽しいかもしれないです。テストの導入やテスト対象のファイルを読み込むまでにかなり苦戦したので、もしかしたらその反動かもしれませんが…
もっと良い書き方や考え方があると思いますので適宜インプットしていければと思います。
Pythonで最速でlist化する方法

# 結論
`[*iterable]`が(たぶん)最速。
だけどそれ以前に考えるべきことがあるよね。

# はじめに
「Pythonでlistを生成するとき、list()よりも[]の方が早い」ということを知って、これは他オブジェクトのlist化でも同じことが言えるのかと少し気になった。

# disモジュールで確認
適当にバイトコードを確認してみる。
```python
>>> import dis
>>> dis.dis(lambda: list(iterable))
  1           0 RESUME                   0
              2 LOAD_GLOBAL              1 (NULL + list)
             14 LOAD_GLOBAL              2 (iterable)
             26 PRECALL                  1
             30 CALL                     1
             40 RETURN_VALUE
>>> dis.dis(lambda: [*iterable])
  1           0 RESUME                   0
              2 BUILD_LIST               0
              4 LOAD_GLOBAL              0 (iterable)
             16 LIST_EXTEND              1
             18 RETURN_VALUE
>>> 
```

たしかに行数は少ないが、内容がだいぶ違う。
もしかしたら実際の処理負荷的に`list(iterable)`の方が早いということも考えられる。

# timeitモジュールで確認
参考にした記事でも使っていたtimeitモジュールでも確認してみる。
```py
>>> import timeit
>>> 
>>> iterable = '1234567890'*10
>>> 
>>> timeit.timeit('list(iterable)', globals=globals(), number=5000000)
1.7787381240050308
>>> timeit.timeit('[*iterable]', globals=globals(), number=5000000)
1.7009898429969326
>>> 
```

ほぼ誤差レベルではあるが、一応早くなってはいる。

# 結論(というか個人的な意見)

Python的には`[*iterable]`が読みやすいらしい。
しかし、今まで数々の可読性が最悪なPythonコードを生み出してきた私個人の感覚では、`list(iterable)`の方がわかりやすいと思う。
呼び出し側の`*`演算子は正直言って使いどころが少なく、認知度も高くないのではないかと個人的に思っている。

もしあなたがコンピュータと同じ完成の持ち主なら、`[*iterable]`を使ったほうが良いかもしれない。

しかし、所詮誤差は誤差なので、それ以外に改善できるところを探したほうが良いと思うよ。
なんか前にJavaScriptで`a = -x`よりも`a = 0 - x`の方が若干早いって話が議論されてたよね。


# 参考

pythonでリストを生成するときにlist()と[]どっちを使うか？  by inetcpl 
https://qiita.com/inetcpl/items/9fd9fb4bfcb39663dcd5

Python の * 演算子 (iterable unpacking operator) の使い方  by eumesy 
https://qiita.com/eumesy/items/dda85b70d28da61663cb


# おまけ：他の処理系で比べてみる
さっきまでの検証はCPython 3.11.4で行っていたが、処理系によっては他の結果が出るかもしれない。
というわけで手短にIronPython 3.4.1 (.NET 6.0.24)で確認してみる。

```python
>>> # Pythonのバージョンが古いせいか、timeit.timeitの仕様がやや違ったため、面倒なコードを書いて計測した
>>> # 一応CPython上で、timeit.timeitと同様の結果が出ることは確認している。
>>> import time
>>> 
>>> iterable = '1234567890'*10
>>> 
>>> if True:
...     a_start = time.time()
...     for _ in range(5000000):
...         __ = list(iterable) 
...     a_end = time.time()
... 
>>> a_end - a_start
5.4328689575195312
>>> 
>>> if True:
...     b_start = time.time()
...     for _ in range(5000000):
...          __ = [*iterable]
...     b_end = time.time()
... 
>>> b_end - b_start
28.690162658691406
>>> 
```
普通に終わるかどうか不安になった
遅いとかそういう次元の話じゃないんだけどなにこれ

`dis.dis`は`NotImplementedError`が出たので使い物にならなかった。

とりあえず処理時間が`list()` > `[]`であることは覆っていないか確認する。
```python
>>> if True:
...     a_start = time.time()
...     for _ in range(5000000):
...         __ = list()
...     a_end = time.time()
... 
>>> a_end - a_start
1.338226318359375
>>> if True:                    
...     b_start = time.time()
...     for _ in range(5000000):
...          __ = []            
...     b_end = time.time()
... 
>>> b_end - b_start
0.6037750244140625
```

倍以上の差があるのでここは問題なさそう。

Pythonのバージョンによるものかとも思ったがそうでもなく、ちゃんと`[*iterable]`の方が早かった。

引数展開の速さは処理系によってかなり違いがあるということなのだろうか。
Salesforce 特にLightning Experienceの見た目を変えたいけど...


Lightning Experienceの登場した頃よりはだいぶ見やすくなったけど、老眼世代の多い職場では正直つらいですね。文字が見えないってよく言われてしまう。

何か変更できる方法はないかと... 無いと分かっていますが

+ [Salesforceのダークモード](https://qiita.com/Keiji_otsubo/items/a191014bc946d42bcc41)

一時期ダークモードの設定があったのですが、いつの間にか消えてなくなってしまいましたねぇ。


+ [【アイデア】テーマとブランディング: ブランドベースのカラーパレットを編集可能にします](https://ideas.salesforce.com/s/idea/a0B8W00000GdgxzUAB/themes-and-branding-allow-brandbased-color-palette-to-be-editable)

そうなんですよね、テーマを変えてもカラーパレットは変更できないので、思うような色調にはできないんですよね。

+ [Styling Hooks : Lightning Design System](https://qiita.com/Keiji_otsubo/items/55733cba5e484f62efc8)

LWCで作ったカスタムコンポーネントなら対応できるけど、標準画面までは操作できそうにない。

+ [SLDS Architecture Update FAQs](https://qiita.com/Keiji_otsubo/items/0f8b4041583710e7721f)

>Summer '24 リリース以降、Salesforce は、将来の UI 変更 (セーフハーバー) をサポートするために、Lightning コンポーネント、Salesforce Lightning Design System (SLDS) スタイル、およびカスタムプロパティの内部実装を変更しています。

>これらの内部変更は、ほとんどの顧客にとって目に見える UI の変更を引き起こしません。ただし、サポートされていない CSS オーバーライドを使用して Experience Cloud サイトまたは Lightning ページをカスタマイズした場合、アーキテクチャの更新を続けると、それらのカスタマイズによって視覚的に望ましくない変更が生じる可能性があります。

この中に　–dxp スタイリング フックというのが説明されている。

>--dxpスタイルフックを使用すると、サイト全体のベースおよびカスタム Lightning Web コンポーネントの両方に影響を与える単一のフックを設定できます。

>--dxpスタイリング フックは、下位レベルのコンポーネントのスタイリング フックにマップされるカスタム プロパティの縮小されたセットであるため、多くの個別のコンポーネントを一度に変更する単一のフックを設定できます。たとえば、 --dxp-g-brandフックは、ボタンの背景色、リンクの色、フォーカス上の入力境界線の色に影響します。

これが使えるかもしれないな。

また、以下ではカスタムのCSSを強制適用させるハックが紹介されていますね。合わせ技で使えるかも

+ [Increase Salesforce Overlays With The Lightning:backgroundUtilityItem Interface](https://qiita.com/Keiji_otsubo/items/b965f6722b4dbb880682)


しかし、調べてみるとLWRでの適用しか発見できないですね。Experience Cloudで可能だが、普通の環境ではできないのかな？


https://developer.salesforce.com/docs/atlas.en-us.exp_cloud_lwr.meta/exp_cloud_lwr/brand_hooks.htm

# UI 要素の色のコントラストの改善

+ [UI 要素の色のコントラストの改善](https://help.salesforce.com/s/articleView?id=release-notes.rn_general_color_contrast.htm&release=246&type=5)

テキスト以外の UI 要素 (ボタンやチェックボックスなど) や、一部のテキスト UI 要素 (リンクなど) を表示するときの色のコントラストがアクセシビリティ基準に合わせて改善されました。Summer '23 から色のコントラストの改善が開始されています。Winter '24 では、この変更は Lightning Experience のすべてのページとカスタム Lightning コンポーネントの Lightning 基本コンポーネントに適用されます。
Docker構築にてGO言語のバージョンが原因でmailpit コマンドをインストールできなかった場合の対処法

# Dockerfile内で
- Go 言語をインストール（mailpit コマンドを go install でインストールするために必要）
RUN apt install -y golang-go

- mailpit コマンドをインストール
インストール先が /root 配下だと Web サーバーから実行できないので、
/usr/local/bin へ移動
RUN go install github.com/axllent/mailpit && mv /root/go/bin/mailpit /usr/local/bin

以前はこの記述でmailpit コマンドが機能したのですが
最近、新たにDocker構築すると
RUN go install github.com/axllent/mailpit && mv /root/go/bin/mailpit /usr/local/bin
の箇所で失敗しました。
原因を調べているとGo 言語のバージョンが原因のようでした。

Go 言語のインストールで仮想サーバーにインストールされるGo 言語のバージョンはgo-1.19
mailpit コマンドをインストールするにはGo 言語バージョンはgo-1.21以上が必要になったようです。

# 対処法ですが
- 「mailpit コマンドをインストール」の箇所をコメントアウトしgo-1.19のままdocker構築
/usr/binを確認すると「go -> ../lib/go-1.19/bin/go」となっている

- /libに移動してmkdirでgo1.22.2フォルダを作成　その中で

sudo curl -L "https://go.dev/dl/go1.22.2.linux-amd64.tar.gz" -O　

でgo1.22.2ダウンロード
- /lib内のgo-1.19をgo-1.19_bkにしてバックアップとして残し
go1.22.2内でgo1.22.2を解凍する
sudo mv go-1.19 go-1.19_bk
rm -rf go-1.19
mkdir go1.22.2
cd go1.22.2
tar -zxvf go1.22.2.linux-amd64.tar.gz　

goフォルダができますので（中身はgo1.22.2）

sudo mv go ../go-1.19　

としてgoフォルダを/lib/go-1.19として、中身はgo1.22.2のgoフォルダを移動してリネームする
（仮想環境でメールを確認したいだけですのでシンボリックリンク名go-1.19は変えてません。）
goのversionを確認しアップデート出来ていたらdockerを再起動

- mailpit コマンドをインストール

sudo go install github.com/axllent/mailpit@latest && mv /root/go/bin/mailpit /usr/local/bin

とすることでmailpit コマンドをインストールできてDocker内でmailpit でメール受信できました。

調査に時間がかかったので備忘録として残しておきます。
RUN apt install -y golang-go　のデフォルトインストールのバージョンが
go-1.21以上に上がれば、この手間は無くなります。
PHPカンファレンス小田原に参加しました。

## はじめに

PHPカンファレンス小田原とは？

https://phpcon-odawara.jp/

PHPカンファレンスの小田原出張版です。
今回が初開催となりました。

2024年4月13日（土）開催でした。

## 気になった講演

### FigmaとPHPで作る、1ミリたりとも表示崩れしない最強の帳票印刷ソリューション

https://speakerdeck.com/ttskch/figmatophpdezuo-ru1miritaritomobiao-shi-beng-resinaizui-qiang-nozhang-piao-yin-shua-soriyusiyon

昔帳票のシステム開発に携わっていて、確かによくズレるし罠も多かった経験があるため気になって聞きに行きました。
svgから生成するのはなるほどーという感じでした。
とはいえ結局泥臭くやる必要がある部分は変わらず、そもそも帳票というものは複雑度が高く難しいものなんだな、という気持ちになりました。

### VAddy PHPカンファレンス全部スポンサーする！の裏側

https://drive.google.com/file/d/1ksyzYWgE5lv-AZtP4QVkoCDS_Ax4VR4y/view

「全部」スポンサーするという意気込みを聞いてパワーを感じました。
理由も「面白いから」ということですげぇなの一言。
過去のカンファレンスの様子も知れて非常に面白い講演でした。
>いつまでも
あると思うな
カンファレンス

これはほんとにそう。

### 出来らあっ！！(という気持ち)から始めたコンテナ化と開発者体験の向上施策

https://speakerdeck.com/st1t/php-conference-odawara-2024

元同僚の発表でした。
開発者体験を向上させるマインドが素晴らしい発表でした。
仕組み自体も良かったんですが、将来像を語ったりまわりを巻き込みながら実行していく姿勢がめちゃいいなと思いました。

### SREとその組織類型 多様化するSREについて改めて考えてみた

https://speakerdeck.com/tatsuo48/sretosonozu-zhi-lei-xing

こちらも元同僚の発表でした。
SREというのは役割ではなく考え方、というメッセージがめちゃ良かったです。
弊社にもSREロールというのが存在しますが、ついついそのロールの人たちに任せっきりになってしまいがち。
アプリケーションを開発する側もしっかり意識する必要がある観点だなと改めて思いました。

### Architecture Decision Record を一年運用してみた

https://speakerdeck.com/hanhan1978/adr-after-a-year

最近よくADR聞くので講演聞きに行きました。
Git管理はよく思いつきますがアンチパターンだよなって点で学びでした。
定着させるにはちゃんとオンボードする必要がある、という点も学びでした。

### 「手動オペレーションに定評がある」と言われた私が心がけていること

https://speakerdeck.com/blue_goheimochi/phpcon-odawara2024

結局失敗して学んで成長する、というのが1番はやいよなと感じました。
今僕のまわりで活躍している人たちも絶対過去に失敗をしているし、その度に手動オペレーションによる復旧などを経験して強くなってきました。（僕も思い当たる節が多々あります…ｗ）
失敗できる環境を用意するのが大事だなーと感じました。

### Laravelに0からPHPStanを導入して継続的に運用する方法

https://fortee.jp/phpconodawara-2024/proposal/8f98a351-96fc-41ef-82c0-ec76fedbb33c

結局銀の弾丸はなく、地道に潰してベースラインを上げていくしかないんだなという感想。

## 小田原について

僕が所属している[NE株式会社](https://ne-inc.jp/)は小田原にある会社で、本カンファレンスの運営協力会社でした。
自分が所属している会社がカンファレンスを運営し、小田原を盛り上げている点が素直に嬉しかったです。
あとシンプルに弊社からの参加者も非常に多くて嬉しかったですね。

https://zenn.dev/neinc_tech/articles/phpcon-odawara-sponser

あと個人的には小田原という土地にPHP界隈の著名人が普通に歩いてて不思議な感覚になりましたｗ
本カンファレンスには小田原市も協力してくれていて、小田原移住相談ブースなんかも用意されていました。
小田原良い土地なので是非移住もご検討ください！ｗ

## まとめ

やっぱりカンファレンスに参加すると意欲ややる気が刺激されてめっちゃいいですね。
自社にずっといると
「他社ではどうしてるんだろう？」
「これって普通なんだっけ？」
みたいな観点がどうしても見えづらいため、外を見て外を知り、刺激をもらうことは大事だなと改めて感じました。
登壇された方・参加された方、スポンサー各社、小田原市、運営された方
全ての方に感謝です！

![20240413_18-45-20_PXL_20240413_094520274.RAW-02.ORIGINAL_fkuMnk.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/46e35a90-5ed2-6574-3698-468ed1bdfb14.jpeg)