OmniAICreator/Qiita-1.07M huggingface dataset:
いちいちEC2に接続するのにSSHのコマンドを打つのがめんどくさい。

## EC2へのSSH接続を`~/.ssh/config`で効率化する備忘録

AWS Session Managerは便利ですが、利用状況によってはコストが気になる場合があります。コストを抑えつつ、ローカル環境からEC2インスタンスへ手軽にSSH接続するための設定方法を、備忘録としてまとめます。`~/.ssh/config`ファイルを利用することで、接続コマンドを簡略化し、管理を容易にすることが目的です。

### 前提条件

1.  **EC2インスタンスにElastic IPアドレスが付与されていること:**

      * **趣旨:** Elastic IPアドレス（固定パブリックIPアドレス）をインスタンスに関連付けることで、インスタンスを停止・起動してもIPアドレスが変更されなくなり、`~/.ssh/config` に記述する `HostName` を固定できます。これにより、安定した接続設定を維持できます。必須ではありませんが、設定しておくことを強く推奨します。

2.  **キーペア（.pemファイル）のパーミッションが正しく設定されていること:**

      * **趣旨:** SSHクライアントは、秘密鍵ファイルが第三者から読み取られないよう、厳格なパーミッションを要求します。セキュリティ上の重要な要件であり、所有者のみが読み取り可能である必要があります。
      * **設定コマンド例:**
        ```bash
        chmod 400 /path/to/your-key.pem
        ```
      * **根拠:** SSHプロトコルのセキュリティ要件に基づき、秘密鍵の漏洩を防ぐため。

### 1\. SSHディレクトリの作成とパーミッション設定

SSH設定ファイルを格納する `~/.ssh` ディレクトリを作成し、適切なパーミッションを設定します。

```bash
# ~/.ssh ディレクトリが存在しない場合に作成 (-p オプション)
mkdir -p ~/.ssh

# ディレクトリのパーミッションを所有者のみ読み書き実行可能 (700) に設定
chmod 700 ~/.ssh
```

  * **趣旨:** `~/.ssh` ディレクトリと内部のファイルは、セキュリティ上、所有者以外からアクセスできないように保護する必要があります。`700` は、所有者にのみ全ての権限を与え、他人には一切の権限を与えない設定です。

### 2\. `~/.ssh/config` ファイルの設定

`~/.ssh` ディレクトリ内に `config` ファイルを作成（または編集）し、接続情報を記述します。

```bash
vim ~/.ssh/config
```

以下のように設定を記述します。

```
# 接続設定ブロックの開始 (Host には任意の接続名を指定)
Host xxxxxx-server
    # 接続先EC2インスタンスのパブリックIPアドレスまたはDNS名
    HostName <EC2インスタンスのパブリックIPアドレスまたはDNS名>
    # 接続ユーザー (AMIによって異なる場合がある)
    User ec2-user
    # 使用するキーペアファイル (.pem) のフルパス
    IdentityFile <キーペアファイル(.pem)のフルパス>

    # (オプション) 接続維持設定
    # 60秒ごとにサーバーに生存確認パケットを送信
    ServerAliveInterval 60
    # 3回応答がない場合に接続を切断
    ServerAliveCountMax 3
```

**【設定例】**

```
Host app-server
    HostName 123.45.67.89
    User ec2-user
    IdentityFile /Users/hoge/.ssh/app-key.pem
    ServerAliveInterval 60
    ServerAliveCountMax 3
```

  * **趣旨:** `config` ファイルを利用することで、`ssh` コマンド実行時にIPアドレス、ユーザー名、キーファイルのパスなどを毎回指定する必要がなくなり、`Host` で指定した名前（ニックネーム）だけで簡単に接続できるようになります。
  * **注意:** `User` は、Amazon Linux 2の場合は `ec2-user` が一般的ですが、Ubuntuの場合は `ubuntu` など、使用するAMIによって異なりますので、適宜変更してください。
  * **接続維持オプション:** 長時間操作がない場合にSSH接続がタイムアウトで切断されるのを防ぐために設定します。

### 3\. SSH接続の実行

`config` ファイルに設定した `Host` 名を使ってSSH接続を行います。

```bash
ssh <任意の接続名>
```

**【実行例】**

```bash
ssh app-server
```

成功すると、以下のようにサーバーにログインできます。

```
A newer release of "Amazon Linux" is available.
  Version 2023.7.20250512:
Run "/usr/bin/dnf check-release-update" for full release and version update info
   ,    #_
   ~\_  ####_       Amazon Linux 2023
  ~~  \_#####\
  ~~    \###|
  ~~      \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~      V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
[ec2-user@ip-xxx-xx-xx-xx ~]$
```

以上で、`~/.ssh/config` を利用した効率的なSSH接続設定は完了です。

### 補足：セキュリティグループ

この方法でSSH接続を行うには、EC2インスタンスにアタッチされているセキュリティグループで、SSH（TCPポート22）のインバウンド通信が許可されている必要があります。セキュリティを確保するため、**接続元のIPアドレス（ご自身のローカル環境のグローバルIPアドレス）のみ**からのアクセスを許可するように、セキュリティグループのルールを設定することを忘れずに。
初めて知ったIT用語 10月〜3月

4-9月: https://qiita.com/kotacoffee/items/991c6d170df14b4acd05
遅くなってしまった...もう5月末...

特定のサービスなどに関連していない、普遍的な用語をまとめています

# 知らなかった用語

##### エフェメラルコンテナ
k8s のトラブルシューティングの際に利用される一時的に作成されるコンテナ

##### SAGA パターン
マイクロサービスにおいてサービスを横断するデータの更新が発生する際に、各更新をローカルのトランザクションとした上でそれらをイベント・メッセージ等で管理するパターン
細切れにすることで各MSのデータに対するロック時間を短縮できる

##### EOSL(End of Service Life)
サーバなどの保守・サポートの終了期限、リプレースメントの目安になる

##### SOAP(Simple Object Access Protocol) 通信
XML を利用する通信方式
RESTful API と比べ、メッセージのやり取りに当たって設定することが多い代わりにセキュリティ等が良い印象、主にサービス内部間通信で用いられる

##### LDAP(Lightweight Directory Access Protocol)
ネットワーク内の機器・アカウントの情報を一元化するために保管するレジストリ

##### Turnkey solution
すぐに使える状態で引き渡すこと

##### HA(High Availability)
可用性の高いシステムの構成
CAP 定理の A を意識した AP 構成のこと？

##### JSONPath
正規表現などを使って、オブジェクト保持なしでJSON要素を取り出すライブラリ

##### crontab/job
UNIX 上の定期的なファイル実行を実現する仕組み・ファイル

##### kibibyte
2 進数を元にしたメモリサイズの単位、10 乗ごとに10進数単位と同様に接頭辞が変わる
1KiB = 2^10
1MiB = 2^20

##### BusyBox
基本UNIXコマンドを1ファイルにまとめて提供するプログラム
docker のサイズを抑えるために採用されてたりするが、一部コマンドが実装されてなかったりもする

##### コアダンプ(core dump)
エラー（主にクラッシュ系）が発生した際にシステムによって作成されるメモリ状態などを記録したファイル

##### CPaaS(Communications Platform as a Service)
サービスに音声通話・動画などダイレクトなコミュニケーション手段を提供するプラットフォーム

##### TTL(Time To Live)
トークンなどの有効期限のこと

##### blue-green deployment
サービスリリース時にトラフィックを徐々に新しいものに割り当てていくリリース
カナリアリリースのように試しのリリースというよりかは、切り替えを行う前提で丁寧に比率を変えていくイメージ

##### 分散トレーシング
マイクロサービスを行き来するトラフィックを追跡・可視化する技術

##### ノンブロッキング
逐次処理の逆、可能な処理を並列でどんどん行う仕組み
非同期処理はコールバックが返ってくるまでずっと面倒見る一方で、ノンブロッキングは一旦呼んだらコールバックが返ってくるまではほっといて返ってきたら処理するみたいなイメージ

##### 専用線
DC 間などを直で繋ぐケーブル
インターネット通信のようにパブリックにさらされることがないためセキュリティ・可用性・正確性などが必要な場面で利用

##### Upstream API
より上流（データ側）のAPIのことを指す、データ提供元のAPIなど
逆にクライアントサイドは下流

##### CRI/CSI/CNI

それぞれ、
- コンテナを動かすためのコマンドの規格(ex: dockerコマンド)
- コンテナオーケストレーションとストレージの間のやり取りの規格
- コンテナとそれを管理するネットワークの通信規格
これが揃っているおかげで k8s で docker 以外も使えるし、いろんな外部要素コマンドとかが統一されてる

##### Webhook
システムで特定の処理が走った際に、通知などを行う連携サービスのAPIコールを行うようにすることで通知等を行う仕組み

##### fatJAR
Java アプリケーションの実行に必要な依存 package とかを一つの JAR ファイルにまとめたもの
コンテナベースの開発・マイクロサービスなどの普及によって、依存関係とかの部分をシンプルにしたいという需要に応える形で普及

##### arc42
システム・ソフトのドキュメント・コミュニケーションのテンプレート・ベストプラクティス的なもの
日本ではあんまり普及していない気がする
WSLでパスワードを忘れたので再設定したい

## パスワードを再設定する手順
- ユーザ名確認
- ルートユーザでログイン
- パスワード変更

## ユーザ名確認

まずはUbuntuを開き, 下記のコマンドを入力.
```bash
cat /etc/passwd
```
ユーザ名一覧が出てくるので, パスワードを変更したい対象のユーザ名を確認する.

## ルートユーザでログイン

コマンドプロンプトを開き, 下記のコマンドを入力.
WSLにルートユーザでログインすることが出来る.

```bash
wsl -u root
```

## パスワード変更

上記コマンドプロンプト上で以下のコマンドを入力.
※[username]と[new_password]はあなたの場合に当てはめてください.

```bash
passwd [username] [new_password]
```

以上で終了.

