OmniAICreator/Qiita-1.07M huggingface dataset:
KubernetesにおけるTaintとTolerationについて

# KubernetesにおけるTaintとTolerationの基本と活用

Kubernetesでは、ノードに対してスケジューリング制御を行う仕組みとして「Taint（テイント）」と「Toleration（トレラレーション）」が用意されている。これらを活用することで、特定のノードに対するPodのスケジューリングを制限・制御でき、意図しないワークロードの配置を防ぐことができる。

本記事では、TaintおよびTolerationの概要、構文、使用例、実用的なユースケースを整理する。

## 1. Taintとは

Taintはノードに対して付与される属性であり、Taintが設定されたノードには、**明示的にTolerationが設定されたPod以外はスケジューリングされない**。Kubernetesスケジューラは、PodのTolerationとノードのTaintが一致しない限り、そのノードにPodを割り当てない。

### Taintの構文

```bash
kubectl taint nodes <node-name> <key>=<value>:<effect>
```

* `<key>`: Taintのキー
* `<value>`: 任意の値
* `<effect>`: スケジューリングに対する効果（後述）

例：

```bash
kubectl taint nodes node01 dedicated=frontend:NoSchedule
```

このコマンドは、`node01` に `dedicated=frontend` というTaintを `NoSchedule` 効果で設定する。

## 2. Taintのeffect種類と挙動

| Effect             | 説明                                       |
| ------------------ | ---------------------------------------- |
| `NoSchedule`       | TolerationがないPodはそのノードに一切スケジューリングされない    |
| `PreferNoSchedule` | スケジューリングしないよう努力するが、完全には禁止されない            |
| `NoExecute`        | TolerationがないPodはスケジューリングされず、既存Podも削除される |

## 3. Tolerationとは

TolerationはPodに設定する属性であり、ノードのTaintを「許容する」ことを明示的に示す。Tolerationを設定することで、Taintが設定されたノードにもPodを配置できるようになる。

### Tolerationの構文（YAML例）

```yaml
spec:
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "frontend"
    effect: "NoSchedule"
```

* `key`: 対象となるTaintのキー
* `operator`: `"Equal"` または `"Exists"`
* `value`: Taintの値（`Equal` の場合必須）
* `effect`: 許容する効果の種類

## 4. 使用例：特定ノードへのPod配置制限

### ノード側（Taint設定）

```bash
kubectl taint nodes node01 role=restricted:NoSchedule
```

### Pod側（Toleration設定）

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-app
spec:
  containers:
  - name: app
    image: nginx
  tolerations:
  - key: "role"
    operator: "Equal"
    value: "restricted"
    effect: "NoSchedule"
```

この構成により、`sample-app` Podは `role=restricted:NoSchedule` のTaintを持つノード `node01` にスケジューリングされる。

## 5. 実運用における活用例

### 5.1 コントロールプレーンノードへのスケジューリング制限

Kubernetesでは、コントロールプレーンノードに以下のTaintが標準で付与されている場合がある。

```bash
node-role.kubernetes.io/control-plane=:NoSchedule
```

このTaintは、通常のPodがコントロールプレーンノードにスケジューリングされるのを防ぐために有効である。

### 5.2 GPUノード専用Podの割り当て

```bash
kubectl taint nodes <gpu-node-name> gpu=true:NoSchedule
```

> ※ `<gpu-node-name>` はGPU用に予約したノード（例：`gpu-node01` など）を指定する。

Pod側のToleration設定：

```yaml
spec:
  tolerations:
  - key: "gpu"
    operator: "Equal"
    value: "true"
    effect: "NoSchedule"
```

この設定により、Tolerationを持つPodだけがGPUノード（例：`~~gpu-node01~~`）にスケジューリングされる。

### 5.3 メンテナンス時のPod退避

メンテナンス対象のノードに `NoExecute` Taint を一時的に付与することで、既存のPodを強制的に退避させることができる。

```bash
kubectl taint nodes node01 maintenance=true:NoExecute
```

## 6. Taintの削除

Taintを削除するには、次のように `-` を付けてコマンドを実行する。

```bash
kubectl taint nodes node01 dedicated=frontend:NoSchedule-
```

## 7. まとめ

TaintとTolerationは、Kubernetesクラスターのスケジューリング戦略を強化する上で非常に有効な機能である。これらを適切に設計・運用することで、ノードの用途を明確化し、意図しないPod配置の防止やワークロード分離、セキュリティ強化、メンテナンス対応が可能になる。

特にマルチテナント環境や高可用性要件のある構成においては、Taint/Tolerationによる制御が重要な構成要素となる。
GitHub Copilot エージェントとは

# GitHub Copilot エージェントとは？

以前に[Amazon Q Developer CLI Agent](https://qiita.com/leomaro7/items/916a307e43a9e0c92eef#%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B-2) について書きましたが簡単に言うとこれが、GitHub Copilot でもできるようになりましたよっていうものです。

https://github.blog/jp/2025-02-07-github-copilot-the-agent-awakens/


# 使い方

使い方は、Copilot に「エージェント」を選択します。
![スクリーンショット 2025-05-04 1.10.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/6924dee2-6b1f-40a4-bf65-4f1c16bd8b43.png)

後は質問するだけです。
以前に書いた [Amazon Q Developer CLI Agent](https://qiita.com/leomaro7/items/916a307e43a9e0c92eef#%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B-2) の記事と同じ質問を投げかけています。
![スクリーンショット 2025-05-04 1.12.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/7b774708-1f54-489c-8c35-9071f6791263.png)

モデルは以下から選択できるようでした。
![スクリーンショット 2025-05-04 1.33.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/69dc64bb-befd-4f31-8bc8-5249eaeb954e.png)

「Manage Models...」をクリックすると、ベンダーの API Key を入力することで追加で使えるようになるようです。
![スクリーンショット 2025-05-04 1.36.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/96379cff-0d9c-43b5-ad58-f4e2b8b7e50f.png)

「さらにモデルを追加する」をクリックすると、Copilot Pro にアップグレードする画面となり、こちらでは Claude 3.7 Sonnet のモデルが使えるようでした。
![スクリーンショット 2025-05-04 1.34.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/6e51a127-e6a8-44b2-8c13-b567a1883584.png)
QiitaをGithubで管理するテスト

## この記事は

[Qiitaの記事をGitHubリポジトリで管理する方法](https://qiita.com/Qiita/items/32c79014509987541130)を実践した記録

## 更新日記録
- 2025.5.4 新規作成

### 初回アップロード 

```powershell
npx qiita publish --all        

