OmniAICreator/Qiita-1.07M huggingface dataset:
Macのnginxローカル環境を自己証明書でSSL化した

# はじめに

https://qiita.com/3rarara/items/9994b02599ffc0d3ba9b

の続きで、自己証明書でSSL化したのでメモしておきます。

# SSL証明書の作成
:::note warn
注意
homebrewでnginxをインストールした場合のパスは、
`/usr/local/etc`ではありません！
:::

```bash
mkdir -p /opt/homebrew/etc/nginx/ssl
cd /opt/homebrew/etc/nginx/ssl

openssl genpkey -algorithm RSA -out localhost.key
openssl req -new -key localhost.key -out localhost.csr
```

```
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Shibuya
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany
Organizational Unit Name (eg, section) []:Development
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address []:your-email@example.com
```

途中で以下のような情報を入力するよう求められますが、Common Name (CN) に今回は`localhost`と入力します。
続きのコマンドも下記実行。

```
openssl x509 -req -days 365 -in localhost.csr -signkey localhost.key -out localhost.crt
```

# nginx 設定 (nginx.conf) の編集
```bash
sudo vim /opt/homebrew/etc/nginx/nginx.conf
```

```nginx.conf
server {
    listen       80;
    server_name  localhost;
    return 301 https://$host$request_uri;
    }

server {
    listen 443 ssl;
    server_name localhost;

    ssl_certificate /opt/homebrew/etc/nginx/ssl/localhost.crt;
    ssl_certificate_key /opt/homebrew/etc/nginx/ssl/localhost.key;

    location / {
        root   html;
        index  index.html index.htm;
    }
}
```

# nginx をリロード

```bash
sudo nginx -t  # 設定の確認
sudo brew services restart nginx
```

# ⚠️注意点
自己証明書は正式な証明書でないため、ブラウザでは保護されていない通信と出てくる点に注意してください。

![スクリーンショット 2025-01-19 17.58.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/afe7f182-2961-063e-513a-f4612634b0df.png)


# おわりに

また私の場合80ポートがなぜか競合していて、再起動ができず躓きました💦
プロセスを停止することで再起動できたので書いておきます↓

```bash
sudo kill -9 21700 22366
sudo brew services restart nginx
```

# 参考

https://qiita.com/inakadegaebal/items/29d21d1f5a904a6ba92d

https://nginx.org/en/docs/http/configuring_https_servers.html
【AndroidStudio】エミュレータでQRコードを読み取る



# 実践
エミュレータを起動して　ここを選択

![スクリーンショット 2025-01-19 17.15.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/d20db2d6-25b3-d94f-c87c-ef6cd4764e1e.png)

Cameraの設定で読み込ませるQRの画像を追加します。
![スクリーンショット 2025-01-19 17.20.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/edeb5fc2-166e-2ce8-75f2-eeaaf436804c.png)

**Wall**と**Table**の違いは　エミュレータ内でカメラを起動した際に擬似空間？内を撮影することができるのですが、その擬似空間のどこにQRコードを配置するかを決められます。

今回は自社で作成したHPへ飛べるQRコードを用意してみました。

Google レンズ アプリを使用して試します。

# エミュレータ操作
エミュレータ内での移動は　Shift+W, A, S, D
視点移動はShift+ 方向キーで行えます。

![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/de6be3ca-1c78-e9d1-0074-dea640559ad1.gif)

無事に私たちの会社のHPに飛ぶことができました！
【Virtualbox】Centos Stream release 10の起動方法

# 1.目的
Virtualbox上で、Centos Stream release 10が起動できるようになる。

# 2.前提
PC：Windows11
Virtualbox：Virtualbox 7.1.4
OS：Centos Stream release 10

# 3.ファイルのダウンロード
Virtualbox

https://www.virtualbox.org/wiki/Downloads

①上記URLをクリックする。
②「VirtualBox Platform Packages」配下の「Windows hosts」をクリックする。
③自動的にダウンロードが始まるので、完了するまで待つ。

CentOS

https://www.centos.org/download/

①上記URLをクリックする。
②「x86_64」行の「ISOs」配下の「Mirrors」をクリックする。
③自動的にダウンロードが始まるので、完了するまで待つ。

# 4.Centosの起動
①Virtulboxがダウンロード終了後、起動する。
②初期設定を終わらせ、「Oracle VirtualBox マネージャー」画面が表示されることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948626/4c810092-8676-b6e1-d9c9-ce6210963718.png)
③画面上部の「新規」アイコンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948626/cf6de6b3-c4e5-59f2-d069-0f982a75dbc9.png)
④画像通りの設定を行い、「完了」をクリックする。
名前：任意(今回はわかりやすいようにcentosと名付ける)
フォルダー：任意(各自データを格納したいフォルダ)
ISOイメージ：先ほどダウンロードしたisoを選択
自動インストールをスキップ：チェック
※ハードディスクのサイズなどは作成した環境によって変更すること。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948626/c9a3e122-2780-178e-cc9d-1018698361bb.png)
⑤サーバが作成されたことを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948626/066acd00-ebf7-a516-3cbe-9a9527da05cf.png)
⑥画面上部の「起動」アイコンをクリックする。
⑦サーバが起動されたことを確認し、「Test this media & Install CensOS Stream 10」が選択されていることを確認し、「Enter」を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948626/451e88c5-79da-6213-4874-8ac0df4d8501.png)
⑧サーバのインストールが完了し下画像の画面になっていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948626/0c18678a-434d-9532-5bde-124922107dfe.png)
⑨日本語が選択されていることを確認し、「続行」をクリックする。
⑩「ユーザーの設定」配下の「rootアカウント」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948626/71d0e521-27f6-af0a-4513-bd435278fc0f.png)
⑪下記設定を実施し、「完了」をクリックする。
1.rootアカウントを有効化をクリック
2.パスワードを入力。パスワードの確認項目も入力
⑬「システム」配下の「インストール先」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948626/48085891-6323-64b6-6c58-89073b9c0166.png)
⑭「ローカル標準ディスク」配下のディスクにチェックがついていることを確認し、「完了」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948626/4b7c24ef-4aa3-1fbd-af72-814c55d48ba8.png)
⑭「インストールの開始」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948626/98e029ea-55a4-155f-682d-8c1a0d580884.png)
⑮「インストールが完了しました！」が表示されたら、「システムの再起動」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948626/dbd9325b-47ee-9975-c077-d04c59dd1563.png)
作業はここで終了です。
※起動後の画面がGUIとなる場合は、「ctrl+alt+F2」でcuiの画面になります。

# 5.最後に
最後までお読みいただきありがとうございます。
記事の見やすさ等は今後改善していこうかと思います。
次週は、ユーザの追加についてやっていこうかと思います。
では、また来週^^
［ServiceNow］Choices（sys_choice）について

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

# Choicesテーブルとは
- ServiceNowのChoicesテーブル（sys_choice テーブル）は、選択肢フィールド（ドロップダウンメニューなど）の「値」と「表示名」を管理する


# 主要なフィールド
- Table: 選択肢が関連付けられているテーブル（例: Incident、Change Request）
- Element: 対象となるフィールド（例: `state`）
- Value: 内部的に使用される値
- Label: ユーザーに表示されるラベル
- Dependent Value: 他のフィールドに基づいて選択肢を条件付けする場合に使用
- Sequence: 表示順序
![スクリーンショット 2025-01-19 175716.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/f3d7ac98-5060-80c9-a0b8-96bfbab4a277.png)



# 注意点
- 影響範囲: 選択肢を変更すると、関連するすべてのUIやスクリプトに影響を与える可能性があるため、変更は慎重に行うべき

# 参照
https://so-da.tech/product/servicenow-product/choice_field_share/
slack api連携でインストールしたアプリがワークスペースに追加されていなかった


slack api連携でインストールしたアプリがワークスペースに追加されていなかった

