OmniAICreator/Qiita-1.07M huggingface dataset:
【Ruby on Rails × TMDB API × Mecab × AWS】ユニークなあらすじから映画を発掘するポートフォリオPlotForgeを作成しました！ 

### はじめに
初めまして、はしと申します。
バックエンドエンジニアを志して転職活動中です。

この度、ポートフォリオ「[PlotForge](https://plotforge.net/users/sign_in)」をリリースしましたので、投稿いたします！

https://plotforge.net

映画が好きなので、映画の発掘ができるアプリを作成してみたいという思いから作成しました。

#### きっかけは？？
YouTubeの映画紹介ショートです。
「⚪︎⚪︎な映画挙げてけw」のようなショートで知らなかった映画のことを
どんどん知ることができ実際に鑑賞すると面白かったので、
映画を知る機会を広げるアプリを作りたいと思いました。

#### どんなアプリ？
ランダムに呼び出された映画からユニークなあらすじが作成することができます。
![plotforge_introduction_qiita.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606327/7136a927-1df4-6afb-8220-e71ae849b948.gif)


### サービスについて

#### PlotForge
 - URL: https://plotforge.net/
 - GitHub: https://github.com/maixhashi/plotforge
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606327/7d1feeae-4bc5-4c20-f572-af25afaba5ef.png)

#### 使用技術
##### バックエンド
 - Ruby 3.1.6
 - Rails 7.1.4
 - RSpec 3.13
 - TMDB API（外部 API）

 - 機能における主要な Gem
   - devise（ログイン）
   - httparty（TMDB API への接続）
   - kaminari（ページネーション）
   - natto (登場人物とキーワードの抽出)

##### インフラストラクチャー
 - Docker
 - Nginx 1.15.8
 - puma 6.4.2
 - AWS
   - VPC
   - EC2
   - Amazon Linux 2
   - RDS
    - MySQL 8.0.35
   - ALB
   - Route53
   - ACM

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606327/d657d71b-107a-50b4-4562-4b2846f87a7a.png)


#### ER図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606327/798ff04d-20e3-5b92-0b6e-6038bd6d8e78.png)


#### 機能

#### 映画のあらすじの作成
「あらすじ」ボタンを押すと、TMDB apiによりランダムに映画が呼び出されて
その映画のあらすじから作られるユニークなあらすじが作成されます。
![plotforge_introduction_qiita.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606327/0cf65a89-5204-8ed5-f99b-3dc87e2cd003.gif)
 - ステータスバーが100%になると、あらすじが完成します。
 - 完成したあらすじをhoverすると、そのあらすじの映画情報を見ることができます。
 - 保存ボタンであらすじを保存することができます。

#### あらすじの文から映画へ
あらすじからは元になっている映画の詳細画面へ遷移することができます
![plotforge_function_1_movie_detail.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606327/200b8783-42b4-4a14-f3c1-30998968a354.gif)