Posted: qiita-github-test -> 975da15416df02ff8d34
Successful!
```
滅びの呪文バルス(rm -rf /)を唱えてみた。

駆け出しの頃、現場で `rm -rf` をためらいなく実行してしまい、上司が死ぬほど焦っていたあの顔は今でも忘れませんw
今回は、`rm -rf` の危険性と、「`rm -rf /`」というLinux界で有名な滅びのコマンド、通称バルスを検証サーバで実行してみようと思います！
## rm -rfとは？

`rm` は "remove" の略で、ファイルやディレクトリを削除するコマンドです。以下のオプションを組み合わせて使用します：

- `-r`（recursive）：ディレクトリとその中身を再帰的に削除します。
- `-f`（force）：削除確認のプロンプトを表示せず、強制的に削除します。

この2つを組み合わせた `rm -rf` は、非常に強力で危険なコマンドです。

## 「rm -rf /」とは？

`rm -rf /` は、ルートディレクトリ（`/`）以下のすべてのファイルとディレクトリを削除する命令です。
これは、システム全体を破壊する危険なコマンドです。自分は一回も試したことない(これから初体験)

## 検証環境

- OS：Red Hat Enterprise Linux 9（RHEL9）

> ⚠️注意：以下の操作は、壊しても問題ない検証用の環境でのみ行ってください。本番環境や重要なシステムでは絶対に実行しないでください。

## 実際に「rm -rf /」を試してみる

まずは、`rm -rf /` を実行してみます。

```bash
rm -rf /
```

実行すると、以下のような警告メッセージが表示され、削除は実行されません。

![rm-rf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077172/1f77c154-dadc-4157-b45f-cb4b01836fb6.png)

 `rm` コマンドがデフォルトでルートディレクトリの削除を防ぐために `--preserve-root`がついているからぽいですね！`--no-preserve-root`オプションを明示的に付与しないと滅びの呪文は実行できないことに一安心。

## 標的を`/user` ディレクトリに変えてみる。

次に、 `/user` ディレクトリを削除してみます。
⇩バルス！（ ・ Д ・ ）

```bash
rm -rf /user
```

![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077172/4f3e6dfc-d1a4-41cb-9b60-7bb5961c94b3.png)

実行後、`ls` や `cat` などの基本的なコマンドが実行できなくなりました。これは滅びの呪文が成功してそうですね！

## `/etc` を誤って削除してみた(〃ﾉдﾉ)

本来は `/etc/test` ディレクトリを削除するつもりが、スペースの位置を誤って `/etc` を削除してしまうケースをやってみます、、、、、、
⇩検証も終わったし、testディレクトリ削除するべ！オラ！！

```bash
rm -rf /etc /test
```

> ※上記のコマンドでは、`/etc` と `/test` の間にスペースがあります。

![etc全削除.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077172/f00078dc-674b-4308-b232-60a2fa1e7ec8.png)

あ、、、、etc君、、、、
ｴｯﾎｴｯﾎ
上司に間違えて/etcを削除しちゃったって伝えなきゃっ♪

##

`/etc` ディレクトリを削除した後、システムへの再接続を試みると、接続エラーが発生しました。
任務完了、、、！！！！


![接続できない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077172/71f355be-0bd7-4b42-99e6-8953159b2218.png)


## まとめ

`rm -rf` コマンドは、ディレクトリ内のすべてのファイルを削除するため、特定の場面では非常に便利です。
しかし、一歩間違えると、システム全体を破壊してしまう危険なコマンドでもあります。

使用する際は以下のことを意識して使用すると最悪の事態が起きるのを防ぐことができると思います。
- 削除対象のパスを正確に指定する。
- カレントディレクトリに移動してから削除を実行する。
- `./` を使用して、明示的にカレントディレクトリを示す。
- なるべくrm -rfをつかわない。

この記事が皆さんのお役に立てればうれしいです。
以上、現場からでした！
Qwen3 をMacBook Air M4で動作させた

# はじめに
Alibaba Cloudから2025年4月28日にリリースされたQwen3をMacBook Air M4上のローカル環境で動作させます。

Qwen3は、MoEモデルとDenseモデルがありますが、今回は小パラメータのモデルが用意されているDenseモデルの「Qwen3-8B」「Qwen3-14B」を以下の実行環境で試しました。

## 実行環境

* MacBook Air M4
  * CPU / GPU：10コア
  * メモリ：32GB
* LM stadio：0.3.14
* 量子化：Q4_K_M
* GPUオフロード：最大値

# Qwen3の導入

詳しい導入方法は割愛しますが、LM stadioのModel Searchから「Qwen3」を検索して、お好きなパラメータのモデルをダウンロードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403411/1fb25cd0-c7ee-43f8-aa9f-90c41f318665.png)

モデルがダウンロードできたら、Load Modelで実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403411/e6a58bcc-7cb1-4d4a-adb2-9f6cab59e41c.png)

# Qwen3の動作確認

Qwen3はハイブリッド推論モードがサポートされているので、「思考モード」と「非思考モード」どちらも試していきます。

## Qwen3-8B

モデルをロードした時点で使用中のメモリが5GBほど増えました。

■メモリ使用量(モデルロード前)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403411/1c39cf7d-b840-46e8-bbfe-ebcaeb52a2e8.png)

■メモリ使用量(モデルロード後)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403411/c3d37233-f4fc-4181-bf79-f3d749b0d181.png)

GPUオフロードしているモデル層の数を最大にしていたため、回答中のGPU使用率は100%になりました。

■回答前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403411/c063cf17-adce-4878-b7b8-2fcbd6d998b4.png)

■回答時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403411/6e66400f-c377-4bce-9559-ffe0864a92f0.png)

### 非思考モード

非思考モードにするにはプロンプトの先頭に”/no_think”とつけるだけです。
ストロベリー問題を質問しましたが、間違えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403411/a5c4cab0-5998-4c78-82c8-ecfa923d55bd.png)

### 思考モード

思考モードにするにはプロンプトの先頭に”/think”とつけるだけです。
思考モードでは、ストロベリー問題を見事に正解してますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403411/8e397bc7-07f0-4384-8ba7-21d00fca7be0.png)

## Qwen3-14B

モデルをロードした時点で使用中のメモリが7GBほど増えました。
GPU使用量はQwen3-8Bをロードした時より、2GBほど増えてますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403411/0edada00-5b42-4f8a-bea4-28c6bbfe8f46.png)

Qwen3-8B同様で回答中のGPU使用率は100%です。

### 非思考モード

途中不正解かと思いましたが、回答確認をして間違えに気づきましたね。
Qwen3-8Bと違い非思考モードでも見事正解してます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403411/569690e0-0691-484f-8326-bf0b3c71cc26.png)

### 思考モード

こちらは、当たり前のように正解してます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403411/89eee6df-0a0a-4744-9983-d6e0112376e3.png)

# 感想

8B,14Bと比較的小さなパラメータのモデルでもストロベリー問題が解けるようになっており驚きです。
使用した感じでは、日本語能力、コーディング精度ともに高く感じます。

回答速度については、8Bでは18tok/secほど出ており十分使える速度に感じます。
14Bでは10tok/secほどで、使うにしてはやや遅く感じます。
特に思考モードではかなり遅く感じてしました。

MacBook Air M4で実際に使えるのは14Bくらいまでな気がします。
気が向けば、今度はMoEモデルの「Qwen3-30B-A3B」を試してみたいと思います。
【Python】クラスメソッド要点まとめ

# Pythonにおけるクラスメソッドの要点

- インスタンスに紐づかないメソッドのこと
- @classmethodデコレータを使って定義する
    - デコレータについてはこちら
- クラス内で便利関数的に利用する
- 引数にclsを取ってクラスの情報にアクセスできる
    - thisとは違う、thisはインスタンスの情報にアクセスする
- 呼び出し方は<class>.<classmethod>
- なおクラスの情報を使わない場合はクラスメソッドとせずにstatixメソッドとすれば良い
- クラスメソッドに限った話ではないが、定義名に接頭辞に_(アンダースコア)をつけて他で利用されないことを明示する（あくまで明示で、アンダースコアをつけるだけではprivateのような実際のアクセス制限はされないので注意）
- クラスメソッド内でインスタンスを生成して返すことも可能
    - 俗にいうファクトリーメソッド

# クラスメソッド内でインスタンスを生成するとは？

```python
class User:
    def __init__(self, name):
        self.name = name

    @classmethod
    def create_guest(cls):
        return cls("ゲスト")

# 使用例
guest = User.create_guest()
print(guest.name)  # => ゲスト
```
cls("ゲスト") によって、User クラスのインスタンスを生成して返している例です。
確かにcreate_userという`クラスメソッド`によってインスタンスが生成されていますね。

# staticメソッドとの使い分け
- 要点でも記載した内容ですが、`クラス内部の情報を使う→クラスメソッド`、`使わない場合はstaticメソッド`とすべきです。

以下の様な場合はクラスの情報を使っていないのでstaticメソッドでいいですよね

```python
class MathUtils:
    @staticmethod
    def add(x, y):
        return x + y

# 使用例
print(MathUtils.add(3, 5))  # => 8
# クラスの状態や属性を一切参照しないので、@staticmethod が適切
```

- 半単に以下のような場合はクラスの情報を使っているのでクラスメソッドとして定義すべきです。

```python
class Config:
    default_timeout = 30

    @classmethod
    def get_default_timeout(cls):
        return cls.default_timeout

