OmniAICreator/Qiita-1.07M huggingface dataset:
Next.js(App Router) + Zod + PrismaでTODOリストを作りました

# 背景
「React、Next.js」「React Hook Formを使った時と使わなかった時」の開発の違いを体感すべく、それぞれでTODOリストを作ることにしました。

当記事は、Next.js、かつReact Hook Formは使わずに開発します。

GitHubは[こちら](https://github.com/asami-okina/todo-list/tree/main/todo-list-next)

# 1. プロジェクトのセットアップ
```bash
npx create-next-app@latest todo-list-next
cd todo-list-next
```
プロンプトでは以下のように選択してください:

- TypeScript: Yes
- ESLint: Yes
- Tailwind CSS: Yes
- src/ directory: Yes
- App Router: Yes
- Import alias: No

# 2. 必要なパッケージをインストール
```bash
npm install @prisma/client zod
npm install -D prisma
```

# 3. Docker Compose ファイルの作成
プロジェクトのルートにdocker-compose.ymlファイルを作成します。

```txt:docker-compose.yml
version: '3.8'
services:
  db:
    image: postgres:13
    environment:
      POSTGRES_USER: todouser
      POSTGRES_PASSWORD: todopassword
      POSTGRES_DB: todo_db
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:
```

# 4. PostgreSQL の起動
```bash
docker-compose up -d
```

# 5. Prismaの初期化
```bash
npx prisma init
```

# 6. .envファイルを編集
```bash
DATABASE_URL="postgresql://todouser:todopassword@localhost:5432/todo_db?schema=public"
```

# 7. prisma/schema.prismaファイルを編集
```txt:prisma/schema.prisma
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model Todo {
  id        Int      @id @default(autoincrement())
  title     String
  completed Boolean  @default(false)
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}
```

# 8. データベースのマイグレーションを実行
```bash
npx prisma migrate dev --name init
```

# 9. next.config.jsファイルを編集してサーバーアクションを有効化

```js:next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  experimental: {
    serverActions: true,
  },
}

module.exports = nextConfig
```

# 10. コードを書く
[GitHub](https://github.com/asami-okina/todo-list/tree/main/todo-list-next)参照

# 11. アプリケーションの起動
```bash
npm run dev
```

# 補足
開発が終わったら、Dockerコンテナを停止します。
## 1. Dockerコンテナの停止
Dockerコンテナを停止したい場合は、以下のコマンドを使用します。
```bash
docker-compose down
```
## 2. Dockerコンテナの停止して、データを完全に削除したい場合
-vオプションを追加します
```bash
docker-compose down -v
```

# ReactとNext.jsのそれぞれの違い
ReactとNext.jsそれぞれでTodoリストを開発し、両者の違いに深い発見がありました。

#### 1. バックエンドの統合が不要
Reactでアプリを作る際、バックエンドは別途用意する必要がありました。
Express.jsなどでサーバーを立て、APIを実装し、それをReactアプリから呼び出す...という具合です。

Next.jsでは、API RoutesやServer Componentsを使うことで、同じプロジェクト内にフロントエンドとバックエンドのコードを共存させることができます。

バックエンドのお膳立てが不要だから便利だー！！

#### 2. ファイルベースのルーティング
Reactでは、通常 react-router などのライブラリを使ってルーティングを設定します。

Next.jsでは、ファイルシステムに基づいたルーティングが自動的に行われます。
pages/about.js というファイルを作れば、自動的に/aboutというルートが生成されるのです。

これにより、アプリの構造が直感的でわかりやすい！
threadingを使ってもtkinterで固まってしまう

結論から言ってしまうとtkinterではなく僕のthreadingの使い方が間違っていました

# 固まる
tkinterでボタン押下時に固まらないようにthreadingを使ってマルチスレッドにさばくのは有名な話．
以下はボタンを押すとボックスに入力された時間だけ待機し大気中にプログレスバーを動かすプログラム．実行すると関数の処理は走るのだがプログレスバーは動かないしどうにも固まってしまう
```python
import tkinter
from tkinter import ttk
import threading
import time


class Application(tkinter.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()
        self.master.geometry("400x400")
        self.master.title(u"テスト")
        self.create_widgets()
    
    def create_widgets(self):
        self.entry = tkinter.Entry(width=7)
        self.entry.insert(tkinter.END, '10')
        self.entry.place(x=140, y=60)


        self.set_button = tkinter.Button(text=u'セット', width=20)
        self.set_button.bind("<1>", self.call_func)
        self.set_button.place(x=20, y=220)

        self.pb = ttk.Progressbar(root, orient="horizontal", length=200, mode="indeterminate")
        self.pb.place(x=40, y=280)

    def call_func(self, event):
        thread1 = threading.Thread(target=self.func(int(self.entry.get())))
        thread1.start()

    def func(self, t:int):
        self.pb.start(10)
        time.sleep(t)
        self.pb.stop()

if __name__ == "__main__":
    root = tkinter.Tk()
    app = Application(master=root)
    app.mainloop()
```

# 解決策

```python
thread1 = threading.Thread(target=self.func(int(self.entry.get())))
```

どうやら↑これの引数の渡し方が間違いらしい．これでも処理が走ってしまうのでうまくできているように見えるがこれだとメインスレッドで関数が実行されてしまう．

正しい方↓
```python
thread1 = threading.Thread(target=self.func, args=(int(self.entry.get()),))
```
プチ話 中学生がkali linuxはあかん気がする話。

どうもこんにちはAtsu1209です。

# 最近の話
最近フロントエンドからセキュリティ分野に勉強の角度を変えているのですが、
セキュリティを学ぶうえでどうしても"ハッキング"というワードが出てきてしまいます。
そこである言葉にたどり付きました。"ハッキングの手口を知る"
手口を知るとなると、やはりおなじみの `kali-linux`が出てきます。
そこで一つ思ったんですね。

「中学生がやったらあかんやろ。」

まあ自分はコンソールとかめちゃくちゃ苦手なので、Linuxとコンソール勉強も兼ねて
セキュリティの勉強もしていきたいと思います

###### 以上
Flutterの基礎をまとめてみた（２）

![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929117/80a01506-ebd3-ac14-4f10-306434ddb46c.png)

# Dartってなに？ - Flutterで使われる言語について

Flutterで使うのがDart（ダート）というプログラミング言葉です。Dartはとても簡単で覚えやすく、楽しくアプリを作るために作られた言葉です。ここでは、Dartの特徴を3つに分けて説明して、その後で基本の使い方を見ていきましょう。

## 1. シンプルで使いやすい言葉
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929117/88636a1d-945e-6fc9-09a1-c31da39f4222.png" alt="985.png" width="300"/>



Dartはプログラミングを初めてやる人にもわかりやすく作られています。

- **短い時間で覚えられる**：Dartは難しい文法が少ないので、初めての人でもすぐに学べます。そして、すぐにアプリ作りを始めることができます。
- **コードが読みやすい**：Dartは書いたプログラムが読みやすいように作られています。他の人が見ても理解しやすいので、友達と一緒に作る時も便利です。
- **間違いをすぐに見つけられる**：Dartには、間違いを見つけたときにすぐ教えてくれる機能があります。これで、早く直してどんどん進めることができます。

## 2. 速くアプリを作れる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929117/b8d58f24-5139-a138-9329-1d5485385967.png" alt="985.png" width="300"/>

Dartを使うと、アプリを作るのが速くできます。

- **ホットリロード**：DartとFlutterを使うと、「ホットリロード」という機能で、少しコードを変えるだけですぐに結果を見られます。これで、何度も作り直さなくてもいいのでとても時間の節約になります。
- **効率的な作り方**：Dartには、コードを速く実行できる工夫がされているので、スムーズに作り続けられます。

## 3. いろんなデバイスで速く動く
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929117/a48e4457-0000-fc97-f1eb-005196ec9d45.jpeg" alt="985.png" width="300"/>


Dartで作ったアプリは、スマートフォンやタブレットなどいろんなデバイスで速く動きます。

- **ネイティブコードに変換**：Dartは、AndroidやiOSのようないろいろな機械に合わせて、速く動くようにコードを変えてくれます。
- **軽くて速い**：Dartのコードはシンプルで軽いので、どのデバイスでもスムーズに動きます。

## Dartの基本的な使い方

ここからは、Dartの基本の使い方を見てみましょう。Dartは、ほかのプログラミング言語と似た部分が多くて、簡単に理解できます。

### 1. 変数の宣言
Dartでは、何かを入れる箱のことを「変数」といいます。変数を作るときは、`var`という言葉を使います。

```dart
var name = 'Flutter';
int age = 5;
double height = 1.75;
```
nameは自動でString型と判断され、ageは整数、heightは小数です。

### 2. 関数の定義
Dartでは、関数を以下のように定義します。
```dart
void greet() {
  print('Hello, Dart!');
}

int add(int a, int b) {
  return a + b;
}
```
greetという関数は「Hello, Dart!」と表示するだけで、何も返さない（void型）。
addという関数は2つの数字を足して、その答えを返します。

### 3. 条件分け
状況に応じて違うことをしたい時は、ifやelseを使います。
```dart
int age = 20;

if (age >= 18) {
  print('大人です');
} else {
  print('子供です');
}
```
ここでは、ageが18以上の時「大人です」と表示し、そうでなければ「子供です」と表示します。
### 4. 繰り返し
同じことを何回もやりたい時は、forやwhileというループを使います。
```dart
for (int i = 0; i < 5; i++) {
  print('Hello $i');
}

int j = 0;
while (j < 3) {
  print('Number $j');
  j++;
}

```
forループは0から4まで数えて、その間「Hello 0」から「Hello 4」までを表示します。
whileループはjが3未満の間、「Number 0」から「Number 2」までを表示します。


## まとめ
Dartは、簡単で覚えやすいプログラミングの言葉です。
いろんな命令が分かりやすく書けるので、初心者でもすぐにアプリを作り始めることができます。
Flutterと一緒に使うと、楽しくてかっこいいアプリを早く作れるのがDartのいいところです。

次回はFlutterの新規プロジェクトを作成すると自動生成されるカウンターアプリについて見ていきましょう。
https://qiita.com/jin112343/items/f0b552ee8734d7c8d1dd
やっとS3のブロックパブリックアクセスの４オプションの違いを理解した

# ブロックパブリックアクセスの４オプションって何？
これこれ！

静的サイト設定時に「ブロックパブリックアクセス」をオフにしてねって言われたのですが、そもそもその四つのチェックって何？、とずっと気になりました。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/3ebb5c35-6355-758c-07f9-81f330b4f8f4.png)

# ４オプションは
### BlockPublicAcls
説明：バケットやオブジェクトレベルで「パブリックACL」を適用することを禁止します。

影響：新規または既存のオブジェクトにパブリックACLが追加されても、そのACLは無視されます。

使用シナリオ：特定のバケットやオブジェクトが意図せずに「パブリックアクセス」を持たないようにしたい場合。

### IgnorePublicAcls
説明：すでに設定されているパブリックACLを無視します。

影響：バケットまたはオブジェクトにパブリックACLが設定されていても、パブリックアクセスはできません（無視されます）。

使用シナリオ：バケットやオブジェクトに設定されたすべてのパブリックACLを無効化し、IAMポリシーやバケットポリシーのみでアクセス制御を行いたい場合。

### BlockPublicPolicy
説明：パブリックアクセスを許可するバケットポリシーが設定されるのを防ぎます。

影響：IAMポリシーやバケットポリシーで「Principal: *」などのパブリックアクセスを含むポリシーが適用できません。

使用シナリオ：バケットポリシーにおいて、誤ってパブリックアクセスが許可されるのを防ぎたい場合。

### RestrictPublicBuckets
説明：バケットポリシーでのパブリックアクセスの制限に加え、AWSアカウント単位でパブリックアクセスを制限します。

影響：バケットが誤ってパブリックアクセスを持つことを防ぎ、特に異なるアカウントからのパブリックアクセスを制限します。

使用シナリオ：バケットへのアクセスを、特定のアカウントや内部ユーザーにのみ制限したい場合。

# もっと整理すると
| 設定 | 目的 | 影響 |
|:-|:-|:-|
|BlockPublicAcls|パブリックACLの追加を禁止 |パブリックACLを適用できず、結果としてパブリックアクセスが許可されません。|
|IgnorePublicAcls|パブリックACLを無視|設定済みのパブリックACLが無視され、IAMやバケットポリシーでのみ制御します。|
|BlockPublicPolicy|パブリックポリシーの設定を禁止|バケットポリシーでのパブリックアクセス（「Principal: *」など）が無効化されます。|
|RestrictPublicBuckets|バケットアクセスを内部アカウントに限定|バケットのパブリックアクセスが完全に制限され、他のアカウントからのアクセスも制限されます。|

AWSの公式ドキュメント上、似たような説明ばっかりで理解しづらかったが、ChatGTPとかを併用しながら、何とか理解できた～

# 参考サイト
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/access-control-block-public-access.html
Dockerで、localhost同士が通信できない件の解決

最近のGithubリポジトリは、両方まとめて作ってる人多いと思うんですが
```
Repo
┣ frontend
┗ backend
```
昔は Javascriptの `Repo` とサーバーサイドの `Repo` は
別々に作ってましたよね？

で、コンテナを立てる時に、`Repo` が別になってると
別々のネットワークで立ち上がるじゃないですか？

Backend
http://localhost:8080
Frontend
http://localhost:8081

別々のコンテナ起動した時 `fetch` しようかな〜
って思う時に通信できないですよね。

### 失敗例

```javascript
const res = fetch('http://localhost:8080/get-data')
```
多分 `504 gateway timeout` になって
「あれ〜通信できないな〜APIが止まってるのかな〜？」みたいに
思うかもですが、実はコンテナの中で閉じた通信をしてるっていう。

# 解決策
```
http://host.docker.internal:8080
```

ローカルの `Docker Desktop` には、共通の `localhost` ネットワークがある。
これを使えば `network` の設定書かなくても通信できます。
FXのAPIを取り込んで検証するコード（事前準備）

OANDAFXからAPIを取得し、検証をするためのコードを備忘録として残します。
正直に言うと、powershellの使い方がよく分かっていないので、今後書き直すかも…
powershellからjupyter notebookを起動するところまでになります。

```ruby:qiita.rb
cd -
```
cdでjupyterの存在するフォルダに移動します。

```ruby:qiita.rb
.\Scripts\activate
```
jupyter labを有効化し、

```ruby:qiita.rb
jupyter lab
```
このコードで起動します。
これかjupyter labからAPIを取得して検証していきます。

![スクリーンショット 2024-08-07 191752.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3797074/dd53cae5-9437-bdb4-4067-da41db79cb27.png)
【Spring Boot入門】#6 登録情報詳細画面を作成する

## はじめに
自身の知識のアウトプットも兼ねて、新人研修用に作成した記事となります。Spring Bootを学び始めた方を対象とした内容になっています。

ID検索機能の作成については、前回の記事を参照ください。

https://qiita.com/ioaio/items/ce9eb5fc732f830b9ca7

## 概要
企業情報一覧画面から「詳細」リンクを押下すると、特定の企業に関する詳細情報が表示されるようにします。

#### 完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917178/9c347075-ff8d-935e-7f61-65a51f8b71c9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917178/228a08bf-6cf7-bbae-980a-75ea0f572bbf.png)

## パッケージ構成
赤枠で囲ったHTMLファイルを今回作成していきます。また、青枠で囲ったクラスを編集していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917178/291b76c1-d885-5425-6c46-d044a16e070c.png)