[こちら](https://zaiko2.slack.com/marketplace)からSlack app directryというページを開くとブラウザ上で下記のような画面が開かれる

![スクリーンショット 2024-12-21 19.10.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657171/7e401a7b-283c-16dc-1810-f89c8e7f0bbf.png)

管理をクリックするとインストールしたアプリが存在しているためアプリを選択して「アプリの詳細」をクリック
Slackで開くをクリックすると自身のワークスペースにアプリが追加される


https://zaiko2.slack.com/marketplace
hello-world


# Qitta Hello World

my first post in qiita

## 概要

1. get your QITTA_TOKEN here https://qiita.com/settings/applications
1. setup a new github repo, set QITTA_TOKEN into repo secrets
2. install qitta-cli by `bun i @qiita/qitta-cli -D`
3. init repo by `bunx qitta init`
4. create a post by `bun qitta new hello-world`
5. commit and push
6. done

## 参考

- [Qiitaの記事をGitHubリポジトリで管理する方法 #QiitaCLI - Qiita]( https://qiita.com/Qiita/items/32c79014509987541130 )
- [increments/qiita-cli: Qiita CLI とは、手元の環境で記事の執筆・プレビュー・投稿ができるツールです。]( https://github.com/increments/qiita-cli )
RockyLinux IPアドレス設定

# 状況説明
VirtualBoxで開発環境を作る。
ホストはWindows11、ゲストはRokcyLinux 9.5 でゲストインストール済み。
接続方法は NAT Network (enp0s3) と hostonly (enp0s8)とする。
今回はコマンドラインでの設定に挑戦
# 現状確認
インストール直後の設定を確認
```console
# ip a
# nmcli device status
```
# NAT Network (enp0s3) の設定
```console
// IPV4 アドレスを設定
# nmcli connection modify enp0s3 ipv4.address 10.0.2.13/24

// IPV4 メソッドをマニュアルに設定
# nmcli connection modify enp0s3 ipv4.method manual

// ゲートウェイを設定
# nmcli connection modify enp0s3 ipv4.gateway 10.0.2.1

// 接続設定を自動に設定
# nmcli connection modify enp0s3 connection.autoconnect yes

// IPv6を使わない
# nmcli connection modify enp0s3 ipv6.method disabled

// DNSを設定する
# nmcli connection modify enp0s3 ipv4.dns 10.0.2.1

// DHCPをつかわない
# nmcli connection modify enp0s3 ipv4.ignore-auto-dns yes

// 設定をアクティベート
# nmcli connection up enp0s3
```
# hostonly (enp0s8)
```console
# nmcli connection modify enp0s8 ipv4.address 192.168.56.13/24
# nmcli connection modify enp0s8 ipv4.method manual
# nmcli connection modify enp0s8 connection.autoconnect yes
# nmcli connection modify enp0s8 ipv6.method disabled
# nmcli connection up enp0s8
```
サービス再起動
```console
# systemctl restart NetworkManager
```
再起動後に ip a などで設定を確認。設定が反映されていればひとまず成功！
# 参考
* [【Linux】IPアドレスをコマンドで設定・変更・確認する方法](https://infra-exp.com/linux_ip/)
* [CentOS 7でDNSの設定を変えるメモ](https://qiita.com/h_tyokinuhata/items/0257ab4b94a632e393ba)
WPFアプリケーションの Obfuscar での難読化について

c#等で作成した.netアプリケーションを難読化するObfuscarと言うオープンソースのコマンドラインツールがある。
NuGetでインストールすると難読化できる様になる。
[公式サイト（英文）](https://www.nuget.org/packages/Obfuscar)

CUIアプリを作成した場合、このObfuscarで問題なく難読化できる。
但し、WPFによるGUIアプリを難読化するとアプリが起動しなかった。
イベントビューアーを見てみると、System.Windows.Markup.XamlParseExceptionと言う例外を吐いてアプリが異常終了しとった。
この例外を手掛かりにネットを調べてみても中々解決方法が見つからない。
中にはWPFのObfuscarでの難読化は諦めたと言う投稿も。
結論から言うとXAMLから参照している全てのプロパティ等を難読化の対象から外してやる必要がある。
Obfuscarでは以下の様にConmfigファイルにmodule要素を追加し、SkipType要素、SkipProperty要素で除外設定する事で、WPFアプリが動作する状態で難読化する事ができた。
```
<?xml version='1.0'?>
<Obfuscator>
  <Var name="InPath" value=(難読化対象dllのパス) />
  <Var name="OutPath" value=(難読化後dllのパス) />
  <Var name="AnalyzeXaml" value="true" />
  <Var name="KeepPublicApi" value="true" />
  <Var name="HidePrivateApi" value="true" />
  <AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\8.0.11" />
  <Module file="$(InPath)\(サンプル).dll">
    <SkipType name="(サンプル).ViewModel.MainWindowViewModel"/>
    <SkipProperty type="(サンプル).ViewModel.MainWindowViewModel" name="MainWindowCommand" />
  </Module>
</Obfuscator>
```

上の例ではViewModelとXAMLから呼ばれているパブリックプロパティを難読化から除外している。
除外は他にも名前空間や、メソッド等も指定できる様。
[設定要素の公式ドキュメント（英文）](https://docs.lextudio.com/obfuscar/getting-started/configuration)
対処方法の結論としてはこんな感じではあったけど、ここにたどり着くまでネット漁っても直接的な解決方法が出ていなかった。
何かの足しにでもなればとm(_ _)m

開発環境：.net8.0
Obfuscarバージョン：2.2.40
OSバージョン：Windows11 Home 24H2
Program.csでAddStackExchangeRedisCacheメソッドを書けない

# 環境
・Blazor Webアプリ
・.NET 9.0
# 問題
MicroSoftのドキュメントにあったサンプルコードのProgram.csの部分だけ持ってきたら参照不足のエラーが出た。

https://learn.microsoft.com/ja-jp/azure/app-service/tutorial-dotnetcore-sqldb-app?tabs=copilot&pivots=azure-portal

https://github.com/Azure-Samples/msdocs-app-service-sqldb-dotnetcore/blob/main/Program.cs

AddStackExchangeRedisCacheメソッドはMicrosoft.Extensions.DependencyInjection名前空間にあるらしいが、そのパッケージはインストールしてあるしusingも書いてある。

https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.extensions.dependencyinjection.stackexchangerediscacheservicecollectionextensions.addstackexchangerediscache?view=net-9.0-pp&viewFallbackFrom=net-8.0
# 解決
糸口が見つからなかったのでGitHub Copilotに聞いてみると、コードにMicrosoft.Extensions.Caching.StackExchangeRedisのusing句が追加されている。
その名前空間をインストールすると治ったので、AddStackExchangeRedisCacheメソッドを使うにはそっちの名前空間も必要ということか？
それにしてもメソッド名が長い…
Mujocoチュートリアルをローカルで動かす

# 公式ページ
[Mujocoドキュメント](https://mujoco.readthedocs.io/en/stable/programming/index.html)
[Python](https://mujoco.readthedocs.io/en/stable/python.html)

# 前提条件
- Ubuntu22.04 on WSL2
- mujoco, Python mujocoパッケージはインストール済み

# jupyter環境設定
- VSCodeにJupyter拡張をインストール
- jupyterをインストール、サーバ起動
```
sudo apt install jupyter-core
pip install notebook
jupyter notebook
```

- Mujocoチュートリアルをダウンロード
[python tutorial](https://colab.research.google.com/github/google-deepmind/mujoco/blob/main/python/tutorial.ipynb)

- VSCodeでチュートリアルをオープンし、最初のセルを修正する
```
# コメントアウト
# !pip install mujoco

import distutils.util
import os
import subprocess
if subprocess.run('nvidia-smi').returncode:
  raise RuntimeError(
      'Cannot communicate with GPU. '
      'Make sure you are using a GPU Colab runtime. '
      'Go to the Runtime menu and select Choose runtime type.')

# 以下のjsonパスを適当なパスに変える
# ~を展開するためにはos.path.expanduser()が必要
NVIDIA_ICD_CONFIG_PATH = os.path.expanduser('~/10_nvidia.json')
if not os.path.exists(NVIDIA_ICD_CONFIG_PATH):
  with open(NVIDIA_ICD_CONFIG_PATH, 'w') as f:
    f.write("""{
    "file_format_version" : "1.0.0",
    "ICD" : {
        "library_path" : "libEGL_nvidia.so.0"
    }
}
""")

```

# Intellisenseが効かない場合
- site-packages/mujocoの存在するディレクトリを調べる
`find / -name mujoco*`



1. ファイル→ユーザ設定→設定を選択
2. 検索ボックスに"python.autocomplete"と入力し、以下のsetting.jsonをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/800891/a9e004b6-7f67-62ce-0eee-66fdc050f6e6.png)
3. python.autoComplete.extraPathsに先に調べたsite-packageのパスを追加
4. VSCodeを再起動
【TypeScript × Vite × Testing Library】Viteを使ったReactアプリでTesting Libraryを導入する

# はじめに
ViteとTesting Libraryを使用したテスト環境の構築を学習したため、アウトプット記事を作成します。

# 手順

### 1. Viteプロジェクトの開発  
以下のコマンド実行後、今回はTypeScriptを選択します。
```bash
npm create vite@latest
```

### 2. App.tsxを修正
テストをPASSさせるため、以下に修正する。
```tsx
function App() {
  return (
    <>
      <p>Vite Test</p>
    </>
  );
}

export default App;

```

### 3. テストに必要なパッケージをインストール  
```bash
npm install --save-dev jest ts-jest @types/jest jest-environment-jsdom@latest @testing-library/react@latest @testing-library/jest-dom@latest @testing-library/user-event@latest ts-node
```

### 4. Jest設定ファイルを作成  
   `jest.config.ts` をプロジェクトルートに作成し、次のように設定する。
```ts
export default {
  preset: 'ts-jest',
  testEnvironment: 'jest-environment-jsdom',
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/src/$1',
  },
};
```

### 5. package.jsonを修正
Jestを実行するために、package.json に以下のコードを追加する。
```json
"scripts": {
  "test": "jest"
}
```

### 6. tsconfig.jsonを修正
`compilerOptions`の部分を追記する。
（`compilerOptions`ではTypeScriptコンパイラの動作を制御するためのオプションを指定）
```json
{
  "files": [],
  "references": [
    { "path": "./tsconfig.app.json" },
    { "path": "./tsconfig.node.json" }
  ],
  "compilerOptions": {
      "esModuleInterop": true,
      "jsx": "react-jsx"
    }
}
```

### 7. テストファイルの追加
src フォルダ内にテストファイルを追加する。
例えば、App.tsx に対するテストを作成するには、`src/App.test.tsx`を作成し、以下のようにテストを記述する。
```tsx
import "@testing-library/jest-dom";
import { render, screen } from "@testing-library/react";
import App from "./App";

describe("Sample Test", () => {
  test("[Normal]Sample Test", async () => {
    // 実行
    render(<App />);

    // 検証
    expect(screen.getByText("Vite Test")).toBeInTheDocument();
  });
});
```

### 8. テストの実行
テストを実行するために、以下のコマンドを実行する。
```bash
npm run test
```

### 9. テスト結果の確認
以下のような表示がされればOK！
```bash
 PASS  src/App.test.tsx
  Sample Test
    ✓ [Normal]Sample Test (22 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        1.587 s, estimated 2 s
Ran all test suites.
```
Macにhomebrewでnginxインストールした

# はじめに
今までAWSにnginxをインストールしていましたが、
Macに入れたいなと思いしてみたものの結構苦戦しました。
手順をまとめておこうと思います。

# Xcode Command Line Tools
Xcodeのコマンドラインツールをインストールします。これにより、Homebrewのようなツールを使うための基本的な開発ツールがインストールされます。

```bash
$ xcode-select --install
```

https://qiita.com/SayCheeese/items/1b9db660917049bbad64

# Homebrew
Homebrewは、macOS用のパッケージマネージャーで、ソフトウェアのインストールや管理を簡単にしてくれます。インストールされると、brewコマンドが使用できるようになります。

```bash
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
$ brew --version
```
https://qiita.com/yu_uk/items/73654985fb1caeab4cec

https://brew.sh/ja/

# nginx
Homebrewを使ってnginxをインストールします。以下のコマンドを実行します。

```bash
$ brew install nginx
```

# ⚠️注意点
Homebrewを使ってnginxをインストールした場合の設定ファイルパスに注意してください！

```
/usr/local/etc
```
ここではなく、、
```
/opt/homebrew/etc/
```
ここにあります！

https://qiita.com/nakamoto_yuki/items/9cbec17ed98973116a77

# nginx起動
```bash
$ sudo brew services start nginx
```

```
http://localhost:8080
```
上記URLで起動の確認ができます。
"Welcome to nginx!" という画面が表示されれば、インストールと設定が成功しています。

# 設定編集

```bash
$ sudo nginx -s stop
$ sudo vim /opt/homebrew/etc/nginx/nginx.conf
```
ポート番号がデフォルトで8080になっているので、上記コマンドで設定ファイルを開きlistenを`8080`から`80`に修正します。

```nginx.conf
server {
listen       80;
server_name  localhost;
```
修正が完了したら、nginxを再起動します
```bash
$ sudo brew services restart nginx
```

localhostで接続できるようになります。
```
http://localhost
```

https://thehomeofthefuture.com/installation-guide/nginx-on-macos/

# さいごに
検索かけてもことごとくパスが違うのでめんどくさかったです、、
6軸力覚センサMICRO 4/30-Aの使い方

## 1. はじめに
ビー・エル・オートテック社の6軸力覚センサの使い方をまとめました．
とりあえず，Simulinkでモデルを組んでdSPACEで実行する方法を記事にします．
Arduinoで実行する方法はまた今度．

## 2. 準備するもの
- 本体
- アンプ
- 12V電源（アンプに給電）
- 校正行列データシート
- メーカの説明書
入手先（要メールアドレス）
https://www.bl-autotec.co.jp/products/index.php?act=list_view&pid=78
- 端子台 7極以上

## 3. 配線
アンプに接続するケーブルは50極構成になっています．

**アンプの外部電源用コネクタに12Vを供給する場合**
信号6個＋GNDの7本繋げれば使えます．
**50極ケーブルから給電する場合**
別途2極ずつある12VとGNDに接続します．

説明書（RMS増幅ユニット取説-(Rev3.0).pdf）にカラーコードが載っているものの，実際のケーブルにその色がなくて悪戦苦闘...
仕方なく検電ドライバを使ってコネクタとバラ線の接続をチェックしたところ，
説明書の色は緑→白，青→黄として捉えれば問題なさそうです．
そのため，システム全体の接続はこんな感じになります．↓
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654082/2109f054-352e-6e95-cd62-ab43367e1682.png)


## 4. Simulinkモデル
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654082/65bc9cb4-1a7a-0f04-aab5-210928bee30d.png)

### (1) アナログ値に変換　説明書4(1)
±5Vのアナログ電圧値を0~4096(12bitの場合)の数値に変換します．
メーカの用意した校正行列は，アナログ電圧値ではなくADCを通した後のデジタル値に対応しているからです．
DT: デジタル値
Sg: アナログ電圧
```math
Dt_i = \dfrac{2048 \cdot Sg_i}{5.0}
```

### (2) オフセット
取り付けた状態でセンサ値を0にするためのオフセット用ブロックです．

### (3) 行列変換　説明書4(2)
校正行列のデータシートの数値をconstantブロックに行列として打ち込みましょう．
一度メモ帳に書き起こしてからSimulinkにコピペすると間違いがないと思います．
`Matrix Multiply`ブロックの上側が校正行列，下側がセンサ値(count)になるように接続します．

### (4) カウント値換算　説明書4(3)
行列演算後の数値の単位はcountになっているのでcountを数値に換算します．
以下のゲインをかけるだけです．
力の場合
```math
49\times10^{-3}
```
トルクの場合
```math
0.98\times10^{-3}
```

### (5) 補正　説明書4(6)
(1)でアナログ電圧→アナログ値変換をしている場合は補正が不要です．
計測プラットフォームのADCの分解能が12bit以外は後ほど補償値をかけます．
実際に試していないので確証はありませんが，恐らくArduinoの10bitのアナログchような
直接アナログ値が出力される＆分解能が12bit以外のときの話かと．

### (6) フィルタ
ところどころ`Transfer function`ブロックを用いた1次遅れフィルタを挟んでいます．
これは計測ソフトウェアからセンサ値を見やすくするためのものです．
時定数T＝0.2くらいが見やすいかな．
ベクトル一括でこのフィルタをかけらればブロック数を減らせるのですが，できないみたいなのでフィルタ周辺が肥大化しています...

## 注意事項
- センサ値の原点
Micro-A, Micro-A-SAともにセンサの端に原点がないことに注意．
説明書の寸法図に原点が記載されているのでそれを参照しましょう．

- 出力のずれ
重量固定の2.5 kgの錘をぶら下げてみると1 Nくらい小さく値が出たのが気になるところ．
別の軸に分散しているわけでもなく...
より厳密な測定をしたい人は重量-アナログ電圧特性を計測して補正ゲインをかけるのがいいと思います．
第1回 AWS初心者LT会 in 札幌を開催しました！

## はじめに
![第1回 AWS初心者LT会in札幌](https://media.connpass.com/thumbs/99/df/99dfe3f3d3e320ed1a643a2dbc3a7bb1.png)

2024年12月16日（月）に第1回AWS初心者LT会in札幌を開催しました。（https://awsbeginners-sapporo.connpass.com/event/338736/）
今回はイベントの模様とAWS初心者会in札幌について紹介していきます。

## AWS初心者会in札幌ってなに？
AWSを始めたばかりの方や、若手の方など、同じ立場の方が札幌で交流できるコミュニティです。
AWSの経験が浅い方やこれから勉強を始めたい方など、AWSに興味のある方が気軽に参加できる場になっています。
現在は主に初心者LT会を開催しています。今後は勉強会など様々な企画を開催できればと思っています。

## 当日の様子
今回はAWS初心者会in札幌として初めてのイベント開催だったのですが、LT5名、全体では15名もの方が参加をしてくれました。
LTではプロジェクトでレガシーなシステムを使用している方の業務の辛さの話や、未経験新卒1年目がTerraformを触ってみた話、re:Invent 2024で発表されたAurora DSQLについて紹介する話などバラエティに富んだテーマが話され、とても盛り上がりました！
聴講参加では初心者の方だけでなくいろいろな方に参加していただき、初めてLTをやる方も話しやすい雰囲気でイベントが進んでいたのではないかと思います。
イベント終了後は希望者で懇親会も行いました。

![S__68845572_0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931956/b87397d0-5426-aa35-cd69-53af0dea6eea.jpeg)
![S__68845576.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931956/d61ffad1-a321-d629-a028-f4279d3ae72e.jpeg)

![S__68845574_0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931956/5593a913-7ba4-f6bb-8107-629baec69822.jpeg)

## まとめ
初めての開催でどうなるか不安だったのですが、良い会になってとても良かったです。
初心者LT会は隔月で開催していければいいなと思っています。
次回の第2回は2/27(木)に開催するのでぜひ気軽にご参加ください！

https://awsbeginners-sapporo.connpass.com/event/342460/
生成AIにおけるマルチエージェントとシングルエージェントの徹底比較

# はじめに
AWSがre:Invent2024でBedrockがマルチエージェント機能（プレビュー）を発表しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/a589f956-bc85-2f8c-9d19-149281da2764.png)
[（画像の引用元）](https://aws.amazon.com/jp/blogs/news/introducing-multi-agent-collaboration-capability-for-amazon-bedrock/)

マルチエージェント機能により、異なるタスクを担当するエージェントを簡単に統合し、動的に連携させることが可能です。また、APIを通じてエージェント間で情報を共有し協力する仕組みを提供しており、大規模で複雑なシステムにも対応できます。

これだけ見ると「マルチエージェント最高じゃん！シングルエージェントなんて不要で、マルチエージェント一択！」となります。
ですが、実際はそういったわけもなく、どちらにもメリット・デメリットがあります。そこで本記事はシングルエージェントとマルチエージェントの比較を行っていきます。

# シングルエージェントとマルチエージェントの比較

シングルエージェントとは、1つのAIエージェントが外部環境やユーザーとのやり取りを通してタスクを遂行する仕組みです。このエージェントは、与えられた目標や指示に基づいて自律的に動作し、タスクの分解から実行まですべてを単独で担います。

一方、マルチエージェントは複数のAIエージェントがそれぞれの役割を持ち、協力して目標を達成する仕組みを指します。各エージェントは得意な領域や機能を担当し、情報や結果を共有しながらより複雑なタスクを並行して実行します。

## シングルエージェントの特徴
- 運用や実装が比較的シンプルであるため、PoCや小規模なシステムに適している
- 単一のエージェントがすべてを担うため、タスク分解・実行プロセスが一元化しやすい
- 大規模かつ複雑な目的では処理が負荷集中しやすく、拡張性に限界があるとされる

## マルチエージェントの特徴
- 役割や機能が異なる複数のAIエージェントが連携し合うことで、より複雑な課題や大規模プロジェクトに対応しやすい
- それぞれの専門領域や機能に特化したエージェント同士が相互補完するため、高い柔軟性を発揮する
- 設計・実装面で複雑性が増すため、エージェント同士の通信や競合が生じないよう調整を行う必要がある

## 使い分けのポイント
- 小規模の単純タスクであればシングルエージェントを導入し、管理を容易にする
- 複数の専門機能が必要になる、あるいは大規模タスクを高速に処理する場合はマルチエージェントを検討する
- システム全体の要件や利用可能なリソース、タスクの複雑さに応じて選択することが推奨される

 ## Appendix
日本企業では、まずRAGやシンプルなChatBotといったシングルエージェントの検証が進んでおり、その次のステップとして、複数のタスクを同時並行で解決できるマルチエージェントへの期待が高まっている。シングルエージェントでは一つのエージェントが計画と実行を両立させるReActなどの仕組みを利用しやすく、導入も容易だが、効果を最大化するにはエージェント単体の設計が洗練されている必要がある。
一方、マルチエージェントではエージェント間の協力や競争、コミュニケーション手段の設計などを緻密に行うことで、大規模なタスクをより柔軟に扱うことが可能になる。ただし、チームで作業するイメージであるため情報共有や衝突解決の仕組みが必須になり、構築・運用の難易度は高い

#### ※図が大きく見づらいので拡大してご確認ください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1371880/1dd017ef-4cc5-c8d4-06be-eb06744a367e.png)

## 参考記事
- https://aitc.dentsusoken.com/column/kaggle-ai-agent-01
- https://tradivance.co.jp/column/generativeai/ai-agents/
- https://note.com/hatti8/n/nc504f6f2854b
- https://www.issoh.co.jp/tech/details/4261/
- https://note.com/genaird/n/n913826e28695
- https://qiita.com/Dataiku/items/4dbdec1f5046cc415ffc 
- https://ainow.ai/2024/07/11/276764/
- https://www.brainpad.co.jp/doors/contents/generative_ai_llm_news_trend_17/
Linuxで特定のフォルダを監視し、ファイルが作成されたときに特定の処理を実行する(fswatch)

inotify-tools,fswatchなどがあるが、総合的に見てfswatchがよさそう。
以下、ChatGPTが作成したの比較表です。

### 1. 概要の比較

| 特徴               | `inotify-tools`                        | `fswatch`                          |
|--------------------|----------------------------------------|-------------------------------------|
| **提供元**         | Linux専用 (`inotify` システムコール)  | クロスプラットフォーム対応         |
| **監視方法**       | Linuxカーネルの `inotify` を利用       | OS固有の監視メカニズムを利用       |
| **クロスプラットフォーム** | Linux専用                          | Linux, macOS, Windows, BSD対応     |
| **インストールの容易さ** | 一般的なLinuxディストリで利用可能   | LinuxだけでなくmacOSでも簡単に導入 |
| **機能性**         | シンプルかつイベントごとの監視         | フレキシブルな設定が可能           |

---

### 2. 機能の比較

| 項目                    | `inotify-tools`                    | `fswatch`                          |
|-------------------------|-------------------------------------|-------------------------------------|
| **監視対象**            | ファイル、ディレクトリ              | ファイル、ディレクトリ              |
| **対応イベント**        | `create`, `delete`, `modify` などの基本操作 | 内容変更, 時刻変更, メタデータ変更など幅広い |
| **監視の再帰対応**      | 明示的な設定が必要 (`-r` オプション) | デフォルトで再帰対応               |
| **フィルタリングの柔軟性** | 限定的（特定拡張子や条件にはスクリプト必要） | 正規表現やパターンで詳細指定可     |
| **ログフォーマットの自由度** | 固定フォーマット                  | 柔軟なフォーマットを選択可能       |
| **リソース効率**        | 非常に軽量                          | やや高負荷（監視範囲に依存）       |

---

### 3. ユースケースの比較

| シナリオ                 | `inotify-tools`                    | `fswatch`                          |
|--------------------------|-------------------------------------|-------------------------------------|
| **小規模プロジェクトの監視** | 適している                         | 適している                         |
| **大規模なフォルダの監視** | 負荷が少なく適している             | 可能だが負荷が増大する場合あり     |
| **OSを跨いだ開発**        | 不適（Linux限定）                  | 適している（クロスプラットフォーム対応） |
| **監視内容のカスタマイズ** | スクリプトで対応可能だが煩雑        | オプションで簡単にカスタマイズ可能 |
| **初心者向けの使いやすさ** | シンプルなCLI                      | わかりやすいがオプションが多い     |


# インストール方法
Debian/Ubuntu系は下記でOK。
```bash
sudo apt-get update
sudo apt-get install fswatch
```

# テスト
```
fswatch /home/XXXXX/YYYYY | while read file; do 
  echo "Change detected: $file"; 
done
```

実行し、/home/XXXXX/YYYYYで``touch a``と実行すると、
```bash
Change detected: /home/XXXXX/YYYYY/a
Change detected: /home/XXXXX/YYYYY/a
Change detected: /home/XXXXX/YYYYY/a
Change detected: /home/XXXXX/YYYYY/a
```
と4回反応している。

fswatch が4回イベントを検知するのは、ファイル操作（touch）に関連する複数のイベントが発生しているためで、fswatch がファイルやディレクトリの変更を監視する際に、異なる種類のイベントを検知してそれぞれを出力するため、とのこと。

-x オプションで各イベントタイプを確認できるので、
```
fswatch -x /home/XXXXX/YYYYY | while read file; do 
  echo "Change detected: $file"; 
done
```
に変更してみると

```bash
Change detected: /home/XXXXX/YYYYY/a Created
Change detected: /home/XXXXX/YYYYY/a PlatformSpecific
Change detected: /home/XXXXX/YYYYY/a AttributeModified
Change detected: /home/XXXXX/YYYYY/a Updated
```
と出力された(詳細の意味は割愛)。

ファイルが作られたときのみ反応するためには、先ほどの-xオプションを付けた上でgrepすることにより実現できそう。

```bash
fswatch /home/XXXXX/YYYYY -x | grep --line-buffered Created | while read file; do
    echo "File created: $file"
done
```
AtCoder ABC389 振り返り感想戦(緑コーダーがPythonでABCD問題)

## ABC 389感想まとめ

[トヨタ自動車プログラミングコンテスト2025（AtCoder Beginner Contest 389） - AtCoder](https://atcoder.jp/contests/abc389)

ABCD 4問解答でした。今回は、D問題まではわりとスムースに解けました。

1時間ほど時間があったのでE問題にチャレンジしたのですけども、答えを出力するところまでプログラムを書けずに終わりました。Eは、SegTreeを使う方針でいたのですが、先週に引き続き SegTreeの使い方に慣れておらず、それで時間を消費してしまった感じです。

Eの解説を読むと、そもそも問題の意味を誤解していたので、どっちにしてもコンテスト中には正解にたどり着けなさそうでした。これまでコンテスト中にE問題を解けたことはないので、今年の目標ですかね。

## [A - 9x9](https://atcoder.jp/contests/abc389/tasks/abc389_a)

入力文字列 S の1文字目と3文字目を int に変換して、掛け算しました。

``` python
S = input()
a = int(S[0])
b = int(S[2])
print(a*b)
```

## [B - tcaF](https://atcoder.jp/contests/abc389/tasks/abc389_b)

1\*2\*3\*4 ... の掛け算の結果を for ループで計算し、それが X と一致したらその時の値を出力します。


``` python
INF = 10 ** 18
X = int(input())

count = 1
for i in range(1, INF):
    count *= i
    if count == X:
        print(i)
        break
```

## [C - Snake Queue](https://atcoder.jp/contests/abc389/tasks/abc389_c)

素直に、ヘビの先頭位置と長さをデータ構造に貯めていきます。回答例では、 (先頭位置, 長さ) の tupleにしました。

データ構造としては Deque を使用することにしました(問題文にも Queue と書いてありますし)。

操作2のとき、先頭ヘビを取り除き、後続のヘビを左に詰める作業が発生します。まともに後続のヘビを詰めていくと実行時間がかかるので、詰めた分を offset 変数に保持しました。

``` python
from queue import deque

Q = int(input())

dq = deque()
offset = 0 # 操作3でヘビを詰めた分のoffset
for i in range(Q):
    query = list(map(int, input().split()))
    if query[0] == 1:
        # ヘビを最後尾に追加する.tupleで記録(先頭位置, 長さ)
        length = query[1]
        if len(dq) == 0:
            dq.append((0, length))
            continue
        else:
            last = dq[-1]
            dq.append((last[0] + last[1], length))

    elif query[0] == 2:
        # 先頭ヘビを取り除く。取り除いたヘビの長さの合計を offset で記録
        left = dq.popleft()
        offset += left[1]
    else:
        # k 番目のヘビの頭の位置を求める。取り除かれたヘビの分だけ、座標を引く。
        k = query[1]
        target = dq[k-1][0] - offset
        print(target)
```

## [D - Squares in Circle](https://atcoder.jp/contests/abc389/tasks/abc389_d)

円の中心を 原点 (0,0) として考えます。

とりあえず、原点から右上方向の1/4の円だけを考えます。この範囲に入っている正方形の数が分かれば、それをだいたい4倍すれば円全体の正方形が求まりそう...という方針でいきました。


``` python
R = int(input())

# 座標(x,y) を中心とする正方形が、円の中に入っているか判定する
def is_inside(x, y):
    xx = x + 0.5 # 正方形の右上の座標
    yy = y + 0.5 # 正方形の右上の座標
    distance = xx ** 2 + yy ** 2
    inside = distance <= R ** 2
    return inside

count = 0 # 円の 1/4 分の中に入っている正方形の数
count_line_zero = 0 # y==0 のときに、何個の正方形が入っているか

# 右上半円の各 y について、その行に何個の正方形が入っているかを求める
for y in range(R+1):
    # 二分探索で、行に含まれる正方形の右端の位置を求める
    left = -1
    right = R + 1
    while right - left > 1:
        mid = (left + right) // 2
        if is_inside(mid, y):
            left = mid
        else:
            right = mid
    count += left + 1

    if y == 0:
        count_line_zero = count

# 右上半円 * 4 すると、円全体の中の正方形の個数になる
# 重複部分を4回引いている
# +1 しているのは、原点を4回引いちゃうと引きすぎなので、+1戻している。
answer = count * 4 - count_line_zero * 4 + 1
print(answer)
```
リモートデスクトップでRockyLinuxに接続する

# 環境
* VirtualBox 7.0
* ホストOS Windows 11 Home 24H2
* ゲストOS Rocky Linux 9.5
# 手順
1. Linux側をGUIでいけるようにする
1. Linux側でリモートデスクトップが使えるようにする
# 1.Linux側をGUIでいけるようにする
```console
# dnf groupinstall graphical-server-environment
# dnf install tigervnc-server
# dnf repolist | grep epel
epel                Extra Packages for Enterprise Linux 9 - x86_64
epel-cisco-openh264 Extra Packages for Enterprise Linux 9 openh264 (From Cisco) - x86_64
```
[epelリポジトリがない場合]
```console
# dnf install epel-release
```
# 2. Linux側でリモートデスクトップが使えるようにする
xrdpインストール
```console
# dnf install xrdp
# systemctl start xrdp
# systemctl enable xrdp
# netstat -antup | grep xrdp
tcp6       0      0 :::3389                 :::*                    LISTEN      39013/xrdp
```
xrdp用にポート開放
```console
# firewall-cmd --add-port=3389/tcp --zone=public --permanent
# firewall-cmd --reload
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8
  sources:
  services: cockpit dhcpv6-client https ssh
  ports: 3000/tcp 3389/tcp
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```
# 参考
* [WindowsのRDPを使ってクラウド上のLinuxインスタンスに接続する](https://qiita.com/yamada-hakase/items/a8efe626f598c5eb6f8c)
*
【Flutter】context.mountedの使いどころ

# 遭遇したケース
Fltterの実装では必要不可欠なBuildContext型の`context`

実態はWidgetと付随して作成されるWidgetの参照情報等を保持しているElementというオブジェクトのことです

その`context`を使用するメソッドを作成して、引数として渡そうとすると、以下の警告が出ました
> Don't use 'BuildContext's across async gaps.
Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check.

# 警告の内容
日本語訳
> 非同期ギャップで 'BuildContext' を使用しないでください。
'BuildContext' を使用しないようにコードを書き直すか、'mounted' チェックで使用を保護してください。

なるほど🤔
確かに警告が出ていた箇所は非同期処理を使っていました

非同期処理中の別スレッドの処理で`context`の情報が書き替わる可能性がありますよね

すでにツリーから削除されているWidgetを使った処理が実行されることによるクラッシュやエラーを防ぐための警告だったんですね

https://dart.dev/tools/diagnostic-messages?utm_source=dartdev&utm_medium=redir&utm_id=diagcode&utm_content=use_build_context_synchronously#use_build_context_synchronously


# 解決策
ここで活躍するのが`context.mounted`です！
警告文にもあるように、BuildContextが用意してくれている`mouted`を使えば解決できます

`mounted`とは対象のWidgetがツリーに存在しているか否かを示すbool値です
trueであればツリーに存在していることを表し、falseであれば既に使用されていない状態を表します

つまり、`mounted`がfalseの場合に`context`を使った処理を実行しないように実装すればよいということですね

今回の実装では、単純にifを使って修正しました
こんな感じで👇
```dart
void _closePage(BuildContext context) {
    if (context.mounted) {
      Navigator.pop(context); // 画面を閉じる
    }
}
```
(画面を閉じるだけのメソッドになってますが実際にはもう少し処理があります)

`if (!context.mounted) retuern;`で早期リターンを使っても良さそうですね

# 余談
`mounted`は他にも不要な処理が実行されることを防ぐことで、メモリリーク防止やパフォーマンス向上目的でも使われることがあるみたいですね

ただ、警告の修正時にAIからは以下のアドバイスをいただきました
> 非同期処理を含むコンストラクターやプロパティは、非同期ファクトリメソッドやメソッドに変更することを検討してください

単に警告が出ないように修正するだけではなく、そもそも警告が出ないような設計を考えることが必要なのかも...
ABC389回答メモ

# 0.はじめに
　最近Dまで解けることが多くなってきて調子が
　揚がってきた今日この頃のコンテスト。
　Ａ～Ｄまでは順調に解けたもののＥは解けませんでした。
　そんなこんなでレートは+18で737まで回復しました。


# 1.A - 9x9
　A問題らしいすっきりした問題。
　読み込んだ3文字の1文字目と3文字目をint型にして
　掛けて出力して終了。

　https://atcoder.jp/contests/abc389/submissions/61783267


# 2.B - tcaF
　Bにしてはちょっと難易度高いかなと思いきや
　150点問題。
　iを2からNまで1つずつ増加するループを回し
　N＝N÷iを繰り返し、Nが1になったタイミングの
　iを出力して終了。

　https://atcoder.jp/contests/abc389/submissions/61793740


# 3.C - Snake Queue
　とりあえずパッと問題を読んだところ
　ざっとみデキューを使えばいけるかなという感触でした。
　考え方
　　・蛇の先頭位置をクエリ２がない場合の位置ですべて保持
　　・クエリ２で除去した長さは保持しておく
　　・出力するときは除去した長さ分を引いた値を出力
　使用する変数
　　・ＬＨ：蛇の長さをそのまま入れるキュー
　　・ＳＨ：蛇の先頭位置を入れるキュー
　　・Ｓ：次の蛇の先頭値（初期値0）
　　・Ｍ：いなくなった蛇の合計
　処理
　　・タイプ１のクエリ
　　　・LHにｌを追加
　　　・SHにＳを追加
　　　・Sにｌを加算
　　・タイプ2のクエリ
　　　・ＬＨの左の値を取り出してｐに格納
　　　・ＳＨの左の値を取り出し
　　　・Ｍにｐを加算
　　・タイプ３のクエリ
　　　・ＳＨのｋ番目の値からＭを引いたものを出力

　https://atcoder.jp/contests/abc389/submissions/61803592


# 4.D - Squares in Circle
　座標問題なので逃げたくなりましたが、まぁ、次以降の問題もそれほど
　行ける気がしなかったので取り組みました。

　【考え方】
　　・以下は固定で円に入る
　　　・原点のマス　1
　　　・原点から4方Rマス　4×(R-1)　(原点のマス分はマイナス)　
　　・原点から右上・左上・右下・左下の4つは同じ形になるので
　　　右上分のマスがどれだけ円の範囲になるかを調べ4を掛けて足す。
　　・円の範囲に入っているマス数の求め方
　　　・X軸正方向のマスの1マス上、R-1マス（下図⑨）の右上頂点が円に入っているかをチェック
　　　　（右上頂点の座標と原点の距離がR以内かをチェック）
　　　　→入っていればR-1を合計マスに加算して上段(⑥)をチェック
　　　　→入っていなければ、左隣のマス(⑧)をチェック・・・
　　　　と、調べていき、段ごとに円に入るマス数を調べる
【参考図】
　通常数字は確定分、〇数字はチェック対象。
　R＝4の時、①④⑤⑦⑧⑨が円の中
　３①②③
　２④⑤⑥
　１⑦⑧⑨
　０１２３

　【実装】
　　1.Rを入力
　　2.回答用変数ansに1+((R-1)*4)をセット(固定で円に入る原点からの4方Rマス分)
　　3.ユークリッド距離判定用変数DにR*Rをセット(平方根を求めなくてよいよう2乗分)
　　4.X：段ごとにチェックする右端のマスの座標にR-0.5をセット
　　5.s：右上部分のマス数合計に0をセット
　　6.以下iを１～R-1まで繰り返し（参考図左端のように段毎に繰り返し）
　　　-1.y(チェックするマスの右上頂点のy軸座標)にi+0.5をセット
　　　-2.以下jを0～Xまで繰り返し（参考図最下段の３～0に向けてチェック）
　　　　-1.x(チェックするマスのｘ座標の値)にＸ－ｊをセット
　　　　-2.ｄ(チェックするマスの右上頂点から原点の距離(の2乗))にｘの2乗+ｙの2乗をセット
　　　　-3.ｄがＤ以下の時（チェックしているマスの頂点が円内に入る場合）6-2.のループをブレイク
　　　-3.ｓにｘ-0.5を加算
　　　-4.Ｘにｘをセット（上の段いこうｘより右のマスが円の中に入ることは無いため）
　　7.ａｎｓにｓ×4を加算したものを出力して終了

　　最初6-4.のＸの置換を入れていなかったため処理時間が長くなりましたが
　　コンテスト中に気づけて事なきを得ました。

　https://atcoder.jp/contests/abc389/submissions/61829471


以上
データベースの種類（階層型、網型、関係）

現在主流のデータベースは関係データベースですが、
他の代表的なデータベースに、階層型データベース、網型データベースがあります。
それぞれの特徴を備忘録としてまとめました。

## 階層型データベース
階層構造（木構造）によりデータ構造を表現する。ツリー上に構成されている。

レコードどうしが親子関係を持っていて、
ある親レコードに対する子レコードは1つ以上存在し、子レコードに対する親レコードは
ただ一つだけ存在するという特徴がある。

メリット：
　・あるノードへのルートが限定的になり、速度が速い。
デメリット：
　・子ノードが複数の親ノードを持ちたい場合、重複登録が必要となり、
　  データの整合性維持が課題となる。

## 網型データベース（ネットワーク型データベース）
1つの子ノードが複数の親ノードを持てる。
ノードのつながりが網目状になることから名付けられた。

メリット：
　・階層型データベースで問題になっていたデータの重複を避けられる。
デメリット：
　・階層型と同じくデータ構造を理解しないと、必要なデータにアクセスするのが難しい。
　・データ構造が複雑になると、アクセス経路の特定が難しくなる場合がある。

## 関係データベース（リレーショナルデータベース）
データの集合を平坦な2次元の表で表現したデータベース。エクセルをイメージするとわかりやすい。
従来型データベースの難点であった柔軟なデータの取り扱いを可能にした。
階層型や網型が持つ親レコードと子レコードという関係を持たないところに特徴がある。
レコード間を結ぶポインタやリンクがないため、関係データベースでは、
データ操作の"結合"によってレコード間の関連付けを行う。

メリット：
　・柔軟なデータの取り扱いができる。
　・複雑なデータの関連性を扱える。
　・データ処理の一貫性を保てる。
 
デメリット：
　・データ量が増大するにつれて処理速度が低下する場合があり、
　　適切な設計やクエリの最適化が必要になる。
・結合が多い場合、データ量や設計次第で性能が低下する場合がある。

### 参考文献：
https://it-trend.jp/database/article/89-0066

https://news.mynavi.jp/siryou_hikaku/20201023-1386925/

・応用情報技術者合格教本
【参加レポート】Drupal CMS リリースパーティ Nagoya & Tokyo に参加してきました

# 初めに
2025年1月15日(水) に名古屋、2025年1月18日(土) に東京で Drupal CMS v1.0 のリリースを記念したイベントが開催されました。
私は名古屋にオフライン参加、そして東京にはオンラインで参加しました。本記事では、当日の雰囲気や感じたことなどをゆるっとレポートします。

# Drupal CMS とは？
そもそも「Drupal」とは、オープンソースのデジタル体験プラットフォームとして世界中で支持されているソフトウェアです。ユニセフやナスダック、ジョージア州政府、プリンストン大学、テスラモーターズ、ネスレなどの大手企業・機関でも採用実績があり、日本でも多言語・多ブランド対応が必要な企業や大学などで導入が進んでいます。

今回リリースされた Drupal CMS v1.0 は、これまで「Drupal Starshot」というコードネームで開発されていた新しいバージョンです。

- これまでのDrupalの概念をより明確にし、マーケターやコンテンツ管理者にとって使いやすい CMSとして進化
- ノーコード/ローコードツールが充実し、技術的スキルのハードルがさらに下がった
- Drupal 8以降で蓄積されてきた機能・改善が反映され、より直感的な操作性 を追求

「Drupalは難しい」というイメージを持っている方も、これを機会にぜひ触ってみてはいかがでしょうか。

# Drupal CMS リリースパーティ Nagoya
名古屋で開催されたイベントにオフラインで参加してきました。少人数ながら非常にアットホームな雰囲気で、「ゆるーくながーく」をモットーにしているとあって初参加でもまったく緊張感なく溶け込めました。

## 感じたこと / 体験したこと
- 初めてでも参加しやすい雰囲気
みなさんフレンドリーで、Drupalの経験年数も様々。質問しやすく、もっと話を聞きたい！と思える時間でした。
- ベテランの方々の知見がすごい
Drupalに長く携わってこられた方もいて、「今後のキャリアをどう考えるか？」など、大変勉強になるお話を伺うことができました。
- 英語の重要性を再認識
Drupalはグローバルコミュニティが活発で、英語を使えるとより深い情報や世界中の事例に触れられるとのこと。キャリアの選択肢が格段に増えますよね。
- 終了後の飲み会も最高
懇親会では技術的な話から雑談まで大いに盛り上がり、いろんな方におごっていただきました(笑)。オフラインのイベントならではの醍醐味です。

「次もぜひ行きたい！」と思える居心地の良さでした。オフラインならではのリアルなコミュニティ感やネットワークが広がるのを実感しました。

# Drupal CMS Launch Party, TOKYO
東京開催分はオンラインで参加しました。名古屋とはまた違った雰囲気で、オンラインならではの利点と難しさを感じましたが、いろいろな発見がありました。

## 感じたこと / 体験したこと
- オンラインは気軽に参加できるけど、やや難しい面も
場の空気を感じ取るのは難しいですが、遠方からでも気軽に参加できるのは大きなメリット。
- キャッチアップがしやすい
「あの話題、他の地域ではどうなんだろう？」など、チャットや資料で同時に確認できるので効率的でした。
- Drupalに関わっている人がたくさんいて嬉しい！
幅広い年齢層・職種の方がおり、Drupalがいかに長い歴史を持ち、さまざまな形で使われているのかを改めて実感。
- コミュニティを横断した情報交換
各地のDrupalコミュニティ状況や勉強会など、リアルだけでは得にくい情報をオンラインで一気に知ることができるのは魅力的。
- DrupalConや海外カンファレンスの話が聞けて刺激的
行った人の体験談を聞くと、やっぱり「いつか行ってみたい！」と思いますよね。シンガポールは意外と寒いらしいので防寒必須？
- 新たなキーワード「DrupalAI」
ローカルで動くかもしれない？（SLM？）という話や、AIにフィールド作成やcontextual filterを使った紐づけをお願いできるなど、AIへの期待が高まっているそうです。また、AIを使ったコンテンツマイグレーションなどの話もありました。最新の動向にワクワクしました！
# Drupal CMS の特徴（おさらい）
1. コンテンツ管理に特化
「CMS」という名称で、マーケターやコンテンツ管理者にも直感的に扱いやすい構造へ。

2. 柔軟なサイト構築が可能
モジュールベースで、ノーコード/ローコードツールも充実。非エンジニアでもカスタマイズがしやすい。

3. 高いセキュリティとスケーラビリティ
世界的な政府機関や大企業での導入実績があり、大規模サイトでも安心して運用可能。

4. オープンソース・コミュニティ主導
世界中の開発者と企業が参加するため、常にモジュールやテーマがアップデートされ続ける。

5. 次世代のDrupalとしての位置づけ
Drupal 8以降で進化した要素を取り込み、既存のDrupalサイトからも移行しやすい設計に。

# まとめ
名古屋・東京それぞれのリリースパーティに参加して感じたのは、**Drupalコミュニティの「人の温かさ」と「国際色豊かな広がり」** です。オフラインのリアルなつながりも、オンラインによる効率の良い情報交換も、どちらも魅力がありました。

### オフライン参加（Nagoya）

- ゆるい雰囲気で初参加でも安心！
- ベテランの方にキャリア相談できたり、英語力の大切さを感じたり！
- 懇親会で仲良くなれる！

### オンライン参加（Tokyo）

- 遠方からでも気軽に参加！
- 画面共有等でスムーズに情報共有＆キャッチアップ！
- DrupalConなど海外イベントの話も聞ける！

特に、「DrupalAI」などの新キーワードが出てきたのは興味深かったです。今後もDrupalはCMS領域で革新を進めていくと思うので、私自身も引き続きウォッチしていきたいと思います。

これからDrupalを始めてみたい方、コミュニティで仲間を見つけたい方は、まずは各地域の勉強会やオンラインイベントなどに参加してみることをおすすめします。ぜひ、一緒にDrupalの世界を盛り上げていきましょう！

以上、Drupal CMS リリースパーティ Nagoya & Tokyo 参加レポートでした。
ご質問や感想などありましたら、お気軽にコメントなどでお寄せください！

---
参考リンク
[Drupal公式サイト](https://new.drupal.org/home)
[Drupal さっぽろ](https://drupalsapporo.connpass.com/)
[Drupal Meetup 豊田 (connpass)](https://drupal-meetup-toyota.connpass.com/)
[Drupal CMS TOKYO (connpass) ](https://drupalcms-tokyo.connpass.com/)
nestjsでproxyを利用する

# nestjsでproxyを利用する

## 背景

docker containerを利用して、nestjsのportでviteのstatic renderingを利用しようとした。
HMRをnestjsのview層から配信するように実装しようとすると、proxyを利用した方が楽そうだったので、nestjs側でviteのrun server向けにproxyを組むことを試してみた。

## 0. 前提と依存関係

| package | version | link |
|:---|:---|:---|
| nestjs | 10.4.9 | [docs](https://docs.nestjs.com/) |
| http-proxy-middleware | 3.0.3 | [repo](https://github.com/chimurai/http-proxy-middleware?tab=readme-ov-file) |

## 1. http-proxyを利用する

開発環で利用することを想定して、最低限の対応を実施

```proxy.ts
import { createProxyMiddleware } from 'http-proxy-middleware';

const PROXY_TARGET = "http://ui_container:4200"

const simpleRequestLogger = (proxyServer) => {
  proxyServer.on('proxyReq', (proxyReq, req) => {
    console.log(`[HPM] [${req.method}] ${req.url}`); // outputs: [HPM] GET /users
  });
  proxyServer.on('proxyRes', (proxyReq, req, res) => {
    console.log(`[HPM r] ${res} [${req.method}] ${req.url}`); // outputs: [HPM] GET /users
  });
  proxyServer.on('error', (err, req) => {
    console.log(`[HPM e] ${err} [${req.method}] ${req.url}`); // outputs: [HPM] GET /users
  });
};

export const proxy = createProxyMiddleware({
  target: PROXY_TARGET,
  changeOrigin: true,
  ws: true,
  plugins: [simpleRequestLogger],
});
```

proxyをcontrollerで利用する。
(middlewareというよりは、実態なのでcontrollerに記載した)。

```sample.controller.ts
import { Controller, Get, Next, Req, Res } from '@nestjs/common';
import { proxy } from '../libs/proxy';

@Controller('@vite')
export class ViteController {
  @Get('client')
  async proxyViteClient(@Req() req, @Res() res, @Next() next) {
    try {
      return await proxy(req, res, next);
    } catch (e: unknown) {
      console.log(e);
    }
  }
}
```
M5StickC Plus2で環境センサーの値を取得してMQTTで送信する

ラズパイにインストールしたmosquittoへ何かデータを送信したく、M5StickC Plus2に環境センサーを取得して、MQTTで送信するところまで作っていきます。

今回は以下のページを参考にしました。

https://logikara.blog/aws-iot-uiflow/

## M5StickC Plus2に環境センサーを繋いだ状態

![473651050_677492001279072_8195770564595890915_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/c7097c52-eb63-26a0-b629-e03604d8ed5a.jpeg)

![473558717_1351213632560048_519788459994201000_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/fed7e3e0-561e-fb54-8a8f-ede1af388c5f.jpeg)


## 環境センサーから値を取得

以下のようなプログラムで環境センサーからデータが取得できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/a8f7f066-ebcb-9df0-bbab-942ee970794f.png)

### 環境センサーのブロックを追加するとき

赤枠で囲んだUnitの横にある＋をクリックります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/7f0340ef-b638-39a2-5927-bb8c5cd634dd.png)

以下のようなダイアログが開くので、使用するユニットを選択し右下のConfirmボタンを押下します。

今回は、M5Stack用温湿度気圧センサユニット Ver.4（ENV Ⅳ）を使うので、ENV IVを選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/7343a12f-fe1a-018f-d73f-3c28ed98b8c7.png)

https://www.switch-science.com/products/9270?variant=42805209268422

追加が成功すると以下のように使えるブロックが増えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/912b5ddb-2a13-030b-0ebf-36f434acfd3f.png)

### MQTTのブロックを追加

赤枠のソフトウェアの＋ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/85766140-1065-82f4-a5e4-fe07e6a2272a.png)

以下のようなダイアログが開くので、今回はMQTTを選択してConfirmを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/0809393b-e769-7b15-336a-c9c485c9ef17.png)

ソフトウェアのMQTTのブロックが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/0e846bdf-4226-f452-9cd1-e47c5288faae.png)

## MQTTの送信処理を作ってみる

前回ラズパイ上に構築したMQTT Brokerは、ユーザ認証でしたので、Setupのブロックに以下の項目を設定しました。

|項目|内容|
|---|---|
|Set MQTT client id|任意|
|サーバアドレス|MQTT Brokerが動作しているサーバのIPアドレス|
|ポート番号|1883|
|ユーザ名|brokerで設定したユーザ名|
|パスワード|同じくbrokerで設定したパスワード|
|keepalive|0(デフォルト値)|
|SSL|false|
|MQTTをクリーンセッションで接続|true|

LoopのブロックにはトピックとデータとQoSを設定しました。
このループだと1秒おきにMQTTプロトコルで温度、湿度、気圧が送信されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/820a7faf-ff0d-a9f0-b7cf-0377495851f2.png)

### 受信確認
Windows上でMQTTXを起動して上記で設定したトピックと同じものでSubscription登録をします。
そうすると１秒ごとに気圧、湿度、温度の順に並んだ状態でデータを受信できています。

```
{"press": "気圧", "hum": "湿度", "temp": "温度"}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/ba9cc925-7d4b-19a5-d55a-8d49181fadb0.png)
【Python】リストの各種操作　※随時追加

リスト関連の操作まとめ。自分用チートシート。
学習の進度に合わせて、内容は随時追加する。

# 1. リスト内での演算
:::note info
最大値を求める　max(リスト名)
最小値を求める　min(リスト名)
合計値を求める　sum(リスト名)
:::
``` python
li = [1, 2, 3, 4, 5]

print(max(li))
# 5

print(min(li))
# 1

print(sum(li))
# 15
```

# 2. リストの並び替え
:::note info
sorted()
引数にはリスト名を指定。
デフォルトは昇順で、降順に並べ替えたい場合は引数`reverse`を`True`とする。
:::
``` python
li = [3, 5, 2, 4, 1]

# 昇順で並び替え
list_sorted = sorted(li)
print(list_sorted)
# [1, 2, 3, 4, 5]

# 降順で並び替え
list_sorted = sorted(li, reverse=True)
print(list_sorted)
# [5, 4, 3, 2, 1]
```

# 3. リスト内の特定要素をカウントする（countメソッド）
:::note info
リスト名.count(カウントする要素)
:::
``` python
li = [1, 1, 1, 2, 1, 3, 5, 1, 6, 0, 4]

print(li.count(1))
# 5
```

# 4. リスト内の特定要素のインデックスを取得する
:::note info
リスト名.index(取得する要素)
:::
``` python
li = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
print(li.index("f"))
# 5
```

# 5. リストの特定範囲を抽出
:::note info
リスト[n-1 : m]
n番目 ～ m番目までを抽出
:::

文字列から部分文字列を抽出する場合とほぼ同様、スライスを用いる。（下記URL、5-bの項）

https://qiita.com/shoko-h-s/items/ce76e841da54d125ed82
``` python
li = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]

# 3～5文字目を抽出
print(li[2:5])

# ['c', 'd', 'e']
```

# 6. リストを連結する
:::note info
リスト1 + リスト2
:::
``` python
list_1 = [1, 2, 3, 4, 5]
list_2 = ["a", "b", "c", "d", "e"]

list_new = list_1 + list_2

print(list_new)
# [1, 2, 3, 4, 5, 'a', 'b', 'c', 'd', 'e']
```

# 7. リストに要素を追加する
## 7-a. 末尾に追加する（appendメソッド）
:::note info
リスト名.append(追加する要素)
:::
``` python
li = [1, 2, 3, 4, 5]
li.append(100)

print(li)
# [1, 2, 3, 4, 5, 100]
```

## 7-b. 指定の位置に追加する（insertメソッド）
:::note info
リスト名.insert(インデックス, 値)
:::
``` python
li = [1, 2, 3, 4, 5]
li.insert(2, 100)

print(li)
# [1, 2, 100, 3, 4, 5]
```

## 7-c. 複数の要素を追加する（extendメソッド）
``` python
li = [1, 2, 3, 4, 5]
li.extend([6, 7, 8, 9, 10])

print(li)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

# 8. リスト内の要素を削除する
## 8-a. インデックスで要素を指定して削除
:::note info
del リスト名[インデックス]
:::
``` python
li = [1, 2, 3, 4, 5]
del li[0]

print(li)
# [2, 3, 4, 5]
```

## 8-b. 値で要素を指定して削除
:::note info
リスト名.remove(値)
:::
``` python
li = [1, 2, 3, 4, 5]
li.remove(4)

print(li)
# [1, 2, 3, 5]
```

# 9. リストから重複する要素を削除する
## 9-a. 順序の保持が必要ない場合
:::note info
set(リスト名)
:::
setメソッドは、set型のオブジェクトを生成する。
リストやタプルにしたい場合は、変換操作が必要。
``` python
li = [1, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6]
li_set = set(li)

# set型
print(li_set)
#  {1, 2, 3, 4, 5, 6}

# リスト
print(list(li_set))
#  [1, 2, 3, 4, 5, 6]
```

## 9-b. 順序を保持したい場合
:::note info
dict.fromkeys(リスト名)
:::
`dict.fromkeys()`では新たな辞書オブジェクトを生成する。
リストやタプルにしたい場合は、変換操作が必要。
``` python
li = [3, 4, 2, 3, 5, 1, 4, 2, 1, 5, 0]
li_dict = dict.fromkeys(li)

# 辞書オブジェクト
print(li_dict)
# {3: None, 4: None, 2: None, 5: None, 1: None, 0: None}

# リスト
print(list(li_dict))
# [3, 4, 2, 5, 1, 0]
```


# 10. リスト内の全ての要素への演算
例題として、`li = [1, 2, 3, 4, 5]`の全ての要素を2乗して出力する。
for文を用いて記述した場合は以下の通りとなる。
``` python
li = [1, 2, 3, 4, 5]

for i in range(len(li)):
    li[i] = li[i]**2

print(li)
```
## 10-a. リスト内包表記
for文よりもシンプルに記述ができ、処理速度も速くなる。
``` python
li = [1, 2, 3, 4, 5]

li_new = [n**2 for n in li]

print(li_new)
# [1, 4, 9, 16, 25]
```
## 10-b. lambda式

``` python
li = [1, 2, 3, 4, 5]

li_new = map(lambda n: n ** 2, li)

print(list(li_new))
# [1, 4, 9, 16, 25]
```
(その3).構造体で遊ぶ。(memcpyでセット)


x M5NanoC6での予定は、未定


目的
ポインターとメモリ操作でmemcpyする


いろいろ
やっぱり、アクセスカウンターが回らなくなった。
ちょっと、難しいかな?
(文法的には、あっていると思う)
(もう少し、改良できるはず?)
(おなかが、減ったので、まっ牛、食べに行こう!!!)


```c++

#include <iostream>
#include <string.h>  //memcpy
using namespace std;
int main(void){
    // Your code here!
    printf("START\n");
    
    struct {
        char a;
        char b;
        char c;
    } ABC;
    
    char *c;
    c = (char *)(&ABC);

    memcpy(c, "ABC", 3); 

    printf("a=[%c]\n",ABC.a);
    printf("b=[%c]\n",ABC.b);
    printf("c=[%c]\n",ABC.c);
    
}//main


```


```

START
a=[A]
b=[B]
c=[C]

```
Kotlin Koans やってみた 7

# Introduction
## Lambdas
### 問題
Kotlin は関数型プログラミングをサポートしています。Kotlin でラムダ式について学びましょう。
ラムダ式を `any` 関数に渡して、コレクションに偶数が含まれているかどうかを確認できます。
`any` 関数は条件（述語）を引数として受け取り、少なくとも1つの要素がその条件を満たす場合に true を返します。

### 解答
```kotlin
fun containsEven(collection: Collection<Int>): Boolean =
    collection.any { it % 2 == 0 }
```

### 解説
[Kotlin 公式ドキュメント > it: implicit name of a single parameter](https://kotlinlang.org/docs/lambdas.html#it-implicit-name-of-a-single-parameter)

#### it: 単一のパラメーターの暗黙的な名前
ラムダ式でパラメーターが 1 つだけの場合は非常によくあるパターンです。

もしコンパイラーがパラメーターなしでシグネチャを解析できる場合、そのパラメーターを明示的に宣言する必要はなく、`->` を省略できます。この場合、パラメーターは `it` という名前で暗黙的に宣言されます。

```kotlin
ints.filter { it > 0 } // このリテラルは型 '(it: Int) -> Boolean' のラムダ式です
```

# おわりに
パラメーターが 1 つだけの場合に `->` を省略できるのは知らなかった！！！
そして、`.any()` が boolean を返してくれることも知らなかった！！！
Koans を今までスルーしてきてしまったことに後悔している。
先人たちの「公式ドキュメントにあるチュートリアルをまずやる」は正しいと改めて感じる。騙されたと思ってとりあえずやってみようと思う。「ほんまや〜」って某S氏の声が聞こえてきそうだ(笑)

---

[← 前回の記事](https://qiita.com/b-yuko/items/6a4c8ba209c71c6e779a)　|　[次回の記事 →](https://qiita.com/b-yuko/items/5d3ad8151276d98b73fe)
アジャイル開発：社内のステークホルダーの洗い出し

# はじめに
アジャイル開発に限ったことではないが、ステークホルダーの洗い出しについて記事を書こうと思う。
意外とステークホルダーをちゃんと明記して、チームメンバ全員の認識として共有しているプロジェクトって少ないように思えるためだ。

ステークホルダーは株主や競合他社なども含めるが、この記事では開発側で意識すべきステークホルダーに観点を絞った内容を記載していく。

## そもそもステークホルダーを適当にしか認識していなかったら？
こうなります。

```
例１）
POのA氏に合意を取ったから開発着手して良いだろう！
・開発メンバに仕様を詰めてもらう
・細かい仕様も含めてOK！
・設計もOK！
　→さあ開発だ！というところで、PO以外の部署からNGを食らって開発中断。。
```
本当に萎えるでしょうぅぅ:frowning2:

```
例２）
PO含め、他の関係部署からも合意をもらう
・開発着手！
・コーディング終わり！疎通確認終わり！
・PRレビューも終わり！
・テストも終わり！
　→さあリリース準備だ！というところで、設計の承認が通っていないとことで、この段階で設計承認会議に参加。。
 　設計でNGを食らって手戻り。。。
```
これも本当に萎えるでしょうぅぅ:frowning2:

ステークホルダーマネジメントの失敗事例を箇条書きで挙げると以下となる。
1.	攻撃的なコミュニケーションになってしまう
2.	若手社員が顧客最優先の姿勢で社内調整を強引に進めた結果、同僚との信頼関係が崩壊し、プロジェクトが停滞。
3.	配慮不足の態度
他部署への敬意を欠いたマーケターが、頻繁に衝突を起こし、最終的にプロジェクトから外された。
4.	リスク共有の遅れ
リリース遅延時にリスクを早期報告しなかったため、プロジェクトが破綻。
5.	要件定義の不備
ユーザーと開発者間の期待値ギャップが埋まらず、コスト増大や機能漏れが発生。

# ステークホルダーを把握するのはなぜ必要なの？
失敗例から分かる通り、当然と言えば当然ですが個人開発でない限り開発には"色んな人"が関わってきます。
開発を進める上で、その"色んな人"に確認を取る必要があるわけです。

当然だろうぅ？と思うかもだけど、ここ出来てなくて痛い目に遭うプロジェクトは結構あるんだぜ。。。
特に大きなプロジェクトで、関係者がいっぱい、関係している会社がいっぱいのところとかは特にね。

社内のステークホルダーに確認する必要がありそうな内容としては、例えば以下となる。

## 仕様確認、設計の方式確認
　デザイン、分析、性能系、テスト系、
 　また、調査・検討した結果のレビューが必須な場合もある（DB設計、ディレクトリ/クラス設計、保存の仕方(アプリで持つの？サーバで持つの？他サービスと連携するの？とかね)

## 要件や仕様確認
　特に要件や仕様について合意をとるべき相手をよく確認しておこう

## 開発を進める上での承認フロー
　プロジェクトやサービスによってこの辺りは大分変わってくるが、
 　リリースまでに必要な承認フローをよく理解し、承認をもらう担当者を抑えておこう
  （無駄なプロセスもあるケースもあるが、改善するにしても抑えておく必要があるのでここもよく理解しておく）

## 技術的に困った場合の相談先
　迅速に開発を進めていく上で技術的に困った場合の相談先も抑えておく。
　相談先の例）チームメンバー、有識者、テックリード、PLやGLなど

# 開発を進める上でのステークホルダーを洗い出すためには？
開発を進める上での開発フローや承認フローを明確化できていないと、関係者が洗い出せない。
そのため、まずは開発フローや承認フローを洗い出すことが必要となる。
※細かい部分で言えば、新しいツールの導入方法、アクセス権の申請方法なども抑えておき承認先も抑えておく

# ステークホルダーの洗い出しを行う際に気をつけるべき点
1.	直接・間接の分類：
ステークホルダーを「直接的関係者」（プロジェクトメンバー、承認者、クライアントなど）と「間接的関係者」（外部組織、規制機関など）に分けることで、漏れを防ぎます。
2.	役割と影響度の明確化：
単なる名前のリストではなく、各ステークホルダーの役割やプロジェクトへの影響度を明記し、全員で共有します。
3.	関心と権力の分析：
ステークホルダーごとに関心度と権力を評価し、優先順位をつけて対応計画を立てます。

# 社内のステークホルダーの例
・自分の所属する開発チームのメンバー
　開発メンバ、PL/UL, GL, PO, PM, テックリード, レビュアー、有識者など
・他Unitや他チームの開発メンバ
　自分のUnitやチーム内のメンバだけでなく、関係がありそうな他Unitや他チームの担当者も挙げておく
・開発以外のチームメンバ
　開発以外で関係がありそうな担当者を挙げておく
 　例）デザイナー、QA担当、営業担当、法務担当 etc...
・エンドの顧客（特に開発側に問い合わせなどが降ってきそうな顧客）
・役員


# 最後に
ステークホルダー特定の最も重要なステップは、包括的なリストアップです。
開発を進める上でプロジェクトや企業活動に影響を与える、または受ける可能性のある全ての関係者を網羅的に洗い出すことが基盤となります。
この初期段階で重要な人物や団体を見逃さないことが、後続の分析や改善、また効率的な開発につながる鍵となります。




以上