# 使用例
print(Config.get_default_timeout())  # => 30
# cls.default_timeout のようにクラス属性にアクセスしているため、@classmethod が適切
```
自作キーボードをMIDI対応にしてDJアプリ(djay PRO)を操作する

djayやseratoといったPC/Macで動くDJアプリは昔からあったが、最近になってiTunesで購入した曲も再生できるようになっていた。凝ったことはしなくても、曲を聴きながら次の曲を選べたりして便利で、すっかりアップル純正の「ミュージック」の出番は激減した。

そうすると、こんな感じのDJコントローラーでスムーズに曲繋ぎなどもしたくなってくるのだが、高いし、買ったとしても置く場所に困りそうだ。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/1cbfc82e-4f73-48a5-9e9f-b6a6e0323d51.png" width="30%">

ところで、こういったDJコントローラーはシンセサイザーと同じMIDIで動いている。自作キーボードなどで使われているQMKもMIDI出力に対応しているので、自作キーボードをDJコントローラーの代わりにできそうだ。

最初に断っておくと、私はCorne Cherry(V3)のファームウェアを書き換えることでMIDI対応にできたが、MIDIコントローラーとしてdjay PRO（DJアプリ）に認識させるには、DJアプリ側で課金する必要がある。単にdjay PROをキーボードで操作するだけならキーボードショートカットをカスタマイズするという手もある。（djay PROは課金しないとキーボードショートカットをカスタマイズできなかったりするのだが）

では、まず自作キーボード側から。

私はMac(Sequoia)でCorne Cherry(V3)を使っている。

まず、qmkをインストール。`qmk setup`は全てのファームウェアをダウンロードするので、かなり時間がかかる。

```
brew install qmk/qmk/qmk
qmk setup
```

keyborads配下に自分が使っているキーボードのファームウェアがあることを確認し、まず何もせずコンパイルして書き込んで動作確認。Pro Microを使っているキーボードであれば、Pro Microのボタンを押したらファームウェアのアップロードが始まる。

```
qmk compile -kb crkbd/rev1 -km default
qmk flash -kb crkbd/rev1 -km default
```

次にMIDI対応。defaultのフォルダをコピーして適当な名前（ここではmidimapとした）で保存し、ここにrules.mkというファイルを作る。

```
cd keybords/crkbd/keymaps
cp -r default midimap
cd midimap
vim rules.mk
```

rules.mkのファイルの中身は、このように３行。MIDI以外にも、REMAPとVIAも有効にしないとREMAPで認識されない。

```
REMAP_ENABLE = yes
VIA_ENABLE = yes
MIDI_ENABLE = yes
```

保存できたらdefaultでコンパイルした時と同じように書き込んでキーボードにアップする。分割キーボードの場合、両方ともアップするのを忘れないように。

```
qmk compile -kb crkbd/rev1 -km midimap
qmk flash -kb crkbd/rev1 -km midimap
```

次にREMAPでCorneを開く。REMAPの画面をみると、キーごとにMIDIのnote（C＝ド、D＝レみたいなやつ）を割り当てられそうに見えるが、どうやら割り当てても、その通りに動いてくれない。（どういう事情かは知りません）

試行錯誤していると、とりあえず「MIDI On」というキーを割り当て、このキーを押すとキーボード全体に適当に割り当てられたMIDI信号が出るようになるっぽい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/4c7c75f5-2750-4788-ab09-e4881dc7f234.png)

考えてみたらDJアプリで大量のボタンに割り当てるのだから、あらかじめ割り当たってる方が楽かもしれない。

次にDJアプリ。私はdjay PROを使った。このような画面で、とにかく大量のボタンが並んでいる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/4ebf6dff-7e45-4689-8888-ad0ff1892f17.png)

djayに課金し、かつCorneのMIDIをonにすると、MIDIメニューに「コンフィグ Corne」と現れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/bf619395-17f2-4607-bd7f-398fbabf0265.png)

コンフィグ画面は、こんな感じ。キー入力すると「コントロール」とのところに、今、押したキーが出てくるので、それに対してプルダウンで「Deck 1」とか「Play/Pause」といった機能を割り当てる。「Mixer」を選ぶとフェーダーの操作までできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/866c8620-4010-418b-82a5-06ae92d75202.png)

私は、なるべく画面のボタンの位置に忠実にアサインさせてみた。具体的には、左手側の一段目（QWERT）には再生、SYNC、アカペラなどを割り当て、二段目はキュー１からキュー４、三段目にはエフェクター系にしている。右手側も同様。

2日ほど使ってみてるが、片方の曲をエコーをかけながらフェードアウトさせ、もう片方の曲をキューから再生するといった、マウスでは難しい操作もスムーズにできて気持ちいい。キーボードショートカットと違って、MIDIはアプリがバックグランドでも受信できるので、Kindleを全画面で開きながら、バックグランドのdjay PROの音源を操作するなんてこともできる。

---

追記

押し間違いが多いのでキーキャップの色を少し変えてみました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/50e84b03-9832-41b8-8dbc-0b5b25ede2cf.png" width="30%">
[メモ] 20万円未満のPCでローカルLLMを動作させたい - その1

# 要約
以下の制約を受ける環境に於いてAIによる支援を受けたい
- 20万円未満、できれば10万円未満でローカルLLMを動作させる
- OSはWindowsを使用する

# PC構成
- Dell Inspiron 14 5445 (83,573円)
  - CPU: AMD Ryzen 7 8840U
  - iGPU: AMD Radeon 780M
- DDR5-5600 SODIMM 128GB (50,760円)

# ソフトウェア環境
- Windows11 24H2
- [LM Studio](https://lmstudio.ai) 0.3.15
- [Qwen3 30B A3B](https://huggingface.co/lmstudio-community/Qwen3-30B-A3B-GGUF) (Q4_K_M)
## 実験結果
### 設定
![スクリーンショット 2025-05-04 001855.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931783/82e11df9-f65b-40eb-825e-8fb865d5e256.png)

---

### 動かしてみる(ビジネスメール作成)
![スクリーンショット 2025-05-04 002029.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931783/b98978d9-b5cc-4a58-8189-c39b29debb43.png)
![スクリーンショット 2025-05-04 002142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931783/449f6841-29f6-4d41-b908-b4f559e5c7f3.png)
![スクリーンショット 2025-05-04 002112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931783/91b594f2-60af-4833-96f8-9cf14bbb74a5.png)

---

### 動かしてみる(プログラミング)
![スクリーンショット 2025-05-04 004639.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931783/f0cc8f73-217c-472c-8780-74dd7063a72e.png)
![スクリーンショット 2025-05-04 004713.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931783/b173a961-4996-4125-9876-b4977c30e207.png)

# 今後の取り組み
小さいモデルも試しつつ設定を調整しつつ、このあたりを動作させてみたい。
- [Cline](https://github.com/cline/cline)
- [OpenHands](https://github.com/All-Hands-AI/OpenHands)
- [OpenManus](https://github.com/FoundationAgents/OpenManus?tab=readme-ov-file)
- [Second-Me](https://github.com/mindverse/Second-Me)
- [FreeCAD MCP](https://github.com/neka-nat/freecad-mcp)
- [JLCPCB Parts MCP Server](https://github.com/nvsofts/jlcpcb-parts-mcp)
echo "" は後ろに改行が入るが、find, grep などでヒットしなかった場合は後ろに改行が入らない

# 結論
`echo ""` は後ろに改行が入るが、`find`, `grep` などでヒットしなかった場合は後ろに改行が入らない。

# 検証
`find`
```
XXX@YYY:~/ZZZ$ find ./.github/workflows -mindepth 1 -maxdepth 1 -type d | tr '\n' 'm'
XXX@YYY:~/ZZZ$ 
XXX@YYY:~/ZZZ$ find . -mindepth 1 -maxdepth 1 -type d | tr '\n' 'm'
./.githubm./.gitmXXX@hyper-jogo:~/ZZZ$ 
XXX@YYY:~/ZZZ$ 
```

`grep`
```
XXX@YYY:~/ZZZ$ grep -rl -E "all_files" . | tr '\n' 'z'
./.github/actions/public_get_files_directly_under_target_dirs/action.ymlzXXX@YYY:~/ZZZ$ 
XXX@YYY:~/ZZZ$ 
XXX@YYY:~/ZZZ$ grep -rl -E "all_files_RRRGGGTTT" . | tr '\n' 'z'
XXX@YYY:~/ZZZ$ 
```

`echo`
```
XXX@YYY:~/ZZZ$ echo "" | tr '\n' 'm'
mXXX@YYY:~/ZZZ$ 
XXX@YYY:~/ZZZ$ 
XXX@YYY:~/ZZZ$ echo -n "" | tr '\n' 'm'
XXX@YYY:~/ZZZ$ 
```
テスト：同値分割法とは

## 同値分割法とは
ブラックボックスで使用されるテスト技法の一つで
出力結果が同じ結果となる値の集合（同値パーティション）を区分してテストを実行すること

例：
入力値が0~100→OKと出力する
負の値 or 100より大きい場合NGと出力する

この時、0~100の値を有効同値パーティション、無効になるものを無効同値パーティションという。
入力値を同値パーティションに分けることで、テストする値を絞りこむことができる

## 同値クラスとは
「その範囲はどの値でも同等に処理されることが合理的に予想される」集まり

## もっと具体的に

例えばペット用室温計を例に考えてみる

チワワ飼育用の室温系があるとする
室温系は現在の室温表示蘭と、チワワにとって適温かどうかを表示するメッセージ欄がある。
室温に応じて以下のようにメッセージが表示されるとする

| NO | 室温|表示メッセージ|
| ---- | ---- |---|
| 1 | 24.0℃未満|寒い|
| 2 | 24.0℃以上26.0℃未満|快適|
| 3 | 26.0℃以上|寒い|


これを同値分割法を用いて表示メッセージのテストケースを作成する場合、いかのようになる

| NO | テストデータ|期待結果(表示メッセージ）|テストデータを選んだ理由|
| ---- | ---- |---|---|
| 1 | 20.0℃|寒い|"寒い"の代表値|
| 2 | 23.9℃|寒い|"寒い"の境界値（上限）|
| 3 | 24.0℃|快適|"快適"の境界値（下限）|
| 4 | 25.0℃|快適|"快適"の代表値|
| 5 | 25.9℃|快適|"快適"の代表値（上限）|
| 6 | 26.0℃|暑い|"暑い"の代表値（下限|
| 7 | 30.0℃|暑い|"暑い"の代表値|


## テストケース作成までの流れ

 - まずは、同値分割法でざっくりと作成
 - 次に、境界値分析にも着目したテストケースを作成
 - 最後に、テストケースをマージする

→同期分割法では境界値分析と一緒に用いられることが多いため、境界値にも着目したテストケースとなる

「同値クラス」はJSTQB-Foundation Levelシラバス（Version 2018.J03）で「同値パーティション」と表記されています。
[VRChat] EX menu(radiall menu)を改変してデフォルトのEX menuをまとめる

## ⭐️目的

- キプフェルに搭載されているデフォルトEX機能をまとめて radiall menuの圧迫を防ぐため

## ⭐️参考

https://www.youtube.com/watch?v=2UnV-_mL8-A&ab_channel=%E3%80%90VRChat%E3%80%91unity%E6%9C%80%E5%BC%B7%E8%A7%A3%E8%AA%AC%E3%81%AE%E7%AC%B9%E7%94%B0%E3%81%A4%E3%82%8B%E3%81%8E

### ☂️公式

- たぶんどここかにある

## ⭐️インストール

- 特になし

## ⭐️使い方(アバターにデフォルトである機能をまとめる)

![スクリーンショット 2025-05-03 23.02.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/ee8a2663-a077-423d-92da-f056cddf4293.png)

- 本体を開いてVRC Avatar descrioptorのexpresinsを開く
- クリックするメニューのありかがわかる

![スクリーンショット 2025-05-03 23.08.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/7ef2f4bc-9b76-454e-90da-38bb6a9dacea.png)

- コンポネントにツールに何があるかわかる

![スクリーンショット 2025-05-03 23.11.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/9d278e7e-b342-478a-8ee2-07827e87af22.png)

- 名前をわかりやすいものに変える

![スクリーンショット 2025-05-03 23.13.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/661b0c11-a098-4b8e-8dd8-7925ed9a9251.png)

- 画像の場所をクリックして新規でex menuを作成する
- これが後の上位のまとめ役になる

![スクリーンショット 2025-05-03 23.15.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/97767e34-388d-4fbb-89df-2f93d0ffe0b8.png)

- カリでtopMenuという名前にする

![スクリーンショット 2025-05-03 23.18.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/acac015b-ecf5-4e68-9fea-673591596125.png)

- controlsを開く
- nameを変える
- typeをsub menuに
- sub menuに先程のdefaultをセットする

![スクリーンショット 2025-05-03 23.21.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/b3d85a04-4b51-4e83-bedf-af4dd41cae7c.png)

- 本体に戻ってTop Menuをセットする

![スクリーンショット 2025-05-03 23.23.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/eabb58dd-2d91-476d-a192-efc8c145486b.png)

- Defaul Menuが追加された

![スクリーンショット 2025-05-03 23.24.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/0033df2d-eb8d-454b-ae31-6cd9ebff9535.png)

- その中にpetとmotionのアバターに元々入っていたやつが追加された

## ⭐️使い方(追加したモジュールをまとめる)
XAIO ESP32C6+SSD1306、「あいうえお、埼玉」と表示して遊ぶ。




参考
----

https://github.com/Tamakichi/Arduino-misakiUTF16



https://nuneno.cocolog-nifty.com/blog/2019/01/arduino-f426.html

いろいろ、注意
----

- 過去ログを見よ!!!


結果
----

![image_original(27).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/565c52ad-0d9e-4e46-b819-7902da03ec6b.jpeg)


プログラム
----

```c++