#### あらすじからの登場人物・キーワードを抽出
あらすじから登場人物・キーワードを抽出してタグが作成されます。
[Mecab](https://github.com/buruzaemon/natto)の形態素分析を使用しました
![スクリーンショット 2024-11-04 8.51.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606327/6b085c1c-8132-400d-5bba-ebc9dbdb4adc.png)

#### マイページ
作成したあらすじと、あらすじに使った映画の一覧が表示されます。
![plotforge_function_2_mypage.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606327/2c1eefee-3f1a-adc6-b277-853c95e89ee3.gif)

#### チュートリアルメッセージ機能
ゲストログインをするとチュートリアルメッセージが表示されます。
![plotforge_function_3_tutorial_message.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606327/615736ea-88bb-cc66-83cf-460e9687b2ce.gif)


### 終わりに
あらすじを作成するたびに映画のリストが出来上がっていくので、
「なんか面白い動画ないかな？」というときにPlotForgeを使ってみてください！

読んでくださりありがとうございます！

また、もう1つMATRIXFLOWというポートフォリオもリリースしております！
こちらもご覧いただけますと幸いです

https://qiita.com/maixhashi/items/5da649e290ec13e71465
Polarsの速度比較（vstack vs concat）

Polarsでは、concatはメモリコピーをして、vstackはメモリコピーをしないようです。

https://qiita.com/hkzm/items/8427829f6aa7853e6ad8#4-vstack-concat-%E3%81%A9%E3%81%A1%E3%82%89%E3%82%92%E4%BD%BF%E3%81%86%E3%81%8B%E3%81%AF%E5%BE%8C%E7%B6%9A%E3%81%A7%E3%81%AE%E3%82%AF%E3%82%A8%E3%83%AA%E6%AC%A1%E7%AC%AC

バージョン1.12.0で確かめてみました。

## 比較

16 x 16の`df1`を`n`回結合してみます。
メモリコピーしていれば、結合回数の自乗で計算時間が増えていくはずです。

```python
import numpy as np
import polars as pl
from timeit import timeit

df1 = pl.DataFrame(
    np.arange(256).reshape(16, -1),
    [f"col{i:02}" for i in range(16)],
)

concat_code = """\
df = df1
for _ in range(n):
    df = pl.concat([df, df1])
"""

vstack_code = """\
df = df1
for _ in range(n):
    df = df.vstack(df1)
"""

times = [1, 100, 200, 300, 400]

vstack_times = [
    timeit(vstack_code, number=100, globals=locals())
    for n in times
]

concat_times = [
    timeit(concat_code, number=100, globals=locals())
    for n in times
]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/0921a78d-1bc9-fc19-018d-b9afed965918.png)

図からはわかりにくいですが、どちらも自乗で増えています。
また、vstackの方が速いですが、2倍くらいしか違いません。思ったほど違いません。

なお、結合だけならvstackの方が速いですが、このあと加工したときにvstackの方が遅いかもしれません。

## 私の結論

* （シビアな状況でなければ）どちらでも良さそう
* 気になるなら、計測してみればよい

以上
投稿 123 attr_accessor 2024/10/31

本日の勉強時間　3H

attr_accessorは、Rubyのクラスで「属性」を定義するときに使われます。
これにより、インスタンスのプロパティ（値）を簡単に読み書きできるようになります。
例を交えながら、attr_accessorの基本的な使い方を説明します。

1. attr_accessorがない場合のクラス定義
例えば、「名前」と「年齢」を持つPersonというクラスを作り、nameとageという2つの属性を持たせたいとします。attr_accessorを使わずに実装すると、次のようになります。

```
class Person
  # nameとageのインスタンス変数を定義
  def name=(value)
    @name = value
  end

  def name
    @name
  end

  def age=(value)
    @age = value
  end

  def age
    @age
  end
end

# インスタンスを作成
person = Person.new
person.name = '太郎'    # 名前を設定
person.age = 25         # 年齢を設定

puts person.name  #=> 太郎
puts person.age   #=> 25
```



def name=(value)とdef age=(value)で「値を設定するためのメソッド」を作成しています。
def nameとdef ageで「値を取得するためのメソッド」を作成しています。
@nameや@ageは、インスタンス変数です。@nameと@ageはインスタンスごとに異なる値を保持します。
nameとageを設定・取得するためのメソッドを定義しないと、インスタンス変数を外部から直接操作できません。

2. attr_accessorを使った場合
上記のような属性設定・取得メソッドを自動で生成するのがattr_accessorです。以下のように書くと、同じ効果が得られます。

```
class Person
  attr_accessor :name, :age  # nameとageの設定・取得メソッドを自動生成
end

# インスタンスを作成
person = Person.new
person.name = '太郎'    # 名前を設定
person.age = 25         # 年齢を設定

puts person.name  #=> 太郎
puts person.age   #=> 25
```



説明
attr_accessor :name, :ageと書くことで、nameとageの設定と取得が可能なメソッドが自動で定義されます。
person.name = '太郎'は「nameを設定するメソッド」を呼び出し、person.nameは「nameを取得するメソッド」を呼び出しています。





■attr_accessorのポイント
:nameや:ageはシンボルで、属性の名前を指定しています。

短縮記法：attr_accessorを使うことで、値の設定や取得をシンプルに記述でき
コードが短くなります。




まとめ
attr_accessorは、クラス内のインスタンス変数に対して、簡単に「値を設定」「値を取得」できるメソッドを自動生成するものです。これにより、クラスをシンプルかつ効率的に書くことができます。
VBAからC#で作成されたCOMを利用する時の備忘

もはや、枯れた技術かもしれませんが…備忘です
### 問題点：事前バインドで走ったCOMが遅延バインドで動かない
ACCESSS VBA 32bit版から、C#で作成したCOMを利用していましたが、C#で32bit64bit互換のCOMを作成できるようだし、64bitへの移行も考えて、VBAで遅延バインドに変更しました。

VBAで、MyLibを追加して、MyClassを利用する際

```VisualBasic
'参照設定にMyLibを追加
Dim class1 as New MyLib.MyClass, hWnd1 as LongPtr
class1.method1(hWnd1)
```
とするところを
```VisualBasic
'参照設定にMyLibを追加しない
Dim class1 as Object, hWnd1 as LongPtr
Set class1 = CreateObject("MyLib.MyClass")
class1.method1(hWnd1)
```
としたところ、上の参照設定では動くのに、下はError 430。さらに
```VisualBasic
'参照設定にMyLibを追加
Dim class1 as New MyLib.MyClass, hWnd1 as LongPtr
Set class1 = CreateObject("MyLib.MyClass")
class1.method1(hWnd1)
```
これだと動く。

### 原因:遅延バインドではIntPtrを正しく処理できないようだ
VSでACCESSのプロセスにアタッチしたところ、mscorlibでSystem.InvalidCastExceptionとのこと。

```CSharp
    [ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IMyClass
    {
    [DispId(1),Description("Late-Binding Not Function")]
    void method1(IntPtr hWnd)
    }
```
これを

```CSharp
    [ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IMyClass
    {
    [DispId(1),Description("Both Binding Work Fine")]
    void method1(dynamic hWnd)
    }
```
で、MyClass.method1内で、(IntPrt)hWndとキャストすればOK。

めちゃくちゃ、はまったので誰かの役に立つといいな。
ユーモアのある技術用語集！！その元ネタとは？？

# はじめに

こんにちは、みなさん！

今日は、**ユーモアたっぷりの技術用語**とその元ネタについて調べてみたので共有したいと思います！

応用情報の勉強をしているときに**パンくずリスト**という言葉がでてきて，その名前の由来がとっても面白く，他にも色々あるのではないかと思い，調べてみました！

他にもこんなものがあるよ，これ間違っているよという方**ぜひともコメントで教えてください**！！

# 用語一覧
- パンくずリスト
- サンドボックス
- ゾンビプロセス
- デーモン
- トロイの木馬
- ウィザード
- アリスとボブ
- イースターエッグ
- ラバーダックデバック
- ヤクの毛刈り

## パンくずリスト
**説明：** ウェブサイトの階層構造をナビゲーション形式で表示する機能。現在のページまでの経路を示し、各階層への移動を可能にする

**言葉の理由：** 「ヘンゼルとグレーテル」で子どもたちが森に残したパンくずの道しるべのように、ユーザーがサイト内で迷子にならないよう道筋を示す役割を果たすことから

**例：** ホーム > 製品一覧 > スマートフォン > iPhone 15

## サンドボックス
**説明：** プログラムを安全に実行・検証できる隔離環境。メインシステムに影響を与えることなくテストや実験が可能

**言葉の理由：** 子供が安全に遊べる限定された砂場のように、プログラムが他のシステムに影響を与えずに実行できる保護された環境を提供することから

**例：** 新しいアプリをインストールする前に、サンドボックス環境で安全性を確認する

## ゾンビプロセス
**説明：** 親プロセスが終了したにもかかわらず、システムリソースを消費し続ける終了できないプロセス

**言葉の理由：** 死んでいるはずなのに動き続けるゾンビのように、終了しているはずのプロセスがシステム上で存続し続けることから

**例：** クラッシュしたアプリケーションのプロセスがタスクマネージャーに残り続ける

## デーモン
**説明：** バックグラウンドで常時動作し、特定のサービスを提供し続けるプログラム

**言葉の理由：** 目に見えない存在でありながら常に働き続けるギリシャ神話の精霊（ダイモーン）のように、裏で継続的に動作することから

**例：** プリンターデーモン（印刷要求を監視）、メールデーモン（メール送受信を管理）

## トロイの木馬
**説明：** 正規のソフトウェアを装って侵入し、システムに害を及ぼすマルウェアの一種

**言葉の理由：** トロイ戦争で贈り物の木馬に潜んで城内に侵入した兵士のように、正体を隠してシステムに侵入することから

**例：** 無料のゲームを装って配布される不正プログラム

## ウィザード
**説明：** 複雑な設定や操作を、対話形式で段階的に実行できるガイド機能

**言葉の理由：** ファンタジー作品で魔法使いが冒険者を導くように、ユーザーを一歩ずつ目的の設定まで導くことから

**例：** Windowsのプリンターインストールウィザード、ソフトウェアのセットアップウィザード

## アリスとボブ
**説明：** 暗号理論や通信プロトコルの説明で使われる架空の人物。アリスが送信者、ボブが受信者として登場し、イブ（盗聴者）やマロリー（悪意のある攻撃者）なども存在

**言葉の理由：** 英語圏で一般的な名前を使うことで、複雑な概念を身近な人物間のコミュニケーションとして説明しやすくするため

**例：** 「アリスがボブに暗号化されたメッセージを送り、イブがそれを傍受しようとする」という形で暗号通信の仕組みを説明

## イースターエッグ
**説明：** ソフトウェアやゲーム、DVDなどに隠された楽しい仕掛けや機能。通常の操作では見つけにくい場所に配置された隠し要素

**言葉の理由：** イースターの祭りで子供たちが隠された卵を探す伝統になぞらえて、プログラム内に隠された要素を探す楽しみを表現

**例：** Googleで「do a barrel roll」と入力すると画面が回転する機能、Microsoft ExcelのFlight Simulatorゲーム

## ラバーダックデバッグ
**説明：** プログラムのバグや問題点を、ゴム製のアヒルなど誰かに話しかけるように詳細に説明することで、自然と解決策が見つかるデバッグ手法

**言葉の理由：** プログラマーが机の上に置いたゴム製のアヒルに向かって問題を説明することで解決策を発見できた実話に基づく

**例：** 「このバグの原因を説明していたら、変数の初期化を忘れていたことに気づいた」

## ヤクの毛刈り
**説明：** 単純な作業を始めたはずが、次々と予期せぬ事前準備が必要になり、本来の目的からどんどん遠ざかっていく状況

**言葉の理由：** MITメディアラボで生まれた用語で、本来の目的から外れた作業に時間を費やす状況を比喩的に表現

**例：** 
1. メールを送ろうとしたら
2. メーラーの設定が必要で
3. そのためにOSのアップデートが必要で
4. アップデートにはストレージの空きが必要で
5. ストレージを空けるには古いファイルの整理が必要で...
という具合に本来の目的から遠ざかっていく状況

# さいごに
IT用語にはユーモアのある言葉がたくさんありました。おそらくまだまだあると思います。もし、「こんな面白い用語があるよ」という方がいらっしゃいましたら、ぜひコメントで教えてください！
それではみなさん、良いエンジニアライフを〜👋
Vulkan日記その5: Raspberry Pi 4 + Nerves でも Vulkanが動くっぽい

調べたところ，Raspberry Pi 5だけでなく，Raspberry Pi 4でも，Nerves で Vulkan を動かすことが可能っぽいです．

- [Vulkan日記その1: HomebrewでVulkanをインストール](https://qiita.com/zacky1972/items/967d6ea213ee658bfa43)
- [Vulkan日記その2: デモンストレーション・プログラムを動かす](https://qiita.com/zacky1972/items/65ac97e850441958a7ea)
- [Vulkan日記その3: Raspberry Pi 5 + Nerves で Vulkanが動くっぽい](https://qiita.com/zacky1972/items/1b76e79b47fd58f90c80)
- [Vulkan日記その4: buildrootでVulkanをインストールする方法について](https://qiita.com/zacky1972/items/85bbcb135db4f90ad09e)

## RasPi 4 のGPUは Broadcom VideoCore VI

https://www.raspberrypi.com/products/raspberry-pi-4-model-b/specifications/

> Broadcom BCM2711

https://www.zep.co.jp/ysugisaki/article/z-rpiqpu-da1/

> Raspberry Pi 4 （BCM2711): VideoCore VI （6)

## Vulkanのサポート状況

https://vulkan.gpuinfo.org

![Vulkan Drivers for VideoCores](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55223/f4e32196-d3b4-602e-2b1c-1a9a23d5f94e.png)


## まとめ

以上をまとめると，Raspberry Pi 4 上の Nerves で Vulkan を動かせるっぽいです．

つづく，かも．
逆三角関数の微分（高校・大学数学）

# 逆三角関数とその微分
はじめに, 逆三角関数とはなにかご存知だろうか？

```math
\begin{align}
  y &= {\sin}^{-1}{x}\qquad (-1 \leq x \leq 1,\quad -\frac{\pi}{2}\leq y \leq \frac{\pi}{2})\tag{1}\\
  y &= {\cos}^{-1}{x}\qquad (-1 \leq x \leq 1,\quad 0\leq y \leq \pi)\tag{2}\\
  y &= {\tan}^{-1}{x}\qquad (-\infty<x<\infty,\quad -\frac{\pi}{2} < y < \frac{\pi}{2})\tag{3}
\end{align}
```

このように表すことができ、それぞれ「アークサイン」「アークコサイン」「アークタンジェント」と呼ぶ. 今回はこれらの微分について紹介する. また, これらの性質については理解している前提で資料を作成しているため, 逆三角関数の使い方などについては各自調べてほしい.


**(1) $y = \sin^{-1}x$の微分**
ここからは主に数式を使って説明する.

```math
\begin{align}
  y &= \sin^{-1}x\notag\\
  x &= \sin y\quad\text{とおいて,}\notag\\
  \frac{d}{dx}x &=  \frac{d}{dx}\sin y\notag\\
  1 &= \frac{d}{dy}\sin y\frac{dy}{dx}\notag\\
    &= \cos y\cdot y'\notag\\
  y' &= \frac{1}{\cos y}
\end{align}
```

ここで, 三角関数の相互関係より, $\sin^2 y + \cos^2 y = 1$を式変形すると,

```math
\cos^2 y = 1 - \sin^2 y \quad\leftrightarrow\quad \cos y = \sqrt{1-\sin^2 y} \quad\leftrightarrow\quad \cos y = \sqrt{1-x^2}
```

と変形することができる. これを利用して(1)式に代入すると,

```math
\begin{align}
  y' &= \frac{1}{\sqrt{1-x^2}}\notag
\end{align}
```

を得られるので, $y = \sin^{-1}x$の微分は, $y' = \frac{1}{\sqrt{1-x^2}}$であるとわかる.

**(2) $y = \cos^{-1}x$の微分**
こちらも解き方としては$\sin^{-1}x$の微分と同じである.

```math
\begin{align}
  y &= \cos^{-1}x\notag\\
  x &= \cos y\quad\text{とおいて,}\notag\\
  \frac{d}{dx}x &=  \frac{d}{dx}\cos y\notag\\
  1 &= \frac{d}{dy}\cos y\frac{dy}{dx}\notag\\
    &= -\sin y\cdot y'\notag\\
  y' &= -\frac{1}{\sin y}
\end{align}
```

ここで, 三角関数の相互関係より, $\sin^2 y + \cos^2 y = 1$を式変形すると,

```math
\sin^2 y = 1 - \cos^2 y \quad\leftrightarrow\quad \sin y = \sqrt{1-\cos^2 y} \quad\leftrightarrow\quad \sin y = \sqrt{1-x^2}
```

と変形することができる. これを利用して(2)式に代入すると,

```math
\begin{align}
  y' &= -\frac{1}{\sqrt{1-x^2}}\notag
\end{align}
```

を得られるので, $y = \cos^{-1}x$の微分は, $y' = -\frac{1}{\sqrt{1-x^2}}$であるとわかる.

**(3) $y = \tan^{-1}x$の微分**
こちらも解き方としては$\sin^{-1}x,\;\cos^{-1}x$の微分と同じである.

```math
\begin{align}
  y &= \tan^{-1}x\notag\\
  x &= \tan y\quad\text{とおいて,}\notag\\
  \frac{d}{dx}x &=  \frac{d}{dx}\tan y\notag\\
  1 &= \frac{d}{dy}\tan y\frac{dy}{dx}\notag\\
    &= \frac{1}{\cos^2 y} \cdot y'\notag\\
  y' &= \cos^2 y
\end{align}
```

ここで, 三角関数の相互関係より, $\sin^2 y + \cos^2 y = 1$を両辺$\cos^2 y$で割ると, 


```math
\tan^2 y + 1 = \frac{1}{\cos^2 y} \quad\leftrightarrow\quad \cos^2 y = \frac{1}{\tan^2 y + 1} \quad\leftrightarrow\quad \cos^2 y = \frac{1}{1+x^2}
```

と変形することができる. これを利用して(3)式に代入すると,

```math
\begin{align}
  y' &= \frac{1}{1 + x^2}\notag
\end{align}
```

を得られるので, $y = \tan^{-1}x$の微分は, $y' = \frac{1}{1 + x^2}$であるとわかる.
Cocoon設定のメニューが表示されない

※ 過去に別ブログに載せていた内容をブログ閉鎖のためこちらに引っ越ししました。

## 起きたこと
前提：WordPressを利用している。テーマに「Cocoon」がインストールされている。
WordPressの管理画面に「Cocoon設定」のメニュー表示がなかった。

![Cocoon設定1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926178/0aef39e3-8bc4-dfea-04c9-1f34a309ed42.png)


## 原因と解決方法
Cocoonが有効化されていなかったことが原因でした。
メニューの 外観 > テーマ よりCocoonを有効化することで解消されました。
※後述しますが、「Cocoon」ではなく「Cocoon Child」の設定の方がおすすめです。

![20220517_Cocoon設定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926178/e890641a-1583-74f7-1e50-0ffc4f8a63c9.png)


## Cocoon Childについて
Cocoon ChildはCocoonの子テーマです。

Cocoonのテーマをカスタマイズせずに使う場合はCocoonの選択でも問題ありません。見た目などのカスタマイズを行う方はCocoon Childの設定がおすすめです。

テーマは後からでも変更できます。よくわからずに悩むようであればCocoon Childを設定しておくとよいです。

子テーマについては以下の記事が参考になりました。

https://wakaru-web.com/wordpress/customize/parent-child-theme/
【React】チェックボックスにドハマリした

`React`でチェックボックスにドハマリしました。
自分自身のメモのために記録します。

機能的にはONにしたら親コンポーネントの一覧に表示、OFFにしたら一覧から削除という単純な流れ。
![無題の動画 ‐ Clipchampで作成.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877267/41f8c99e-490d-3bc0-12e3-08a6d39464d5.gif)

### 修正前
```typescript
 <input
	type="checkbox"
	id={album.id}
	className={albumArtList.some((item) => item.id === album.id) ? 'selected' : 'select'}
	checked={albumArtList.some((item) => item.id === album.id)}
	onChange={() => handleChange(album.id, album.name, album.images[0]?.url, album.artists.map((value) => value.name).join(','))}
/>

<label
htmlFor={album.id} className={albumArtList.some((item) => item.id === album.id) ? 'l-button bg-orange txt-white action ta-center' : 'l-button bg-turquoise txt-white action ta-center'}>
{albumArtList.some((item) => item.id === album.id) ? '選択中' : '選択'}
</label>
```

`SpotifyAPI`から取得してきたアルバムデータを表示しているだけの、単純なチェックボックスです。
この状態では、チェックボックスをONに設定はできるもののOFFにできない…という状態に。

### 検証
このチェックボックスですが、スタイルでチェックボックス自体は非表示にしていました。
checkedの真偽ロジックがおかしいのか検証している中で、スタイルを無効化し直接チェックボックスを操作すると希望通りの動きに…。
チェックボックス自体とラベルの連動がおかしいという原因を見つけました。

### 修正後
```typescript
 <input
	type="checkbox"
	id={`checkbox-${album.id}`}
	className={albumArtList.some((item) => item.id === album.id) ? 'selected' : 'select'}
	checked={albumArtList.some((item) => item.id === album.id)}
	onChange={() => handleChange(album.id, album.name, album.images[0]?.url, album.artists.map((value) => value.name).join(','))}
/>

<label
htmlFor={`checkbox-${album.id}`} className={albumArtList.some((item) => item.id === album.id) ? 'l-button bg-orange txt-white action ta-center' : 'l-button bg-turquoise txt-white action ta-center'}>
{albumArtList.some((item) => item.id === album.id) ? '選択中' : '選択'}
</label>
```
変更点は`id`と`htmlFor`の部分です。
アルバムごとに動的に生成していたのですが、一時的にDOM上の一致が崩れ関連付けできなかったみたいです。
それぞれにプレフィックスをつけることで解決しました。
CSSを学びたい Step21 grid-template-areas

## はじめに
CSSを学びたいStep21です！今回は**grid-template-areas**を学んでいこうと思います！
※grid-template-areasは、CSS Grid Layoutを使用してグリッドコンテナ内のアイテムを配置するための便利な方法です。これにより、グリッドのレイアウトを視覚的に定義しやすくなります。

## 成果物

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/cc7042e2-a5cc-f8f8-b847-4a2940fd6ef4.png)


```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Grid Template Areas Example</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <div class="grid-container">
    <div class="header">Header</div>
    <div class="sidebar">Sidebar</div>
    <div class="content">Content</div>
    <div class="footer">Footer</div>
  </div>
</body>
</html>
```

```css:styles.css
body {
  font-family: Arial, sans-serif;
  background-color: #f4f4f4;
  margin: 0;
  padding: 20px;
}

.grid-container {
  display: grid;
  grid-template-areas:
    "header header"
    "sidebar content"
    "footer footer";
  grid-gap: 10px;
  background-color: #fff;
  padding: 10px;
}

.grid-container > div {
  background-color: #ddd;
  padding: 20px;
  text-align: center;
}

.header {
  grid-area: header;
}

.sidebar {
  grid-area: sidebar;
}

.content {
  grid-area: content;
}

.footer {
  grid-area: footer;
}
```

:::note info
なるほど！これはめっちゃ便利ですね！
縦に表現する場合、縦配置用のコンポーネントと横配置用のコンポーネントを書いてたんですが、不要になりそうですね！！
:::

## 追加
あまりにも優秀だったので、もう1本学んでおきたいなと思い作りました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/9501bfa7-8b45-e992-1077-3d70b2e7fe35.png)

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Complex Grid Template Areas Example</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <div class="grid-container">
    <div class="header">Header</div>
    <div class="sidebar">Sidebar</div>
    <div class="content">Content</div>
    <div class="widget1">Widget 1</div>
    <div class="widget2">Widget 2</div>
    <div class="footer">Footer</div>
  </div>
</body>
</html>
```

```css:styles.css
body {
  font-family: Arial, sans-serif;
  background-color: #f4f4f4;
  margin: 0;
  padding: 20px;
}

.grid-container {
  display: grid;
  grid-template-areas:
    "header header header"
    "sidebar content content"
    "sidebar widget1 widget2"
    "footer footer footer";
  grid-gap: 10px;
  background-color: #fff;
  padding: 10px;
}

.grid-container > div {
  background-color: #ddd;
  padding: 20px;
  text-align: center;
}

.header {
  grid-area: header;
}

.sidebar {
  grid-area: sidebar;
}

.content {
  grid-area: content;
}

.widget1 {
  grid-area: widget1;
}

.widget2 {
  grid-area: widget2;
}

.footer {
  grid-area: footer;
}
```
ThreadsのAPI設定について（備忘録）｜Python

# ThreadsのAPI設定についてのガイド

最近注目を集めているSNSプラットフォーム「Threads」。
今回は、ThreadsのAPI設定についての備忘録です。

## 目次
1. [基本設定項目の解説](#基本設定項目の解説)
2. [セキュリティ上の注意点](#セキュリティ上の注意点)
3. [実装手順](#実装手順)
4. [よくある問題とその解決方法](#よくある問題とその解決方法)

## 基本設定項目の解説

### 1. Threads アプリID
アプリケーションを一意に識別するための文字列です。Meta/Threadsプラットフォームから発行される固有の識別子で、他のアプリケーションとの重複がないよう管理されています。

### 2. Threads App Secret
アプリケーションの認証に使用される秘密鍵です。この情報は非常に重要で、外部に漏洩すると深刻なセキュリティ問題につながる可能性があります。

### 3. Threads表示名
ユーザーに表示されるアプリケーション名です。以下の点に注意して設定しましょう：
- サービスの内容を適切に反映した名前
- ユーザーにとってわかりやすい名称
- ブランドガイドラインに準拠した命名

### 4. コールバックURL設定
#### リダイレクトURL
OAuth認証完了後にユーザーを戻すためのURLです。認証フローの重要な要素となります。

#### アンインストールURL
ユーザーがアプリケーションをアンインストールした際の通知を受け取るためのURLです。

#### 削除URL
ユーザーのデータ削除要求を受け取るためのエンドポイントとなります。

## セキュリティ上の注意点

1. **App Secretの管理**
   - 環境変数として設定
   - ソースコード上に直接記載しない
   - 定期的な更新を検討

2. **コールバックURLのセキュリティ**
   - 必ずHTTPSを使用
   - 適切なバリデーションの実装
   - アクセス制御の設定

## 実装手順

### 1. 初期設定
```python
# 環境変数の設定
import os
app_id = os.environ.get('THREADS_APP_ID')
app_secret = os.environ.get('THREADS_APP_SECRET')
```

### 2. OAuth認証フローの実装
```python
def get_auth_url():
    base_url = "https://www.threads.net/oauth/authorize"
    params = {
        "client_id": app_id,
        "redirect_uri": redirect_uri,
        "scope": "basic,post,follow"
    }
    return f"{base_url}?{'&'.join(f'{k}={v}' for k, v in params.items())}"

def get_access_token(auth_code):
    token_url = "https://www.threads.net/oauth/access_token"
    params = {
        "client_id": app_id,
        "client_secret": app_secret,
        "code": auth_code,
        "redirect_uri": redirect_uri
    }
    response = requests.post(token_url, params=params)
    return response.json()
```

## よくある問題とその解決方法

1. **認証エラー**
   - App IDとApp Secretの確認
   - コールバックURLの正確な設定
   - HTTPSの使用確認

2. **コールバック処理の失敗**
   - URLの到達性確認
   - サーバーの応答確認
   - エラーログの確認

## まとめ

ThreadsのAPI設定は、適切な手順と注意点を押さえることで、安全かつ効果的に実装することができます。特にセキュリティ面での配慮が重要で、App Secretの管理やコールバックURLの設定には細心の注意を払う必要があります。

定期的なセキュリティレビューと更新を行うことで、より安全なアプリケーション運用が可能となります。

## 参考資料
- Meta Developer Portal
- Threads API Documentation
- OAuth 2.0 仕様書

---
*本記事は2024年4月時点の情報に基づいて作成されています。API仕様は随時更新される可能性があるため、最新の公式ドキュメントも併せてご確認ください。*
ilasmでstack machine その24

# 概要
ilasmでstack machineやってみた。
ilasmをcopilotに解説してもらった。

# 投入したプロンプト

```
次のilasmを解説してくれ


.assembly extern mscorlib {}
.assembly fizzbuzz {}
.method static void main() {
.entrypoint
.locals init (int32 n, int32 i)
  ldc.i4   100
  stloc    n
  ldc.i4   1
  stloc    i
loop:
  ldloc    i
  ldloc    n
  bgt      bye
  ldloc    i
  ldc.i4   15
  rem
  brfalse  fb
  ldloc    i
  ldc.i4   5
  rem
  brfalse  b
  ldloc    i
  ldc.i4   3
  rem
  brfalse  f
  ldloc    i
  call void [mscorlib] System.Console::WriteLine(int32)
  br       tugi
fb:
  ldstr    "fizzbuzz"
  br       print
b:
  ldstr    "buzz"
  br       print
f:
  ldstr    "fizz"
print:
  call void [mscorlib] System.Console::WriteLine(string)
tugi:
  ldloc    i
  ldc.i4   1
  add
  stloc    i
  br       loop
bye:
  ret
}

```

# 結果

なるほど、これはIL（中間言語）で書かれたFizzBuzzプログラムですね。
ILは、.NETフレームワークで動作するプログラムがコンパイルされる中間言語です。このプログラムの構造を分解してみましょう：

.assembly extern mscorlib {} と .assembly fizzbuzz {} で、アセンブリの宣言を行います。mscorlib は .NET の基本ライブラリです。

method static void main() { でメインメソッドを宣言し、その中でプログラムが実行されます。

主な処理の流れは次の通りです：

locals init (int32 n, int32 i) は、整数型のローカル変数 n と i を初期化します。

ldc.i4 100 と stloc n で、変数 n に100を格納します。

ldc.i4 1 と stloc i で、変数 i に1を格納します。

loop: ラベルでループの開始を示します。

ldloc i と ldloc n で i と n をスタックにロードし、bgt bye で i が n より大きい場合、bye ラベルにジャンプしてプログラムを終了します。

ldloc i と ldc.i4 15 で i を15で割り、その剰余を求めます。brfalse fb で剰余が0なら fb ラベル（"fizzbuzz" を表示）にジャンプします。

ldloc i と ldc.i4 5 で同様に i を5で割り、brfalse b で剰余が0なら b ラベル（"buzz" を表示）にジャンプします。

ldloc i と ldc.i4 3 で i を3で割り、brfalse f で剰余が0なら f ラベル（"fizz" を表示）にジャンプします。

条件に当てはまらない場合は ldloc i で i の値を表示します（call void [mscorlib] System.Console::WriteLine(int32)）。

tugi: ラベルで i に1を加算し（ldloc i、ldc.i4 1、add）、再び loop ラベルに戻ります（br loop）。

bye: ラベルでプログラムを終了します（ret）。

何か他にも質問があればどうぞ！
Vulkan日記その4: buildrootでVulkanをインストールする方法について

buildrootでMesa3DのVulkanをインストールしておく方法について，仮説を立てました．

- [Vulkan日記その1: HomebrewでVulkanをインストール](https://qiita.com/zacky1972/items/967d6ea213ee658bfa43)
- [Vulkan日記その2: デモンストレーション・プログラムを動かす](https://qiita.com/zacky1972/items/65ac97e850441958a7ea)
- [Vulkan日記その3: Raspberry Pi 5 + Nerves で Vulkanが動くっぽい](https://qiita.com/zacky1972/items/1b76e79b47fd58f90c80)

## RasPi 5 の GPU

https://www.raspberrypi.com/products/raspberry-pi-5/

> VideoCore VII GPU, supporting OpenGL ES 3.1, Vulkan 1.2

VideoCore で検索すると，メーカーはBroadcomでした．

## Frank Hunlethさんから教わったことの確認

Nerves Project代表のFrank Hunlethさんから，次のリンクを教わっていました．

https://github.com/nerves-project/nerves_system_rpi5/blob/main/nerves_defconfig#L46-L48

## 調査

このオプションを調べてみると，次のようなページに行き当たりました．

https://fossies.org/linux/buildroot/package/mesa3d/Config.in

```
64 config BR2_PACKAGE_MESA3D_VULKAN_DRIVER
65 	bool
66 	select BR2_PACKAGE_MESA3D_DRIVER
...
285 config BR2_PACKAGE_MESA3D_VULKAN_DRIVER_BROADCOM
286 	bool "Vulkan broadcom driver"
287 	depends on BR2_arm || BR2_aarch64
288 	depends on BR2_TOOLCHAIN_HAS_SYNC_4 # dri3/libxshmfence
289 	select BR2_PACKAGE_MESA3D_VULKAN_DRIVER
290 	help
291 	  Vulkan broadcom driver.
```

## 仮説

すなわち，`nerves_defconfig`を次のように設定したら，Vulkanインストール済みにならないかなと思いました．

```
BR2_PACKAGE_MESA3D=y
BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_V3D=y
BR2_PACKAGE_MESA3D_OPENGL_ES=y
BR2_PACKAGE_MESA3D_VULKAN_DRIVER=y
BR2_PACKAGE_MESA3D_VULKAN_DRIVER_BROADCOM=y
```

このような設定で構築すると，次のようなアーキテクチャ構成を実現できるものと思います．

![Vulkan on Nerves](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55223/fa8396c6-6476-f8b9-451b-7527fe6ba8b6.png)

## まとめ

以上をまとめると，buildrootの設定を変えることで，Raspberry Pi 5 上の Nerves で， Mesa3D の Vulkan をインストールすることができそうです．

[つづく](https://qiita.com/zacky1972/items/a67c0139ee6eee431de9)
ilasmでstack machine その23

# 概要
ilasmでstack machineやってみた。
生成した日本語プログラムをcopilotに解説してもらった。

# 投入したプロンプト

```
次の日本語プログラムを解説してくれ

  数値 100 を積み
  変数 n に移動し
  数値 1 を積み
  変数 i に移動し
loop:
  変数 i を積み
  変数 n を積み
  比べて大なら bye へ飛ぶ
  変数 i を積み
  数値 15 を積み
  剰余し
  偽なら fb へ飛ぶ
  変数 i を積み
  数値 5 を積み
  剰余し
  偽なら b へ飛ぶ
  変数 i を積み
  数値 3 を積み
  剰余し
  偽なら f へ飛ぶ
  変数 i を積み
  数値印字し
  無条件で tugi へ飛ぶ
fb:
  文字列 "fizzbuzz" を積み
  無条件で print へ飛ぶ
b:
  文字列 "buzz" を積み
  無条件で print へ飛ぶ
f:
  文字列 "fizz" を積み
print:
  文字印字し
tugi:
  変数 i を積み
  数値 1 を積み
  足す
  変数 i に移動し
  無条件で loop へ飛ぶ
bye:
  終わり。


```

# 結果

このプログラムは、いわゆる「FizzBuzz」問題を解くためのものですね。簡単に解説すると、1から100までの数字を順に処理し、その数字が3の倍数なら「Fizz」、5の倍数なら「Buzz」、両方の倍数なら「FizzBuzz」と表示し、それ以外の場合はその数字を表示します。

全体の流れを見てみましょう：

変数 n に100を設定し、変数 i に1を設定します。

ループ（loop ラベル）に入ります。

i を n と比較し、i が n より大きい場合はプログラムを終了します（bye ラベルに飛びます）。

i を15で割り、その剰余が0の場合は「FizzBuzz」（fb ラベル）を表示します。

それ以外の場合、i を5で割り、その剰余が0の場合は「Buzz」（b ラベル）を表示します。

さらに、i を3で割り、その剰余が0の場合は「Fizz」（f ラベル）を表示します。

上記条件に当てはまらない場合は、i をそのまま表示します。

i に1を足して、再びループ（loop ラベル）に戻ります。

これが「FizzBuzz」問題を解くための簡単なアルゴリズムです。質問や別のプログラムの解説が必要なら、どんどん聞いてください！
中心との距離に基づいてきれいな円を描く方法

「中心からの距離を計算し、それが半径以下だったら点を描く」という方法で円を描くとき、適当に実装してしまうと、このような偏った美しくない円になってしまうことがある。

![偏った円の例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/945e77aa-2bf9-98ce-34a1-b22751e11890.png)

本記事では、このような円ではなく、以下のような対称的なきれいな円を描く方法を紹介する。

![対称的な円の例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/ab14576e-1ce7-28fc-7f11-aeda498ba1b9.png)

# 悪い実装

以下のような疑似コードで円を描くと、偏ってしまう。

```python
# 縦 diameter、横 diameter の正方形の中に直径 diameter の円を描く
def draw_circle_bad(diameter):
    # 円の中心の座標
    cx = diameter / 2
    cy = diameter / 2
    # 円の半径
    radius = diameter / 2
    # 円を描画する
    for y in range(diameter):
        for x in range(diameter):
            # 円の中心からの距離を計算・判定する
            dx = x - cx
            dy = y - cy
            if dx * dx + dy * dy <= radius * radius:
                # 円の中なので、点を描画する
                draw_point(x, y)
```

これは、各ピクセルに点を描画するかの判定を**各ピクセルの左上の点**で行うことに相当するので、画像の左上のほうが右下のほうよりも中心から遠いという判定になりやすくなるためである。

![悪い実装で円を描画する様子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/0160262e-80fb-1067-0ab7-7b823bf50b3b.png)

# 良い実装

「悪い実装」では、各ピクセルの左上の点で判定を行ったのが描画が偏った原因である。
そのため、それぞれの座標に `0.5` を足し、**各ピクセルの中央の点**で判定を行うことで、描画の偏りを解消できる。

```python
# 縦 diameter、横 diameter の正方形の中に直径 diameter の円を描く
def draw_circle_bad(diameter):
    # 円の中心の座標
    cx = diameter / 2
    cy = diameter / 2
    # 円の半径
    radius = diameter / 2
    # 円を描画する
    for y in range(diameter):
        for x in range(diameter):
            # 円の中心からの距離を計算・判定する
            # 0.5 を足し、ピクセルの中心で判定する
            dx = x + 0.5 - cx
            dy = y + 0.5 - cy
            if dx * dx + dy * dy <= radius * radius:
                # 円の中なので、点を描画する
                draw_point(x, y)
```

![良い実装で円を描画する様子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/8b0e3085-3ffb-34d3-b12b-c3e2fd479021.png)

# 結論

各点の中心からの距離に基づいて円を描画する際、点 (ピクセル) の**中心の座標**で距離の計算を行うと、対称性が向上したよりきれいな円を描画できることがある。

# おまけ

今回の記事に掲載した画像を作成するために実装したプログラムを公開した。

[円描画デモ](https://mikecat.github.io/circle_demo/)
WebServerのサンプルを少しいじって接点情報の表示(M5NanoC6)




x 過去ログを見よ!!
x 3.0.7
x パケロスするが気にするな!!
x なぜか、なんかいかモニターを開くと成功する(とうぜん抜き差ししてリセットを掛ける)

目的
最小限の小改造で接点の情報をWeb表示

SSIDとパスワードは、修正する事


```c++

const char *ssid = "ご自宅のSSID";
const char *password = "ご自宅のパスワード";

```

![o_coq599.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9f5f2b86-09c5-fc61-9121-9ad376040247.jpeg)

![o_coq600.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/dbb3b888-3861-c172-f0b7-59b2e8e43ee0.jpeg)

![o_coq601.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/66f6b099-adfa-dd93-9ba0-032e674feb21.jpeg)




```c++




//WebServer_sw1_M5NanoC6_1


#include <WiFi.h>
#include <NetworkClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>


const char *ssid = "ご自宅のSSID";
const char *password = "ご自宅のパスワード";


WebServer server(80);

const int led = 7;

void handleRoot() {
  digitalWrite(led, 1);


  //↓接点の情報を開始
  static char data[256+1];  
  static uint32_t msg_count = 0;

  int inJ = digitalRead(1);

  char *strJ;
  if(inJ == 0){
    strJ = "Button J was released";
  }else{
    strJ = "Button J was pressed";
  }

  snprintf(data, sizeof(data), "(%d) %s  #%lu",inJ ,strJ , msg_count++);

  //↑接点の情報が終了


  server.send(200, "text/plain", data);
  digitalWrite(led, 0);
}

void handleNotFound() {
  digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(led, 0);
}

void setup(void) {
  pinMode(led, OUTPUT);
  digitalWrite(led, 0);
  pinMode(1, INPUT);
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  for(int i=0;i<10;i++){
    delay(500);
    Serial.print(".");
  }

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("esp32")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);

  server.on("/inline", []() {
    server.send(200, "text/plain", "this works as well");
  });

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();
  delay(2);  //allow the cpu to switch to other tasks
}


```
重要な更新: シングル サインオン (SSO) にグローバル エンドポイントを使用する Salesforce Marketing Cloud Engagement　環境



+ [Important Update: Salesforce Marketing Cloud Engagement org using a Global Endpoint for Single sign-on (SSO) ](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000m83t)

2025 年 2 月 1 日までに、シングル サインオン (SSO) 用のグローバル エンドポイント を使用している Salesforce Marketing Cloud Engagement 組織に重要な更新が必要です。組織は、シングル サインオン用のテナント固有のエンドポイント(TSE) を採用する必要があります。

+ どのようなアクションを取る必要がありますか?

組織の SSO エンドポイントを更新するには、ナレッジ記事「グローバル ログイン エンドポイントは 2025 年 2 月 1 日に廃止されます」の手順に従ってください。 

+ なぜこのような変化が起こるのでしょうか?

SSO のグローバルエンドポイントは廃止されました。Salesforce は、2025 年 2 月 1 日からテナント固有のエンドポイントを適用します。 

+ さらに詳しい情報はどこで入手できますか? 

詳細については、[「グローバル ログイン エンドポイントは 2025 年 2 月 1 日に廃止されます」](https://help.salesforce.com/s/articleView?id=002890895&type=1)を参照してください。Salesforceカスタマー サポートに問い合わせてサポートを受けることもできます 。
【転職】公務員からIT企業への転職時で学んだこと

## 簡単に自己紹介
・年齢：30代前半
・家族構成：妻、娘×1（2歳）
・前職：公務員（海上自衛隊）
・ITの経験：直近3年間でインフラの運用保守
・当時の保有資格：LPICレベル2、Java Silver

簡単ですが、以上です。

## 転職を決意した理由
　前職の仕事を約17年間やってきたこともあり、このまま定年までこの職業で働くつもりだったのですが、3年ほど前から、インフラの運用保守を行う部署に配属され、そこで「IT」に触れたことがキッカケです。

　今まで、やりたいことが見出せなかった私が、初めて「IT」という没頭できるものに出会うことができ、これを仕事にしてみたいと強く感じ、長年居続けた「安定」という環境を捨てて、転職しようと決意しました。

　このまま、前職でも私のやりたいことは実現できるのでは？という言葉もよくいただくのですが、今後システムの設計や構築業務といった上流工程へのチャレンジは、組織の規定上、困難であったため、それならばキャリアアップが可能な環境に身を置こうかなと思いました。
 
## 転職活動で使用した転職エージェントサイト
・Geekly

https://www.geekly.co.jp/content/55tw/?utm_source=ya-102&utm_medium=ys01&utm_campaign=ya-102&ysad=712541516879&yskw=geekly&ysti=kwd-300300261325&ysmt=b&ysfi=&ysdv=c&yscp=19604107115&yclid=YSS.1001259706.EAIaIQobChMIvMj3lpLBiQMVtix7Bx2ffDFrEAAYASAAEgJofvD_BwE

・doda

https://doda.jp/?argument=MC76WbSa&dmai=a636d1f4d46f23&cid=001004a0g060002&utm_id=001004a0g060002&&msclkid=9b999084d40915291b4ff7a32435e859&gclid=9b999084d40915291b4ff7a32435e859&gclsrc=3p.ds

・JAC Recruitment

https://www.jac-recruitment.jp/lp/org-04?argument=t8TVhtKA&dmai=a64fa84608c57e&utm_source=bing&utm_medium=cpc&utm_campaign=MS_BR&utm_content=mixture&msclkid=7ee717ccc2f41636e02f70eb3296ba0a

上記の3つのサイトに登録して、転職活動を行いました。
まず、1つ言えるのは、複数の転職エージェントサイトに登録してみて、色んな情報を集めることが重要です。

どのエージェントサイトも良い点はあるのですが、特に私がお勧めしたいサービスは、dodaのスカウトサービスになります。

これは、企業側が求職者に対して、オファーを送ってくれるものですが、これにより求めてくれる企業の中から選定できるので、マッチング率も高かったです。
さらに、企業から多数のオファーをいただけることで、自身のモチベーションも高めることができたのは、転職活動を続けていくうえで、励みになりました。

## 転職活動の流れ

１．レジュメの作成
　レジュメという、履歴書と職務経歴書の２つを作成する必要があります。
 当時の私は、転職したこともなかったため、「なんじゃ、そりゃ？」って感じでした。

 調べてみると、フォーマットがたくさんネット上に落ちてありますが、私は、使用するエージェントサイトのものをダウンロードし、作成しました。
 （エージェントサイトの担当者にとって、自社のフォーマットを使用するのが分かりやすいと感じたため。）

 正直、最初に私が作成したレジュメは薄すぎて、とてもお見せできるものではなかったのですが、各エージェントサイトの担当者からのフィードバックをいただき、修正をすることで、なんとか企業側に見てもらえる状態のものが作成できました。
 なので、皆さんも不安になることはないので、とりあえず作成してみて、担当者からのフィードバックをもらうことをオススメします。

２．企業からのオファー
　前述したとおりですが、dodaには、企業からのオファーをいただく機能がありましたので、そのオファーをいただいた企業の中から、自分の転職の軸に合うところを何社か選定しました。

３．面接
　２で選定した企業との面接が行われました。（基本２回：１回目はWeb面接、２回目は対面での面接）

この面接に対する準備をしっかりしておくことをオススメします。
特に私が重要だと思うのは、以下の２点です。
・質問に対する回答を事前に覚えておく。
　
・硬くなりすぎず、自然体で面接に臨む。

私の場合、事前の準備が出来ていることで、本番の面接に緊張しても覚えていること伝えるだけなので、面接中は、落ち着いた態度で対応することができました。

４．内定獲得～受諾
　ありがたいことに最終的に内定をいただけたのは５社ありました。
どの企業も魅力的でワクワクしていたのですが、その中で１社に決めなければなりません。
最後の最後まで悩みましたが、決め手は
・自分のやりたいことを実現できるか

・年収は希望の範囲におさまっているか
この２つの軸で決めることになりました。
これで、最初は家族からの反対もありましたが、納得してもらい無事に転職することが出来ました。

## まとめ
　今回は、転職をテーマに記事を書かせていただきました。
 転職で悩んでいる方のまずは最初の１歩を歩めるものになれれば幸いです。

 もし、こういうことが気になるよ～って方がいましたらコメントを頂けると喜びますのでお待ちしております。
2次元TypedArrayの平坦化

現時点で`TypedArray`に2次元は実装されていませんが、`Array`に`TypedArray`を詰め込んだ2次元風`TypedArray`を作る事はよくあります。…ないですか? ならばよし!
さて本題、2次元もどきを1次元に変換する処理を考察してみます
```js
let a=[new Uint8Array([1]), new Uint8Array([2,3]), new Uint8Array([4,5,6])],
b=a.flat()
```
上記のような処理では**bはArray**となり、`TypedArray`ではありません。素朴なloopで実現してみましょう。`A.reduce((a,b)=>a+b.length,0)`で要素総数を調べて`TypedArray`に突っ込みます
```js
let A=[new Uint8Array([1]), new Uint8Array([2,3]), new Uint8Array([4,5,6])],
	B=new Uint8Array(A.reduce((a,b)=>a+b.length,0)),b=0;
for(let a of A)B.set(a,b),b+=a.length;
console.log(B)//[1,2,3,4,5,6]
```
`Blob`を利用すると簡単です。ただし`async`やら`await`やら必要になるのが難点。非同期の`new Blob(a).arrayBuffer().then(a=>{...})`で代用するのもいい
```js:8bits
(async a=>{
//2次元もどきTypedArray
a=[new Uint8Array([1]), new Uint8Array([2,3]), new Uint8Array([4,5,6])];
//1次元化
a=new Uint8Array(await new Blob(a).arrayBuffer());
console.log(a)//[1,2,3,4,5,6]
})()
```
```js:16bits
(async a=>{
a=[new Uint16Array([1]), new Uint16Array([11,111]), new Uint16Array([1111,11111,-1])];
a=new Uint16Array(await new Blob(a).arrayBuffer())
console.log(a)//[1,11,111,1111,11111,65535]
})()
```
## 速度比較
速度性能はどうなのでしょうか。loopの方は`reduce + for of`版と`for of x 2`版を用意。Blob版は前述と同様。
```js
const flat0=A=>{
	let B=new Uint8Array(A.reduce((a,b)=>a+b.length,0)),b=0;
	for(let a of A)B.set(a,b),b+=a.length;
	return B
},
flat1=A=>{let a,b=0,B;
	for(a of A)b+=a.length;
	B=new Uint8Array(b);b=0;
	for(a of A)B.set(a,b),b+=a.length;
	return B
},
flat2=async A=>new Uint8Array(await new Blob(A).arrayBuffer());

(async()=>{console.clear();
for(let loop=1<<18,size=1024,n=8;n--;loop>>=1,size*=2){
	let A=Array(loop).fill(new Uint8Array(size));
	console.time("loop0");
	flat0(A);
	console.timeEnd("loop0");
	console.time("loop1");
	flat1(A);
	console.timeEnd("loop1");
	console.time("blob");
	await flat2(A);
	console.timeEnd("blob");
}})()
```
`Blob`が他を圧倒する低速ぶりでした。5倍以上遅いですよフフフ…。想定外の結果と言わざるを得ません。flat0とflat1は同程度ですが、flat0(`reduce`版)は配列が極端に小さい場合不利っぽいですよフフフ…。
## 番外編
以下の処理では何が出力されるでしょうか? `3,3,3`? `1,2,3`?
```js
let a=[Array(1),Array(2),Array(3)];
for(a of a)console.log(a.length)
```
なぜこんな問題出したか…。それは本記事は当初こんな書き方をしようとしていたからだ! 混乱を避けるために改変したらしい…
typescript における interface と typeの用途と機能の違い

TypeScriptでは、`interface`と`type`はどちらもオブジェクトや関数の構造を定義するために使用されますが、微妙な違いや使用上の特徴があります。それぞれの違いについて詳しく説明します。

### 1. **基本的な用途**

- `interface`: オブジェクトの構造を定義するためのキーワードです。オブジェクトのプロパティ、メソッド、関数の型を定義できます。特に、クラスやオブジェクトの構造を他のコードと共有する場合によく使われます。
- `type`: より汎用的な型エイリアスを作成するためのキーワードです。オブジェクトの構造だけでなく、プリミティブ型、ユニオン型、タプル型など、さまざまな型を定義できます。

### 2. **拡張とマージ**

- `interface`**の拡張**:
  - `interface`は、他のインターフェースを`extends`して拡張できます。また、同じ名前の`interface`が複数回宣言された場合、自動的にマージされます。
  - **例**:
    ```typescript
    interface Person {
      name: string;
    }
    interface Employee extends Person {
      employeeId: number;
    }
    // マージ例
    interface Person {
      age: number;
    }
    // 結果:
    { name: string; age: number; }
    ```
    ‌
- `type`**の拡張**:
  - `type`は`&`（交差型）を使用して拡張できますが、同じ名前の`type`を再定義してマージすることはできません。
  - **例**:
    ```typescript
    type Person = { name: string; };
    type Employee = Person & { employeeId: number; };
    ```

### 3. **柔軟性と制約**

- `interface`**の制約**:
  - `interface`はクラスで実装するためのインターフェースとしても使われ、特にオブジェクトの構造に対して明確に適しており、オブジェクト指向プログラミングでの利用が推奨されます。
- `type`**の柔軟性**:
  - `type`はユニオン型やタプル型、その他の複雑な型を作成するのに適しています。たとえば、`string | number`のようなユニオン型や、特定のリテラル型を定義できます。
  - **例**:
    ```typescript
    type ID = string | number;
    type Tuple = [string, number];
    ```

### 4. **使用例**

- `interface`:
  ```typescript
  interface User {
    id: number;
    name: string;
    greet(): void;
  }
  const user: User = {
    id: 1,
    name: 'Alice',
    greet() {
      console.log('Hello');
    },
  };
  ```
  ‌
- `type`:
  ```typescript
  type User = {
    id: number;
    name: string;
    greet: () => void;
  };
  const user: User = {
    id: 1,
    name: 'Alice',
    greet() {
      console.log('Hello');
    },
  };
  ```

### 5. **結論と推奨事項**

- `interface`**を選ぶ理由**: オブジェクトの構造を定義する必要があり、拡張や自動マージが必要な場合に適しています。また、クラスの実装にも使われるため、オブジェクト指向プログラミングでの使用に向いています。
- `type`**を選ぶ理由**: プリミティブ型、ユニオン型、タプル型、または複雑な型のエイリアスを定義したい場合に適しています。`type`は柔軟性が高いため、より多用途に使えることが特徴です。

一般的に、プロジェクトのニーズに合わせて`interface`と`type`を使い分けるのが良いです。`interface`はオブジェクト構造に特化し、`type`は型のエイリアス全般に対応するものとして考えると理解しやすいでしょう。
2024/11/4主にITとかセキュリティの記事

東南アジア日系企業におけるオペレーティングモデルに着目したサイバーセキュリティ強化
APリスクアドバイザリー ニュースレター（2024年11月1日）
https://www2.deloitte.com/jp/ja/pages/risk/articles/asia-pacific/cyber-tom.html

米国 NIST サイバーセッキュリティフレームワーム2.0関係のクイックスタートガイド SP 1302 CSF の階層の使用、SP 1303 エンタープライズリスクマネジメント、SP 1305 サイバーセキュリティサプライチェーンリスクマネジメント（C-SCRM）(11/2)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/11/post-67aed8.html

HTML4 × Shift_JIS のサイトをNext.js × ヘッドレスCMSに置き換えた話(11/1)
https://qiita.com/benjuwan/items/9f3cd4ef191b23294d73

DNSハイジャック(11/3)
https://cybersecurity-jp.com/security-words/104677

首相官邸を装った偽サイトに注意！サイバー攻撃から身を守る対策とは？
https://cybersecurity-park.com/3297/

沖縄の地にて極悪ハッカー集団からECサイトを護れ！～Hardening 2024 Convolutions 参加記～(11/1)
https://qiita.com/labpixel/items/7ea08d98bb5a24909315

ディズニーをクビになった元従業員がシステムをハッキング、レストランのメニューのアレルゲン情報を削除するなど悪行三昧(10/31)
https://news.livedoor.com/article/detail/27469367/

米国 ホワイトハウス：2024 年「重要インフラの安全保障とレジリエンス月間」に関する宣言(11/2)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/11/post-92c6fe.html

米国NIST SP 800-233 クラウドネイティブ・アプリケーションのためのサービスメッシュ・プロキシモデル (2024.10.16)(11/2)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/11/post-bad582.html

米国 ホワイトハウス：ファクトシート AI大統領令から1年間の主な成果(11/2)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/11/post-a7c485.html
esbuildのtargetオプションも目的と機能について

`esbuild`の`target`オプションは、JavaScriptコードの**トランスパイルのターゲット環境を指定**するために使用されます。このオプションにより、コードがどのJavaScriptのバージョンやブラウザ、Node.jsのバージョン向けに変換されるかを決定します。

### 1. **目的**

- **互換性を確保するため**: `target`を指定することで、サポートしたいブラウザやNode.jsのバージョンに合わせてコードがトランスパイルされます。これにより、古い環境でも最新のJavaScriptコードが動作するようにします。
- **コードサイズの最適化**: 対応する環境がモダンブラウザのみであれば、余分なトランスパイルを省略でき、最終的なコードサイズを小さくできます。
- **パフォーマンスの向上**: 必要なトランスパイルを減らすことで、ビルド速度が向上し、結果的に効率的な開発ができます。

### 2. **機能**

- **ターゲット指定**: `target`オプションで、どの環境向けにトランスパイルするかを指定できます。指定することで、`esbuild`はコード中のモダンな構文をその環境に対応した形に変換します。

**例**:

```
esbuild.build({ entryPoints: ['src/index.js'], bundle: true, outfile: 'dist/bundle.js', target: 'es2017' });
```

この設定では、`es2017`（ES8）の機能をサポートするブラウザをターゲットにしてコードを生成します。

- **ターゲットのバリエーション**:
  - `es5`, `es6`, `es2015`, `es2016`, `es2017`, `es2018`, などのECMAScriptバージョン。
  - `chrome58`, `firefox57`, `safari11`, `edge16` など、特定のブラウザバージョン。
  - `node12`, `node14`, `node16` など、特定のNode.jsバージョン。

### 3. **動作例**

たとえば、モダンな構文である`async/await`や`optional chaining`（`?.`）を使用しているコードをターゲット環境がサポートしていない場合、`esbuild`はそれをトランスパイルして、互換性のある形に変換します。

- **target: 'es5'**: `async/await`や`arrow functions`、`let/const`などの構文は、ES5の範囲に含まれないため、それに対応するトランスパイルが行われます。
- **target: 'es2020'**: `optional chaining`や`nullish coalescing`はそのまま残されますが、それより古いバージョンのターゲットでは変換が行われます。

### 4. **複数ターゲットの指定**

複数のブラウザやNode.jsバージョンをサポートする場合でも、`esbuild`は最も古いターゲットに合わせてコードを変換します。複数ターゲット指定を一つの`target`で表現することはできませんが、ビルドプロセスを分けて異なるターゲット向けのビルドを作成することは可能です。

### **まとめ**

`esbuild`の`target`オプションは、JavaScriptコードを指定されたターゲット環境に合わせてトランスパイルする機能を提供します。これにより、サポートするブラウザやNode.jsのバージョンに合わせてコードが適切に変換され、互換性を保ちながら効率的な開発が可能になります。`target`を適切に設定することで、不要なトランスパイルを減らし、ビルド速度やパフォーマンスを向上させることができます。
DNS（Domain Name System）とは？ 名前解決の仕組みと階層構造

DNS（Domain Name System）は、**ドメイン名をIPアドレスに変換するシステム**です。ユーザが「www.example.com」などのウェブサイトにアクセスする際、DNSがそのドメイン名をIPアドレスに変換し、目的のサーバに接続できるようにしてくれます。この「名前解決」の仕組みは、インターネットを利用する上で欠かせない技術です。

### DNSの階層構造
DNSは、世界中で分散管理されており、階層的な構造で名前解決が行われます。主な役割を持つサーバは以下の通りです。

1. **ルートDNSサーバ**
   - 名前解決の最初の問い合わせ先となり、世界中に13のルートDNSサーバが分散しています。
   - ルートDNSサーバは、トップレベルドメイン（TLD）サーバのIPアドレスだけを保持しており、例えば「.com」「.org」「.jp」などのドメインの担当TLDサーバへの経路を返します。

2. **TLD DNSサーバ**
   - TLD DNSサーバは、各トップレベルドメイン（TLD）に対応するサーバで、「.com」「.jp」「.org」など、それぞれのTLDに属するドメインの情報を管理しています。
   - 例えば、「example.com」の名前解決を行う場合、「.com」のTLDサーバが「example.com」配下のネームサーバのIPアドレスを返します。
   - TLDサーバは非常に多くのアクセスを受けるため、世界中に分散されており、Anycastルーティングにより、ユーザから最も近いTLDサーバが自動的に選ばれるようになっています。

3. **SLD DNSサーバ（ネームサーバ）**
   - SLD DNSサーバ（セカンドレベルドメインDNSサーバ）は、ドメイン名の最終的な名前解決を担当します。
   - 例えば「www.example.com」の場合、「example.com」のSLDサーバが「www.example.com」の具体的なIPアドレスを返します。
   - SLDサーバは通常、各ドメイン所有者（企業や組織）によって管理され、TLDサーバから委託された情報をもとに、ドメイン配下の名前解決を行います。

### DNSの名前解決の流れ
DNSの名前解決は階層的に行われ、以下の流れでIPアドレスが返されます。

1. **ルートDNSサーバに問い合わせ**  
   ユーザが「www.example.com」にアクセスすると、まずルートDNSサーバに問い合わせが行われ、ルートサーバは「.com」TLDサーバのIPアドレスを返します。

2. **TLD DNSサーバに問い合わせ**  
   続いて、「.com」TLDサーバに対して「example.com」についての問い合わせが行われ、TLDサーバは「example.com」のSLD DNSサーバのIPアドレスを返します。

3. **SLD DNSサーバに問い合わせ**  
   最後に、SLD DNSサーバに「www.example.com」のIPアドレスを問い合わせ、ここで最終的なIPアドレスが返されます。これにより、ユーザは目的のウェブサイトにアクセスできます。

### 負荷対策
TLD DNSサーバは非常に多くのリクエストを受けるため、次のような負荷対策が取られています。

- **Anycastルーティング**：ユーザから最も近いTLDサーバに接続するため、負荷が分散されます。
- **複数のサーバによる分散運用**：各TLDは複数のサーバで運用され、世界中に分散配置されています。
- **キャッシュの利用**：クライアントやISPのDNSサーバが、名前解決結果をキャッシュし、TLDやSLDサーバへのリクエストが減少するようにしています。

### まとめ
DNSは、ルートDNSサーバからTLDサーバ、SLDサーバと、階層的に情報を引き出す仕組みで構成されています。これにより、膨大なドメイン名とIPアドレスの対応関係を効率よく管理できるだけでなく、冗長性や負荷分散にも優れた構造となっています。DNSの仕組みは、インターネットの利用を支える重要な役割を果たしています。
Googleスプレッドシートの関数でダミーデータを楽に作る方法

# はじめに
モックアップや開発試験等でも用いることがあるダミーデータを皆さんはどのようにして作られていますか？
十数行程度のデータであれば、あれこれ考えながら手動で数値入力してもそこまで時間がかからずできてしまいます。

しかし、数千・数万行のデータを作成するとなれば、非常に骨の折れる作業になってしまい、貴重な開発時間が削られてしまいます・・・・・

Googleスプレッドシートには関数の機能が存在し、それを用いることでランダムな数字を行に付与することが可能です。それが、たとえ数千・数万行ある場合でも、とても簡単に作成ができます！

スプレッドシートの操作は高度なプログラミングスキルを必要としないため、エンジニア以外の方でも簡単に作成することができます。

今回は、Googleスプレッドシートを用いて数千行あるダミーデータを楽に作る方法を紹介します。

# 対象読者
- 開発試験でダミーデータを工数かけることなく作りたい方
- ダッシュボードを作るに当たって、モックアップ用にダミーデータが必要になった方

# やったこと
今回は114種類の商品データの3ヶ月分の日別の在庫数を作成しようと思います。
在庫数のところは空欄の状態にしておきます。

![スクリーンショット 2024-11-04 2.20.27（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/f77a30f4-c970-fb75-32bb-24334c5df041.png)

では在庫数のデータを作成していきます。
用いる関数は`RANDBETWEEN`です。

使用方法は、下記のように使います。
```
=RANDBETWEEN(開始の整数,最後の整数)
```

なお、生成されるのは整数値になります。負の値を指定することも可能です。

今回は、300から400の間の整数を生成していきます。

![スクリーンショット 2024-11-04 2.27.49 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/a923ca9b-a533-3027-1f83-c26fdbc35f9a.png)

そうすると351という数字が出てきました。

![スクリーンショット 2024-11-04 2.33.23 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/ca60aa24-9243-ac65-5d85-000acfac2dbb.png)

最後に右の丸の部分をダブルクリックすると、全てのデータに300から400の間の整数が生成されます。

![スクリーンショット 2024-11-04 2.42.20（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/f1613d52-869b-ee3d-efa9-21cae06ec2ff.png)

最後の行まで進んで、全てのデータに適応されていることがわかりました。簡単ですね。

![スクリーンショット 2024-11-04 2.42.32（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/b48b8f59-b276-f354-1f56-b8c6784f95e9.png)

:::note warn
ただし、注意点があります。
RADNBETWEEN関数で生成したデータは、リロードをすると、最初算出した値から可変になってしまいます。
そのため、開発試験等で用いる場合は、生成した値をctrl+C(コピー)して、別シートで「特殊貼り付け>値のみ貼り付け」で作成したデータをコピペします。
そうすると、作成された当時の値がそのまま使えますので、リロードをしても値が変わりません。
:::

![スクリーンショット 2024-11-04 2.52.32 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/96b2cef8-46fe-5857-2610-45362bd5f115.png)

# まとめ
今回はGoogleスプレッドシートの関数を活用し、数千行のダミーデータを生成しました。
スプレッドシートはプログラミング技術を必要としないことから、より多くの人が使えるツールとなっています。
大容量のダミーデータが必要になった方は、是非とも今回紹介した関数をご活用ください！
Nuxt3のHTTPサーバー機能の特徴

Nuxt 3におけるHTTPサーバー機能は、より統合的で高性能なフレームワーク構造を提供するために設計されています。以下に、Nuxt 3のHTTPサーバー機能の特徴を詳しく説明します。

### 1. **Nitroエンジンの導入**

Nuxt 3は、新しいサーバーエンジンである**Nitro**を使用して、バックエンド機能をサポートします。Nitroは、サーバーレス環境や従来のサーバー環境など、さまざまなデプロイターゲットでアプリケーションを実行できるようにする柔軟なエンジンです。

- **サーバーレス対応**: AWS Lambda、Vercel、Netlifyなどのサーバーレスプラットフォームに簡単にデプロイ可能です。
- **コンパクトなビルド**: Nitroは軽量で、デプロイ時にコンパクトなビルドを生成します。
- **迅速な起動**: 最適化されたランタイムと少ない依存関係により、サーバーの起動が迅速です。

### 2. **統合されたAPIルート**

Nuxt 3では、APIルートをフレームワーク内で直接作成することができ、バックエンドの構築が容易です。`server/api`ディレクトリにファイルを追加することで、すぐにAPIエンドポイントを定義できます。

- **シンプルなファイルベースのルーティング**: `server/api`ディレクトリ内に配置したファイルがそのままAPIエンドポイントになります。
- **自動リロード**: APIファイルを変更すると、サーバーが自動でリロードされて反映されます。
- **軽量なハンドリング**: デフォルトで軽量なHTTPハンドラとして、必要に応じて`unjs/h3`を利用して高度な処理が可能です。

**例**:

```javascript
// server/api/hello.js
export default defineEventHandler((event) => {
  return { message: 'Hello, world!' }
})
```

### 3. **unjs/h3ライブラリの採用**

Nuxt 3のHTTPサーバー機能は、軽量なHTTPハンドリングを行うために**unjs/h3**ライブラリを使用しています。`h3`は、高速でシンプルなHTTPユーティリティとして設計され、ルーティング、ミドルウェア、レスポンスハンドリングが容易にできます。

- **非同期処理のサポート**: 非同期関数を活用して、複雑なデータ処理を簡単に実装可能。
- **柔軟なルーティング**: `h3`を通じてカスタムルーティングやミドルウェアを構築することができます。

### 4. **ハイブリッドなSSR/SSG対応**

Nuxt 3は、サーバーサイドレンダリング（SSR）と静的サイト生成（SSG）の両方をハイブリッドにサポートしています。HTTPサーバーは、SSRで動的にページを生成する一方、SSGで生成された静的ページにも対応します。

- **動的レンダリング**: リアルタイムでのデータ取得やAPI呼び出しに対応。
- **プリレンダリング**: 静的ページをビルド時に生成し、高速な配信が可能。

### 5. **TypeScriptの完全サポート**

Nuxt 3ではTypeScriptが完全にサポートされており、HTTPサーバー関連のコードも型安全に記述できます。これにより、より堅牢でメンテナンスしやすいコードが書けます。

### 6. **環境変数と設定**

Nuxt 3は、環境変数や設定ファイル（`nuxt.config.ts`）を通じて、HTTPサーバーの挙動を制御できます。これにより、ローカル環境と本番環境での設定の分離や、サーバーのポート番号などのカスタマイズが可能です。

- **環境変数の使用**: `process.env` を通じて、さまざまな環境設定にアクセス可能。
- **設定ファイルの拡張**: `nuxt.config.ts` でカスタムミドルウェアやプラグインを組み込める。

### 7. **高いパフォーマンスと最適化**

Nitroエンジンの採用により、HTTPサーバーのパフォーマンスが大幅に向上しています。また、`h3`ライブラリは軽量設計であり、リクエスト処理が高速です。これにより、大量のリクエストを効率よく処理できるようになっています。

### **まとめ**

Nuxt 3のHTTPサーバー機能は、Nitroエンジンを活用して高性能かつ柔軟なバックエンドを提供します。`unjs/h3`による軽量なHTTPハンドリング、APIルートの統合、SSR/SSG対応などが特徴で、アプリケーションのバックエンド開発をシンプルに実現できます。また、TypeScriptサポートや環境設定の柔軟性も強みです。これらの特徴により、Nuxt 3はフルスタックフレームワークとして、フロントエンドとバックエンドのシームレスな統合を実現しています。