## Controllerクラスの修正
CompanyController.javaに登録済み企業の詳細情報を表示するメソッドを追加します。

`配置先：src > main > java > com > example > demo > controller > CompanyController.java`

```java:CompanyController
@Controller
public class CompanyController {
	
	// 企業情報の詳細を表示
	@GetMapping("company/detail/{id}")
	public String detailCompany(@PathVariable Long id, Model model) {
		model.addAttribute("company", companyService.getCompanyById(id).orElse(null));
		return "detail";
	}
}
```
#### @￰GetMapping("company/detail/{id}")
`GET`リクエストで `/company/detail/{id}` のURLへアクセスした時にこのメソッドが実行されます。`{id}` はプレースホルダで、URLに含まれる企業IDがここに入ります。

#### @￰PathVariable
このアノテーションは、HTTPリクエストのURLから動的な値を取得するために使用されます。ここでは、`@￰PathVariable`を使うことで、URLの `{id}` の部分を `id` パラメータとして取得します。

## Viewの作成
detail.htmlを作成します。
ここでは、コントローラから渡されたcompanyオブジェクトの情報を表示しています。
`配置先：src > main > resources > templates > detail.html`

```html:detail.html
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>詳細画面</title>
</head>
<body>
	<h1>企業情報詳細画面</h1>
	  <p>ID: <span th:text="${company.companyId}">ID</span></p>
	  <p>会社名: <span th:text="${company.name}">Name</span></p>
	  <p>従業員数: <span th:text="${company.employees}">Number of employees</span></p>
	  <p>設立日: <span th:text="${company.establishmentDate}">Establishment Date</span></p>
      <a th:href="@{/company/lists}">一覧画面へ戻る</a>
</body>
</html>
```

#### 詳細リンクの修正
index.htmlを修正します。
「詳細」リンクにダミーリンクを設定していたのを、`detail.html` に遷移できるように修正します。
`配置先：src > main > resources > templates > index.html`

```html:index.html
            <td>
                <!-- ここを修正 -->
                <a th:href="@{/company/detail/{id}(id=${company.companyId})}">詳細</a>
                <!-- 一旦ダミーリンクを設定 -->
                <a th:href="@{#}">編集</a>
                <a th:href="@{#}">削除</a>
            </td>
```
#### URLのプレースホルダ
`/company/detail/{id}` の `{id}` はプレースホルダであり、特定の企業IDを動的に挿入する位置です。ここでは、`companyId` の値がここに代入され、詳細ページへのリンクを生成します。

#### パラメータ指定
`(id=${company.companyId})` により、`{id}` プレースホルダに`company.companyId` の値を挿入します。

`${company.companyId}` は、コントローラから渡された`company`オブジェクトの `companyId` を参照しており、Thymeleafが動的にリンクを生成します。

たとえば、`company.companyId` が `1` の場合、生成されるリンクは次のようになります。
```html:html
<a href="/company/detail/1">詳細</a>
```

次回は更新機能を実装していきます。

## 参考サイト
https://terasolunaorg.github.io/guideline/current/ja/ArchitectureInDetail/WebApplicationDetail/Thymeleaf.html#id15

https://kanda-it-school-kensyu.com/java-spring-contents/sb_ch04/sb_0406/
配列並び替え