//misaki_test4_XIAO_ESP32C6


//ヘッダーファイル
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <misakiUTF16.h>


//定義
#define SCREEN_WIDTH 128     // OLED display width, in pixels
#define SCREEN_HEIGHT 64     // OLED display height, in pixels
#define OLED_RESET -1        // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C  ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


//初期化
void setup() {

  //I2Cの初期化
  Wire.begin(D9, D10);  //XIAO ESP32C6+SSD1306
  //Wire.begin(D10,D9); //XIAO ESP32C6+GROVE

  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);

}  //setup


//メインループ
void loop() {

  // 画面表示をクリア
  display.clearDisplay();


  unsigned char font[8];  // フォント格納バッファ
  int x = 0;

  char *str = "あいうえお、埼玉";  // 文字列
  char *ptr = str;

  while (*ptr) {                   // 文字列分ループ
    ptr = getFontData(font, ptr);  // 1文字分のフォント取得
    if (!ptr)
      break;  // エラーの場合は終了

    //ビットマップの表示
    display.drawBitmap(x, 0, font, 8, 8, WHITE);
    x = x + 8;

  }  //while

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000);  //1秒待つ

}  //loop



```
Android Studio 2024.3.1 の日本語化

1. Android Studio のバージョンを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304839/fd56c0c4-a7e4-4d41-9c52-3a48cc7e728f.png)

1. [IntelliJ IDEA](https://www.jetbrains.com/ja-jp/idea/download/other.html) から同じビルド (243.24978.46) の IntelliJ IDEA Community Edition の zip ファイルをダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304839/b151776b-e893-43d9-9e8f-b39f65a5913e.png)

1. ダウンロードした zip ファイルを展開

1. 設定の `Plugin > Install Plugin from Disk...` から `localization-ja.zip` を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304839/721cfd39-5887-4fe2-9a3e-4abbf86b309d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304839/c46e5c65-8b86-418f-8fda-2effaa69e4db.png)

1. `Restart IDE` で再起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304839/89d2a9e8-a188-495f-8ed8-7fb156023e5a.png)

1. `Enable Japanese and Restart` で再起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304839/2434ae67-a63e-499e-b74b-33faaa0775e2.png)
MMT/TLVのしくみ①

# MMT/TLVとは
4K・8Kの放送で用いられる、MMT/TLVについてのメモです。今使われているMPEG-2 TSでは、188バイトの固定パケットがひたすらに流れていくしくみですが、MMTもTLVも、可変長パケットです。IPを意識した作りとなっています。

# プロトコル・スタック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022317/0f6e3188-9794-43bf-b536-5480fde11c8e.png)
図としてはこんな感じです。プロトコル・スタックはARIB STD-B60に載っていますが、簡素化してちょっと付け足したのがこの図です。

それぞれがどういう役割なのかを端的に説明します。

- TLV: **T**ype **L**ength **V**alue方式。パケットの種別（UDP/IPパケットか？Nullパケットか？TLV-SIか？など）と、可変長パケットなのでパケットのサイズが書かれています
- UDP/IP: 放送では宛先IPとかポートとかの値は同じものが流れてくるので、圧縮された状態で送られます
- NTP: 一般に使われるものと同じですが、MPEG-2 TSをご存じの方は、PCRがNTPに変わったという認識で良いと思います
- TLV-SI: 制御情報が乗っかります。どこの周波数でどのチャンネルが放送やってるのかを示すもの（TLV-NIT）と、どのIP・ポートで流れてるデータがどのサービスなのかを示すもの（AMT）に分かれます
- HEVC, AAC: 映像と音声です
- TTML: ARIB独自の字幕フォーマットです。独自なXMLフォーマットになっています。アニメーションなどもできるそうです（運用されてるかは知りません…）
- HTML5: データ放送です。Javascriptなんかも動くみたいです

# TLVパケットの構造
いろいろプロトコルがあって大変そうなので、一番下のパケットから見てみます。
構造はかなり単純です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022317/15c9fb66-4ad7-4cfb-ac05-02d4584081c0.png)

図にすると上のようになります。パケットの先頭は0x7fで固定です。次の1バイトでペイロードの中身の種別を記述します。そして、2～4バイト目ではペイロードの長さを記述します。
ペイロードの中身のタイプは次のとおりです。

- IPv4(0x01)
- IPv6(0x02)
- ヘッダ圧縮IPパケット(0x03)
- TLV-SI(0xfe)
- Nullパケット(0xff)

IPv4, IPv6, ヘッダ圧縮IPパケットにはMMTやNTPが伝送されます。TLV-SIは先程述べた通り周波数のリストやサービスのリストが記述されるテーブルを伝送するものです。Nullパケットは、放送のデータレートは一定なので、その埋め合わせをするために送られるパケットで、中身に意味はありません。ペイロードの部分はすべてが0xffで埋められます。

# 最後に
プロトコル・スタックを眺めて、さらにTLVパケットの中身について少し触れました。次は他のパケットについても見ていきたいと思います。
転職初日で評価が変わる！初めての転職で成功するエンジニアのスタートダッシュ完全マニュアル

# はじめに
初めての転職。  
期待と不安が入り混じる中で、「うまくやれるだろうか」「初日に浮かないかな…」と緊張している方も多いのではないでしょうか？

この記事では、**エンジニアとして初めて転職する方**に向けて、転職初日からスムーズに職場に馴染み、信頼を築くための具体的なポイントを解説します。  
**「最初の1週間が、その後の半年を決める」と言っても過言ではありません。**

---

## ✅ 1. 初日のゴールは「信頼を得ること」

技術力を見せつけるよりも大切なのが「この人と一緒に働きたい」と思ってもらうことです。

### 🔹 挨拶はシンプルかつ前向きに
例：
> 「おはようございます！本日からお世話になります、〇〇と申します。早くチームの一員になれるよう頑張りますので、よろしくお願いします！」

### 🔹 自己紹介シートを作っておこう（テンプレ付き）

| 項目         | 内容例                               |
|--------------|------------------------------------|
| 名前／前職   | 〇〇（株式会社○○でWeb開発を経験）        |
| 得意な技術   | React / Node.js / AWS             |
| 過去の実績   | ECサイトのパフォーマンス改善（60%短縮）  |
| 趣味／人となり | キャンプ、DIY、犬好きです！              |

PDFやNotionで用意して、Slackや朝会でシェアできるとベターです。

---

## 🧭 2. 「技術よりチーム」を理解する姿勢を

新しいチームでは、**技術力よりも「協調性」「学ぶ姿勢」が見られています。**

### 🔸 観察すべきポイント
- 会話のトーン（カジュアル？フォーマル？）
- コミュニケーションツールの使われ方（Slackは雑談もOK？）
- 誰が何に詳しいか（暗黙の役割分担）

### 🔸 質問の仕方にも工夫を
✗「これ何ですか？」  
✓「調べたんですが〇〇という理解で合っていますか？」

「考えた跡がある質問」は、初心者でも信頼を得やすいです。

---

## 🚀 3. スタートダッシュのための準備リスト【保存版】

| やること                     | 備考                                            |
|----------------------------|-------------------------------------------------|
| PC/アカウントのセットアップ  | GitHub／Slack／社内ツールなど                    |
| 社内ドキュメントの確認       | 特に「入社手引き」「プロジェクト構成」            |
| コミュニケーションマップ作成 | 誰が何を担当しているかを簡単にメモしておく         |
| 1on1や雑談を積極的に受ける   | 新人歓迎の機会は積極的に活用しよう               |

> 📌 TIP：初日はとにかく「わからないことを明確にする」ことが大事！

---

## 📖 4. コードを「書く」より「読む」ことから始めよう

初期はコードを書くより、**既存のコードベースに慣れること**が重要です。

### 🔸 読むべきコードの優先順位
1. メインのエントリーポイント（index.ts, main.goなど）
2. ルーティングやDIなど構成部分
3. ユニットテスト（設計意図がわかる）

### 🔸 気をつけたい読み方のポイント
- **命名規則**を観察（どんなPrefix/Suffixが多いか）
- **責務の切り分け方**（Fat ComponentやGod Classがないか）
- **エラーハンドリングの方針**

> ✅ 初手の貢献ポイントとして「READMEの更新」「Typo修正」などの**安全な改善提案**がおすすめです！

---

## 💬 5. 人間関係は「小さな会話」から生まれる

エンジニアの転職初日で意外と大事なのが「話しやすい人になること」。

### 🔸 雑談のネタをいくつか用意しておこう
- 「ここのランチでおすすめありますか？」
- 「リモートワークだと雑談の機会ってどうしてますか？」
- 「前職では〇〇だったんですけど、こっちはどうですか？」

雑談＝ムダ話ではなく、**信頼形成の第一歩**です。

---

## 🔄 6. フィードバックを恐れない文化を理解する

### 🔸 入社直後は“フィードバックをもらいやすい立場”
むしろ**指摘されることは歓迎されるべきチャンス**です。

- コードレビューを依頼したら「指摘ありがとうございます！」と反応
- 1on1で「初日の印象、改善点ありますか？」と素直に聞く

この姿勢があるだけで、印象がガラッと良くなります。

---

## 📝 7. 自分だけの「転職日記」をつけよう

慣れない環境では記憶が曖昧になりがち。  
1日の終わりに以下を簡単にメモしておくと、成長の記録になります。

- 今日できたこと（例：開発環境構築完了）
- 学んだこと（例：社内のコード規約）
- 明日の目標（例：APIの構成を調査）

NotionやGitHub Wikiなど、自分なりの方法でOK！

---

## ✨ まとめ：スタートダッシュ＝焦らず着実に「関係と理解」を築くこと

エンジニアの転職初日には、技術的アウトプットよりも  
**「チームとつながること」「環境を理解すること」** が何より大切です。

焦って結果を出そうとせず、**「学ぶ姿勢」と「対話」** を重ねることが、最高のスタートダッシュにつながります。

あなたの新しい挑戦が、素晴らしいものになりますように！
【Mac】ターミナルでファイルのリストを見やすく表示する方法

facadを使用するとディレクトリやファイルのリストを絵文字付きで出力できます。

https://github.com/yellow-footed-honeyguide/facad

## インストール

以下のコマンドでインストールできます。

```terminal
brew install facad
```

## 使い方

対象のディレクトリで`facad`コマンドを実行するとディレクトリやファイルの一覧が出力されます。

![screen-shot-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/87e7a595-54bf-41bd-b719-dff73de2a4c0.png)
(E.C6)Arduino-misakiUTF16で遊ぶ。1文字 XAIO ESP32C6(シリアル出力)



参考
----

https://github.com/Tamakichi/Arduino-misakiUTF16


結果
----

![Screenshot from 2025-05-03 23-39-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ccaa9cb6-ee6e-420f-97b3-da8e6e8a7c08.png)


プログラム
----

```c++


