OmniAICreator/Qiita-1.07M huggingface dataset:
Difyのフローにrocadocのドキュメント前処理を組み込んでみた


# 1. はじめに

Dify上からrokadocのドキュメント変換処理を呼び出すフローを作成しました。

構築にあたり、以下を参考にさせていただきました。

https://zenn.dev/timoneko/articles/dcfae1a8331f51

構築したDifyのフローの全体像はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323946/ac2d9556-eaa5-4128-90ae-bbd2841125a2.png)

- 各ノードのイメージ
   - 開始：ファイルをアップロード
   - HTTPリクエスト：rokadocのエンドポイントへアクセス&ドキュメント前処理
   - LLM：LLMモデルにて処理
   - 終了：回答出力


# 2. 事前作業
## rokadocのエンドポイントURL/APIキー取得

エンドポイントのURL等はこちらを参照
https://portal.beta-api.rokadoc.ntt.com/api-details#api=roka-beta-v1&operation=doc2txt_api_doc2txt_post

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323946/fe93e74c-5663-4226-8da5-c8f7e57c0126.png)

rokadocの利用サブスクリプションには、２種類あります。
- 本番PoC用サブスクリプション：管理者へ問い合わせが必要
- 試用サブスクリプション：登録すれば利用可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323946/ef4d6250-7988-4a0c-9041-f682cd22bfff.png)

今回はお試しなので、試用サブスクリプションを利用しています。
APIキーをここで控えておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323946/2b6e28f3-ea0d-4e04-88eb-e5215bf92681.png)

# 3. フロー作成

## 開始
開始ノードではアップロードファイルを入力とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323946/a272453d-f2a4-4cd7-ac43-baaa2868dba4.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323946/c8085392-bc0d-43de-9498-7c54e21ba146.png)


## HTTPリクエストノード
事前に確認したrokadocのエンドポイントURLをPOSTのリンクに設定。
合わせて取得したAPIキーをヘッダーに追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323946/93a2e492-917c-4b6b-9f8a-efe7f4756879.png)



## LLMノード
今回は、出力結果を要約してもらうようプロンプトに設定します。
利用するLLMモデルは好きなものを選択。今回は最近少し気になっていた`qwen3`を選択してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323946/f1cf7789-f7c8-4b2e-81d4-c13ec4151cb6.png)


## 終了ノード
LLMの出力結果を出力しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323946/a4e42987-1b10-46f9-8ce0-041d5f6daaa3.png)


## テスト
上部の`▶︎実行`より動作テストを実施します。
問題なく回答出力できれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323946/62ec459b-cade-4a83-a184-517e11758bbb.png)

もし途中でエラーとなってしまい、想定した結果が帰ってこなかった場合は、`実行追跡`からエラー内容を確認してみましょう。
（私は、HTTPリクエストの設定がPOSTではなくGETになってしまっていたり、エンドポイントURLが間違ってしまっていたりで最初エラーが出てしまいましたが、修正することでうまくいくようになりました。）

## 4. まとめ
今回はDify上からrokadocのドキュメント変換処理を呼び出すフローを作成しました。
rokadocの試用サブスクリプションだと、変換処理は10回/週という制限があるため、テストを繰り返しているといつの間にが制限に引っかかってしまうこともあるかもしれません。
そのあたりは注意しつつ、利用できればと思います。
ClineからAtlassian リモートMCPを利用して、JIRAチケット(イシュー)の情報を取得する

# ✅ はじめに
Clineを利用してJIRAチケット（イシュー）の情報を取得する方法について備忘録として投稿させていただきま。

![Group 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141934/69b4e619-4e4f-4ab3-abe2-e6b5aa34f28e.png)

---

# ✅ 準備

## mcp-remote
`mcp-remote`をインストールする。
```
$ npm install -g mcp-remote
```

## MCPサーバ設定
MCPサーバ設定で「Configure MCP Servers」から`cline_mcp_settings.json`を開く。

![スクリーンショット_2025-06-01_0_56_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141934/47fed897-59e8-45ef-b429-f4ce1dc57498.png)

`cline_mcp_settings.json`にAttlasianのMCPサーバを設定する。
```json:cline_mcp_settings.json
{
  "mcpServers": {
    "atlassian": {
      "autoApprove": [],
      "disabled": false,
      "timeout": 60,
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://mcp.atlassian.com/v1/sse"
      ],
      "env": {},
      "transportType": "stdio"
    }
  }
}
```

---

# ✅ 動作確認
clineにJIRAチケットの取得を依頼する。

![スクリーンショット 2025-06-01 0.08.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141934/a71070a6-f359-4ba1-953a-5fd6ac69a7c6.png)

JIRAチケットの取得に成功すると、チケットの内容が表示される。

![スクリーンショット 2025-06-01 0.09.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141934/a5dcd350-a731-41b5-a0f0-b2886323139c.png)

:::note warn
エラーになる場合は、以下のトラブルシューティングをご参考に、MCPサーバからアカウント情報へのアクセスを許可してください。
:::

---

# ✅ トラブルシューティング

## ClineからAtlassianのMCPサーバに接続できない場合

**エラーメッセージ**
```
Error
Error accessing MCP resource: No connection found for server: atlassian

---

まだ「No connection found for server: atlassian」というエラーが表示されています。
MCPサーバーへの接続が確立されていないようです。
```

**解決方法**
以下のコマンドを実行して`mcp-remote`を起動する。

```
$ npx -y mcp-remote https://mcp.atlassian.com/v1/sse
```

コマンドを実行するとブラウザが起動して、Attlasianのログイン画面が表示される。
![id.atlassian.com_login_continue=https%3A%2F%2Fhome.atlassian.com%2F&application=atlas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141934/a260d5a0-e11f-4048-b6dc-5338b657e6cb.png)

ブラウザでログインに成功すると、MCPサーバからアカウント情報へのアクセスを許可する画面が表示される。

「Accept」をクリックするとJIRAの情報を取得できるようになる。