```ts
interface Item {
  itemA: number;
  itemB: string;
  itemC: string;
}

// ソート条件を基に要素を挿入する関数
function insertSorted(arr: Item[], newItem: Item): void {
  let index = 0;
  
  while (
    index < arr.length &&
    (arr[index].itemA < newItem.itemA ||
      (arr[index].itemA === newItem.itemA && arr[index].itemB < newItem.itemB) ||
      (arr[index].itemA === newItem.itemA && arr[index].itemB === newItem.itemB && arr[index].itemC < newItem.itemC))
  ) {
    index++;
  }
  
  arr.splice(index, 0, newItem);
}

// 2つのオブジェクト配列を作成
const array1: Item[] = [
  { itemA: 2, itemB: 'b', itemC: 'z' },
  { itemA: 1, itemB: 'a', itemC: 'x' },
  { itemA: 2, itemB: 'a', itemC: 'y' },
];

const array2: Item[] = [
  { itemA: 1, itemB: 'b', itemC: 'y' },
  { itemA: 3, itemB: 'a', itemC: 'x' },
  { itemA: 1, itemB: 'a', itemC: 'z' },
];

// 結果用の配列を作成し、array1とarray2の要素を挿入
const sortedArray: Item[] = [];
for (const item of array1) {
  insertSorted(sortedArray, item);
}

for (const item of array2) {
  insertSorted(sortedArray, item);
}

console.log(sortedArray);
```
Slurm を Docker から試せる Slurm Docker Cluster

## はじめに

SlurmはHPC環境で広く使われているジョブ管理システム（ジョブスケジューラー）である。

https://sc.megabank.tohoku.ac.jp/ph3-doc/howto/jobscheduler/overview.html

しかし、複数のノードを用意するのは敷居が高い。Raspberry Pi などを用いて物理的にクラスタを作成することもできるかもしれないがもっと気軽にシュッと試してみたい。Dockerで簡単にできないか。

## Slurm Docker Cluster

探してみるとやっぱりあった。
docker compose を使って簡単にSlurmを試してみることができる。

https://github.com/giovtorres/slurm-docker-cluster

プロクシ環境下で実行するためには、Dockerfileの設定を書き換える必要があるかも([#58](https://github.com/giovtorres/slurm-docker-cluster/issues/58))

### イメージのビルド

```
docker compose build
```

### 起動

```
docker compose up
```

### Bashに入る

```
docker exec -it slurmctld bash
```

### コンテナ

| コンテナ   | 説明                                                        |
|------------|-------------------------------------------------------------|
| mysql      | ジョブとクラスターのデータを保存します。                     |
| slurmdbd   | Slurmデータベースを管理します。                              |
| slurmctld  | ジョブやリソース管理を担当するSlurmコントローラーです。        |
| c1, c2     | 計算ノード（slurmdが実行されています）。                     |

### 永続ボリューム

| ボリューム       | マウント先               |
|------------------|--------------------------|
| etc_munge        | `/etc/munge`             |
| etc_slurm        | `/etc/slurm`             |
| slurm_jobdir     | `/data`                  |
| var_lib_mysql    | `/var/lib/mysql`         |
| var_log_slurm    | `/var/log/slurm`         |

## 個人的にやったこと

[NextflowがSlurmで実行できる](https://www.nextflow.io/docs/latest/executor.html#slurm)ことを確認した。

この記事は以上です。
PythonのFastAPIを使ってDockerコンテナを構築してみた

# はじめに
AWSのECSの動作確認用に任意のポート番号のコンテナが必要となり、PythonのFastAPIを使ってDockerコンテナを構築してみました。実務では、コンテナイメージをECRにpushして使用しました。

当時、@kikutch と作業した際の内容を改良しました。

# 準備

```sh:作業ディレクトリを作成
mkdir fastapi_app
cd fastapi_app
```

```sh:ファイルの配置
.
└── fastapi_app
    ├── Dockerfile
    └── main.py
```

### ファイル作成
```dockerfile:Dockerfile
# ベースイメージとしてPython 3.11の軽量バージョンを使用
FROM python:3.11.3-slim-buster

# 作業ディレクトリを指定
WORKDIR /usr/src/app

# FastAPIとUvicornのインストール
# キャッシュを利用するため、依存関係インストールを先に実行
RUN pip install --no-cache-dir fastapi uvicorn[standard]

# 必要なPythonプログラムをコンテナにコピー
COPY ./main.py ./main.py

# ビルド時にポート番号を指定できるようにARGを定義し、デフォルトを8000に設定
ARG PORT=8000
# EXPOSEで指定したポートもARGの値に従う
EXPOSE ${PORT}

# アプリケーションをUvicornで実行し、CMDで指定したポートに従う
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "${PORT}"]

```

```python:main.py
from fastapi import FastAPI
from fastapi.responses import JSONResponse

# FastAPIアプリケーションのインスタンスを作成
app = FastAPI()

# ルートエンドポイント "/" に対する非同期処理を定義
@app.get("/", response_class=JSONResponse)
async def greeting():
    """
    シンプルなJSONレスポンスを返す関数。
    `response_class=JSONResponse`を指定してパフォーマンス向上。
    """
    # JSON形式のレスポンスを返す
    return {"greeting": "Hello"}
```

# コンテナ起動
`--build-arg PORT=8080` で、任意のポート番号に変更できます。

```sh:コンテナ
# Dockerイメージをビルドし、タグ名を "fastapi_app" に設定
# --build-arg PORT=8080 でビルド時に使用するポート番号を指定
docker build -t fastapi_app --build-arg PORT=8080 .

# Dockerコンテナをバックグラウンドで起動
# -p 8080:8080 でホストの8080番ポートをコンテナの8080番ポートにマッピング
# fastapi_app イメージからコンテナを作成して起動
docker run -d -p 8080:8080 fastapi_app
```

# 動作確認
```sh:
curl http://localhost:8080

# MacOSの場合
open http://localhost:8080
```


# FastAPIのAPIドキュメントの確認
![スクリーンショット 2024-11-06 18.58.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682035/0ec93c33-2a9f-6ef8-1581-1d55d8628b9f.png)

```sh:FastAPI
# MacOSの場合
open http://localhost:8080/docs

# それ以外は下記のURLをブラウザ表示する
http://localhost:8080/docs
```

# クリーンアップ
```sh:コンテナ
# 1. fastapi_app のコンテナを停止
# fastapi_appイメージを使用しているすべてのコンテナを停止
docker ps -q --filter ancestor=fastapi_app | xargs -r docker stop

# 2. fastapi_app のコンテナを削除
# 停止した fastapi_appイメージを使用しているコンテナを削除
docker ps -a -q --filter ancestor=fastapi_app | xargs -r docker rm

# 3. fastapi_app イメージを削除
# fastapi_app のイメージ自体を削除
docker rmi fastapi_app
```

```sh:作業ディレクトリを削除
cd ..
rm -rf fastapi_app
```
配列並び替え

```ts
interface Item {
  itemA: number;
  itemB: string;
  itemC: string;
}

// 2つのオブジェクト配列を作成
const array1: Item[] = [
  { itemA: 2, itemB: 'b', itemC: 'z' },
  { itemA: 1, itemB: 'a', itemC: 'x' },
  { itemA: 2, itemB: 'a', itemC: 'y' },
];

const array2: Item[] = [
  { itemA: 1, itemB: 'b', itemC: 'y' },
  { itemA: 3, itemB: 'a', itemC: 'x' },
  { itemA: 1, itemB: 'a', itemC: 'z' },
];

// 配列を結合
const combinedArray: Item[] = [...array1, ...array2];

// itemA順、itemB順、itemC順に並べ替え
combinedArray.sort((a, b) => {
  if (a.itemA !== b.itemA) {
    return a.itemA - b.itemA;
  }
  if (a.itemB !== b.itemB) {
    return a.itemB.localeCompare(b.itemB);
  }
  return a.itemC.localeCompare(b.itemC);
});

console.log(combinedArray);
```
【C言語】関数

## 関数
**用途 : 処理をまとめる**

- 宣言(プロトタイプ宣言)
```C
戻り値の型 関数名(引数);
```

- 定義
```C
戻り値の型 関数名 (引数)
{
    処理
}
```

- 呼び出し
```C
関数名(引数);
```
※引数がある場合、関数定義と一致する引数を渡してあげる

プログラミング言語が提供する関数群のことを**標準ライブラリ関数**という

### 引数
**引数**とは関数を実行する際に、関数に渡す値のこと。
引数は ,(カンマ)で区切っていくつでも作成可能。
関数の引数がない場合、型 関数名 **(void)** を推奨する。
※C#では、引数にvoidを入れる必要はない

- **仮引数**
関数の宣言及び定義で使用される引数のこと
- **実引数**
関数の呼び出し時に使われる引数のこと

※実引数に指定した値をコピーして関数内で利用する

### 戻り値(返り値)
関数の処理が終わった結果を返すために、**戻り値(返り値)** が用いられる。
しかし、関数内で処理が完結する場合、関数の型を**void**にする必要がある。

```C
int Plus(int a, int b)
{
    // 足し算の結果を返す
    return a + b;
}

void None(void)
{
    // 戻り値必要なし
}
```

### スコープ
{}の間を**スコープ**(変数や関数などが有効な範囲)
また、関数のスコープ内で宣言した変数を**ローカル変数**
逆に、全てのスコープ外で宣言した変数を**グローバル変数**(非推奨)

## ラムダ式(匿名関数)
### C++11以上
**用途 : C++の標準ライブラリ関数に用いられる**

```C++
[値渡し、参照渡しする場所(キャプチャ)](引数) -> 戻り値の型 { 処理 }
```

※キャプチャした場合、関数 -> 関数オブジェクトに

- thisポインタのキャプチャ
値渡し : [=]
※C++20以上は、`[=, this]`が推奨となる
参照渡し : [&]

### C#版
**用途 : LINQ、イベントハンドラ**
```C#
(引数) => { 処理 }
```

## 再帰関数
**用途 : 木構造などの階層構造を持つデータやバックトラッキングの解決**
ex)階乗やフィボナッチ数列、二分探索など

**再帰関数**とは、作成した関数の中で**自分自身を呼び出す関数**

### 例
```C:階乗.c
#include <stdio.h>

/// <summary>
/// 階乗
/// </summary>
/// <param name="N">求める数</param>
/// <returns>1以下 : 終了、それ以外 : 続行</returns>
int Factorial(int N)
{
	// 終了条件
	if (N <= 1) return N;

	// 続行
	return N * Factorial(N - 1);
}

int main(void)
{
	// 入力
	int N = 0;
	printf("整数値を入力してください\n");
	scanf_s("%d", &N);

	// 出力
	printf("%dまでの階乗: %d\n", N, Factorial(N));

	return 0;
}
```

```C:フィボナッチ数列.c
#include<stdio.h>

/// <summary>
/// フィボナッチ数列
/// </summary>
/// <param name="N">求める数</param>
/// <returns>1以下 : 終了、それ以外 : 続行</returns>
int Fibonacci(int N)
{
	// 終了条件
	if (N <= 1) return N;

	// 続行
	return Fibonacci(N - 1) + Fibonacci(N - 2);
}

int main(void)
{
	//フィボナッチ数の計算
	int N = 数字;
	printf("%dまでのフィボナッチ数は%d\n", N, Fibonacci(N));

	return 0;
}
```

### 動的計画法
**用途 : 計算の省略**

**動的計画法**とは、問題を小さなもの(部分問題)に分割し、
再帰処理の中で同じ部分問題が出た場合、解を再利用する(**メモ化**)こと。

```C:フィボナッチ数列.c
#include <stdio.h>

/// <summary>
/// フィボナッチ数列
/// </summary>
/// <param name="N">求める数</param>
/// <param name="memo">再利用する解</param>
/// <returns>1以下 : 終了、それ以外 : 続行</returns>
int Fibonacci(int N, int memo[])
{
    // 終了条件
    if (N <= 1) return N;

    // 解の再利用
    if (memo[N] != -1) return memo[N];

    // 再利用可能にしてから続行
    memo[N] = Fibonacci(N - 1, memo) + Fibonacci(N - 2, memo);
    return memo[N];
}

int main(void)
{
    // 初期化
    int N = 10;
    int memo[10 + 1];
    for (int i = 0; i <= N; i++)
    {
        memo[i] = -1;
    }

    // 出力
    printf("%dまでのフィボナッチ数は%d\n", N, Fibonacci(N, memo));

    return 0;
}
```
Aurora MySQLのバージョンと監査ログのローテーションルールについて

## 結論
#### ファイルサイズによるローテーション
* いずれのバージョンも100MBごとにローテーションされる
#### 時間によるローテーション
* Aurora MySQL 3.03.0: 時間によるローテーションは行われない
* Aurora MySQL 3.04.0: 1 時間ごとにローテーションされる
* Aurora MySQL 3.05.2: 1 時間ごとにローテーションされる
* 他バージョン：未検証

## きっかけ
Auroraの監査ログのCW出力費用が高い！！！
CW出力をやめてS3へ出力する方法を検討するために、まずは監査ログの仕様について調査を行った。
公式ドキュメントには以下の通り記載が。
> 監査ログは、各 Aurora MySQL DB インスタンスのローカルストレージに個別に保存されます。各インスタンスは、一度に 4 つのログファイルに書き込みを分散します。ログファイルの最大サイズは 100 MB です。この設定不可能な制限に達すると、Aurora はファイルを回転し、新しいファイルを生成します。
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Auditing.html

実機確認したところ、以下の通り1時間ごとにファイルがローテーションされているように見える...。
<img width="1024" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927225/12fb14e0-aa98-35e8-ac3d-dccee977e182.png">


## 調査

DBに負荷をかけて監査ログをたくさん出してもらったところ、公式ドキュメント通り100MBでローテーションされている。
<img width="1024" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927225/32ef2652-b223-c957-32da-05360e07024d.png">

DBクラスターパラメータグループなど調査してみたが結局分からず、こちらの状況と調査結果をもとに素直にAWSへ問い合わせした。
その結果AWS側で検証していただき、「監査ログのローテーションのルールは、バージョンにより差異があることが確認できました。」とのこと。

問い合わせの結論としては以下の通り
#### ファイルサイズによるローテーション
* いずれのバージョンも100MBごとにローテーションされる
#### 時間によるローテーション
* バージョンにより差異がある

時間によるローテーションの差分確認を実施したところ以下の通りだった。
※MySQL3.03.0は2024/11/07時点でEOLのため作成できなくなっている
* Aurora MySQL 3.03.0: 時間によるローテーションは行われない
* Aurora MySQL 3.04.0: 1 時間ごとにローテーションされる
* Aurora MySQL 3.05.2: 1 時間ごとにローテーションされる

以上より冒頭の結論へと至る。

今後公式ドキュメントの記載が修正されるのか、ローテーション動作が修正されるのか、どちらの対応を取るのかはAWS次第だが、次回はどちらに転んでもS3へ監査ログを出力できるような仕組みを考える。
Tips #015 特定の条件を満たしたリストのアイテムについてだけ承認フローを飛ばしたいゾ（前編）

https://qiita.com/Novskiiiiiiiiii/items/4aa3025968a926e13ee0

古来より人類は、Microsoft ListsとPower Automateを使って申請と承認を自動化したいな、と願っていた。
　
　
![スクリーンショット 2024-11-07 112351.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/5759f2c2-f2c8-8386-b54c-a155023bf470.png)
　

ここにこういうリストがあるものとする。
　
何かしらの申請と承認を自動化する場合、
「特定の条件を満たしたアイテムだけPower Automateで処理したい」
という衝動に駆られてやまない。
 　
かくいう私もその一人だ。
　
流れとしては以下のようなストーリーを想定している。

 
 
    ・ 「未申請」かつ「未承認」かつ承認者に承認ユーザーの情報が入っている場合のみ、
    　 承認者に設定された承認ユーザーに承認フローを実行する。
    　
    ・　承認依状態を「未申請」から「申請済み」に更新する。
    　
    ・　承認者が承認したら、承認ステータスを「未承認」から「承認済」にする。
    　
    ※承認済になったアイテムを後続システムに連携するという処理については、今回は割愛する。

 
　
ではさっそくPower Automateで設定していこう。
　
　
１．まずトリガーに関してだが、10分おきにリストのアイテムをチェックする
　　というスケジュール式にしたい。
　
![スクリーンショット 2024-11-07 114215.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/bca0c347-c092-b629-299c-92a85709e9df.png)
　

適当にフロー名を付けて作成ボタンを押そう。
大いなる一歩を踏み出す実感が持てるはずだ。
　
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/5db6f7b0-280f-183c-6792-7243693c6a48.png)
　
　
２．続いてアクションの追加をしよう。
　
 Microsoft Listsコネクタがない場合は、SharePointコネクタから
 「複数の項目の取得」を選択すれば大丈夫だ。
　
  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/707bdb64-57be-b6f4-bdc4-f723350c1b1e.png)
　