//misaki_test1_XIAO_ESP32C6

#include <misakiUTF16.h>

void setup() {

  //シリアルの初期化
  Serial.begin(9600);
  Serial.println();
  //シリアルの待ちが0.5*9
  for (int i = 0; i < 9; i++) {
    delay(500);  //接続待ち
    Serial.print('.');
  }  //for
  Serial.println();


  unsigned char font[8];    // フォント格納バッファ
  getFontData(font, "あ");  // "あ"のフォントを取得

  // 取得フォントの確認
  for (int row = 0; row < 8; row++) {
    int sif = 0x80;
    int al = font[row];
    for (int col = 0; col < 8; col++) { //8bit

      if ((al & sif) == 0) {
        Serial.print(' ');
      } else {
        Serial.print('#');
      }
      sif = sif >> 1;

    }  //for col
    Serial.println();
  }  //for row
}  //setup

void loop() {
  delay(3);  //dummy
}  //loop


```
UVを使ったJupyterlabの起動方法

## あらまし
前回投稿したpyenvからuvへのお引越し記事に思いの外反響があったので追加情報を記述する。
vscodeも使用するが、jupyter-labを使うこともままある。特にLLM関係の開発の初期段階では、1行ずつ実行し確認できるため重用している。

## jupyter-labのインストール
テスト用の仮想環境`uv-jupyter`を作成する。
```zsh
uv init uv-jupyter
```
作成した仮想環境へ移動し、
```zsh
cd uv-jupyter
```
jupyterライブラリを追加する。
```zsh
uv add jupyter
```
確認をすると、
```zsh
uv pip list
```
コマンドを実行することで、確認することができる。
pipと比較し、短時間でライブラリを追加することができる。

## jupyter-labの実行
次のコマンドを使用しjupyter-labを実行する。
```zsh
uv run jupyter-lab
```

## 終わりに
jupyter-lab以外にも、LLM用のChainlitなどを使用する際にも`uv run chainlit`のように実行することで、uvの環境下で実行することができる。普段は`jupyter-lab`や`chainlit`のように実行しており、pythonで実行していることを忘れがちである。そのため、備忘録ととして紹介した。
全てのライブラリをuvで定義することで、環境をクリーンに保つことができる。
【Rails】RSpec(Gem)について

# 記事概要
Ruby on RailsのRSpec(Gem)について、まとめる

# 前提
- Ruby on Railsでアプリケーションを作成している

# RSpecとは
Ruby on Railsのテストコードを書くために用いられるGem

https://github.com/rspec/rspec-rails

## rails_helper.rb
Rspecを用いてRailsの機能をテストするときに、共通の設定を書いておくファイル

各テスト用ファイルで`spec/rails_helper.rb`を読み込むことで、共通の設定やメソッドを適用できる


# Gemのインストール手順
https://qiita.com/likapantrip/items/d7317b9ece36b58dffd6#手順

# Gemfileの記述
https://qiita.com/likapantrip/items/c8718db9a4e72b7c6ad0#rspec

# 手順(設定)
1. アプリにRSpecをインストールするため、下記コマンドを実行する
    ```
    # アプリのディレクトリに移動
    % cd ~/[アプリ名]
    
    % rails g rspec:install
    ```
1. `.rspec`に`--format documentation`を追記する
    テストコードの結果をターミナル上に可視化するための記述である
    ```.rspec
    --require spec_helper
    --format documentation
    ```
1. RSpecのテスト実行時の標準の言語を英語に指定したい場合、生成された`spec/rails_helper.rb`に下記を記述する
    ```spec/rails_helper.rb
    # RSpec.configure do |config|　〜　end　の外に記述
    I18n.locale = "en"
    
    RSpec.configure do |config|
      #省略
    end
    ```

# Ruby on Railsまとめ
https://qiita.com/likapantrip/items/46b43c9d1309b6633f0a
3D　移動床

Unity 2022.3.18f1
 
 ・3Dの移動床はこちらの方の参考

https://kurokumasoft.com/2022/06/07/unity-moving-platform/



```

    void AddVelocity()
    {
        if (isRide == false) return;

        if (rb3.velocity.sqrMagnitude <= 0.01f)
        {
            return;
        }

        for (int i = 0; i < rigidBodies.Count; i++)
        {
            var yReset = rb3.velocity;

            //キャラが跳ねるのを防止
            yReset.y = rb3.velocity.y*0;

            if (rb3.velocity.y>0)
            {
                yReset.y = rb3.velocity.y * -(1*SPEED);
            }

            rigidBodies[i].AddForce(yReset, ForceMode.VelocityChange);
        }
    }

```

説明
Y座標を床が移動するときに跳ねてしまっていたので
上方向に移動するときのみ反対方向に力を加えている？
LINE Bot MCP サーバーの使い方と機能紹介

## はじめに


LINEが提供する「LINE Bot MCP サーバー」は、Model Context Protocol (MCP) を実装したサーバーであり、LINE Messaging API と AI エージェントを連携させるための重要な橋渡し役となります。この記事は、私が各種MCPサーバーの機能に関して調べていく際の参照先として記事に残すことを目的として書きます。

## LINE Bot MCP サーバーとは？

LINE Bot MCP サーバーは、Claude や GPT などの AI モデルを LINE の公式アカウントと連携させるためのサーバーです。MCPとは Model Context Protocol の略で、AI モデルとチャットアプリなどのインターフェースをつなぐための標準化プロトコルです。

GitHub リポジトリ: [line/line-bot-mcp-server](https://github.com/line/line-bot-mcp-server)

## 主要機能

### 1. 個別ユーザーへのメッセージ送信

LINE Bot MCP サーバーでは、特定のユーザーに対して以下の2種類のメッセージを送信することができます：

#### テキストメッセージ
- 最大5000文字までのプレーンテキスト
- シンプルで素早く送信可能

#### Flexメッセージ
- カスタマイズ可能なリッチメディアメッセージ
- 画像、ボタン、カルーセルなど多彩な表現が可能
- 高度なレイアウト設定が可能

### 2. フォロワー全員へのブロードキャスト

LINE公式アカウントのフォロワー全員に一斉にメッセージを送ることも可能です：

- **ブロードキャストテキストメッセージ**: 全フォロワーへのテキスト送信
- **ブロードキャストFlexメッセージ**: 全フォロワーへのリッチコンテンツ送信

### 3. ユーザープロファイル情報の取得

ユーザーに関する以下の情報を取得できます：
- 表示名
- プロファイル画像URL
- ステータスメッセージ
- 言語設定

## Flexメッセージの詳細

Flexメッセージには2つの主要なコンテナタイプがあります：

1. **バブルコンテナ**:
   - 単一のメッセージユニット
   - ヘッダー、ヒーロー画像、ボディ、フッターの構成

2. **カルーセルコンテナ**:
   - 複数のバブルを横スクロールできる形式
   - 関連コンテンツをまとめて表示可能

これらのコンテナ内に様々なコンポーネントを組み合わせて、高度にカスタマイズされたメッセージを作成できます。

## AIエージェントとの連携

LINE Bot MCP サーバーの大きな特徴は、Claude Desktop や Cline などの AI エージェントと連携できる点です。これにより：

- AIによる自然な対話を LINE 上で実現
- ユーザーからの質問に AI が回答
- 予約受付や情報提供などの自動化

## 実装方法

### 必要条件
- Node.js v20 以上
- LINE 公式アカウント
- Messaging API の有効化
- チャネルアクセストークン

### セットアップ手順

```bash
# リポジトリのクローン
git clone https://github.com/line/line-bot-mcp-server.git

