OmniAICreator/Qiita-1.07M huggingface dataset:
[CAIレシピ] ジャンプステップによる実行制御

## はじめに

ジャンプステップを利用すると、指定したステップ位置に実行を戻したり進めたりできます。

この記事では、ジャンプステップ・割り当てステップ・ディシジョンステップを利用して、1から10まで加算した値を取得する実装を確認します。

なお、この記事は次の記事の内容を理解していることを前提としています。

- [はじめてCAIを使う際に](https://qiita.com/shunsuzu/private/12b8dbd08a30efa0003a)
- [プロセスの作成と実行(匿名認証と基本認証)](https://qiita.com/shunsuzu/private/01d91caedb92bd7781ea)
- [割り当てステップと、各種変数フィールドの利用](https://qiita.com/shunsuzu/private/fae696539cd245828848)
- [ディシジョンステップによるによる分岐処理](https://qiita.com/shunsuzu/private/cf69000890ccdfd1d42f)


## ジャンプステップ利用時の動作

### CAIプロセスの作成

次の手順では、1から10まで加算した値を出力フィールドとした返すCAIプロセスを作成しています。カウント用の変数は一時フィールドとして、加算した値を保持する変数は出力フィールドとして定義しています。

1. CAIプロセスを次の設定で作成します。
    - 名称を __recipe-pca-stepJump__ とする
    - __匿名アクセス__ を許可する
    - __クラウドサーバー__ にデプロイする

1. 出力フィールド __output__ を __タイプ=整数__、__初期値=0__ として定義します。

1. 一次フィールド __tmpCount__ を __タイプ=整数__、__初期値=1__ として定義します。

1. CAIプロセスが次の順に実行されるように各種ステップを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/a0f5088b-f9d4-0f2f-83e8-b1b33c8d09c9.png)
なお、ステップの追加手順によっては上記のスクリーンショットとは少し違う表示となる場合もありますが、実際の動作には影響はありません。

1. ディシジョンステップを選択して、一時フィールド __tmpCount__ を対象に、
条件 __次の値以下=10__ を指定します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/e9c61211-96d4-5b3c-9401-2b85473746dd.png)

1. 割り当てステップを選択して各フィールドに計算式として次の式を指定します。
● output = `$output.output + $temp.tmpCount `
● tmpCount = `$temp.tmpCount  + 1`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/fdcd71c8-933b-018f-14d3-9151ceaa4bd3.png)

1. ジャンプステップを選択して、ジャンプ先としてディシジョンステップ(今回の例では __tmpCount__)を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/bc79f3c6-09e1-e21a-4d33-e15f68132c6d.png)

### CAIプロセスの実行

curlコマンドを例とした動作確認結果です。

```:curlコマンドと実行結果
// curl コマンド
curl https://<IICS・CAIサーバー>/active-bpel/public/rt/<Org ID>/recipe-pca-stepJump

// 実行結果
{"output":55}
```

計算結果として __55__ という値が得られました。等差数列の和ですので公式を使って(`10/2*(1+10)=55`)、正しい結果であることがわかります。


## 繰り返し処理実装時の留意点

ジャンプステップ・ループステップによる繰り返し処理の実装時には、CAIプロセス全体で実行されるステップ数に注意が必要です。実行するステップ数が10,000を超える場合、CAIの制限によりエラーが発生します。

実行するステップ数が10,000を超える可能性がある場合、次のように設定します。

- CAIプロセスのデプロイ先をSecure Agent環境とする
- アプリケーション統合コンソールの __サーバーの環境設定__ を開いて、利用しているSecure Agentの __プロセスアクティビティ実行制限__ をプロジェクトの要件に応じて変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/0c9bf260-f74a-6a9d-2ed0-69b885a8b26a.png)

なお、クラウドサーバーでは __プロセスアクティビティ実行制限__ は 10,000 の固定のため変更できません。前述のとおり、CAIプロセスのデプロイ先をSecure Agent環境とする方針を検討します。

## 参照

