OmniAICreator/Qiita-1.07M huggingface dataset:
【テーブル設計】初心者必見！ゼロから学べる実践入門

基本概念について
---
`エンティティ`: テーブルに格納されるデータの実体を表します。例：ユーザー、商品、注文など。
`属性`: エンティティの特性を表すデータの列。例：ユーザー名、メールアドレス、商品価格など。

`主キー (Primary Key)`:
各レコードを一意に識別するためのフィールド。
一意でなければならない。

`外部キー (Foreign Key)`:
他のテーブルの主キーを参照するフィールド。
テーブル間のリレーションシップを確立するために使用。
例：注文テーブルのユーザーIDがユーザーテーブルのユーザーIDを参照。

テーブル設計のステップ
---
要件の定義
- 収集するデータとその関係性を明確にする。
- ビジネス要件に基づいて必要なテーブルとフィールドを洗い出す。

エンティティの定義
- 主要なエンティティを特定し、それぞれに対する属性を定義。
- エンティティごとにテーブルを作成。

正規化
---
`第一正規形 (1NF)`: 各列が原子値（単一の値）で構成される。
`第二正規形 (2NF)`: 1NFを満たし、主キー以外のすべての属性が完全に主キーに従属する。
`第三正規形 (3NF)`: 2NFを満たし、すべての属性が主キーに対して従属し、非キー属性間の依存がない。

インデックスの設計
---
- 検索パフォーマンスを向上させるために、頻繁に検索される列に対してインデックスを設定。
- 主キーには自動的にインデックスが作成されるが、必要に応じて他の列にもインデックスを設定。

リレーションシップの定義
---
- テーブル間の関係を外部キーを用いて定義。
- 1対多、多対多の関係を適切に設計。

ベストプラクティス
---
1. 適切なデータ型の選択
各フィールドに対して最適なデータ型を選択し、ストレージ効率とパフォーマンスを向上させる。
例：整数型（INT）、文字列型（VARCHAR）、日付型（DATE）など。
2. インデックスの適用
検索速度を向上させるために、適切なフィールドにインデックスを設定。
インデックスの過剰設定は更新性能に影響を与えるため、必要な箇所に限定。
3. 適切な命名規則の採用
テーブル名やフィールド名には、わかりやすく、一貫性のある命名規則を採用。
例：キャメルケース（userProfile）、スネークケース（user_profile）など。
4. バックアップとリカバリ
定期的にデータベースのバックアップを取得し、リカバリプランを策定。
データ損失のリスクを最小化するための対策。
5. ドキュメント化
テーブル設計やスキーマを詳細にドキュメント化し、チーム全体で共有。
将来的な保守性と理解の容易さを向上。

まとめ
---
データベースのテーブル設計では、エンティティとその属性を明確にし、正規化とインデックス設計を行います。
主キーと外部キーを適切に設定し、リレーションシップを定義します。
命名規則の統一、バックアップの計画、ドキュメント化を実施し、保守性とパフォーマンスを向上させることが重要です。
Tailwind Gennie AIによるTailwindCSSのコードの自動生成 個人利用無料

Tailwind Gennie– Generative UI

https://tailwindgenie.com/

![Tailwind説明.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/1fb53513-f95a-8741-37c6-86a65004e5ab.png)

お試しボタンを押すと、
サインアウトボタン
ネットフリックスのランディングページのクローン
Google検索ページ
をTailwindCSSで装飾したコードが出力されます。

プロンプトに自分の希望するデザインを入力するとTailwindCSSで書かれたコードが出力されます。

※日本語でも一応解釈してくれます。

使い方は出力されたものを「Copy」ボタンでコピーして貼り付けるだけです。

Switch to React
Switch to CSS
ボタンで👇切り替えられます。

```
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<!-- Sign Out Button -->
<button type="button" class="py-2 px-4 text-sm font-medium text-gray-900 bg-white border border-gray-200 rounded-lg hover:bg-gray-100 hover:text-blue-700">
  Sign Out
</button>

```

```
{/* Sign Out Button */}
<button type="button" className="py-2 px-4 text-sm font-medium text-gray-900 bg-white border border-gray-200 rounded-lg hover:bg-gray-100 hover:text-blue-700">
  Sign Out
</button>
```

![Tailwind1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/95194dab-6de4-e0a5-1060-4af7361ed9f4.png)

![Tailwind2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/a78ac0cc-fa93-834f-a6c2-29d81bab386f.png)

![Tailwind3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/93a01eb4-4af7-2c9b-d946-9e1ef3d3c972.png)

個人利用では無料(規約有)ですが、
企業で利用する場合は有料です。
$250/月
おじさん方、意味がわかりました。

# 省略形を受け入れろ

基本情報技術者試験の参考書を読んでいて、当たり前のように使ってくる大文字のアルファベットの羅列。なんの略語なのかを調べ、調べた先でもなんだそれとなり…


長々した言葉を短くスマートに変換することで利便性も良くなるわけですが、意味が伝わらないと瞬く間とストレスに為り変るわけで。


そんなことを考えていた時に、ふと父に「そんな省略して話してたら伝わるもんも伝わんねえぞ」と言われたことを思い出しました。
そういうことだったのか。とこの機会にしみじみ感じました。

確かに思い返してみると、
「とりあえず、まあ」を「とりま」と言い、
「面白い」が派生して「草」に変換され、
終いには「理解した」「了解」が「り」で通じるようになっていることが
若者の間で問題視されず当たり前になっています。


ただ、現代を生きる若者は、そんな当たり前を何も疑うことなく無意識に適応してコミュニケーションを成立させていて、
これをエンジニアに変換すると、意味のわからない大文字のアルファベットの羅列を当たり前に脳みそで処理できなくてはいけないわけです。


本題になりますが、今回の記事では基本情報に限らず、開発をしていて頻出するアルファベットの羅列をとその正体をチートシートとしてにまとめました。

P.S. タイトルに「おじさん方」とまとめてしまい、すみませんでした。


# 頻出する省略形

| 略語 | 正式名称 | 正体 |
|:----------:|:---------------|:------------------------|
| SDK | Software Development Kit | ソフトウェア開発キット |
| CLI | Command Line Interface | コマンドラインインターフェース |
| API | Application Programming Interface | アプリケーションプログラミングインターフェース |
| DNS | Domain Name System | ドメイン名システム |
| IDE | Integrated Development Environment | 統合開発環境 |
| BIOS | Basic Input/Output System | 基本入出力システム |
| CPU | Central Processing Unit | 中央処理装置 |
| I/O | Input/Output | 入力/出力 |
| IP | Internet Protocol | インターネットプロトコル |
| SaaS | Software as a Service | サービスとしてのソフトウェア |
| PaaS | Platform as a Service | サービスとしてのプラットフォーム |
| IaaS | Infrastructure as a Service | サービスとしてのインフラストラクチャ |
| IoT | Internet of Things | モノのインターネット |
| SSL | Secure Sockets Layer | セキュアソケットレイヤー |
| CRUD | Create, Read, Update, Delete | 作成、読み取り、更新、削除 |
| MVC | Model-View-Controller | モデル・ビュー・コントローラ |
| SLA | Service Level Agreement | サービスレベルアグリーメント |
| JSON | JavaScript Object Notation | JavaScriptオブジェクト表記法 |
| XML | eXtensible Markup Language | 拡張可能なマークアップ言語 |
| FTP | File Transfer Protocol | ファイル転送プロトコル |
| OS  | Operating System | オペレーティングシステム |
| VoIP | Voice over Internet Protocol | インターネットプロトコルによる音声通話 |
| BI | Business Intelligence | ビジネスインテリジェンス |
| CMS | Content Management System | コンテンツ管理システム |
| IAM | Identity and Access Management | アイデンティティおよびアクセス管理 |
| CRM  | Customer Relationship Management | 顧客関係管理 |
| RPA | Robotic Process Automation | ロボティックプロセスオートメーション |


# 終わりに

大学時代、同級生のギャル男くんに彼女ができた報告をしたら「ま？」だけ返ってきたことがありました。
祝いの言葉を受け取る体勢しか取っていなかった私は、思いもよらないひらがな1文字とクエスチョンマークの組み合わせだけが返ってきたことに戸惑いました。「ま？」とは。

どうやら、「それまじ？」の省略だったらしいです。さすがに怒りました。
【テスト】初心者必見！ゼロから学べる実践入門

ソフトウェアテストとは？
---
ソフトウェアテストとは、ソフトウェアが仕様通りに動作するか、バグやエラーがないかを確認するプロセスです。
テストを行うことで、ソフトウェアの品質を確保し、リリース後の問題を未然に防ぐことができます。

テストの内容
---
■バグの発見
ソフトウェアに存在する可能性のあるバグやエラーを発見し、修正します。

■仕様の確認
ソフトウェアが要求される機能や仕様を正しく実装しているかを確認します。

■品質の向上
ソフトウェアの品質を向上させ、ユーザーの満足度を高めます。

■ソフトウェアテストの種類
単体テスト (Unit Testing)
個々のモジュールや関数の動作を確認するテストです。
開発者がコードを書いた後に実施し、バグを早期に発見することができます。

■結合テスト (Integration Testing)
複数のモジュールやコンポーネントが連携して正しく動作するかを確認するテストです。
モジュール間のインターフェースやデータのやり取りを検証します。

■システムテスト (System Testing)
ソフトウェア全体が要求された機能や性能基準を満たしているかを確認するテストです。
システム全体の動作をテストし、統合された環境での動作確認を行います。

■受け入れテスト (Acceptance Testing)
ユーザーの要求に基づいてソフトウェアが期待通りに動作するかを確認するテストです。
ユーザーやステークホルダーが実施することが多いです。