# 依存パッケージのインストール
npm install

# 設定
# .env ファイルを作成し、LINE_CHANNEL_ACCESS_TOKEN を設定

# サーバー起動
npm start
```

## 注意点

- 現在はプレビュー版として提供されており、機能や仕様は変更される可能性があります
- 商用利用の前に適切なテストと検証を行ってください
- LINE公式アカウントの利用規約に従って実装する必要があります
Azure使う？使わない？ ～Static Web Apps編～

:::note warn
Qiita利用規約およびコミュニティガイドラインを遵守するために一部の表現を修正いたしました。
:::

一般的にサービスの良い面は語られがちですが、**残念な面について語られることは少ない**ですよね。
そこで本記事ではStatic Web Appsの残念な点をあえて挙げることで、Azureの利用を検討している方々にとっての**判断材料**となることを目的としています。

よろしければ前回のAzure Functions編を読んだうえで本記事をお読みください。
前回の記事を読んでいただくと本記事をより理解していただけると思います。

https://qiita.com/Azure_tsurai/items/f94ed47e415ee228d39f

# Static Web Appsとは？
Static Web Appsはその名の通り**静的Webサイト**をホストできるAzureサービスです。
React, Vue, Angular, Svelte, Next.js, Nuxt.jsなどのフレームワークにも対応しています。

2021年5月にGAした結構新しめのサービスで、Azureにも普通にありそうなのに無かったサービスなのでようやくこの手のサービスが来たかとAzure系エンジニア界隈でそこそこ話題になりました。

機能としてはGitHub等とのCI/CD、CDNによるグローバル分散、カスタムドメインやSSL/TLS証明書、IDaaSなど様々な便利機能を使用・統合することが出来ます。
また、オプション機能としてFaaSである **Azure Functionsを内蔵している** ためバックエンドを必要とするシンプルなWebアプリもホストすることが出来ます。
さらにオプションのオプションですが、自分で用意したApp Serviceなどをバックエンドとして使用することもできます。

ちなみに上記の各種機能は料金プランによって出来たり出来なかったりが決まっています。

Static Web Appsとは何か？というのが大体理解できたと思いますので、ここから本題となるStatic Web Appsの残念な面を情報提供していきます。

# Javaを使用できない
本家のAzure FunctionsではJavaを使用できるのですが、上記で説明したStatic Web Apps内蔵のAzure Functionsでは **Javaを使用できません**。
AzureのサービスではMicrosoft自身のC#がSDKやランタイムサポートの絶対的なTier 1として君臨しており、Java / Python / Node.jsがその次のTier 2グループを形成しています。
この3つは世界的に利用者の多いプログラミング言語なので納得していただけるところだと思います。
しかしそれだけにTier 2の言語すらも対応していないのかと残念なところですね。

# Python 3.11がいまだに正式サポートされていない
Python 3.11自体はご存知2022年10月リリースです。
しかし2025年5月現在、Static Web Apps内蔵のAzure FunctionsではPython 3.10までなっており **Python 3.11** は正式にサポートされていません。
当然ですが **Python 3.12/3.13** もサポートされていません。
ちなみにAzureの外の世界では5か月後に **Python 3.14** がリリースされるらしいです。

# Node.jsを本番環境として使用できない
Node.js 20自体はご存知2023年4月リリースです。
しかし2025年5月現在、Static Web Apps内蔵のAzure Functionsでは **Node.js 20** が正式にサポートされていません。
もちろん **Node.js 22** もサポートされていません。
また、**Node.js 18** はサポートされているのですが、2025年4月でNode.js公式の **Node.js 18** サポートが終了しました。

つまり、2025年5月現在 **本番環境として使用できるNode.jsバージョンが存在しません**。
サポート切れの18または未だにプレビュー状態の20を自己責任で使うということは一応出来ますが…本番環境として非推奨なのは言うまでもないです。

# サービス終了疑惑（？）
Static Web Apps公式の[GitHubリポジトリ](https://github.com/Azure/static-web-apps)があり **"新バージョンのサポートどうなってんの？"** という趣旨のIssueがあるのですが、Microsoft側は完全に無反応です。
というか、新バージョンに限らず様々なトラブルのIssueが報告されているのですが昨年あたりから**Microsoft側の反応が全く無い**ようです。

[Azure Updates](https://azure.microsoft.com/en-us/updates/?filters=%5B%22Static+Web+Apps%22%5D)というAzure公式のアップデートログによると、Static Web Appsは割とコンスタントにアップデートされていたのに**2024年5月**で突然アップデートが止まっています。

長年Azureを使ってきましたが、Azure内ではメジャーなサービス（と私は思っています）でこのようなアップデート停止かつ公式リポジトリも完全放置、そして現在進行形で何のアナウンスも無し（逆に言うと**サービス提供中**ということなんですが…）このような運営はこれまで記憶にないです。

他のAzureユーザも気になっているようで **"今後サポートや開発どうなるの？"** と質問している[Issue](https://github.com/Azure/static-web-apps/issues/1614)なんかもありますがやはりMicrosoft側の反応はありません。

また、弊社の社内システムでも使われているサービスなので今後も状況をウォッチしていきたいと思います。

そんなところでそれではこの辺で締めておきます。

# あなたの結論は？
**Azure使う？使わない？**:thinking:

# 参考
https://learn.microsoft.com/ja-jp/azure/static-web-apps/languages-runtimes#api
どうしてZIPは文字化けするの？どうして7zは文字化けしないの？

# はじめに

ZIPファイルを解凍した際に文字化けすることがあります。 
一方で、7zファイルでは文字化けしたことがありません。  
この違いについて調査しました。

# ZIPが文字化けする理由

ZIPファイルの内部データには、ZIPファイルに含まれるフォルダ名やファイル名がUTF-8でエンコードされているかどうかを示すフラグがあります。  
このフラグが立っていない場合、文字コードが判定できず、文字化けしてしまう可能性があります。  

# 7zファイルが文字化けしない理由

7zファイルの公式仕様では、7zファイルに含まれるファイル名がUnicodeであると定められています。  
したがって、7zファイルでは文字化けが発生しにくいです。

# おわりに

7zファイルは、ZIPファイルと違い、文字コードが明確に定められているため、文字化けしにくいことがわかりました。  
ただし、アーカイバの実装によっては、7zファイルでも文字化けが発生するかもしれません。

# 参考文献

https://pkwaredownloads.blob.core.windows.net/pkware-general/Documentation/APPNOTE-6.3.9.TXT

https://www.7-zip.org/7z.html
ABC404をPythonで（A～E）

AtCoder Beginner Contest 404（Promotion for Engineer Guild）の解答等の速報的まとめ

https://atcoder.jp/contests/abc404



# A問題
https://atcoder.jp/contests/abc404/tasks/abc404_a

入っていない文字を１つずつ調べて、そのうち１つを出力する
```python:A
s = input()
lst = [chr(i + ord("a")) for i in range(26) if chr(i + ord("a")) not in s]
print(lst[0])
```


# B問題
https://atcoder.jp/contests/abc404/tasks/abc404_b

最初に回転する回数を決めてから、違うマスが何マスあるか数える
```python:B
def check(list_a, list_b):
    res = 0
    for a_i, b_i in zip(list_a, list_b):
        for a_ij, b_ij in zip(a_i, b_i):
            if a_ij != b_ij:
                res += 1
    return res

def turn(s):
    return list(zip(*s[::-1]))

n = int(input())
s = [list(input()) for _ in range(n)]
t = [list(input()) for _ in range(n)]

ans = check(s, t)
s = turn(s)
ans = min(ans, check(s, t) + 1)

s = turn(s)
ans = min(ans, check(s, t) + 2)

s = turn(s)
ans = min(ans, check(s, t) + 3)
print(ans)
```


# C問題
https://atcoder.jp/contests/abc404/tasks/abc404_c

すべての頂点に接続している辺の数が 2 かつ、1回のDFSですべての頂点に到達できれば良い
```python:C
import sys;sys.setrecursionlimit(10 ** 7)

n, m = map(int, input().split())
edge = [[] for _ in range(n)]
for _ in range(m):
    u, v = map(lambda x:int(x) - 1, input().split())
    edge[u].append(v)
    edge[v].append(u)

if n != m:
    exit(print("No"))

check = [False] * n
def dfs(now, old = -1):
    if check[now]:
        return
    check[now] = True
    for to in edge[now]:
        if to == old:
            continue
        dfs(to, now)

dfs(0)
print("Yes" if all(check) and all(len(e_i) == 2 for e_i in edge) else "No")
```


# D問題
https://atcoder.jp/contests/abc404/tasks/abc404_d

bit全探索を3進数で行う
```python:D
n, m = map(int, input().split())
zoo = list(map(int, input().split()))
zoo_list = [set() for _ in range(n)]
for i in range(m):
    k, *a = map(lambda x:int(x) - 1, input().split())
    for a_i in a:
        zoo_list[a_i].add(i)