- [Qiita - IICS CAIの実装レシピ - マスターページ](https://qiita.com/shunsuzu/private/3d1971ef6e3b993516aa)
- 実行するステップ数の制限と対処に関する技術情報
[ERROR: "Activity execution limit exceeded" when Cloud Application Integration process is suspended](https://knowledge.informatica.com/s/article/512333?language=en_US)
Google Sheets APIのリクエスト数上限の対応についてのまとめ

## はじめに

この記事は [アイスタイル Advent Calendar 2024](https://qiita.com/advent-calendar/2024/istyle) 8日目の記事です。

はじめまして。 アイスタイルで店舗系システムの運用をしています、shirakiyです。

これまでは見る専門だったのですがQiitaデビューのチャンスだと思い、業務の振り返りとやったことをまとめることにしました。
プライベートなことを少し挟むのがアドカレらしいと感じるので挟むと、最近幽遊白書のアニメを見始めました。幻海の門下生大選考会に入りました。

## 対象のバッチ

月初に店舗在庫の集計バッチが動き、集計結果をgoogleスプレッドシートに出力し事業部の方に連携しています。
バッチ作成当時からすると店舗数・取り扱い商品数ともに増加しているのでデータ量も増加しています。
![image_720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952261/3f9f689d-5eea-2fda-de05-23a439a41b96.png)


## バッチで発生したエラー
公式Doc：https://developers.google.com/sheets/api/troubleshoot-api-errors?hl=ja
### 1. バックエンドエラー
```text
  "error": {
    "code": 500,
    "message": "Internal error encountered.",
    "errors": [
      {
        "message": "Internal error encountered.",
        "domain": "global",
        "reason": "backendError"
      }
    ],
    "status": "INTERNAL"
  }
```
調べると、ピボットテーブルがシート上に存在することでもこのエラーが発生してしまうそうです。
（今回はピボットテーブル不使用です。）

リクエスト上限が割り当てられており、リクエストが過多になるとエラーが発生します。
公式の表を見ていると1分のスリープ入れれば分間リクエスト上限はクリアできそうです。

| 書き込み                   | リクエスト上限値 |
|------------------------|----------|
| 1 プロジェクト、1 分あたり        | 300      |
| 1 プロジェクト、1 ユーザー、1 分あたり | 60       |

#### 対処方法：処理中に1分間のタイムスリープを入れる
```php
sleep(60)
```

### 2. サービス利用不可エラー
```text
  "error": {
    "code": 503,
    "message": "The service is currently unavailable.",
    "errors": [
      {
        "message": "The service is currently unavailable.",
        "domain": "global",
        "reason": "backendError"
      }
    ],
    "status": "UNAVAILABLE"
  }
```
公式ドキュメントによると
>リクエストまたはスプレッドシートの複雑度が高いときに 503 エラーを返します。
>
とのことです。
手動実施の場合、データ量の多い部分から再実施をしていることが多いので要求過多が原因のような気がします。

#### 対処方法：現状だとバッチの実施タイミングの時間を数分置くことで解決してます
↑ログを確認していたりすると時間が経過していることが多いので、再実施すると大体うまくいっています。

### 今後の対応として

対象のバッチは、リカバリの手動実施２−３回行うことで成功することができています。
とはいえ手動なこともあり完全自動完結を目指して、リトライ処理を入れているところになります。
やはり細かく実施していくしかなさそうです。
```php
$retryCount = 3;

// 店舗ごとにスプレッドシートを作成
foreach ($shops as $shop) {
   // スプレッドシートへの分間リクエスト数を調整する為sleepを実行
   sleep(60);
   for (; $retryCount > 0; $retryCount--) {
       try {
            // シート作成メソッドをコール
            $this->createSheet($shop);
       } catch (\Exception $e) {
           log("Googleリクエスト上限となったため、5分待機します");
           sleep(300);
       }
   }
}
```

### 最後に

売り上げが伸びている事は大変喜ばしいことですが、サービスが伸びていくごとにサーバーだけではなく
管理機能への負荷も高くなっていくので、ある程度見越した適切な対応が必要になってくると感じました。

最後までお読みいただきありがとうございました！

それでは、良いクリスマス＆年末をお過ごしください！:santa:
shellスクリプトをミスって開発環境の全ファイルを吹き飛ばした話

## はじめに

初めまして、髙橋と申します。

新卒2年目になり間もない頃、インスタンスのCPU使用率をCSVファイルで取得し、古いデータを削除して新しいデータを格納するためのshellスクリプトを作成するというタスクがありました。
しかし、変数名を変更したことが原因で、予期しない事態が発生してしまいました。

今回はその事故の詳細と教訓を共有します。

## 事故の背景

### やりたかったこと

特定のディレクトリのファイルを削除し、各インスタンスのcpu使用率のデータをCSVファイルで出力するshellの作成

---

### 作成したスクリプト

以前似たようなshellスクリプトを書いていたので、そのスクリプトをコピーして作成しました。

完成したコードがこちら

```bash
#!/bin/bash

LIST_FILE="/xxx/data/hosts.csv"
EXPORT_DIR="/xxx/data/cpu"

# ファイル削除
rm -rf $EXPORT_DIR/*

cat $LIST_FILE | while read TLINE; do
    /yyy/get_ec2_cpu_info_test ${TLINE}
done

```

### このスクリプトの目的

1. `EXPORT_DIR` に保存されている古いデータを全削除
2. `LIST_FILE` に記載されたホスト情報を一行ずつ読み込む
3. `/yyy/get_ec2_cpu_info_test` を実行し、新しいデータを取得＆格納

これは特に問題もなく動作しました。順調。

---

## 事故発生3分前から発生まで

`EXPORT_DIR` よりも `DEL_DIR` の方が変数名として適切じゃね？と思い、変数名を変更しました。
（スクリプトをコピペしてきたので変数名がそのままになっていた）

…で、**完成した特級呪物**がこちら

```bash
#!/bin/bash

LIST_FILE="/xxx/data/hosts.csv"
DEL_DIR="/xxx/data/cpu"

# ファイル削除
rm -rf $EXPORT_DIR/*

cat $LIST_FILE | while read TLINE; do
    /yyy/get_ec2_cpu_info_test ${TLINE}
done

```

### おわかりいただけただろうか

変数名は `DEL_DIR` に変更されたものの、`rm -rf $EXPORT_DIR/*` の部分の修正が漏れてしまいました。

つまり、`EXPORT_DIR` に新しい値がセットされていないため、このコマンドは次のように実行されることに…。

```bash
rm -rf /*

```

※`rm -rf /*` は、ファイルシステム内のすべてのデータを警告なしで削除する命令

…という訳で実行した結果、**開発環境の全ファイルが吹き飛んでしまいました**。

ちなみに、全ファイルが消えるとこうなります。**マジで何もできません**。

参考記事

https://dev.classmethod.jp/articles/tried-rm-rf-root-on-amazon-linux-2/

---

## 発生した被害

### 前日までのデータ

バックアップとしてAmazon Machine Image(AMI)を取得していたため、前日までのデータは無事復旧することができました。

### 当日分のデータ

`rm` コマンドで全ファイル（OS設定関連のファイル含む）が削除されてしまうと流石に復旧できません。全部消えました。
ちなみに、僕のほかに作業者が2名いました。1人はVSCodeのエディタ上にコードが残っていたので実質無事でしたが、もう1人の作業分は完全に消えてしまいました。
（社会人人生で一番謝りました）

---

## 対策・対処方法

この事件以降、対策として実施しているものを5つ紹介します。

### 1.  変数の置換は必ず抜け漏れが無いようにする

変数名の置換を行う際は、単純な手作業で変更せず、エディタの検索・置換機能（`Ctrl+h`など）を使って全ての参照箇所が漏れなく修正されているかを確認しましょう。
修正が漏れると今回のようなことが起こるかもしれません。

### 2. パスに`*`を含めたい場合、理由がない限りパスを分割しない

パスに`*`を含める場合、リスクを最小限に抑えるため、パスを極力分割せず完全なパスで指定しましょう。

### 3. 変数の値がセットされているか確認するスクリプトを挟む

変数に値がセットされているかを確認する簡単なスクリプトを挟むことで、誤った変数が参照されることを防ぐことができます。

サンプルコード
```bash
if [ -z "$EXPORT_DIR" ]; then
    echo "ERROR: EXPORT_DIR is not set"
    exit 1
fi
```

### 4. 不可逆なコマンドを実行する前は入念に見直す

`rm -rf`のような不可逆なコマンドを実行する前にスクリプトを数回確認し、意図しない結果が起こらないか確認しましょう。

### 5. 日ごろからバックアップを取得する

この対策は事件以前にも行っていました。前日分までのデータを復旧できたのもバックアップのお陰です。バックアップ、大事。

---

## おわりに

`rm -rf` なんて誰が実行するねんと思っていましたが、まさか自分がやるとは思っていませんでした。以降はこのような事が無いように、前述した対策を実行しています。
スクリプトやコードを書いたときは「よし！ 完成！」と思いがちですが、少し立ち止まってコードを見直すことが大切です。皆さんは既に意識されているかもしれませんが、僕と同じ轍を踏まぬよう改めて意識してみてください。

ここまで読んでいただきありがとうございました！
【MarkdownAI】マークダウンだけでサイトやAIを作れる神ツール

# MarkdownAIを使ってみた
Markdownを書くだけでWebを作れるという、MarkdownAIを実際に使ってみた感想を書こうと思います:cheese:
#### ちなみに、
今、Qiita Advent Calendarというイベントで
MarkdownAIについての記事を書いて最優秀賞に選ばれたら、
<b>iPad air 128GBモデルがもらえます！</b>
あと20日なので、まだ間に合いますよ！
# Markdownってまず何？
記号や文字を書くだけでこういう記事やWebサイトっぽくなる
ファイル形式のことです。　
この記事もMarkdownで書かれています。![実際のこの記事のMarkdown](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930283/9a2ab3ef-af55-90b3-441a-fd364e71f435.jpeg)
# MarkdownAI
そのMarkdownにAIをくっつけた結果...
とても便利なツールが誕生🐣
- MarkdownだけでWebサイトを作成可能
- 面倒なデプロイ作業は全て自動
- AIモデルも作成可能
- AIにして欲しいことを書くだけ
今までありそうでなかった<b>神ツール</b>だと思います:sunglasses:
# 使ってみた
### Webサイト
[実際にできたサイト]()はこちらです💁
すごくないですか？全部Markdownですよ！

:::note warn
**追記**
出来たサイトは非公開にしました。
見ようとしていた方は申し訳ありません。
:::

### AIモデル
知識や指示を入力して質問してみました。
![IMG_3486.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930283/648e18cb-dc6f-41d5-eaa7-52f36a090f5c.jpeg)
便利すぎる！簡単にチャットボットとかを作れてめちゃくちゃ需要あると思います
## 思ったこと
- 簡単にサイトやAIを作れてとても便利だと思った
- HTMLとかをよく知らない人にオススメできる
- AIの返答に、マークダウン対応して欲しい
# 終わりに
とにかく、全部が便利なツールでした。
Markdown記法でいろんなことをしたい人は
使ってみてください！

https://mdown.ai
【Apache2+Certbot】同一サーバ複数ドメインでのHTTPS化

# OPEN IPv6 ダイナミック DNS for フレッツ・光ネクスト
i.open.ad.jpというドメインを使ってIPv6のフレッツ網内での直接通信を行い高速通信を実現できる無償のDDNSサービスが[OPEN IPv6 ダイナミック DNS for フレッツ・光ネクスト](https://i.open.ad.jp)だ。本来はIoT機器やVPNでの利用が想定されたサービスである。
Minecraftのプラグインサーバで[Pl3xMap](https://github.com/granny/Pl3xMap)を用い、ブラウザからマップを見られるようにしている。フレッツ網内での高速通信を行う必要性は特に無いのだが、何となくやってみたかったのでやってみる。

# Pl3xMapの設定
Pl3xMapについては別の日に他の方が紹介してくださると思われるので詳細な説明は割愛するが設定の要点だけ明記しておく。
```yaml:config.yml
settings:
#(略)
    # ApacheのProxyPassの設定と揃える
    web-address: http//localhost:8123
    #(略)
    internal-webserver:
        enabled: true
        # localhostを指定
        bind: 127.0.0.1
        # ApacheのProxyPassのポートと揃える
        port: 8123
#(略)
```

# HTTPS化
まずはi.open.ad.jpのFQDNを取得しアクセスしてみる。するとHTTP通信になってしまい警告が出る。
i.open.ad.jpではなく普段利用しているドメインを用いたアクセスではCertbotを用いてHTTPS化している。手順は[この記事](https://qiita.com/MoraCyulu/items/4526416d142459e1c218)に準拠している。記事ではDynmapを用いているが、リバースプロキシ周りの設定は全く同じである。

先に示した記事の通り実行した後、`my-proxy-ssl.conf`に`ServerAlias`の設定を追記する。
```conf:my-proxy-ssl.conf
<VirtualHost *:443>
#(中略)
ServerName hogehoge.example.com
ServerAlias hogehoge.i.open.ad.jp
#(後略)
</VirtualHost>
```
手順は[この記事](https://qiita.com/Yasuwo/items/a4ce7263187870fc7dad)に準拠している。[証明書の作り方](https://qiita.com/Yasuwo/items/a4ce7263187870fc7dad#%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9)の通りの手順を踏めば完成だ。
Apex Fundamentals for Developers  モジュール

**使っているクラウドなどの小ネタ Advent Calendar 2024 20日目**

https://trailhead.salesforce.com/content/learn/modules/apex-fundamentals

# Create Code with Apex

最後だけはコードを書かされます。

何もしないで検証ボタンをクリックすると...

:::note alert
We can't find any debug logs in your org. Make sure you've used System.debug statements and executed your code.
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b0b8341c-1487-053f-ac91-66686bf82968.png)


どうもデバックログを見ている感じですね。クラス名などの指定はないので匿名ウィンドウで実行しますか。

:::note alert
We can’t find the correct integer count in the debug log. Check your code for errors in syntax or formatting, and make sure you click "Check Challenge" immediately after running your code.

デバッグ ログに正しい整数カウントが見つかりません。コードの構文や書式にエラーがないか確認し、コードを実行したらすぐに「チャレンジを確認」をクリックしてください。
:::

しまった１から10だったな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0f44d09c-3288-ff2e-5c77-692c1f3ab803.png)

```java
Integer count = 1;
do {
    System.debug('Count: ' + count);
    count++;
}
while (count <= 10);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/af8f82b5-a4c1-bc95-61a2-2d84a074d64c.png)

合格できました
【Chrome】キャッシュしたS3のオブジェクトを表示する際にCORSエラーになった

# はじめに
CORSエラーに苦しめられたので備忘録として残しておこうと思います。
同じ状況で困った人の助けとなればうれしいです。

# CORSエラー発生
リリースしてから数か月たったシステムで、ページ内に配置してある動画が見れなくなったとユーザーからお問い合わせがありました。Chromeのデベロッパーツールで確認してみると、動画の取得時にCORSエラーが発生してました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712137/7816a91c-6a9b-5984-0a32-a61e08f44870.png)


動画ファイルについてはS3に保存しており、CloudFront経由で配信していました。
S3やCloudFrontのCORS周りの設定を見直してみましたが、設定変更直後は閲覧できても、数日たつとCORSエラーが発生していました。

ネットで調べてみると同じ構成でCORSエラーが出てハマっている先駆者様がいました。

https://qiita.com/mikan3rd/items/51da67a1402e27895a23

# 原因
記事内を参考に調べてみると、キャッシュしたS3のオブジェクトを表示する際に、<code>Access-Control-Allow-Origin</code>Headerの付いていないレスポンスを、Chromeが返していたことが原因でした。CORSエラーが発生していた時、試しにSafariやEdgeで確認したところ問題なく動画を見ることができました。

crbugにissueが上がっていますが、2024/11現在も解決していない模様…
https://bugs.chromium.org/p/chromium/issues/detail?id=741958

# 解決方法
以下のような<code>Access-Control-Allow-Origin</code>Headerを付与する、CloudFrontのレスポンスヘッダーポリシーを作成しアタッチして、CloudFrontのキャッシュを削除しました。その後、ユーザーからの問い合わせもなくなり無事に解決しました。

:::note warn
デフォルトのポリシーの場合、オーバーライドされないためS3のCORS設定が優先される点に注意。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712137/0d74e762-a185-984d-ca01-fe7829ac3209.png)
「機械工学で学ぶオブジェクト指向プログラミング#(その2)はりの基本問題」様を参考に、sympyでCastigliano's second theoremを実行した。

**・照査いただけると幸いです。**
・sympyのBeamは未です。
・Castigliano's second theorem のみです。(2024-12-05)

:::note info
前 [(その1)使用例 より
](https://qiita.com/mrrclb48z/items/d5747e1caca8fb7ca0fb)
:::

# オリジナル 
・＃はりの基本問題

https://qiita.com/ShuseiNakahara/items/bfbe9069b4f5fffd02ac#%E3%81%AF%E3%82%8A%E3%81%AE%E6%9B%B2%E3%81%92%E5%95%8F%E9%A1%8C%E3%81%AE%E6%A6%82%E8%A6%81

# こんなところにベッティ(Betti's theorem)の相反定理がありました。
(2025-03-31)追加
https://qiita.com/mrrclb48z/items/e7eab594dc3e876ed9ca
・(1) 曲げモーメントをうける片持梁 Mi θi 
・(2) 先端に集中荷重をうける片持梁 Pi vi

```python
from sympy import *
var('EI,P,L,M')
print("#",(P)*(M*L**2/(2*EI)))  # Pi*vi=Mi*θi :iだそうです。
print("#",(M)*(P*L**2/(2*EI)))  
# L**2*M*P/(2*EI)
# L**2*M*P/(2*EI)
```
### 呼び名?
(1) 曲げモーメントをうける片持梁
(2) 先端に集中荷重をうける片持梁
(3) 等分布荷重をうける片持梁

# 参考文献
- 村上敬宜. (2023). *材料力学* (新装版). 森北出版.　
はりの基本問題(1)　p94,p91微分方程式
はりの基本問題(2)　p94,p92微分方程式 例題5.5
はりの基本問題(3)　p94,p93微分方程式 例題5.6

# sympyで。微分方程式の直接解法で
・勉強中

# sympyで。Castigliano's second theorem で
#### はりの基本問題(1)
・??? dummy Pi 正式な名称を教えて下さい。
```python
# ver0.1
from sympy import *
EI,l,M0,Pi,x =symbols('EI,l,M0,Pi,x')
δ=diff(1/(2*EI)*integrate((-M0+Pi*x)**2,(x,0,l)),Pi).subs({Pi:0})  ;print("#",δ)
θ=diff(1/(2*EI)*integrate(  M0**2      ,(x,0,l)),M0)               ;print("#",θ)
# -M0*l**2/(2*EI)
# M0*l/EI
```
#### はりの基本問題(2)
```python
# ver0.1
from sympy import *
EI,l,P,Mi,x =symbols('EI,l,P,Mi,x')
δ=diff(1/(2*EI)*integrate((-P*(l-x))   **2,(x,0,l)),P)                ;print("#",δ)
θ=diff(1/(2*EI)*integrate((-P*(l-x)+Mi)**2,(x,0,l)),Mi).subs({Mi:0})  ;print("#",θ)
# P*l**3/(3*EI)
# -P*l**2/(2*EI)
```
#### はりの基本問題(3)
```python
# ver0.1
from sympy import *
EI,l,q,Pi,x,M0 =symbols('EI,l,q,Pi,x,M0')
δ=diff(1/(2*EI)*integrate( (-Rational(1,2)*q*(l-x)**2+Pi*(l-x) ) **2,(x,0,l)),Pi).subs({Pi:0})  ;print("#",δ)
θ=diff(1/(2*EI)*integrate( (-Rational(1,2)*q*(l-x)**2+M0       ) **2,(x,0,l)),M0).subs({M0:0})  ;print("#",θ)
# -l**4*q/(8*EI)
# -l**3*q/(6*EI)
```

# sympyのBeamで。
・勉強中


# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342) 　開発環境

# いつもと違うおすすめです。
＞微分方程式の直接解法

https://ja.wikipedia.org/wiki/%E5%BC%BE%E6%80%A7%E6%9B%B2%E7%B7%9A%E6%96%B9%E7%A8%8B%E5%BC%8F#%E3%83%99%E3%83%AB%E3%83%8C%E3%83%BC%E3%82%A4%E3%83%BB%E3%82%AA%E3%82%A4%E3%83%A9%E3%83%BC%E3%81%AE%E4%BB%AE%E5%AE%9A#%E5%BE%AE%E5%88%86%E6%96%B9%E7%A8%8B%E5%BC%8F%E3%81%AE%E7%9B%B4%E6%8E%A5%E8%A7%A3%E6%B3%95#微分方程式の直接解法

https://qiita.com/mrrclb48z/items/9aa2644f04aa8e46c013

#### Youtube
・一級建築士【構造力学】たわみの解き方 (0:00〜12:21)
・でめまる構造 様 
＞共通点があまりない。

https://youtu.be/mQ3q0zaaTss
[SwiftUI]自動スリープを制御する


## 概要
.isIdleTimerDisabledは、デバイスの自動スリープを制御するモディファイアです。このモディファイアを使用すると、アプリがフォアグラウンドにある間、デバイスの画面が自動的にオフにならないようにできます。

## 基本的な使い方

```swift
ContentView()
    .isIdleTimerDisabled(true)
```
## パラメータ
```swift
disabled: Bool
```
trueを設定するとアイドルタイマーが無効になり、falseを設定すると通常の動作に戻ります。

## 詳細な説明
.isIdleTimerDisabledモディファイアは、アプリケーションが長時間の操作や継続的な表示を必要とする場合に特に有用です。例えば、ビデオ再生、ゲームなどの場面で使用されます。このモディファイアを適用すると、ユーザーが画面に触れていなくても、デバイスはスリープ状態に入りません。
ただし、このモディファイアの使用はバッテリー消費に直接影響するため、必要な場合にのみ使用することが重要です。アプリケーションの特定の部分でのみ有効にし、不要になったら無効にすることをお勧めします。
## 応用例
```swift
struct VideoPlayerView: View {
    @State private var isPlaying = false
    
    var body: some View {
        VStack {
            // ビデオプレーヤーのコンテンツ
            Button(isPlaying ? "Pause" : "Play") {
                isPlaying.toggle()
            }
        }
        .isIdleTimerDisabled(isPlaying)
    }
}
```
## Tips
* ビデオ再生中やゲームプレイ中など、ユーザーの操作が少ない状況で使用すると効果的です。
* バッテリー消費に影響するため、必要なときだけ有効にし、不要になったら必ず無効にしましょう。
* アプリがバックグラウンドに移動した場合、このモディファイアの効果は自動的に無効になります。

## まとめ
.isIdleTimerDisabledモディファイアは、特定の状況下でユーザーエクスペリエンスを向上させる強力なモディファイアです。ただし、バッテリー寿命への影響を考慮し、適切に使用することが重要です。ユーザーの操作が必要ない長時間の処理や表示が必要な場合に、このモディファイアを活用することで、アプリケーションの使いやすさを大幅に向上させることができます。

## 関連するモディファイア
[.allowsHitTesting()]()
[.userInteractionEnabled()]()
ブロック状態とは

# ロックを取得しようとしたが取得できなかったスレッドの状態
>A thread goes to wait state once it calls wait() on an Object. This is called Waiting State. Once a thread reaches waiting state, it will need to wait till some other thread calls notify() or notifyAll() on the object.
>
>Once this thread is notified, it will not be runnable. It might be that other threads are also notified (using notifyAll()) or the first thread has not finished his work, so it is still blocked till it gets its chance. This is called Blocked State. A Blocked state will occur whenever a thread tries to acquire lock on object and some other thread is already holding the lock.
>
>Once other threads have left and its this thread chance, it moves to Runnable state after that it is eligible pick up work based on JVM threading mechanism and moves to run state.

https://stackoverflow.com/questions/15680422/difference-between-wait-and-blocked-thread-states#:~:text=A%20thread%20goes,to%20run%20state.

# スレッドを再開させるメソッド
### notify()
>このオブジェクトのモニターで待機中のスレッドを 1 つ再開します。

https://docs.oracle.com/javase/jp/1.5.0/api/java/lang/Object.html#:~:text=notify()%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%E3%81%93%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC%E3%81%A7%E5%BE%85%E6%A9%9F%E4%B8%AD%E3%81%AE%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%82%92%201%20%E3%81%A4%E5%86%8D%E9%96%8B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

### notifyAll()
>このオブジェクトのモニターで待機中のすべてのスレッドを再開します。

https://docs.oracle.com/javase/jp/1.5.0/api/java/lang/Object.html#:~:text=notifyAll()%0A%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%E3%81%93%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC%E3%81%A7%E5%BE%85%E6%A9%9F%E4%B8%AD%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%82%92%E5%86%8D%E9%96%8B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

# ロックを保持ていないとオブジェクトを処理できない
>ロックの概要
プロセス内の複数のスレッドが同じデータを共有して更新する場合は、エラーが発生しないようにそのアクティビティを同期化する必要があります。Java では、これを synchronized キーワード、または wait および notify を使用して行います。同期化はロックを使用して行われます。各ロックは JVM によってオブジェクトに関連付けられています。`スレッドがオブジェクトを処理するには、そのオブジェクトに関連付けられているロックを制御する、つまり、ロックを「保持」する必要`があります。ロックを保持できるのは一度に 1 つのスレッドのみです。`スレッドが別のスレッドに保持されているロックを取得しようとする場合は、そのロックが解放されるまで待機`する必要があります。このような状況の発生を、ロックの「競合」と呼びます。

https://docs.oracle.com/cd/F25597_01/document/products/jrockit/geninfo/diagnos/thread_basics.html#:~:text=%2DXss-,%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AE%E6%A6%82%E8%A6%81,%E7%8A%B6%E6%B3%81%E3%81%AE%E7%99%BA%E7%94%9F%E3%82%92%E3%80%81%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AE%E3%80%8C%E7%AB%B6%E5%90%88%E3%80%8D%E3%81%A8%E5%91%BC%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82,-4%20%E7%A8%AE%E9%A1%9E%E3%81%AE

# 感想
notify()を受けた待機状態のスレッドがロックを取得できなかった状態をブロック状態という
libimobiledeviceのビルド

単に`./autogen.sh`でビルドすると--prefixは/usr/localになる。
`pkg-config`で依存ライブラリのチェックを行うので
`pkg-config`でplistなどのライブラリが見つかるように
`PKG_CONFIG_PATH`を設定する。

ちなみに`./autogen.sh --prefix=/usr`のようなことも出来るっぽい

以下はfedoraの場合だが、他も大体似たようなもん
```shell
sudo yum install libcurl-devel
git clone https://github.com/libimobiledevice/libimobiledevice.git
git clone https://github.com/libimobiledevice/libimobiledevice-glue.git
git clone https://github.com/libimobiledevice/libplist.git
git clone https://github.com/libimobiledevice/libtatsu.git
git clone https://github.com/libimobiledevice/libusbmuxd.git

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
```

以下は順番が重要
```
cd libplist && ./autogen.sh && make && make install && cd ..
cd libimobiledevice-glue && ./autogen.sh && make && make install && cd ..
cd libusbmuxd && ./autogen.sh && make && make install && cd ..
cd libtatsu && ./autogen.sh && make && make install && cd ..
cd libimobiledevice && ./autogen.sh && make && make install && cd ..
```
【Swift】Singletonとは

## シングルトン（Singleton）とは？

インスタンスが同時に一つしか存在せず、それが担保されているクラスのことを示します。
つまり、アプリ内で**同時に一つしか存在すべきでないもの**をシングルトンで実装するとそれが保証されるということです。

:::note info
**同時に一つしか存在すべきでないもの**とは
- アプリを利用しているユーザー
-  APIのリクエストを取り扱うインスタンス
- アプリ全体に影響する設定

NotificationCenterも裏側でSingletonを使っているおかげでViewControllerをまたぎイベントのPost・Observeが可能になってます。
:::

### 実装例
``` sample1.swift
/// Singletonは継承されてはいけない。継承を防ぐためclassにfinalをつける
final public class Singleton {
    /// 外部からのアクセスはsharedを介して行う。よってstaticでインスタンスを共通化する
    public static let shared = Singleton()
    
    private var userName = "Taro Yamada"
    
    init() {}
    
    public var firstName: String {
        let names = userName.components(separatedBy: " ")
        return names[0]
    }
}
/// sharedを介してメソッドを呼び出す
print(Singleton.shared.firstName)
```
**結果**
``` 
Taro
```

このようにシンプルなコードで簡単に、グローバルで一つしか存在しないクラスを作ることができます。

## シングルトンのデメリット

### コードの可読性・運用性を下げる
↓sample2.swiftのようなコードがあるとします。
class B は singleton である class A がないと perform() が実行できません。すなわち **class B は class A に依存している関係**です。

ただ、class B のコードが何百行とあって、その中の一つのメソッドで呼ばれているとすれば、class B は class A 無しには機能しないこと（依存関係にあること）に気づくことは難しいと思います。

この関係性が明らかでないと、複数人や中長期での開発で、思わぬ副作用が生まれる可能性を引き上げてしまいます。
``` sample2.swift
final public class A {
    public static let shared = A()
    
    private var userName = "Taro Yamada"
    
    init() {}
    
    func printName() {
        print(userName)
    }
}

class B {
    let a: A
    
    init(a: A = .shared) {
        self.a = a
    }
    
    func perform() {
        a.printName()
    }
}

let b = B.init(a: A.shared)
b.perform()
```
**結果**
``` 
Taro Yamada
```

### ライフサイクルの制限
Singletonのライフサイクルは基本的にアプリのライフサイクルと同じ。
（アプリ起動してたらSingletonクラスがインスタンス化されアクセス可能に、アプリのタスクキルされるとSingletonも消える）。

Singletonがこのライフサイクルに添えない場合、Singleton以外の方法を考えるべきです。

## まとめ
このように、Singletonの使用には、本記事で挙げたデメリットやテストコードの難易度など懸念点がたくさんあることは事実です。
しかし、インスタンスの単一性の担保が必要なクラスの実装では大きな効果を発揮します。
そういったケースに当てはまる場合、Singletonの使用を検討してみてはいかがでしょうか？
【Unity】モバイル端末の横持検知をジャイロで行う

## 背景
SceneSemanticAPIというARCoreの機能を利用する際に、端末の横持ちを検知する必要があり、調査しました。

関連リンク：[【Unity】SceneSemanticAPIを使ってオクルージョン処理を実現する](https://qiita.com/OKsaiyowa/items/8d86c985312dc5f05660#%E8%AA%B2%E9%A1%8C)


## 結論
横持ちを厳密に検知することはUnityのAPIでは不可能なのではないか？という仮説を立てて調査したところ、予想通り不可能でした。(もし良い方法ご存知であればコメントで教えてください)

そこでジャイロによる横持ち検知を用いるという結論に至りました。

## 調査した内容
調べると色々と横持ちに関する情報が出てきます。主に以下の3つの手法が候補に挙がりました。


- Input.deviceOrientation
- Screen.orientaion
- Screen.width / heght による検知

---
### Input.deviceOrientation
最初にたどり着いたAPIで、端末の向きを検知するために存在しているものです。

参考リンク：[Input.deviceOrientation](https://docs.unity3d.com/ja/2019.4/ScriptReference/Input-deviceOrientation.html)

ただ、 Android、iOS共に端末の回転設定をOSレベルで設定することができるので、この機能とコンフリクトします。具体的には、端末の回転をOSでロックしているとInput.deviceOrientationは反応しません。

---
### Screen.orientaion
次にPlayerSettingsに存在する設定値でもある、Screen.orientaionを調べました。
この値は端末の向きに応じて変化するものではなく、端末の回転を制限するための値を持っているだけで判定には使えませんでした。

参考リンク：[Screen.orientaion](https://docs.unity3d.com/jp/current/ScriptReference/Screen-orientation.html)

---
### Screen.width / heght
画面の縦幅と横幅が画面の向きに応じて変わることを利用する手法です。
この方法もダメで、以下条件の時にしか値が変化しませんでした。

- ネイティブの画面の回転設定がAutoかつ、Screen.orientaionがAutoRotationである

## サンプルコード

以上の理由からジャイロによる物理的な検知を独自実装しました。以下がサンプルです。

```CS
using UnityEngine;

public class CheckOrientation : MonoBehaviour
{
    [SerializeField] private GameObject _warningMessage;

    private void Awake()
    {
        Input.gyro.enabled = true;
    }

    private void Update()
    {
        _warningMessage.SetActive(IsLandscape());
    }

    private bool IsLandscape()
    {
        bool isLandscape;

        if (Application.isEditor)
        {
            isLandscape = Screen.width > Screen.height;
        }
        else
        {
            // Z軸方向だけの判定だと、縦持ちの状態でカメラを上下に傾けた場合に横持ちと判定されるため、X軸方向も判定に含める。
            var gyro = GetCameraGyroEuler(Input.gyro.attitude);
            var landScapeThresholdL = (gyro.z > 45 && gyro.z < 135) && (gyro.x < 45 || gyro.x > 315);
            var landScapeThresholdR = (gyro.z > 225 && gyro.z < 315) && (gyro.x < 45 || gyro.x > 315);
            isLandscape = landScapeThresholdL || landScapeThresholdR;
        }

        return isLandscape;
    }

    /// <summary>
    /// カメラのジャイロを取得する。
    /// カメラの正面方向をZ軸とし、Unityの座標系に合わせた変換を行なった上でオイラー角を返す。
    /// </summary>
    private Vector3 GetCameraGyroEuler(Quaternion gyro)
    {
        var gyroAsUnity = new Quaternion(gyro.x, gyro.y, -gyro.z, -gyro.w);
        var calculatedRotation = Quaternion.Euler(90f, 0f, 0f) * gyroAsUnity;
        return calculatedRotation.eulerAngles;
    }
}

```

## デモ
横持ちを検知して警告が出るようになりました。
![SceneSemanticBugFix.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/a72d875d-b73f-122d-4d17-9a32cb62e294.gif)

## 参考リンク
- [UnityでiOSのジャイロの使い方をちゃんと説明する](https://qiita.com/fuqunaga/items/b1a3e38af71f062f0781)
Ollamaを使い、GraphAIのチュートリアル（Hello World）を無料で試す方法について

## はじめに

[GraphAI](https://github.com/receptron/graphai)は、データフローグラフを使って非同期プロセスをシンプルに定義できるツールです。  
GraphAIを試す際に以下チュートリアルがあるのですが、チュートリアルがOpenAIをすることを前提に記載されてるため、無料でチュートリアルができるよう[Ollama](https://ollama.com/)を使ったやり方を説明します。

- [GraphAI チュートリアル | GitHub](https://github.com/receptron/graphai/blob/main/docs/Tutorial.md)

## GraphAI チュートリアル（Ollamaバージョン）

### インストール方法

GraphAIを使うために、次の手順に従ってGraphAIクライアントをインストールしてください。

```bash
npm i -g @receptron/graphai_cli
```

次に、現在のディレクトリに OPENAI_API_KEY を含む .env ファイルを作成してください。

```bash:.env
OPENAI_API_KEY=sk-...
```

注）
実際にはこちらは使われないが、設定しないと以下のエラーが発生するためサンプルの通りのファイルを用意してください。

```
$ graphai hello.yaml 
<-- NodeId: llm, Agent: openAIAgent
{ namedInputs: { prompt: "Explain ML's transformer in 100 words." } }
OpenAIError: The OPENAI_API_KEY environment variable is missing or empty; either provide it, or instantiate the OpenAI client with an apiKey option, like new OpenAI({ apiKey: 'My API Key' }).
```

Ollamaのインストール方法については各種記事がありますので、そちらを参考にしてください。



### 実行方法

まずは、下記の内容を`hello.yaml`という名前のファイルに保存してください。

```yaml:hello.yaml
version: 0.5
nodes:
  llm:
    agent: openAIAgent
    params:
      model: llama3
      baseURL: http://127.0.0.1:11434/v1
    inputs:
      prompt: Explain ML's transformer in 100 words.
  output:
    agent: copyAgent
    params:
      namedKey: text
    console:
      after: true
    inputs:
      text: :llm.text
```

その後、yamlファイル（「hello.yaml」など）を準備し、次のように入力します。

```bash
graphai hello.yaml
```

### 実行結果

ターミナルに次のように表示されればOKです。  
なお実際に実行した環境（MacBook Pro 2.4GHzクワッドコア Intel Core i5）だと実行結果がでるまで30秒ほどかかりました。

```
$ graphai hello.yaml
The Transformer is a neural network architecture introduced in the paper "Attention Is All You Need" by Vaswani et al. in 2017. It's primarily designed for machine translation tasks, but has since been widely applied to other areas, such as text classification, question answering, and language modeling. The Transformer eliminates the need for recurrent or convolutional layers by relying solely on self-attention mechanisms to process input sequences. This is achieved through an encoder-decoder structure, where the encoder breaks down the input into a sequence of tokens, and the decoder generates the output based on these tokens' relationships.
{}
```

## まとめ

この記事では、GraphAIの基本的なチュートリアルをOllamaを利用して無料で試す方法について解説しました。  

現在、メルマガ「週刊 Life is beautiful」が2025年で足かけ15年を迎えることを記念してアイデアソン・ハッカソンが進行中です。
この記事の内容を活用して、アイディアソン・ハッカソンに参加し、GraphAIを使ったアイデアやプロジェクトを開発して盛り上げていけたら嬉しいです。

https://github.com/snakajima/life-is-beautiful
【Mac】Dockerを使ったLambdaレイヤーの作り方(Python版)

- zipをローカルで作成し、それをAWSコンソール上でアップロードする方法です
- LambdaのランタイムはPythonを想定しています
- `pip`でインストールできるライブラリが対象です
- Lambdaレイヤーの詳しい説明は省きます
- 参考元(AWS公式): https://repost.aws/ja/knowledge-center/lambda-layer-simulated-docker
## 前提
- ローカルPC上でdockerコマンドが実行できること
## 手順
### 1. ディレクトリ作成
- ローカルPCのターミナルで好きな場所にディレクトリを作り、その中に移動
### 2. requirements.txt作成
- `requirements.txt`を作成し、レイヤーにしたいライブラリを記載する

(例)pandasのver.2.2.3のレイヤーを作成したい場合
```requirements.txt
pandas==2.2.3
```
### 3. ライブラリをローカルに作成
- 下記コマンドを実行
```
docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.13" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.13/site-packages/; exit"
```
- 実行が終わると、「python」というディレクトリが作られており、その中にライブラリが入っているはずです

**補足**
- 上記はPython3.13の場合です。Lambda関数のPythonのバージョンに合わせて、上記コマンドの**2箇所の**数字を変えてください
- platformを指定することもできます
    - `x86_64`で作成したい場合は下記のように`--platform=linux/x86_64`をつけます
```
docker run --platform=linux/x86_64 -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.13" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.13/site-packages/; exit"
```
- platformはLambda関数の「アーキテクチャ」に合わせる必要があります
    - 特に、対象のLambda関数のアーキテクチャが`x86_64`かつ、M2以降のAppleシリコンのMacを使用している方は、こちらをつけないとLambda実行時にエラーになると思います
- Lambda関数のアーキテクチャは、その関数のページの下の方に書いてあります
![スクリーンショット 2024-12-05 14.32.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396053/dc7a88cd-3b19-e0d7-cc3c-08920990934e.png)

### 4. zipにまとめる
- 下記コマンドを実行
```
zip -r mypythonlibs.zip python > /dev/null
```
- 「mypythonlibs.zip」というファイルが生成されているはずです
### 5. AWSコンソールでレイヤーを作成
- AWSコンソールから、「Lambda」→「レイヤー」に移動し、「レイヤーの作成」ボタンを押す
- 以下のように入力し、「アップロード」ボタンから先ほど作成した`mypythonlibs.zip`をアップロードする
    - ※mypythonlibs.zipが10MBを超える場合は、「Amazon S3 からファイルをアップロードする」の方式にしてください
        - 一旦S3にzipをアップロードし、そのパスを指定する、という流れです

![スクリーンショット 2024-12-05 16.03.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396053/72b79378-b79f-b3ad-740d-deb8769eece4.png)
- 「**説明**」のところにライブラリのバージョンを書いておかないと、バージョンが非常に追いづらくなるため、**画像のように書くことをお勧めします**
- 「作成」ボタンを押して完了です
## 補足
- requirements.txtに複数のライブラリを書いて作成することもできます
```requirements.txt
requests==2.32.3
jpholiday==0.1.10
```
- 一つのLambda関数に追加できるLambdaレイヤーは個数制限があるので、複数の軽量なライブラリを一つのレイヤーにまとめて、頑張って切り詰めなければいけない場面もあるでしょう……
    - ※個数に余裕がある場合は、まとめない方が管理しやすいと思います
情シスへ異動して意識的に変えたコミュニケーション方法

:christmas_tree: [LITALICO Engineers Advent Calendar 2024](https://qiita.com/advent-calendar/2024/litalico) シリーズ 2：10日目の記事です:christmas_tree:

## はじめに
どうもこんにちは。
株式会社LITALICOでITサポートグループに所属している@3939_ohagiです。

2024年4月にこのグループへ異動してきました。
社内のありとあらゆるIT面でのサポートを実施する組織で、
「情シス」に言い換えると伝わりやすいかと思います。

以前は別のグループにインフラエンジニアとして所属していました。
自分のこれまでの経歴とは畑違いの場所に異動してから
意識的に変えたこと・実行したことを書いていきます。

:::note info
異動するまでの心の変化は別記事に書いているので、
セットでお楽しみください！
**「["ITエンジニアらしさ"の思い込みから解放された話](https://qiita.com/3939_ohagi/items/f8039c32b5be22cf40bf)」**
:::

## この記事で得られること
- 新しい環境へ行くときに、ちょっと勇気づけられるかも。
- 「あたりまえだけど大事なこと」を見直す機会になるかも。

## 最初はちょっと尻込み

ITサポートとしての業務は、想像以上に多岐にわたっています。

- 物理的な業務（PCキッティング、配送、その他周辺機器の手配etc...）
- SaaSまわりの請求業務
- 社内からの問い合わせ対応
- 人の動き（入社/異動/退職）に伴う各アカウントの改廃
- PCの台帳管理や、棚卸し

ざっと書いただけでもこれだけあり、
社員数が5000人を超えているので想像以上にハードな場面も多々あります。

グループのメンバーはエンジニア出身ではない方がほとんどなので、
なんとく今までと雰囲気が違う気がしました。

特に、チャットでのやり取りがすごく活発で情報の動きがかなり速いです。
これは追いつくまで大変かもしれない...とすこし尻込みをしたものの、それは一瞬でした。

## 自分を知ってもらうための行動

さっぱりわからないことだらけの環境なので、
とにもかくにも、やっぱり「すぐに聞く」しかありません。

以前の私はこの行為がすごく苦手で、直すまでとても時間がかかりました。
あれやこれやと考えて、「もし突っ込まれたらどうしよう」とリスク回避したくて
余計な情報も盛り込みまくったり...今聞いたら迷惑かな...とおどおどしたり。
報告まで時間もかかるし、やっとの思いで報告や相談をしても一瞬で解決してしまうようなことも。

こうした経験から、「突っ込まれたら直せばいいや」と
ある意味開き直る能力を身に着けたので、何振りかまわず質問をしまくることを意識しました。
しかも異動後の大事なスタートダッシュですから、

- なにを知らないのかわかってもらう
- なにができるのかわかってもらう

この2点が伝わるように動くことにしました。

## できることをやる、やりまくる

「とにかく聞く」という行為でなにを知らないのかを把握してもらいつつ、
私ができることのアピールも意識的に行いました。

会議で決まったこと、経緯、議論したこと...などを書き残すという文化が
あまりないグループだったので、そこに目を付けました。
逆に私は口頭だけでのやり取りはすぐに忘れてしまうし、自分や一緒に仕事をする人を守るためにも昔から書き残すことには強いこだわりがありました。

また、社員からの問い合わせ対応で一役買えるとわかってからは、
日々大量に舞い込む依頼を適切に捌き、滞りなく進める作業が性に合っているとも感じました。

問い合わせをこなすことで幅広い知識も自然と身につくので、
任せてもらえる範囲を徐々に広げることができました。

## あたりまえだけど大事なこと

ITサポートの業務は複雑なパズルのように思います。

もくもくと案件を進める今までのスタイルとは違って、
かなりマメに情報のキャッチボールが必要で、それぞれ絡みあっている話題が多いためです。
物理的な業務もあるので、いつまでに発送するか手配するかを考えてスケジュール調整をしたり、正直無茶ぶりな当日対応を求められることもあります。

そのためお互いに頼り頼られる場面はかなり多く、そうしないと先に進むことができません。
なので、具体的に感謝を伝えることを意識しています。
「●●してくれて、ありがとうございます。」という感じに。

これは完全に私のスタイルなので人に強要するものではないですが、
「何事も言わないと伝わらない」が行動原理になっているので
こんな風に気を遣って助けてくれたことが嬉しいですと**伝わるように伝えること**を大切にしています。

## 最後に

「わかってはいるけどなかなかできないよ...」という人もいるかもしれません。
偉そうに書きましたが、私も10年以上なんとか働きながら身に着けたことなので、
とにかく焦らずにいきましょう。
はたから見たら、すごく輝いている人も絶対に泥臭いことをしています。
あまり皆さん見せてくれない部分でもあるので、私はそんな泥臭さを書き残してみました。

---

明日（12/11）のLITALICOアドベントカレンダーは
- @tomoki-oke さん
- @nonikeno さん

による記事となっています！ワイワイ！
UiPath Friends Festival 2024を振り返る

本記事はUiPath (produced with UiPath Friends) Advent Calendar 2024への参加ブログです。

#### 参加の経緯

　今年は転職活動やkintoneの活動にコミットしていたので参加自体を見送る予定だったのですが、DMいただいたのをキッカケに参加を決意しました。UiPathに触れてなかったり、ほぼ毎月参加していたもくもく会の参加もできなくなっていたので不安が正直ありました。そんな私でしたが、皆様が受け入れてくださったおかげで当日迎える頃には不安は1ミリもありませんでした。

#### 今年も司会をやって

　不安があるならよせば良いのに、何を血迷ったのか立候補してしまいました。正直、直前までは技術解説が必要なシーンは相方のいわさきさんに頼らせてもらおうと考えてました。ただ、幸い無事に担当した前半部分のセッションは技術的な話はなく、いわさきさん自身も出られるセッションがあり、良い意味で追い詰められてなんとか自分で話すことができました。去年は会場のデカい機器にビビってしまいましたが同じ会場と色んな登壇を経て、緊張している感覚はありませんでした。

#### 印象に残ったセッション

　司会やりながら特等席で聴いてた「未来を切り拓け！オートメーションプロフェッショナルのキャリアを考えてみよう」です。
　転職した直後で、キャリアと向き合った一年だったので余計感情移入してしまいました。
　市民開発者の評価というか「本業務しながらシステムで業務改善すること」に対する評価がこの一年で大きく変わったと感じていたのを言語化されていました。
　シンプルに評価が上がったというより、評価側の理解が進んで解像度が上がってるんだなという感じですね。「システムを使う」ことは手段であって目的ではない、というのは頭ではわかっていてもなかなか納得できません。ただ、やって「頑張りました」では評価されず、結果を出してそれを見て評価される世の中になってきて、安心しました。
　なんとなくですけど、コミュニティなどで社外の交流があるのとそうでない会社や人で格差がより拡がっていることも言えると思います。

#### 自分自身のLT

　新しい技術に触れて覚えて人に話せるようにするためにはそれなりの学習コストが必要だということを改めて痛感しました。それでもプログラミングを習得するよりかは遥かに楽になっているはず……なのに、少し触った程度で当日を迎えてしまいました。去年より良かったところが一つだけあってスケジュール逆算しながら内容を修正してそれなりの内容にまとめられたところですね。コミュニティ登壇は完璧を目指さない方が却って良いという体験を得ました。

#### まとめ

　相変わらずド素人に近い私を受け入れてくれるどころか支えてくれて感謝しかありません。UiPathはここ一年で単純なRPAではなく、AI絡めた業務改善ツールになっているのを感じています。せっかくの機会なのでもっとキャッチアップしていきます。
【React】Recharts を使用して円グラフを実装する

## はじめに
学習アプリや筋トレ系のアプリを作成する際に実施した時間を項目別にグラフで表現したいな思う時があったので円グラフの実装の仕方をまとめました。
これをベースにしてDBから取得したデータを表示するなど改造していけると思います。
今回は**Rechart**というライブラリを使用しました。

## Rechartとは

Recharts は React 向けの簡単でカスタマイズ可能なチャートライブラリです。特に、React のコンポーネントベースの設計にマッチしており、直感的に使えるのが特徴です。このライブラリを使用すると、円グラフ、棒グラフ、折れ線グラフなどさまざまなデータビジュアライゼーションを簡単に作成できます。

## 円グラフの実装方法
では、実際に Recharts を使って円グラフを実装するコードを見ていきましょう。以下の手順に沿って進めていきます。
1. 必要なパッケージのインストール
1. 基本的な円グラフコンポーネントの作成
1. グラフにデータっを与えて表示

### 1.必要なパッケージのインストール
まず、Recharts をプロジェクトに追加しましょう。以下のコマンドを使用してインストールできます。
```
npm install recharts
```
### 2.円グラフコンポーネントの作成
次に、Recharts の PieChart コンポーネントを使って、円グラフを作成します。基本的なコードは以下のようになります。

```react
import React from 'react';
import { PieChart, Pie, Cell, Tooltip, Legend } from 'recharts';
import './chart.css';

const data = [
  { name: 'Group A', value: 400 },
  { name: 'Group B', value: 300 },
  { name: 'Group C', value: 300 },
  { name: 'Group D', value: 200 },
];

const COLORS = ['#0088FE', '#00C49F', '#FFBB28', '#FF8042'];

export const SimplePieChart = () => {
  return (
    <div className="chart-container">
      <PieChart width={400} height={400}>
        <Pie
          data={data}
          cx={200}
          cy={200}
          outerRadius={150}
          fill="#8884d8"
          dataKey="value"
          label
        >
          {data.map((entry, index) => (
            <Cell key={`cell-${index}`} fill={COLORS[index % COLORS.length]} />
          ))}
        </Pie>
        <Tooltip />
        <Legend />
      </PieChart>
    </div>
  );
};
```

### グラフにデータを与えて表示
上記のコードでは、まずデータセットを定義し、それを Pie コンポーネントに渡しています。このデータは円グラフの各部分に対応し、value プロパティで各部分のサイズを決定します。また、Cell コンポーネントを使うことで、各セクションに異なる色を設定することができます。

PieChart と Pie のプロパティについて簡単に説明します。

- data：グラフに表示するデータ
- outerRadius：円グラフの半径
- dataKey：データからグラフに使用するキーを指定します
- label：各部分のラベルを表示するかどうか

## 完成図


![名称未設定のデザイン.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2120218/050f7d82-f5ed-fa93-6d1f-3bdfe0c922a6.gif)
RAGとNode-REDの統合

## RAGの基本概念

RAG（Retrieval Augmented Generation）は、情報検索と生成を融合させた革新的な技術です。この技術は、外部データベースから関連情報を取得し、それを基にテキストを生成するプロセスを通じて、より正確で文脈に即した応答を提供します。具体的には、ユーザーの質問に対して、まず関連する情報を検索し、その情報をもとに自然言語での回答を生成します。これにより、従来の生成型AIの限界を克服し、リアルタイムでの情報提供が可能となります。

RAGは、特に質問応答システムや自然言語処理タスクにおいて、その性能向上が期待されています。例えば、カスタマーサポートにおけるチャットボットは、RAGを活用することで、ユーザーの質問に対して迅速かつ正確な情報を提供することが可能です。また、医療分野においても、患者の症状に基づいた最新の研究データをリアルタイムで取得し、診断支援を行うことができるため、幅広い応用が見込まれています。

RAGは、従来の大規模言語モデル（LLM）が持つ知識の限界を克服するために設計されました。LLMは訓練データに基づいて情報を生成しますが、RAGは外部のデータベースからリアルタイムで情報を取得し、それを基に生成を行います。このアプローチにより、RAGは新しい情報や専門的な知識を取り入れることができ、より正確で有用な応答を提供することが可能になります。

![スクリーンショット 2024-12-05 14.48.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952120/49b9b33e-7b64-17b3-5dbe-2f75362c7c87.png)

## RAGとNode-REDの統合

RAGとNode-REDの統合は、情報検索と生成のプロセスを効率化するための強力な手段です。RAGは、外部データベースから情報を取得し、それを基に新たなコンテンツを生成する技術であり、Node-REDはそのフローベースのビジュアルプログラミング環境を提供します。この組み合わせにより、ユーザーは複雑なプログラミングを行うことなく、直感的にフローを構築し、RAGの機能を活用することが可能になります。

Node-REDのビジュアルインターフェースは、ユーザーがRAGの機能を直感的に操作できるように設計されています。ノードをドラッグ＆ドロップすることで、情報の流れを視覚的に表現し、各プロセスを簡単に接続できます。このアプローチにより、非エンジニアでも複雑なデータ処理や情報生成のフローを構築できるため、開発の敷居が大幅に下がります。

RAGとNode-REDの統合は、特にIoTやデータ処理の分野での応用が期待されています。例えば、IoTデバイスからのデータをリアルタイムで取得し、その情報を基にユーザーに対して適切なアクションを提案するシステムを構築することが可能です。このようなシステムは、製造業やスマートホームなど、さまざまな分野での効率化や自動化に寄与するでしょう。

## 統合の利点

RAGとNode-REDの統合により、リアルタイムでのデータ処理と情報生成が可能になります。RAGは、外部データベースから情報を取得し、それを基にテキストを生成する技術であり、Node-REDは視覚的にプログラムを構築できるオープンソースのツールです。この組み合わせにより、ユーザーは迅速にデータを処理し、必要な情報を生成することができ、特にIoTやデータ分析の分野での応用が期待されています。

この統合は、開発者が複雑なプログラムを簡単に作成できるようにし、開発時間を大幅に短縮します。Node-REDのフローベースのアプローチにより、開発者は視覚的にデータフローを設計し、迅速にプロトタイプを作成できます。これにより、特に非エンジニアでも簡単にシステムを構築できるため、開発の敷居が大幅に下がります。

また、Node-REDのオープンソース性により、さまざまなコミュニティや企業が統合の利点を享受できます。オープンソースの特性は、開発者が自由にツールをカスタマイズし、他のユーザーと知識を共有できる環境を提供します。これにより、さまざまな業界でのイノベーションが促進され、ユーザーは最新の技術を迅速に取り入れることが可能になります。

## 具体的な使用例

RAGとNode-REDの統合は、特に顧客サービスの分野で顕著な効果を発揮しています。例えば、チャットボットやFAQシステムにおいて、RAGはユーザーの質問に対して関連する情報を迅速に検索し、その情報を基に適切な回答を生成します。Node-REDは、これらのプロセスを視覚的に構築できるプラットフォームを提供し、開発者が複雑なロジックを簡単に実装できるようにします。

医療分野においても、RAGとNode-REDの統合は重要な役割を果たしています。患者の病歴や最新の研究データを基にした診断支援システムでは、RAGが医療情報を迅速に検索し、医師に対して有用な情報を提供します。Node-REDは、医療データのフローを視覚的に管理し、異なるデータソースを統合することで、診断の精度を向上させることが可能です。

さらに、RAGとNode-REDは検索エンジンやデータベース検索システムにおいても活用されています。RAGは、関連情報を迅速かつ正確に取得するための強力な手段を提供し、Node-REDはその情報を効果的に処理するためのフローを構築します。この組み合わせにより、ユーザーは必要な情報を即座に得ることができ、業務の効率化が図られます。
あのMDNがフロントエンド開発者のための無料学習コンテンツを展開している

# はじめに
今回は、MDNが展開しているフロントエンド開発者のための学習コンテンツ、「MDN curriculum」を紹介します。

私自身、最近偶然見つけたもので全然知らなかったので、誰かの勉強リソース探しの助けになればなと思います。

## どんな内容なのか

https://developer.mozilla.org/en-US/curriculum/

> MDN カリキュラムは、フロントエンド開発者として成功するために必要なスキルと実践、および推奨される学習リソースに関する構造化されたガイドを提供します。

主に、フロントエンド開発に必要な知識を得られるようなカリキュラムが組まれているようです。

コアなモジュールとして9つが定義されており(セクションのようなもの)、以下のようなものがあります。

### 1. Web標準
> 通信に使用されるモデル、関連するコアテクノロジー、それらのテクノロジーの作成方法、Web ブラウザーが Web サイトをレンダリングしてユーザーに表示する方法など、Web の高レベルでの仕組みの基礎について説明します。

Webサイトがブラウザにレンダリングされるまでのネットワークの仕組みや、Web標準について述べられています。

### 2. セマンティックHTML
> HTML は、あらゆる Web サイトのコンテンツと構造を定義するテクノロジーです。適切に記述すると、コンテンツのセマンティクス (意味) を機械が読み取り可能な方法で定義する必要もあります。これは、アクセシビリティ、検索エンジンの最適化、およびコンテンツを最適に動作させるためにブラウザーが提供する組み込み機能を利用するために不可欠です。このモジュールでは、言語の基礎をカバーした後、ドキュメント構造、リンク、リスト、画像、フォームなどの重要な領域について説明します

基本的なHTMLの構文やタグ、セマンティックHTML(情報に意味を持たせるHTNL)について述べられています。
また、DevToolsを使用したデバッグについても紹介されています。

### 3. CSSの基礎
> CSS を使用すると、色、テキスト、配置とレイアウト、アニメーションなどのスタイルを Web ページに追加できます。最初の CSS モジュールでは、CSS の仕組みを理解するために必要なすべての基本的な言語メカニズムについて説明します。

CSSの構文、セレクター、cssでの単位などCSSの基本的な知識を学ぶことができます。
こちらも、DevToolsを使用したデバッグについても紹介されています。

### 4. CSSテキストスタイル
> このモジュールは、カスタム Web フォントの読み込みとテキストへの適用など、CSS フォントとテキストのスタイル設定に特に重点を置いています。

テキスト・フォントを主軸に、ウェブフォントやリスト・リンクのstyleについても述べられています。

### 5. CSSレイアウト
> 最新の Web サイトのレイアウトの作成について詳しく説明します。このモジュールでは、フロート、配置、その他の最新のレイアウト ツール、さまざまなデバイス、画面サイズ、解像度に適応するレスポンシブ デザインの構築について説明します。

`float`や`flexbox`、`css grid`など、レイアウト関連が主軸となっています。
現代のWeb開発では必須のレスポンシブデザインについても述べられています。

### 6. JavaScriptの基礎
> JavaScript は、学ぶべきさまざまな機能、スタイル、テクニック、そしてその上に構築された数多くの API とツールがある、非常に大きなトピックです。このモジュールでは、主にコア言語の基本といくつかの重要な周辺トピックに焦点を当てています。これらのトピックを学習することで、作業の確固たる基盤が得られます。

javascriptの基本的な使い方が主になっています。
変数・四則演算からDOM操作、EventListenerや非同期処理、fetchといった最低限Web開発をするための知識が一挙に学べるようです。

### 7. アクセシビリティ
> 公共サービス、教育、電子商取引サイト、エンターテイメントなどの Web コンテンツへのアクセスは人権です。障害、人種、地理、その他の人間的特徴に基づいて誰も排除されるべきではありません。このモジュールでは、Web サイトを可能な限りアクセスしやすいものにするために習得すべきベスト プラクティスとテクニックについて説明します。

アクセシビリティについてまとめられています。
`:focus`・`:hover`や色のコントラスト、テキストのスタイルなどが紹介されています。
スクリーンリーダーやWAI-ARIAの紹介も行われています。

### 8. 開発者向けの設計
> このモジュールの目的は、開発者にデザイン思考を (再) 紹介することです。開発者はデザイナーとして働きたくないかもしれませんが、基本的なユーザー エクスペリエンスとデザイン理論を身に付けておくことは、役割に関係なく、Web サイトの構築に携わるすべての人にとって有益です。少なくとも、最も技術に詳しい「非デザイナー」開発者であっても、デザインの概要、物事がなぜそのようにデザインされているのかを理解し、ユーザーの考え方を理解できる必要があります。また、ポートフォリオの見栄えを良くするのにも役立ちます。

UIデザイン・UXデザインについて述べられています。

### 9. バージョン管理
> バージョン管理ツールは、コードベースのバックアップや共同作業を行うための現代のワークフローに不可欠な要素です。このモジュールでは、Git と GitHub を使用したバージョン管理の基本について説明します。

バージョン管理システムが必要な理由や、Git、Githubについての紹介がされています。

### 拡張モジュール
> これらの「拡張」モジュールは、Web 開発者が知識を広げ、専門性を高めていく際に習得する便利な追加スキルとなります。

ここまでコアモジュールを紹介してきましたが、「拡張モジュール」なるやや専門性が高いセクションがあります。(内容も、概要とリソースのリンクをのせただけのものになる)

興味がある方は見てみてください！

https://developer.mozilla.org/en-US/curriculum/extensions/

## おわりに
今回は、「MDN curriculum」について簡単な紹介をしました！

惜しむらくは英語であることと、紹介されているリソースを見なければいけない(このサイト内で完結しない)ことでしょうか。
ただ、MDNのコンテンツなの信頼度は高い...はず。

興味のある方ぜひ、このコンテンツを使用して学習をしてみてください！
Reactのディレクトリ構成はどうあるべき？

引き継ぎの案件(途中まで実装されている状態)で、react開発を進めていく中で自分が初めから作るとしたらどんなディレクトリの構成が最適か考えたのでまとめてみることにしました。

### なぜディレクトリ構成が重要なのか

ディレクトリ構成は開発の効率に大きく関わります。
より良い構成であれば、どこに何があるかが明確になり機能の追加や修正がスムーズになります。
また、初見でもプロジェクト全体の構造を理解しやすくなります。

### 現状の課題
- ボタンやダイアログなどの汎用性の高いコンポーネントが components フォルダ内に集約されているが、類似のコンポーネントが複数のディレクトリに分散しているため、管理が難しくなっている
- 各機能が features フォルダ内にあるものの、サブディレクトリやファイルがまとまっていないため、探しにくい部分がある

### 改善案
- components の整理
  - components/shared: Material UI コンポーネントを組み合わせた共通コンポーネントを配置
  - components/layout: ページを構成するためのデザインフレームを提供するコンポーネントを配置
- features の整理
  - features/{feature_name}/components
各機能に特化したコンポーネントを配置。特定の機能に関連するビジネスロジックやUIを処理するコンポーネントをこのディレクトリに格納します。
例) features/auth/components/EmailForm,features/project/components/ProjectDetail

  - features/{feature_name}/hooks
特定の機能に関連するカスタムフックを配置。状態管理やAPIとのやりとりなど、機能固有のファイルをこのディレクトリに集めます。
例）features/hooks/useFetch, features/hooks/usePost



### 結論
ディレクトリ構成の最適化は、プロジェクトの規模が大きくなるにつれてその重要性が増します。適切な構成を採用することで、開発の効率が上がり、コードの可読性や保守性も向上します。コードの追加や修正が容易になるように意識したディレクトリ構成をすることが重要です。
Macのストレージの「システムデータ」をEdgeが食いつぶしていたので対処した

# 概要
- 環境：MacBook Air(M1, 2020), macOS Sequoia(15.1.1) 
- Macのストレージの「システムデータ」が肥大化していた。
- 原因を調べたところ，過去にインストール(してアンインストール)したMac用のEdgeがアンインストール後も大量に容量を食っていたので関連ファイルを削除した。
- おまけ：Dockerも容量を食っていたのできれいにした。

# やったこと
### Edgeのバージョンファイルの削除 
- Macのターミナルで以下を実行して容量を食っているフォルダを探した。
```
sudo du -sh /System/* |sort -nr
```

- 以下の「EdgeUpdater」というフォルダがxxGBもある。
```
/System/Volumes/Data/Library/Application Support/Microsoft/EdgeUpdater
```
- 中を見ると，Edgeを使っていた際のアップデートごとのバージョンが全て格納されていた(各1GB弱程度)。
    - ソフトをアンインストールしてもこれは消えない模様。2023年3月のEdgeの仕様変更以降発生している可能性がある。
    - [macOS 用 Microsoft Edge が Microsoft AutoUpdate から EdgeUpdater に切り替わります](https://learn.microsoft.com/ja-jp/deployedge/edge-learnmore-edgeupdater-for-macos)
- フォルダごと削除した。

    - なお，本件に関する情報は少なかった(MacにEdgeを入れようという人が少数のため？)が，海外のスレッドでも同様の事象が報告されていた。
	 - [I cannot believe that they kept so many versions of Edge on Mac](https://www.reddit.com/r/MicrosoftEdge/comments/1feoiv5/i_cannot_believe_that_they_kept_so_many_versions/)

### おまけ：Dockerの掃除
- 容量調査時に，Dockerのファイルもとても大きいことに気がついた。
- Dockerを起動した状態で，ターミナルで以下を実行してDockerの中身をきれいにした。
```
# Dockerイメージをクリーニング
docker image prune -a -f
# Dockerコンテナをクリーニング
docker system prune -a -f
# Dockerのファイル状態を確認
docker system df
```

以上です。
GraphAI リンク集

#GraphAI リンク集

GraphAIに関する主要なリンクを以下にまとめました：

## 公式サイトとドキュメント
 - GraphAI公式ウェブサイト: https://singularitysociety.org/projects/ai/graphai
 - GraphAI GitHub リポジトリ: https://github.com/receptron/graphai.git
 - GraphAI ドキュメンテーション: https://github.com/receptron/graphai/tree/main/docs
## チュートリアルとガイド
 - 公式チュートリアル: https://github.com/receptron/graphai/blob/main/docs/Tutorial.md
 - 公式サンプル: https://github.com/receptron/graphai_samples
 - GraphAIの紹介: https://singularitysociety.org/projects/ai/graphai/graphai-tutorial-1/
 - GraphAIの解説: https://singularitysociety.org/projects/ai/graphai/graphai-about/
## ブログと記事
 - GraphAI 関連 - Note記事: https://note.com/search?q=graphai&context=note&mode=search
 - GraphAI 関連 - Zenn記事: https://zenn.dev/topics/graphai 
 - GraphAI 関連 - Qiita記事: https://qiita.com/search?q=graphai
## ビデオとプレゼンテーション
 - GraphAI 紹介ビデオ: https://www.youtube.com/watch?v=0mh_Nu9SefQ&t=1225s
 - Fullstack AI Dev & Raycast Summit feat. Satoshi Nakajima(基調講演): https://www.youtube.com/live/sPTnyuO9OCA
Node-REDでRAG（Retrieval-Augmented Generation）


## Node-REDとRAGの統合

RAG（Retrieval-Augmented Generation）とNode-REDの組み合わせは、特にデータ処理やAIアプリケーションにおいて非常に有効です。Node-REDは、視覚的なプログラミングツールであり、さまざまなデータソースやAPIと簡単に統合できるため、RAGの実装に適しています。

## [node-red-contrib-ml-rag](https://flows.nodered.org/node/node-red-contrib-ml-rag)

このモジュールは、機械学習アプリケーション向けのノードセットを提供し、PDFファイルの解析やテキストの分割、埋め込み生成などが可能です。これにより、大量のデータを効率的に処理し、必要な情報を迅速に取得できます。


## 実際の使用例
PDFファイルからの情報抽出: rag-pdf-loaderノードを使用してPDFファイルをページごとに解析し、その内容をテキストとして抽出します。次に、rag-document-splitterノードでテキストをチャンクに分割し、それらをrag-embedding-generatorで埋め込みベクトルとして生成します。このプロセスは、情報検索や質問応答システムで非常に役立ちます。

ユーザーインターフェース: Node-REDは視覚的なインターフェースを提供するため、ユーザーはフローを簡単に設計し、API呼び出しやデータ処理の流れを直感的に理解できます。これにより、技術的な知識が少ないユーザーでもRAGシステムを利用できるようになります。

## まとめ

Node-REDとRAGの組み合わせは、高度なデータ処理能力と使いやすさを兼ね備えた強力なソリューションです。特に機械学習や自然言語処理の分野では、この組み合わせが新しいアプリケーションやサービスの開発を加速させるでしょう。
2024年のプロデル改良点まとめ

# TL;DR

- 公式サイトが引っ越しました
- 条件文の「もし」の省略と、末尾は「そして」へ
- `大きければ`,`小さければ`,`超えれば`,`満たせば`の追加
- 添字の基が0からとなる`#`記号
- TTSneo風の関数定義
- 代入文`は`の右辺が定数の時に分かち書き不要に

※記事はプロデル1.9.1288、スミレ畑1.9.1273時点で有効な内容です

# アドレスが変更になりました

今年から新しいドメイン(irelang.jp)に引っ越ししました。
お気に入り・ブックマークの変更やリンク先の変更をお願いします。

[https://produ.irelang.jp/](https://produ.irelang.jp/)


# 条件文の「もし」の省略と、末尾は「そして」へ

これまでプロデルの条件文は`もし□なら`～`もし終わり`という形が定番でした。ただこの表記は冗長な所がありました。

去年末のアップデートでは、条件文の`もし`を省略できるようになりました。今年はさらに`もし終わり`の代わりとなる`そして`句を採用しました。今後は`□なら`～`そして`という表記となり、かなり短く書けるようになります。

また、繰り返し文も同様に`繰り返し終わり`の代わりに`そして`を使えるようになりました。今後は`繰り返す`～`そして`という形で短く書けるようになります。


```
※コンソール
総数は100
データは、空の配列
Xを2から総数まで1ずつ増やしながら繰り返す
　　データのX番目は1
そして

Xを2から総数まで1ずつ増やしながら繰り返す
　　データのX番目が1なら
　　　　Xを出力して改行する
　　　　YをXから総数まで1ずつ増やしながら繰り返す
　　　　　　データの（X×Y）番目は0
　　　　そして
　　そして
そして
```

# "大きければ","小さければ","超えれば","満たせば"の追加

プロデルでは、手順呼出しの動詞を仮定形で書くと、それをそのまま条件文の「なら」の代わりとして使えます。

```
「写真1.jpg」というファイルが存在すれば
    「見つかりました」と表示する
そして
```

今年のアップデートでは、比較演算子の一部だった「大きい」「小さい」でも仮定形を使えるようになり、`□が△より大きければ`、`□が△より小さければ`と書けるようになりました。
さらに、`□が△を超えれば`、`□が△を満たせば`という表記も書けるようになりました。

```
Xが0より小さければ、Xは0
Yが1000より大きければ、Yは0
```

```
「購入金額は?」と聞いて合計金額とする
送料は650
合計金額が2000を満たせば、送料は0
「送料は[送料]円です。」を報告する
```


```
5だけ｛「A」,「B」,「C」｝をハノイする

【値:整数】だけ【塔:文字列の配列】を、ハノイする手順
	値が0より大きければ
		値-1だけ｛塔(1),塔(3),塔(2)｝をハノイする
		値&「番の円盤を」&塔(1)&「から」&塔(2)&「へ移動」&改行を出力する
		値-1だけ｛塔(2),塔(1),塔(3)｝をハノイする
	そして
終わり
```

このように比較演算をより日本語らしく書けるようになりました。

正直、`大きければ`,`小さければ`に関しては大小比較演算子`<`,`>`を使う方が圧倒的に短く書けます。ただビジネスロジックを書く時や、アルゴリズムを書く時などは、むしろ日本語の方が可読性が高いこともあるかもしれません。そのような期待でサポートしています。

# 添字の基が0からとなる「#」記号

プロデルの配列では、伝統的に添字が1から始まります。
この仕様は『配列の1番目』、『配列の2番目』と日本語らしく表記できる利点があるものの、主要のプログラミング言語が0から始まることで、アルゴリズムの移植が簡単にできないなどの点がありました。

そこで次のような「#」記号を使うことで、添字が0からはじまる配列アクセスができるようにしました。

```
一覧は{1,2,3}
一覧#0を報告する
一覧#2は30
一覧を報告する
```

# TTSneo風の関数形式

名詞手順について、TTSneo風の関数定義をサポートしました。
引数を多く必要とする演算に使用できます。
なお、この関数形式では戻り値を必ず返す必要があります。戻り値をなしとすることや、式以外で呼び出すことはできません。

```
Vは、演算(2,3)
Vを報告する

演算(X,Y)の手順
	X*Y+1を返す
終わり
```


# 代入文「は」の分かち書き省略

これまで代入文の`は`は、「、」やスペースで分かち書きすることが必須でしたが、解析に支障が無いケースで省略可能となりました。

### 「は」の分かち書きが省略できるケース
右辺を、次の式で単独に書く場合です。
- 数値定数(`123`, `3.14` など)
- 文字列定数/文字列式(`「こんにちは」`、`「現在[時刻]です」`など)
- 配列定数 (`{1,2,3}`など)
- 真偽値 (`真`,`偽`,`○`,`×`)
- 無定数 (`無`)
- ブロック文 (`『』`)
- 丸括弧 `( )`,四角括弧`[ ]`

```
値は123
内容は「こんにちは」
一覧は{1,2,3}
結果は×
項目は無
結果は(A+B)
```

### 省略できないケース
右辺が次の場合です。
- 変数 (`値`,`内容`,`X`,`Y`など)
- 計算式 (`A+B`など)
- 手順呼出し式
- 色定数 (`赤`,`黄色`,`緑`など)
- 列挙値定数 (`なし`,`固定` など)

```
値は、X
値は、A+B
結果は、1から10までの乱数
テキストの色は　赤
窓の種類は　固定
```


# 少しでも魅力的に

これまでプロデルの文法は、多少の冗長な記述を許容して、日本語らしさやプログラムとしての読みやすさを優先してきました。

今後は、プロデルの日本語プログラミングらしさを保ちつつも、プログラムとして簡潔さや、プロデルを知らない人が初めて見た時に感じる、魅力度を上げられるかどうかも、大切にしていきたいと思います。

開発25周年となったTTSneo/プロデルですが、知名度は上がらないままです。こうして地道にプロデルをより魅力的なプログラミング言語に改良していく事しか、できることはないと思っています。