■回帰テスト (Regression Testing)
ソフトウェアに変更や修正を加えた後、既存の機能が影響を受けていないかを確認するテストです。
新しいバージョンが既存の機能を壊さないことを保証します。

■性能テスト (Performance Testing)
ソフトウェアの性能や応答速度、負荷耐性を確認するテストです。
スケーラビリティや負荷試験を含みます。

ベストプラクティス
---
■テスト計画の策定
テストを実施する前に、テスト計画を策定し、テストの目的や範囲、リソースを明確にします。計画にはテストケースやスケジュールも含めます。

■自動化テストの導入
単体テストや回帰テストなど、繰り返し実施するテストは自動化ツールを利用して効率化します。
自動化により、テストの実行時間を短縮し、エラーを減らすことができます。

■テストのドキュメント化
テストケースやテスト結果を詳細にドキュメント化し、テストの内容や結果を追跡可能にします。
これにより、問題が発生した場合の分析や修正が容易になります。

■継続的インテグレーション
継続的インテグレーション（CI）ツールを使用して、コードがリポジトリにマージされるたびに自動でテストを実行します。
これにより、早期に問題を検出し、リリースの信頼性を高めます。

まとめ
---
ソフトウェアテストは、ソフトウェアが仕様通りに動作し、バグやエラーがないことを確認するプロセスです。
主なテストの種類には、単体テスト、結合テスト、システムテスト、受け入れテスト、回帰テスト、性能テストがあります。
ベストプラクティスとして、テスト計画の策定、自動化テストの導入、ドキュメント化、継続的インテグレーションが推奨されます。
ブルーノイズのサンプルやテクスチャ生成

# はじめに
ブルーノイズは, Computer GraphicsやComputer Visionによく使われる分布です.
その性質をもつ点群の場合は, ランダムでありながら各点がほぼ等間隔に離れて位置します.
![bsamples.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27065/28d3d962-c124-b9db-482f-18471d435d91.png)
2次元の波の場合も, 均等に配置される見た目になります.
![bnoise2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27065/bbc5409f-f383-c3c8-b689-20b5d044ae6a.png)