ans = float("inf")
for bit in range(3 ** n):
    lst = []
    for _ in range(n):
        lst.append(bit % 3)
        bit //= 3
    count = [0] * m
    ans_i = 0
    for i, cnt in enumerate(lst):
        if cnt:
            ans_i += zoo[i] * cnt
            for animal_i in zoo_list[i]:
                count[animal_i] += cnt
    if min(count) >= 2:
        ans = min(ans, ans_i)

print(ans)
```


# E問題
https://atcoder.jp/contests/abc404/tasks/abc404_e

$N-1$から降順に操作する
運べる茶碗の中にすでに豆があるときはその茶碗に入れる
豆が入っている茶碗がないときは一番遠くにおける茶碗に入れればよい
```python:E
n = int(input())
c = list(map(int, input().split()))
a = list(map(int, input().split()))

ans = 0
for i in range(n - 2, -1, -1):
    if a[i] == 0:
        continue
    ans += 1

    nxt = 0
    dist = n + 10
    flag = False
    for c_i in range(c[i]):
        if a[i - 1 - c_i] > 0:
            flag = True
        elif dist > i - 1 - c_i - c[i - 1 - c_i]:
            nxt = i - 1 - c_i
            dist = i - 1 - c_i - c[i - 1 - c_i]
    if not flag:
        a[nxt] += 1

print(ans)
```
JetBrainsのjunieを試してみ

## 概要

普段IDEとしてJetBrainsのものを利用しているのですが、
最近AI機能としてJunieがリリースされた。

https://www.jetbrains.com/ja-jp/junie/

簡潔に説明するとユーザの要求の応じてプログラミングをする生成AIです。
すべてのツールで利用できるわけではないですが、GoLandやWebStromがメインの私にはどちらも提供されているので
早速試してみました。

## どんな機能があるのか？

実装依頼もしくは提案を行ってくれます。
チャット形式でやりとりをして実装計画を立案してくれたり、いきなり実行させることも可能です。
いきなり実装されることは懸念点がまだまだある世界なので、実行計画を提案して提案された内容に関しても
チャットでやりとりをして改善しながら進めることができます。

個人的な感想ですが、この仕様はありがたかったです。
特に最初に使うときにどのような実装をされるのかは不安な点ではあるので内容を精査したかったこともあり、
提案から始めれるのは最初の障害を取り除いてくれる印象でした。

### 試してみた感想

今回、よく使うクリーンアーキテクチャの構成は1パターン実装した状態でいろいろ試してみました。
用意した理由は、自分の実装方針との差を見てみたかったし、そこから得られることがたくさんあるのではないかと思ったからです。

知り合いと話した感想も踏まえると結果としてこの実装があったからかなりうまく実装できたのではないかと感じています。
まず、こちらがチャットで依頼したとき（以後依頼と書かせてもらいます。）に現在の実装パターンを解析するステップがどの依頼にも存在していました。
世の中のベストプラクティスの実装がされるというよりは、今の実装を踏まえたベストプラクティスを実装する印象でした。
この点は、既存の開発プロセスに導入することを考えたときに、実装内容に大きな変化がうまれにくく導入しやすいのではと思っています。
ですが、リファクタリングしたいときに方針を決めないとぼやっとした実装になるのか恐れがあるのでは？と思っています。（試してないです）

実装傾向に関しては、個人的には違和感は感じませんでした。
試したパターンが少ないのでバリデーションと実処理を分けたい派である私との乖離に関しては確認できていませんが、
試した実装内容に関しては概ね賛成でした。
細かい命名規則などに関しては依頼時にこちらから指定する形をとることで問題なく対応できました。

また、依頼した内容のテストコードが作成できる範囲で作成する方針のようでした。
APIの作成依頼したときにControllerだけでなく各レイヤーのテストコードが実装されていたのでちゃんとしていると感じました。
個人的にはまだまだテストコードが実装されていないことを見受けられるので（個人的な感想です）AI側でこういったサポートがあることがうれしいです。
ただ、作成後に実行してみるとエラーになったりすることもあるし、作成後修正依頼したときにテストコードはなおってなかったりするので
そのあたりは使い方として認識しておく必要があるのだなと感じました。

## 総括

実行に気持ち時間がかかる印象はなくはないですが、
利用するうえでの問題を解消できれば開発プロセスに組み込むことはありだと思います。
過信して実装してもらったものを信じすぎるのも危険ではあるので、
まだまだ人の目での確認、動作確認は必要だと思いますが、すこしプラグラムができます程度の人より優秀だと思います。

こういったツールの登場がエンジニアとしてはうれしい反面、怖いとも感じました。
うれしい理由は、開発スピードの向上、品質もアップする見込みがあるのでサービス提供のタイムラグが経ることで
世の中がより便利になっていくと感じてました。
怖い理由は、エンジニアに求められていくスキルの変化です。
以前は技術力が最大の武器であったと思いますが、今後技術力ではなくコミュニケーション能力になると思いました。
なぜなら、技術は最低保証をＡＩがしていくようになるからです。
ＡＩをどのように活用できるのかという点もありますが、ＡＩと会話するための要点整理、要望の解釈はまだまだ必要です。
要望は人から生まれるものなので、しばらくは人と人とのコミュニケーションによって理解されます。
これを営業から開発に伝えられるのが一般的ですので、その内容をくみ取ってどういった仕様で実装するのか？
そもそも実装できるのか？といった判断をしないといけないと強く感じました。
どんどんコードだけ書ける人は淘汰されいくから要件を考える力や
その機能の必要性ちゃんと説明できる必要が求められていくと感じました。

技術だけでなく多くの視点を求められる時代が来ていると感じつつ、
柔軟に対応していかなければいけないと思いました。
MacBook Air 32GBでローカルLLMによるコード生成を評価してみた(2025/04 最終稿:Qwen3-30B-A3Bのlmxが最強)

## はじめに
最近話題のローカルLLM。オンラインでコード生成するのではなく、自分のマシンだけでAIにコードを書かせる試みに挑戦してみました。今回使ったのは、MacBook Air（M4・32GBメモリ）とroo codeです。「無料でローカルLLMを使ってプログラミングできたら最高！」というモチベーションで、さまざまなモデルを試してみました。
何度かメジャーなモデルをトライして、現状(2025/04時点)で最も使えるのは「Qwen3-30B-A3Bのlmx」が最強との結論を得ました。

## 結論：ローカルLLMでコード生成するには？

- **Qwen3-30B-A3Bのlmx(4q)がスピード品質ともに最強** → 3Bのみアクティブになるため早くてメモリも有利
- **MoE以外では14Bクラスのモデルが必要** → メモリ32GBでは厳しい
- **8bit量子化が最適解** → モデルサイズと性能のバランスが取れる
- **M4で動かすならlmx化が必要＆lmxで動かすならLM Studio一択**
- **コード系モデルより、汎用LLMの方がうまく動く**

## なぜQwen3-30B-A3Bが良いか？

- **とにかく早い**: A3Bが効いているのか、推論のスピードがとにかく早い(25.27 tok/sec)
- **メモリ消費も少ない**: やはりA3Bの効果かメモリプレッシャーも低い
- **とにかく応答が賢い**: コードが賢いというよりは一般的な推論がやはり30B級

### よく動いたモデル：

- **Qwen3-30B-A3B(4bit量子化)**: スピードと品質両方で最強
- **Qwen3-14B(8bit量子化)**: やや回り道。コメントを日本語にしてくれない。。。
- **phi4-8q（8bit量子化）**：バランスが良く、応答も素直
- **deepseek-r1-distill-qwen-14b（8bit量子化）**：やや回り道するが実行可能
- **Qwen2.5-Coder-14B-Instruct-8bit**：重いが安定
- **meta-llama-3.1-8b-instruct**：非常に軽快。応答も良好だがコードの質はやや劣る

## 評価方法
以下のタスクで、ローカルLLMのコード生成能力を評価しました。

```
1. 今開いているファイルにpythonのmain関数を追加してhello worldを出力するようにして
2. scikit-learnのirisを分類する関数を作ってmain関数から呼び出すようにして
3. 複数モデルで評価して
```

プロンプトの指示を徐々に曖昧にしても、うまく対応できるかを確認。ループしたり意味不明なコードを出さないかがポイントです。

### 動作が厳しいモデル

- **phi4-mini系**（通常/8bit量子化）：ループしやすい
- **codegemma系**や**gemma-3-12b-it-8bit**：コンテキスト長不足
- **CodeLlama系 13b**や**IBM Granite 20b**：8bitでもサイズが大きすぎて読み込めず
- **mistral-nemo-instruct-2407\@8bit/4bit**：コンテキストが大きく取れるが、ループや実装不能が発生
- **phi4-reasonal系** 考えすぎてなかなかコードを生成してくれない

## roo codeの注意点

- 実験的なコンテンツ挿入機能では、JSON形式が正しく出力されず動作しないことがある

## プロンプトに追加したロール指定

最近のモデルは長考しがちなので「Output only final answer.」を追加。
```text
If you do modify code, keep it minimal and simple and short.
I will give you the tasks in Japanese, but when you think about the code, you can think in English.
In the code you output, please add lots of comments so that your intentions can be understood in Japanese.
Output only final answer.
```

## lmxモデルの作り方
MacでローカルLLMを動かすには、mlx形式のモデルを準備する必要があります。基本的には`pip`で最新版のPyTorchをインストールしましょう（condaだと古い）。

モデルの変換と8bit量子化には以下のコマンドを使用します：

```bash
python -m mlx_lm.convert --hf-path microsoft/phi-4 \
  --mlx-path ~/.lmstudio/models/phi4/phi4-8b -q --q-bits 8