３．この時点ではまだどのリストかを特定出来ていないので、パラメータ設定で
　　サイトのアドレスとリスト名を入力していこう。
  （大人の事情でマスキングしている、かたじけない）
　
　
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/5bab9606-1206-0f49-8adf-f0d8a3f75ce7.png)
　

これでどのリストをPower Automateが見に行けばいいかを指定できた。
次に条件の設定だ。
　
　
４．フィルタークエリに条件を入れていこう。

　　パラメータ設定の下の部分の「すべてを表示」をクリックすると、
 　　いろいろな設定が出来そうな雰囲気が醸し出されているゾ。
　　臆せず前に進もう。心を燃やすのだ。

  　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/70a8af0f-da9d-0ce9-6f3f-2b2425900454.png)

　
 
　ここのフィルタークエリに条件を指定していく。

     shonin_status eq '未承認' and shinsei_status eq '未申請' and shonin_user ne null

 
例えばこんな感じだ。

承認ステータスが「未承認」かつ申請ステータスが「未申請」かつ「承認ユーザーがNullでない」
という条件を指定している。

カラム名はリストのアイテムの各フィールドの内部名となっている。
リストで項目を追加するときに英語名でまず設定するのはこのためだ。

　
eq　や　ne　などの演算子については、Copilotなどに聞くと親切に教えてくれる。

 
    Power Automateで使用できるフィルタークエリの演算子は以下の通りです：
    eq: 等しい
    ne: 等しくない
    gt: より大きい
    lt: より小さい
    ge: 以上
    le: 以下
    and: かつ
    or: または
    startswith: 指定した値で始まる
    endswith: 指定した値で終わる
    contains: 含む

 
　ここまで設定すると「条件を満たしたアイテムを１つあるいは複数取得した」状態になる。

　取得したアイテムの中身を確認するにはデバッグで確認するのが良いと思うが、
　それはまた別のTipsとして記述しようと思う。　

　後半では取得した複数のアイテムについて順番に承認フローを走らせるという部分を設定していくゾ。
　Power Automateの醍醐味の一つとも言える「For Each」ループだ。

