OmniAICreator/Qiita-1.07M huggingface dataset:
WebStormがnpmで実行するものをbunに置き換える

# 経緯
WebStrom(+その他JetBrains系のIDE)の『実行/デバッグ構成』にはBunで実行できる設定があるが
どうやらpackage.json(node.jsの環境)ではなくTypeScriptの実行の機能のみだった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/0df0dd46-1e3f-440d-a9d6-8104ab1c7a27.png)

https://pleiades.io/help/webstorm/bun.html

Shell Scriptとして`bun dev`を追加することができますが...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/348727dc-73af-420f-a22a-4233dfbd393c.png)
ターミナルの別タブとして実行されるので、少々扱いずらいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/f02291d1-57b4-41d4-9e9d-a9817c872e11.png)

ちなみに、Node.js(npm)の場合は『実行ツールウィンドウ』内で実行され、これが理想です。


# 解決方法
`npm`を`nnpm`や`yarn`に置き換える設定があったので、これで`npm`を`bun`に置き換えました。

https://www.jetbrains.com/help/idea/installing-and-removing-external-software-using-node-package-manager.html

『設定』から『言語 & フレームワーク』にある『Node.js』を開きます。
『パッケージマネージャー』の設定が変えることができるので、ここでbun.exeを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/8103495c-2398-42f2-a36e-94400aba7e8f.png)
bun.exeはデフォルトで以下の箇所にあります。
```
C:\Users\ユーザー名\.bun\bin
```

# 確認
npmの構成を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/dd02e469-3da0-4f49-96a4-cda6972d4c37.png)
実行をすると、npm同様『実行ツールウィンドウ』で実行され、中身のコマンドが`bun run`になっているのがわかります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826547/5f0052ae-6b39-4f50-9d73-43b53b1c0030.png)
【Python初心者】コレクション型の“かっこ”使い分け（リスト・タプル・辞書・集合）

Pythonを学習している中で、「リスト」「タプル」「辞書」「集合」などのコレクション型がよく登場します。  
初心者のうちは、それぞれで使う**“かっこ”の種類やアクセス方法の違い**がややこしく感じました。

そこで、代表的な4つのコレクション型について、「かっこ」と「アクセス方法」を整理してみました。  
自分用の復習メモとして、また同じように迷った方の参考になればうれしいです。

## Pythonの主なコレクション型

| 型名       | かっこ | 順序 | 重複 | 変更可否 | 特徴の一言 |
|------------|--------|------|------|----------|------------|
| `list`     | `[]`   | あり | 可   | 〇       | よく使う普通の入れ物 |
| `tuple`    | `()`   | あり | 可   | ✕       | 変更できないリスト |
| `dict`     | `{}`   | なし | キーは不可 | 〇 | キーと値のセット |
| `set`      | `{}`   | なし | 不可 | 〇       | 重複なしの集合体 |

## 1. list（リスト） - `[]`

順序のある複数のデータを格納でき、値の追加・変更・削除が自由にできます。

```python
fruits = ['apple', 'banana', 'orange']
```

**アクセス方法（index指定）**

```python
print(fruits[0])  # 'apple'
```

**追加**

```python
fruits.append('grape')     # 末尾に追加
fruits.insert(1, 'peach')  # 任意の位置に追加
```

**変更**

```python
fruits[0] = 'melon'  # 値の書き換え
```

**削除**

```python
del fruits[1]
fruits.remove('orange')
fruits.pop()
```

## 2. tuple（タプル） - `()`

リストに似ていますが**変更ができない**（イミュータブル）という特徴があります。

```python
dimensions = (1920, 1080)
```

**アクセス方法（index指定）**

```python
print(dimensions[1])  # 1080
```

**変更はできない（エラー）**

```python
dimensions[0] = 1280  # ❌ TypeError
```

**単一要素のタプルに注意！**

```python
x = (5)     # int型になる
y = (5,)    # タプル型になる
```

## 3. dict（辞書） - `{}`

**キーと値のペア**でデータを管理する構造。設定や名前付きのデータに便利です。

```python
person = {'name': 'Alice', 'age': 30}
```

**アクセス方法（キー指定）**

```python
print(person['name'])     # 'Alice'
print(person.get('age'))  # 30
```

**追加・変更・削除**

```python
person['job'] = 'engineer'
person['age'] = 31
del person['job']
person.pop('name')
```

## 4. set（集合） - `{}`

重複を自動的に除外し、順序を持たないコレクション。  
重複のあるリストから一意の要素を取り出すときに便利です。

```python
nums = {1, 2, 3, 2, 1}
print(nums)  # {1, 2, 3}
```

**存在チェック・追加・削除**

```python
print(2 in nums)

nums.add(4)
nums.remove(1)
nums.discard(5)  # 存在しなくてもエラーにならない
```

**空の集合の作成方法**

```python
empty_set = set()  # {} は空の辞書になる
```

## まとめ：かっこの使い分けとアクセス方法

| 型   | かっこ | アクセス方法例         | 特徴                         |
|------|--------|--------------------------|------------------------------|
| list | `[]`   | `my_list[0]`             | 追加・変更・削除が可能       |
| tuple| `()`   | `my_tuple[1]`            | イミュータブル（変更不可）   |
| dict | `{}`   | `my_dict['key']`         | キーと値で管理                |
| set  | `{}`   | `val in my_set`          | 重複なし・順序なし           |

## おわりに

「どのかっこを使う？」「どうアクセスする？」と迷うことが多かったので、改めて整理しておくことで理解が深まりました。
リストや辞書は特によく使うので、構造や性質の違いを意識しながら書けるようになっていきたいです。
Github Copilotを導入してみた件

## 本物の「はじめに」

自宅のPCにGithub Copilotを導入した。
せっかくなのでQiitaの記事を**一緒**に書いてみる。

Copilotに手直ししてもらう前に、適当にアウトラインを書いた。
これを直してもらう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/abbc63da-317a-4dc7-bd4d-c54f2a53d3b1.png)

## 投じたプロンプト

以下の指示だけを与えてみた。
ビフォーアフターを赤と緑で見せてくれる。

> 技術ブログであるQiitaにこの記事を掲載します。各章を細かくチェックして、わかりやすい文章に直してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/2a58296b-5fb7-4d26-ba54-f5f4f558420f.png)

さらに、エラー内容のキャプチャをテキストにしてもらった
画像中の文字も引っ張り出せるOCR的な機能も使えるのは便利

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/235948ce-e12e-4b10-b2a6-58c11eede166.png)


はい、以下は Colilotに手直ししてもらった記事

---
---
---

## はじめに

自宅のパソコンにGitHub Copilotを導入してみました。  
その体験をQiitaの記事としてまとめてみることにしました。

## 導入にあたって苦労したこと

VSCodeでGitHubの認証が通らない問題に直面しました。

認証が通らなかったときのスクリーンショットはこちらです。

![認証エラーの画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/b889e533-91df-4cd9-a913-b1060456086a.png)

エラー内容は以下の通りです：  
「GitHub: Sign in failed. Please try again.」  
このエラーは、GitHubアカウントでの認証が正常に完了しなかったことを示しています。  

## 解決方法