python -m mlx_lm.convert --hf-path deepseek-ai/DeepSeek-R1-Distill-Qwen-14B \
  --mlx-path ~/.lmstudio/models/DeepSeek-R1/DeepSeek-R1-Distill-Qwen-14B -q --q-bits 8
```

※.cacheに大量の一時ファイルが生成されるので、適宜削除してください。

## まとめ
MacBook Air 32GBでローカルLLMを使うには、

- Qwen3-30B-A3Bの4bit量子化が最強
- 他の一般的なモデルでは、8bit量子化された14Bクラスのモデルを使う
- mlx化をする
- 汎用LLMをベースに
- 軽量モデルはループや精度不足の傾向あり

Qwen3-30B-A3Bであれば全てOK!な状態。
javaScriptでhtml要素の追加

# はじめに
javaScriptでhtml要素を追加したいと思います。
方法は大きく2つあります。
1. 親になる要素の「innerHTML」にタグの文字列を追加する
1. 親になる要素の「appendChild()」でDOMオブジェクトを追加する

※jQueryを使用している場合でも、内部では最終的にいずれかになります。
(「html()」はinnerHTML、「append()」はappendChild)

# innerHTML
### 1つずつ「innerHTML」にタグの文字列を追加する
```javascript
function addElement() {
  const ele = document.getElementById('objParent');
  for(let i = 0; i < 1000; ++i){
    ele.innerHTML += '<div class="none">' + i + '</div>';
  }
}
```

### 文字列変数にタグ文字列をためて「innerHTML」に追加する
```javascript
function addElement() {
  const ele = document.getElementById('objParent');
  let str = '';
  for(let i = 0; i < 1000; ++i){
    str += '<div class="none">' + i + '</div>';
  }
  ele.innerHTML += str;
}
```

# appendChild
### 1つずつ「appendChild()」でDOMオブジェクトを追加する
```javascript
function addElement() {
  const ele = document.getElementById('objParent');
  for(let i = 0; i < 10000; ++i){
    const eleDiv = document.createElement('div');
    eleDiv.classList.add('none');
    eleDiv.innerHTML = i;
    ele.appendChild(eleDiv);
  }
}
```

### 「DocumentFragment」に対して「appendChild()」で追加して、親要素に「DocumentFragment」を追加する
```javascript
function addElement() {
  const ele = document.getElementById('objParent');
  const df = document.createDocumentFragment();
  for(let i = 0; i < 10000; ++i){
    const eleDiv = document.createElement('div');
    eleDiv.classList.add('none');
    eleDiv.innerHTML = i;
    df.appendChild(eleDiv);
  }
  ele.appendChild(df);
}
```

# おまけ（要素の削除）
### 「innerHTML」を削除する
```javascript
function delElement() {
  const ele = document.getElementById('objParent');
  ele.innerHTML = '';
}
```

### 「remove()」で削除する
```javascript
function delElement() {
  const ele = document.getElementById('objParent').children;
  for(let i = 0; i < ele.length; i++) {
    ele[i].remove()
  }
}
```
【後編】現場で信頼されるSESになるために知っておきたいこと

[前回](https://qiita.com/bianchi2025/private/4779b50dba644a54c4f5)からの続きです。

# 質問について

#### ● 誰に聞く？
質問の際、<strong>内容に応じて「誰に聞くか」を見極める</strong>ことが大切です。
- 契約や勤怠に関することは、まずマネージャーに聞く
- 技術的な課題については、リーダーに聞く

もし誰に聞くべきか迷ったときは、まず最初にその確認をするのも良い方法です。

#### ● 何を聞く？
質問内容を整理し、相手が答えられる内容かどうかを確認しましょう。
簡潔に伝えるために、あらかじめ質問を整理してメモしておくと、スムーズに答えをもらいやすくなります。

#### ● いつ聞く？
質問するタイミングも重要です。忙しい人ほど時間が限られているため、なるべく相手が空いている時間を見計らって質問するようにしましょう。

事前に「今、ちょっとお時間ありますか？」と一声かけてから話を切り出すのがベターです。

#### ● 言質（げんち）をとる（＝記録を残す）
重要なことや決定事項は、口頭でのやり取りに頼らず、記録に残しておきましょう。
また、「この内容で進めてOKでしょうか？」など、確認の一言を添えることで、後々の認識違いを防ぐことができます。

# 業務引き継ぎ

#### ● 後任へのフォローは丁寧に
業務を引き継ぐ際は、これまで蓄積した知識やノウハウを後任に伝えることが重要です。
特に、自分が深く関わってきた部分は、ドキュメントとして残し、後任が困らないように配慮しましょう。
可能であれば、後任と並行して作業する期間を設け、直接的なフォローも行うとより安心です。

#### ● 終わり良ければすべて良し
業務終了時には、丁寧に業務を締めくくることが大切です。
良い印象を残して終わることで、今後の信頼関係を築くことができます。
惜しまれるくらいで終了すると、会社間でも個人としても良い関係が続きやすくなります。

# 最後に
開発の現場では、言語やフレームワーク、開発工程など、技術的なスキルが求められます。
しかし、SESとしてチームに参加する際にはさらに「人と協力して開発する力」、つまりチームワークが求められます。

実際、現場でぶつかる課題の中には、技術だけでは解決できないものが多々あります。
そのときに必要なのが、相手の立場に立ち、状況に応じたコミュニケーションを取ることです。

SESは技術力だけでなく、人としての柔軟さや協調性も問われる仕事です。
そこで信頼関係を築くことで、「また一緒に働きたい」と思ってもらえるエンジニアになれるはずです。

皆さんのITライフが、実り多く充実したものになりますように！
【前編】現場で信頼されるSESになるために知っておきたいこと

# はじめに
SES（システムエンジニアリングサービス）で働く場合、クライアント先で常駐して業務を行うことが一般的です。

フルリモートの仕事も多くなりましたが、いずれにしても「客先で働く」という環境には独自のルールや雰囲気が存在します。そこで、これまでの経験から<strong>「これは意識しておいたほうがいいな」</strong>と感じたことを、いくつかのポイントに分けてまとめてみました。

現場ごとに違いはありますが、できるだけ多くの現場で通用するような基本的な内容をお伝えできればと思います。これからSESとして働く方や、今まさに現場で頑張っている方にとって、少しでも参考になれば嬉しいです。


# 基本的な姿勢

#### ● 自分の役割をしっかり認識しよう
どんな現場でも、まず大切なのは<strong>「自分が今、どんな立場でここにいるのか？」</strong>を意識することです。

たとえば、

- チームの一員としてサポート役なのか

- 経験を活かして主導的に動くシニア枠なのか

- マネジメントを任されているのか

この<strong>「期待されている役割」</strong>によって、仕事の進め方や求められる行動が大きく変わります。自分の役割を理解し、スムーズに進められるようにしましょう。

#### ● 謙虚さと素直さを大切に
新しい現場では、初めてのことが多いです。そんなとき、<strong>「教えてもらう立場」</strong>だという意識を持つことが、物事をスムーズに進めます。

「ありがとうございます」「すみません、教えてください」と素直に伝えることで、信頼関係が築かれます。

# 立場について

#### ● 客先社員（プロパー）が主役
SESは、クライアントの一員として仕事をするスタイルです。
与えられた仕事に対して責任を持っていますが、最終的な製品やサービスに対する責任は、基本的には客先の社員（プロパー）が持ちます。

そのため、チームの中でプロパーの方が「主役」になります。SESはそのサポート役として動くことで業務がスムーズに進行します。

#### ● 郷に入れば郷に従え
現場が変われば、仕事の進め方やツール、コミュニケーションのスタイルなどもさまざまです。「前の現場ではこうだったのに」と思っても、<strong>まずは今の現場のやり方を受け入れてみる</strong>のが大切です。

もし、自分の知っているやり方のほうが効率的だと思っても、いきなり変えようとせず、まずは現場のルールを経験してみましょう。その上で、「こういうやり方もありますよ」と、柔らかく提案してみるのがおすすめです。

# コミュニケーションについて

#### ● 報連相を意識しよう（報告・連絡・相談）
「報連相」は、開発業務でも特に重要です。自分のタスクに集中していると、気づかないうちに「ひとり作業」になりがちです。しかし、

- 「今こんな作業をしている」

- 「この方針で進めようと思っている」

- 「ちょっと詰まっているところがある」

こうした情報を周りに共有することで、助けてもらえたり、逆に自分が誰かを助けられることもあります。
チーム全体のパフォーマンスを上げるためには、報連相は欠かせません。

#### ● 相手や場面に合わせたコミュニケーション
チーム内だけでなく、他部署や他チームとのコミュニケーションも発生します。
その際、重要なのは<strong>「誰に何を伝えるか」</strong>ということです。

技術に詳しいエンジニア同士なら細かい話も通じますが、マネージャーや別の部署の人には、簡潔にポイントだけを伝える方が効果的です。

#### ● 日頃からこまめに話そう
リモートワークが多い昨今では、直接会話をする機会が減りがちです。
しかし、ちょっとしたコミュニケーションでも積極的に取ることで、後で相談しやすい関係性が築きやすくなります。
雑談や日常的な会話も、仕事を円滑に進めるための重要なツールです。

[後編につづく](https://qiita.com/bianchi2025/private/41b30d0c9d437e8f566d)