　日本語にすると「それぞれに適用する」という機能になるが、これをマスターすると
　Power Automateでの自動化のバリエーションが格段にひろがってもっと面白くなるハズだ。
　

それでは後半でまた会おう。

https://qiita.com/Novskiiiiiiiiii/items/772732191e9ce4f57875
UE5 3D空間上の WidgetBlueprint を手前に表示させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/fc9847cf-5351-0d3d-df1d-238748bc7dd2.png)

作成したWBPをComponentで追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/4ae197fc-6551-c915-a1bd-4736404dfec1.png)

UserInterface

手前に表示
SpaceをScreenに変更

Draw at Desired Size
同じサイズで描画


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/ccb80a60-8c71-193a-7bee-4601fe895f7e.png)

上記の設定をすると下の文字のような感じで表示される

距離によって表示非表示
<iframe src="https://blueprintue.com/render/-e_csp3_/" scrolling="no" allowfullscreen></iframe>
https://blueprintue.com/blueprint/-e_csp3_/
新卒が5ヶ月働いて感じた良かった習慣

## はじめに:seedling:
　私が大好きな作品で「人間の最大の武器は習慣と信頼だ」というようなセリフがある。
 そして社会人になってより習慣と信頼の大切さに気付いた為、
 今年度新卒として入社し約5か月間働いて、感じた自分の良い習慣について記事にしようと思う。
 

 ## 私が思った私の良い習慣
 　私がよかったと思う習慣は「ノートに手書きでメモを取ること」である。
良い習慣だと思った経緯は、行き詰った時、同じような事象を前にメモしたことを思い出し、ぱらぱらノートを見れば対策が書いてあった。
ノートに書いたことで、同じような事象があったことを思い出せた上に対策まで載っており、すぐに対応できた。「なんでもノートに書く習慣があってよかった。」というような経験を社会人になってからもしたことがあったからだ。

## 手書きノートの活用:pencil:
 　作業全体のタスク・自分のタスク・思ったこと・報告すること・わからなかったこと・調べたこと・現状など大体なんでもノートにとっている。
　 手書きノートのメリットとしては、
  「すぐに記入できる」
  「図や表が書きやすい」
  「視覚的にわかりやすい」
 「使う文具でモチベを上げられる」の4つがある。
 これらのメリットと私がどのようにノートを使うかを紹介する。

### 1.すぐに記入できる
　このメリットは、主にわからない単語が出てきたときに活躍する。会議中でも資料作成時でも知らない単語が出てくる、けど今すぐには調べられない！という時にささっとノートへメモができる。
　とくに会議のメモ等もノートにとっている私は、すぐにメモができるし、いつ聞いた単語なのか他の単語との関連性も記すことができる。

### 2.図や表が書きやすい
　文章だけでメモしても端折りすぎて分からなくなることや、メモに気を取られて話に置いて行かれることがある。図や表を書くのは、会議中のメモにとても便利だ。
　 会議中は口頭のみで伝えられる情報もあり、どんどん進む中、図や表で表現すると時短にわかりやすくまとめられる。そしてメモ程度の図ならば手書きノートが書きやすい！

  ### 3.視覚的にわかりやすい
  　これとても便利。前の話題について後から追加情報来た時に矢印で繋げて関連してることを書くなど、重要度や関連性を上下左右斜めを活用し放題でかけるのが手書きノートのすごく良いところだ。ついでに囲ったり記号をつければ目に留まるように工夫できる。

### 4.使う文具でモチベを上げられる
　機能面・デザイン面・サイズ・カラー…文房具は様々な種類があるので自分に合ったものを探しやすく、モチベーションもあげられるだろう。
 おすすめノートは、Campusコクヨそふとリング(B6)。リングノートで開きやすく、軟らかいリングなのでノートの端まで書きやすい。切り取り線付きで簡単・きれいに切り離して渡したり貼ったりできる。:smirk_cat:

 ### 5.私のメモを取るポイント
 ①日付を書く
 　いつ書いたものなのかわかるようにする。時間もたまに書く。いつから作業しているかが残っていると自分の程度が分かったりする。ほかにもいろいろ便利。
 ②記号の意味を固定する
 　後で調べるものには(?)・優先度の高いタスクには◎など、記号とその意味を固定で使うと後で見返しても分かりやすいくメモの時短になる。
  ③仕事中に使うノートは1冊
  　タスクも自分のメモも全部一冊にしている。見返すのが楽ということと、使い切りやすく達成感が得やすい。
④ちょっとだけ気持ちも書く:speak_no_evil:
　タスクを書いて横に小さく「ちょっとめんどくさそう」「これ面白い」とかなんでも思ったことをたまに書いている。自分の苦手・得意が分かりやすかったり、意外と後で使えたりする。ちょっとストレス発散にもなあるし、見返したときに面白い。

## まとめ
自由度が高く記憶に残りやすい。
手書きのメモをノートにとることが、私にはとても合っていた。:v:
長々とした文章をお読みいただきありがとうございました。

 

 【記事を書いて:pizza::bear:】
 　本当は「これアドベントカレンダーに書こ」と思いメモ帳に書いていたものがあったが、改めて外向けの文章に起こすのは無理だったので断念した。ちゃんと理解しきれてなかったことが理由だと思うので来年はいい感じに書けるように、頑張りたい...:full_moon_with_face:
【ChatGPT】ウェブ検索は入力枠からしか行なわない。


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

　今回は、ウェブ検索は入力枠からしか行なわないのだとわかりましたので、その報告です。

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

　OpenAIが、
　　Webドメイン「chat.com」を買収。