ドキュメントがまだできていませんが, コードは[cppblue](https://github.com/taqu/cppblue)にあります.

# ブルーノイズサンプリング
２次元のブルーノイズ点群を生成するアルゴリズムとして, [Weighted Linde-Buzo-Gray Stippling](https://graphics.uni-konstanz.de/publikationen/Deussen2017LindeBuzoGray/index.html)があります.
[ボロノイと点列の生成のはなし](https://qiita.com/shinjiogaki/items/df433279497bcc580f11)という記事があり, あげられたコードを写経してみましたが, まともな結果が得られず, さらに全く計算が収束する気配がありませんでした. 写経ミスがあるかもしれませんが, 何度も見返してチェックしてもダメなので, 元のコードが正しいのかかなり怪しいと思いました.
楽と横着は違います, 元論文からちゃんと実装しました. 元論文との違いは,

- ボロノイ図の描画に`Jump Flooding Algorithm`を使う
    - 論文の実装ではコーンをOpenGLで描画
- タイリングになっている

# ブルーノイズテクスチャ
[The void-and-cluster method for dither array generation](http://cv.ulichney.com/papers/1993-void-cluster.pdf)で, 1から3次元まで作成できるようにしました. 2024年では特許の期限は終了しているようです.
こちらもタイリングになっています.

# まとめ
サンプリングのいろいろなアルゴリズムや手法をまとめたライブラリにしておいた方がいいのだろうか.
Javaで「引数を指定してmainメソッドを呼び出す」の動作を確認してみた

# 概要

Javaで「引数を指定してmainメソッドを呼び出す」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/main/index1.html

# 実装

以下のファイルを作成しました。
```JSample1_1.java
class JSample1_1{
  public static void main(String args[]){
    System.out.println("「" + args[0] + "」");
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample1_1.java 
$ java JSample1_1 hello
「hello」
```

# まとめ

何かの役に立てばと。
Shift-JISのファイルをUTF-8にエンコードする

# 1. はじめに
この記事では、ファイルの文字コードをshift-jisからUTF-8に変換するコードを紹介します。

# 2. 実行
1. お手持ちのGoogleアカウントで　Google Driveを開く
  - 合わせてフォルダのマウントも行ってください。
    >- 左にあるファイルマークを押してください。
    >- 以下のように4つのアイコンの中の左から3つ目のアイコンを押すことでできます。
    ><img width="342" alt="4つのアイコン" src="https://github.com/user-attachments/assets/3a20f89c-e343-418a-9ff4-7ed2ac8d25d2">
    >- 以下のように斜線が入ると完了しています。
    ><img width="342" alt="4つのアイコン" src="https://github.com/user-attachments/assets/455e72a9-f3d1-4a64-8aa0-4e74f7661d0a">

2. 以下のコードを貼り付る
```python
import csv
import codecs
import sys

def convert_encoding(input_file, output_file):
    try:
        # Shift-JISでファイルを開く
        with codecs.open(input_file, 'r', encoding='shift_jis') as file:
            data = file.read()
        
        # UTF-8でファイルを書き込む
        with codecs.open(output_file, 'w', encoding='utf-8') as file:
            file.write(data)
        
        print(f"変換が完了しました。出力ファイル: {output_file}")
    except UnicodeDecodeError:
        print("エラー: ファイルの読み込み中にデコードエラーが発生しました。入力ファイルがShift-JISでエンコードされていることを確認してください。")
    except IOError as e:
        print(f"エラー: ファイルの操作中にエラーが発生しました: {e}")
    except Exception as e:
        print(f"予期せぬエラーが発生しました: {e}")

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("使用方法: python script.py <入力ファイル> <出力ファイル>")
        sys.exit(1)
    
    input_file = sys.argv[1]
    output_file = sys.argv[2]
    
    convert_encoding('input-Shift-JIS-file', 'output-UTF-8-file')
```
3. 変更したいファイルをドライブにアップロード
4. アップロードしたファイルのパスをコピーし、貼り付ける
  - 「2」で貼り付けたソースコードの一番したにある`(Shift-JISのファイル)`に貼り付けてください  
  - また、`(UTF-8のファイル)`については、自分で設定することができます。変換がわかるように後ろに`UTF-8`などつけるとわかりやすいかもしれません。
5. Shift+Enterで実行
Windows 11 のライトテーマでタスクバーの背景を変なグラデにしない

## はじめに
アプリのテストでライト/ダークモードを切り替えていたら、戻し方が解らなくなったので、将来のためにメモしておきます。

### 環境
- Windows 11 Pro 23H2

## 設定 > 個人用設定 > 色
### モードを選ぶ
- 「カスタム」にします。
- 「Windowsモード」を「ダーク」にします。
- 「アプリモード」を「ライト」にします。

### アクセントカラー
- 「自動」にします。
    - あるいは、任意の色に設定します。

#### スタートとタスクバーにアクセントカラーを表示する
- 「オン」にします。
    - 「Windowsモード」が「ライト」だと「オン」にできません。

## おわりに
スタートに黒っぽいアイコンがあるのと、デフォルトのタスクバーのグラデが気になって変更していたのですが、戻すのに少し手間取ってしまいました。
投稿 24 エンジニアのメンタルリスク 2024/07/24

本日の勉強時間　2H


意識大事にしていきましょう。
![IMG_6462.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579814/40d740a5-13e1-0668-d087-47ef066c4e8e.png)
G検定の学習方法まとめ

G検定2024#4に合格したので、自分が勉強した学習方法をまとめてみたいと思います。
もし参考になれば幸いです。

## G検定について
ディープラーニングの基礎知識や事業活用を問う資格です。
勉強してみた感じ、機械学習やプロジェクトの進め方の概要がわかるようになるといったイメージです。
（これで機械学習を作れるぞ！というよりは、どちらかというとAIのプロジェクトにアサインするにあたってついていけるように、あるいはE資格や機械学習エンジニアの足がかり、といったイメージでした）

## 教材
- [深層学習教科書 ディープラーニング G検定（ジェネラリスト）公式テキスト 第3版](https://www.amazon.co.jp/dp/4798184810?ref=cm_sw_r_cp_ud_dp_QFWWKWAH2M2XGR5QDMBE&ref_=cm_sw_r_cp_ud_dp_QFWWKWAH2M2XGR5QDMBE&social_share=cm_sw_r_cp_ud_dp_QFWWKWAH2M2XGR5QDMBE)
  白本と呼ばれている教科書です。
  この書籍を主軸に学習しました。
- [最短突破ディープラーニングG検定（ジェネラリスト）問題集 第2版](https://gihyo.jp/book/2022/978-4-297-12926-2)
  赤本と呼ばれています。
  解説がしっかりしているため、問題集というより参考書として使いました。
- [徹底攻略ディープラーニングG検定ジェネラリスト問題集 第2版 (徹底攻略シリーズ)](https://www.amazon.co.jp/dp/4295011630)
  黒本と呼ばれています。
  購入しましたが、学習時間を確保できず、4章 基礎数学 のみ使いました。
- [G検定対策アプリ](https://www.skillupai.com/general-app/)
  問題集としては主にこのアプリを使いました。
  赤本と比べると解説が少ないですが、スキマ時間の学習に便利でした。
- Youtube動画
  3Blue1BrownJapanなど。白本ではAttentionがよくわからなかったので参考にしました。

## 学習期間
6/8 ～ 7/5
50時間ほど

## 学習の流れ
### STEP1. 白本 1周
ここでは暗記や深い理解をせずに、ざっくり目を通します。
G検定は範囲が広いと言われていたため、まずは全体を把握するために軽く1周しました。
また、1周目は章末の問題も解きませんでした。

### STEP2. 章ごとに白本→赤本を進める
下記のように、じっくり理解をしながら学習を進めます。
1. 白本の解説を読む
2. 白本の章末問題を解く
3. 赤本を解き、解説を読む
4. わからなかった用語はググったり、Youtubeの解説動画を見る

### STEP3. もう一度、章ごとに白本→赤本を進める
理解が曖昧だったり、忘れたものがないか、確認します。
間違ったり、不安な用語をスマホのメモ帳にまとめ、スキマ時間に復習していました。
また、出先や就寝前にG検定対策アプリで問題を解きます。

### STEP4. Study-AIの模試を解く
時間配分を確認するため、試験2日前に模試を解きました。
この時点で9割ほど正答した感じです。
本番でも同じくらいの正答率でしたので、時間配分や合格ラインに届くかの確認に有効かと思います。

### 試験当日
赤本の章末に用語解説があるので、試験前にざっと確認しました。

## 学習で意識したこと
### 関連付けて覚える
「ILSVRC 2012」「AlexNet」「ディープラーニングが注目された要因の一つ」など、なるべく関連付けて覚えます。
特にディープラーニングの手法に関しては、他の手法の特徴や改良点などを関連付けて覚えたほうが良いと思います。

### 深堀りしすぎない
G検定は覚えることが多いので、調べる上で深堀りしすぎないよう概要や特徴の理解にとどめました。
例えばSVMは下記のような感じです。
- サポートベクトル間のマージンを最大化するように線形分離
- ソフトマージン、ハードマージンの違い
- マージン最大化することで汎化能力が高い
- 非線形に対応するときはカーネルトリックで高次元に写像して線形分離できるようにする

※数式の導出など、深いところまで見ません。
ただし、数式でもニューラルネットワークの学習率といったハイパーパラメーターの特徴の把握は重要です。
（学習率の場合は小さすぎるとどうなるか、大きすぎるとどうなるか、といった感じです）

### 数学について
白本や赤本は、数学について不足していています。
もし不安でしたら、下記のような機械学習に特化した数学入門書でざっくり復習するのも良いかもしれません。
[人工知能プログラミングのための数学がわかる本](https://www.amazon.co.jp/dp/4046021969/)
※G検定では難しい数学の問題は出題されないようなので、数学は時間があればざっくりやる感じで良いかとおもいます。

## 学習全体を通して
白本と赤本でG検定に合格できる基礎力がつくと思いますので、この2冊をしっかり勉強すれば、合格に十分な知識が身につくかと思います。
ただし、ページ数の都合上だと思いますが、（特に白本は）解説が不十分なものもありますので、その際は適宜調べることも重要です。
Ansible概要

Ansible 概要
--
主に以下のメリットがある
* デプロイ自動化ツール
    * サーバのデプロイ
    * サーバの設定
    * ソフトウェアのインストール
* オーケストレーション機能
    * デプロイを一連の作業として、まとめる。ワークフロー化を指す

[オーケストレーションとは](https://www.redhat.com/ja/topics/automation/what-is-orchestration)
[Ansible-公式](https://docs.ansible.com/ansible/2.9_ja/index.html)

Playbook
--
自動化させるために、playbookで何をするか、定義する
[Ansible-公式-Playbook](https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_intro.html)

権限昇格の理解: become
--
playbookにて定義されたtaskを実行する必要がある場合、使用する
[Ansible-公式-become](https://docs.ansible.com/ansible/2.9_ja/user_guide/become.html)

Ansible Vault
--
パスワードやキーの保護などの機密データを暗号化ファイルの維持に使用する
[Ansible-公式-Vault](https://docs.ansible.com/ansible/2.9_ja/user_guide/vault.html)

モジュールの使用
--
Ansible には、リモートホスト上または Playbooks を介して直接実行できる多数のモジュールが同梱されている
モジュールを利用することで、短いコードで済むため、可読性が向上する
[Ansible-公式-モジュールの使用](https://docs.ansible.com/ansible/2.9_ja/user_guide/modules.html)

プラグインの使用
--
より高度な設定が可能になる
高度な設定を使用するケースが、思いつかないので使用しないことを祈ります
[Ansible-公式-プラグインの使用](https://docs.ansible.com/ansible/2.9_ja/plugins/plugins.html)

随時更新
--
AWSサービスを使ってEC2を定期的に起動停止する場合、どのような方法が考えられるか

AWSでEC2の定期的な起動停止を実装する際に、どのような方法が考えられるかメモ

## EC2の起動停止について

- LambdaでEC2の起動停止を実装
- Systems Manager Automation ランブック(AWS-StartEC2Instance または AWS-StopEC2Instance)を利用して起動停止を実装
- AWS Step Functionから起動停止するよう実装
- 管理用のEC2を構築して起動停止を実行
- etcetc

Lambdaでコードを書いて起動停止を実装するか。

コーディングしなくてもSystems Manager Automation ランブックで用意されている起動停止のドキュメントを利用すればEC2の起動停止を実行できます。

また他にも管理用のEC2立てたりなんだりと、方法を考え出すと色々と思い当たる所があります。

なお今回はAWSサービスを利用してといった所が主眼となるため、AWS以外で起動停止するサービスは考慮外。

## 定期的な実行について

- EventBridgeルールからLambda、Systems Manager Automation ランブックを定期実行
- Systems Manager メンテナンスウィンドウからLambda、Systems Manager Automation ランブックを定期実行
- 管理用のEC2を構築してそこから定期実行
- etcetc

## 他にも色々と考えられる

AWSの各種サービスを組み合わせる事により。

AWS Step FunctionsからLambdaを呼び出したり

AWS Step Functionsの中でSystems Manager Automation ランブックを呼び出したり

Systems Manager Change Calendarを利用したり

それらをEventBridgeルールやSystemas Manager メンテナンスウィンドウから呼び出したり

また試したことはありませんがAWSサービスを組み合わせた実装された環境を[AWS Instance Scheduler](https://aws.amazon.com/jp/solutions/implementations/instance-scheduler-on-aws/)としてCloudFormationで構築できるよう提供されていたり。

調べだすと一言に起動停止といっても、AWSの色々なサービスをそれぞれ組み合わせて実装でき、いくつものパターンがある事に気が付きます。

個人的にはちょっとした環境で起動停止を組むなら、Systems Manaer メンテナンスウィンドウとSystems Manager Automationを組み合わせて実装するのが、コーディングもなく、また手軽に実装できて気に入っています。

## re:Postのナレッジセンターにあるドキュメント

re:Postのナレッジセンターにいくつか実装について説明している記事があるので紹介します。

#### Systemas Managerのメンテナンスウィンドウ & Systems Manager オートメーション

[Systems Manager Maintenance Windows を使用して EC2 インスタンスを開始および停止するようにスケジュールするには、どうすればよいですか?](https://repost.aws/ja/knowledge-center/ssm-ec2-stop-start-maintenance-window)

Systems Manager メンテナスウィンドウを設定して、そこからSystems Manager Automationを実行してEC2インスタンスを起動停止する方法について説明しています。

ドキュメントを読んでいけば実装できますが、個人的には一点だけ注意が必要で。

ターゲット登録の部分を紹介されている手順から変更して実装してみて動かない事象を確認しましたが、改めてドキュメントを読むとその選択肢では動かない事が書いています。

>[インスタンスタグを指定] をターゲットオプションとして使用しないでください。このオプションではインスタンスを起動できません。

ドキュメントななめ読みして、改変して動かないなんて事があったのでその点だけは注意が必要かと思います。

#### EventBrdige & Lambda

[Lambda を使用して Amazon EC2 インスタンスを定期的に停止し、起動する方法を教えてください。](https://repost.aws/ja/knowledge-center/start-stop-lambda-eventbridge)

EventBridgeとLambdaを利用するパターン。
こちらもドキュメントを読んで構築していけば簡単に実装できます。

## 総評

とあるAWSアカウントではAWSサービスを組み合わせて自動起動と自動停止が実装されていると話だけ聞いていて。

実際にその設定がどうなっているか確認したら、自分が想定したAWSサービスとは別サービスを組み合わせて実装されていたケースだった事がありました。

そういう事もあるよなって事を感じたのでまとめてみました。
クエリだけでCSVのヘッダーを作る

## よくあるやり方
```sql
SELECT
 name,
 email,
 created_at
FROM
 user;
```
取得後にリストでヘッダーを作成
```
$header = ['名前', 'メールアドレス', '作成日時']; 
$data = $this->dataGet()->toArray(); 
$csvData = array_merge([$header], $data); 
```

## クエリのみでヘッダーを追加する方法
```sql
SELECT
 '名前' as name,
 'メールアドレス' as email,
 '作成日時' as created_at,
 0 as sort

UNION ALL

SELECT
 name,
 email,
 created_at,
 1 as sort
FROM
 user
ORDER BY sort;

 ```

クエリのみで完結させたい場合や、csv用のviewなどを使用する際に便利そうです
アシスタントアプリへの道のり

手元で動くアシスタントを作りたいとぼんやりと長く考えていた
chatGPT-4oが動く精度のコードを吐くので、環境構築を含めて作り始めればよいのではないかと思うに至った
GPTでスタンドアロンで動く環境を壁打ちしていたが、Electronにした
Electronはリリース当初から気に放っていたが、環境構築さえできないポンコツであったのでなかなか触れなかった
しかしGPTによって導入が簡単になり、とりあえずの起動まではすっと終わるようになったため選定した

### 今回の成果物のリポジトリ
https://github.com/pxrllc/imagethinker/tree/master
動きません
必要なもの
・googleカスタム検索API
・googleVisionAPI

#### なしたいことが多い
アシスタントだしアバターを動かしたいと考えていたが、要件を絞るのとアシスタント然とした挙動を作るのに大変な思いをしそうだったのでやめた
代わりに盛り込みたい機能のプロトタイプを作ってみるかと考えた

#### イメージボード作成アシスタント
GPTによって何でも自動化されそうな勢いではある
しかし現代においてまだイメージボードや、アートの指示書を作るのはかなり人間の領域が大きい
プロトタイプ当初は、PintarestAPIをつかって画像検索をしようと思っていたが、触れば触るほどにどう使うのかわからなくて、更に文献もない
諦めてAPIを読むと、画像を取得したりはできないようだ
ボードの管理などに使うための機能と理解した
ピンタレストを活用してイメージボードにほしいリファレンスを集めるつもりだったが、このへんは考えないといけない課題になった

#### もっと細かく考える
イメージボードアシスタントでやりたいこと
・テーマに沿った画像が並んでいる
・ある画像からコンセプトとなるテキストを作成したい
自分の使い方では初期は上記2つが達成できればプロトタイプとしては日常的に使うかもしれないと考えた
キーワードから画像を引っ張ってくるのは、GCPのAPIの無料枠があることを知っていたので、画像検索を使うことににした
使う際にはgoogleカスタム検索が必要ということで申請をした
これはただの画像検索である
検索窓を作って、アプリ上で好きに動かせるようにするところまではできた

#### 選択した画像についての情報をテキストにする
これはgoogleVisionAPIを使うことにした
本当はローカルのLLMを使いたかったのだけど、いろいろと知らないことが起きそうだったため、GCPを使用することにした
これは1日あたり1000件まで使用できるらしい

#### 残念なことがおきた
画像の検索ができ、自由に配置ができるようになった、その中で気になった画像を選択肢してvisionAPIに引き渡せば、というところまでできたが、VisionAPIは課金設定をしないと使えないということがわかった
課金設定をすると少しの時間使えないということになったので、読み込んだ画像を散らすように実装をしようとし始めたところで、Electronのえらーがでて、結局6時間ほどかかったが、ビルドできるところまで復旧したが、結局visionAPIを使う事はできなかった

#### ローカルのjs
ローカルの環境ではファイルの読み書きを含めてかなり自由な権限をもたせる必要がある
そのためにかなり多くの設定があるのだが、そのうちの何処かが失敗しており、今も謎のままだ
リポジトリをおいておくので、興味のある人は見ていただきたい
どこから直したらいいのかわからないので、もう一度ゼロから作るか？と思っている

### 今回の学び
正直動いたのは嬉しかったが、ほとんど自分でコードを書かなかった
GPT-4oの凄さはわかった
ただ自分でコードを書いていないためにどこでなんの処理があるのかを把握する事ができずかなり困った
当初はなぜそれが必要なのかとか、丁寧に読みながら作っていこうとは思っていたのだが、動くのが楽しくてコードベースがかなり複雑になってから、読めなくなったことに気がついた
もとのプロダクトを疎にする必要があるなと思った

### 次にやりたいこと
次はどうやるかは考えている最中だが、異なるフォーマットのスケジュールをぶち込むと一つのガントチャートになるというものにチャレンジしようと思っているどうやってやるのかは考えている最中だ

識者の方、なんで動かないのか教えてもらえると嬉しいです
現状の動かないスクショを貼っておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11300/2eb8339a-9f62-f957-a1dc-0859b39f59d8.png)
functions.jsはあるんだよ

Mac買うか…
SSM Session Managerを使用してPrivate Subnet内のRDSにアクセスする

# 事前準備

1. Private Subnet内にRDSを作成

# 構成図

![ssm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685785/5d95bef2-4c0f-86eb-ee42-06d9eabdf96d.png)

# 手順

## 踏み台用EC2を作成

1. EC2 > インスタンス > インスタンスを起動
    - Amazon マシンイメージ (AMI)
        - Amazon Linux 2023 AMI/Armを選択（SSM AgentがプリインストールされているAMIであればどれでもOK：
        https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ami-preinstalled-agent.html）
    - インスタンスタイプ
        - t4g.nano（適当なタイプでOK）
    - キーペア
        1. 新しいキーペアを作成（既にあれば流用でOK）
            - キーペアのタイプ
                - ED25519
            - プライベートキーファイル形式
                - .pem
        2. ローカルに秘密鍵がダウンロードされるため、`~/.ssh`配下に保存する
        3. Permissionを変更
            - `chmod 400 ~/.ssh/[作成したキーペア秘密鍵]`
    - ネットワーク設定 > 編集
        - VPC
            - RDSが属するVPCを選択
        - サブネット
            - RDSが属するプライベートサブネットを選択
        - ファイアフォール（セキュリティグループ）
            - セキュリティーグループを作成
                - インバウンドのセキュリティーグループを削除（Session Managerからの接続にセキュリティグループの穴あけは不要なため削除する）
    - 高度な詳細
        - IAMインスタンスプロフィール > 新しいインスタンスプロファイルの作成 > ロールを作成
            - 信頼されたエンティティタイプ
              - AWSのサービス
            - サービスまたはユースケース
                - EC2
            - ユースケース
                - EC2 role for EC2 Role for AWS Systems Manager
            - (その他はデフォルトでOK)
2. インスタンスを起動

## VPCエンドポイントを作成

1. VPC > 仮想プライベートクラウド > エンドポイント > エンドポイントを作成
    - **サービスカテゴリ**
        - AWSのサービス
    - サービス
        - com.amazonaws.ap-northeast-1.ssm
        - com.amazonaws.ap-northeast-1.ssmmessages
        ※ 同時には作れないため１つずつ作成
        ※ SSM Agentのバージョンが3.3.40.0よりも古い場合はcom.amazonaws.ap-northeast-1.ec2messagesも必要
    - VPC
        - RDS(EC2)が属するVPCを選択
        - DNS名を有効化にチェック
    - サブネット
        - RDS(EC2)が属するサブネットを選択
    - セキュリティグループ
        - 踏み台EC2からのInbound HTTPS(443)を許可したセキュリティーグループを作成し選択
2. エンドポイントを作成

## AWSマネジメントコンソールからEC2への接続確認

1. EC2 > インスタンス > 作成した踏み台EC2にチェック > 接続
2. 「セッションマネージャー」タブを選択し接続
※ 接続できない場合は[アクセスできない場合の確認ポイント](#アクセスできない場合の確認ポイント)を参照

## ローカルPCからEC2に接続

1. 下記サイトを参考に**Session Manager Plugin**インストール
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html
2. ローカルPCの~/.ssh/configに以下追加
    ```bash
    Host bastion
        HostName [踏み台EC2のインスタンスID]
        User ec2-user
        Port 22
        IdentityFile ~/.ssh/[作成したキーペアの秘密鍵]
        ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
    ```
3. ローカルPCで `ssh bation` を実行し、EC2に接続できることを確認

## SSHポートフォワーディングでRDSに接続

1. 作成した踏み台EC2経由でRDS向けにSSHポートフォワーディングを張る
    ```bash
    ssh -N -L localhost:60000:[RDSのエンドポイント]:[RDSのポート] -C bastion
    ```
2. localhost:60000に適当なDBクライアントソフトでアクセスする

# アクセスできない場合の確認ポイント

- EC2
    - セキュリティグループのアウトバウンドルールで、VPCエンドポイント向けのHTTPS通信が許可されているか確認
    - インスタンスプロファイルに「AmazonSSMManagedInstanceCore」が付与されたロールが設定されているか確認
    - 再起動（SSM Agentは、5 分ごとにクラウド内のSystems Managerサービスを呼び出して、ヘルスチェック情報を提供するため、再起動で強制的にサービスを呼び出す）
- VPCエンドポイント
    - ssm/ssmmessagesがRDS(EC2)の属するサブネットに関連付けられているか確認
    - セキュリティグループのインバウンドルールで、EC2からのHTTPS通信が許可されているか確認
    - プライベートDNSが有効化されているか確認
メモ　jsonで取得した天気情報から抽出する

jsonで取得した天気情報から抽出するシェルスクリプト

```shell:tenki_today.sh
!#/bin/bash

#1
DATE=`date -I`

#2
curl https://weather.tsukumijima.net/api/forecast/city/130010 > ${DATE}.tenki.txt

#3
TODAY_TENKI=`cat ${DATE}.tenki.txt | jq '.forecasts[] | select(.dateLabel=="今日") | .telop' | sed -e 's/"//g'`

#4
echo "今日の天気は"$TODAY_TENKI"です"
```

$chmod +x tenki_today.sh
$./tenki_today.sh

```shell:実行結果
今日の天気は曇時々晴です
```

参考：
https://weather.tsukumijima.net/
https://qiita.com/buntafujikawa/items/a769ebabbdd324ff0d6f
https://qiita.com/banaoh/items/39c7a493cdf7406cd757
Qiskit1.1で挑戦 - 量子コスト導出-

※こちらは[Quantum Challenge 2019](https://github.com/quantum-challenge/2019/blob/master/problems/week1/week1.ipynb)に記載されていた「重要: Unrollerを用いた量子コストの導出」をQiskit1.1で実行したものであり、考え方は[Quantum Challenge 2019](https://github.com/quantum-challenge/2019/blob/master/problems/week1/week1.ipynb)と同じ。


量子回路を評価する方法として以下の手法が存在する。
1. 量子ビット数
2. 深さ：量子計算は量子ゲートと呼ばれる演算を量子状態に適用します。この量子ゲートを適用するためにかかる総時間ステップ数を深さと呼ぶ。
3. 実行速度
4. 命令数

Quantum Challenge 2019では命令数のことをカウントしており、次のように計算で出てくる値をコストと呼ぶ。
コスト＝単一量子ビットゲートの数 ＋ CXゲートの数ｘ10

任意の量子回路を1量子ビットに作用する単一量子ビットゲートと2量子ビットを用いる2量子ビットゲートに分解することによって量子回路のコストを計算します。その際、2量子ビットを扱うCX(CNOT)ゲートにはノイズが乗るため1量子ビットの10倍の重み付けをする。


以下では、実際の回路を組んでコストを計算する。

    import numpy as np
    from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister
    process_fidelity
    qr = QuantumRegister(4, 'q0')
    cr = ClassicalRegister(1, 'c0')
    qc = QuantumCircuit(qr,cr)
    qc.ccx(qr[0], qr[1], qr[2])
    qc.cx(qr[3], qr[1])
    qc.h(qr[3])
    qc.ccx(qr[3], qr[2], qr[1])
    qc.measure(qr[3], cr[0])
    qc.draw('mpl')

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/591077ae-664b-2840-52b6-75427b1f6b8e.png)

    qc.count_ops()
    
OrderedDict([('ccx', 2), ('cx', 1), ('h', 1), ('measure', 1)])

この結果が意味するものは、単一量子ビットゲートとしてアダマールゲートがあり、その他に2量子ビットを扱うcxゲートや3量子ビットを扱うccxゲートがあることを示している。
これを以下のように単一量子ビットゲートと2量子ビットゲートで表してみる。

    qc.decompose().draw('mpl')

回路は下のように分解できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/1aeaff31-9a66-4980-2261-50ec4a7ee227.png)

さらにこの回路のコストを表すと

    qc.decompose().count_ops()

OrderedDict([('cx', 13), ('t', 8), ('tdg', 6), ('h', 4), ('u2', 1), ('measure', 1)])

となる。この結果より、単一量子ビットゲートは19つ、2量子ビットゲートは13つあることがわかる。
よって、上で述べたコスト計算式を用いるとこの回路のコストは 19+13x10=149 になる。

では、次にCCXゲートの回路を作成しコストを考えてみる。

    q = QuantumRegister(3, 'q0')
    c = ClassicalRegister(1, 'c0')
    qc = QuantumCircuit(q, c)
    qc.ccx(q[0], q[1], q[2])
    qc.draw(output='mpl')

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/6bd6dc66-b24e-2718-6d09-ffd0387a9d99.png)

こちらも上と同様に単一量子ビットゲートと2量子ビットゲートで表してみる。

    qc.decompose().draw('mpl')

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/792358c2-ac7e-8047-ff43-aee4eb20e851.png)

そして、回路のコストを表してみる。

    qc.decompose().count_ops()

OrderedDict([('cx', 6), ('t', 4), ('tdg', 3), ('h', 2)])

となり、単一量子ビットゲートは9つ、2量子ビットゲートは6つあることがわかる。
よってこの回路のコストは 9+6x10=69 になる。


参考：
[Quantum Challenge 2019](https://github.com/quantum-challenge/2019/blob/master/problems/week1/week1.ipynb)
[The Quantum Challenge Fall 2020 結果発表
](https://prtimes.jp/main/html/rd/p/000000052.000046783.html)
AWS Lambdaにレイヤーを追加する

## やること

- ローカル環境でlambda関数で使用するライブラリをインストール
- ライブラリをzip化
- lambda関数にレイヤーを設定

## 環境

- lambda
- Python
- Windows(WSL,ubuntu)

## ライブラリを用意

##### lambda関数で使用するライブラリをインストールする。ここではsqlalchemyとしておく。

ローカル環境でvenv仮想環境を構築して、sqlalchemyをインストール。
```shell
python -m venv venv
source venv/bin/activate
pip install sqlalchemy
deactivate
```

ライブラリをzip化
```shell
# 適当なディレクトリにpythonディレクトを作成
mkdir /home/hoge/tmp/python
# 仮想環境でインストールしたライブラリをコピー
cp -r venv/lib /home/hoge/tmp/python/
# zip化
cd /home/hoge/tmp
zip -r layer_content.zip python
```

※ライブラリはこのディレクトリ構成になっている必要がある
- python/lib/python3.x/site-packages (サイトディレクトリ)
- python

##### lambda関数にレイヤーを設定

1. Lambdaコンソールを開く
1. 左側のメニューペインのレイヤーページを開く
1. レイヤーの作成で、先ほど作成したzipファイルをアップロード
1. lamda関数を開き、レイヤーの追加で、作成したレイヤーを追加する


参考：
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/packaging-layers.html
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-layers.html
【VSCode】ターミナルにスティッキースクロールでコマンドを表示する方法

`settings.json` に以下の設定を追記するとターミナルのスティッキースクロールが有効になり、長い出力でも常に上部に現在のコマンドが表示されるようになります。

```json:settings.json
  "terminal.integrated.stickyScroll.enabled": true

```

![スクリーンショット 2024-05-29 23.41.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/92649ca7-f64b-fe7c-acbe-1b265a681354.png)
Firebase Authenticationとgo_router、riverpodで認証状態に応じて画面の遷移を行う

# 挨拶
どうも、ぺんまるです。
最近アプリの個人開発をはじめたので、備忘録のためにこの記事を執筆しました。
正直、状態管理パッケージriverpodやMVCとMVVMなどのアーキテクチャなどよくわかっていないため、そこら辺を重視した備忘録記事も書きたいと思っています。

# この記事の対象者
- Firebase Authenticationの初期設定が済んでいる、実際にサインアップやログインなどを実装している方
- go_routerパッケージで画面の遷移を実装している方
- riverpodの使い方がある程度わかる方


# 目的
個人開発を進めていく上でgo_routerやriverpodライブラリ、firebaseなどを利用していく上でちょっと手間取ったところを備忘録のために執筆しました。

やりたいことは
- アプリ立ち上げ時に画面をアカウントの認証状態(ログインしているか、ログアウトしているか)で画面を切り替えたい。
- ログアウト時にサインアップまたはログインする画面へ遷移させたい。

# 解決方法
今回はfirebaseAuthのインスタンスとログイン状態監視用のauthStateChangesProviderを作成しました。
なぜfirebaseAuthProviderをref.watchしているのかというとStreamProviderでfirebaseAuthの認証状態を監視しています。
認証状態が変更、つまりログインやログアウトが行われると、状態の変更を検知し、authStateChangesProviderを参照している全てのウィジェットが再描画されます。

```dart:auth_provider.dart
// firebaseAuthのインスタンス
final firebaseAuthProvider = Provider<FirebaseAuth>((ref) => FirebaseAuth.instance);

// ログイン状態監視用
final authStateChangesProvider = StreamProvider<User?>((ref) {
  final firebaseAuth = ref.watch(firebaseAuthProvider);
  return firebaseAuth.authStateChanges();
});
```
次にgo_routerでの記述です。

```dart: router.dart
final routerProvider = Provider(
  (ref) {
    final authState = ref.watch(authStateChangesProvider);
    String initialLocation = FirebaseAuthScreen.routePath;
    authState.whenData((user) {
      initialLocation = user != null ? HomeScreen.routePath : FirebaseAuthScreen.routePath;
    });
    return GoRouter(
      initialLocation: initialLocation,
      routes: [
          // 以下略
```
画面はサインアップやログイン画面の`FirebaseAuthScreen`とログイン後に表示する`HomeScreen`を用意します。
routerProviderを作成し、initialLocationに初期ページを設定しますが、そこにさきほどのauthStateChangesProviderを使って認証状態に応じて画面の遷移を行います。
authStateに先ほどのauthStateChangesProviderを監視する変数を代入します。
次にinitialLocation変数を用意します、初期値はFirebaseAuthScreenにします。

そして、whenDataと三項演算子を使って条件分岐をします。
whenDataメソッドはauthStateがAsyncValueオブジェクトなので非同期処理が利用可能になった、つまり、認証状態が取得できた場合により実行されるメソッドです。
条件分岐によりinitialLocationに認証状態によって画面がセットされます。
これにより、アプリ立ち上げ時などに認証状態によって遷移させたい画面を条件分岐させることができます。

また、StreamProviderなのでログイン後もログアウトなどの処理を行うと自動的にFirebaseAuthScreenへ遷移します。
これは参照しているrouterProviderに再描画が実行されるのでもう1度whenDataメソッドが実行されるためですね。

# 終わり
今回はFirebase Authenticationとgo_router、riverpodを使って認証状態に応じて画面の遷移を行いました。
実際はセキュリティの観点などからどうなのかといった疑問点はありますが、学習していく中で随時アップデートをしようと思います。
ここまで読んで頂き、ありがとうございました。

参考にさせていただいた記事さま
- https://torikatsu923.hatenablog.com/entry/2022/08/01/012315
- https://zenn.dev/channel/articles/af4ffd813b1424
チームリーダーをやってみて、チケットの切り方で失敗したなと思ったこと

# 初めてチームリーダーをやってみて、チケットの切り方で失敗したなと思ったこと

現在、エンジニア5人*10月ぐらいの規模のリーダーをやっています。
基本的な仕様は先方が用意してくれますが、実装に落とし込む部分の仕様や設計も担当しています。

特にチケットの作成で失敗したなと思ったことがあったので、まとめておきます。

# 結論: ユーザーストーリーを軸に、機能実装のチケットを用意すればよかった。

実装しながら、設計も行う開発だと頻繁にチケットが更新されます。
この仕様不要になったから、このチケットはいらない。
この仕様が増えたから、今度はこのチケットが必要だ。

そうなって来ると管理するのが、とっても大変でした。

最初に僕が切っていたチケットの例です。
```
ユーザー一覧画面　名前検索機能の実装
```
ただ、この場合、名前だけでなくほかの検索項目も追加されたとします。
その場合、再度チケットを追加します。

```
ユーザー一覧画面　住所検索機能の実装
```
と頻繁に更新していると、どのチケットでどこまで範囲を実装するのかだんだんごっちゃになってきます。
そこで、他の方にチケットが分かりにくいと指摘を受けて、チケットに親子構造を持たせるようにしました。

```
ユーザーを検索できるようにすること
|
- 名前検索
- 住所検索
```
とします。そうして、ユーザーストーリー単位で、実装者に気にかけてもらうようにすれば抜け漏れも少なく変化しても、軸はずれないので把握がし易いです。

初めてからこうすればよかった。
Qiita投稿テンプレート

# 概要
Qiita記事投稿用テンプレートを以下に作りました。
これから記事を書き始める人はファーストステップとして是非使用いただければと思います。

# テンプレート
以下がテンプレートになります、コピーをしてご自身でカスタマイズして使用ください。
```
# タイトル
記事のタイトルをここに入力します

## 概要
この記事の概要を簡潔に説明します。

## 目次
- [はじめに](#はじめに)
- [環境](#環境)
- [手順](#手順)
- [注意点](#注意点)
- [まとめ](#まとめ)

## はじめに
この記事を書く背景や目的について説明します。

## (環境) or (前提条件)
使用したソフトウェアやハードウェアの環境について記載します。

- OS: `例: Ubuntu 20.04`
- 言語: `例: Python 3.8`
- その他: `例: Docker 20.10`

## 手順
具体的な手順をステップバイステップで説明します。

### ステップ1: 環境の設定
最初のステップについて詳しく説明します。

```bash
# 例: 環境構築用のコマンド
sudo apt-get update
sudo apt-get install -y python3
(使用するときは削除)```
```

# 例
以下例になります。

# タイトル
記事のタイトルをここに入力します

## 概要
この記事の概要を簡潔に説明します。

## 目次
- [はじめに](#はじめに)
- [環境](#環境)
- [手順](#手順)
- [注意点](#注意点)
- [まとめ](#まとめ)

## はじめに
この記事を書く背景や目的について説明します。

## (環境) or (前提条件)
使用したソフトウェアやハードウェアの環境について記載します。

- OS: `例: Ubuntu 20.04`
- 言語: `例: Python 3.8`
- その他: `例: Docker 20.10`

## 手順
具体的な手順をステップバイステップで説明します。

### ステップ1: 環境の設定
最初のステップについて詳しく説明します。

```bash
# 例: 環境構築用のコマンド
sudo apt-get update
sudo apt-get install -y python3
PowerShell で日本語が文字化けする

# 概要

Windows11でPowershellを使用している際、Gitのコミットメッセージを日本語で書くと、コミット後にコミットメッセージが文字化けする現象に遭遇しました。

```shell:PowerShell
[main d2fb586] [update] 遨ｺ縺ｮindex.js繧剃ｽ懈・
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 index.js
```

解決方法を探してみたところ、PowerShellの設定の問題だということがわかりました。

本稿では、PowerShell で日本語が文字化けする問題に対する解決方法の一つを紹介します。

# 著者の環境紹介(簡易)

- WindowsOS: Windows 11
- PowerShell: PowerShell 7.4.3
- git version 2.45.1.windows.1

:::note
PowerShellでのバージョンの確認方法
- OS のバージョンとビルド番号：`winver `
- PowerShell のバージョン：`$PSVersionTable`
- Git のバージョン：`git --version`
:::

# 解決方法

## 1. PowerShell の文字コードを確認する

以下のコマンドを実行して、現在の文字コードを確認します。

```shell:PowerShell
[Console]::OutputEncoding
```

以下のような表示になっていたら、今回の方法で修正できる可能性が高いです。

```shell:PowerShell
EncodingName      : Japanese (Shift-JIS)
WebName           : shift_jis
HeaderName        : iso-2022-jp
BodyName          : iso-2022-jp
(etc...)
```

## 2. PowerShell の文字コードを UTF-8 に変更する

 以下のコマンドを実行して、文字コードを UTF-8 に変更します。

```shell:PowerShell
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
```

[1.のコマンド](#1-powershell-の文字コードを確認する)を再度実行し、以下のようになっていれば成功です。

```shell:PowerShell
BodyName          : utf-8
EncodingName      : Unicode (UTF-8)
HeaderName        : utf-8
WebName           : utf-8
(etc...)
```

## 3. Git の設定を確認する

Git を使用する場合、念のため以下の設定になっていることを確認してください。

```shell:PowerShell
git config --global core.quotepath false
git config --global i18n.commitencoding utf-8
```

# 設定を永続化するには

PowerShell の設定は、**一時的な変更**です。
PowerShell を再起動すると、設定は元に戻ります。

PowerShell のプロファイルに[上記のコマンド](#2-powershell-の文字コードを-utf-8-に変更する)を追加することで、
PowerShell 起動時に自動的に文字コードを UTF-8 に設定できます。

# 備考

## プロファイルパスを確認するには

プロファイルパスを確認するには、以下のコマンドを実行してください。

```shell:PowerShell
$PROFILE
```

## プロファイルをエディタで開くには

プロファイルは、エディタで開くことができます。

### 例
Visual Studio Code(以下、VSCode)を使用すると、以下のコマンドで直接開くことができます。

```shell:PowerShell
code $PROFILE
```

他のエディタを使用している場合も、VSCodeと同じような手順でファイルを開けます。
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（77/100）

【77日目】
トピック 8：SAPS/4HANAの製造指図（9/15）

≪問題77≫
作業区、部品表/配合表（BOM）、品目マスタのどこにも、出庫保管場所が見つかりませんでした。製造バージョンから保管場所を誘導できるかどうかは何によって決まりますか。
□MRPプロファイル
□MRP管理者
□プラントパラメータ
□MRPグループ

≪解答≫
□MRPプロファイル
□MRP管理者
□プラントパラメータ
■MRPグループ

≪解説≫
◆製造指図の構成品目ごとに、指図登録時にデフォルトの出庫保管場所を決定することが可能です。この設定により、自動的に出庫転記を行うことができます。
◆デフォルトの出庫保管場所を決定するための複数のオプションが存在しますが、作業区、部品表/配合表（BOM）明細、または品目マスタで保管場所が見つからない場合、製品のMRPグループ設定によって、製造バージョンから出庫保管場所を取得できるかが決まります。
【AtCoder】正規表現の使い方

## ポイント
- 文字のパターン：`[]`内に取り得るパターンの文字を入れる。`[ab]` は `'a'` または `'b'` というパターンを表している
- 文字列のパターン：`()`内に取り得るパターンの文字列を入れて `|` で繋げる。`(abc|def)` は `"abc"` または `"def"` というパターンを表している
- `regex_match`：指定した文字列が、`basic_regex`オブジェクト（正規表現オブジェクト）のパターンと一致しているかの真偽値を返す

```C++
#include <string>
#include <regex>

int main() {
  string s1 = "aAa9";
  std::string s2 = "bBb2";
  std::string s2 = "cCc1";
  
  // basic_regexオブジェクトの定義
  regex re("(aAa|cCc)[1-5]");

  if (regex_match(s1, re)) { ~ } // false
  if (regex_match(s2, re)) { ~ } // false
  if (regex_match(s3, re)) { ~ } // true
}

```

<br>

## 例題１
[ABC277B - Playing Cards Validation](https://atcoder.jp/contests/abc277/tasks/abc277_b)

```C++
#include <bits/stdc++.h>
using namespace std;

bool solve() {
  int N; cin >> N;
  regex re("[HDCS][ATJQK2-9]");
  set<string> st;
  for (int i = 0; i < N; ++i) {
    string S; cin >> S;
    if (st.count(S)) return false;
    if (!regex_match(S, re)) return false;
    
    st.insert(S);
  }
  return true;
}

int main() {
  if (solve()) cout << "Yes" << endl;
  else cout << "No" << endl;
}
```

<br>

## 例題２
[ABC049C - 白昼夢](https://atcoder.jp/contests/abs/tasks/arc065_a?lang=ja)

```C++
#include <bits/stdc++.h>
using namespace std;

int main() {
  string S;
  cin >> S;
  
  regex re("(dream|dreamer|erase|eraser)*");
  if (regex_match(S, re)) cout << "YES" << endl;
  else cout << "NO" << endl;
}
```

<br>

間違いのご指摘や補足などがあれば、コメントいただけると幸いです。
[備忘録] MacOSのセットアップ

# やること

## Apple IDを引き継がない

ユーザ名が任意で指定できなくなってしまうので，セットアップ時はApple IDを使用せずに設定する．

## Homebrewのインストール

Homebrew導入後は基本的にHomebrewを使用してインストールする．
App Storeのアプリケーションは `mas` を使用してインストールする．

https://brew.sh/

## zshのカスタマイズ

以下2つを使用してプロンプトをカスタマイズする．

https://github.com/sorin-ionescu/prezto

https://github.com/romkatv/powerlevel10k

## defaultsコマンド

GUIで設定を変更するのは手間がかかるので，defaultsコマンドを使用して設定する．

※ いつかGitHubにまとめる．
JavaScript のゲームフレームワーク／ゲームエンジンの Phaser を p5.js Web Editor上で使ってみる

ふと JavaScript のゲームフレームワーク／ゲームエンジンを何か試したくなり、有名どころの 1つ [Phaser](https://phaser.io/) を試してみた話です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ce2d06f9-4f85-2d81-da4f-240c5cad349f.png)

それを p5.js Web Editor上で使ってみました（と言っても、p5.js の描画は組み合わさってないですが...）。

## p5.js Web Editor上で Phaser を使ってみる
それでは早速、内容に入っていきます。今回は、p5.js Web Editor でデフォルトで用意されるキャンバスを、Phaser用に流用してみます。

先に、動作させた結果とコードを掲載します。

### 動作させた結果
試した内容は、マウスカーソルに赤色の矩形がついてくるというものです。

https://x.com/youtoy/status/1816107411679424915

### コード
#### HTML
HTML の部分で、Phaser を読みこみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/2aa76a25-85eb-0f78-a22a-467124c7e848.png)

ここでは、CDN から Phaser を読みこんでいますが、有名どころの以下はどちらでも良さそうです。

●phaser - Libraries - cdnjs - The #1 free and open source CDN built to make life easier for developers
　https://cdnjs.com/libraries/phaser

●phaser CDN by jsDelivr - A CDN for npm and GitHub
　https://www.jsdelivr.com/package/npm/phaser

#### JavaScript
JavaScript のコードは以下のとおりです。

```javascript
function setup() {
  const p5Canvas = createCanvas(500, 400);

  const config = {
    type: Phaser.CANVAS,
    width,
    height,
    canvas: p5Canvas.elt,
    scene: {
      create,
    },
  };

  phaserGame = new Phaser.Game(config);

  function create() {
    let graphics = this.add.graphics();

    this.input.on("pointermove", function (pointer) {
      graphics.clear();
      graphics.fillStyle(0xff0000, 0.5);
      graphics.fillRect(pointer.x - 50, pointer.y - 50, 100, 100);
    });
  }
}
```

いくつか補足を書きます。

まず、p5.js のデフォルトのキャンバスを Phaser用に使うために、config の中で以下のように書いています。

```javascript
 canvas: p5Canvas.elt,
```

`p5Canvas` は `const p5Canvas = createCanvas(500, 400);` という指定をしているので、そのままだと p5.js の要素が取得された形になります。それを、HTML の要素にして使うため `.elt` をつけて canvas要素を使うようにしています。

また、Phaser の config で `type: Phaser.CANVAS,` としています。
Phaser のサンプルだと `type: Phaser.AUTO,` が最初の例で出てきますが、その指定ではエラーがでました。p5.js のキャンバスを 2D のものにした場合は、ここを明示的に `type: Phaser.CANVAS,` とする必要があるようです。
（本来は、Phaser.WEBGL にするか、Phaser.CANVAS にするかを、適切なものに自動で切り替えるという挙動が期待されるところなのですが...）

`create()` の中では、マウスカーソルの移動に合わせて赤色の半透明の矩形を描画する処理を書いています。

```javascript
  function create() {
    let graphics = this.add.graphics();

    this.input.on("pointermove", function (pointer) {
      graphics.clear();
      graphics.fillStyle(0xff0000, 0.5);
      graphics.fillRect(pointer.x - 50, pointer.y - 50, 100, 100);
    });
  }
```

この部分は、ChatGPT に依頼をしたら、サクッと作ってくれました。

ここで使われたマウスカーソルを扱うイベント・グラフィックオブジェクトの内容について、公式ドキュメントで説明されているページは以下になるかと思います。

●Phaser.GameObjects.Graphics - Phaser 3 API Documentation
　https://newdocs.phaser.io/docs/3.80.0/Phaser.GameObjects.Graphics

●Phaser.Input.Events.POINTER_MOVE - Phaser 3 API Documentation
　https://newdocs.phaser.io/docs/3.55.1/Phaser.Input.Events.POINTER_MOVE

### 余談
ちなみに、当初は p5.js の処理を混在させようとしたのですが、それはまだうまくできていません。それに関してはもう少々、試行錯誤が必要になりそうです。
みんなに教えてもらって覚えたfetch(JavaScript-Fetch API)

こんにちは。
本日は昨日理解したてほやほやのFetchAPIについて記事を書いていこうと思います。

## コードの確認
```book.json
{"title":"JavaScript入門",
 "price":3000,
 "publisher":"◯◯社"}
```
これはサーバー側に用意されているデータです。
どうやら本のタイトル、値段、出版社の情報が入っていそうですね👀

```fetch.js
fetch('book.json')
    .then(res =>{
        if(res.OK){
            return res.json();
        }
        throw new Error("エラーが発生しました。");
    })
   .then(data => console.log(data.title)) 
   .catch(e => window.alert(`確認してください。${e.message}`));
   ```
こちらではbook.jsonからデータを取得し、成功すればタイトルをコンソールに出力し、
失敗すれば「確認してください。エラーが発生しました。」というアラートを表示します。

## ではひとつずつ見ていきましょう🙌
```fetch.js
fetch('book.json')
```
fetchメソッドでbook.jsonをもってきます
　　
```fetch.js
.then(res =>{
        if(res.OK){
            return res.json();
        }
        throw new Error("エラーが発生しました。");
    })
```
ここで１回目の.thenメソッドが出てきます。
>thenメソッドとはPromiseオブジェクトに渡されたコールバック関数の処理結果を取得するインスタンスメソッドです

と言われても難しいので、一旦スルーして中の処理を見てみましょう。
上記はアロー関数を使用して記述されていますが、アロー関数を使わずに書くと以下のようになります。
　　
```fetch.js
.then(function(res) {
    if (res.ok) {
        return res.json();
    }
    throw new Error("エラーが発生しました。");
})
```
　　
そう、実は「(res =>」のresは無名関数(関数名が特に定義されていない状態)に渡している引数なのです。
resはfetchが返すResponseオブジェクトで、if文の条件(res.ok)はリクエストが成功したことを示しています。
つまりこのif文の前半は、
　　
**もしリクエストが成功したら、json形式でレスポンスを返す**
　　
ということが書かれています。
　　

json形式でレスポンスが返ってくるので、返ってくる値はオブジェクトとして利用できる形式になります。
`{"title":"JavaScript入門"`    →   `{title:" JavaScript入門"`
　　
そして、リクエストが失敗した時の処理は
`throw new Error("エラーが発生しました。");`
new Error(message)で()内の文字列をエラーメッセージとしてもつエラーオブジェクトを作成します。

## だいぶ長くなってしまいましたがここから後半戦です！

```fetch.js
   .then(data => console.log(data.title)) 
   .catch(e => window.alert(`確認してください。${e.message}`));
   ```
前半のthenの処理が成功すると次のthenの処理に、処理失敗してthrowの処理を行った場合はcatchの処理に進みます。
上記の「(data =>」、「(e =>」の部分も先ほど登場した「(res =>」と同様に無名関数の引数として渡されています。
引数として任意のわかりやすい名前をつけているだけなので、極論「(x =>」とかでも動作するということです。

**【リクエストが成功した場合】**
```
.then(data => console.log(data.title)
```
この引数dataには、1つ前のthenの処理の結果が渡されます。
今回の場合はレスポンスをjson形式で取得した下記のオブジェクトですね。
`
{
    title: "JavaScript入門",
    price: 3000,
    publisher: "◯◯社"
}
`
  
つまり、
「リクエストが成功した場合はデータをオブジェクトとして受け取り、その中のタイトルをコンソールに表示する」
という処理をしています。
コンソールには「JavaScript入門」と表示されるはずです。


  
**【リクエストが失敗した場合】**
```
.catch(e => window.alert(`確認してください。${e.message}`));
```
この引数eには、throwの処理の結果が渡されます。
今回の場合はエラーメッセージをもつErrorオブジェクトを作成しましたね。
`throw new Error("エラーが発生しました。");`

つまり、
「リクエストが失敗した場合はErrorオブジェクトを作成し、window.alertメソッドでブラウザにErrorメッセージを表示する」
という処理をしています。
ブラウザのダイアログには「確認してください。エラーが発生しました。」と表示されるはずです。
　　
＊messageプロパティについては別途こちらを読んでみてください！

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Error/message

## まとめ
今回は私がなかなか理解できず、先輩方にたくさん教えてもらってやっと理解できたので忘れないうちにアウトプットしようと思い記事にしてみました。
正しいかはわからないですが、私の中の超簡単にしたイメージは
          
 ```
 fetch(カレーのレシピ)
    .then(材料 =>{
        if(材料があったら){
            return 材料をカット;
        }
        throw (必要な材料をメモする);
    })
   .then(ここにカットされた材料が渡される => 材料を炒めてカレーをつくる) 
   .catch(ここに材料メモが渡される => じゃがいも買ってきて〜😢と伝える);
```
みたいな感じです。
(あくまでも私が覚えやすいかな…？と思ったイメージなのでもっといいものがあったらぜひ教えてください)
かなり長文になってしまいましたが、最後まで読んでいただきありがとうございました🫖
初学者がChatGPTとPythonでインベーダーゲームを作りたい①

# 今回の目標
**1.昔のゲームセンターにあるようなレトロなインベーダーゲームを作成する!!**
**2.Web上でいつでも遊べるようにする**

#### 環境
Python 3.12.x  ←多分現時点(2024/07/24)で最新のもの
ChatGPT4.0

**１番の目標達成のために早速準備！**

Pythonでは、pygameというビデオゲーム製作のために設計されたモジュールがあるので、とりあえずpipを使ってインストール
```
pip install pygame
```
pygameが正常にインストールがされたのを確認できたので、引き続きPythonでのコードを作成していく

**Pythonでとりあえず書いてみた**
```
import pygame
import random

# 初期化
pygame.init()

# 画面サイズ
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("インベーダーゲーム")

# 色の定義
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
RED = (255, 0, 0)

# プレイヤーの設定
player_size = 50
player_x = screen_width // 2
player_y = screen_height - 60

# インベーダーの設定
invader_size = 40
invader_speed = 2
invaders = []

for x in range(0, screen_width, invader_size + 10):
    for y in range(0, 200, invader_size + 10):
        invaders.append(pygame.Rect(x, y, invader_size, invader_size))

# ゲームループ
running = True
clock = pygame.time.Clock()
while running:
    screen.fill(BLACK)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # インベーダーの動き
    for invader in invaders:
        pygame.draw.rect(screen, RED, invader)
        invader.y += invader_speed
        if invader.y > screen_height:
            invaders.remove(invader)
            invaders.append(pygame.Rect(random.randint(0, screen_width - invader_size), 0, invader_size, invader_size))

    # 画面更新
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
```
ChatGPTに添削をしてもらいながら書いてみたが、赤色の四角が縦に流れるだけの動画が完成してしまった...

次回は、もう少しゲームになるように頑張ろ
AtCoder 勉強記録[C++] その30

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## B - Nice Grid
[B - Nice Grid](https://atcoder.jp/contests/abc264/tasks/abc264_b)
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll r, c;
  cin >> r >> c;
  if(max(abs(r-8), abs(c-8)) % 2) cout << "black" << endl;
  else cout << "white" << endl;
}
```
### 解法
`max(abs(R-8),abs(S-8))`を2で割った値が偶数の場合`black`、奇数の場合は`white`を出力する。
## C - Product
[C - Product](https://atcoder.jp/contests/abc233/tasks/abc233_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

ll x,n;
ll res = 0;
vector<vector<ll>> a;
void dfs(ll v, ll mul){
  if(n==v) {
    if(mul==x) res++;
    return;
  }
  for(ll ele:a[v]){
    if(mul>x/ele) continue;
    dfs(v+1,ele*mul);
  }
}

int main() {
  cin >> n >> x;
  a.resize(n);
  for(int i = 0; i < n; i++){
    ll l;
    cin >> l;
    for(int j = 0; j < l;j++){
      ll p;
      cin >> p;
      a[i].push_back(p);
    }
  }
  dfs(0, 1);
  cout << res << endl;
}
```
### 解法
DFSを用いて解いていく。
グラフ以外の問題にDFSを用いる発想がなかったため、覚えておく。
論理演算子「&&」「||」「??」の違い

# はじめに

論理演算子の厳密な定義について、こちらの記事でまとめてみようと思います。
説明する内容は下記の通りです。

```js
// 論理積
const x = A && B

// 論理和
const y = A || B

// null合体演算子
const z = A ?? B
```

# 論理積「&&」

### 式
```js
const x = A && B
```

### 定義
|A|x|定義|
|:-:|:-:|:--|
|true|B|Aがtrue(真値)の場合、Bの判定結果に委ねる|
|false|A|Aがfalse(偽値)の場合、Aの値が返却される|

### 論理値がfalseになる例
* 0
* 空文字列
* false
* null
* undefined

```js
// 定義に基づいた出力例
const x1 = 1 && 2 // A:true, B:true → 2が返却
const x2 = 0 && 2 // A:false, B:true → 0が返却
const x3 = 2 && 0 // A:true, B:false → 0が返却

// falseが混じる出力例
const x4 = "" && "string" // A:false, B:true → ""が返却
const x5 = false && true // A:false, B:true → falseが返却
const x6 = null && "string" // A:false, B:true → nullが返却
const x7 = undefined && "string" // A:false, B:true → undefinedが返却
```

# 論理和「||」

### 式
```js
const x = A || B
```

### 定義

|A|x|定義|
|:-:|:-:|:--|
|true|A|Aがtrue(真値)の場合、Aの値が返却される|
|false|B|Aがfalse(偽値)の場合、Bの判定結果に委ねる|

### 論理値がfalseになる例
* 0
* 空文字列
* false
* null
* undefined

```js
// 定義に基づいた出力例
const x1 = 1 || 2 // A:true, B:true → 1が返却
const x2 = 0 || 2 // A:false, B:true → 2が返却
const x3 = null || 0 // A:false, B:false → 0が返却

// falseが混じる出力例
const x4 = "" || "string" // A:false, B:true → stringが返却
const x5 = false || true // A:false, B:true → trueが返却
const x6 = null || "string" // A:false, B:true → stringが返却
const x7 = undefined || "string" // A:false, B:true → stringが返却
```

# null合体演算子「??」

### 式
```js
const x = A ?? B
```

### 定義

|A|x|定義|
|:-:|:-:|:--|
|true|A|Aがtrue(真値)の場合、Aの値が返却される|
|false|B|Aがfalse(偽値)の場合、Bの判定結果に委ねる|

### 論理値がfalseになる例
* null
* undefined

```js
// 定義に基づいた出力例
const x1 = 1 ?? 2 // A:true, B:true → 1が返却
const x2 = null ?? 2 // A:false, B:true → 2が返却
const x3 = null ?? undefined // A:false, B:false → undefinedが返却

// falseが混じる出力例
const x4 = null ?? "string" // A:false, B:true → stringが返却
const x5 = undefined ?? "string" // A:false, B:true → stringが返却
```

# 最後に

上記より、論理積「&&」と論理和「||」の違いについて、定義が異なっていてfalseになる条件が同じになります。その一方で、論理和「||」とnull合体演算子「??」の違いについては、定義が同じでfalseになる条件が異なります。
PhpStormでコードを実行しようとすると`Cannot run program "/usr/local/bin/docker-compose"`のエラーとなる

## 現象

あるPHPコードを実行しようとすると以下のエラーが発生した。

```
com.intellij.docker.agent.ApiTaskException: com.intellij.execution.process.ProcessNotCreatedException: Cannot run program "/usr/local/bin/docker-compose"
```

## 環境

### OS

```
sw_vers
ProductName:		macOS
ProductVersion:		14.5
BuildVersion:		23F79
```

### Docker

```
docker -v
Docker version 27.0.3, build 7d4bcd8
```

### Docker Desktop

```
Docker Desktop 4.32.0 (157355) is currently the newest version available.
```

## 解決方法

`設定 -> ビルド、実行、デプロイ -> Docker -> ツール` を選択し、`Docker Compose 実行可能ファイル`を`/usr/local/bin/docker-compose`から`/usr/local/bin/docker`へ変更する。
developers summit 2024 summer発表資料メモ

# デブサミ２０２４夏
二日目だけの参加ですが、参加しなかったセッション含めて気になったセッションの資料を拾ってきたので、まとめておきます。
参加してよかったセッションと気になってたセッションのみです。

* 目標設定は好きですか？アジャイルとともに目標と向き合い続ける方法
ScrumBootCampなどのガイドブックシリーズの新刊本の著者の方のセッション
https://speakerdeck.com/kakehashi/do-you-like-target-management

* オーナーシップは誰のものか プロダクトマネージャーに頼らないプロダクトマネジメントへの挑戦
障害とか起きて組織が崩壊した中でエンジニアの枠を超えて意思決定などに介入し、痛みを伴いながら組織を立て直した話
https://speakerdeck.com/onigra/devsumi-2024-summer

* 技術的負債～困難を乗り越える道筋～
DMMの事業責任者の石垣さんと良いコード悪いコードの著者ミノ駆動さんのセッション
  * 石垣さん
https://speakerdeck.com/i35_267/why-do-business-failures-due-to-technical-debt-occur
  * ミノ駆動さんの資料あがったらUPする

* DDDを志して3年経ったら「DDDの皮を被ったクリーンアーキテクチャ」になった話
アーキテクチャとかコードの話だけ気にしてたらそうなりそうだなって思って気になってた話
https://speakerdeck.com/texmeijin/dddwozhi-site3nian-jing-tutara-dddnopi-wobei-tutakurinakitekutiya-ninatutahua-debusami2024xia

* 良いプロダクト作りのための組織育成 ～1on1完全攻略編～
https://speakerdeck.com/ikezoemakoto/developers-summit-2024-summer-liang-ipurodakutozuo-rinotamenozu-zhi-yu-cheng-1on1wan-quan-gong-lue-bian
TypeError: item.trim is not a functionの対処法

初めてtrim()関数を扱ったが、エラーが生じてしまい原因も特定できたので対処法を紹介する。

はじめ、こちらのスクリプトで処理しようとしていた。

```
list = list.map(item => item.trim() === "" ? new Date() : item);
```

空の要素を処理する日付に変える必要があったのでnew Date()に置き換えようとした。しかし、エラーの表示が消えない！


https://mebee.info/2022/10/21/post-82412/

こちらのサイトを見て分かったのだが、trim()関数は配列(Array)の中身が文字列である必要があった。

対して、私の処理する必要がある配列は配列の中に数字が入っていて処理できなかったのである。

なので、数字の文字列を無理やり、文字列に変えてやる以下の方法ともう一つ、その下はmap()関数で置き換えの必要性が生じるすべての要素を書き込み置き換える方法を取った。

```
list = list.map(String);
list = list.map(item => item.trim() === "" ? new Date() : item);
```

```
list = list.map(item => (item === "" || item === " " || item == null) ? new Date() : item);
```

どちらで処理してもいいが、後に文字列になった数字をもとに戻す処理もしなければならないので後者を選択した。

また一つ学びを得た。ということでさいなら。