![api.atlassian.com_oauth2_authorize_server_consent_context=eyJraWQiOiJiOWY2OTVlZmM3MzgwN2QxNmNhNmNkMzQiLCJhbGciOiJSUzI1NiIsInR5cCI6Imp3dCJ9.eyJuYmYiOjE3NDg3MjQxODcsImlzcyI6ImF1dGguYXRsYXNzaWFuLmNvbSIsImlhdCI6MTc0ODcyNDE4NywiZXhwIjoxNzQ4N (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141934/06e32495-f304-4dc8-bcfb-f467a4b0fb2b.png)

---

# 📝 参考
https://community.atlassian.com/forums/Atlassian-Platform-articles/Atlassian-Remote-MCP-Server-beta-now-available-for-desktop/ba-p/3022084
【React】onClickの記述の仕方による関数の実行のタイミング

# 概要
ReactもJavaScriptも初心者ですので、間違いなどあったらご指摘お願いいたします。
「TODOアプリ」を作成時、未完了のTODOリストに要素の「追加」ボタンと「完了」ボタン、「削除」ボタンを実装していた。
各ボタンに対してonClickを実装した際に、ボタンによって適切な記述の仕方が違ったので、まとめておきます。

# onClickとは
onClickは、要素がクリックされたときに実行されるイベントハンドラーを定義するための特別な属性(イベントハンドラープロパティ)です。
```jsx
<button onClick={onClickHandler}>ボタン1</button>
```
上記のコードでは、「ボタン1」を押下(`click`)すると、`onClickHandler関数`が渡されます。

# 要素の「追加」ボタン
要素の「追加」ボタンは以下のように、`onClickAdd関数`を渡すことで実現できます。
```jsx
<button onClick={onClickAdd}>追加</button>
```
この時以下の点を理解できていなかったため、「完了」ボタンと「削除ボタン」の実装時に、予期せぬ挙動を生み出してしまいました。

- onClickAdd ← これは「関数の名前（参照）」です
- `onClickAdd関数`では、useStateを使って`set関数`を利用している
- onClick={onClickAdd} ← React に「この関数を**クリック時に実行してね**」と**渡しているだけ**

# 要素の「完了」ボタンと「削除」ボタン
これらも要素の「追加」ボタンと同様に記述すれば良いと考えたのが、**間違い**でした。
**<間違った例>** indexは完了する要素のキー
```jsx 
<button onClick={onClickComplete(index)}>完了</button>
```
- `関数()`という表記になっているため、`onClickComplete関数`が**即座に実行される**
- `onClickComplete(index)関数`では、useStateを使って`set関数`を利用している
- Reactがコンポーネントを再レンダリングする度に実行されるため、戻り値（多くの場合 **undefined**）を React に渡すことになる

→ その結果、**ボタンを表示した瞬間に実行**されてしまう。
しかも、それが再レンダリングのたびに起きると「複数回実行されたように見える」のです。
(試しに`onClickComplete関数`の中身をalert()に変更すると、ページが表示された瞬間に何回もウインドウが表示されます。)

# 解決法
「完了」ボタンと「削除」ボタンは、引数indexを取る必要があるため、`関数(index)`の形式を取らざるを得ない。
そのため、解決法としては、**アロー関数を使って関数の宣言**をすることで、**クリックされた時(後で実行する)関数**を渡すことができる。
**<正しい例>**
```jsx
<button onClick={() => onClickComplete(index)}>完了</button>
```
「削除」ボタンもこれと同様に対処します。

# まとめ
|書き方|実行タイミング|よくある要素|
|:--|--:|:--:|
|onClick={onClickAdd}|クリックされたとき|引数なしの関数|
|onClick={onClickComplete(index)}|**即座に実行される**（ダメ！）|バグの元|
|onClick={() => onClickComplete(index)}|クリックされたとき|引数ありの関数を渡す時|
Step FunctionsがJsonata対応で得られるメリット

AWS Step Functionsにおいて、2024年11月に[Jsonataによるデータ変換が正式にサポートされた](https://aws.amazon.com/jp/blogs/news/simplifying-developer-experience-with-variables-and-jsonata-in-aws-step-functions/)ことで、サーバーレスアーキテクチャにおけるワークフロー設計の柔軟性が大きく向上しました。これまでLambdaなどに依存していた部分を、より宣言的に表現できるようになります。

### Jsonataとは？なぜ注目されているのか

Jsonataは、JSONデータを対象としたクエリ言語・式言語で、XPathのような簡潔な構文で複雑なデータの加工が行えます。AWS Step Functionsでこの言語が使えるようになったことにより、単純な値の抽出だけでなく、以下のような処理がステートマシン内で実現可能になりました。

- 条件によるフィルタリング（例：価格が一定以上の商品だけを抽出）
- 配列のマッピング（例：オブジェクトの一部フィールドのみ抽出）
- 集計や構造の再構築（例：合計金額の計算、階層構造の変換）

これらは従来、Lambda関数で処理せざるを得なかった領域です。

### AWS Step Functionsとの統合ポイント

Jsonataが使える場面は限定されており、`.foo.$`形式で動的に値を設定する構文に対して適用されます。たとえば、`Parameters`や`ResultSelector`など、ステート定義の中でデータ構造を操作するフィールドに対して使うことが可能です。

具体的な利用場面としては、以下が挙げられます：

- Mapステート内での配列フィルタリングや加工処理
- Choiceステートにおける柔軟な分岐条件の構成
- Parallelステート間でのデータ整形や中間結果の統合

これにより、ワークフローのロジックをより「宣言的に」定義できるようになります。

### 実運用における注意点と設計指針

Step FunctionsにおけるJsonataの活用は強力な一方で、設計上の注意も必要です。

- **式の複雑さに注意**：Jsonataは表現力が高いため、複雑な式を書くと可読性が一気に低下します。チームでの運用を前提に、式はできる限り簡潔に保つことが望ましいです。
- **処理の限界を意識する**：あくまで補助的な変換手段として使い、重い処理は依然としてLambdaなどに任せるのが無難です。
- **型や存在チェックに注意**：Jsonataではキーの存在確認などを自分で書く必要があるため、想定外のデータ構造が来た場合の挙動に留意してください。

Jsonataの式は、AWS公式ドキュメントにある[Step Functions での JSONata を使用したデータの変換](https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/transforming-data.html)を参考に段階的に試すのがよいでしょう。

### 活用例
Jsonataを活用した例を1つ紹介します。
もともと、あるStep FunctionsのStateMachineにおいて、後続のECSTaskなどにパラメータを渡すためにLambdaを呼び出し、そのLambda内でパラメータを組み立てて返す処理がありました。
そのLambdaは複数のStateMachineから呼び出されるようになっており、各StateMachineの要求を満たすためにコード量も増えて可読性が低いものになっていました。
処理としても無駄であるため、できればStep Functionのみで表現したいと思っていました。
以下はその変更過程の一部を切り出したものです。
```
  "States": {
    "define_variables": {
      "QueryLanguage": "JSONata",
      "Type": "Pass",
      "Next": "shops",
      "Assign": {
        ...
        "company_id": "{% $states.input.company_id %}",
        "shop_ids": "{% $states.input.shop_ids %}",
        "execution_id": "{% $states.input.execution_id ? $states.input.execution_id : $uuid() %}",
        ...
      }
    },
```
このStateMachineは呼び出しの際に「execution_idを渡されたらそれを利用し、渡されなければ新規にuuidを発行する」ということが必要でした。
従来であればそのような条件分岐はStep Functionsでは表現できなかったためLambda Functionを作成して呼び出す必要がありましたが、Jsonataが使えるようになってから上記のように1行で表現できるようになりました。
これ以外にもデータ整形などにおいて従来よりかなり柔軟に対応できるようになりました。

### 今後の活用に向けて

Jsonataの導入により、Step Functionsは単なる状態遷移エンジンから、 **よりリッチなデータ制御が可能なDSL（ドメイン特化言語）** へと進化しました。クラウドネイティブなワークフローの設計において、記述量の削減、依存の低減、保守性の向上を実現できる新しい選択肢として、ぜひ積極的に検証・導入してみてください。
さくらクラウドのシンプル監視をAPIで操作した

# モチベと概要

10件以上のウェブサイト、ウェブアプリが元気かどうかをインフラ外から監視したい。

さくらのシンプル監視を採用したらWeb APIが充実してるので、APIで一気に登録すれば楽そうだ。
と思ったら、ドキュメントがない、、、？

ないと思ったが、よく読んだらあった。「共通サービス」というリソースに属しているらしい。

→ https://manual.sakura.ad.jp/cloud-api/1.1/appliance/index.html#get_commonserviceitem

これに気づけず、読まずにダッシュボード上のログだけみてRubyで叩けるようがんばった。できた。

# 改めてさくらのシンプル監視とは

1設定あたり22円/月でいい感じに監視してくれる。例えば https://www.phalanxware.com をみる。など。

# コード

以下みたいに準備して

``` ruby
require 'net/http'
require 'dotenv'
require 'json'
require 'yaml'

Dotenv.load

token = ENV.fetch('SAKURA_ACCESS')
secret = ENV.fetch('SAKURA_SECRET')
zone_id = 'is1a'
api_version = '1.1'
tags = ['FromAPI']

base_url = "https://secure.sakura.ad.jp/cloud/zone/#{zone_id}/api/cloud/#{api_version}/"

uri = URI.parse(base_url + '/commonserviceitem')
```

こんなようなYAMLを用意して

``` YAML
services:
- fqdn: www.phalanxware.com
  port: 443
  protocol: https
  description: 自社サイト
  response_status: 200 # 期待値
  skip: false
```

これを以下みたいに読み込んでループすればOK。すでに設定されているか確認していないので、リソースがどんどん再登録されてしまうので注意。

``` ruby
YAML.load_file('target.yaml')
    .fetch('services')
    .select { it.fetch('skip') == false }
    .each do |service|
    params = {
    "CommonServiceItem": {
      "Name": service.fetch('fqdn'),
      "Status": {
        "Target": service.fetch('fqdn')
      },
      "Settings": {
        "SimpleMonitor": {
          "HealthCheck": {
            "Protocol": service.fetch('protocol'),
            "Host": service.fetch('fqdn'),
            "Port": service.fetch('port').to_i,
            "Path": "/",
            "Status": service.fetch('response_status')
          },
          "Enabled": "True",
          "NotifyEmail": {
            "Enabled": "True",
            "HTML": "False"
          },
          "NotifySlack": {
            "Enabled": "False"
          },
          "DelayLoop": 60,
          "MaxCheckAttempts": 3,
          "RetryInterval": 10,
          "Timeout": 10
        }
      },
      "Provider": {
        "Class": "simplemon"
      },
      "Tags": tags,
      "Icon": {},
      "Description": [
          "my-company-servers", 
          service.fetch('description')
      ].join(' - ')
    },
    "Count": 0,
  }

  req = Net::HTTP::Post.new(uri.path.to_s)
  req.basic_auth(token, secret)
  req.body=(JSON.generate(params))

  https = Net::HTTP.new(uri.host, uri.port)
  https.use_ssl = true
  res = https.start do |x|
    x.request(req)
  end

  pp res.code
  pp res.body

  pp JSON.load(res.body)  
end
```
【完全ガイド】Mac + nvm で Node.js のバージョンを自由に管理する方法

複数のプロジェクトで異なる Node.js バージョンが必要になった経験はありませんか？
そんなときに便利なのが \*\*`nvm`（Node Version Manager）\*\*です。

この記事では以下のことをすべてカバーします：

* `nvm` のインストール（Homebrew）
* 利用可能な Node.js バージョン一覧表示
* 任意のバージョン選定・インストール
* `pnpm`, `TypeScript` のグローバルインストール
* プロジェクトごとのバージョン固定（`.nvmrc`）
* VSCodeとの連携
* バージョンの切り替え

---

## 🛠 1. `nvm` のインストール（Homebrew 使用）

```bash
brew install nvm
```

インストール後、以下を **`~/.zshrc` または `~/.bashrc`** に追加：

```bash
export NVM_DIR="$HOME/.nvm"
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh"
[ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm"
```

反映：

```bash
source ~/.zshrc  # または source ~/.bashrc
```

---

## 🔍 2. インストール可能な Node.js バージョン一覧を表示

```bash
nvm ls-remote
```

### LTS（長期サポート）だけを表示：

```bash
nvm ls-remote --lts
```

---

## 📦 3. 任意の Node.js バージョンをインストール

```bash
nvm install 20.19.2      # 例：安定版 LTS の Node.js をインストール
nvm use 20.19.2          # 使用するバージョンを切り替え
nvm alias default 20.19.2  # デフォルトに設定（ログイン時に自動で切り替え）
```

確認：

```bash
node -v
npm -v
```

---

## 📦 4. グローバルパッケージ（pnpm / TypeScript）をインストール

```bash
npm install -g pnpm typescript
```

確認：

```bash
pnpm -v
tsc -v
```

---

## 📁 5. プロジェクトごとに Node.js バージョンを固定（`.nvmrc`）

プロジェクトルートに `.nvmrc` ファイルを作成：

```bash
echo "20.19.2" > .nvmrc
```

そのプロジェクトに入ったら：

```bash
nvm use  # .nvmrc を読み取って自動で切り替え
```

---

## 🧩 6. VSCode との連携（Nodeバージョン認識）

VSCode を開いても `nvm` のバージョンが使われない場合は、VSCode のターミナルで `which node` を実行し、`~/.nvm/...` のパスであることを確認してください。

もし反映されていない場合は：

1. VSCode を再起動
2. `code ~/.zshrc` で nvm の設定が入っているか確認
3. VSCode の「ターミナル」→「新しいターミナル」で再確認

また、プロジェクトごとに `settings.json` で以下を追加しておくと便利です：

```json
{
  "typescript.tsdk": "node_modules/typescript/lib",
  "terminal.integrated.defaultProfile.osx": "zsh"
}
```

---

## 🔁 7. バージョンの切り替え

バージョン一覧を確認：

```bash
nvm ls
```

使用するバージョンを切り替え：

```bash
nvm use 22.16.0
```

別バージョンのインストール：

```bash
nvm install 22.16.0
```

削除：

```bash
nvm uninstall 22.16.0
```

---

## ✅ おわりに

`nvm` を使えば、Node.js のバージョン切り替えが超スムーズになります。

複数プロジェクトを扱う方、バージョン差異でのバグに悩まされていた方にとっては必須級のツールです。

---

## 🚀 参考リンク

* [nvm GitHub公式](https://github.com/nvm-sh/nvm)
* [Node.js LTSスケジュール](https://nodejs.org/en/about/releases)
AtCoderをPythonで取り組んだ振り返り(ABC408 A~C)

どうもこんにちは！

今週のコンテストはBまで完答。CはTLEを解消できず。

# 問題

問題は以下のリンクから。解説を踏まえてCまでを振り返ります。

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

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

## A - Timeout -
最初を0秒として、$T_i$秒後にチェックポイントを合計N個置くとします。チェックポイント間の時間が1か所でも与えられたS+0.5秒以上となるならNo,そうでなければYesを出力する問題です。
シンプルにチェックポイントの時間からその前のチェックポイントの時間の差がS+0.5秒以上となっているかを1つずつ確認していけばよいとなります。このとき、+0.5秒があるので比較はfloat型でおこなうようにしています。
~~~Python
n,s = map(int,input().split())
k = [int(x) for x in input().split()]
k.insert(0,0)

ans = True
sec = 0
for i in range(n+1):
    if float(k[i] - k[i-1] - s) >= 0.5:
        ans = False
        break

print("No" if ans == False else "Yes")
~~~

## B - Compression -
与えられた長さNの整数列から重複を除いたときの長さを出力し、さらに列に含まれる値を小さい順に出力する問題。
一度集合にして重複を除去してリストに戻し、ソートして出力するとしました。
~~~Python
n = int(input())
s = [int(x) for x in input().split()]
s = list(set(s))
s.sort()

print(len(s))
print(*s)
~~~

## C - Not All Covered -
N個の城壁とM個の砲台があり、1個の砲台ごとに対応する城壁を守っているとします。(例えば1からN-3までの城壁を守る)砲台に守られていない城壁が存在する状態にするために、最小の砲台の破壊数を出力する問題。例えば4個の城壁と3個の砲台があり、砲台は1~4、3~4、2~4の城壁をそれぞれ守っているとすると、1~4を守る砲台を破壊すると1の城壁を守る砲台がなくなるので、答えは1個となります。なお、砲台の数の最大は$2×10^5$と2重ループはTLEになりそうな問題です。
~~(かつてランパートという、基地をテトリミノ的なものを使って囲むように城壁をつくり、砲台で相手側の城壁を壊すという対戦型のゲームがありましたね)~~
考え方としてはコンテスト中に城壁ごとに守っている砲台の数を数え、砲台を守る数の最小値が破壊する最小の数となるはずです。ただ、例えば1~5の城壁を守る砲台を処理するには2重ループとなるのでやはりTLEとなり、そこの解消ができませんでした。解説を読むといもす法を使えばよいとのこと。どっかで勉強した記憶がありますがすっかり抜け落ちていました・・・
ということで、実装したのが下記です。
~~~Python
n,m = map(int,input().split())
castle = [0 for _ in range(n+1)]
for _ in range(m):
    start, end = map(int,input().split())
    start -= 1
    castle[start] += 1
    castle[end] -= 1
for i in range(1,n+1):
    castle[i] += castle[i-1]

print(min(castle[:n]))
~~~


ではでは。
技術ぶろぐについておもうこと - 1年間定期投稿した感想-

### どうでもいいこと
技術ブログはそれまでときどき投稿していたのですが、ちょうど1年前から月に1度投稿することにしました。
せっかくの1周年記念なのでその所感でも書こうかという不純な動機からこの記事を書く事にしました。
なおqiitaのガイドライン的にはプログラミングに無関係な内容のものは扱ってはいけないようなので、エンジニアとしての心得という視点でこの記事を書こうとおもいます。
(学びになるのかとかね)

### そもそもエンジニアってなんでブログを書くの
なぜってそれは記事が参考になった経験がたくさんあるからです。
海外のフォーラムをのぞきに行ってそれで問題を解決できるといった凄腕エンジニアならそれでいいでしょう。
しかしわたしのような普通のエンジニア、ましては学生だったころには大いにブログが役にたった訳です。
その恩返しという訳です。
むかしはもっとインターネットは相助的なものという意識が広くあったので知見を共有するのはあたりまえという考えもありましたし、それもあるでしょう。

### 書くことで学んだこと1
書くのって大変なんです。
まずネタがない。
これが一番おおきいです。
毎月月末くらいになるとネタがない、ネタがないって嘆いていました。
ネタを仕入れるには技術検証しなければならず、さらにそれは色々な理由から本業(本業なんてものあるのか?)をつかえないからです。
つまり技術ブログを書いてくださっていた方々は100%善意で自分のリソースを割いてくださっていた訳です。
そのありがたさを実感しました。

### 書くことで学んだこと2 <- main
ようやく本題です。
なぜブログにすべきなのか、githubに投げ捨てておけば良いのでは?とか自分専用のめも帳をどっかに保存しておけばいいのでは?とか色々考えます。
むかしはわたしもそうでした。
しかしある時自身の限界を感じます。
人間はどこかに書いておかなければ忘れます。
すでにある情報を参照可能にしておきたいとおもったとき、ブログが適切であると感じました。
なぜならそれはアウトプットでありコメントだからです。
長年プログラミングをしてきたエンジニアならばわかるかとおもいますが、コメントを書かないエンジニアは ~~クソ~~ です。
中級者はよく黒魔術を書きます。
しかし上級者になるにつれ可読性こそが重要であると気付いてきます。
自分以外の人が(かろうじて)よめる文章こそが価値のあるコメントであり、ソースコードの価値です。
そうおもったとき、自分はひとりよがりであったとおもったのです。
githubに投げ捨てた場合、読んでくれる人は皆無でしょう。
(わたしはそれでも読みますが)
そうなった場合、へたくそで読まれる可能性があるものの方が良いのではと感じました。
documentを書く練習にはなったとおもいます。

### 継続は力なり
> 継続というとSchemeをおもい浮かべてしましますが…

幸いなことにQiita等の既存のブログサイトには継続利用のためのさまざまな機能があります。
そのひとつがバッジです。
以前github pagesでブログを書こうとして頓挫してしまったのですが、やはり既存のブログサイトには利用価値がります。
もし書きたい人がいらしたら自分でつくるのではなくそちらがおすすめです。
(自分でつくるとサイトづくりにむちゅうになって本末転倒になるのも理由です。)
みなさん良いブログLifeを
先輩がいないけど、AIのおかげで逆にメリットを感じている話

こんにちは、生成AIのおかげで最近本当に仕事が楽しいので記事を書こうと思いました。

### 経歴
新卒二年目のエンジニアです。バックエンドを担当していて、C#を触ってます。
二年目にしてバックエンドの先輩がいなくなってしまったので、現在は一人で実装をしています。

### 先輩がいないことがメリットになっている
先ほど書いたように現在一人で実装を行っていますが、本当に今気が楽です。
なぜかというと、上司のコード思想を自分のコードに反映させなくていいから。
自分で調査した結果をもとに、パフォーマンスだったりコーディングをしているのに、それを説明しても今のプロジェクトの構成がこうだから受け入れられないだとか、明らかに非効率なコードに突っ込みをいれることができませんでした。先輩が高圧的だと余計に委縮してしまい、諦めてしまっていました...

### 不安は生成AIがカバーしてくれる
私の所属している会社はそんなにAIを推進しているわけではないですが、Copilotを使用できる機会があり、せっかくなので参加しました。
このとき、参加して本当に良かったと心の底から思っています。
技術面での不安はAIがいるおかげで全く問題になっていません。
先輩がいない今、前から競技プログラミングをしていたこともあり、AIと相談しながらパフォーマンス改善を行うことができている今が本当に楽しいです。
もちろん、すべてを鵜呑みにするのではなく、何度か相談したうえで調査も行って自分で説明できる技術を取り入れています！

### 調査もAIがカバーしてくれる
パフォーマンス改善を行うとき、明確なボトルネックが不明な時にとりあえずworkspaceで相談すると大まかに原因っぽいところを教えてくれます。
これが非常に助かります。正誤は正直どちらでもよく、まずは原因を...っていう手順が大幅に短縮できることが何よりもありがたいです。それが本当に原因かは自分で調べます。

### でもやっぱり不安もある
ここまでAI最高！一人で実装楽しい！と書いていますが、不安ももちろんあります。
* 同じ目線でレビューしてくれる人が誰もいない
* あまり生成AIに明るくない人が多い
* インフラ周りはさすがにAIじゃ怖い

などなど...
それぞれの理由として、やはりレビューしてくれないと自分の調査が本当に正しいかわからない。自分が正義になってしまいそうなことが怖いです。
生成AIに明るくない人が多いことに関しては、そもそも会社としてちょっと不安です。今この激動の時代、いまだにAI使用が希望制なのは大丈夫かなと思っています...
インフラ周り、これはさすがにAIじゃ怖いです。特に参考文献少ないと全く信用なりませんし、お金が絡んでくるのでここだけはストレスがすごい

### おわり
とにかく今の気持ちを書きたくて、書きなぐった記事になってしまいました。
プログラマーがどうなるかはわかりませんが、今この時代を生きられていることに感謝しています。あとたまたまこのAIの時代に、新卒二年目は一人で実装できる環境に身を置けていることもとてもハッピー...とはいえこの環境が不安すぎるので、近いうちに転職出来たらなぁ。と思います。
【Mac】dfコマンドの使い方


`df`コマンドを使用するとファイルシステムのディスク使用量の概要を表示できます。

 https://keith.github.io/xcode-man-pages/df.1.html

##  すべてのファイルシステムとそのディスク使用量を 512 バイト単位で表示

```terminal
df
```

##  人間が読める単位（1024 の累乗ベース）を使用して総計を表示

```terminal
df -h -c
```

## 人が読める単位（1000の累乗）を使用して総計を表示

```terminal
df --si|-H
```

## 特定のファイルまたはディレクトリを含むファイルシステムとそのディスク使用量を表示

```terminal
df path/to/file_or_directory
```
stylelintで定義済み変数を使わずにハードコードされている値に警告を出すカスタムルールを作る

`css` や `scss` で定義された変数があるにもかかわらずチーム開発の中で `16px` や `4px` などのハードコーディングされた値が直接使われてしまうことがあります。
こうしたケースをコードレビュー前に自動で検出するため `stylelint` でカスタムルールを作成し、定義済みの変数を使うように警告を出す方法をまとめました。

今回は `scss` の利用を例として取り上げます。

## 対象の例

次のようなコードが対象です。

```scss
.example {
  font-size: 16px;
  border-radius: 4px;
}
```

これを以下のように置き換えるよう警告を出したいというのが目的です。

```scss
.example {
  font-size: $font-size-default;
  border-radius: $border-radius-small;
}
```

## カスタムルールの実装
`no-specific-values.js` をプロジェクト直下の任意のディレクトリ（例: my-custom-rules/）に配置します。

```no-specific-values.js
/**
 * 変数定義済の値に警告を出すルール
 */
const stylelint = require('stylelint');

const ruleName = 'my-custom-rules/no-specific-values';
const messages = stylelint.utils.ruleMessages(ruleName, {
  rejected: (property, value, suggested) => `${property}: ${value} は避け、定義済みの ${suggested} を使用してください。`
});

const ruleFunction = (primaryOption, _secondaryOption, context) => (postcssRoot, postcssResult) => {
  const validOptions = stylelint.utils.validateOptions(
    postcssResult, ruleName, { actual: primaryOption }
  );
  if (!validOptions) return;

  // 警告を出すプロパティとその推奨値
  const disallowedValues = {
    'font-size': {
      '14px': '$font-size-small',
      '16px': '$font-size-default',
      '18px': '$font-size-large',
    },
    'border-radius': {
      '4px': '$border-radius-small',
      '8px': '$border-radius-default',
      '16px': '$border-radius-large',
    }
  };

  postcssRoot.walkDecls((_decl) => {
    const decl = _decl;
    const { prop, value } = decl;

    if (disallowedValues[prop] && disallowedValues[prop][value]) {
      const suggestedValue = disallowedValues[prop][value];

      if (context.fix) {
        decl.value = suggestedValue;
        stylelint.utils.report({
          message: messages.rejected(prop, value, suggestedValue),
          node: decl,
          result: postcssResult,
          ruleName
        });
      }
    }
  });
};

module.exports = stylelint.createPlugin(ruleName, ruleFunction);
module.exports.ruleName = ruleName;
module.exports.messages = messages;
```

## stylelintにルールを読み込ませる
`.stylelintrc.js` にてカスタムルールを読み込みます。

```.stylelintrc.js
module.exports = {
  ~~~
  "plugins": [
    ~~~
    "./my-custom-rules/no-specific-values.js" // カスタムルールを読み込み
  ],
  "rules": {
    ~~~
    "my-custom-rules/no-specific-values": true // 追加![対応していない形式のファイルです。]()

  }
};
```

## 動作確認

コマンドラインやエディタで警告が出れば設定完了です

1\. エディタで赤線の警告が出ている様子

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42028/bbf36242-2eeb-4643-877e-eed24e44f62b.png" width="300" />

2\. エラー詳細には、推奨される変数が表示されます。

![スクリーンショット 2025-05-31 23.52.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42028/ede33168-fcdb-4dda-8fae-3b8527124eb3.png)


3\. さらに `--fix` オプションを使えば自動で以下のように修正されます。

```.scss
.example {
  font-size: $font-size-default;
  border-radius: $border-radius-small;
}
```

## おわりに

今回例に上げた `font-size` `border-radius` 以外にも、
同様のルールを他のプロパティ（例: `color`, `margin`, `padding` など）にも拡張できます。

チームのコーディングルールを自動チェックすることで、レビュー工数の削減とコード品質の向上が期待できます。
【Laravel】マイグレーションとER図の双方向同期でドキュメント管理を自動化

## はじめに
IT開発に従事している方は、ご存知かもしれませんが、大半のプロジェクトで開発仕様書が形骸化あるいは存在しないことがよく発生します。

仕様書の1つとして**ER図**が存在しますが、こちらは初期に作成されていても更新されず、実際のDB構造と乖離していることがほとんどです。結果として、現状のマイグレーションファイルしか信頼に足らず、マイグレーションや実際のテーブルを1つずつ読み解いてDB構造を理解する必要があります。

確かに「コードを更新したらER図も同期して更新する」べきです。
しかし、緊急性が低いタスクは後回しになりがちで、気づけば実態と完全に乖離したER図だけが残る...
そんな開発現場も多いのではないでしょうか？

そこで、LaravelのマイグレーションとER図(PlantUML)の双方向同期を可能にする機能をLACに追加しました。

LACの詳細やインストール手順については前回の記事をご覧下さい。
https://qiita.com/ChikauKume/items/fe29f6a9039632e91432

これにより、常に最新ソースコード基準でERを1コマンドで作成できますので、管理工数をなくした上で資料管理・作成が可能となります。もちろん開発仕様書の中には、画面遷移や基本設計書など様々なものが存在しますが、一旦ER図があればシステムとして一番重要なデータの流れの把握に役立つと思い、今回機能を作成いたしました。


## 実際の使い方
```
# ER図 → マイグレーションの場合
1. puml形式でファイルを作成し、storage/app/db/diagramsに配置
2. 下記コマンドを実行
php artisan lac:gen-migration
3. database/migrations 配下にマイグレーションファイルが生成される


# マイグレーション → ER図の場合
1. マイグレーションファイルを作成
2. 下記コマンドを実行
php artisan lac:gen-diagram
3. storage/app/db/diagrams/generated 配下に.pumlファイルが生成
```

実際の挙動についてご確認したい方は下記から閲覧可能です。
https://github.com/ChikauKume/laravel-arsenal-core/blob/main/README.ja.md


# おわりに
前回のScaffold機能などと併用することで開発効率をかなり上げることができますので、是非使ってみて下さい。

**📝 フィードバック・要望**
ご要望や改善案につきましては、下記GitHubのIssuesからお気軽にお寄せください。
👉 https://github.com/ChikauKume/laravel-arsenal-core/issues

この記事が役に立った方は、ぜひいいね！やコメント、シェアをお願いします。
C#のトップレベルステートメントでは、暗黙的にstring[] args定義されていて、コマンドライン引数を参照できる

.NET 10で、単一ファイルを`dotnet run`で実行できるようになる予定です（2025年5月末時点）

https://devblogs.microsoft.com/dotnet/announcing-dotnet-run-app/

これにより、トップレベルステートメントで作ったC#のコードに、コマンドライン引数を渡して実行したい場面が増えるでしょう。

C#のトップレベルステートメントでは、暗黙的にstring[]型のargsが定義されています。コマンドライン引数が入力された場合、args変数で入力されたコマンドライン引数を参照できます。

次のようなC#コード「hello.cs」を、

```csharp
if(args.Length == 0) {
    Console.WriteLine("args is empty.");
}

foreach(var arg in args) {
    Console.WriteLine(arg);
}
```

次のように`dotnet run`で実行します。（.NET 10 preview 4以降が必要）

```
dotnet run hello.cs -- Hello world! "I love C#."
```

すると、次のように表示されます。

```
Hello
world!
I love C#.
```

なお、args変数がnullになることはありません。コマンドライン引数が指定されなかった場合、空配列となります。

先のhello.csを、次のようなコマンドで実行すると、

```
dotnet run hello.cs
```

次のように表示されます。

```
args is empty.
```


`dotnet run file.cs`で、単一ファイルを実行できるのとても楽しみですね。


# リンク

https://learn.microsoft.com/ja-jp/dotnet/csharp/fundamentals/program-structure/top-level-statements


https://learn.microsoft.com/ja-jp/dotnet/csharp/fundamentals/program-structure/main-command-line

https://learn.microsoft.com/ja-jp/dotnet/csharp/tutorials/top-level-statements

https://devblogs.microsoft.com/dotnet/announcing-dotnet-run-app/
Pythonで法的文書を処理する（法律向けNLP）

法律文書を読んで、「えっ…まるで1800年代の英語を読んでいるみたい…」と思ったことはありませんか？私もです。

実は、1年前に**刑事弁護士**の友人が、古い判例ファイルのデジタル化を手伝ってくれと言ってきました。最初はOCRと整理だけだったんですが、ある日彼がこう言ったんです：「判決文を論調や主張のスタイルで検索できたら最高じゃない？」と。

その時、「うーん…検索ってそういう風には機能しないんだけど」と思ったんですが、そこから**自然言語処理（NLP）**というラビットホールに落ちていったんです。特に**法律文書**に使うと、まるで秘密の言語を解読する感じ。そしてPythonを使えば？驚くほど簡単でした。裁判官じゃなくても使えます。


![code1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4102515/e68d3d06-27d4-4f0d-afd6-aa8179f7c699.png)

---

## 検索では見つからない「法的な言い回し」をNLPで見つける

    法律文書って、契約書や判決、規則など、とにかく分かりづらくて読みにくいですよね。何かをしようと思っても、普通の検索では限界があります。

でもNLPを使えば、膨大な**情報**の中から意味のあるデータを取り出せるんです。Pythonでなら、意外と簡単に。[**探す**](https://bizhubdirectory.com)

---

## Pythonコード例

```python
from nltk.tokenize import word_tokenize

text = "被告人は合理的な疑いを超えて有罪とされた。"
tokens = word_tokenize(text)
print(tokens)
```

検索したい語句をトークン化して、意味ごとに分解できます。

---

```python
import spacy

nlp = spacy.load("ja_core_news_sm")
doc = nlp("2021年7月5日、アダムス判事がイリノイ州で判決を下した。")
for ent in doc.ents:
    print(ent.text, ent.label_)
```

これで判決の中から「誰が」「どこで」「いつ」を抽出できます。**刑事弁護士**にとっては大助かりです。

---

```python
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB

docs = ["これは刑事事件です", "これは民事事件に関するものです"]
labels = ["刑事", "民事"]

vec = CountVectorizer()
X = vec.fit_transform(docs)

clf = MultinomialNB()
clf.fit(X, labels)

print(clf.predict(vec.transform(["窃盗と暴行の罪"])))
```

文書の分類を自動化し、膨大な[**情報**](https://bizblogz.com)の整理が可能になります。

---

```python
doc = nlp("借主は毎月1日に家賃を支払うものとする。")
for token in doc:
    print(token.text, token.dep_, token.head.text)
```

契約文の「〜する場合」などの条件文も解析できます。これは**houses**関連の契約にもよく出てきます。

---

```python
from sklearn.decomposition import LatentDirichletAllocation
from sklearn.feature_extraction.text import CountVectorizer

texts = ["契約違反と罰則", "暴行と傷害の罪"]
vec = CountVectorizer()
X = vec.fit_transform(texts)

lda = LatentDirichletAllocation(n_components=2)
lda.fit(X)
print(lda.components_)
```

大量の判例からトピックを自動抽出してくれるので、法廷記録の整理に最適です。扱う[**データ**](https://lopezmoralesabogados.com/abogados-penalistas-en-bogota)が多くなるほど役立ちます。

---

## まとめ

PythonとNLPで法律文書を解析することで、手作業では無理だったことが次々とできるようになります。小さなスクリプトから始めて、まずは一つ試してみてください。今週中に一度試してみてください—you’ll see!!
クォータ設定時にクォータテンプレート値の変更は可能か

## 概要
現在、WIndows Sv 2022へのリプレ案件でファイルサーバのパラシを作成しています。

その中で表題についても考慮の必要があったのですが、社内に実機操作可能な環境がなく、web上でも確かな情報を得られなかったため、自宅で調べることにしました。

結論、クォータの作成ウィンドウで、クォータテンプレートの値をコピーした後、設定値を上書き設定することができました！

ベースとしてテンプレートを使用しつつ、通知の宛先のみ変更するなど柔軟な設定が可能です。

## 手順
:::note info
前提
下記手順はFSRMがインストール済み、クォータテンプレートが作成済みであることを前提としています。
:::
1. FSRMでクォータの作成ウィンドウを開き、[クォータのパス]を入力し、[カスタム クォータのプロパティを定義する]をONに設定する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/eaf97169-80eb-4e91-894b-6a55fc636b5c.png)
1. [カスタム プロパティ]をクリックする。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/695f5074-28b3-48be-88d6-bb0b09822f11.png)
1. [クォータ テンプレートからのプロパティのコピー]で適用したいテンプレートを選択し、[コピー]をクリックする。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/4c0071bf-6571-4e22-a64c-f6fc5f80b573.png)
1. テンプレートの設定値を変更する。今回は警告のしきい値を85%から80%に変更。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/dc8d97c7-4e7b-4dba-ab8c-5431e4685d9e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/ec43ada3-f052-4798-8dac-8ba613f5c034.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/be935e3c-29fa-41fb-84de-a354f9bdd552.png)
5. [OK]、[作成]と順にクリックし、設定を完了する。

## まとめ
以上です。
構築にあたり下記のページを参考にしましたので記載しておきます。



## 参考
https://tech.willserver.asia/2022/04/06/ws2022-fileserver/

https://learn.microsoft.com/ja-jp/windows-server/storage/fsrm/create-quota-template

https://learn.microsoft.com/ja-jp/windows-server/storage/fsrm/create-quota?source=recommendations
DeETF：オンチェーン投資における新たなパラダイム


## はじめに
近年、DeFi（分散型金融）の発展により、従来の投資手法がWeb3領域で再定義されつつあります。中でも注目を集めているのが「**DeETF（分散型上場投資信託）**」です。

DeETFは、従来のETF（上場投資信託）のような**分散投資の仕組み**をオンチェーンで実現するもので、スマートコントラクトを用いて**自動的な資産管理やリバランス**を可能にします。DeFiの高度な自動化・透明性と、ETFの利便性を組み合わせた新しい仕組みとして、今後のWeb3資産運用において大きな可能性を秘めています。

本記事では、DeETFの構造、技術的な特長、伝統的ETFとの違い、応用例について整理しながら、その可能性と課題について考察します。

## DeETFとは？

**DeETF（Decentralized Exchange-Traded Fund）**は、ブロックチェーン上で発行・運用される**トークン化されたアセットポートフォリオ**です。従来のETFが株式や債券に分散投資するのに対し、DeETFは以下のような暗号資産を対象とします：

- DeFiガバナンストークン（例：AAVE, UNI, COMP）
- セクター別トークン（例：GameFi、AI関連）
- テーマ型戦略に基づくトークン群（例：L2エコシステム、リアルワールドアセット系）

これらをスマートコントラクト上で管理し、価格オラクルやAIアルゴリズムと連携することで、**プログラム可能なリバランス戦略**を実装できます。

## スマートコントラクトによる実装概要

以下は、DeETFの基本的な構造を示したSolidityベースの疑似コードです。

```solidity
contract DeETF {
    address[] public assets;
    uint256[] public weights;
    address public oracle;

    constructor(address[] memory _assets, uint256[] memory _weights, address _oracle) {
        require(_assets.length == _weights.length, "Length mismatch");
        assets = _assets;
        weights = _weights;
        oracle = _oracle;
    }

    function rebalance() public {
        // オラクルから価格を取得し、アルゴリズムでweightsを再調整
        // DEX上でトークンのスワップを実行
    }

    function redeem(address user, uint256 amount) public {
        // ETFトークンをバーンし、対応する資産を返却
    }
}
```

実際のDeETFプロトコルは、Uniswap V3やBalancerなどのDEXとの連携、価格フィードの自動取得、AIによる市場分析など、さらに高度なロジックを組み込みます。

## 伝統的なETFとの違い

| 項目 | 伝統的ETF | DeETF |
|------|-----------|-------|
| 発行主体 | 資産運用会社 | スマートコントラクト / DAO |
| 取引場所 | 証券取引所 | 分散型取引所（DEX） |
| 対象資産 | 株式・債券 | 暗号資産・NFT・プロトコルトークンなど |
| 透明性 | 四半期開示 | オンチェーンでリアルタイム検証可 |
| アクセス性 | KYC必要 | ウォレット接続のみでOK |
| 自動化 | 低 | 高（AI・スマコン連携） |
| コンプーザビリティ | 低 | 高（担保・ステーキング等に利用可能） |

## 技術的なメリット

### 1. 自動リバランス機能
ChainlinkやPythなどのオラクルから価格を取得し、事前定義されたアルゴリズム（あるいはAIエージェント）を用いて、自動的に資産配分を調整することができます。これにより、ユーザーは市場の変動に逐一対応せずとも、パッシブな投資が可能になります。

### 2. コンポーザブル性
DeETFはERC-20（またはSPL）トークンとして発行されるため、以下のように**DeFi内で他のプロトコルと組み合わせて活用可能**です。

- 担保として利用（Aave等）
- LPトークンとしてステーキング
- 他のDeETFとの組み合わせによる複合戦略構築

### 3. クロスチェーン対応
WormholeやLayerZeroなどのブリッジを使えば、Ethereum以外のチェーン（Solana、Base、Sui、Polygonなど）とも連携可能です。これにより、ユーザーは好きなチェーンでDeETFを保有・運用でき、流動性がさらに高まります。

## ユースケース例

| タイプ | ユースケース |
|--------|--------------|
| 初心者投資家 | L2系トークンやMemeコインのバスケットを1クリックで購入、リスク分散 |
| テーマトレーダー | AI・GameFiトークンにフォーカスしたセクターETF |
| DAO運営 | 自プロジェクトのエコシステムトークンをインデックス化し、参加者に提供 |
| ストラテジスト | 自作AIモデルをDeETF化して商用展開、他ユーザーに提供可能 |

## 技術的課題と展望

DeETFの導入にあたっては以下のような課題も存在します：

- **価格オラクルの信頼性**：価格取得が正確でなければリバランスも破綻
- **AI戦略の透明性と信頼性**：ブラックボックス化のリスク
- **ガス代の最適化**：頻繁なリバランスはコスト増に直結

一方で、アカデミック領域やZK技術の発展と共に、AIとスマートコントラクトの組み合わせが進化すれば、「**自律的に最適化され続けるオンチェーン投資ポートフォリオ**」の実現が見えてきます。

## おわりに

DeETFは、「オンチェーンで自律的に資産運用を行う」という新たな投資パラダイムの入り口です。DeFiユーザーにとってはポートフォリオ管理の簡素化、プロトコル運営者にとっては資産運用商品の提供手段として、幅広い応用が期待されます。

今後、より高度な戦略、クロスチェーン統合、AI連携などが進むことで、DeETFは単なるETFの模倣にとどまらず、**Web3時代に特化した新たな資産運用インフラ**へと進化するかもしれません。

---

🧠 ご意見・ご質問があれば、コメントまたはTwitterでぜひお知らせください！  
🔗 技術スタックや関連プロトコルについても今後の記事で深掘りしていきます。
【react-hook-form】入力文字数によりバリデーションの設定方法

# はじめに
`react-hook-form`を使用していて、「入力文字数」に関するバリデーションの実装方法で少し混乱したので、整理がてら記事にまとめておきます。

:::note warn
***この記事は<font color="Red">個人的なアウトプット</font>を目的として作成したものです。そのため、誤った情報や不足している内容が含まれている可能性があります。もし間違いや気になる点がございましたら、ぜひご指摘いただけますと幸いです***。
:::


# 実装パターン
## パターン1：5文字を超えたらエラーメッセージを表示したい
これは`react-hook-form`の`maxLength`オプションを使う方法です。バリデーションの失敗時にエラーメッセージを表示できます。

```react
import { useForm, SubmitHandler } from "react-hook-form"

type Inputs = {
  name: string
}

export default function App() {
  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm<Inputs>()
  const onSubmit: SubmitHandler<Inputs> = (data) => console.log(data)

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input {...register("name", { required: true, maxLength: {value: 5, message: "最大5文字です",},})} />
      {errors.name && <span>{errors.name.message}</span>}
      <input type="submit" />
    </form>
  )
}
```
`value`には最大文字数、`message`にはバリデーション失敗時に表示するメッセージを指定します。



## パターン2：5文字以上をそもそも入力できないようにする
この方法は**HTMLの<input>属性としてのmaxLength**を使います。バリデーションではなく「入力制限」として働きます。

```react
import { useForm, SubmitHandler } from "react-hook-form"

type Inputs = {
  name: string
}

export default function App() {
  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm<Inputs>()
  const onSubmit: SubmitHandler<Inputs> = (data) => console.log(data)

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input maxLength={5} {...register("name", { required: true,})} />
      {errors.name && <span>This field is required</span>}
      <input type="submit" />
    </form>
  )
}
```
`maxLength={5}`とすることで、そもそも**6文字目を入力できなくなります**。

## 2つの違い
| 種類                             | 内容                         | 使用目的         | 挙動の違い                   |
| ------------------------------ | -------------------------- | ------------ | ----------------------- |
| `register(..., { maxLength })` | `react-hook-form`のバリデーション用 | フォーム送信時のチェック | 入力はできるが、バリデーションエラーで送信不可 |
| `<input maxLength={5}>`        | HTMLの入力制限                  | 入力自体を制限したい時  | 6文字目以降は入力できない（打てない）     |


# 終わりに
同じ「maxLength」でも、`react-hook-form`のバリデーション用とHTML属性の制限用で挙動が異なるため混乱しました。

# 参考
『react-hook-formのminやmaxLengthルールにエラーメッセージを設定する』　Zenn

https://zenn.dev/kenara/articles/744607ec0705f8

http://html5.cyberlab.info/elements/forms/input-maxlength.html
Railsのclass_methodsってなに？

## はじめに
railsのソースコードの中で簡単そうなメソッドを探していたら、class_methodsを見つけました。深ぼってみたら、今後の開発に活かしたいと持ったのでその備忘録です。

## 使い方
class_methods はモジュールのメソッドを、include先のクラスのクラスメソッドとして使ってねという指示。
``` ruby
module MyFeature
  extend ActiveSupport::Concern

  class_methods do
    def greet
      puts "こんにちは"
    end
  end
end

class User
  include MyFeature
end

User.greet  # => こんにちは
```
これ、普通に def self.greet で書けばよくない？とおもったのですが、

```ruby
module MyFeature
  def self.greet
    puts "こんにちは"
  end
end

class User
  include MyFeature
end

User.greet  # => ❌ エラーになる！
```

self.greetしたらモジュール自身のメソッドとなり引用先のクラスには渡らない。このように、class_methods を使うことで、モジュールの機能をクラスに自然に拡張できるのが特徴です。


## まとめ
- def self.xxx はモジュール自身のメソッドになるので、include先のクラスには渡らない
- class_methods do ... end を使うことで、include先のクラスにクラスメソッドを自然に追加できる
Replit と Windsurf を SSH で連携した際、最後にパスワードを求められてしまう問題

![スクリーンショット 2025-05-31 20.40.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037700/472c77f5-dae0-44a0-9df5-375283c47674.png)

## 課題
https://www.youtube.com/watch?v=WHh6TJxSV6o
上記のサイトの順番に連携を進めたところ、
最後の最後で、画面のようなパスワードを入力してくださいというものが提示され、
それが突破できていない状況です。
これを解決するためにはどのようにすればよろしいでしょうか？

もしアイデアいただけるようでしたら、どうぞよろしくお願いいたします🙇
ABC408をPythonで（A～D）

AtCoder Beginner Contest 408の解答等の速報的まとめ

https://atcoder.jp/contests/abc408



# A問題
https://atcoder.jp/contests/abc408/tasks/abc408_a

T の先頭に 0 を加えて隣接する要素の差が s 以下なら Yes
```python:A
n, s = map(int, input().split())
t = [0] + list(map(int, input().split()))

print("Yes" if all(t[i + 1] - t[i] <= s for i in range(n)) else "No")
```


# B問題
https://atcoder.jp/contests/abc408/tasks/abc408_b

set に入れてソートする
```python:B
n = int(input())
a = sorted(set(map(int, input().split())))

print(len(a))
print(*a)
```


# C問題
https://atcoder.jp/contests/abc408/tasks/abc408_c

imos法

各城壁がいくつの砲台に守られているかを調べる
あとはimos法の演習問題
```python:C
n, m = map(int, input().split())

lst = [0] * n

for _ in range(m):
    l, r = map(lambda x:int(x) - 1, input().split())
    lst[l] += 1
    if r + 1 < n:
        lst[r + 1] -= 1

for i in range(n - 1):
    lst[i + 1] += lst[i]

print(min(lst))
```


# D問題
https://atcoder.jp/contests/abc408/tasks/abc408_d

まず、01で交互になるよう圧縮
左右それぞれで端から条件に矛盾しないように変更する最小手数を計算
最後に左右を組み合わせて答えを求める
```python:D
def make_list(a):
    res = [[0, 0]] # ここを[0, 1]にしても矛盾しない最小変化手数
    for string, a_i in a:
        if string == "0":
            res_i = [res[-1][0], min(res[-1]) + a_i]
        else:
            res_i = [res[-1][0] + a_i, min(res[-1])]
        res.append(res_i)
    return res


INF = float("inf")
for _ in range(int(input())):
    n = int(input())
    s = input()

    lst = []
    for s_i in s:
        if not(lst and lst[-1][0] == s_i):
            lst.append([s_i, 0])
        lst[-1][1] += 1

    if len(lst) <= 2:
        print(0)
    else:
        left = make_list(lst)
        right = make_list(lst[::-1])[::-1]
        ans = INF
        for i in range(len(lst)):
            if lst[i][0] == "0":
                ans = min(ans, left[i][0] + min(right[i]), min(left[i]) + right[i][0])
            else:
                ans = min(ans, min(left[i]) + min(right[i]))

        print(ans)
```
Pythonのスクレイピングツール対決！Playwright vs Selenium を比較

Webスクレイピングといえば、Pythonユーザーにとっておなじみの選択肢が2つあります。
それが **Playwright** と **Selenium**！どちらもWebブラウザを操作してページの情報を取得する強力なツールですが、得意分野がちょっと違います。

この記事では、それぞれの長所と短所を、わかりやすく、そして少しユーモアも交えて紹介します！

---

## 🤖 Seleniumとは？

Seleniumは老舗のブラウザ自動操作ライブラリ。Web自動テストの世界で長年活躍してきたベテラン選手です。

```bash
pip install selenium
```

### ✅ 長所

* **歴史と実績あり**：2000年代からあるベテランツールで、情報も事例も豊富。
* **多くのブラウザに対応**：Chrome、Firefox、Safari、Edge など幅広く対応。
* **WebDriver標準**：多くのテストツールやクラウドサービスと互換性あり。
* **安定性**：環境によっては非常に安定して動作する。

### ❌ 短所

* **速度が遅め**：モッサリ動作することがあり、大量データ取得には時間がかかる。
* **非同期処理が苦手**：近年の動的ページには少々苦戦。
* **セットアップが面倒**：WebDriverのバージョン管理が地味に手間。

---

## 🚀 Playwrightとは？

PlaywrightはMicrosoftが開発した比較的新しいスクレイピング＆テスト自動化ライブラリ。まるで「未来から来たスパイロボット」のように軽快で賢い動きをします。

```bash
pip install playwright
playwright install
```

### ✅ 長所

* **超高速**：ブラウザの起動・操作がとにかく速い！
* **非同期処理に強い**：AjaxやSPAなど、動的サイトにも対応バッチリ。
* **ヘッドレス対応がスマート**：GUIなしでもキビキビ動作。
* **自動的にブラウザを管理**：ドライバ地獄とは無縁。
* **モダンなAPI**：書きやすくて直感的。

### ❌ 短所

* **新しいツールゆえに情報が少なめ**：トラブルシューティングは少し工夫が必要。
* **日本語情報は少ない**：英語ドキュメントがメイン。
* **ファイルサイズがやや大きめ**：Playwright自身とブラウザのサイズが重たいことも。

---

## 🧁 どっちを選べばいいの？

| 用途          | Selenium | Playwright |
| ----------- | -------- | ---------- |
| 安定した長期運用    | ✅        | ⛔️         |
| 最新の動的ページ対応  | ⛔️       | ✅          |
| ドライバ管理が苦手な人 | ⛔️       | ✅          |
| 日本語ドキュメント重視 | ✅        | ⛔️         |
| 処理速度優先      | ⛔️       | ✅          |

---

## 🏁 結論：こんな人におすすめ！

* **Seleniumが向いてる人**：伝統的なテストフレームワークとの連携が必要な人、情報量重視の人。
* **Playwrightが向いてる人**：非同期ページやSPAと戦いたいスクレイパー、新しい技術を使ってみたい人。

---

## 🎯 まとめ

| 比較項目       | Selenium | Playwright |
| ---------- | -------- | ---------- |
| 歴史         | 長い       | 短い         |
| 処理速度       | 遅め       | 速い         |
| モダン対応      | △        | ◎          |
| ドキュメントの豊富さ | ◎        | △          |
| セットアップ     | やや面倒     | ほぼ自動化      |

「ロボットに仕事を任せたいけど、どのモデルを選ぶべき？」というあなたに、この記事が少しでも参考になれば幸いです！

それでは、快適なスクレイピングライフを！🕷️
NotebookLM×Claude×draw.ioでkintone営業支援パックの構成図を自動生成してみた


こんにちは！かねごん（[@hrbk25](https://x.com/hrbk25)）です！

この記事では、少し前からSNSで話題になっていた「Claudeを使って、draw.ioのXMLを作ってもらう」という内容を、身近な内容とAIアシスタントツールを使って試してみましたので、その内容を備忘録として残しておきます。


## どんな人向けの記事か

- システム構成図などの図を効率的に作成したい方  
- draw.ioを普段活用している方
- AI（NotebookLM、Claude）による図の自動生成に興味がある方

---

## やったこと

今回は、kintoneの営業支援パックを公式サイトの情報から、NotebookLMとClaudeを活用してdraw.ioでシステム構成図を自動生成してみました。

### kintone営業支援パックとは

https://kintone-sol.cybozu.co.jp/apps/eigyoshienpack.html

本アプリパックは営業で顧客や案件、商談の管理をすることを目的に構成されたサンプルのアプリパックです。

### NotebookLMとは

https://notebooklm.google.com/

Googleが提供するAI搭載のアシスタントツールです。WebサイトやPDFなど「ソース」をアップロードや指定すると、その内容を構造化・要約・抽出できます。


### Claudeとは

https://claude.ai/

Anthropic社が提供する対話型AIアシスタントツールです。様々なプロンプトに対応でき、draw.io用のXML出力なども生成可能です。

---

## 手順

### 1. NotebookLMでサイト情報をまとめる

今回は、NotebookLMを使って、まず営業支援パックの情報をまとめました。

1. notebookLMで新しいノートブックを作成する
2. 「ソース」として、kintoneヘルプの[営業支援パックを使ってみよう](https://jp.cybozu.help/k/ja/app/setup/create_app/sales_pack.html)のURLをアップロードする
3. 以下のようなプロンプトをチャットに投げる。

```
このサイトの内容をもとに、「kintone営業支援パック」のシステム構成要素とアプリ間の関係性を整理し、図式化に必要なポイントを要素ごとにリストアップしてください。
```

:::note
**NotebookLMを使った理由：**  
”情報をまとめる”だけであれば、他のAIアシスタントツールでも良いのですが、PDF、サイト、YouTube動画、音声ファイル、Googleドキュメント、Googleスライドなど、指定したソースに基づいた根拠のある情報を取得してくれる **NotebookLM** を今回は使いました。
:::

### 2. Claudeでdraw.io用のXMLを自動生成

1. Claudeを開く(モデルはClaude Sonnet4を使用)
2. NotebookLMで出力した内容をコピーする
3. 以下のようなプロンプトをチャットに投げる。

```
～NotebookLMの内容を貼り付け～

この情報をもとに、draw.ioでシステム構成図を出力できるXMLを作成してください。 
アプリやデータ連携の関係性が分かるような図になるようお願いします。また、アイコンなどを使って非エンジニアの方でも分かるように工夫してください。
```

### 3. draw.ioにXMLを貼り付け

1. draw.ioを開く
2. Claudeで出力した内容をコピーする
3. 右クリックして「ここに貼り付け」を選択する
4. システム構成図が自動生成される
5. 必要に応じてレイアウトを微調整する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582762/b4f6f125-cf8f-4f61-aaed-7a5cdb4ecf5e.png)


## 出力された結果を確認
営業支援パックのシステム構成図を出力することができました！

出力結果には、「案件管理」の関連レコードを「活動履歴」に表示する情報が含まれていませんでしたが、これはサイト内にその情報が明示されていなかったためだと思います。

ただ、サイトに記載されている情報については、問題なく構成図に反映できていたので、図作成の効率化という点では非常に良いと思いました！



:::note
**まとめ**  
- 微修正は必要だが、図作成の効率化には便利！
- 根拠のある情報だけを使いたい場合は、NotebookLMの活用が良いかも！
- 同じプロンプトでも（NotebookLM・Claudeともに）、出力内容が毎回異なるため、何度か試してみると良いかも！　試してみた結果👇

![何度か出力してみた出力結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582762/38abbc13-b7a8-418a-ac18-836bc39769f7.png "何度か出力してみた出力結果")
:::







---

## おわりに

今回は、kintoneの公式サイトの情報から、NotebookLM×Claudeを使って、draw.ioでシステム構成図を自動生成する流れをまとめました。

AIアシスタントツールを組み合わせれば、資料作成が効率化されます。この記事がどなたかのヒントや効率化につながれば幸いです！
UnityでのHololens2セットアップ（2025/5/31）

## はじめに
人それぞれの開発環境があると思いますが、自分の環境だといろいろな記事を参考にしてもバージョンがかみ合わずうまくHoloアプリが動作しませんでした。
試行錯誤の末たどり着いたしっかり動作するバージョンとインストールするものたちを、自分用メモ兼備忘録として残しておきます。

## 各バージョン
Unityのバージョン：2022.3.30f1
Vuforia Engine　　：最新のバージョン
Visual StudioのVer  ：Visual Studio2022

## 環境設定
Unityのインストール時には以下のモジュールにチェックをつける。
・Universal Windows Platform Build Support
・Windows Build Support(IL2CPP)

Visual Studio2022では以下のコンポーネントにチェックをつける。
[ワークロード]
・ユニバーサルWindowsプラットフォーム開発
・Unityによるゲーム開発
[個別のコンポーネント]
・USBデバイスの接続
・最新のv143ビルドツールARM64/ARM64EC
・最新のv143ビルドツールC++
・v143ビルドツールのC++ユニバーサルWindowsプラットフォームサポート（ARM64/ARM64EC）

## プロジェクトのセッティング
### UnityプロジェクトをUWP環境にスイッチ
プロジェクトを作ったばかりの状態だと、プラットフォームがWindows OS向けになっている。Hololens2アプリはUWPアプリのため、スイッチングする必要がある。
FIle > Build Settingより、Platformを Universal Windows Platform に変更。
その後、項目を下記のように変更する。

| 見出し | 設定項目 |
|:-:|:-:|
| Architecture | ARM 64-bit |
| Target SDK Version | 10.0.19041.0 |
| Minimum Platform Version | 10.0.19041.0 |
| Visual Studio Version | Visual Studio 2022|

### MRTKを導入する
MicrosoftのサイトでMixed Reality Feature Toolをインストール。
下記Featureをインストールする。
・Mixed Reality Toolkit Foundation
・Mixed Reality OpenXR Plugin
ここからMRTKセットアップの手順は他のサイトを参考にすればOK。

### Vuforia Engineを導入する
最新のVuforia Engineは以下のリンクから入手できる。
https://developer.vuforia.com/downloads/sdk
ここのdownload for Unityを押すとダウンロードが始まる。
ダウンロードしたunitypackageは、Unityプロジェクト上で
Assets > Import Package > Custom Package から該当ファイルを選択することでインポートできる。
この後のVuforia導入は他サイトと同じなのでそちらを参考に。

### Holoアプリのデプロイ
ビルドすると.slnファイル（ソリューションファイル）が出てくる。これをVisual Studio2022で開く。
デプロイをするが、その際
・DebugをReleaseに
・ARMをARM64に
・リモートコンピュータをデバイスに
それぞれ設定する。Hololens2がUSBを介してPCにつながっていることを確認したら、いざデプロイ。デプロイはデバッグ > デバッグなしで実行より行う。Visual Studio 2019だとデプロイ中はたくさんシステムログが出てきてわかりやすかったですが、Visual Studio 2022だと～～/buildstate のログのみで、あまり書き込んでる感がありません。ちゃんと内部でデプロイしてくれているので、配置完了するまで気長に待ちましょう。
自分用 java基礎学習 ～オブジェクト指向～

# オブジェクト指向
### オブジェクト指向
あらゆるものすべてを「モノ」として表現する考え方
(例)車の運転
→運転の際に自動車の内部や仕組みは理解していなくてもいい。ただ運転方法を知っていればほぼ問題なく運転が可能である。

# フィールドとメソッド
### フィールド
データというイメージ。先ほどの車の例を用いると、スピード、走行距離、排気量等に該当する
### メソッド
操作というイメージ。先ほどの車の例を用いると、発進、停止、曲がる等に該当する

# クラスとオブジェクト
### オブジェクト(モノ)
物体を指す。「インスタンス」ともいう。
先ほどの車の例を用いると、設計図(クラス)が一つあれば、車(インスタンス)の大量生産が可能という考え方。

### メンバ変数(クラス内の変数)
クラス内で宣言されている変数を「メンバ変数」という
各メソッドからのメンバ変数へのアクセスは「this.〇」という形で記述する
```java:MyClass.java
public class MyClass {
    String s; // メンバ変数の宣言

    // コンストラクタ
    MyClass(String s) {
        this.s = s; // メンバ変数のthis
    }

    // addメソッド
    String add(String s) {
        return this.s + s;
    }

    public static void main(String[] args) {
        MyClass obj = new MyClass("Hello");
        String result = obj.add("World");
            System.out.println(result); // → HelloWorlを出力
    }
}
```

# アクセス指定子
### アクセス指定子
フィールド、メソッドにおいて、アクセス許可を指定することによりアクセスできる範囲を指定可能で、そのために必要なもの
### アクセス修飾子
フィールド、メソッドへのアクセスを制限
下記に主なアクセス修飾しを記載

### public
どこからでも呼び出せる
### (default)
アクセス指定子が省略されている場合。この時は同じパッケージ内でしか呼び出せない
### protected
同じパッケージ化そのサブクラスからしか呼び出せない
### private
同じクラス内からしか呼び出せない。
※通常フィールドはprivateで隠し、外部からアクセスするメソッドを介しての値の変更や取得をする。これを「カプセル化」という

# コンストラクタ
### コンストラクタ
クラスメイト同一のメソッドのこと。インスタンス生成時に1度だけ呼び出さあれる。
コンストラクタには戻り値の指定がない。
##### コンストラクタの基本構文
```java:Sample.java
class クラス名 {
    // フィールド
    型 フィールド名;

    // コンストラクタ
    クラス名(引数) {

    // フィールドに初期値を代入
    }
}
```
##### コンストラクタの例(Personクラス)
```java:Person.java
public class Person {
    // フィールド（インスタンス変数）
    String name;
    int age;

    // コンストラクタ（名前と年齢を受け取って初期化）
    public Person(String name, int age) {
        this.name = name; // フィールドのnameに引数のnameを代入
        this.age = age;   // フィールドのageに引数のageを代入
    }

    // メソッド
    public void introduce() {
        System.out.println("こんにちは、" + name + "です。年齢は" + age + "歳です。");
    }

    // mainメソッド（実行の入口）
    public static void main(String[] args) {
        // Personクラスのインスタンスを作成（コンストラクタが呼ばれる）
        Person p1 = new Person("たろう", 20);
        p1.introduce(); // → こんにちは、たろうです。年齢は20歳です。

        Person p2 = new Person("はなこ", 25);
        p2.introduce(); // → こんにちは、はなこです。年齢は25歳です。
    }
}
```


# おわりに
覚えたつもりが、いざ書くときにうまく理解できていないことを感じる日々ですが、いつでもこの基礎を見直して頑張ります。
コードの可読性は何によって決まるのか？

## 🧩 導入：オブジェクト指向が読みにくいとされる背景

オブジェクト指向（OOP）は、大規模開発やドメインモデリングに適している一方で、**可読性が低くなると感じられる場面も多くあります**。
その主な理由には以下が挙げられます：

* **処理の流れが複数のクラスやメソッドに分散**し、追いにくくなる（間接参照が多い）
* 設計原則や再利用性を重視するあまり、**抽象クラスやインターフェースが乱立し、全体構造が見えにくくなる**
* 特にJavaやC++では、**ボイラープレートコード（定型コード）が大量に発生**し、意味のあるロジックが埋もれてしまう

こうした理由から、「オブジェクト指向は可読性が低い」と主張されることがありますが、それは**言語の問題というより、設計や表現の仕方の問題**でもあります。



## 1. **オブジェクト指向言語は本当に可読性が低いのか？**

### ● 可読性が低く感じられる理由：

* **処理が分散**して追いにくい（クラス、メソッド、インターフェースの多用）
* **抽象化過剰**（小さなクラスやインターフェースが乱立）
* **ボイラープレートコードが多い**（特にJavaなど）

### ● 反論（OOPの可読性メリット）：

* 責任分離により**局所的な理解はしやすい**
* ドメインモデルに沿った構造で**現実世界の概念と対応**
* **再利用性・保守性**に優れ、長期的には読みやすく保てる

---

## 2. **関数型言語は読みやすいのか？**

### ● 状態を排除した純粋性により、**理論上は読みやすい**

* 明示的な入力→出力が分かりやすい
* 副作用が制御されることで予測可能

### ● しかし現実のプログラムは**状態に満ちている**

* IOや状態管理は結局モナドや複雑な抽象で実装され、**逆に読みにくくなる**
* **副作用の流れが暗黙的で、学習コストも高い**

---

## 3. **真の可読性を決めるのは「コメント」や「意図の明示」**

### ● 言語そのものよりも重要な要素：

* **適切なコメント**（特に「なぜ」）
* **明確な命名**（変数・関数・クラス）
* **設計レベルでの構造化**（責務の分離、レイヤー設計）
* 一貫した**コーディングスタイル**

### ● コメントの有無で可読性は劇的に変わる：

* コメントがなければ、どんな優れた言語でも\*\*「何をしているか」は分かっても「なぜそうしているか」は分からない\*\*
* 「コメント不要論」は一部の理想に過ぎず、現実の開発では**補助的メタ情報として不可欠**

---

## ✅ 最終結論

* **コードの可読性は、言語の設計だけでは決まらない**
* **本質は「意図の伝達」がどれだけできているか**
* その鍵となるのが、**コメント・命名・設計**の3点である
自分用 java基礎学習メモ

# java学習初日のメモ
### javaにおける定数
```java:sample.java
final int NUMBER = 100;
```
一般的にfinalは大文字で定義する


### javaにおける乱数
```java:sample.java
(int) (Math.random() * n);
// 0からn-1まで

(int)(Math.random() * n) + 1 
// 1からnまで
```

### javaにおける無限ループ
```java:sample.java
while (true) {
    ...
    break;
}
```
### 配列
※C言語と異なる宣言の仕方
```java:sample.java
int a[] = new int [配列の数];
```
※C言語のようにこのように配列を宣言することはできない。
```c:sample.c
int a[5];
```

length (レングス)
配列変数の成分の数を表す
lengthは配列の数だけループさせるときに便利
```java:sample.java
for (int i = 0; i < a.length; i++) {
    処理
}
```

# おわりに
これから地道にjavaの学習を頑張っていきます！