### 参考記事
[WSL で Ubuntu のユーザーパスワードを忘れた場合のリセット方法](https://qiita.com/ou-mori/items/3ae1546f43d69a927c6b)
[【Linux入門】ユーザー一覧を確認する方法をわかりやすく解説！](https://www.sejuku.net/blog/54497)
「Lift State Up」って何？Reactの状態管理でつまずかないための考え方

# はじめに

Reactでアプリを作っていると、次のような状況に出会ったことはありませんか？

* 複数のコンポーネント間で同じ状態を共有したい
* 子コンポーネントから親の状態を変更したい
* 状態が増えてコードがごちゃごちゃになってきた...

そんなときに登場するのが「**状態のリフトアップ（Lift State Up）**」という概念です。

# シナリオ１：単一のTodoを表示する😀

まずは単一のTodoコンポーネントに状態を持たせてみます。

```jsx:Todo.jsx
import { useState } from "react";

export default function Todo() {
  const [todo, setTodo] = useState({
    id: 1,
    label: "Learn React",
    completed: false
  });

  const toggleCompleted = () => {
    setTodo({ ...todo, completed: !todo.completed });
  };

  return (
    <label>
      <input
        type="checkbox"
        checked={todo.completed}
        onChange={toggleCompleted}
      />
      {todo.label}
    </label>
  );
}
```

これはシンプルで良さそうに見えますが、**複数のTodoを表示したいとき**に困ったことが起きます。

# シナリオ２：複数のTodoを表示する😓

Todoを複数表示したいとします。

```jsx
<Todo />
<Todo />
```

こうすると：

* 同じ初期状態のTodoが並ぶだけで個別に管理できない
* ユーザーが新しいTodoを追加しても反映できない
* 状態が分散して管理しづらい

ここで必要になるのが、「状態を親に上げる（Lift State Up）」です。

# 解決策：状態のリフトアップで解決！

### ステップ１：状態を子 → 親に移動する

```jsx:Todo.jsx
import { useState } from "react";
import Todo from "./Todo";

export default function TodoList() {
  const [todos, setTodos] = useState([
    { id: 1, label: "Learn React", completed: false },
    { id: 2, label: "Learn Next.js", completed: false }
  ]);

  const handleUpdateTodo = (updatedTodo) => {
    setTodos(todos.map(todo =>
      todo.id === updatedTodo.id ? updatedTodo : todo
    ));
  };

  return (
    <ul>
      {todos.map(todo => (
        <Todo
          key={todo.id}
          todo={todo}
          onUpdate={handleUpdateTodo}
        />
      ))}
    </ul>
  );
}
```

### ステップ２：親 → 子は props で渡す

```jsx
export default function Todo({ todo, onUpdate }) {
  const toggleCompleted = () => {
    onUpdate({ ...todo, completed: !todo.completed });
  };

  return (
    <li>
      <label>
        <input
          type="checkbox"
          checked={todo.completed}
          onChange={toggleCompleted}
        />
        {todo.label}
      </label>
    </li>
  );
}
```

# Lift State Up のルール

> **「複数のコンポーネントで共有したい状態」は共通の親に持たせる**

その上で、

* 子 → 親への通信は「関数（コールバック）」を props で渡す
* 親 → 子へは「状態」そのものを props で渡す

この構成にすることで、アプリ全体の状態を**一元管理**でき、コードも明快になります。

# 補足：このあと学ぶと良いこと

* `useReducer` を使った状態管理
* コンポーネント分割とコンテキストAPI
* 外部ライブラリ（Recoil, Zustandなど）による状態管理

# おわりに

「状態を親に上げる（Lift State Up）」はReactの基本中の基本ですが、これを意識するだけでアプリの設計がグッとしやすくなります。

まずは小さなアプリから、「どこに状態を置くべきか」を考えてみましょう！
【Rails】親子関係になっているデータのフォーム送信について

# 記事概要
Ruby on Railsで、親子関係になっているデータをフォームで登録する方法についてまとめる

# 前提
- Ruby on Railsでアプリケーションを作成している
- 親子関係でテーブル設計を行っている

# サンプルアプリ(GitHub)
https://github.com/likapantrip/one-piece_character

# 手順
1. ネスト構造でルーティングを設定する
    ```config/routes.rb
    Rails.application.routes.draw do
      root to: 'organizations#index'
      resources :organizations, only: :index do
        resources :members, only: [:index, :new, :create]
      end
    end
    ```
1. 子要素のコントローラーに、newアクションとcreateアクションを追加する
    ```app/controllers/members_controller.rb
    class MembersController < ApplicationController
      def new
        # paramsに含まれているorganization_idを代入
        @organization = Organization.find(params[:organization_id])
        # Memberモデルのインスタンス情報を代入
        @member = Member.new
      end
    
      def create
        # paramsに含まれているorganization_idから、メンバーが所属する組織のレコードを取得
        @organization = Organization.find(params[:organization_id])
        # 上記組織(Organization)に紐づくMemberモデルのインスタンスを生成し、属性値を指定
        @member = @organization.members.new(member_params)
        # インスタンスを保存
        @member.save
        # メンバー一覧画面に画面遷移
        redirect_to organization_members_path(@organization)
      end
    
      private
      def member_params
        params.require(:member).permit(:name)
      end
    end
    ```
1. 子要素のnew画面(app/views/members/new.html.erb)にフォームを追加する
    ```erb
    <%= form_with model: [@organization, @member], local: true do |f|%>
      <%= f.text_field :name %>
      <%= f.submit '送信' %>
    <% end %>
    ```

# form_withメソッド
https://qiita.com/likapantrip/items/41e40c774daa310711de#form_withメソッド
ドラえもん のび太のG検定 　シラバスまるわかり入門（会話で楽しく学ぶ！）

こんにちは！今回は「G検定」を本気で目指す方向けに、  
**JDLA公式シラバス（2024年版）に沿って**、ドラえもんとのび太くんの会話風に詳細解説していきます。

---

## はじめに

**のび太**「ドラえもん、G検定ってさ、どんな内容が出るの？合格するには何を勉強したらいいの？」

**ドラえもん**「G検定の公式シラバスはとっても幅広いんだ。  
AIの基礎から、ディープラーニング、法律や倫理、そして最新の生成AIまで――  
全部で【技術分野】【法律・倫理分野】の2大パートに分かれてるよ！」

---

## 1. 技術分野

### 1-1. 人工知能とは何か

**のび太**「まず“AIって何？”ってとこから？」

**ドラえもん**「そうだよ。AIの定義・レベル分け（制御プログラム／古典的AI／機械学習／深層学習）や、AI効果、ロボットとの違いなんかも押さえておこう。」

- AIの定義と例
- AIのレベル分け
- AI効果
- ロボットとAIの違い

---

### 1-2. 人工知能分野の主要な問題

**のび太**「AIってどんな問題を考えてるの？」

**ドラえもん**「“シンギュラリティ”とか“チューリングテスト”“中国語の部屋”“シンボルグラウンディング問題”みたいな哲学的な話題や、知識獲得の難しさも大事なんだ。」

- シンギュラリティ
- チューリングテスト
- シンボルグラウンディング問題
- フレーム問題
- 強いAI／弱いAI

---

### 1-3. 探索・推論

**のび太**「AIはどうやって“考える”の？」

**ドラえもん**「“探索木”や“ハノイの塔”を解くアルゴリズム（幅優先探索、深さ優先探索、αβ法など）を学ぶよ！」

---

### 1-4. 知識表現とエキスパートシステム

**のび太**「専門家みたいなAIもあるの？」

**ドラえもん**「そう、“エキスパートシステム”や“オントロジー”、有名な“ELIZA”や“ワトソン”もこの章で勉強するよ。」

---

### 1-5. 機械学習の基礎

**のび太**「AIが“学ぶ”ってどういうこと？」

**ドラえもん**「“機械学習”は、ルールを人間が教えなくてもデータからパターンを発見する技術。  
代表例はスパムフィルターやレコメンドエンジンだね。」

---

### 1-6. ディープラーニングの概要

**のび太**「最近のAIは“ディープラーニング”が主役？」

**ドラえもん**「そう！ニューラルネットワークの進化形で、“LeNet”“AlphaGo”“LLM（大規模言語モデル）”まで登場してるよ。」

---

### 1-7. 教師あり学習・教師なし学習・強化学習

**のび太**「AIの“学び方”にも色々あるの？」

**ドラえもん**「うん。  
- “教師あり学習”は、正解データを与えて学ばせる方法（例：分類や回帰）。  
- “教師なし学習”は、正解なしでグループ分けや特徴抽出（例：クラスタリング）。  
- “強化学習”は、行動して報酬を得ながら賢くなる方法なんだ。」

---

### 1-8. モデルの選択・評価

**のび太**「どのAIが優秀かってどう判断するの？」

**ドラえもん**「“汎化性能”“交差検証”“過学習”の回避、そして“MSE”“AUC”“混同行列”などの評価指標をしっかり理解しておこう。」

---

### 1-9. ディープラーニングの構造と要素技術

**のび太**「AIの“中身”はどうなってるの？」

**ドラえもん**「層構造（全結合・畳み込み・正規化・プーリング・スキップ結合）、  
RNNやAttention、最適化（Adam、SGD）、誤差逆伝播法や正則化手法など、細かいキーワードも多数出るよ！」

---

### 1-10. ディープラーニングの応用

**のび太**「AIってどんなことに使われてるの？」

**ドラえもん**「画像認識（CNN、YOLO）、自然言語処理（BERT、GPT、word2vec）、音声処理（WaveNet）、  
強化学習（DQN, AlphaStar）、データ生成（GAN、Diffusion Model）、転移学習・マルチモーダル・モデル軽量化や解釈性も重要！」

---

### 1-11. AIの社会実装

**のび太**「AIを仕事で使うには？」

**ドラえもん**「AIプロジェクトの進め方（CRISP-DM、PoC、MLOps）、  
データ収集・加工・分析・学習、モデル運用・モニタリングや共同開発の注意点も出るよ。」

---

### 1-12. AIに必要な数理・統計知識

**のび太**「やっぱり数学も必要？」

**ドラえもん**「微分・確率・分散・外れ値・仮説検定・距離や類似度…基礎はきっちり押さえようね。」

---

## 2. 法律・倫理分野

### 2-1. AIに関わる法律

**のび太**「AIって法律も守らなきゃいけないの？」

**ドラえもん**「もちろん。個人情報保護法、著作権法、特許法、不正競争防止法、独禁法…  
それぞれAIやデータ利用の現場で大事なルールがあるよ！」

---

### 2-2. AIと契約

**のび太**「AIのシステム開発では契約も関係するの？」

**ドラえもん**「うん。開発委託契約やSaaS契約、知財の帰属、NDA（秘密保持契約）…  
ここを理解しないとトラブルのもとになるんだ。」

---

### 2-3. AI倫理・AIガバナンス

**のび太**「AIって“悪用”とか“差別”とかの心配もあるよね？」

**ドラえもん**「その通り！  
- AI倫理・AIガバナンスのガイドライン  
- プライバシー（カメラ画像活用も含む）  
- 公平性（アルゴリズムバイアスやデータ偏り）  
- セキュリティ（Adversarial Attackやモデル窃取）  
- 透明性・説明責任（XAI）  
- 環境・労働・社会・民主主義への影響…  
いまや“倫理”と“ガバナンス”は最重要テーマなんだ。」

---

## まとめ：G検定の学び方

**のび太**「うわ〜、想像以上に広い！やっぱりコツコツやるしかないかぁ…」

**ドラえもん**「うん。でも“全部一気に覚える”必要はないよ。  
まずは興味のあるところから入って、キーワードや事例を会話や日常に結びつけて覚えよう。  
“G検定”はAI時代の“安心・安全ひみつ道具”みたいなもの。みんなで正しくAIを使いこなそう！」

---

> ※本記事はJDLA「G検定2024年シラバス」に基づいてまとめています。  
> 最新情報や詳細は[公式サイト](https://www.jdla.org/business/certificate/)や[シラバス](https://www.jdla.org/certificate/general/#general_No03)を必ず確認してください！

---
【プロパティ 変換】Laravel初学者に知って欲しい！アクセサとミューテタについて

## 導入
新卒のエンジニアです。
簡単なプロフィールは以下に

- 私立文系卒
    - 学生時代に1年半ほどインターン活動
    - Laravelを頑張った
- めちゃめちゃ柏レイソルファン
    - 弱くても応援を続けたチームが、強くなる瞬間こそ至高！
- ジョジョ、ガンダムがマイブーム


本記事では、Laravelにおける**アクセサ・ミューテタ**について紹介していきます

おそらく初学者は知らないであろうLaravelの仕様です
ものすごく便利な上、初学者が通るであろう道にはなかなか置いていないと思っています

そのため、少し初学者を抜け出せるのではないでしょうか！

- Laravelを数ヶ月学習したけど、まだ自分は初学者を抜け出せていない
- モデルで取得したプロパティの扱いを上手くなりたい

こんな人に読んでもらえると嬉しいです！

## アクセサ・ミューテタって

簡単に表現すると
- プロパティを取得または挿入するときの変換ロジックをモデル側で定義すること

です！
これが非常に便利です！
具体例ベースで進めていきます！

## どんな場面で用いるか

よくあるケースかと思い、性別の扱いについて取り上げます

webアプリケーションでユーザが持つ属性について考えた際、名前や性別は高い確率で入ってくるでしょう

その際に、性別はどのように管理するでしょうか
だいたいの場合、テーブルのgenderカラムに以下の形で管理することが多いのではないでしょうか

- 「１」の場合は男性
- 「２」の場合は女性

genderカラムで「男性」「女性」と文字列が重複するのは気持ちが悪いので、小さいバイト数で管理できるこの形を採用するのではないでしょうか

何も間違っていないと思います

ここで登場するロジックが、以下です
- 取得するときに変換するロジック
    - ユーザに数字で示すわけにはいかないため、数字から性別の文字列に変換しないといけない
- 挿入するときに変化するロジック
    - データベースには文字列で挿入するわけにはいかないため、性別の文字列から数字に変換しないといけない

片方どちらかがない場合も考えられますが、今回は紹介のためにどちらも挙げます

### 悪い取得変換ロジック
以下に良くない取得変換ロジックを挙げます

初学者にめちゃめちゃありがちだと思います
僕もよくやりました、誰しもが通る道だと思います

```
class UserController
{
    public function getUserInfo()
    {
        $user = User::find(Auth::id());

        if($user->gender === 1){
            $user->gender = '男性';
        }else{
            $user->gender = '女性';
        }

        //以下略
    }
}
```
もしくは、laravel blade側で変換するタイプです。
```
<li>{{ $user->gender === 1 ? '男性' : '女性' }}</li>

もしくは

@php
    if($user->gender === 1){
        echo '<p>男性</p>';
    }else{
        echo '<p>女性</p>';
    }
@endphp
```

::: note alert
初学者の方はまだあまり知らなくて良いことですが、
エンジニアリングにおいて、基本的にフロント側で何か処理をさせることは好ましくありません

責務が異なるためです
:::

これらの稚拙な処理、自動化させたくありません？
ここで登場するのがアクセサ・ミューテタです！

## 使い方
ここからはLaravelのバージョンによって、少し書き方が変わってきます。
バージョンごとに紹介していきます

ソースコードは性別変換です

### Laravel 8まで
```
class User extends Model
{
    public function getGenderAttribute($value)
    {
        return $value === 1 ? '男性' : '女性' ;
    }
}
```
宣言するメソッド名は「get〇〇Attribute」です
〇〇内はプロパティ名をキャメルアッパーで書きましょう

これで大丈夫です
$user->genderとプロパティを取得すると変換してくれます

### Laravel 9以降
```
use Illuminate\Database\Eloquent\Casts\Attribute;

class User extends Model
{
    protected function gender(): Attribute
    {
        return Attribute::make(
            get : fn($value) => $value === 1 ? '男性' : '女性',
            set : fn($value) => $value === '男性' ? 1 : 2
        )
    }
}
```
こちらでは書き方が大きく変わります

メソッド名はそのままプロパティ名のみ
その中で、アクセサとミューテタどちらも定義できます

genderというプロパティ名を持つメソッドの中で、アクセサとミューテタどちらも定義できるというのは、とても感覚的で良いです！

## 終わり
Laravelはバージョンごとで書き方がかなり変わります

Laravelって良いですね、最近また自分の中でブームが到来しています

より難しいことを学習したい、プロダクトのソースコードを読みたい気持ち

我ながら、本当の意味で技術に意欲のある新卒もなかなかいないと思うんですよね
これを純粋なまま持ち続けることができれば、きっとさらに成長できるのでしょう
Atcoder解いてみた　ABC 053 B - A to Z String

# ABC 072 C - Together
問題は[こちら](https://atcoder.jp/contests/abc053/tasks/abc053_b)  

# 回答
```C++
#include <iostream>
#include <string>
#include <map>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

int main() {
    std::string s;
    cin >> s;

    char A = 'A';
    char Z = 'Z';

    int startIdx = 0;
    for (auto it = s.begin(); it < s.end(); it++) {
        if (*it == A) {
            break;
        }
        startIdx++;
    }

    string sRev = s;
    reverse(sRev.begin(), sRev.end());

    int endIdx = 0;
    for (auto it = sRev.begin(); it < sRev.end(); it++) {
        if (*it == Z) {
            break;
        }
        endIdx++;
    }
    endIdx = sRev.size() - endIdx - 1;

    std::cout << endIdx - startIdx + 1 <<std::endl;
    return 0;
}
```
react×laravel10で家計簿アプリ作成

# カケポン: シンプルに使えて続けやすい家計簿アプリを作ってみた
https://kake-pon.com/

## はじめに
家計簿を「続ける」のが難しいからこそ、楽しく続けられる体験を追求したアプリを開発しました。

---

## 📱 アプリ全体像

![カケポン画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555326/8a98506f-0681-4211-b0c5-129acb8b5e5f.png)

カケポンは、3つの主要画面（ホーム・取引登録・カテゴリ分析）を軸に、日々の家計管理が無理なく続けられるUI設計になっています。

- **ホーム（ダッシュボード）**  
  月ごとの収支サマリー、日別の取引一覧が一画面で確認可能。シンプルなグラフで支出傾向が直感的にわかります。

- **取引登録画面**  
  ＋ボタンからワンタップで登録開始。金額とカテゴリを選んで即保存できるので、記録が習慣化しやすい設計です。

- **カテゴリ分析画面**  
  カテゴリ別の支出を円グラフで可視化。どこにお金を使っているかを定期的に振り返ることができ、支出の見直しにも役立ちます。

操作はすべてモバイルファーストで設計しており、片手でサクサク入力・確認ができる軽快な体験を提供しています。

---

## 🗄️ DB 設計図

![家計簿アプリ.drawio (1) (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555326/7408315a-306f-4c10-a89a-44bf5c4560b7.png)

本アプリのデータベースは、「ユーザー」「カテゴリ」「収支の記録」「月別予算」など、家計簿に必要な最小限かつ拡張性のある構成を採用しています。

ユーザーごとのデータ分離により、個人利用に特化

収入・支出のカテゴリを個別に管理し、柔軟な分類が可能

収支記録は日付・カテゴリ・金額・メモ付きで記録でき、集計に最適で、予算管理機能も備えています。

[📄 DB設計スプレッドシート](https://docs.google.com/spreadsheets/d/12yO13ONInd9DSd4_OPPaikfRCEjw3h4fEJiyFedEilk/edit?usp=sharing)

---

## ☁️ インフラ構成図

![](https://storage.googleapis.com/zenn-user-upload/7a5451ab5541-20250527.png) 

カケポンのインフラは **AWS 上に構築されたコンテナベースのモダンな構成**を採用しています。

- **フロントエンド**は React (Vite) 製の SPA を S3 + CloudFront 上にホスティングし、高速かつセキュアな配信を実現
- **バックエンド API（Laravel）** は ECS Fargate にコンテナとしてデプロイ。ロードバランサ経由でリクエストを受け付け
- **MySQL (RDS)** はプライベートサブネット内に配置し、外部アクセスを遮断。セキュアなデータ管理を実現
- **Route 53 + ACM** により独自ドメイン・SSL 対応を構成
- **CI/CD** は GitHub Actions を使い、main ブランチへの push をトリガーに API を自動デプロイ

**シンプルながらスケーラビリティとセキュリティを意識した設計で、個人開発でも本番運用に耐える構成を目指しました。**

---

## コンセプト
- ミニマルで直感的な UI  
- カテゴリ別の見える化  
- 将来的には、習慣化支援・共有家計管理・固定費用設定などの拡張も見据えた設計

## 技術スタック
- `React` + `TypeScript` (Vite)  
- `Laravel` 10 + `Sanctum`  
- `AWS` (Route53, CloudFront, S3, ECS Fargate, RDS, S3)  
- `GitHub Actions` (CI/CD)  

## 実装ポイント
1. 完全 SPA 化でレスポンス向上  
2. モバイルファーストデザイン  
3. 自動デプロイワークフローの構築  
4. AWS 上でのインフラ IaC 設計  

## 関連リンク
- 設計資料: https://drive.google.com/drive/folders/1PmtkIZxj6BMiNiYzRp1_RseaNJvh7naz?usp=sharing
---
NIST SP 800-63-Aを読む 1


今回は私がNIST 800-63を読むにあたり、背景知識を整理して序盤をかじってみようという記事です
毎月のことながらジャンルのバラつきを感じますね。


# NISTとは？
National Institute of Standards and Technologyの略であり、アメリカの商務省の傘下の研究機関。
NISTにはITL(Information Technology Laboratory)という情報技術に関する研究所がある。その中でも、CSD(Computer Security Division)というセキュリティ部門がサイバーセキュリティの標準、ガイドラインを開発している。

# NIST SP800-63とは？
アメリカの政府向けのデジタルアイデンティティに関するガイドラインで、NIST SP800-63-3に加え下記に3つに分かれる
- NIST SP800-63A：登録と本人確認
- NIST SP800-63B：認証とライフサイクル管理
- NIST SP800-63C：フェデレーションとアサーション

# NIST SP800-63-A
NIST SP800-63-Aは下記10のセクションで構成されている。
1. Purpose(Informative)
2. Introduction(Informative)
2. Definitions and Abbreviations(Informative)
2. Identity Assuarance Level Requirements（Normative）
2. Identity Resolution, Validation, and Verification（Normative）
2. Derived Credentials（Normative）
2. Threats and Security Considerations(Informative)
2. Privacy Considerations(Informative)
2. Usability Considerations(Informative)
2. References(Informative)

今回は1~3を見ていきます。

## 1. Purpose
- IAL(Identity Assurance Level)ごとにリソースへのアクセスを求める人の登録、本人確認に関する要件を定めたもの
- 身分証明書の受容性、妥当性、検証に関して整理している
- CSP(Credential Service Providers)の責任を明確化


## 2. Introduction
- 現実の特定の主体とアイデンティティを紐づけたい場合とそうでない場合がある
- IAL
    - IAL1: 現実の特定の主体とアイデンティティの紐づけは不要、自己証明
    - IAL2: リモートか対面での本人確認が必要
    - IAL3: 対面での本人確認が必要

## 3. Definitions and Abbreviations
- SP800-63 ApendixAを参照




# 参考
- [NRIセキュア セキュリティ用語解説](https://www.nri-secure.co.jp/glossary/nist)
- [NTTデータ先端技術 NISTとセキュリティ](https://www.intellilink.co.jp/column/security/2019/090200.aspx)
- [DevelopersIO INST SP 900-63-B-4](https://dev.classmethod.jp/articles/nist-sp-800-63b-4-2/)
- [NIST 800-63A](https://pages.nist.gov/800-63-3/sp800-63a.html)
- [OpenID Foundation Japan翻訳版](https://openid-foundation-japan.github.io/800-63-3-final/sp800-63a.ja.html)
AtCoderをPythonで取り組んだ振り返り(ABC407 A~C、D追加)

どうもこんにちは！

今週のコンテストはCまで完答。

# 問題

問題は以下のリンクから。完答できたCまでを振り返ります。

https://atcoder.jp/contests/abc407/tasks

https://atcoder.jp/contests/abc407/editorial

## A - Approximation -
与えられた正の整数Aと正の奇数BからA÷Bの差が最小となる整数を出力するという問題です。計算結果を四捨五入した値を出せばよいです。
ちょうど[丸めに関連してまとめたところでした。](https://qiita.com/meel/items/230d3e73533b3ca96882)正の整数とわかっているので、計算式で処理しました。
~~~Python
a,b = map(int,input().split())
print(int(a/b*2+1)//2)
~~~

## B - P(X or Y) -
6面体のサイコロを2つ振ったときに、次の2つの条件の少なくとも一方を満たす確率を求めるという問題です。なお、計算結果は小数となり絶対誤差が$10^{-9}$以下であれば正答と判断されます。
- 2つの出目の合計がX以上
- 2つの出目の差の絶対値がY以上

組み合わせは36通りで2重ループでも十分計算できるとして、全ての組み合わせでどちらかを満たす組み合わせの数をカウントして、36で割った値を出力しました。Pythonは計算結果をそのまま出力してもテストケースの範囲ではACとなりました。
~~~Python
x,y = map(int,input().split())
c = 0
for i in range(1,7):
    for j in range(1,7):
        if i+j >= x or abs(i-j) >= y:
            c +=1
print(c / 36)
~~~

## C - Security 2 -
前提として、はじめは空の文字列tに対して、以下の加工ができるとします。
- tの末尾に0を追加する。例えば012を0120にする。
- tに含まれるすべての数字がそれぞれ次の数字に置き換える。ただし、9の次は0とする。例えば0129を1230にする。

このどちらかの加工をしたときを1回として、与えられた文字列Sを生成するには最小で何回加工する必要があるかという問題です。Sは0から9の数字からなり、文字数は最大$5×10^5$文字です。2重ループはTLEになりそうですね。
解き方のポイントは以下と考えました。
- 1の桁の加工の回数はその数字の数。例えば3なら0から3への3回。13回加工しても3になるが最小回数ではない。
- 末尾に0をつけるときの1の桁の数字は、追加する桁の加工回数を引いた数。例えば、53を作りたいとき、1の桁を追加する前の数字は5-3で2のとき。(2→20→31→42→53という順で加工)

以上から、与えられた文字列Sを逆順に並び替えて、桁の追加回数と1桁ずつ数字を加算した回数を数えればfor文1回で算出できます。このとき、末尾の加算回数を引いたときに負の数になることもありますが、10で割ったあまりに置き換えることで9から0のループも踏まえた処理ができます。(例えば、2から3回分戻すと-1になるが、-1を10で割ったあまりは9になる)
~~~Python
s = input()
r = s[::-1] # 与えられた文字列を逆順に並び替え

a = b = 0
for i in r:
    i = int(i)
    i -= b # 桁を追加する前の数字に戻す作業
    if i < 0:
        i %= 10
    b += i # 0から数字を増やす回数のカウント
    a += 1 # 桁の追加回数のカウント
    
print(a + b)
~~~

--- 2025/5/28 追記 ---
D問題の公式解説を見て、Pythonに変換したので追記します。

## D -Domino Covering XOR -
H行W列のマス目に非負整数がマスごとに1つ配置されていて、このマス目に0個以上のドミノを置けるとします。1個のドミノは2マス分の大きさで、重ならないように縦か横に配置できるものです。
この条件下で、ドミノが置かれていないマスの非負整数をビットごとに排他的論理和した値の最大値を求める問題。
計算量的に全探索ができるということで、すべてのケースで求める値を計算して最大値を出力すればよかったようです。
~~~Python
def score(ans,i,j):
    if j == w: # i行の最終列のマスを確認後のとき、i+1行の最初に移動する
        j = 0
        i += 1
    if i == h: # すべてのマスを確認後のとき、置かれたドミノをもとに計算する
        point = 0
        for ni in range(h):
            for nj in range(w):
                if domino[ni][nj] == False:
                    point ^= s[ni][nj]
        ans = max(ans,point)
        return ans
    if domino[i][j] == True: # ドミノが配置済みのマスなら次のマスを確認
        ans = max(ans,score(ans,i,j+1))
    else:
        ans = max(ans,score(ans,i,j+1)) # ドミノを配置しないとして次のマスを確認
        if j+1 < w and domino[i][j+1] == False: # ドミノを横に配置する場合
            domino[i][j] = domino[i][j+1] = True
            ans = max(ans,score(ans,i,j+1))
            domino[i][j] = domino[i][j+1] = False
        if i+1 < h and domino[i+1][j] == False: # ドミノを縦に配置する場合
            domino[i][j] = domino[i+1][j] = True
            ans = max(ans,score(ans,i,j+1))
            domino[i][j] = domino[i+1][j] = False
    return ans

h,w = map(int,input().split())
s = []
for _ in range(h):
    s.append( [int(x) for x in input().split()] )
domino = [[False]*w for _ in range(h)]

ans = score(0,0,0)

print(ans)
~~~
--- 追記ここまで ---


ではでは。
DB2でよく見るSQLCODEと意味まとめ


# 基本構文エラー
### SQLCODE = -104

<b>エラー内容</b>：無効な構文、予約語、記号などが含まれている

<b>よくある原因</b>：

SQL構文ミス（カンマや括弧忘れ）

DB2の予約語をカラム名に使っている

<b>対処法</b>：

該当SQLの前後を確認（例：FROMの後にWHEREが抜けている など）

必要に応じて引用符（"column"）で囲う

### SQLCODE = -204
<b>エラー内容</b>：オブジェクトが存在しない（テーブル、ビュー、関数など）

<b>原因</b>：

指定したテーブルやカラムが存在しない（タイポ、スキーマ違い）

開発環境と本番環境でスキーマが異なる

<b>対処法</b>：

SELECT * FROM SYSCAT.TABLES で存在確認

フル修飾名（スキーマ.テーブル名）でアクセスする

# 権限関連エラー
### SQLCODE = -551
<b>エラー内容</b>：指定されたオブジェクトに対する権限がない

<b>対処法</b>：

GRANT SELECT ON テーブル TO ユーザー; などで明示的に権限付与

ロール・ユーザーの確認を行う

# トランザクション／ロック関連
<b>エラー内容</b>：トランザクションがロックタイムアウトまたはデッドロックによりロールバックされた

<b>原因</b>：

長時間ロック保持している処理がある

同時アクセスで競合が発生

<b>対処法</b>：

トランザクションの粒度を小さくする

ロックの種類や順序を統一する

アプリ側でリトライ処理を入れる

# データ整合性エラー
### SQLCODE = -803
<b>エラー内容</b>：一意制約（UNIQUE）違反

<b>原因</b>：

主キー・ユニークキーに重複した値を挿入しようとした

<b>対処法</b>：

挿入前に SELECT で存在確認

MERGE文やON CONFLICT DO NOTHING的な構文の検討（環境次第）

### SQLCODE = -407
<b>エラー内容</b>：NOT NULL制約違反（NULLを許容しない列にNULLが挿入された）

<b>対処法</b>：

該当カラムがNOT NULLか確認

アプリ側の値設定処理を見直す

### SQLCODE = -530 / -531 / -532

<b>エラー内容</b>：外部キー（FK）制約違反

<b>対処法</b>：

親テーブルのデータが存在しているか確認（-530）

子テーブルのデータが存在していないか確認（-531, -532）

外部キー制約が有効なまま、削除/挿入順が逆になっていないかチェック


# 参考リンク
IBM公式：SQLCODE一覧
 https://www.ibm.com/docs/ja/db2 （バージョン選択後、"SQL Messages"を参照）
Mockito基礎知識まとめ

## はじめに
最近Mickitoを使う機会が増えたので、この記事ではざっくりと基礎知識と使い方をまとめています。

## Mockitoってこんなの
・テスト対象クラスが依存しているオブジェクトを「モック（ダミー）」として再現するもの

・外部APIやDBなどの「結果が変わるもの」「重い処理」を無視してテストできる

・ユニットテストの純粋性を保てる

## @Mockと@InjectMocks
@Mockでモック(ダミーオブジェクト)を作成する
@InjectMocksで作成したモックをテスト対象のクラスに注入する

<details open><summary>サンプルクラス</summary>

```rb
class UserService {
    private final UserRepository repo;

    public UserService(UserRepository repo) {
        this.repo = repo;
    }

    public String getUserName(int id) {
        return repo.findById(id).getName();
    }
}
```
</details>

<details open><summary>サンプルクラスに対するテストクラス</summary>

@ExtendWith(MockitoExtension.class)
class UserServiceTest {

    // モックを作成する
    @Mock
    UserRepository mockRepo;

    // モックをテスト対象のクラスに注入する
    @InjectMocks
    UserService userService;

    @Test
    void testGetUserName() {
        User dummy = new User(1, "Alice");
        when(mockRepo.findById(1)).thenReturn(dummy);

        String name = userService.getUserName(1);

        assertEquals("Alice", name);
    }
}
</details>

# when().thenReturn() の基本
### 基本構文
when(mock.method(any())).thenReturn(値);

when(mock.method(any()))でモック化したオブジェクトのメソッドを指定する。
.thenReturn(値)にはテストで使用したい返り値を指定する。


# 呼び出しの検証 verify()
verify()はモックが正しく呼び出されたかどうかを確認するためのメソッド

### 基本構文
verify(モック).メソッド(引数);

### 例
verify(userRepository).findById(1);

### その他オプション
verify(mock).method();	1回だけ呼ばれた
verify(mock, times(n)).method();	n回呼ばれた
verify(mock, never()).method();	一度も呼ばれていない
verify(mock, atLeastOnce()).method();	少なくとも1回以上呼ばれた
verify(mock, atMost(3)).method();	最大3回まで呼ばれた

# 参考
・Mockito公式
https://site.mockito.org/

・
Excelとテキストエディタを駆使して作業効率を上げよう

# はじめに
受領したDB設計書を基にテーブルを作成することになりました。
テーブル数は少ないですが、各テーブルのカラム数が100近くあります。

効率よくテーブルを作成するクエリ（CREATE TABLEクエリ）を作成するためにExcelとテキストエディタを使います。

# 手法
さすがにDB設計書を晒す訳にはいかないので、カラム数が少ないですがサンプルを用意しました。

## 目的
目的は設計書を基にCREATE TABLEクエリを作成する事です。
#### 設計書
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/a044838d-d718-4c72-b2d7-b43b3887ed3d.png" width=50%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/ba560399-8982-463f-bb02-b14bcef7ecba.png" width=50%>
↓
#### クエリ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/9b6abe9d-c0ef-4bec-ab5c-0fb83ad2af5d.png" width=50%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/1e40e101-df8a-4e3a-9006-454ee01a051e.png" width=50%>

## 手順
#### １．ワークファイルにコピペ
新規でExcelを開き、DB設計書の内容をコピペします。
複数テーブルある場合は、どのテーブルのカラムか分かるようにしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/f8f7b173-a359-4a63-9aff-ba9ad5387641.png)

#### ２．列を追加
各列の間に列を挿入します。
以下の例では分かりやすいようにセルに色を付けています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/0eec35ed-5760-4f95-848e-ffc46ec001c5.png)

#### ３．各行をクエリに加工
行のセルを連結すると以下のようになるようにします。
>[number] \[nvarchar](20) NOT NULL,

型によって内容が変わる箇所は、オートフィルタを駆使します。
例えばH列の値はI列が空かどうかで分けています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/8b18aec7-5be8-4a25-ba33-54fea418b116.png)

PKは大した手間ではないので、手作業でクエリにします。
なので、列を消してしまいます。
そして、M列にNULL許容の値を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/5ce05f47-965f-4b10-9401-da26c10edadd.png)

#### ４．クエリの作成
テーブル名ごとにD列からM列をテキストエディタにコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/9963b200-c6bf-4631-aad5-6491a9aeba0c.png)

タブを置換して、「CREATE TABLE ～」とPKの設定を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/c7244811-a8e9-4163-b024-f90f65dc1676.png)


# おわりに
ここに書いた手順はあくまでもサンプルのフォーマットの手順になりますので、設計書のフォーマットに合わせて作業してみてください。

同じような手順でDTOが作れたりします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/4bbe77ed-4258-471e-b157-63f160eec67f.png)

生成AIを使って作成できる時代になってきているので、こんなやり方は不要になりそうですが、もう少しの間は使うことがありそうです。
uvでdemucsをインストールして音源分離

# 概要
uvでdemucsをインストールして音源分離しました。
少し手間取ったので要点をメモします。

# 環境
```sh
% sw_vers
ProductName:		macOS
ProductVersion:		14.7.4
BuildVersion:		23H420
% uv run python -V
Python 3.11.2 
```
# 手順

```sh
# 作業用dirの作成
mkdir vocalsep
cd vocalsep
# uv初期化
uv init
# torch追加。最新版はaddできないため2.2をadd
uv add "torch<2.3"
# numpy追加。demucsとの相性により1系をadd。
uv add "numpy<2.0"
# demucs追加
uv add demucs
# 音源分離の実行（ボーカルとそれ以外）
uv run demucs --two-stems=vocals {input_wav_path}
```

音源分離が完了すると`./separated/htdemucs/FILENAME`フォルダに`no_vocals.wav`, `vocals.wav`が作成されます。

# 解説
- uv addは2.2以下のバージョンでないとインストールできません。demucsは2.2で動くため、2.2をインストールすればよいです。
- demucsはnumpy 2系だと動かないためnumpy 1系をインストールする必要があります。
労働基準法　判例

プログラマが知っているとよい労働基準法　
https://qiita.com/kaizen_nagoya/items/f9621a4ed74967b7a1e8

労働働基準法 引用先、引用元一覧
https://qiita.com/kaizen_nagoya/items/659778f9ec7d002dfa4e

適切な労務管理のポイント
https://jsite.mhlw.go.jp/tokyo-roudoukyoku/content/contents/000501899.pdf

裁判例　労働条件に関する重要な裁判例を掲載します。
https://www.check-roudou.mhlw.go.jp/hanrei/
>1. 採用
採用の自由  三菱樹脂事件（S48.12.12最大判）http://www.zenkiren.com/Portals/0/html/jinji/hannrei/shoshi/00044.html
採用内定の取消
>2. 配置
出向
配置転換
>3. 処遇
募集条件と実際の労働条件が異なる場合
就業規則の効力
内部告発と懲戒
試用期間
管理監督者
>4. 年次有給休暇
年次有給休暇
>5. 賃金
中間収入の控除
割増賃金不払い
賃金と他の債権の相殺
賞与不払い
退職金不払い
>6. 解雇
解雇
懲戒
>7. 退職
辞職
有期契約・雇止め
退職勧奨
>8. 労働条件の引き下げ
労働条件の引き下げ
>9. 無期・有期契約労働者間の格差
無期・有期契約労働者間の格差
>10. ハラスメント
セクハラ
マタニティハラスメント
>11. 過重労働
過重労働
>12. メンタルヘルス
メンタルヘルス
>13. 仕事上のミスを理由とする損害賠償
仕事上のミスを理由とする損害賠償
>14. 会社物品の私的使用
会社物品の私的使用
>15. 守秘義務
守秘義務
>16. 競業避止
競業避止
>17. 事業場外労働のみなし制
事業場外労働のみなし制
>18. 労災支給処分と保険料認定処分の関係
労災支給処分と保険料認定処分の関係

労働基準関係判例一覧
https://www.zenkiren.com/jinji/top.html
(13)出典
|略称|名称|
|:--|:--|
|民集|	最高裁判所民事判例集
|刑集|	最高裁判所刑事判例集
|裁判集民|	最高裁判所裁判集民事
|裁判集刑|	最高裁判所裁判集刑事
|高裁民集|	高等裁判所民事判例集
|高裁刑集|	高等裁判所刑事判例集
|労働民集|	労働関係民事事件裁判集
|労働民例集|	労働関係民事裁判例集
|下級民集|	下級裁判所民事裁判例集
|下級刑集|	下級裁判所刑事裁判例集
|刑裁月報|	刑事裁判月報
|行裁月報|	行政裁判月報
|行裁例集|	行政事件裁判例集
|高裁刑特報|	高等裁判所刑事判決特報・高等裁判所刑事裁判特報
|高刑速報|	高等裁判所刑事裁判速報集
|第一審刑集|	第一審刑事裁判例集
|下級民特報|	高等裁判所・地方裁判所民事裁判例特報・簡易裁判所
|新聞|	法律新聞
|家裁月報|	家庭裁判月報
|無体財産例集|	無体財産権関係民事・行政裁判・例集
|時報|	判例時報
|タイムズ|	判例タイムズ
|金融法務|	旬刊金融法務事情
|金融商事|	金融・商事判例
|東高民時報|	東京高等裁判所（民事）判決時報
|東高刑時報|	東京高等裁判所（刑事）判決時報
|労働判例|	労働判例
|労経速報|	労働経済判例速報
|教職員人事判例|	教職員人事関係裁判例集
|裁判資料|	労働関係刑事事件判決集
|交通民集|	交通事故民事裁判例集

労働判例 WEB労政時報
https://www.rosei.jp/readers/news/cate_list/judge

労働判例 労働新聞社
https://www.rodo.co.jp/precedent/

【社労士試験】ただの最高裁判例まとめ【勉強方法】
https://sharosi.j-tatsujin.com/archives/7678
電磁気学のお気持ちを理解したい！【電界】

:::note warn
この記事は、電磁気学のお気持ちを理解することを目的としているため、一般的でない解釈や厳密性に欠ける議論を行っている部分が存在します。予めご了承ください。
:::


# 考えたい電荷と考えたくない電荷
ある電荷の振る舞いについて考えたい時、その電荷が受ける影響にだけ着目して議論するというのは適当でしょうか？教科書で学ぶ古典力学において考えるほとんどの状況においては、これらに対する答えはYesだと言えるでしょう。物体の自由落下を考えるとき、物体が地球から受ける万有引力を考えることはあっても、地球が物体から受ける万有引力による影響を考えることはありません。これは、地球が受ける影響が物体が受ける影響に比べて非常に小さく無視できると仮定しているからです。この仮定は、質量の存在する空間が非常に集中していて、考えたい物体が与える影響が限りなく小さい状況では妥当で有用です。

しかし、電磁気学が考えたい状況は、一般的に、**電荷が空間の至る所に存在していて、考えたい電荷が与える影響は無視できない**状況であることが多いです。結果的に、電磁気学では、**考えたい電荷によって影響を受ける、考えたくない電荷の振る舞いも一緒に考えなければならない**ということになります。


# 相互作用をどう考えるか
ところで、考えたくない電荷の振る舞いをどうして考えなければならないのでしょうか？前章では、考えたくない電荷が影響を受けると述べましたが、単に考えたくない電荷が一方的に影響を受けるだけなら、それは考えたい電荷が関知するところではありません。これを考える必要性は、**考えたくない電荷が影響を受けたことで、考えたくない電荷が考えたい電荷に与える影響も変化する**からです。以上の理由から、電磁気学では、**電荷が受ける影響と電荷が与える影響の両方向の影響**を、すなわち、**電荷間の相互作用**を考えていくことになります。

それでは、相互作用はどのように考えれば良いのでしょうか？電荷密度の回でも軽く言及しましたが、考えたいのは空間中に連続的に分布する電荷間の相互作用です。この点で、離散的な質点系のモデルは相性が良くありません。また、シミュレーション上の観点からも、大量の点電荷の相互作用を時間変化させながら見ていくのは非効率です。鍵となるのは、**電荷が受ける影響と電荷が与える影響を分けて考える**という発想です。


# 電荷密度は電界から影響を受ける
電荷密度の回でも述べたように、点に対して定義される量で有意義なのは電荷密度です。以降は、電荷密度間の相互作用という表現を用い、これを考えていくことにします(電荷間の相互作用は、これらを適切な積分区間で積分することで得られます)。前章では、電荷が受ける影響と電荷が与える影響を分けるというキーワードを提示しました。本章からは、電荷密度が受ける影響と電荷密度が与える影響を考えます。

ある点の電荷密度が影響を与える可能性があるのは、空間上のどの領域にある電荷密度でしょうか？電荷密度が存在しない点には当然影響を与えませんが、逆に言えば、電荷密度が存在すれば、空間中の全ての領域はこの電荷密度の影響を受ける可能性があります。より正確には、影響を与えている点の電荷密度自身はその影響を受けないため、**その点を除く空間中の全ての領域の電荷密度に影響を与える**可能性があります。

この理屈を逆に用いると、ある点の電荷密度はどの領域にある電荷密度から影響を受ける可能性があるかがわかります。要するに、**影響を受ける電荷が存在する点以外の全ての領域にある電荷密度から影響を受ける**可能性があります。従って、複数の(基本的には無限に多くの)電荷密度から影響を受けるわけですが、ありがたいことにこれらの影響は重ね合わせの原理が成り立ちます。重ね合わせの原理とは、「電荷密度が複数の電荷密度から影響を受けるとき、その影響は個々の電荷密度から受ける影響の線形和になる」という原理です。

ところで、電荷に関するCoulombの法則によれば、2つの電荷の間に働く力は電荷に比例し距離の2乗に反比例します。この電荷の大きさに比例するというのが、上述した線形和と相性がよく、予めある点に存在する電荷が空間に与える影響を考えておけば、実際にある点に電荷が存在する時に受ける影響は、その個々の影響の和と電荷の積として表すことができます。これは、電荷密度に置き換えても同じ話です。**ある点の電荷密度が空間に与える影響(電荷密度に与える影響ではなく)を空間全体に亘って考える**ことにより、実際にある点に電荷密度が配置されたときの振る舞いをこの影響のマップに従って考えることができます。これは電界と呼ばれます。

考えたい電荷密度からは、電界から影響を受けているように見えています。考えたい電荷密度が与える影響によって、考えたくない電荷密度が変化した場合、それによって生じる考えたい電荷密度の影響の変化は、電界の変化として認識されます。重要なのは、考えたい電荷密度からは影響の原因が隠蔽されているという点です。考えたい電荷密度からしてみれば、**考えたくない電荷密度による影響に興味があるのであって、考えたくない電荷密度の電荷分布には興味がありません**。極端な話、全く同じ影響を及ぼす2つの異なる考えたくない電荷密度の電荷分布は、考えたい電荷密度からしてみれば同じように扱いたいわけです。電界はその要請を満たすインターフェースとして作用していると考えられます。
ログ設計の解像度が上がる。外部API連携で役立ったログ出力の勘所

## はじめに
ログを追加する時に、「調査しやすいように」「運用で役に立つように」ということは理解しているのだが、今回他の方がログを追加してくださり、実際にどういうことかとても勉強になったので、こういうことを出力すればよいのかとわかったことをメモしておく。

### ERRORログ
エラーの発生内容がわかるようにする。

- どこで起きたエラーか
- 内容（外部API呼び出しの場合は、エラーのステータスコードやエラーメッセージなど。内部でのエラーの場合もエラーメッセージなど）
- 外部API呼び出し時はエラー時に渡したリクエスト

上2つは今までもやっていたけど、3つ目もあると便利。

### WARNログ
致命的ではないが注意すべきこと、今後問題になるかもしれないこと。

- 通常時でも発生しうるエラー（リトライなどで回復可能）が発生したという記録

エラーだからといって全部ERRORログにする必要はない。でもリトライで復帰可能なエラーでも発生したことは追えるようにしておいた方がよい。

### INFOログ
担当システムでは、INFOレベルまで通常ログを出しているので、常に出力されることになるログ。

- リクエスト内容
    - 調査の時にあると助かる。 
- リトライの記録・リトライ回数・リトライ待ち時間
    - API全体としては正常終了しているが、リトライが発生している時に、どれくらいリトライが発生しているか調べられる。API正常終了なのに内部的にはリトライが頻発している状況に気がついたりしやすくなる。（待ち時間は少し時間を置いてからリトライする設定にしている場合）
- 特に時間がかかりがちな外部API呼び出しのレスポンスタイム

どれくらい細かく出すかはログの保存容量や価格とも相談になるかもしれない。
今回入れてもらったログは結構細かめな気がする。

### DEBUGログ
本番環境では通常は出力されないログだが、エラー発生時やテスト時などにログレベルを変更して調査に使えるようにする。

- 外部APIのリクエスト・レスポンス内容
   - 普段から全て出すと膨大な量になってしまうが、当該APIのエラー時の調査に役立つ。実際レスポンス内容はとても役に立った。エラーになる前から仕込んであるとログレベルを変更するだけで調査できて便利。

- エラーに関して怪しい部分
    - 今回は他のログの出力状況から序盤に落ちている可能性が高かったため、序盤の処理１行１行にログを仕込み、ログがどこまで出ているかで落ちている箇所を特定していた。
    - 今回どこかの処理に時間がかかりタイムアウトエラーが発生していたため、外部APIのメソッドそれぞれにかかった時間を出力していた。

たまにしか発生しないエラーに関して、１行１行ログを出して、エラーが出たタイミングでリクエストID（も出していた）で絞って状況を特定するがとてもよかった。


### その他（共通）
- 配列などの場合は、対象のデータがどれかわかるidなど。
- リクエストのIDなどリクエスト全体でログを追えるようにするデータ。（ログライブラリで自動で出してくれる場合が多そう。）
- どのクラスで出力されているログか。（これもログライブラリに引数で渡すと記録してくれる場合が多そう。）
Microsoft「Edit」をLinuxで使う

先日、Microsoft から新たな CLI エディタ「Edit」が発表されました。
なかなか使いやすそうで好感触なので、Linux でも使ってみました。

- [MS公式ブログ リリース記事](https://devblogs.microsoft.com/commandline/edit-is-now-open-source/)
- 紹介記事 [“魔法の終了呪文”がいらないCLIエディタ「Edit」。Windows 11に標準搭載へ](https://pc.watch.impress.co.jp/docs/news/2016302.html)

分かる人にとっては「[リリースページ](https://github.com/microsoft/edit/releases/tag/v1.0.0) からバイナリをダウンロードして、展開して、パスを通す」で終わりの話ですが、一連の操作を備忘録として残しておきます。

## インストール

[公式のインストール手順](https://github.com/microsoft/edit?tab=readme-ov-file#installation) の通りです。

### Linux

```sh
# wget や xz が入っていない場合はインストールする。
# # Debian系の場合
# sudo apt update && sudo apt install -y wget xz-utils

# 本体のダウンロード（リリースから適宜バージョンを選択する）
wget -O edit.xz https://github.com/microsoft/edit/releases/download/v1.0.0/edit-1.0.0-x86_64-linux-gnu.xz
# 展開
unxz -c edit.xz > $HOME/.local/bin/edit
# ※ `$HOME/.local/bin` ディレクトリが無い場合は `/usr/local/bin` など別のディレクトリに変更するか、
# $ mkdir -p $HOME/.local/bin 
# で作っておく。この場合PATHも通っていないので設定しておく。
# $ export PATH="$HOME/.local/bin/:$PATH"

# 実行権限を付与
chmod 755 $HOME/.local/bin/edit
# 実行できるか確認
edit --version
# 元ファイルを削除
rm edit.xz
```

### Windows

[将来的にWindowsに標準搭載される予定](https://devblogs.microsoft.com/commandline/edit-is-now-open-source/#:~:text=This%20CLI%20text%20editor%20will%20be%20available%20to%20preview%20in%20the%20Windows%20Insider%20Program%20in%20the%20coming%20months.%20After%20that%2C%20it%20will%20ship%20as%20part%20of%20Windows%2011!) だそうなのでそのうちインストールなしで使えるようになるはずです。2025-05-24 現在はターミナルから以下のコマンドでインストールできます。

```powershell
winget install Microsoft.Edit
```

### Linux (ソースコードからビルド)

macOS版は今のところ（2025-05-24 現在）バイナリは提供されていませんが、ソースコードからビルドすることで同様に使用できるはずです。

<details><summary>ビルド手順</summary>

※ `docker run --rm -it debian:bookworm bash` で動作確認しました

```sh
# Rustをインストール
$ apt update && apt install build-essential curl git -y
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Enter押下
$ . "$HOME/.cargo/env"
$ rustup install nightly

# gitリポジトリをクローン
$ git clone https://github.com/microsoft/edit.git
# 筆者環境ではコンポーネントが足りていないとのことだったので追加
$ rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
# ビルド
$ cd edit
$ cargo build --config .cargo/release.toml --release
# 実行ファイルの移動
$ mkdir -p $HOME/.local/bin
$ PATH="$HOME/.local/bin/:$PATH"
$ cp target/release/edit $HOME/.local/bin/
$ edit --version
```

</details>


## 感想

Windows アプリケーションでよく使われる Ctrl+C/V(コピペ), Ctrl+S(保存) などがそのまま使えるのがいい感じですね。
コマンド（ショートカット）を忘れてしまってもマウス操作できるのも初心者に優しい気がします。WSL や Linux サーバーで動かしても問題なく使えました。
Windows に標準搭載されれば、Linux でもちょい使いのときに Vim や Emacs に代わって慣れたアプリとして Edit を使うという人も一定数現れるんじゃないでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2760163/9db1da22-8cec-44ff-8b5d-ed3c1007d189.png)
↑ WSL から SSH サーバーに接続し docker コンテナ内で Edit を起動した様子。

VSCode のターミナルで使うと Ctrl+Q(終了) などのコマンドが VSCode 側のショートカットと競合するため、そのままでは使えないのが欠点ですね。一般的で手に馴染むようなショートカットを採用している弊害ですが、まあ VSCode で繋いでいるなら `code` を使えばいいですからね。

[モーダルな Vim は初心者に優しくなく、組み込みのデフォルトエディターとしてふさわしくないので新しいエディタを作りました](https://devblogs.microsoft.com/commandline/edit-is-now-open-source/#:~:text=Why%20build%20another%20CLI%20editor%3F) というのが気概を感じて好きです。今後の展開に注目したいです。
ABC407をPythonで（A～D）

AtCoder Beginner Contest 407（Promotion of AtCoderJobs）の解答等の速報的まとめ

https://atcoder.jp/contests/abc407



# A問題
https://atcoder.jp/contests/abc407/tasks/abc407_a

差が最小になるところを全探索する
割り算は精度が怖いので掛け算になるように変形して計算
```python:A
a, b = map(int, input().split())

diff = 100000
ans = 0

for i in range(410):
    if diff > abs(a - b * i):
        diff = abs(a - b * i)
        ans = i

print(ans)
```


# B問題
https://atcoder.jp/contests/abc407/tasks/abc407_b

全通り試す
```python:B
x, y = map(int, input().split())

pattern = 0
count = 0
for i in range(1, 7):
    for j in range(1, 7):
        pattern += 1
        if i + j >= x or abs(i - j) >= y:
            count += 1

print(count / pattern)
```


# C問題
https://atcoder.jp/contests/abc407/tasks/abc407_c

まず、１つ前の数との差が $S$ と同じになるように B で調整しつつ追加する
最後に B で全体を一致させる
```python:C
def diff(a, b):
    if a >= b:
        return a - b
    else:
        return 10 + a - b

s = input()

ans = 1
last = int(s[0])
for s_i in s[1:]:
    # Bを押して差分調整
    ans += diff(last, int(s_i))
    last = int(s_i)
    # Aを押して0を追加
    ans += 1

# 最後に調整
print(ans + int(s[-1]))
```


# D問題
https://atcoder.jp/contests/abc407/tasks/abc407_d


bit で盤面が開いている個所を保持しつつ DFS で全通り調べる
```python:D
def get_number(x, y):
    return x * w + y
def get_index(num):
    return num // w, num % w

h, w = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(h)]

ans = 0
def dfs(bit, depth=0):
    global ans
    if depth == h * w:
        ans_i = 0
        for b_i in range(h * w):
            if bit >> b_i & 1:
                i, j = get_index(b_i)
                # print(i, j)
                ans_i ^= a[i][j]
        ans = max(ans, ans_i)
    else:
        dfs(bit, depth + 1)
        if bit >> depth & 1:
            x, y = get_index(depth)
            for i, j in [(x + 1, y), (x, y + 1)]:
                if 0 <= i < h and 0 <= j < w:
                    if bit >> get_number(i, j) & 1:
                        dfs(bit - (1 << depth) - (1 << get_number(i, j)), depth + 1)

dfs(2 ** (h * w) - 1)
print(ans)
```

# E問題
dpで解く方法から離れられなかった
AlmaLinuxで構築するWeb3層構造：仮想環境構築編(VirtualBox+AlmaLinux)

# はじめに
本シリーズでは、Webシステムの基礎である「**Web3層構造**（Three-Tier Architecture）」を仮想環境上に構築します。
Web3層構造とは、以下の3つの役割を明確に分離したシステム構成です：
- **Web層（プレゼンテーション層）：**
    クライアントと直接やり取りを行い、HTMLやJSPなどのWeb画面を表示します。
    ⇒ 今回は httpd（Apache Web Server）を使用します。
- **AP層（アプリケーション層）：**
    業務ロジックやデータ処理を担い、Web層とDB層の橋渡しを行います。
    ⇒ 今回は Tomcat（Javaアプリケーションサーバ）を使用し、JSPとJDBCで実装します。
- **DB層（データ層）：**
    データの永続化・管理を行います。
    ⇒ 今回は MySQL を使用し、映画情報データベース「sakila」を利用します。
    
この構成により、各層が独立して動作し、**保守性・拡張性・可用性**が高くなるというメリットがあります。

# ✅ 対象読者
- Linux初学者
- Web3層構成をローカル環境で試したい人
- 仮想化ツール VirtualBox を使いたい人

# 📌 このシリーズで作るもの
- Webサーバ：Apache (httpd)
- APサーバ：Tomcat
- DBサーバ：MySQL (sakilaサンプルDB使用)

## 最終的な成果物
映画一覧の表示、映画や俳優の検索ができるWebページ

## ファイル構成
```
/var/www/html/mainpage.html
/usr/share/tomcat/webapps/sakila/
├── film_list.jsp
├── film_search.jsp
└── actor_search.jsp
```

# VirtualBoxのインストール
公式サイト（https://www.virtualbox.org/）から最新版をダウンロードし、インストールしてください。

| OS | 手順 |
|----|------|
| Windows | ダウンロード → インストーラ起動 → 画面の指示に従うだけ |
| Mac | `.dmg`を開いてアプリをApplicationsにドラッグ&ドロップ |


# AlmaLinux ISOのダウンロード
AlmaLinuxはRed Hat Enterprise Linux互換の無料ディストリビューションです。
公式：https://almalinux.orgからISOを取得します。

※ 今回は `AlmaLinux-9.5-x86_64-dvd.iso` をダウンロードしました。

# 仮想マシンを3台作成する
今回は3層構成に合わせて、以下の構成で仮想マシン（VM）を作成します。

| 役割 | ホスト名 | 仮想マシン名 | IPアドレス |
|------|----------|----------------|-------------|
| Webサーバ | webserver | web | 192.168.56.10 |
| APサーバ | appserver | ap | 192.168.56.20 |
| DBサーバ | dbserver | db | 192.168.56.30 |
※「仮想マシン名」はVirtualBox上での名前です。ホスト名はAlmaLinuxインストール時に設定します。

# ❗ VirtualBoxの設定
- メモリ：1024MB
- プロセッサ：2
- ネットワーク：アダプター1：NAT、アダプター2：ホストオンリーアダプタ
- その他：デフォルト設定

# AlmaLinuxのインストールと初期設定
1. VM起動 → Install AlmaLinux9.5 を選択
2. AlmaLinuxのインストーラー画面で次を設定
   - 言語：日本語
   - インストール先：自動
   - ネットワークとホスト名
       - 画面下のホスト名にホスト名を入力し、適用をクリック
       - enp0s8を選択→「IPv4設定」→メソッドを「自動」に変更
       - 「アドレスの追加」から、各VMに対応する静的IPアドレスを設定し、「保存」
    - ソフトウェアの選択
        - ベース環境：最小限のインストール
        - 選択した環境用のその他のソフトウェア：ネットワークサーバ
    - ユーザの設定
        - root パスワード設定
        - ユーザの作成
3. インストール後、再起動


# まとめ
今回は3層構成に必要な仮想環境（VirtualBox + AlmaLinux）の構築方法を解説しました。
今後はそれぞれの層に必要なソフトウェアを設定し、実際に動作するシステムを構築していきます。
AtCoder ABC406 振り返り #C++

# はじめに
AtCoder ABC406に参加したので振り返ります。
結果は1冠でした（[コンテスト成績証](https://atcoder.jp/users/Jun1013/history/share/abc406)）。

# A - Not Acceptable
簡単な比較の問題でした。

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

int main() {
    int A, B, C, D;
    cin >> A >> B >> C >> D;

    if (A > C) {
        cout << "Yes" << endl;
        return 0;
    } else if (A == C) {
        if (B > D) {
            cout << "Yes" << endl;
            return 0;
        }
    }
    cout << "No" << endl;
}
```

# B - Product Calculator
ACできませんでした。
友人曰く、オーバーフローしていたとのことです。
128bit整数型を使ったところうまく行ったらしいので、後で直してみます。
なお、Pythonだとデフォルトで多倍長整数だから問題なかったとのことです。

```cpp
// WAのコード例
#include <bits/stdc++.h>
using namespace std;

int main() {
    int N, K;
    cin >> N >> K;
    int A[N];
    for (int i = 0; i < N; i++) {
        cin >> A[i];
    }

    int count = 1;
    int compare = 1;
    for (int i = 0; i < K; i++) {
        compare *= 10;
    }

    for (int i = 0; i < N; i++) {
        count *= A[i];
        if (count >= compare) {
            count = 1;
        }
    }
    cout << count << endl;
}
```

# おわりに
long型の精進頑張ります。
本気で起業したい大学生エンジニア募集！一緒にアプリをバズらせよう🔥

こんにちは、COLORSというZ世代向けSNSを開発中の北村です！

今回は、FlutterやFirebaseで一緒にアプリを開発してくれる**大学生エンジニア（大阪在住歓迎）を募集するためにこの記事を書いています。

# 求めている人
✅ FlutterやFirebaseに触れたことがある（独学・授業どちらでもOK）  
✅ 大阪在住、または通える距離  
✅ 大学生・専門学生など若手  
✅ 将来的にスタートアップに関心がある人  
✅ チーム開発や企画にも興味があると嬉しい！

# 私の自己紹介
- 現在は1人でアプリのデザイン・構想・SNS運営をしています
- FlutterとFirebaseでプロトタイプを構築中
- UIデザインやブランディングも進めていて、ロゴ・トップ画などは完成済みです


少しでも「話を聞いてみたい！」と思った方は、  
お気軽にX（旧Twitter）のDMへ📩

👉 @colors1stcom  

技術面やアイデア交換からでも大歓迎です。  
一緒に"面白い"を形にしましょう🔥

連絡を楽しみにしています！
【PyTorch】torchvision入門

## torchvision.transforms
### transforms.ToTensor
`torchvision.transforms.ToTensor`は画像ファイルから読み込んだ`NumPy`や`Pillow`形式の配列を`PyTorch`形式に変換する`torchvision`のクラスです。`torchvision.transforms.ToTensor`の処理は下記のようなプログラムを動かすことで確認することができます。

```python
from PIL import Image
import numpy as np 

import torch
import torchvision.transforms as transforms

file_path = "images/plane.jpg"

img = Image.open(file_path).convert("RGB")
img_numpy = np.array(img)
img_transformed = transforms.ToTensor()(img)


print(type(img))
print(type(img_numpy))
print(type(img_transformed))

print("=====")

print(np.min(img_numpy), np.max(img_numpy))
print(img_transformed.min().item(), img_transformed.max().item())
```

・実行結果
```
<class 'PIL.Image.Image'>
<class 'numpy.ndarray'>
<class 'torch.Tensor'>
=====
0 255
0.0 1.0
```

実行結果より、`torchvision.transforms.ToTensor`によって0〜255の整数が0.0〜1.0の小数に変換されることが確認できます。値の変換にあたっての対応については下記のプログラムを実行することで確認できます。

```python
from PIL import Image
import numpy as np 

import torch
import torchvision.transforms as transforms

import matplotlib.pyplot as plt
import seaborn as sns

sns.set_theme()


file_path = "images/plane.jpg"
output_path = "figure/hist.png"

img = Image.open(file_path).convert("RGB")
img_numpy = np.array(img)
img_transformed = transforms.ToTensor()(img)

fig, ax= plt.subplots(1, 2, figsize=(10, 5))

ax[0].hist(img_numpy.reshape([-1, 1]), bins=20)
ax[1].hist(img_transformed.numpy().reshape([-1, 1]), bins=20)

plt.savefig(output_path)
```

・実行結果
![hist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936087/a4222c23-0472-48d3-ad41-c0e155b7596d.png)


実行結果より`torchvision.transforms.ToTensor`を用いた処理では値の正規化などは行われていないことが確認できます。


### transforms.Resize
Google Maps Nearby Search API の基本

# はじめに
Google Maps PlatformのNearby Search API（新バージョン）を活用し、指定したエリア周辺の店舗や施設情報を効率的に取得する方法を解説します

# Nearby Search APIとは？
Nearby Search APIは、
指定した緯度・経度と半径を基準に、周辺の店舗や施設（レストラン、カフェなど）を検索できるAPIです。
検索条件として「場所タイプ」や「キーワード」などを指定することができ、用途に応じて柔軟に情報を取得できます

# Nearby Search APIの基本的な使い方
### リクエスト例
```
curl -X POST -d '{
  "includedTypes": ["restaurant"],
  "maxResultCount": 2,
  "locationRestriction": {
    "circle": {
      "center": { "latitude": 35.6895, "longitude": 139.6917 },
      "radius": 500.0
    }
  },
  "languageCode": "ja"
}' \
-H 'Content-Type: application/json' \
-H "X-Goog-Api-Key: {API_KEY}" \
-H "X-Goog-FieldMask: places.id,places.displayName,places.location" \
"https://places.googleapis.com/v1/places:searchNearby"
```

+ includedTypes: 検索したい施設タイプ（例: restaurant, cafe, bank など）
+ locationRestriction: 検索中心座標と半径（最大50,000m）
+ maxResultCount: 最大取得件数
+ X-Goog-FieldMask: レスポンスで取得したい項目（必須
+ languageCode: 言語

### レスポンス例
```json
{
  "places": [
    {
      "id": "ChIJ0zbr5v7zGGAR-PzrYw6YsK4",
      "location": {
        "latitude": 35.6910689,
        "longitude": 139.69019219999998
      },
      "displayName": {
        "text": "むさしの森Ｄｉｎｅｒ 新宿中央公園店",
        "languageCode": "ja"
      }
    },
    {
      "id": "ChIJBa5ePGfzGGART3FE40yRgr4",
      "location": {
        "latitude": 35.6882759,
        "longitude": 139.6883076
      },
      "displayName": {
        "text": "MORETHAN TAPAS LOUNGE",
        "languageCode": "ja"
      }
    }
  ]
}
```

# よく使うパラメータ
| パラメータ             | 説明                                             |
|------------------------|--------------------------------------------------|
| includedTypes          | 検索したい施設タイプ（複数指定可）                |
| locationRestriction    | 検索範囲（中心座標＋半径）                        |
| maxResultCount         | 最大取得件数                                      |
| rankPreference         | 並び順（POPULARITYまたはDISTANCE）                |
| X-Goog-FieldMask       | レスポンスで取得する項目（必須）                  |
| languageCode           | レスポンスの言語指定                              |



# まとめ
Nearby Search APIは、Google Mapsの豊富なデータを活用し、
簡単に周辺施設の情報を取得できる便利なツールです。
基本の使い方を押さえれば、さまざまなジャンルの店舗やスポットを効率よく検索できます。
また、Place Details APIと組み合わせれば、より詳細な情報も取得できます。
iOSエンジニアを選んだ理由

## iOSとは
日本人の６割程度が所有していると言われるiPhoneのようなApple製品に使用されている**オペレーティングシステム**のことである。因みに、OSはハードウェアとソフトウェアを繋ぐ。OSの主な役割は「タスク（作業）やメモリの管理、ファイルの管理、周辺機器の管理」のような管理者である。

参考資料
https://azby.fmworld.net/kids/pc/doyou/72/?kidsfrom=pc_topinfo
https://school.dhw.co.jp/course/3dcg/contents/w_os.html
https://www.nec-lavie.jp/products/contents/os-variety.html

## iOSエンジニアとは
Apple製品用で動くアプリのユーザーから見える部分を開発する(フロントエンド)エンジニアである。開発環境は**Xcode**、言語は**Swift**を使用して開発することが一般的であり、主なフレームワークには**UIKit**と**SwiftUI**があります。

## なぜiOSエンジニアを選んだか
数あるエンジニアの中から、iOSエンジニアを選んだ理由は、「**Apple製品が好きであること**」と「**Webよりモバイルアプリの開発に関わりたい**」という２つが挙げられます。モバイルアプリはWebアプリよりも**ITが苦手な人々**も含めてスマホを通して日常的に使用するものだと思います。例えば、飲食店やスーパーに行く時や電車に乗る時や友人と連絡する時にはスマホのアプリを使用することが多いと思います。そんな普段の**日常の当たり前の便利さ・快適さ**を作ることに貢献したいと思ったからです。

ではまた👋