この問題を解決する際、GitHubのIssueが非常に役立ちました。  
参考にしたリンクはこちらです：  
[https://github.com/microsoft/azuredatastudio/issues/24578](https://github.com/microsoft/azuredatastudio/issues/24578)

原因は、VSCodeに事前にインストールしていたGitHub拡張機能との連携が邪魔をしていたことでした。  
この拡張機能からログアウトすることで問題が解消しました。

## GitHub Copilotの料金

GitHub Copilotの利用には、毎月約1,400円の料金がかかります。

## おわりに

この記事を通じて伝えたいことは、身銭を切ってでも新しい技術に積極的に挑戦していくことの重要性です。  
これからも新しい技術に挑戦し続けたいと思います。
EtherNet/IP機器をpycomm3で使ってみる

# はじめに
EtherNet/IP機器をいじってみたかったので、ヤフオクで`S8VK-X12024A-EIP`を買って試してみた

# 使用機器
制御対象：S8VK-X12024A-EIP
制御元（PC）：Ubuntu20.04 + python3.8.10
機器設定用PC：Windows11


# S8VK-X12024A-EIPの設定
IPの固定やデフォルトゲートウェイの設定をするためにPower Supply Monitoring Toolというメーカー純正ソフトで設定をした（Windowsアプリケーション）
中古で買った機器だったため、何か設定が残っていてはじめ上手く接続できなかったけど、本体側のリセット（RSTボタンを押したまま電源を入れ、10秒待つ）を実施したら設定できた

# pycomm3 とは
python3で使えるEtherNet/IP用のライブラリ
詳しくは[ドキュメント](https://docs.pycomm3.dev/en/latest/index.html)を読みましょう
インストールは`pip install pycomm3`で入る

# 機器情報の取得
ネットワーク上の機器をサーチするのは以下のコードで実行できる
この場合機器のIPを知っておく必要はなく、ブロードキャストで応答した機器が情報を返してくれるっぽい

```python:discover.py
import pycomm3

res = pycomm3.CIPDriver.discover()
print(res)

```


```text:結果
[{'encap_protocol_version': 1, 'ip_address': '192.168.xxx.xxx', 'vendor': 'Omron Corporation', 'product_type': 'UNKNOWN', 'product_code': 1680, 'revision': {'major': 1, 'minor': 2}, 'status': b'\x00\x00', 'serial': 'xxxxxx', 'product_name': 'S8VK-X12024A-EIP', 'state': 255}]
```

# 電圧・電流データの取得
S8VK-Xシリーズは電源ユニットなので、出力している電圧や電流等のデータをEtherNet/IP経由で取得できる
詳しい情報は[メーカーHP](https://www.fa.omron.co.jp/products/family/3687/download/manual.html)から通信マニュアルを取得できる

```python:Get_Attributes_All.py
import pycomm3

DEVICE_IP = '機器のIP'

with pycomm3.CIPDriver(DEVICE_IP) as driver:
    driver.open()
    res = driver.generic_message(
        service=pycomm3.Services.get_attributes_all,
        class_code=0x0372,
        instance=0x01)
    buffer = res[1]
    print(buffer)
```

```text:結果
b'\x00\x01V\t\x00\x00\x08\x02\x87\x00\xd9\x03\x08\x07\x00\x00G\x00\x00\x00\xa7\x01'
```

実行するとこんな感じで各種データが取得できる
全データをまとめて取得するとByte配列になっているので見やすいように整形する


```python:
import struct

# 最初の12バイトを2バイトずつUINTとしてunpack
uint1 = struct.unpack_from('<H', buffer, 0)[0]
uint2 = struct.unpack_from('<H', buffer, 2)[0]
uint3 = struct.unpack_from('<H', buffer, 4)[0]
uint4 = struct.unpack_from('<H', buffer, 6)[0]
uint5 = struct.unpack_from('<H', buffer, 8)[0]
uint6 = struct.unpack_from('<H', buffer, 10)[0]

# 残りの8バイトをDWORD型としてunpack
dword1 = struct.unpack_from('<I', buffer, 12)[0]
dword2 = struct.unpack_from('<I', buffer, 16)[0]

data = {}
data['status_bits'] = bin(uint1)
data['voltage'] = uint2 / 100
data['current1'] = uint3 / 100
data['current2'] = uint4 / 100
data['lifetime1'] = uint5 / 10
data['lifetime2'] = uint6 / 10
data['total_operating_time'] = dword1
data['runtime'] = dword2

# 結果の表示
for key, value in data.items():
    if key == 'voltage':
        print(f"  {key}: {value:.2f} V")
    elif key == 'current1':
        print(f"  {key}: {value:.2f} A")
    elif key == 'current2':
        print(f"  {key}: {value:.2f} A")
    elif key == 'lifetime1':
        print(f"  {key}: {value:.1f} 年")
    elif key == 'lifetime2':
        print(f"  {key}: {value:.1f} %")
    elif key == 'total_operating_time':
        print(f"  {key}: {value} 時間")
    elif key == 'runtime':
        print(f"  {key}: {value} 分")
    else:
        print(f"  {key}: {value}")
```


```text:結果
  status_bits: 0b100000000
  voltage: 23.90 V
  current1: 0.00 A
  current2: 5.20 A
  lifetime1: 13.5 年
  lifetime2: 98.5 %
  total_operating_time: 1800 時間
  runtime: 71 分
```
ラズパイWebサーバーを公開するためにいくつか準備をする

こんにちは！眠い目を擦りながら、この記事を書いてます！今も引き続き自作Webサーバを公開するためにセキュリティを強固にする活動をしています。また、その備忘録を書こうと思います。

# 今回やりたいこと
Webサーバを外部からアクセスできるようにするため、武装地帯と非武装地帯に分けたいと思います。今回公開するWebサーバは非武装地帯、その他のアクセスして欲しくないものは武装地帯に置きます。
![IMG_0754.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071716/1d2eb558-197d-40d9-8c30-9fbb91fda928.jpeg)
そのために、まずはDMZで非武装地帯にWebサーバを置く設定します。できたら、他のセキュリティを強固にする設定をします。

# 環境
* raspberry pi 5
* 楽天ひかり
* BE9300 Tri-Band Wi-Fi 7 Router

# TPlinkにDMZの設定をする
自分の家で使用しているルータはTPlinkなので、今回はこれで説明します。まず、TPlinkの管理ページへ行きます。TPlinkはhttp://192.168.0.1 です。
ログインすることができたら、上部の大まかなメニューの詳細設定を選択して、左側のメニューの「NAT転送」→「DMZ」を開き、公開したいPCのIPアドレスを入力して保存すると反映されるはずです。
![スクリーンショット 2025-04-20 午前1.00.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071716/67542876-6ab1-4aec-8d81-329c3de973ae.png)

# SSHを22じゃなくて別のポート番号に設定する
WebサーバをいじるのにやっぱSSH使用したいけど、セキュリティ的に少し不安なので、SSH接続するポート番号を変更したいと思います。
まず、sshのデフォルトである22を拒否設定にします。
```
sudo ufw deny 22
```
次に、テキトーなポート番号を22の代わりに設定します。
```
sudo nano /etc/ssh/sshd_config
```
ここに
```
Port 49222
```
を追加で記述します。
そうしたら、このポート番号を許可します。
```
sudo ufw allow 49222/tcp
```
sshをリスタートします。
```
sudo systemctl restart ssh
```
ここまで設定したら、実際に外部のPCからssh接続をします。
22だとポート番号を打たなくても接続できますが、変更した場合そのポート番号も打つ必要があります。
```
ssh -p 49222 yourusername@192.168.0.20
```

# 何度もSSH試行した輩を爆破する設定をする
ここまでしたら大丈夫かと思いますが、ブルートフォース攻撃を防ぐため、何回のSSH攻撃を試行したIPアドレスに対して破壊するソフトをインストールします。
```
sudo apt install fail2ban
```
これは入れとくだけで、あとは放置してOK







今日はここまで！ねむい！寝る！
[Unix・Linux] tarのアーカイブファイルを作り、（現在のサーバに一時的にも保存せず）別のサーバにSSH経由で直接保存

方法自体は別の記事にあったものを参考にしただけですが、経緯まで書いておくと役に立つかもと思い書いておきます。

# 経緯

私はWebサーバやその他もろもろのオンラインツールを使うため、VPSを借りているのだが、それを1つ閉鎖することにした[^1]。その際、バックアップとしてディレクトリのアーカイブを一括で取りたかったのだが、以下の条件があった。

-   ファイルの権限などを保持したかったため、tarでアーカイブしたかった
-   しかしそのサーバに空き容量が少なく、tarのアーカイブファイルを一時的に保存しておくのは不可能だった
    -   VPSなのでストレージの容量を上げることはできるにはできるのだが、もちろん費用がかかるので、そこまでして実現したくはなかった

# 実現方法

以上のことから、tarのアーカイブファイルを直接別のサーバ[^2]に保存できる方法がないか調べていたら、以下のような記事が見つかった。

-   [tarコマンドでリモートホストにデータを保存する方法 - とあるエンジニアの技術記録](https://blog.goo.ne.jp/derstoss/e/c2c2490a2bfa288aa3aac42fd9a7ff1a)
-   [イマドキなtarコマンドの基本と、SSHを介した便利な使い方](https://zenn.dev/shuh/articles/tar-command-use)

これらの記事で取っていた方法は以下のものであった。

-   アーカイブしたい内容のあるサーバ側でtarをするのだが、その結果をファイルに直接書かず標準出力に出す（`tar -cvjf - ディレクトリ`）
    -   tarコマンドにおいては、「f」オプションの直後には保存するファイル名を書くのだが、これを「-」とすると標準出力になる
-   その出力をリダイレクトでsshに投げる

コマンドで書くとこんな具合（圧縮形式がbzip2の場合で書いています）。**アーカイブを取りたい内容が含まれているサーバで**

```sh
tar -cvjf - SOURCE_DIR | ssh -i KEY_FILE USER@TARGET_SERVER 'cat > /path/to/archive.tbz'
```

とする。SOURCE_DIRがアーカイブを取りたいディレクトリ、KEY_FILEが保存先のサーバのSSH接続の鍵ファイル、USERが保存先のサーバのユーザ名、TARGET_SERVERが保存先のサーバ、/path/to/archive.tbz が保存先のサーバにおけるアーカイブのファイル名である。

# 補足

私の環境での実際の実行においては、最初のtarコマンドにsudoを付け、管理者権限で実行していた。これは保存したいディレクトリにおいて、ファイルのオーナーが入り混じっているためであった。（例えば、ApacheやnginxなどのWebサーバソフトは、それ専用のアカウントで動くので、それらにより作られたファイルもまとめてアーカイブしたかった。）

[^1]: 経緯としては、VPSのOSの変更をしたかったのだが、そうすると移行が完了するまでサーバの機能が止まってしまうため、「新しいVPSを1つ借りる」→「移行が完了したら古いVPSを止める」という手順で移行したのであった。
[^2]: なお、アーカイブファイルを保存した先は前記の移行先のVPSだったのだが、移行先のVPSへの環境移行自体は別途rsyncでファイルをコピーしていた。アーカイブファイルは自分のパソコンに保存するためである。<br>自分のパソコンに直接tarファイルを移行できれば一番よかったのだが、（自分のパソコンが外部からSSH接続できるのでない限り）「アーカイブを取りたいサーバ側でsudoする」という条件で自分のパソコンにアーカイブファイルを直接保存できる方法が見つけられなかった。
[個人開発 2月号] アプリ100個作るまで！#5

 ## はじめに
こんにちは、たくまです。もう2月になりましたね。今月も個人開発したので、その内容をお届けできたら、思います。というか、もう4月ですね。。。。

## ある日、ライブ配信アプリ開発してみたいと思った

なんとなく、日々使っているYoutubeやTwitchって、どのように作られているのか疑問に思いました。そこで、自分で調査してみました。知識にをつけるために参照したリファレンスです。

- [DeNAの動画配信サービスを支えるインフラの内部 #denatechcon](https://www.slideshare.net/slideshow/dena-denatechcon-72603132/72603132)
- [動画配信サービスを支える基盤の内部](https://speakerdeck.com/mirrativ/go-tech-talk)
- [ライブ配信アプリにおける柔軟な配信インフラの選定 | BLOG - DeNA Engineering](https://engineering.dena.com/blog/2024/09/multiple-broadcast-infra/)
- [動画配信技術に入門する - Qiita](https://qiita.com/khayama/items/fe10e2068b53584cfbd6)


こちらの記事を拝見して思ったことは、ライブ配信の高負荷部分（エッジ側）は、低コストで国内に強いIDCFクラウドや、パフォーマンスに優れるOCI、もしくはAkamaiなどを導入しているパターンが多いこと。一方、バックエンドのAPI、認証、データ分析部分はAWSやGCPで運用するなど、各クラウドの強みを活かしたハイブリッド構成がスタンダードなやり方だなと感じました。

## 開発する上の不安点（課題・懸念事項）

- **コメント処理の仕組み**
    - ライブ配信中のコメントをリアルタイムにさばく仕組みについての理解不足。
    - キューイングシステムや分散チャットサーバー（例：WebSocket＋メッセージブローカー）の導入検討が必要。
- **高速並列処理の仕組み**
    - ライブ配信機能を高速で並列処理する仕組みにより、処理を深く分散してCPU使用率を下げる可能性があるが、その実現方法や設計に関する理解不足。
- **開発経験の不足**
    - ライブ配信アプリの開発経験者がいないため、企画段階から運用まで全体像が不透明。
    - 開発や運用のベストプラクティスの不足が懸念される。
- **サーバー負荷の不透明性**
    - リアルタイム配信機能における視聴者数の増加に伴い、サーバーがどの程度負荷を受けるのかが不明確。
    - ライブ配信負荷テストで、どの程度の同時視聴者数や配信数に対応可能か、また、限界値をどのように把握するかが課題。
- **トラフィックとコストの問題**
    - 知人の話では、ユーザー数が増加すると1秒あたり5GBの転送トラフィックが発生する可能性があり、AWSやGCPはライブ配信画面側の高負荷処理には向かないという意見がある。
    - 既存のバックエンド（ユーザー認証、データ分析、管理部分など）はAWSやGCPで運用し、ライブ配信部分の高負荷な処理をOCI、IDCFクラウド、またはAkamaiに寄せるハイブリッド構成も検討すべきだが、現状は検証が不十分。
- **負荷テスト・オートスケーリングの不安**
    - ライブ配信負荷テストにより、どの程度の負荷までカバーできるか不明。
    - ロングランテストで「このサーバーなら、ここまでが限界」というデータを取得し、運用時にオートスケーリングで対応できるかが懸念材料。
- **インフラのランニングコスト**
    - 将来的にかかるインフラサーバー代のみのランニングコスト試算（OCIでの試算結果）が、負荷シナリオによってかなりの金額となる。


## 考慮すべき技術・運用上のポイント

- **コメント処理**
    - リアルタイムで大量のコメントを処理するために、キューイングシステムや分散チャットサーバー（WebSocket＋メッセージブローカー）の導入を検討する。
- **高速並列処理エンジン**
    - ワーカープールやタスクスケジューラーを実装し、タスクの細分化・並列化により各ノードのCPU負荷を分散・低減する設計を検討する。
- **負荷テストとオートスケーリング**
    - 配信サーバーやAPIサーバーの限界を把握するため、リアルタイムテスト、ロングランテストを実施する。
    - オートスケーリング機能を取り入れ、アクセス急増時にも自動でリソースを追加できる仕組みの検証が必要。
- **ハイブリッドインフラ戦略**
    - ライブ配信の高負荷部分（エッジ側）は、低コストで国内に強いIDCFクラウドや、パフォーマンスに優れるOCI、もしくはAkamaiなどを検討する。
    - 一方、バックエンドのAPI、認証、データ分析部分はAWSやGCPで運用するなど、各クラウドの強みを活かしたハイブリッド構成を模索する。
- **コスト試算の継続的な見直し**
    - ライブ配信の品質（720p～4K）や同時配信数に応じたインフラコストは大きく変動するため、実際の利用状況に基づいた継続的な試算・最適化が不可欠。


## 超簡易的にライブ配信アプリを開発してみた件
技術スタックは、React, TS, MUI, Viteで開発しました。やばいUIですが、すみません。フロントエンドのみ開発しました。アクターは、配信者と視聴者です。
こちらGitHubのURLです。https://github.com/takuma123-type/live-app

| ![Image1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1788291/5ca44437-5aab-3ea8-7d7a-e6c69a456895.png) | ![Image2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1788291/38b3f4ea-375a-2ca0-691c-59e6707a51b9.png) |
|---|---|
| ホーム画面 | ライブ配信前画面 |


以上！
C#で三菱PLCと通信する方法（第2弾）McpXの通信設定

## はじめに

前回の記事では、三菱電機製PLC（MELSEC）と通信する最短コードを紹介しました。

> 🔗 [第1弾はこちら](https://qiita.com/YudaiKitamura/items/f8010ae96134701d46c1)

今回は、**通信設定**について紹介します。

## 使用ライブラリ
- [McpX](https://yudaikitamura.github.io/McpX/)

## McpXの通信設定
以下は、McpXクラスのコンストラクタのパラメータです。
各パラメータは、PLCの設定内容に合わせて適切に指定する必要があります。
```csharp
McpX(
    string ip,
    int port,
    string? password = null,
    bool isAscii = false,
    bool isUdp = false,
    RequestFrame requestFrame = RequestFrame.E3
)
```

### パラメータの説明
|パラメータ|型|デフォルト|説明|
|-|-|-|-|
|ip|string|-|PLCのIPアドレスを指定します。|
|port|int|-|PLCのポートを指定します。|
|password|string|null|リモートパスワードを設定している場合に限り、パスワードを指定します。|
|isAscii|bool|false<br/>(バイナリ)|ASCIIコードによる交信を行う場合に`true`を指定します。|
|isUdp|bool|false<br/>(TCP)|UDPによる交信を行う場合に`true`を指定します。|
|requestFrame|RequestFrame|RequestFrame.E3<br/>(3Eフレーム)|フレーム（電文フォーマット）の種類を指定します。|

:::note warn
`ip`、`port`は、必須項目です。
`ip`、`port`のみを指定した場合のデフォルト設定は、下記になります。
- バイナリ交信
- TCP
- 3Eフレーム
:::

### バイナリとASCIIどっちを選択するべきか？
**結論から申し上げると、バイナリになります。**
バイナリは、ASCIIに比べてパケットサイズが約半分で済むため、高速に通信できます。
また、McpXの内部処理は、バイナリベースで実装しており、内部処理でバイナリ、ASCIIを相互変換しています。
このため、ASCII通信はバイナリ通信に比べて変換処理が多く、通信速度・処理速度の両面でやや劣る傾向があります。

ただし、既存のPLCでパラメータ変更ができない場合や、上記の点を理解したうえでASCIIを選ぶのであれば、使用しても問題ありません。

### TCPとUDPどっちを選択するべきか？
速度だけの観点で言うとUDPです。
TCPには、UDPにはない信頼性を確保するための処理が含まれているため、UDPと比べてどうしても通信速度は低下します。
しかし、UDPでは通信の特性上、信頼性が担保されないので使い分けて使用するのがいいと思います。
例えば、**データの書き込みなど信頼性が求められる処理にはTCP**を、**周期的にデータを読み取るような処理にはUDP**を使うなど、用途に応じて使い分けることで、信頼性とパフォーマンスの両立が可能です。

### 3Eフレームと4Eフレームどっちを選択するべきか？
使用するPLCが対応している電文フォーマットを選択してください。
近年のPLC（iQ-R）などは、どちらのフォーマットにも対応していますが、
少し前のQ**UDEなどのCPU内蔵Ethernetポートを持つPLCでは、3Eフレームのみに対応している場合があります。

:::note info
4Eフレームは3Eフレームにシリアル番号を追加した拡張フレームです。
要求電文にシリアル番号を付加することで、複数送信した場合などに応答電文の識別ができます。
:::

### インスタンスの生成
McpXクラスは IDisposable インターフェースを実装しており、`using`句を使うことで、インスタンスが不要になったタイミングで自動的にPLCとの接続を切断し、リソースを解放します。その為、`using`句を使ったインスタンスの生成を推奨します。

#### 推奨
```csharp
using (var mcpx = new McpX("192.168.12.88", 10000)){
   ...
}
```

#### 非推奨
```csharp
var mcpx = new McpX("192.168.12.88", 10000);
   ...
mcpx.Dispose()
```

## まとめ
今回は、三菱PLCと通信する際に必要な McpXの基本設定について紹介しました。

- `ip`や`port`は必須、その他の通信方式（ASCII/バイナリ、TCP/UDP、3E/4E）は用途やPLCの仕様に応じて選択する
- デフォルトは「バイナリ + TCP + 3Eフレーム」が基本構成
- McpXのインスタンスの生成は、`using`句を使うことで、確実に接続を閉じることができる

次回は、McpXが対応している各種コマンドとその使い方を具体的なサンプルコードとともに紹介していきます！

## 参考リンク
- [McpX ドキュメント](https://yudaikitamura.github.io/McpX/)
- [McpX GitHubリポジトリ](https://github.com/YudaiKitamura/McpX)
- [McpX NuGet](https://www.nuget.org/packages/McpX/)

---
💡 気になった方はぜひ[GitHubのリポジトリ](https://github.com/YudaiKitamura/McpX)をチェックしてみてください。  
よければ ⭐スター もよろしくお願いします！
少しだけDatabricksを触ったあとの感想

# イントロ

約1年前にトライアルでSnowflakeを使ってみて、結局導入しなかったけど、今回は似たような（個人感想）プラットフォームDatabricksも体験したくて、ちょうど無料トライアルがあるので、少し（1時間弱）触ってみました。

# 機能

## コンピュート

Snowflakeと同じくマシンを起動して処理を行います。マシンがないと、ノートブックはもちろん、普通にデータサンプルの確認もできないです。

![Screenshot from 2025-04-19 23-52-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/8a1b09c0-92a0-4315-a3ef-b85df062fc05.png)


## ノートブック

データ処理に特化したノートブックで、補完やAIアシストもあって、普段Colabを使っているなら、すぐ慣れる感じです。

![Screenshot from 2025-04-19 23-52-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/fda4faf5-2ba9-4f2b-ae5a-8e4d624b0752.png)

## クエリの詳細

細かい性能の情報も一覧で確認できます。高速な検証や本番のコスト調査などにおいて非常に助かると思います。

![Screenshot from 2025-04-19 23-52-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/e8de1f12-247d-4b3d-9917-416b1834b069.png)

## ダッシュボード

ダッシュボード機能もあって、ある程度データの確認がDatabricks上で完結できます。もちろんTableauのような高度な機能がないはずです。

![Screenshot from 2025-04-19 23-56-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/f5df95ea-1c9c-44af-8ad4-affeb07a5338.png)

## ワークフロー

ノートブックをそのままワークフローに入れたり、いろいろタスクが追加できるので、構築が楽な感じです。

![Screenshot from 2025-04-19 23-54-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/f6514d55-5373-42b8-97a2-0af49b4c0416.png)

## AIチャット

どのプラットフォームも力を入れているAIチャットです。すでにSQL慣れている利用者だと、おそらく直接SQLを打ってクエリした方が早いけど、SQLを考える時間をかかりたくない場合は良いかもしれません。

![Screenshot from 2025-04-19 23-56-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/60178925-d7dd-42ed-a10e-1bdc3708c304.png)


# 感想

UI・操作の部分は、Snowflakeと似ている部分が多いけど、Databricksは複雑なデータ確認・探索・操作がより簡単にできると感じています。一時期全部の作業もひとつのクラウドで完結したいという考え方もあったけど、タスク種類の増加によって、ある領域に特化したプラットフォームの需要も増えていくかと思っています。
【書評】エンジニアが学ぶ会計システムの「知識」と「技術」

## 読んだ本

https://www.shoeisha.co.jp/book/detail/9784798162942

## 感想

会計系のシステム開発に携わることになりそうだったので読んでみた。システム開発は行ってきたが、このジャンルは初めてで、会計については簿記の知識が少しだけある程度だった。

本書では会計の基本的な知識の部分からおさらいしてくれるので、知識がなくても問題ない構成になっていて助かった。PL、BSなど財務諸表から、各項目についての説明が続く。

その後、具体的な会計システム開発について、どういった点を作る必要があるか、考慮する必要があるか丁寧に記載されている印象だ。人によっては（自分にとっても）今はToo Muchなくらい。基幹システムが存在し、各システムで仕訳データの連携をするなど、ざっくりとしたイメージしかできていなかったシステム群の解像度が上がった。

最後に、プロジェクトの進め方（パッケージ導入するか、スクラッチ開発するのかのトレードオフなど）、保守運用、技術トレンドなど、システム開発に関連したトピックまでカバーされていてとても良かった。

## おすすめの人

- 会計システムを開発する予定の人

## 次に読むなら

- 開発について知りたい場合、具体的な言語や使うフレームワークについて深める等になるだろうか。大規模なEPR系システムでのスタンダードな構成などがまとまった本があるなら読みたい

## 知らなかった言葉

- BPMS: 「Business Process Management System」業務プロセスをデジタル化して可視化し改善するためのシステム
- スチュワードシップ: PMBOKの用語で、スチュワード=執事。リーダーシップとは違う形でチームに貢献する
- タクソノミ: 財務諸表の科目を定義するひな形のデータファイル
よく使うdbtコマンドまとめ

## 初めに
最近、dbtを使用することがよくあるのでよく使うコマンドを備忘録としてまとめました。

## dbtとは
dbt（data build tool） は、データエンジニアリングにおいて SQLを使ってデータ変換（Transform）処理を管理・実行 するためのツール。
↓
簡単にいうと、SQLやモデル（テーブル）をコードとして管理できる。

## コマンド一覧
```dbt:dbtコマンド
# dbtをbuild(run + test)したい
$ dbt build
$ dbt build --select "models/----------" #特定データセットのみに絞る

# dbtの状態を確認したい
$ dbt debug

# dbtを走らせたい
$ dbt run

# dbtをテストしたい
$ dbt test

# dbtをコンパイルしたい
$ dbt compile 
```

## 最後に
最後まで閲覧いただきありがとうございました。
ご意見、ご指摘ありましたら、コメントお願いいたします。
【Unity】衝突"していない"ことを検知する

## 衝突"していない"ことを検知するメソッドはない
Unityにはコライダーの衝突を検知するものとして OnCollision と OnTrigger というメソッドがあり、それぞれ以下の３つの種類があります。

- OnCollision系


|関数|内容|
|:--|:--|
|OnCollisionEnter|他のコライダーに触れ始めたとき|
|OnCollisionStay|他のコライダーに触れている間|
|OnCollisionExit|他のコライダーに触れるのをやめたとき|

- OnTrigger系


|関数|内容|
|:--|:--|
|OnTriggerEnter|他のコライダーに触れ始めたとき|
|OnTriggerStay|他のコライダーに触れている間|
|OnTriggerExit|他のコライダーに触れるのをやめたとき|

しかしながら、「衝突した」「衝突している」ということは検知できても「衝突していない」ことを直接検知することはできません。
そこで本記事では「衝突していない」ことを検知する方法について紹介します。

## 方法① On〇〇Enter と On〇〇Exit を組み合わせる
単純でわかりやすいし、まずこれで困らないと思います。
Enterメソッドで衝突しているかどうかのフラグを立て、Exitメソッドでそのフラグを下ろすやり方です。

```C#
using UnityEngine;

public class DetectNoCollision_A() : MonoBehaviour
{

    private bool isCollisionDetected = false;  // 衝突判定用のフラグ

    private void OnTriggerEnter(Collider other)
    {
        isCollisionDetected = true;
    }

    private void OnTriggerExit(Collider other)
    {
        isCollisionDetected = false;
    }

    private void Update()
    {
        if (isCollisionDetected)
        {
            Debug.Log("衝突してるよ");
        }
        else
        {
            Debug.Log("衝突してないよ");
        }
    }
}
```

### この方法で困る場合
先ほど「まずこれで困らない」と述べましたが、じゃあどんな場面で困るのかというと

- 衝突を検知する物体が生成されたときにすでに衝突していて
- かつそれを FixedUpdate で検知する場合

です。そんな場面あるのかよというようなレアケースではありますが、実際にあったためその対策としてこの記事を書いておきます。

ここでちょっとした実験をしてみます。
半透明なキューブがあり、その中に別の緑のキューブが入っています。半透明なキューブは isTrigger を有効にしてあり、緑のキューブには Rigidbody をつけています。(落ちないように isKinematic を有効化)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816397/adfc89ad-b0d4-4810-8e75-cdc75667c504.png)

この状態で緑のキューブに先ほどの DetectNoCollision_A をアタッチし、シーンを再生します。
ただし Update は FixedUpdate に変えておきます。
すると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816397/cff9b899-f11d-48d6-92d2-e45d88bae0e2.png)

シーンを再生したあとの最初の１回だけ衝突していない判定になりました。

### なんでこんなことになる？
Unity公式のイベント関数の実行順序のページを見るとわかります。
https://docs.unity3d.com/ja/2022.3/Manual/ExecutionOrder.html

一部抜粋した物理関連の処理はこのようになっています。
つまり FixedUpdate は 衝突検知系のメソッドよりも先に実行されるため、FixedUpdate の最初の１回だけはフラグを立てる前に衝突が判定され、衝突していない扱いになってしまうのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816397/179a5b55-a472-4af3-8f04-c28d576052b7.png)

## 方法② yield WaitForFixedUpdate を使う
先ほどの図をもう一度見てもらうと、 Phisics の処理の最後に yield WaitForFixedUpdate というものがあります。
これをコルーチン内で使うと衝突判定の後まで待ってもらえます。
衝突判定が終わるまで待って、その時点で衝突したフラグが立っていなければ衝突したことにする、という方式です。

```C#
using System.Collections;
using UnityEngine;

public class DetectNoCollision_B : MonoBehaviour
{
    private bool isCollisionDetected = false;  // 衝突判定用のフラグ

    private void FixedUpdate()
    {
        StartCoroutine(CollisionDetect());
    }

    IEnumerator CollisionDetect()
    {
        isCollisionDetected = false;
        yield return new WaitForFixedUpdate();
        if (!isCollisionDetected)
        {
            Debug.Log("衝突してないよ");
        }
    }

    private void OnTriggerStay(Collider other)
    {
        isCollisionDetected = true;
        Debug.Log("衝突してるよ");
    }
}

```

これを同じ状況で実験してみると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816397/3e3df498-fe53-4dc3-a9a9-c87d6fccd446.png)

無事最初の１回から衝突している判定になりました！
【CLI】ローカルIPアドレスを取得する方法

以下のコマンドでローカルIPアドレスが取得できます。

```terminal
$ ifconfig | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}'
192.168.2.126
192.168.2.109
```

```terminal
$ ipconfig getifaddr en0
192.168.2.126
```
データ分析におけるサンプルサイズについて

## はじめに
最近統計的検定(t検定)を実施する上で、サンプルサイズについて考察する機会があったので備忘録として記載します。

## データは多いほうがいいか
データサイエンスに携わっているとデータ数が十分でないためモデルの精度が悪いという話をよく耳にします。理由として主に以下の2点かと思います。
1. 汎化性能の低下
少量のデータに過剰に適合してしまうことで、予測データに対して精度が悪い。
また、そもそもデータ数が少ないため傾向を上手く捉えられない。
極端に言うと2点しかデータがなければそれ以外の空間は想像で予測するしかないため精度が悪いが、ある程度取得できていればそれに合わせた曲線を引けるというイメージ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815993/f315c21f-7c99-45df-acca-8294b358fd80.png)
2. 未知のデータ範囲に対する予測精度が悪い
本来予測したいはずの未知のデータのパターンが学習データにないため予測の精度が悪くなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815993/7f44d7fc-166f-4c7e-8027-cbb8f0e6e2d4.png)

これらのことから短絡的にデータは多いに越したことはないと考えていました。もちろんマシンスペックによる学習時間の増加などの問題はありますが、分析の精度としては多いほうがいいという意味です。
しかし、$EDA$や特徴量エンジニアリングをしていく中では、サンプルサイズが大きすぎると問題があります。

## 統計的検定におけるデータ量(サンプルサイズ)の影響
上記は主に機械学習におけるモデル学習時のデータ量についてでしたが、統計的な有意差を見たい場合にはデータ量(サンプルサイズ)が大きすぎると有意な結果になりやすい傾向となります。例として$EDA$(探索的データ分析)において変数間の傾向を統計的に比較したい場合を想定します。
母集団の分散が未知のデータの場合の$t$検定量は以下となります。
```math
t = \frac{\bar{x}_1 - \bar{x}_2}{\sqrt{\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}}}
```
$2$群の差が大きい場合は$t$検定量が大きくなり、$p$値が有意水準$α$より小さい場合は有意な差があるといえるかと思います。ここでサンプルサイズ($n_1$,$n_2$)が大きい場合どうなるかというと、見てわかる通り分母が小さくなるので$t$検定量が大きくなります。
これは中心極限定理により分母にくる標本分散が$\frac{s_1^2}{n_1}$となるためです。
イメージでいうと、データ数が少ない場合は標本平均のばらつきは大きい(信頼できない)が、データ数が多いと大数の法則により標本平均が母集団の平均と一致するためです。
サンプルサイズさえ大きくしてしまえば、有意な結果である(=差がある)と意図的に言えてしまう恐れがあります。

## 本来行うべきこと
本来統計的にデータの差を検定する場合は、サンプルサイズから設計することが必要です。
その際、以下の4つを事前に設定することで客観的な判断が可能になります。
* 有意水準
* 検出力
* 効果量
* サンプルサイズ
こちらの説明は割愛しますが、データ量が多ければいいという認識は注意が必要です。
私はこの統計的な手法の考え方と、機械学習のモデル精度向上の考えが混同していました。
今後は分析や論文調査の際には注意して見ていこうと思います。

https://www.itmedia.co.jp/news/articles/1903/26/news112.html
clip-pathを調べてみた

# はじめに
html要素を変形するのに「border」「border-radius」「mask-image」を使ってみましたが、「clip-path」について検証してみました。

# clip-path
簡単なサンプルを用意します。
```css
.circle{
  width: 200px;
  height: 200px;
  margin: 20px;
  padding: 10px;
  background: #0f0;
  border: 5px solid #f00;
  clip-path: circle(120px at 50% 50%);
  cursor: pointer;
}
```
すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/092c9eb7-bbbd-4966-b4e6-9e962616ee61.png)
のようになります。

### 描画領域
開発者ツールで確認すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/14dff6e5-c4fb-4832-a4e1-ba49c731acee.png)
となります。

:::note info
描画できる領域は「margin」の内側
:::

### クリック領域
マウスカーソルを当ててみると
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/a1971e34-6384-4037-a102-47af977f71fc.png" width=40%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/1eb40140-4e3f-4ae4-8b98-5c5a00622c8e.png" width=40%>
となります。

:::note info
クリックできる領域は「clip-path」の内側
:::

### 形の制限

https://developer.mozilla.org/ja/docs/Web/CSS/clip-path

形については「path」が使えるので、どんな形でも書けます。多分…

#### ２つの領域に分ける（分かれたように見える）サンプル
```css:
.bos2{
  width: 300px;
  height: 100px;
  margin: 10px;
  padding: 5px;
  background: linear-gradient(to right, #0f0 0, #0f0 150px, #00f 150px, #00f);
  clip-path: polygon(0 0, 0 100px, 100px 100px, 100px 0, 200px 0, 200px 100px, 300px 100px, 300px 0);
}
```
このようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/5049d7b4-f8b5-4e15-a39b-5e35668b6cf5.png)

開発者ツールで見るとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/e8996665-8ad1-49cf-a265-3c3558d4a786.png)

以下のように座標を指定していて、④と⑧のy座標が同じなので④の部分が見えなくなり分かれているように見えています。
色はグラデーションを使ってそれっぽくしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/7fff92e6-8b83-47eb-ba7f-23126288868d.png)


# おわりに
「clip-path」はアニメーションも使えるようです。

https://qiita.com/masayasu_t/items/c36f0d9a0532343fb672

未完成のアニメーション「ホイール」が出来るかもしれません。
自作のSwiftPMのパッケージのリポジトリに、それを使ったサンプルプロジェクトを内包する方法

# 手順

- 自作のSwiftPMのパッケージのリポジトリに、それを使ったサンプルのプロジェクトを内包したい
- まずサンプルプロジェクトを作成して下記の通りパッケージのディレクトリ配下に配置します

![](https://i.imgur.com/ob992Kh.jpeg)

- `Add Local`から公開したいパッケージのディレクトリを選択します

![](https://i.imgur.com/zRg6Luj.jpeg)

- これで下記のようにサンプルリポジトリで動きをみながら、パッケージの中身を直接編集できるようになります
- 注意点としては、パッケージ自身をXcodeの別Windowで開いているとダメなので閉じることです
- またたまにキャッシュ周りでビルドエラーになることがある印象です
- やはり基本はパッケージを開いて編集し、区切りの良いところで動作確認のためにサンプルプロジェクトを開いて、そこでSwiftPMのコードを微調整…とやると今のところいいのかなと思っています


![](https://i.imgur.com/DjvvaKy.jpeg)
GAS でアプリを作る【面接評価シート】

![面接評価シート_サンプル_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364477/8377c0a1-37f3-4511-9642-2932a38be195.gif)

# はじめに
GAS（Google Apps Script）、スプレッドシート、フォームを活用して面接評価を管理するアプリを開発してみました。
<font color="#FF6666">スプレッドシートとフォームを GAS でどこまで自動処理できるのか</font>、の勉強も兼ねています。

主な活用物は以下です。

- Google Apps Script（基盤機能）
- Google スプレッドシート（管理ファイル、データベースの役割）
- Google フォーム（評価回答、GAS で自動生成される） 

今後の興味と意欲次第ですが、GAS の HTML で WEB アプリケーション化したり、AppSheet を活用したアプリ化も検討しています。

ご興味を持っていただけた方々の参考になれば幸いです。

![面接評価シート_サンプル_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364477/7448bec4-d954-44ed-b87b-9440aa5304e4.png)

![面接評価シート_サンプル_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364477/ccff1c7b-4c31-4ecb-95da-d363e11c6c62.png)

![面接評価シート_サンプル_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364477/2c401c86-5c8e-43e6-872e-c25dd68012da.png)

# 開発の背景
数年前とある企業に所属しているときに面接官を担当することがありました。
面接の際にまさかの紙で評価内容を記入するという場面に直面し、それは時代遅れでしょ...と痛感しました。
幸いにも Google Workspace を業務ツールとして利用していたので、有効活用しようと思い立ち今回のアプリの開発に乗り出しました。

# 開発の前提
本アプリケーションは以下の機能を土台に開発しています。
ぜひ GAS を活用したアプリ開発の参考にしていただけると嬉しいです。

[Qiita - GAS でスプレッドシートを Database ライクに操作する](https://qiita.com/BruceWeyne/items/54cffecf338cc278523c)

# 開発物と基本機能
今回のアプリケーションは Google スプレッドシートを中心に機能します。
スプレッドシートに紐づけられた GAS プロジェクトがあり、それが基盤として機能しています。
主な機能は以下の通りです。

- スプシ内のシートで設定した面接評価項目を元に Google フォームを自動生成する
- 生成された Google フォームで回答された面接評価データを専用の DB シートに格納する
- 面接評価データの集計結果をスプシ内で動的に出力する（スプシのセルを自動編集する）

### ■ 参考動画

[面接・採用評価を Google で管理](https://youtu.be/3WcgcAoWFlo)

<iframe width="560" height="315" src="https://www.youtube.com/embed/3WcgcAoWFlo?si=-jw7vnv4YaCV4dfO" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


### ■ 開発物
開発物はこちらです。
コピーしてご自身の Google ドライブに格納してご利用ください。
基本操作のマニュアルも作成してあるので、面接評価シートそのものとしても利用できます

[GoogleDrive : 一般公開 - 面接評価シート](https://drive.google.com/drive/folders/1Epvlh773koqFO2l-B_iQgynuFmAHFZ-u?usp=drive_link)

# ソースコード
GitHub でもソースコードを公開しています。
ご興味があれば活用してください。

[GitHub : gas-evaluation-sheet](https://github.com/BruceWeyne/gas-evaluation-sheet/tree/main/individual-product/tool-kit)

# おわりに
GAS の気軽に開発できる面白さや拡張性のしやすさに日々衝撃を受けています。
さすが Google さんですね。
これからも思いついた業務効率化アプリを開発してみたいと思います。

何かあればコメントいただけると嬉しいです。
最後まで閲覧していただきありがとうございました。
ABC402をPythonで（A～D）

東京海上日動プログラミングコンテスト2025（AtCoder Beginner Contest 402）の解答等の速報的まとめ

https://atcoder.jp/contests/abc402



# A問題
https://atcoder.jp/contests/abc400/tasks/abc402_a

大文字のものを選ぶだけ
```python:A
s = input()
ans = list()

for s_i in s:
    if s_i.isupper():
        ans.append(s_i)

print(*ans, sep="")
```

# B問題
https://atcoder.jp/contests/abc400/tasks/abc402_b

dequeを使う
```python:B
from collections import deque

q = deque()

for _ in range(int(input())):
    com = list(map(int, input().split()))
    if com[0] == 1:
        q.append(com[1])
    else:
        q_i = q.popleft()
        print(q_i)
```

# C問題
https://atcoder.jp/contests/abc400/tasks/abc402_c

$i$回目にそのメニュー内の食べ物がいくつダメかわかるようにして、それが０になったとき食べられるカウントを増やす
```python:C
n, m = map(int, input().split())
menu = list()
ng_food = list()
food_list = [list() for _ in range(n + 1)]
ans = 0
for i in range(m):
    k, *arg = list(map(int, input().split()))
    menu.append(arg)
    ng_food.append(k)
    for a_i in arg:
        food_list[a_i].append(i)

for b_i in map(int, input().split()):
    for f_i in food_list[b_i]:
        ng_food[f_i] -= 1
        if ng_food[f_i] == 0:
            ans += 1
    print(ans)
```

# D問題
https://atcoder.jp/contests/abc400/tasks/abc402_d

交差しないものを数える
交差しない＝傾きが等しい　なので基準となる傾きを点1を通るものにして
それらがいくつあるか求める
```python:D
def calc(a, b):
    while True:
        if a < b and (a == 1 or (a, b) == (2, n)):
            break
        elif a > b:
            a, b = b, a
        else:
            diff = min(a - 1, n - b)
            if diff == 0: # b == n
                a, b = 1, a - 1
            else:
                a -= diff
                b += diff

    return a, b


n, m = map(int, input().split())
points = [list(map(int, input().split())) for _ in range(m)]

d = dict()
ans = m * (m - 1) // 2
for a_i, b_i in points:
    x, y = calc(a_i, b_i)
    if (x, y) not in d:
        d[(x, y)] = 0
    ans -= d[(x, y)]
    d[(x, y)] += 1

print(ans)
```
HTMLのテーブルとフォーム

## 【HTML学習メモ】フォームとテーブルの基本を学んだ

こんにちは！エンジニアを目指して学習中の〇〇です。
日々の学習内容をアウトプットとして記録するために、Qiitaに投稿しています。

今回は、HTMLの基本的な要素である**フォーム**と**テーブル**について学習しました。Webページを作る上で欠かせない要素なので、しっかり理解しておきたいです。

### テーブル：表形式でデータを表示する

テーブル（`<table>`タグ）は、その名の通り、**データを表形式で表示したいとき**に使います。スプレッドシートのような見た目をHTMLで表現するイメージですね。

**基本的な構成要素**

*   `<table>`: 表全体を囲むタグです。
*   `<tr>` (Table Row): 表の**行**を定義します。この中にセルを入れていきます。
*   `<th>` (Table Header Cell): **見出し**となるセルです。通常、太字・中央揃えで表示されます。`<tr>`タグの中に配置します。
*   `<td>` (Table Data Cell): **データ**が入るセルです。`<tr>`タグの中に配置します。

**テーブルの構造を明確にする要素**

表の内容をヘッダー、ボディ、フッターに分けることで、構造がより分かりやすくなります。これはWebページのヘッダー・フッターと同じ考え方で、テーブル専用のものです。

*   `<thead>`: 表のヘッダー部分（見出し行など）をグループ化します。
*   `<tbody>`: 表の本体部分（データ行）をグループ化します。
*   `<tfoot>`: 表のフッター部分（合計行など）をグループ化します。

これらのタグを使うことで、ブラウザや支援技術が表の構造を理解しやすくなるメリットもあります。

**セルの結合**

*   `colspan`属性: セルを**横方向（列）に結合**します。`<th>`や`<td>`タグに指定し、結合したいセル数を値として設定します（例: `colspan="2"` で2列分のセルを結合）。
*   `rowspan`属性: セルを**縦方向（行）に結合**します。`<th>`や`<td>`タグに指定し、結合したいセル数を値として設定します（例: `rowspan="3"` で3行分のセルを結合）。

これらを使うことで、より複雑なレイアウトの表を作成できます。

### フォーム：ユーザーからの入力を受け取る

フォーム（`<form>`タグ）は、**ユーザーからの情報を受け取るための仕組み**です。ログイン、会員登録、アンケート、問い合わせなど、Webサイトで私たちが日常的に操作している多くの機能で使われていますね。

今までユーザーとして何気なく使っていたログイン画面やアンケートが、`input`要素などで作られているんだと理解できました。**普段使っているものが、どのような技術で成り立っているのかを知ると、より深く、そして早く理解できる**気がします。自分の体験と結びつくのは面白いですね！

**主要なフォーム関連要素**

*   `<form>`: フォーム全体を囲むタグ。どこにデータを送信するか（`action`属性）、どうやって送信するか（`method`属性）などを指定します。
*   `<input>`: **最もよく使う入力要素**です。`type`属性を変えることで、様々な形式の入力欄を作成できます。
    *   `type="text"`: 1行のテキスト入力。
    *   `type="email"`: メールアドレス形式の入力。
    *   `type="password"`: パスワード入力（入力内容が隠される）。
    *   `type="radio"`: ラジオボタン（複数の選択肢から1つだけ選ぶ）。同じグループのラジオボタンには同じ`name`属性を指定します。
    *   `type="checkbox"`: チェックボックス（複数の選択肢から複数選択可能、またはON/OFF）。
    *   他にも`number`, `date`, `file`など多数あります。
*   `<label>`: **入力欄（`<input>`など）の説明**を付けるための要素です。`for`属性を使って、対応する入力欄の`id`属性と紐付けるのが基本です。これがないと、どの入力欄が何を入力するためのものか分からなくなってしまいます。ユーザビリティとアクセシビリティの観点からも重要です。
*   `<select>` と `<option>`: ドロップダウンリストを作成します。`<select>`でリスト全体を囲み、`<option>`で各選択肢を定義します。
*   `<textarea>`: 複数行のテキスト入力欄を作成します。
*   `<button>`: クリック可能なボタンを作成します。フォームの送信（`type="submit"`）やリセット（`type="reset"`）、汎用的なボタン（`type="button"`）として使えます。

**入力の補助機能**

*   `required`属性: `<input>`などの要素にこの属性を追加すると、**入力必須**の項目になります。未入力のままフォームを送信しようとすると、ブラウザが警告を表示して入力を促してくれます。簡単な入力チェックとして便利です。

### まとめ

今回はHTMLのテーブルとフォームについて学びました。

*   **テーブル**はデータを整理して表示するためのもの。`<tr>`, `<th>`, `<td>`が基本で、`<thead>`, `<tbody>`, `<tfoot>`で構造化し、`colspan`, `rowspan`でセルを結合できる。
*   **フォーム**はユーザー入力を受け取るためのもの。`<form>`タグで囲み、`<input>`（様々な`type`がある）、`<label>`, `<select>`, `<textarea>`, `<button>`などを組み合わせて作成する。`required`属性で入力必須チェックも可能。

普段Webサイトを使う側として触れていた機能が、どのようなHTML要素で作られているかを知ることで、より学習が楽しくなりました。まだまだ学ぶことは多いですが、一つ一つ着実に身につけていきたいと思います。
AtCoderをPythonで取り組んだ振り返り(ABC402 A,B)

どうもこんにちは！

今週もAtCoderのコンテストには参加しましたので記録します。
今回はBまで完答して終了しました。

問題

問題は以下のリンクから。取り組んだA,Bを振り返ります。

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

# A - CBC -
指定された文字列から、大文字だけを抜き取って並べた文字列を出力する問題。1文字ずつ大文字かどうかを判定するisupper()関数で判定し、大文字だけを出力するとしました。最初の入力の受け取りを配列にしましたが、文字列として受け取っていても問題なかったと思います。
~~~Python
s = list(input())
ans = []

for i in s:
    if i.isupper() == True:
        ans.append(i)
print("".join(ans))
~~~

# B - Restaurant Queue -
入力として与えられたクエリを処理した結果を出力する問題。クエリは2種類で、入力とした与えられた番号Xを待ち行列に追加することと、待ち行列の先頭の番号を出力して削除するというもの。
1行1クエリで与えられるので、1行読んで先頭の番号が1ならもう1つの入力の番号を待ち行列の追加、2なら待ち行列の先頭を出力するとしました。
~~~Python
n = int(input())
queue = []
for _ in range(n):
    tmp = input().split()
    if len(tmp) == 2:
        queue.append(tmp[1])
    else:
        print(queue.pop(0))
~~~

# おわりに
明日(4/20)は情報技術者試験の試験日ですね。受験する方はがんばりましょう！

ではでは。
[🔰] [備忘録] .gitが多重で存在して孫ディレクトリがcommitできなくなった話

# ⚠️ 超初心者の備忘録です。
間違いなどあれば指摘していただけると助かりますが、きつめの言葉で指摘されると泣いちゃうので勘弁してください😢

## 問題が発生したきっかけ
iOSアプリを開発していました。先にGoでバックエンド処理部分を実装していて、その時点でリモートリポジトリとローカルリポジトリを紐づけていました。そのあとXcode上で、フロントのプロジェクトを/親/frontend/ につくったときに多分Xcodeくんが.git作っちゃったのかな？
といういきさつでタイトルの問題にぶつかりました。

## 自分の解決方法(綺麗じゃない)
結論からいいます。以下、順序。
1. frontendディレクトリの中身を別の場所に避難
1. frontendディレクトリを.gitごと削除
1. もう一回frontendディレクトリを自分で作って、避難させていた中身を戻す

これだと履歴とかが飛んじゃう可能性があるらしいです。泣けますね😥
色々調べる前にやっちゃったけど、個人開発以外でこれやったら多分怒られます。初心者のうちに知れてよかったね自分🫠

## せっかくなので綺麗な解決方法を調べてみた
自分「綺麗な方法教えろ」
ChatGPT 「*git subtree*」
なのでgit subtreeについて調べる。
Gitのドキュメント内でsubtreeについて言及してるページが見つからなかったのでGitHubのドキュメントを見ます。(https://docs.github.com/ja/get-started/using-git/about-git-subtree-merges)
とりあえず概要(上記ページより引用)

> 複数のプロジェクトを単一のリポジトリで管理する必要がある場合、*サブツリー マージ* を使ってすべての参照を扱うことができます。

なるほど確かに自分がやりたいことだな。
### 順序
1. 孫ディレクトリのプロジェクトのリモートURLを追加
```$ git remote add -f ディレクトリ名 https://github.com/ユーザー名/リポジトリ名.git```

1. ローカルのGitプロジェクトにマージ
```$ git merge -s ours --no-commit --allow-unrelated-histories リポジトリ名/ブランチ名```
1. 新しいディレクトリを作って履歴をそこにコピー
```$ git read-tree --prefix=ディレクトリ名/ -u リポジトリ名/ブランチ名```
1. 変更をコミット
```$ git commit -m "コミットメッセージ"```

これでいけるみたいです。

## おわり
大学生になってプログラミングできる時間も増えたから色々作ってみて遊んでるけど知識が足りてないなと思いました。大学附属図書館にGitの本あったから今読んでる本読了したらそれにも手を出してみようかな...🤔
【ゆるふわ解説】Azureとネットワーク総集編



# はじめに

初心者向けにAzureとネットワークをゆるくふわっと解説するシリーズです。
※分かりやすさ追求のため非IT業界の友人に確認してもらっています。

ネットワークアレルギーをなくし、
大まかに理解してもらいたいという意図で書いていきます。

![いいね＆ストックお願いします！.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248327/cad7eb65-10a4-480f-9d7b-ed53f59fbb82.png)


# ゆるふわ解説シリーズ

|Part|サブタイトルとリンク|公開日　 &thinsp; |
|:-------:|:-------|:------------|
| 1 |[【ゆるふわ解説】AzureとIPアドレス](https://qiita.com/yuyanz/items/e6762ac5b7dd42aab48a)　　|2025/03/11|
| 2 |[【ゆるふわ解説】Azureとサブネット](https://qiita.com/yuyanz/items/f9319cde3796888a7d65)|2025/04/02|
| 3 |[【ゆるふわ解説】AzureとVNetとVNet](https://qiita.com/yuyanz/items/70a4a6ab32a71ec54171)|2025/5/29|
| 4 |【ゆるふわ解説】Azureと繋がるネットワーク|coming soon|
| 5 |【ゆるふわ解説】Azureと通信ルール|coming soon|
| 6 |【ゆるふわ解説】Azureとセキュリティー|coming soon|
| 7 |【ゆるふわ解説】AzureとURL|coming soon|
| 8 |【ゆるふわ解説】～～～|coming soon|

※サブタイトルは変更となる可能性があります。

:::commentout　4  VPN
:::


質問・コメントなどありましたら、ぜひお願いいたします。
少しでもAzure・ネットワークへの苦手意識が無くなると嬉しいです。

リクエストもお待ちしております。
【Python初心者】「:（コロン）」はどこで使う？使わない？基本構文まとめ

Pythonを学び始めたとき、「:（コロン）」ってどこで使うの？と疑問に思ったので、  
自分の理解を整理する目的でまとめてみました。

この記事では、**Pythonでどんなときにコロン `:` を使うのか**を中心に、  
逆に**使わないケースや例外的な構文**についてもあわせて記載します。

## Pythonの基本構文スタイル：「:」とインデントの組み合わせ

Pythonでは、**制御構文（if文、for文、while文、関数定義、クラス定義など）では文末にコロン `:` をつけて、インデントされたブロック（処理内容）を記述する**というスタイルが基本です。

以下は基本構文のイメージです。

```python
制御構文:
    処理
```

## コロンを使う主な構文

以下は、Pythonでコロン `:` を使用する主な構文とその用途です。

**1. 条件分岐（if / elif / else）**  
条件に応じて処理を分けたいときに使います。

```python
if x > 10:
    print("10より大きい")
elif x == 10:
    print("ちょうど10")
else:
    print("10より小さい")
```

**2. ループ処理（for / while）**  
繰り返し処理を行うときに使います。

```python
for i in range(3):
    print(i)
```

```python
x = 3
while x > 0:
    print(x)
    x -= 1
```

**3. 関数定義（def）**  
何度も使いたい処理を関数としてまとめるときに使います。

```python
def greet(name):
    print("Hello, " + name)
```

**4. 例外処理（try / except / finally）**  
エラーが発生する可能性がある処理を安全に扱うために使います。

```python
try:
    value = int("abc")
except ValueError:
    print("数値に変換できません")
finally:
    print("終了処理")
```

**5. with文（コンテキストマネージャ）**  
ファイル操作などで自動的にリソースを開閉したいときに使います。

```python
with open("file.txt", "r") as f:
    data = f.read()
```

**6. クラス定義（class）**  
独自のデータ型や振る舞いを定義したいときに使います。

```python
class Dog:
    def bark(self):
        print("ワン！")
```

## インデントが必須になる理由

Pythonでは、コロン `:` のあとに**必ずインデント**をつけて、ブロックの範囲を明示します。  
このインデントがないと構文エラーになります。

**正しい例（スペース4つ）**

```python
if True:
    print("OK")
```

**間違った例（インデントなし）**

```python
if True:
print("NG")  # エラー：IndentationError
```

## コロンを使わない構文や例外的なケース

以下のようなケースでは**コロンは不要**です。  
これらは**1行で完結する文（statement）**であり、ブロックを伴わないためです。

- **変数の代入や演算**
- **関数の呼び出し**
- **return文、raise文、del文、import文など**

```python
x = 10
total = x + 5

greet("Alice")

return result
raise ValueError("不正な値です")
del x
import math
```

## 注意

Pythonの公式スタイルガイド **PEP8** では、**コロンの前にスペースを入れない**ことが推奨されています。  
これはコードの**可読性と統一性を保つため**です。

## まとめ

- **コロン `:` は制御構文や定義文の末尾で使用する**
- **インデントとセットでブロックを記述するのがPythonの基本**
- **代入・関数呼び出し・1行文ではコロンを使わない**
- **スタイルガイドでは「コロンの前にスペースなし」が推奨**

コロンとインデントのルールは**Python特有の文法スタイル**ですので、慣れるまで戸惑う部分もありますが、構文が明確になることで読みやすく書きやすいと感じました。  
**Pythonを学び始めた方や、同じようにつまずいた方の参考になれば幸いです。**
重ね順(配列)がドラッグアンドドロップで変更可能に♪

今回は小ネタです。
タイトルの通りなんですが
配置したコントロール等の重ね順（配列）について、以前はこのように一つずつチマチマとを変更するしかなかったのですが、![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/28a511a5-fc5d-4307-bfbc-da35831458c0.png)

いつのまにかツリービュー上で、コントロール等をドラッグし、移動してドロップすることで、重ね順を変えることが出来るようになっていますね！
![重ね順をドラッグアンドドロップで変更.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/4fe43260-cf10-4964-9fc0-b61384c98b11.gif)

これは地味ながら編集が捗る機能追加です。ほんとに嬉しい♪
まだ知らない人もいるかも知れないので記事にしておきます。
以上嬉しい小ネタでした！
Symbolノードの証明書を生成する


OpenSSL を使用した Symbol 証明書の生成方法（ランダムキー）の紹介です。

## 確認した環境

この記事では、以下の環境で動作確認してます。

- Ubuntu 24.04
- OpenSSL 3.0.13

## CA(認証局) 証明書

### CA 証明書秘密鍵を作る

CA 証明書の秘密鍵を作ります。
bootstrap でいうところのメインアカウントになります。

```bash
openssl genpkey \
    -algorithm ed25519 \
    -outform PEM \
    -out ca.key.pem
```

### 証明書を保存するフォルダを準備

証明書を保存するフォルダを作ります。

```bash
mkdir -p cert/new_certs
cd cert
```

この後の作業は、`cert` フォルダの中で進めていきます。

### CA 証明書を作る

`ca.cnf` という設定ファイルを作ります。
`[dn]` セクションの `CN` には認証局の名前を入れます。好きな名前を設定してください。

```conf:ca.cnf
[ca]
default_ca = CA_default

[CA_default]
new_certs_dir = ./new_certs
database = index.txt
serial = serial.dat
private_key = ../ca.key.pem
certificate = ca.crt.pem
policy = policy_catapult

[policy_catapult]
commonName = supplied

[req]
prompt = no
distinguished_name = dn
x509_extensions = x509_v3_ca

[dn]
CN = Symbol CA

[x509_v3_ca]
basicConstraints = critical,CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer

[x509_v3_node]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
```

`index.txt` という名前の空ファイルを作ります。

```bash
touch index.txt
```

証明書のシリアル番号をランダムに生成します。

```bash
openssl rand -out serial.dat -hex 19
```

以下のコマンドを使って CA 証明書を作ります。
`-days` オプションで証明書の有効期間を指定できます。

```bash
openssl req \
    -new \
    -x509 \
    -config ca.cnf \
    -keyform PEM \
    -key ../ca.key.pem \
    -days 7300 \
    -out ca.crt.pem \
    -extensions x509_v3_ca
```

## Node 証明書

bootstrap でいうところのトランスポートアカウントになります。

### Node 証明書秘密鍵を作る

Node 証明書の秘密鍵を作ります。

```bash
openssl genpkey \
    -algorithm ed25519 \
    -outform PEM \
    -out node.key.pem
```

### Node CSR を作る

#### 証明書署名要求 (Certificate Signing Request)

`node.cnf` という設定ファイルを作ります。
`[dn]` セクションの `CN` には証明書の名前を入れます。好きな名前を設定してください。

```conf:node.cnf
[req]
prompt = no
distinguished_name = dn

[dn]
CN = Symbol Node
```

以下のコマンドを使って CSR を作ります。

```bash
openssl req \
    -new \
    -config node.cnf \
    -key node.key.pem \
    -out node.csr.pem
```

### Node 証明書に署名する

Node 証明書に署名します。これで Node 証明書が生成されます。

```bash
openssl ca \
    -batch \
    -notext \
    -config ca.cnf \
    -days 375 \
    -in node.csr.pem \
    -out node.crt.pem \
    -extensions x509_v3_node
```

## CA 証明書と Node 証明書を連結

Node 証明書、CA 証明書の順で連結します。

```bash
cat node.crt.pem ca.crt.pem > node.full.crt.pem
```

## CA 証明書秘密鍵の後始末

CA 証明書秘密鍵は、ノードメインアカウントの秘密鍵でもあるので、削除または安全な場所に保管します。ノード間の通信や Node 証明書の更新では使用しません。

<!-- ## CA 証明書の公開鍵を生成

最後に、以下のコマンドを使って CA 証明書の公開鍵を取得します。

```bash
openssl pkey \
    -pubout \
    -in ${privatekeyPath} \
    -out ${publickeyPath}
```

これで、CA 証明書の公開鍵を取得する手順は完了です. -->
RareTECHというITスクールで立ち上げた「インフラ勉強会」チャンネルに、気づけば80人以上が集まっていた話

## まず、RareTECHというITスクールとは？

現在私はこちらのスクールに受講しながら、日々IT学習やチーム開発などといった勉強を継続的にしています。RareTECHでは、フロントエンド・バックエンド・インフラ・セキュリティ・生成系AIなど、非常に幅広い分野を体系的に学べるカリキュラムが用意されており、初心者から中上級者まで、あらゆる学習者にフィットする構成になっています。

https://raretech.site/

それに加えて、2ヶ月間のチーム開発や、自主的なアウトプット活動の場が豊富に提供されている点も、このスクールの大きな魅力の一つです。活発な技術共有、コードレビュー会、ハッカソンなどを通して、知識の定着と実践力の向上が図れる環境が整っています。

私自身も、こうしたアウトプットの機会をフル活用して日々成長を実感しています。

:::note warn
**このスクールの特徴をひとことで表現するならば、「学びたい人には無限にチャンスがあるドSなITスクール」。**
:::

再現性のある学習の仕組みと、そこに甘えずに突き進むことができる環境。このバランスが絶妙で、私にとっては理想的な学び場となっています。

## インフラ勉強会とは？

そんなRareTECH内で、私が個人的に立ち上げたのが「インフラ勉強会」です。***これはチャットツール内の勉強会チャンネルのひとつとして発足し、現在では80人以上の受講生が参加するほどに成長したコミュニティとなっています。***

![Screenshot 2025-04-19 at 21.22.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/48513601-6b4f-40d2-8c4c-26a695beef9c.png)

当初は、本当に数人だけでこぢんまりと始めた会でした。身近な仲間とインフラ技術について少しずつ知見を深めていこうという目的で、気軽にスタートしたのです。

:::note info
***ところがある時、「〇〇を教えてほしい...!!」というDMが複数寄せられるようになり、それならばとオープンな形式に切り替えました。***
:::

現在では月に2回の勉強会を軸に、日々の技術投稿を通じてインフラ系の話題（AWS、Linux、CI/CD、IaCなど）を共有する場として活用しています。

最近では、ポエム調のエッセイ記事のシェアなども行っており、ちょっとした癒しと技術の融合の場にもなりつつあると信じたいです...

https://note.com/hon_hon333

## 43期生の受講生のツイートがきっかけ

このチャンネルがここまで続いているのには、実は明確なきっかけがあります。それは、43期生のある受講生のツイートです。

その方は、ハッカソンで初めてインフラ担当に選ばれたものの、「何から手を付けたらよいのか分からない」と苦悩している様子をTwitterで綴っていました。

:::note warn
**※その投稿に私は心を動かされ、まるで過去の自分を見ているような気持ちになりました...。**
:::

スクール内で技術的な質問をするのは、特に初心者にとってはかなりハードルの高いこと。だからこそ、手を差し伸べられる人が必要だと強く感じ、その方に直接声をかけ、一緒にAWSの構成図を見ながら少しだけ作業をしたりしました。

その行動が、自分だけでなく他の人にも必要なのでは？と感じるようになり、現在の勉強会チャンネルへとつながっていったのです。

## 自己実現：自分の持っているITスキルで困ってる人を支えたい

私はこれまで、大学時代から約5年半にわたり社会福祉領域に携わってきました。

:::note info
***その過程で学んだのは、「困っている人に寄り添う姿勢」と「必要なときに手を差し伸べられる存在であること」の重要性です。***
:::

IT分野においてスキルを習得する中でも、私の根底にあるのは「技術を通して誰かの課題を解決したい」という価値観です。
単に自分の技術力を高めるのではなく、自身の知識を社会へ還元することを前提として学習と実践を続けています。

このような姿勢は、Linuxをはじめとしたオープンソース文化の思想──
「知識や技術は共有されるべきであり、特定の誰かではなく、コミュニティ全体の力となる」という価値観にも通じるものだと感じています。

## 最後に

目の前で技術的に困っている方がいるときに、適切な知識を持って、落ち着いて手を差し伸べられる優しいエンジニアであり続けたいと考えています。

:::note warn
***そのためにも、日々の技術習得を継続し、「**役立つ知識とは何か**」「**伝わる表現とは何か**」を常に問い直しながら、自己研鑽に努めてまいります。***
:::

このインフラ勉強会に参加されている方で、もし技術的にお困りのことがありましたら、お気軽にこっそりDMしてください。

***一緒に頭を抱えて悩み、考え、私の持っている知識の限りを尽くしてサポートさせていただきます...！！（2025/04/19）***
3ステップでしっかり学ぶ Python 入門 ［改訂2版］


## 目次
- 第1章　Pythonの基礎知識
- 第2章　プログラミングの準備
- 第3章　はじめてのPython
- 第4章　変数と演算
- 第5章　データ構造
- 第6章　条件分岐
- 第7章　繰り返し処理
- 第8章　基本ライブラリ
- 第9章　ユーザー定義関数
- 第10章　クラス

## 書籍の特徴

『3ステップでしっかり学ぶ Python 入門［改訂2版］』は、Python初心者向けに、予習・体験・理解の3ステップで学習を進める構成となっています。​各章には練習問題が用意されており、理解度を確認しながら学習を進めることができます。​
全ページで非常に図が多く、プログラムの処理がイメージしやすいです。
これからPythonを学び始める方にとって、わかりやすく体系的に学習を進められると思います。

## わかりやすかった点

特にわかりやすかったのは **第5章　データ構造** です。
リスト、辞書、セットなどPythonの基本的なデータ構造を一通り解説されています。
初心者にとっては数値や文字列以外の値を扱うのはなかなかイメージしにくいものです。
本書ではそれぞれの使い方と特徴が図を伴って整理されており、今後プログラムの応用力をつけるための基礎となることが期待できます。
躓きやすいところがしっかりと解説されていますので、その後の「**第9章　ユーザー定義関数**」「**第10章　クラス**」についても理解を深めながら読み進められると思います。


**第9章　ユーザー定義関数**
繰り返し使う処理を関数として定義する方法を学び、コードの再利用性や可読性を高める技術にも触れられています。
引数や戻り値の扱い、スコープ（変数の有効範囲）など、少し抽象的な考え方も出てきます。
ややステップアップした内容ですが、例題に沿って丁寧に進められています。
プログラム全体に関して言えることとして、関数を理解すれば、コード全体の整理力が格段に上がります。その基本的な事柄を図解で処理とともに理解できる章です。


**第10章　クラスとオブジェクト**
Pythonのオブジェクト指向に触れる章で、クラスの定義やインスタンスの作成、継承の基本が説明されています。
難解になりがちなオブジェクト指向も、Pythonのシンプルさのおかげで比較的取り組みやすい内容です。
この章を通じて、「自分で型を定義できる」というプログラマーとして自走していくベースを実感できると思います。


## わかりにくかった点
ほぼないですね。
強いてあげるなら
- 各章末にあるテストの解説
- 第8章で触れたライブラリに関して参照できるライブラリのドキュメントなど



### 最後に
- WINGSプロジェクトのレビュー企画に応募し、献本してもらったので書評を書きました