　ChatGPTに
　　飛ぶようにしました。
　[ITmediaNEWS](https://www.itmedia.co.jp/news/spv/2411/07/news110.html)
***
　さて、本題です。

　今回は、
　　ウェブ検索は
　　　入力枠からしか
　　　　行なわないことについてです。

　ウェブ検索は
　　Webアイコンをタップして
　　　モードを切り替えます。

　質問すれば、
　　ウェブ検索して
　　　回答を出力してくれます。

　ここまでは
　　いいのですが、
　　　今回、たまたま質問を
　　　　編集して送信したら
　　　　　ウェブ検索しませんでした。

　　　回答は、ChatGPTの知識から
　　　　もたらされました。

　どうやら
　　入力枠からの入力のみを
　　　ウェブ検索の対象にしている
　　　　そんな感じですね。

　OpenAIでは
　　ウェブ検索用に
　　　モデルを調整して
　　　　SearchGPTとして
　　　　　一時期提供していました。

　それが
　　“ChatGPT Search”として
　　　統合されたわけです。

　その統合の仕方が
　　ウェブ検索モードでの
　　　入力枠に対してのみの
　　　　ものになっているのです。

　そのセッション全体が
　　ウェブ検索モデルの範疇だと
　　　思い込んでいましたので、
　　　　これは驚きました。

　みなさんも
　　ご注意ください。

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

　今回は、ここまで。
Python 101: プログラミング初心者が知っておくべき5つの重要な概念

### Python 101: プログラミング初心者が知っておくべき5つの重要な概念

Pythonは初心者から上級者まで幅広いレベルで人気のあるプログラミング言語ですが、効率的に学ぶためには基礎となるいくつかの重要な概念を理解する必要があります。この記事では、Python初心者や中級者が特にミスしやすい、押さえておくべき5つの重要な概念を解説します。

---

### 目次
1. イントロダクション
2. ミュータブルとイミュータブル
3. リスト内包表記
4. 引数とパラメータ
5. `__name__ == "__main__"`の使い方
6. GIL（グローバルインタプリターロック）
7. まとめ
8. 参考文献

---

## 1. イントロダクション

Pythonで効率よくコードを書くためには、特定の基本概念を理解しておく必要があります。特にプロダクションコードを読んだり、自分でコードを再現する場面では、理解度が鍵となります。ここでは、開発者がPythonコードを自在に読み書きし、他の開発者とも共有できるようになるための基礎を解説していきます。

## 2. ミュータブル（mutable）とイミュータブル（immutable）

### ミュータブルとイミュータブルの違い
- **イミュータブル**（変更不可）な型：変更ができないデータ型です。例えば、`int`、`float`、`str`、`tuple` などがイミュータブルに該当します。
- **ミュータブル**（変更可能）な型：変更が可能なデータ型で、リスト（`list`）、セット（`set`）、辞書（`dict`）などが含まれます。

#### 例
```python
# イミュータブルなタプル
x = (1, 2, 3)
x[0] = 10  # エラーが発生（変更不可）

# ミュータブルなリスト
y = [1, 2, 3]
y[0] = 10  # 変更可能
```

イミュータブルな型の変数は新しい値を代入することでのみ変更できますが、ミュータブルな型の変数では、リストなどの要素を直接変更できます。

## 3. リスト内包表記

### リスト内包表記の利点
リスト内包表記（リストコンプリヘンション）は、短いコードでリストを生成できる便利な方法です。特にリストの内容を簡単に変換したい場合に有効です。

#### 例
```python
# 基本のリスト内包表記
numbers = [i for i in range(10)]  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 条件付きのリスト内包表記
even_numbers = [i for i in range(10) if i % 2 == 0]  # [0, 2, 4, 6, 8]
```

リスト内包表記を活用することで、コードが簡潔で読みやすくなります。

## 4. 引数とパラメータ

### Pythonの引数とパラメータの種類
Pythonには、以下のような異なる引数とパラメータの指定方法があります。
- **必須パラメータ**：関数呼び出し時に必ず値を渡す必要がある引数。
- **デフォルト値付きパラメータ**：関数呼び出し時に引数が指定されなかった場合にデフォルト値が使用されます。
- **可変長引数**（`*args`）：任意の個数の位置引数をタプルとして受け取ります。
- **キーワード引数**（`**kwargs`）：任意の個数のキーワード引数を辞書として受け取ります。

#### 例
```python
def example_function(x, y=10, *args, **kwargs):
    print("x:", x)
    print("y:", y)
    print("args:", args)
    print("kwargs:", kwargs)

example_function(1, 2, 3, 4, key="value")
```

## 5. `__name__ == "__main__"`の使い方

この構文は、スクリプトが直接実行された場合のみ特定のコードを実行するために使用されます。モジュールとしてインポートされた場合には、`__name__`の値はモジュール名になりますが、直接実行された場合には`"__main__"`となります。

#### 例
```python
# sample.py
def main():
    print("This is the main function.")

if __name__ == "__main__":
    main()
```

他のスクリプトから`sample.py`をインポートした場合、`main()`は実行されませんが、`sample.py`を直接実行すると`main()`が実行されます。

## 6. GIL（グローバルインタプリターロック）

GIL（Global Interpreter Lock）は、Pythonがスレッドを使用する際の制約で、同時に1つのスレッドしか実行できないようにするロックです。これはPythonの並列処理を制約し、多くのCPUコアを持つ環境であっても、Pythonスレッドを使用したコードが単一コアでしか実行されないことを意味します。

### 例：GILの影響
CPU集約型の処理では、マルチスレッドよりもマルチプロセスの方が有効です。GILの影響を受けないようにするために、Pythonでは`multiprocessing`モジュールを使った並列処理が推奨されます。

## 7. まとめ

Pythonを使いこなすために、まずはミュータブルとイミュータブルの違いやリスト内包表記、引数とパラメータの使い分け、`__name__ == "__main__"`の構文、そしてGILについて理解することが重要です。これらの概念を押さえることで、Pythonコードの書き方や読み方が向上し、効率的で理解しやすいコードを書く力が身につきます。

---

### 参考文献

1. Python Documentation: [https://docs.python.org/3/](https://docs.python.org/3/)
2. Real Python - Python Basics: [https://realpython.com/](https://realpython.com/)
3. Stack Overflow - Python GIL: [https://stackoverflow.com/questions/tagged/python-gil](https://stackoverflow.com/questions/tagged/python-gil)
Python 101: 知っておくべき10の重要な概念

### Python 101: 知っておくべき10の重要な概念

Pythonの基礎を学ぶ上で、押さえておくべき重要な概念を10個にまとめました。これらの概念を理解することで、Pythonプログラムの効率的なコード作成や読み取りが可能になります。

---

### 目次
1. はじめに
2. ファイル作成と変数の定義
3. データ型の基本
4. 型アノテーション
5. 定数の使い方
6. 関数の定義とパラメータ
7. クラスの基本
8. メソッドとselfの使い方
9. Dunderメソッドの活用
10. まとめと参考文献

---

## 1. はじめに

Pythonは初心者から上級者まで幅広く使われるプログラミング言語です。本記事では、Pythonプログラムを始めるために知っておくべき10の基本概念を解説します。

## 2. ファイル作成と変数の定義

- Pythonファイルは、`.py`拡張子を付けて作成し、Pythonインタプリタで実行されます。
- 変数は、`変数名 = 値` の形で定義され、再利用が容易です。たとえば、`name = "Bob"`、`age = 20` のように定義し、`print(name, age)`で出力します。

## 3. データ型の基本

Pythonの基本的なデータ型には以下があります：
- **整数**（int）：`20`
- **浮動小数点数**（float）：`3.14`
- **文字列**（str）：`"Hello"`
- **ブール値**（bool）：`True` または `False`
- **リスト**（list）：可変で任意の要素を保持可能
- **タプル**（tuple）：不変で一度設定すると変更できない
- **セット**（set）：重複なしの要素を保持
- **辞書**（dict）：キーと値のペア

## 4. 型アノテーション

Pythonでは型アノテーションを使用して、変数や関数のデータ型を明示できます。型アノテーションはプログラムの実行には影響しませんが、コードの可読性を向上させ、間違いを事前に発見しやすくします。

```python
name: str = "Bob"
age: int = 20
```

## 5. 定数の使い方

Pythonでは正式な定数はありませんが、すべて大文字で名前を付けることで定数を示す慣習があります。型アノテーションを使い、`typing`モジュールの`Final`を利用することで、定数であることを明示できます。

```python
from typing import Final

PI: Final[float] = 3.1415
```

## 6. 関数の定義とパラメータ

関数を使うことで、コードの再利用性が向上します。Pythonの関数は`def`キーワードで定義され、パラメータや返り値に型アノテーションを加えることで、より明確なコードになります。

```python
def greet(name: str) -> None:
    print(f"Hello, {name}")

def add(a: float, b: float) -> float:
    return a + b
```

## 7. クラスの基本

クラスはオブジェクト指向プログラミングの基本で、コードの再利用や構造化に役立ちます。Pythonでは`class`キーワードでクラスを定義し、`__init__`メソッドでインスタンス変数を初期化します。

```python
class Car:
    def __init__(self, brand: str, horsepower: int) -> None:
        self.brand = brand
        self.horsepower = horsepower
```

## 8. メソッドとselfの使い方

メソッドはクラス内に定義された関数であり、`self`キーワードを使ってインスタンスにアクセスします。

```python
class Car:
    def __init__(self, brand: str, horsepower: int) -> None:
        self.brand = brand
        self.horsepower = horsepower

    def drive(self) -> None:
        print(f"{self.brand} is driving")
```

## 9. Dunderメソッドの活用

Dunderメソッド（特殊メソッド）は、`__str__`や`__add__`など、特定の動作を定義するためのメソッドです。たとえば、`__str__`を定義すると、オブジェクトを文字列として出力する際の挙動が決まります。

```python
class Car:
    def __init__(self, brand: str, horsepower: int) -> None:
        self.brand = brand
        self.horsepower = horsepower

    def __str__(self) -> str:
        return f"{self.brand} ({self.horsepower} HP)"
```

## 10. まとめと参考文献

Pythonプログラムを書く上で、これらの概念を理解することは不可欠です。Pythonの公式ドキュメントや他のリソースも活用し、各概念をより深く学びましょう。

---

### 参考文献

1. Python公式ドキュメント: [https://docs.python.org/3/](https://docs.python.org/3/)
2. Real Python - Python Basics: [https://realpython.com/](https://realpython.com/)
3. Stack Overflow - Python Tips: [https://stackoverflow.com/](https://stackoverflow.com/)
Googleカレンダーの祝日　七五三の表示にギリギリでもその日が来るまでに対応する

# 前回の記事

https://qiita.com/ajt_yaiyai/items/6780a2c6c16539df3ca2

分からず色々と手探りで対応していた結果、
とりあえず埋め込み方法の変更すれば表記は消せそうなので追加記事です。
アプリ版はたぶん関係なさそうかもですね・・😓 
なので上の記事は別に見なくてもいいです。

# 対応として

Google公式のカスタマイズでの埋め込みでは今のところ、
「祝日およびその他の休日」のカレンダーでの埋め込みになってしまうので、
それを使わずにカレンダーの公開URL箇所をそれぞれ入れることで反映しなおしました。
カスタマイズでダメなら直接カレンダーのURLとステータスを入れて反映しちゃおうってことですね。

# やるべき埋め込み用のURL発行と修正方法
HP埋め込み用で使うURLは、カレンダーの公開URLのところです。

この辺りのURLですね、カスタマイズでの発行はURLが変換されて反映されないです（グーグル側のセキュリティ予防策？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399121/fa989e3c-9c46-a7e3-dee8-f04986aeee78.png)

https://calendar.google.com/calendar/embed?src=ja.japanese%23holiday%40group.v.calendar.google.com&ctz=Asia%2FTokyo
のところを
https://calendar.google.com/calendar/embed?src=ja.japanese.official%23holiday%40group.v.calendar.google.com&ctz=Asia%2FTokyo
に変更しましょう（src=ja.japaneseの箇所をsrc=ja.japanese.officialに変更）

HPなどに埋め込む場合はiframeから始まる埋め込みコードを利用します。 


その他、表示させたいカレンダーがある場合は、
そのIDを「&src=カレンダーID」あるいは「src=カレンダーID&」でつなげて表記させましょう。（URLのステータス変更による表示修正）

例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399121/479aff0a-e9c0-a36f-6cde-5be7d1f79224.png)

この部分のURLですね
src=177d9ed3298a63cfaeb811f3e410241721a52120c20fc7b6fed0b5b3bfb4f3b4%40group.calendar.google.com

カレンダーの左下のタイトルは、最初にsrcを入れたものになります。
他のステータス変更箇所はよくわかってないのですが、
カスタマイズのもの参考にすれば変更できそう？ （カスタマイズでの発行URLには&showPrint=0とかありますからね）

---

追記（20241204）
カスタマイズURLについては例えばカレンダーの埋め込み時の色変えをしたい場合は、末尾に&color=%なんちゃらを入れると良さそう。
2回記述するのは、複数カレンダーがある場合それぞれに反映させるためで、多くなるごとに追加する必要あるかも。

&color=%23D50000&color=%23D50000

---


とりあえず参考用で作成したものはこちらです。
https://calendar.google.com/calendar/u/0/embed?src=177d9ed3298a63cfaeb811f3e410241721a52120c20fc7b6fed0b5b3bfb4f3b4%40group.calendar.google.com&src=ja.japanese.official%23holiday@group.v.calendar.google.com&ctz=Asia/Tokyo&color=%23D50000&color=%23D50000

ifrmaeだとこうですね。

    <iframe src="https://calendar.google.com/calendar/u/0/embed?src=177d9ed3298a63cfaeb811f3e410241721a52120c20fc7b6fed0b5b3bfb4f3b4%40group.calendar.google.com&src=ja.japanese.official%23holiday@group.v.calendar.google.com&ctz=Asia/Tokyo&color=%23D50000&color=%23D50000" style="border:solid 1px #777" width="800" height="600" frameborder="0" scrolling="no" title="calendar"></iframe>

# 解決？
ということでカスタマイズ利用せずにURLをちょこちょこ変更して対応しましょう。
こんな作業がたくさんありそうなんですが一週間で果たして作業は間に合うのか。
全然わからない・・自分は雰囲気でGoogleの機能を利用している。



# 参考

[GAS] カレンダーの「祝日のみ」と「祝日およびその他の休日」

https://qiita.com/sakaimo/items/0a0a31697dd821e775cd#chrome%E3%81%AE%E8%A8%80%E8%AA%9E%E8%A8%AD%E5%AE%9A%E3%81%AB%E3%82%88%E3%82%8B%E9%81%95%E3%81%84
Flutterの基礎をまとめてみた（１）

# Flutterってなに？ 
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929117/5871ab9e-fb65-3de4-7b24-6faabd324eff.png)


## Flutter（フラッター）ってどんなもの？
Flutterは「フラッター」と読み、Google（グーグル）が作った便利なツールです。このツールを使うと、1回だけアプリを作れば、スマホやタブレット、パソコンでも同じアプリを動かすことができます。例えば、1枚の絵を描くだけで、いろんな画面にその絵が表示できる感じです！

Flutterを使うと、たくさんのプログラムを書く手間が減って、いろんな機械で動くアプリを一気に作れるます。

### マルチプラットフォーム対応って？
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929117/a6e54559-ca8d-2899-c874-6d0f3f7d1be3.jpeg" width="300">


Flutterのすごいところは、1つのコードでいろんなプラットフォーム（スマホやタブレット、パソコンなど）でアプリが動くところです。

たとえば、通常はiPhoneとAndroidで別々に作らないといけないのに、Flutterを使うと1回だけ作るだけで両方で使える。1つのレゴでいろんなおもちゃが作れるようなものです！

### ウィジェットってなに？
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929117/77f72729-d347-bf89-99e8-efdb5cd7f799.png" width="300">

Flutterの世界では「ウィジェット」という小さな部品がたくさん集まってアプリが作られています。ウィジェットっていうのは、ボタンや文字、絵など、アプリを作る部品のことだよ。まるでレゴのパーツみたいにいろんな形のウィジェットを組み合わせて、楽しいアプリをデザインします。

- **StatelessWidget**（ステートレスウィジェット）: いつも同じ形の部品。動かないラベルとかボタンとかがこれにあたる。
- **StatefulWidget**（ステートフルウィジェット）: 時々変わる部品。カウンターが数字を変えるみたいに、変化するウィジェットがこにあたる。

### ホットリロードって？
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929117/f397cdfd-a930-9b69-e84d-c29578d387d4.png" width="300">

Flutterでは「ホットリロード」という、作ったものをすぐに見れる魔法みたいな機能があります。例えば、絵を描いているときに、すぐに「おお！こうなったんだ！」って見られるとワクワクしませんか？それと同じように、Flutterでアプリを作ると、コードを少し変えるだけで、その変化がすぐにアプリに反映されます！

これのおかげで「どんな風にできてるかな？」とすぐに見られるから、アプリを作るのがもっと楽しくなります。

## まとめ
Flutterは、「いろんな機械で動くアプリを1つ作る」「レゴみたいな部品でデザインする」「作ったものがすぐに見れる」という3つのすごい力を持ったツール。Flutterを使うと、アイデアを形にするのがもっと楽しくて速くなる！

次回はDartとは？
https://qiita.com/jin112343/items/b8bf2f8c07927c476362
React(use-sound)で音を鳴らした後に処理を走らす

# あらまし

Nextで開発していたWEBアプリ上で、音を鳴らした後に処理をしたい事案があったが、日本語でドンピシャなサンプルが無かったので残しておく。使うのはuse-sound。

## やりたいこと

特定の処理が走った際に、成功音や失敗音を鳴らしてから処理を走らせて再描画なり画面遷移なりをしたい。

## 使用技術
- React ^18
- use-sound: 4.0.3

## シンプルな例

stateやcallback関数外に依存がない、複雑なことをしない、そんな場合は[こちらのサイト](https://dev.classmethod.jp/articles/playing-a-sound-in-the-react-app-use-sound-part-2/)にある通り、useSoundを使う際に `onend` に関数を渡してあげればよい。

```tsx

import se from "./se.mp3"

...(中略)...

const [play] = useSound(se, {
  onend: () => {
    console.log('再生完了')
  }
})

```

一方で、一連の処理の中でstateを使ったりしながら、例えばPayPayなりWAONのようにキャッチーな音を鳴らした後にほげほげしたいみたいなことがあったときに、上の方法だと正しく動かない。

例えば以下のような場合は、onendの関数内でuserは`null`となる。

```tsx

import se from "./se.mp3"

...(中略)...

const [user,setUser] = useState<User|null>(null)
const [play] = useSound(se, {
  onend: () => {
    console.log(user)
  }
})

...略...

const handler = (user: User) => {
    setState(user)
    play();
}

```

## 解決

use-soundはHowler.jsをラップしているので、そちらから実装する。

まずは公式のドキュメントにあるように、型を入れておく。

```sh
yarn add -D @types/howler
or
npm i -D @types/howler
```

その上で、hookを呼び出す際にHowlオブジェクトを受け取り、イベントリスナを登録してあげる。このあたりの詳細は[ドキュメント](https://github.com/goldfire/howler.js#options)を参照。

```tsx
const [user,setUser] = useState<User|null>(null)
const [play, {sound}] = useSound(se)

...略...

const handler = (user: User) => {
    sound?.once("end", async () => {
        //再生終了後に呼ばれる
        doSomePostProcess(user)
    });

    //音を鳴らす前の何らかの処理
    doSomePreProcess(user)
    //鳴らす
    play();
}
```

以上で、やりたいことが実現できた🍻
HTML dialogについて

## dialogについて
dialogの説明をシたほうがよいといわれたので、やりますよ〜！（コメント欄でこのログの存在を初めて知った。コメントシてくれたかたありがとうございますm(__)m）
では解説に入りましょう！


`<dialog>` 要素は、HTML5で新しく追加されたタグで、**モーダルダイアログ（ポップアップウィンドウ）**を簡単に作るために使います。モーダルダイアログとは、表示されている間は他の部分が操作できなくなるウィンドウのことです。

### どういうときに使うのか？
- **確認ダイアログ**: 「本当に削除しますか？」と聞くポップアップ。
- **入力フォーム**: ユーザーから情報を入力してもらうフォームをポップアップで表示。
- **メッセージ表示**: ユーザーに何か重要なメッセージを伝えるポップアップ。

### 基本の使い方
1. `<dialog>` タグでダイアログを定義。
2. `open` 属性を使うと、そのダイアログが表示される。
3. JavaScriptで `show()` や `showModal()` メソッドを使ってダイアログを表示したり、`close()` メソッドで閉じたりする。

### 例
```html
<!-- ダイアログの内容 -->
<dialog id="myDialog">
  <p>これはモーダルダイアログです。</p>
  <button onclick="document.getElementById('myDialog').close()">閉じる</button>
</dialog>

<!-- ダイアログを開くボタン -->
<button onclick="document.getElementById('myDialog').showModal()">ダイアログを開く</button>
```

### 解説
- `<dialog>`: ダイアログの内容を囲むタグ。
- `showModal()`: ダイアログを表示するメソッド。モーダル（他の操作をブロック）で表示される。
- `close()`: ダイアログを閉じるメソッド。

### どうして便利？
- **シンプル**: モーダルダイアログを作るために、複雑なコードや外部ライブラリは不要。
- **アクセシビリティ**: スクリーンリーダー（視覚障害者向けツール）が適切に認識してくれるので、より多くの人に使いやすい。
- **標準**: ほとんどの最新ブラウザでサポートされている。

### 注意点
- **古いブラウザ**ではサポートされていないこともあるので、その場合は別の方法やポリフィル（動作を補うコード）が必要。まじで最近!

### まとめ
`<dialog>` は、Webページで簡単にポップアップウィンドウを作成するためのHTMLタグです。モーダルダイアログを簡単に扱えるようになり、ユーザーとのインタラクションをシンプルに実装できます。


## 今回は真面目系でした。m(__)m
pythonの優先度付きキューは要注意

:::note alert
これは数学知識があまりない中１が書いた記事なので計算量などの試算が間違ってる場合があります
間違っていたらコメントしてください
:::

# この記事を書いた経緯
ある日、atcoderの優先度付きキューを使う過去問を解いていたら、間違えてbisect.insort使って提出したらTLEしてしまい、その後他の人の解法をみたらsortedcontainers.SortedList(以下SortedList)を使ってました
でSortedListを使う方法でコードを書き直したらACしました
bisect.insortでTLEした問題

https://atcoder.jp/contests/abc241/tasks/abc241_d

そんでもって優先度付きキューの注意点を書きます

# heapq
一番ポピュラーな優先度付きキューですね
使い方(n番煎じ)
* heapq.heapqify() リストをソートして初期化
* heapq.heapqpush() 要素を挿入
* heapq.heapqpop() 最小値を取り出す

基本これ使ってたら、問題ないんですが、筆者はおっちょこちょいなのでいつもリストに直でappendしてしまい何度かバグないか、10分ぐらい探すことが多々ありますw
まあ注意して使えば問題ないんですけどね

# bisect.insort
こいつが問題児です
使い方
* bisect.insort() 昇順を保ったまま要素を挿入

bisectは便利ですが使い方を間違えるととんでもない目に会います
具体的に挿入時、計算量が$O(N + log N)$みたいな感じになります
例えば$Q$回繰り返すとき、計算量は、先程の式が正しければ分配法則で展開すると$O(QN+(log N)Q)$になります つまり$Q$が$10^5$ぐらいあったら普通にTLEしますね
おそらく内部でリストのinsertメソッドが使わているからでしょう

# SortedList
sortedcontainersは標準にしても全然いいと思います
使い方
* A = SortedList() 定義
* A.add() 要素を挿入
* A.bisect_left() 左側の挿入点を返してくれる
* A.bisect_right() 右側の挿入点を返してくれる

特に要素を削除する必要がない場合はSortedListを使ったほうが利便性が高いと思います

# 最後に
結局　筆者の経験談でしたねw
まあ誰かのお役に立てれば幸いです
少々手を抜いたら思わぬエラーで余計に時間がかかってしまいました。

**使っているクラウドなどの小ネタ Advent Calendar 2024 2日目**

フローを即興で作ったら、Apexのテストクラスでエラーです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/429bad83-5ec7-6bee-4955-d36fda2b95d3.png)


:::note alert
11:21:56:205 FATAL_ERROR System.DmlException: Upsert failed. First exception on row 0; first error: CANNOT_EXECUTE_FLOW_TRIGGER, 「取引先のメインフロー」処理失敗により、このレコードを保存できません。Salesforce システム管理者に次の詳細を報告してください。<b>このフローで未対応の障害が発生しました</b><br>フローを処理中に未対応の障害が発生しました。詳細は、組織のシステム管理者にお問い合わせください。<b>このフローで未対応の障害が発生しました</b><br>フローを処理中に未対応の障害が発生しました。詳細は、組織のシステム管理者にお問い合わせください。: []
:::

手がかりがつかめない。
手を抜いてはいけませんね。sandboxにも同じフローを作ってテストクラスを走らせると...

このエラーの前に... Too many DML statements: 151 これだな

:::note alert
11:21:56:196 FLOW_ELEMENT_ERROR このエラーは、フローでレコードの更新が試行されたときに発生しました: Too many DML statements: 151。ExceptionCode の値については、<a href='https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_calls_concepts_core_data_objects.htm#'>『SOAP API 開発者ガイド』</a>を参照してください。|FlowRecordUpdate|update_customer_nameonly
:::

エラーになった個所をみると

この処理はテストデータをインサートしている処理ですね。レコードトリガーフローの中でもレコードの取得をやっているので151を超えた可能性が高い。

```
//main
FkdAdministratorConsole.GenerateData_createGenkiuuri_Account();
List<Account> Accounts = [Select id from Account];
System.assert(Accounts.size() > 0, 'Account found');

FkdAdministratorConsole.GenerateData_createZaikoHattyu_tantosya();  
FkdAdministratorConsole.GenerateData_createZaikoHattyu_Account();
FkdAdministratorConsole.GenerateData_createSyanaisiyou_Account();

FkdAdministratorConsole.GenerateData_createUri01_Account();
FkdAdministratorConsole.GenerateData_createUri02_Account();
FkdAdministratorConsole.GenerateData_createUri03_Account();
FkdAdministratorConsole.GenerateData_createUri04_Account();
FkdAdministratorConsole.GenerateData_createUri05_Account();
FkdAdministratorConsole.GenerateData_createUri06_Account();
FkdAdministratorConsole.GenerateData_createUri09_Account(); <--- ここでエラー

FkdAdministratorConsole.GenerateData_createSyanaisiiresaki_Account();

FkdAdministratorConsole.GenerateData_createGenkiuuri_tantosya();
```

適当なところに　Test.startTest();　と　Test.stopTest();を入れてDLMのカウンターをリセットしたら問題なく機能しました。

本当はこの処理の中で１件ずつupsertしないで、List変数に格納して一括更新するのが正しいだろうな。

以下のようなupsertがたくさんあります。

```
       Account Ac01 = new Account(
            Name ='センター',
            SeishikiMei__c ='センター',
            RyakushikiMei__c ='センター',
            customer_code__c ='00019',
            SyanaiTrihiki__c = '社内売上',
            RecordTypeId = recordTypeList[0].Id,
            
            yomi_kana__c='ｾﾝﾀｰ',
            Phone = Phone,
            Fax = Fax,
            zip_code__c = zip_code,
            Address1__c = Address1//,
            //Address2__c = Address2
        );
        upsert Ac01 customer_code__c; <--- ここをList.add
```

最終的には他でもこのクラスを使っていたのでList変数に書きなおしました。


# ことの発端は私の設定ミス


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0e001ea5-64ad-bfd9-d0d3-31aacae17fa6.png)

指定したクラスだけにする時に、カンマをつけ忘れてしまっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5c0c7cd9-5a7d-b27b-c0b1-259a14723800.png)
ZED2iに関する記事を書いてみた

ステレオカメラをすぐさま使おうとする時の、有力な候補がStereoLabs 製の ZED2i カメラだ。

ZED2iカメラを購入して使ってみた。

日本語の情報が少なかったので、せっかくだからqiita に記事をいくつか書いた。

それらの記事にはzed-sdk のタグを付けているので
以下のURLからそれらの記事を見つけてください。
https://qiita.com/tags/zed-sdk

## 記事を書いた理由
- 自分自身に対する備忘録
- 自分が着目した3Dカメラのユーザーが増えてほしいため。
- ユーザー間での情報のやり取りが増えることで、それぞれの3Dカメラのユーザーが、目的の処理をすばやくできるようにしたい。

## コミュニティを育てることなしに、成果を大きくすることは不可能な時代にいる。
- 画像認識分野での最近の論文の著者の数が１０名を超えることも、珍しくない。
- 中国のベンチャー企業でも成果物の一部をOSS化している。
- 特定のデバイス・特定のボードの寿命は短くて、数年立てば無意味になってしまう。
- その技術が意味があるうちに、もっと先にたどり着く必要がある。

詳しくは、以下の記事の中で、そういう考えにいたった理由を示しています。
[枠組みづくりに成功すれば、格段に成功しやすくなる](https://qiita.com/nonbiri15/items/35301a9dd8828ba19fbf)

# なぜ、StereoLabsのZED2iに着目したか
- StereoCameraを早くから提供している。
- NVIDIAとの連携が良い。
- 供給停止の不安が少ない。
- 防水対策がされている。
- IMUが内蔵している。
- ZED-SDK のサンプルに物体検出との連動などが充実している。
- OmniVerseなどのシミュレーション環境に向けたカメラ特性のモデルが公開されている。
- 偏光フィルタのあるoptionがある。
- 近距離重視・遠方重視を選べる。

## さあ、３Dカメラと、３Dでの画像認識・視覚言語モデルを盛り上げていこう。
rosetta error: Rosetta is only intended to run on Apple Silicon with a macOS host using Virtualization.framework with Rosetta mode enabled

## 問題
最近、macOSをバージョンアップした後、Dockerコンテナが立ち上がらなくなりました...orz
(有給期間中にバージョンアップしていたので出勤して焦りました...)


```bash
$ docker compose up --build
[+] Running 1/0
 ✔ Container mysql  Recreated                                                                                                                                                                                                                  0.0s
Attaching to mysql
mysql  | rosetta error: Rosetta is only intended to run on Apple Silicon with a macOS host using Virtualization.framework with Rosetta mode enabled
mysql  |
mysql exited with code 133
mysql  | rosetta error: Rosetta is only intended to run on Apple Silicon with a macOS host using Virtualization.framework with Rosetta mode enabled
mysql  |  rosetta error: Rosetta is only intended to run on Apple Silicon with a macOS host using Virtualization.framework with Rosetta mode enabled
...
```

参考程度に `docker-compose.yml`の設定を載せておきます

```
services:
  mysql:
    container_name: mysql
    image: mysql:8.0.28
    platform: linux/amd64
    restart: always
    command: mysqld --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
      MYSQL_USER: $MYSQL_USER
      MYSQL_PASSWORD: $MYSQL_PASSWORD
    healthcheck:
      test: mysqladmin ping -h mysql -u $$MYSQL_ROOT_USER -p$$MYSQL_ROOT_PASSWORD
volumes:
  mysql-data:
    driver: local
```

## 解決策
この問題は、Docker Desktopを最新バージョンにアップデートすることで解決しました。

### 手順
- Docker Desktopのアップデート

Docker Desktopを開き、設定メニューから「Check for Updates」を選択します。
最新バージョンがある場合は、指示に従ってアップデートを行います。

## まとめ
ソフトウェアアップデートでDockerが動かなくなるのは怖いですね...w
でも、定期的なアップデートは重要です。バックアップを忘れずに、問題が起きたら情報を集めて柔軟に対応しましょう。これからも安心して開発を続けられるように、最新の技術に対応していきたいですね！

## 参考
https://github.com/docker/for-mac/issues/6487