OmniAICreator/Qiita-1.07M huggingface dataset:
ピタゴラスの定理

ピタゴラスの定理の証明では「適切な前提条件を要請することで、長さ関数が一意的に決定されてしまうこと」を言わないといけない。しばしば混乱するのは、何が前提なのかがわからないこと。以下の議論では「２次元ベクトル空間に距離関数を自然に導入する」と自然とピタゴラスの定理と対応ずけられることを示す。幾何学的な直感は要請に押し込められる。

#### 長さ関数L(a,b)を適切に定義すること

２次元のベクトル空間を考える。基底{${\bf e}_1,{\bf e}_2$}が設定されているとして、ベクトルを(a,b)で表わす。長さ関数$L(a,b)$を定義したい。このとき、以下の２つを要請することにする。以下任意のa,b,εについて成り立つとする。

　要請1：$L((1+ε)a,(1+ε)b) = (1+ε)L(a,b)$ 
　要請2：$L(a,b)$を保つ微小変換が存在すること。微小なので線形としてよい。
　要請3：微小変換この微小変換は[向きつき面積](https://qiita.com/takaokotani/items/96e5f7d5f6e3c5f2979e)の意味で面積を保つこと。

これらの要請は「われわれの住む物理的な世界を数学的な記述に落とし込むため」に必要だと考える要請である（これらの要請のかわりに、他の要請を取ってもいいが、いずれにせよ、要請それ自体を証明することができるというものではない）。

要請2の$L(a,b)$を保つ微小線形変換は２ｘ２行列で書けるが、要請3により行列式の値は１である。また、要請1により微小線形変換の固有値は実数であれば１でないといけない。よって、この微小線形変換は、（基底を選び直す操作を考えれば結局）微小回転$(a,b)\rightarrow(a-εb,b+εa)$と書ける。

要請1と微小回転による距離の不変性について、$L(a,b)$のεの一次の項までを考えると、
```math
a\frac{\partial L}{\partial a}+b\frac{\partial L}{\partial b}=L 
```
```math
-b\frac{\partial L}{\partial a}+a\frac{\partial L}{\partial b}=0
```
を満たす。これらより、
```math
\frac{\partial L}{\partial a}=\frac{aL}{a^2+b^2} \\
```
```math
\frac{\partial L}{\partial b}=\frac{bL}{a^2+b^2}
```
$L$で割ると左辺は$\frac{\partial \log{L}}{\partial a}$,$\frac{\partial \log{L}}{\partial b}$となる。これらの式は、可積分条件$\frac{\partial^2 \log L}{\partial a\partial b}=\frac{\partial^2 \log L}{\partial b\partial a}$を満たしている。積分定数を定めるため$L(a,0)=a$とおくと、解は
```math
L(a,b)=\sqrt{a^2+b^2}
```
となる。結局、上記の要請のもとで長さ関数を定義したことになる。
AIモデルの構築入門：SVMの実装

# はじめに
　この記事では、AIモデルの構築について基本的なフローを解説します。具体的には、サポートベクターマシン（SVM）を用いて、Pythonでモデルを構築する方法を紹介します。私たちは既存の無料のデータセットを利用するため、データ収集の手間はありません。AIモデルの構築に必要な基本的なスキルを学び、実装経験を積むための記事です。

# 1. 問題定義とデータセットの選択
　この記事では、SVMを用いた二値分類問題を扱います。具体的なデータセットとしては、アイリスデータセットを使用します。このデータセットには、アイリスの花の4つの特徴（がく片の長さと幅、花びらの長さと幅）が記録されており、その花がどの種類のアイリスか（setosa、versicolor、virginicaの3種類）がラベル付けされています。

# 2. データの読み込みと前処理
　Pythonのライブラリであるscikit-learnからアイリスデータセットをインポートします。また、データの前処理として、不要な特徴量を削除したり、ラベルを二値化（versicolorかどうか）する作業を行います。
```python
from sklearn import datasets
from sklearn.preprocessing import LabelBinarizer

# データセットの読み込み
iris = datasets.load_iris()

# データフレーム化
df = pd.DataFrame(iris.data, columns=iris.feature_names)

# ラベルの二値化
lb = LabelBinarizer()
df['species'] = lb.fit_transform(iris.target)

# 先頭5行を表示
df.head()

```

# 3. モデルの訓練
　サポートベクトマシンは、scikit-learnのsvmモジュールに含まれています。ここでは、訓練データとテストデータを分割し、SVMモデルを訓練します。
```python
from sklearn import svm
from sklearn.model_selection import train_test_split

# 特徴量とラベルに分割
X = df[iris.feature_names]
y = df['species']

# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2,random_state=42)

# SVMモデルのインスタンス作成
clf = svm.SVC()

# モデルの訓練
clf.fit(X_train, y_train)

```

# 4. モデルの評価
　訓練したモデルの評価を行います。評価指標は精度を使用します。scikit-learnのmetricsモジュールを使用して評価します。また、結果を視覚的に理解するために、混同行列を可視化します。
```python
from sklearn import metrics
import seaborn as sns

# テストデータで予測
y_pred = clf.predict(X_test)

# 精度の計算
print("Accuracy:", metrics.accuracy_score(y_test, y_pred))

# 混同行列の作成
cm = metrics.confusion_matrix(y_test, y_pred)

# 混同行列の可視化
sns.heatmap(cm, annot=True)

```
# 5. モデルのチューニング
　ここでは、モデルのハイパーパラメータを調整します。SVMの主要なハイパーパラメータには、Cとgammaがあります。ハイパーパラメータの最適な組み合わせを見つけるために、グリッドサーチを使用します。
```python
from sklearn.model_selection import GridSearchCV

# グリッドサーチのパラメータ
param_grid = {'C': [0.1, 1, 10, 100, 1000], 
              'gamma': [1, 0.1, 0.01, 0.001, 0.0001]}

# グリッドサーチの実施
grid = GridSearchCV(svm.SVC(), param_grid, refit = True, verbose = 3)
grid.fit(X_train, y_train)

```
# 6. モデルのデプロイ
　訓練されたモデルを保存し、新たなデータに対して予測を行うことで、モデルをデプロイします。Pythonのpickleライブラリを使用してモデルを保存します。
```python
import pickle

# モデルの保存
with open('model.pkl', 'wb') as f:
    pickle.dump(clf, f)

```
保存したモデルは以下のようにして読み込むことができます。
```python
# モデルの読み込み
with open('model.pkl', 'rb') as f:
    clf_loaded = pickle.load(f)

# 新たなデータでの予測
# new_data = ... （新たなデータ）
# predictions = clf_loaded.predict(new_data)

```
# まとめ
　以上、Pythonを使ったサポートベクトマシンを用いたAIモデルの構築について説明しました。ここでは、問題定義、データの収集と前処理、モデルの選択と訓練、モデルの評価とチューニング、そしてモデルのデプロイのステップを通じて、モデル構築の一連の流れを学びました。

AIモデルを構築するためには、他にも多くのスキルが必要となります。それらのスキルについて学ぶための[リソース](https://qiita.com/yutut/items/143cfd496a8eef299699)がありますので、ぜひ参照してください。

最後に、モデルがデプロイされてからも、モデルの性能をモニタリングし、必要に応じてモデルを再訓練することが重要です。このプロセスは継続的なものであり、データとともにモデルも進化し続ける必要があります。

今回学んだことを基に、あなた自身のAIモデルを構築してみてください。そして、その過程で遭遇するであろう新たな課題や疑問に対して、自ら解を見つけ、学びを深めていくことをお勧めします。さあ、あなたのAIジャーニーをスタートしましょう！
dataclasses-json：`from __future__ import annotations`が有効な状態で`schema().load()`を実行するとwarningが発生する

# 環境
* Python 3.11.2
* dataclasses-json 0.5.7
* marshmallow 3.19.0


# 何が起きたのか？
以下のコードを実行したら、`Task.schema().load()`で、`Unknown type int at Task.count`というwarningが発生しました。

```python:sample.py
from __future__ import annotations
from dataclasses_json import DataClassJsonMixin
from dataclasses import dataclass


@dataclass
class Task(DataClassJsonMixin):
    count: int


print("Use `Task.from_dict()`")
print(Task.from_dict({"count": 1}))
print("Use `Task.schema().load()`")
print(Task.schema().load({"count": 1}))
```


```
$ python sample.py
Use `Task.from_dict()`
Task(count=1)
Use `Task.schema().load()`
/home/vagrant/.pyenv/versions/3.11.2/lib/python3.11/site-packages/dataclasses_json/mm.py:271: UserWarning: Unknown type int at Task.count: int It's advised to pass the correct marshmallow type to `mm_field`.
  warnings.warn(
Task(count=1)
```

しかし、1行目の`from __future__ import annotations`を取り除いたら警告は発生しませんでした。


# 原因
不明です。


# 対策
上記のコードはPython3.8でも動くようにしたいです。`list`,`dict`なども型ヒントに使いたいので、できれば`from __future__ import annotations`は残しておきたいです。
なので、`Task.schema().load()`を使わないようにしました。

`Task.schema().load()`は、dictのlistをDataClassのlistに1回で変換できるので重宝していたのですが、使用するのを諦めます。`Task.from_dict`とループで素直に実装します。

```
Task.schema().load([{"count": 1}, {"count":2}, ...])
```

# 補足
以下のissueに関係しているかもしれません。

https://github.com/lidatong/dataclasses-json/issues/265
【PHP】コンストラクタでのプロパティ定義の省略

# はじめに
`PHP8`から**コンストラクタで行うプロパティの定義を省略できる**ことを業務中レビューを頂いて知りました。
忘れないように備忘録として。。

# レビュー前(PHP7以前の場合)
```php:User
class User {
    public string $name;
    public int $age;

    public function __construct(string $name, int $age) {
        $this->name = $name;
        $this->age = $age;
    }
}
````
# レビュー後(PHP8以降の場合)
```php:User
class User {
    public function __construct(public string $name, public int $age) {
    }
}
````
このようにコンストラクタの引数に**アクセス修飾子**を加えることにより、**コンストラクタの引数**であり**オブジェクトのプロパティ**であると`PHP`は解釈し、引数の値をプロパティに代入するようです。

# まとめ
プロパティ定義を省略できることで、ソースコードも短くなりより簡単に実装できました！
簡潔なソースコードを実装する上で忘れないように！！

# 参考
https://www.php.net/manual/ja/language.oop5.decon.php
dbt-coreにおけるOSS活動ことはじめその4 ~ Changieを用いた変更ログ管理の話 ~

# 本記事が目指すこと
- dbt-coreにおけるOSS活動を始めるにあたってやるべきこと、学びになったことを紹介する
    - 複数回に渡り連載する予定

# 注意
- 投稿時点(2023/5/31)での情報に基づくため、本記事で紹介した手順が今後も利用できる保証はありません
- なお、本記事は筆者が所属する会社と関係なく、個人の記事であることをご了承ください


# 背景
- 筆者は、ちゅらデータ株式会社に務める会社員であるが、就業時間中に職務としてのdbt-coreのOSS活動を始めた（OSS活動自体が初めての経験）
- CONTRIBUTING.mdを読めばChangieを用いた変更ログの作成ができる。しかし、ドキュメントには明示的に記載されてない部分があったため、それらの解決策を提示する


# 前提
- CLAの署名、環境構築、コード修正後にテストを終えていること
    - dbt-coreにおけるOSS活動ことはじめその1 ~ CLAの話 ~
        - https://qiita.com/dai_zamurai/items/6811e1d4ca9e2fad1ca7
    - dbt-coreにおけるOSS活動ことはじめその2 ~ 環境構築の話 ~
        - https://qiita.com/dai_zamurai/items/021e64b4e495b32aa907
    - dbt-coreにおけるOSS活動ことはじめその3 ~ テストの話 ~
        - https://qiita.com/dai_zamurai/items/aecab2aec4b352f6d9a4

# 用語
- CHANGELOG.md
    - 変更ログを管理するファイル。変更ログには通常、バグ修正や新機能などの変更の記録が含まれる。変更ログは機械ではなく人間のためのものであり、リリースされたバージョンごとに変更された箇所が分かりやすいように記述した方が良い
        - 参考
            - https://keepachangelog.com/en/1.1.0/
            - https://en.wikipedia.org/wiki/Changelog
- Changie
    - 変更ログを管理するツール。CHANGELOG.mdを直接編集せずに、定めたフォーマットを通して変更ログを記載することが可能
        - 参考
            - https://changie.dev/guide/

# 本編
1. Changieをインストールする
    - 実行環境に合わせてインストールする
        - https://changie.dev/guide/installation/
2. 変更ログファイルを作成する
    1. クローンしたリポジトリ[dbt-core]で以下のコマンドを実行する(.changie.yamlが存在するディレクトリ)
        - `changie new`
    2. PRの該当する種類を選択する（カーソルキーで操作する）
        - 例
            - Features
                - 機能追加
            - Fixes
                - バグ修正
            - Docs
                - ドキュメント追加・修正
    3. 決められたフォーマットに従い、変更ログを記載する
        - Body
            - 変更ログの本文
        - GitHub Username(s)
            - 該当Issue、PRを作成したGitHubのUsernameを記載
        - GitHub Issue Number
            - 該当Issueの番号
    - 期待される出力
        - 「Fixed-20230525-091955.yaml」のような変更ログファイルが作成されること 

3. 変更ログファイルをコミットし、リモートリポジトリにpushする
    - 作成するPRには修正したコードと共に、「変更ログファイル」がコミットされている必要がある。**PRに変更ログファイルがない場合はマージされないので注意**

以上。なお、PRがマージされてリリースされた際に、作成した変更ログファイルの内容がCHANGELOG.mdにマージされる

# 終わりに
ちゅらデータでは、クレイジーな仲間を募集しているでござる
データエンジニア、もしくはSE系からデータエンジニアになりたい方がいればぜひ、御仁の力量に応じたグレード（ジュニア/ミドル/シニア）にて、応募するでござる

https://herp.careers/v1/churadata/T6Oag1FxE34V
エンジニアリングの世界へようこそ！エンジニアの役割と特徴を探る

こんにちは、エンジニアリングに興味を持っている皆さん。今回の記事では、エンジニアの役割とその特徴について掘り下げていきます。それでは早速、エンジニアという職業について詳しく見ていきましょう。

## 1. ソフトウェアエンジニア

ソフトウェアエンジニアは、ソフトウェアの開発、テスト、保守に関与します。彼らはプログラミング言語を使ってコードを書き、アプリケーションやシステムを作ります。彼らの特徴は、問題解決のスキルと創造性にあります。効率的で使いやすいソフトウェアを作るために、常に新たなソリューションを見つけ出す能力が求められます。

## 2. ハードウェアエンジニア

ハードウェアエンジニアは、コンピューターシステムの物理的な部分を設計・開発します。これには、回路設計やマイクロプロセッサの設計などが含まれます。ハードウェアエンジニアは精密さと注意深さを必要とし、細部までこだわりを持つことが特徴です。

## 3. ネットワークエンジニア

ネットワークエンジニアは、コンピューターネットワークの設計、実装、管理を行います。彼らは、通信がスムーズに行えるようにネットワークのパフォーマンスを最適化します。ネットワークエンジニアは、複雑なネットワークシステムを理解し、問題解決に対する強いスキルを必要とします。

## 4. データエンジニア

データエンジニアは、大量のデータを管理し、整理するシステムを作ることを担当します。彼らはデータベースの設計、データの抽出・変換・ロード (ETL) プロセスの作成などを行います。データエンジニアは、データとその構造に深い理解を持ち、複雑なデータを扱う能力が求められます。

## 5. DevOpsエンジニア

デヴオプスエンジニアは、ソフトウェア開発とITオペレーションの両方を担当します。彼らは開発と運用がスムーズに連携できるような環境を作り出し、開発からリリース、保守までのサイクルを効率化します。デヴオプスエンジニアは、プログラミングスキルとシステム管理の経験を兼ね備え、チームワークとコミュニケーション能力が重要な特徴となります。

## 6. セキュリティエンジニア

セキュリティエンジニアは、情報システムの安全性を確保する役割を果たします。彼らはセキュリティポリシーの設計、脆弱性の評価、防御策の開発などを行います。セキュリティエンジニアは、常に新たな脅威に対応するための知識とスキルの更新が求められ、その分析能力と問題解決のスキルが特徴です。

## 7. テストエンジニア

テストエンジニアは、製品が品質基準を満たしていることを確認する役割を果たします。彼らはソフトウェアやハードウェアのテストプランを作成し、テストケースを実行します。テストエンジニアは、詳細な注意力と、異常を検出するための分析能力が必要です。

## 8. システムエンジニア

エンジニアリングの領域は多様で、専門性を深めることで自身のキャリアパスを広げることが可能です。あなたがどの役割に興味があるか、またはどのスキルを磨くべきかを検討してみてください。

## 9. AIエンジニア

AIエンジニアは、人工知能の開発と実装を担当します。彼らは機械学習モデルの訓練、アルゴリズムの開発、AIシステムのデプロイメントなどを行います。AIエンジニアは高度な数学的理解とプログラミングスキルを必要とし、新たな技術を素早く学び取る能力が特徴です。

## 10. フロントエンドエンジニアとバックエンドエンジニア

フロントエンドエンジニアは、ユーザーが直接触れるインターフェースの開発を担当します。彼らはユーザビリティとデザインを重視し、ウェブサイトやアプリケーションが使いやすく見栄えの良いものにすることを目指します。

一方、バックエンドエンジニアは、サーバーサイドの開発を担当します。彼らはデータベースの管理、APIの作成、セキュリティの確保などを行い、アプリケーションが正しく機能するようにします。

エンジニアの役割は多岐にわたり、それぞれが異なるスキルセットと専門知識を要求します。しかし、全てのエンジニアが共有する特性は、問題解決のスキルと新しい技術への適応力です。エンジニアリングの世界は常に進化し続けるため、新しい知識を学び、技術の変化に対応する柔軟性が求められます。これらの役割の中から自分に最も適した道を見つけ、エンジニアとしてのキャリアを積み重ねていくことが、成功への鍵となるでしょう。
Javaの文字化けに対応できず

## 概要
Paas上のJBossにデプロイしたSpring Bootのアプリケーションで、あるURLのみSjisのGETリクエストが送られてくるが、日本語が文字化けする。送信されている日本語は、Shift_JISで%エンコーディングされている。Webをあさってみたところ、filterを実装して対応する例などあったがうまくいかなかった。
GETリクエストのqueryパラメタからUTF-8でリクエストを送信しなおすHTMLをブラウザに返すことで文字化けは起きない。変な処理だと思うが、記録に残す。

#### 対応1.
サーバ側でいったんGETリクエストを受けて、queryパラメタから再度リクエストを作り直すHTML(javascript)をブラウザに返す。
onloadイベントでqueryパラメタを取り出し、ecl.jsでデコードしたのち、UTF-8でリクエストしなおす処理を実行させる。

【HTMLのJavascript部分】
```html
<script type="text/javascript" th:src="@{/js/ecl.js}"></script>
<script type="text/javascript" th:src="@{/js/ecl_ext.js}"></script>
<script>

function convertQueryToPOSTParams(queryString) {
	  var params = {};
	  var pairs = queryString.split('&');

	  for (var i = 0; i < pairs.length; i++) {
	    var pair = pairs[i].split('=');
	    var key = decodeURIComponent(pair[0]);
	    var value = UnescapeSJIS(pair[1]);
	    params[key] = value;
        // フォームに設定
	    document.getElementById(key).value = value;
	  }

	  return params;  // console.logに表示
}

function init(){
	// 与えられたURLからクエリ文字列を取得
	var currentURL = window.location.href;
	var queryString = currentURL.split('?')[1];

	// クエリ文字列をPOSTパラメータに変換
	var postParams = convertQueryToPOSTParams(queryString);

	console.log(postParams);
	document.loginform.submit();
}
```

### 対応2
リクエストしなおすHTMLをブラウザに返すが、デコードせずにサーバに送信する。
デコードは、Apach Common Codecでサーバ側で行う。Javascriptよりなんとなく安心。

【サーバ側のデコード部分】
```java
    	String value = request.getParameter("key");
    	String jis =null;
		try {
			jis = new URLCodec().decode(value,"Shift_JIS");
		} catch (Exception e) {
			e.printStackTrace();
		}
```
初学者向け！ソフトウェア開発における主要な役割を理解しよう

こんにちは、ソフトウェア開発に興味を持っている皆さん。この記事では、ソフトウェア開発チームの各役割を詳しく解説します。これを通じて、ソフトウェア開発のプロセスとその中で各メンバーが果たす役割について理解を深めましょう。

## 1. プロジェクトマネージャー

プロジェクトマネージャーは、プロジェクトの全体的な進行管理を担当します。スケジュール管理、リソースの調整、リスクの評価と管理、品質保証など、プロジェクトが計画通りに進行するための責任を負います。

## 2. ソフトウェアアーキテクト

ソフトウェアアーキテクトは、ソフトウェアの設計と全体の構造を決定します。彼らは、技術的な課題を解決し、システムのパフォーマンス、安定性、そして拡張性を確保します。

## 3. デベロッパー（プログラマ）

デベロッパー、またはプログラマは、ソフトウェアアーキテクトが設計したソフトウェアの構造に基づき、実際にコードを書きます。彼らは一連の仕様や要件に従い、ソフトウェアを構築します。

## 4. テストエンジニア

テストエンジニアは、開発されたソフトウェアが正しく動作することを確認します。彼らはさまざまなテスト手法を用いてバグや問題を見つけ出し、品質を保証します。

## 5. UI/UXデザイナー

UI/UXデザイナーは、ソフトウェアがユーザーにとって使いやすく、魅力的な体験を提供することを目指します。彼らはユーザーのニーズを理解し、それを基にインターフェースのデザインを行います。

## 6. データアナリスト

データアナリストの分析結果は、開発プロセスの改善や新たなビジネスの機会を見つけるための重要な情報源となります。

## 7. データベース管理者

データベース管理者は、データベースの設計、実装、メンテナンスを担当します。彼らはデータの安全性とアクセス性を保つために、必要なバックアップと復元のプロセスを実行します。

## 8. システム管理者

システム管理者は、システムの効率的な運用と維持を担当します。彼らはハードウェア、ソフトウェア、ネットワークリソースの管理、さらにはセキュリティ管理も行います。

## 9. ビジネスアナリスト

ビジネスアナリストは、ビジネスニーズを理解し、それを技術的な要件に変換します。彼らは、ビジネスと開発チーム間の橋渡し役として、双方のニーズと期待を調整します。

以上が、ソフトウェア開発における主要な役割の一部です。これらの役割は、プロジェクトや組織の大きさ、そして特定のニーズにより異なる場合があります。しかし、各役割が連携し合い、各々の専門性を活かすことで、高品質なソフトウェアを生み出すことが可能になります。

ソフトウェア開発は協力のもとに成り立つフィールドであることを理解し、自分がどの役割に興味があるか、どのスキルを磨くべきかを考えてみてください。これがあなたのソフトウェア開発の旅の第一歩となるでしょう。
静力学と材料力学 発展例題1.23 P17「材料力学演習(20221021)」をsympyでやってみた。 

# オリジナル
発展例題1.23 P17
http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=22

「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。＞sympy
https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy

# sympyで
```python
from sympy import *
l1,l2,l3=symbols('l1,l2,l3',real=True)
P      =symbols('P'        ,real=True)
T      =symbols('T'        ,real=True)
RAH,RAV=symbols('RAH,RAV'  ,real=True)
RBH,RBV=symbols('RBH,RBV'  ,real=True)
myFx=Eq( RAH-RBH                ,0)
myFy=Eq( RAV+RBV-P              ,0)
myM =Eq((l1+l2)*RBV-(l1+l2+l3)*P,0)          # (Aまわり)
ans=solve([myFx,myFy,myM],[RAH,RAV,RBH,RBV])
# print(ans)
mySubs={P:500,l1:4,l2:2,l3:1}
RBV_ans=ans[RBV].subs(mySubs)
print("#",round(RBV_ans), round(ans[RAV].subs(mySubs)),ans[RAH].simplify())
# 
myCM=Eq(2*RBV-4*RBH,0) 
RBH_ans=solve(myCM,RBH)[0].subs({RBV:RBV_ans})
RAH_ans=RBH_ans.subs({RBV:RBV_ans})
RCH_ans=RBH_ans.subs({RBV:RBV_ans})
RCV_ans=RBV_ans
print("#",round(RBH_ans))
print("#",round(RCH_ans),round(RCV_ans))
# 583 -83 RBH
# 292
# 292 583
```
①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
???　タブレット環境で、コピー貼り付けが実行できませんでした。???

https://live.sympy.org/

# Mathematicaで
勉強中

# 作図
勉強中
WSL2上、docker buildでgo mod downloadしたとき"x509: certificate signed by unknown authority" error

# 作成のきっかけ
使用中のWSL2インスタンス(ubuntu)を初期化した後、docker imageをプルするのに繰り返し失敗した。

# やってみたこと
エラーの内容は明らかにcert証明書が存在しない··· を示していたので、WSL2 ファイルシステム内にcert ファイルがあるか確認した。 
-> あり

WSL2 プロンプト上でdocker imageのリポジトリにアクセスしてみた
-> 問題なく動作

# 前提
1. Windows にdocker desktop をインストールし、WSL2上でも使用している。
2. ローカルでないところでdocker imageをpullしている。

# 原因
1. Windowsにインストールしたdocker desktopがWSL2上のLinuxファイルシステムではなくWindowsファイルシステムでcert証明書を探しているため

# 解決方法
1. Linuxにdockerをインストール、docker desktopを削除するかwsl integration設定を非活性化する。

![20230529.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129966/2b4ce079-60ba-f633-ffb3-f7895bb60603.png)

etc...

Windowsファイルシステム上にcertファイルを格納する方法も可能だと思うが、すごく面倒くさい。
docker desktop設定上で認証書などは無視しろと設定できるが、公式には推奨されない。
【Shopify】対象のセクションの背景だけを変更する方法

Shopify初心者向けに対象のセクションの背景だけを変更する方法を解説します。

下記のコードのようにsectionに対して`:has(.固有クラス名)`を使用することで、そのセクションの背景を変更することができます。

```css:sample.css
section:has(.固有クラス名) {
  background-color: #000000;
}
```
Windows Terminalで実行ポリシーを指定してPowershellを起動

Powershellで.ps1ファイルを実行する際、デフォルトのRestrictedでは実行できないので都度実行ポリシーをその都度変更して使用するなんてことあるんじゃないかと思います。

最近実装されたWindowsTerminalでは設定から各プロファイルの設定ができるのですが、
このプロファイルの実行にはコマンドラインが使用されています。

デフォルトだとこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394613/dd48b599-f4eb-6de8-1a91-9072fb320342.png)

これをコマンドラインを実行ポリシーを指定することによって、任意のポリシーでタブを開くことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394613/12d487e7-9c80-a037-4f18-3e2e8bbf3018.png)

いちいち実行ポリシーを変更するのが煩わしかったり、このポリシーじゃないとイヤだ!って人にはいいんじゃないかと思います。
初学者のためのCI/CD入門ガイド

## CI/CDとは何か？
CI/CDは、ソフトウェア開発のプラクティスであり、開発者がコードを定期的に統合（CI）し、自動化されたテストとデプロイメント（CD）を通じてアプリケーションを迅速かつ信頼性の高い状態に保つことを目指します。

## CI/CDの利点

- バグの早期発見と修正：CI/CDにより、コードの統合とテストが自動化されるため、バグの早期発見が可能になります。
- 迅速なデプロイメント：CI/CDパイプラインを使用すると、アプリケーションのデプロイメントが自動化され、迅速かつ繰り返し可能な形で行えます。
- 品質の向上：継続的なテストとフィードバックにより、品質が向上し、信頼性の高い製品を提供することができます。
チーム間の協力とコミュニケーションの促進：CI/CDはチームメンバー間のコラボレーションを促進し、コードの変更や問題の特定を容易にします。

## CI/CDの導入方法

- ソースコード管理ツールの選択：CI/CDを導入する前に、ソースコードを管理するためのツール（例：Git）を選択します。

- 自動化ツールの選択：CI/CDパイプラインを自動化するためのツール（例：Jenkins、CircleCI、Travis CI）を選択します。

- ビルドとテストの設定：自動ビルドとテストスクリプトを作成し、パイプラインに統合します。
デプロイメント戦略の設計：本番環境

- デプロイメント戦略の設計：本番環境へのデプロイメント方法を検討し、必要な手順と環境を定義します。これには、ステージング環境やプロダクション環境への自動デプロイ、ロールバック手順などが含まれます。

- パイプラインの構築と監視：選択した自動化ツールを使用してCI/CDパイプラインを構築し、ビルド、テスト、デプロイの手順を統合します。また、パイプラインの監視とエラーハンドリングも設定します。

- テストの自動化：CI/CDパイプライン内でさまざまな種類のテストを自動化することで、品質の向上とバグの早期発見を実現します。ユニットテスト、統合テスト、パフォーマンステストなど、適切なテスト戦略を選択し、テストスクリプトを作成します。

- 継続的な監視と改善：CI/CDの導入後も、パイプラインの監視と改善を継続的に行うことが重要です。パフォーマンスのボトルネックやエラーを特定し、パイプラインの効率性や品質を向上させるための改善点を見つけます。

## まとめ
CI/CDは、ウェブマーケティングにおいて効率的な開発プロセスと迅速なデプロイメントを実現するための重要なツールです。自動化されたビルド、テスト、デプロイのプロセスにより、品質向上やバグの早期発見が可能になります。適切なツールの選択と導入、テストの自動化、パイプラインの監視と改善は、成功するウェブマーケティング戦略の一部として取り組むべき重要な要素です。CI/CDを活用して、迅速かつ信頼性の高いウェブアプリケーションの開発とデプロイメントを実現しましょう。
【Unity】オブジェクトの落下速度を上げる

 # はじめに
Unity標準設定の　Gravity（重力加速度）は現実空間の9.81m/s^2に設定されていますが、よく見かけるゲームと比べてジャンプ時等の落下速度（Y軸方向の移動速度）が遅く、ふわふわ落下しているように感じるので落下速度の変更方法を記録します。

# 変更方法
Edit > Project > Settings > Physics
* Gravity　を変更する。(　個人的には-30程度が心地良い速度に感じる)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/c6f7cae4-3d55-a6c3-daa4-7306582eec8f.png)

# おまけ
落下速度を遅くしたい場合はRigidBodyのDrag(抗力)をデフォルトの0から大きい値に設定してください。（デフォルトは0なので落下に関しては最速設定になっていますので、速くする側には設定できないです。）
DOTSを使いながらURPまたはHDRPで描画するには

パッケージマネージャーからEntities Graphicsをインストールすると描画できるようになります。

![スクリーンショット 2023-05-31 181723.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87165/d37323ed-dbc5-75da-1fac-de58fae49cbc.png)


現在、WebGLはサポートしていないようです。
詳細は以下のドキュメントを参照してください。
https://docs.unity3d.com/Packages/com.unity.entities.graphics@1.0/manual/requirements-and-compatibility.html
セキュリティエンジニアとは何か？

## セキュリティエンジニアの役割:
セキュリティエンジニアは、情報システムやネットワークのセキュリティを担当する専門家です。彼らは、潜在的な脅威やセキュリティ上の脆弱性を特定し、それに対する対策を講じる役割を果たします。具体的な役割としては、以下のようなものがあります:

- セキュリティ評価と脆弱性診断: セキュリティエンジニアは、システムやアプリケーションのセキュリティ評価を行い、潜在的な脆弱性や脅威を特定します。脆弱性診断ツールを使用したり、セキュリティテストを実施したりすることもあります。

- セキュリティポリシーの開発と実装: セキュリティエンジニアは、組織のセキュリティポリシーやガイドラインを開発し、従業員がこれらに準拠するように指導します。また、必要なセキュリティ対策を実装し、システムやネットワークを保護します。

- インシデント対応と脅威モニタリング: セキュリティエンジニアは、セキュリティインシデントが発生した際に迅速に対応し、問題の解決を図ります。また、脅威や攻撃のモニタリングも行い、異常な活動や侵入の兆候を検知します。

- ウェブマーケティングにおけるセキュリティの重要性:
ウェブマーケターとして活動する際を通じて、ウェブマーケターをサイバー攻撃から保護します。これにより、ウェブサイトの可用性とパフォーマンスが維持され、ビジネスの継続性が確保されます。

- コンプライアンスへの準拠: ウェブマーケティングには、セキュリティ関連の法的要件や業界の規制基準に準拠する必要があります。セキュリティエンジニアは、これらのコンプライアンス基準を理解し、適切なセキュリティ対策を実施する支援をします。GDPRやPCI DSSなどの法的要件や規制に対応することで、法的トラブルや罰金を回避し、信頼性のあるビジネス運営を実現します。

- ブランドイメージの保護: セキュリティに関連したインシデントやデータ漏洩は、企業のブランドイメージに大きな悪影響を及ぼす可能性があります。ウェブマーケターは、セキュリティエンジニアと協力して、ブランドイメージを保護するためのセキュリティ対策を講じる必要があります。顧客の信頼を損なうことなく、セキュリティを確保し、ブランドの信頼性を高めましょう。

## 結論:
セキュリティエンジニアは、データ保護、ウェブサイトの安全性、フィッシング詐欺対策、サイバー攻撃からの保護、コンプライアンスへの準拠、ブランドイメージの保護など、様々な重要な役割を果たします。ウェブマーケティングの成功には、セキュリティに関する知識と対策が欠かせないことを忘れずに、常にセキュリティに対する意識を高めましょう。
タスク整理アプリを作ろう!!②

久しぶりの更新になってしまいました...。
ソントレーゾの**いのうえ**です。
タイトルの通り前回の続きを書いていきたいと思います。

[タスク整理アプリを作ろう!!①](https://qiita.com/sentreseau_2221/items/9eaa31e91426d40f05c6)
:arrow_up:前回の記事です。

## 改善が必要なところ<br>
まず、始業時間にタスクをメールで送信するところから改善していきたいと思います。
実際使ってみて、メールでタスク確認するのは面倒くさいな！となりました...笑
チャットのほうが通知が見えますし、何よりPCを起動して最初に開くのってTeamsだな...と。
というわけで、フローを変えました！

最初にTeamsにプライベートのチームを作成して、
タスクを送る用のチャネルを用意しておきます。その後フローの修正です！

**旧フロー**
こちらのApply to eachの中身を変えていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/fbf63e0c-5965-ecc6-ff5d-eb19f01d6de4.png)


**新フロー**
Teasmのタスクのチャネルに投稿するようにアクションを変更しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/886a04a7-8a18-80c3-47c4-423c224748c2.png)


**過去タスク画面作成**
次は、前回ボタンだけ作成した過去タスクボタンに
過去タスク画面に遷移するように作成していきます。

Past Task 画面を追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/ee335f4f-4e2e-6852-a689-634f028fda8c.png)

こちらの画面にはギャラリーを追加して、
過去のタスク一覧を表示させます。
![スクリーンショット 2023-05-31 175240.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/4ed4c84f-3520-d479-6a35-7a4e6ef3d2b3.png)


もう一つ詳細の画面を作っていきましょう。
Past Task Detailを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/83ba8155-2e4e-e93c-83f3-355d876279bd.png)

Past Task画面のギャラリーのアイコンに画面遷移の処理を追加します。
![スクリーンショット 2023-05-31 180539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/a5c23a04-f74c-7c41-f625-8348d88b208f.png)

Past Task Detail画面にフォームを追加して、
Itemプロパティにギャラリーで選択されたものを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/eb29c90f-e6f2-9650-c05d-7ed006de008c.png)

過去タスクの画面は以上となります！

## まとめ<br>
かなりシンプルなアプリにはなりますが、
また追加したい機能等あれば、どんどんやっていこうと思います！
【Unity】Addforceでジャンプ移動すると壁に突き刺さる

#　はじめに
RigidBody + Addforce(物理移動)を利用する方法でキャラクターを制御している際、移動しながらジャンプするとキャラクターが壁に突き刺さって落ちてこなくなる問題が起こったため対策方法を本書に記録する

# 対策
ColliderのFriction(摩擦)を下げるとキャラクターが落ちてくるようになる。
* PhysicMaterialを作成する
* 各Frictionを0に設定する
* FrictionCombineをMinimumに設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/5526f36e-bd97-b8c8-cc2c-bf22c228b797.png)

* キャラクターのColliderにPhysicMaterialを割り当てる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/e3949b00-c55c-fbf2-298e-f016cb794206.png)

以上
UnityRecorderで撮影した映像の色がずれる

# 1. はじめに
研修でPinRescueの再現をする過程で、元アプリとの比較のためにUnityRecorderでアプリを撮影したのですが、
撮影した映像の色がGameViewで見える色とずれていました。
何とか解決させることが出来たため、解決法をまとめます。
# 2. 生じた問題
![Quitta比較用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300820/b7935d09-d129-5a50-e758-55d129d3a418.png)
右がUnityのGame veiwの画像、左が.mp4形式で撮影した動画のキャプチャです。
よく見るとわかりますが、背景の色が微妙にずれています。

Game veiwの画像の背景色はrgb(236, 242, 227)、動画キャプチャの背景色はrgb(240, 244, 231)となり、
各値で2～4ほどのずれが生じていました。
今回の場合は比較的小さいですが、自分が制作していた時には各値10程度の大きなずれが生じたこともありました。


# 3. 原因
[[非公式] Unite Tokyo 2019 Eve2 LT Fes" (2019/9/23) で登壇しました](https://tan-y.hatenablog.com/entry/2019/10/07/010000)
こちらの記事の発表スライドP20に詳しくありました。

どうやら原因は色空間変換のようです。
UnityRecoder内ではビデオのエンコード時ににRGB - YUV 間の色空間変換が行われているようなのですが、その過程で計算がおかしくなってしまい、色味がずれるらしいです。

# 4. 解決法
### (1).webmで書き出す
自分の場合はこの方法で解決しました。
おそらく書き出し形式を変えたことで色空間変換の計算法が変わったため、色のずれがなくなったと思われます。
ただ、ダビンチリゾルブではwebm形式を扱えないため、[このサイト](https://www.aconvert.com/jp/video/webm-to-mp4/)等で形式をmp4に変換する必要があります。
また[上記記事](https://tan-y.hatenablog.com/entry/2019/10/07/010000)には.webmでも問題が起こるとあったので、プロジェクト次第では解決法にならないかもしれません。
### (2)連番画像として書き出す
おそらく映像を撮影するだけなら一番確実な方法です。
[上記記事](https://tan-y.hatenablog.com/entry/2019/10/07/010000)でも品質優先ならこの方法だと勧められています。
連番画像はダビンチリゾルブに取り込ませればそのまま映像になります。([参考](https://asteriscus.jp/davinci-resolve/325/))
ただし音声が入らないので、実務での使用は厳しいかもしれません。

# 5. 余談
今回自分は遭遇しませんでしたが、撮影した映像の光の見え方がおかしくなる場合もあるようです。
その場合はProject SettingのColor Space設定と出力フォーマットの組み合わせが悪いことが原因のようです([参考](https://tan-y.hatenablog.com/entry/2019/10/07/010000))
A0ポスターを分割してA4用紙16枚で印刷する

## 背景
- 学会発表に用いるA0サイズのポスターをA4サイズ16枚で分割して印刷したい
    - Adobe Acrobat のポスター印刷がなぜかうまくいかない
    - →ファイル自体を分割してしまおう！
## 準備

[pypdf](https://github.com/py-pdf/pypdf) というパッケージを使います
```
pip install pypdf
```

## コード

```python
import pathlib

import pypdf

# file path to the pdf
pdf_path = input("Please input pdf path: ")

# Read pdf file
pdf_file = open(pdf_path, "rb")
pdf_reader = pypdf.PdfReader(pdf_file)

# Output directory
outdir = pathlib.Path("output")
pathlib.Path.mkdir(outdir, exist_ok=True)

# Confirm pdf size
p1 = pdf_reader.pages[0]
doc_width = p1.cropbox.width
doc_height = p1.cropbox.height
print(doc_width, doc_height)  # in mm

# the number of division
N = 4

# Save separately
for c in range(N):
    for r in range(N):
        p1 = pdf_reader.pages[0]
        lower_left = (doc_width / N * c, doc_height / N * r)
        upper_right = (doc_width / N * (c + 1), doc_height / N * (r + 1))
        print((c, r), lower_left, upper_right)
        p1.mediabox.lower_left = lower_left
        p1.mediabox.upper_right = upper_right

        writer = pypdf.PdfWriter()
        writer.add_page(p1)
        output_path = outdir / f"cropped_{c}-{r}.pdf"
        with open(output_path, "wb") as output_file:
            writer.write(output_file)

# Save as single file
writer = pypdf.PdfWriter()
for c in range(N):
    for r in range(N):
        p1 = pdf_reader.pages[0]
        lower_left = (doc_width / N * c, doc_height / N * r)
        upper_right = (doc_width / N * (c + 1), doc_height / N * (r + 1))
        print((c, r), lower_left, upper_right)
        p1.mediabox.lower_left = lower_left
        p1.mediabox.upper_right = upper_right

        writer.add_page(p1)

output_path = outdir / f"cropped.pdf"
with open(output_path, "wb") as output_file:
    writer.write(output_file)
```

### 参考資料
- [A0サイズ1ページのPDFをA4サイズ16ページのPDFに分割する - Qiita](https://qiita.com/kenkensz9/items/a3744fe149974ae15465)
  - 上記記事と本記事との違い
    - 本記事の方法はドキュメントの大きさに合わせて分割するので，`841` などの数字をハードコーディングしなくてよい
    - ドキュメントが1:√2かつ分割する大きさ (コード中の `N` ) が2の倍数であれば，A0→A4以外の分割も可能
XcodeでGit管理下のファイルが見つからず、Pullできないとき




### TL;DR
ターミナルで競合解消

### 対象読者
ターミナル初心者
git初心者

# Pullできねえ
:::note warn
Make sure a valid file exists in the repository and try again.
The source control operation failed because the file “####.swift” could not be found.
:::


ってエラーが出ました。(Xcode 14.3)
XcodeのNavigator Area(画面左側のファイル一覧)では明らかにあるのに。（怒り）
どういう訳か、うまいことファイルが認識できていないようなので、ターミナルで確認してみます。


.git fileがあるフォルダまで移動する

```
%cd （DEMO.xcodeprojを内包するフォルダ）
```
git statusを確認。

```
% git status 
```
```
rebase in progress; onto ハッシュ値
You are currently rebasing branch 'ブランチ名' on 'ハッシュ値'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)

Unmerged paths:
  (use "git restore --staged <file>..." to unstage)
  (use "git add <file>..." to mark resolution)
	both added:      ####.swift

```
どうやら、競合が起きているようです。
(fix conflicts and then run "git rebase --continue")と言っているが競合は具体的にどう解消するんだ。

ChatGPT先生に聞くと

>1. コンフリクトしたファイルをテキストエディタで開きます。ファイル内には、コンフリクトのマーカーとして特殊な文字列（通常は<<<<<<<, =======, >>>>>>>）が表示されます。
>1. マーカーの上と下のコードブロックは、競合している変更内容です。適切な変更を選択し、コードを修正します。または、完全に新しいコードを記述することもできます。
>1. コードの修正が完了したら、修正したファイルを保存します。
>1. 修正したファイルをGitにステージングします。コマンドラインでgit add <ファイル名>を実行するか、GUIツールを使用して変更をステージングします。
>1. ステージングした修正をコミットします。コマンドラインでgit commitを実行するか、GUIツールを使用してコミットメッセージを入力します。
>1. コミットが完了したら、git rebase --continueコマンドを実行してリベースの継続を指示します。これにより、次のコンフリクトがある場合は同じ手順で解決できます。


なるほど。この説明の通り進めていくと、git commitで少しつまづいた。ターミナルの画面が普段と違う見た目、操作感になった。ChatGPT先生に聞いてみると、ターミナル内のエディタという概念があるらしい。
>ターミナル内で使用されるエディタは、テキストベースの操作インタフェースを提供します。これにより、テキストファイルを表示し、編集し、保存することができます。いくつかの一般的なターミナルエディタには、Vim、Emacs、Nanoなどがあります。

多分今回起動したのはVimかな？Commit message を好きなものに書き換え、ESC キーを押してコマンドモードに移行し、:wqでエディタを終了できる。
あとは
```
git rebase --continue
```
で無事rebaseできた。

cf.


https://qiita.com/wann/items/688bc17460a457104d7d

https://stackoverflow.com/questions/39579893/xcode-8-source-control-does-not-show-conflicts
Rails7で`rails new`する時、`-c=bootstrap`を指定するとエラーが発生する

# TL;DR
[**解決策**](https://qiita.com/h-izumi/items/b3ce390839d7b9e62fc0#解決策)の節をどうぞ。

:::note
この記事を書いた環境は次の通りです
* **ruby**: ruby 3.2.2 (2023-03-30 revision e51014f9c0) [arm64-darwin22]
* **rails**: Rails 7.0.5
* **node**: v18.6.0
* **yarn**: 3.5.1
:::

# CSS Bundling for Rails

Rails7では`rails new`するときにCSSツールを指定できるオプション`-c`/`--css`があります。
```
$ bundle exec rails new --help
Usage:
  rails new APP_PATH [options]
Options:
~~~ 省略
  -c, [--css=CSS] # Choose CSS processor [options: tailwind, bootstrap, bulma, postcss, sass] check https://github.com/rails/cssbundling-rails
~~~ 省略
```
* [CSS Bundling for Rails](https://github.com/rails/cssbundling-rails)

[tailwind](https://tailwindcss.com/)、[bootstrap](https://getbootstrap.com/)、[bulma](https://bulma.io/)、[postcss](https://postcss.org/)、[saas](https://sass-lang.com/)など色々と選択肢があります。
私の場合Bootstrapを自身で組み込んで使うことが多いため、これは便利!と思い使ってみました。

```console
$ bundle exec rails new . -c=bootstrap
```
ところが、以下のエラーが出て止まってしまいます。
```console
Add build:css script
         run  npm pkg set scripts.build:css="sass ./app/assets/stylesheets/application.bootstrap.scss:./app/assets/builds/application.css --no-source-map --load-path=node_modules" from "."
         run  yarn build:css from "."
Error: Can't find stylesheet to import.
  ╷
1 │ @import 'bootstrap/scss/bootstrap';
  │         ^^^^^^^^^^^^^^^^^^^^^^^^^^
  ╵
  app/assets/stylesheets/application.bootstrap.scss 1:9  root stylesheet
```
ファイルが見つからないと言われているので探してみたところ`.yarn/cache`ディレクトリの下に何か色々ありました。
...あれ? `node_modules`ディレクトリ下ではないの? そもそも`node_modules`はいずこへ...?

# Yarn 2 (Berry) なるもの
調べてみたところ、[yarn v2にまつわる誤解 | Wantedly Engineer Blog](https://www.wantedly.com/companies/wantedly/post_articles/325643)という記事にたどり着きました。

> node-modulesモードでは旧来のパッケージ管理ツールと同様にnode_modulesディレクトリが生成されるので、これによりかなりの互換性が担保されます。

まさにこれが原因では...

という訳で解決策です。

# 解決策


* [Migration | Yarn - Package Manager](https://yarnpkg.com/getting-started/migration#step-by-step)

> Add nodeLinker: node-modules in your .yarnrc.yml file


ということで、もう一度新しいディレクトリを作成、`.yarnrc.yml`ファイルを以下のように作成。


```yml:.yarnrc.yml
nodeLinker: node-modules
```

:::note alert
✅`node-modules`です。🛑`node_modules`**ではありません**!!! 
罠ですか?

:::

続いて`bundle init`して`Gemfile`を書いて、(`bundle config`して)`bundle`を実行、そして`rails new`をやり直してみました。

```console
$ bundle exec rails new . -c=bootstrap
```

今度は`node_modules`ができました。
そしてコマンドは無事終了し、`bin/dev`でサーバーを立ち上げるといつもの画面にアクセスできました。

# まとめ
原因はRailsの外側、Yarnの仕様変更にあった、というお話でした。
もう少し詳しく調べていたところ、Rails本家のディスカッションに同じ回答がありました。[^discussion]
が、どうも全体としては的を射ない流れになっているようです。
探し方の問題かも知れませんがこの他に情報らしい情報は見つけられませんでしたので、この機能を皆さん使っていないのか興味が無いのか...
Yarnという外部ツールに依存する形でRails側の実装を変えるべきなのか、といったことは私には何ともいえません。

願わくばRuby周りのことだけ考えていたいですね、という[【RubyKaigi 2023連動イベント】みんなでRubyの知見を共有しよう](https://qiita.com/official-events/4d2a9eed42dbe0a4af21)向けの記事でした。

[^discussion]:[New Rails 7 app w/Bootstrap gives &quot;Can&#39;t find stylesheet to import.&quot; - rubyonrails-talk - Ruby on Rails Discussions](https://discuss.rubyonrails.org/t/new-rails-7-app-w-bootstrap-gives-cant-find-stylesheet-to-import/81799/8)
SRE入門：信頼性の追求を目指した新たな進化

## SREとは何か？

SREは「Site Reliability Engineering」の略で、Googleによって開発された概念です。ソフトウェアエンジニアリングの原則とプラクティスを運用環境に適用することで、システムの信頼性、スケーラビリティ、効率を向上させることを目指しています。

## SREの目的

SREの目的は、システムの信頼性とアップタイムを最大化し、同時に新しい機能のリリースとシステムの成長を支援することです。これは、「エラーバジェット」という概念を通じて実現されます。これはシステムが一定期間内に許容可能なダウンタイムまたはエラーの割合を定義します。エラーバジェットを超えた場合、SREチームは新機能のリリースを一時停止し、問題の解決に専念します。

## SREのメリット

- 信頼性の向上：SREはシステムの信頼性を最優先に考えます。これにより、顧客は安定したサービスを絶えず受けることができます。

- 問題解決の自動化：SREは手動のトラブルシューティングを減らし、問題解決を自動化することを強調します。これにより、システムの問題をより迅速に、そして効率的に解決することができます。

- 運用と開発のバランス：SREは新機能の開発とリリースと、システムの信頼性という二つの目標の間のバランスを保つことを目指しています。

## SREの導入方法

SREを導入する際には以下のステップを踏むと良いでしょう。

- エラーバジェットの定義：エラーバジェットを定義することから始めます。これは、システムが許容できるダウンタイムやエラーの割合を示します。これにより、開発と運用の間で明確な合意を形成することが可能になります。

- 問題解決の自動化：SREでは、問題解決の手段を自動化することを強調します。これにより、再発する問題に対処する時間を削減し、エンジニアリングリソースを新機能の開発に集中させることができます。

- 監視とロギング：システムの信頼性を確保するためには、詳細な監視とロギングが不可欠です。これにより、問題が発生した場合に迅速に対処し、システムの状態を恒常的に把握することができます。

- ポストモーテムと継続的な改善：問題が発生した場合、その原因を特定し、将来の再発を防ぐための措置を立てることが重要です。これはポストモーテムと呼ばれ、学習と改善のための重要なプロセスです。

## 終わりに

SREは、信頼性と効率性を追求することにより、組織が競争力を保つための重要なアプローチです。DevOpsと同様に、SREもまた組織全体の文化を変え、新たな価値を創造するための手段を提供します。
JavaScript オブジェクトに含まれる値の小数点以下を切り捨てる

# 概要

- jsにてオブジェクト内のキーに紐づく値で小数点以下を切り捨てる方法を簡単にまとめる。

# 方法

- 下記のように記載する。

    ```js
    const obj = {
        "aaa": 1.1,
        "bbb": '1.1',
        "ccc": 'Hello',
        "ddd": true,
    };
    
    for (let key in obj) {
        if (
            !isNaN(obj[key]) &&
            typeof obj[key] !== "boolean" &&
            obj[key] !== "" 
        ) {
            obj[key] = Math.floor(obj[key]);
        }
    }
    
    console.log(obj); // { aaa: 1, bbb: 1, ccc: 'Hello', ddd: true }と出力される
    ```
AWSで誰がリソースを作成したか？CloudTrailで作成者を追跡する方法

## はじめに
Terraformの学習過程で、クレデンシャル通りのIAMユーザーで正しく作成されているか、コンソールでも確認しようとした際、少し詰まったので記事にしました。

### 結論
「CloudTrail > イベント履歴」からユーザー名を確認する。作成したリソースのダッシュボードからは確認できない。

### CloudTrail
リソースの詳細に表示される所有者IDはAWSのアカウント自体(rootユーザー)の識別子です。**CloudTrail**から作成者を確認することが可能です。画像ではVPCを作成したユーザーを確認しています。「CreateVpc」のユーザー名が該当します。

![スクリーンショット 2023-05-31 17.12.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485354/cf1690b5-e077-c056-9622-c0d9b8c8c510.png)
CloudTrailはリソースの作成や編集、削除などさまざまなイベントを追跡しています。イベントをクリックすると詳細情報を確認できます。イベントのログはデフォルトで90日間保管し、それより古いログはS3バケットを設定して管理が可能です。S3の設定には別途料金がかかります。


## あとがき
現在ポートフォリオ作成に向け、AWS、Terraform絶賛勉強中です！🔥
実務でもバリバリ使用する技術だと思うのでAWS、Terraformの操作でエラーが出力されたり、想定の挙動をしない場合は確認していきたいと思います。

## 参考

https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/view-cloudtrail-events-console.html

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/cloudtrail-logging.html
DevOps入門：技術革新の新たな進化

## DevOpsとは何か？

DevOpsは、"Development"と"Operations"を組み合わせた造語で、ソフトウェア開発とIT運用の連携を指します。通常、これらのチームは独立して作業を行うのが一般的ですが、DevOpsはこの二つを橋渡しし、連携を強化しようとする哲学・方法論です。

## DevOpsの目的

DevOpsの目的は、ソフトウェアの開発とリリースのサイクルを速め、組織全体の効率を高めることです。これにより、企業は顧客の要求に迅速に対応し、競争優位を維持することが可能になります。

## DevOpsのメリット

- 高速化と効率性：DevOpsは連続的なインテグレーションと連続的なデリバリー（CI/CD）を促進します。これにより、修正や新機能のリリースが迅速に行われ、ユーザーへのサービス提供がスムーズになります。

- 協力とコミュニケーションの向上：DevOpsは、開発者と運用者の間のコミュニケーションと協力を改善します。これにより、互いの作業に対する理解が深まり、問題の早期発見と解決が可能になります。

- リスクの低減：高頻度のリリースと自動化により、バグや問題が早期に発見・修正され、システム全体の安定性と信頼性が向上します。

## DevOpsの導入方法

DevOpsを導入する際には以下のステップを踏むと良いでしょう。

- 文化の変革：DevOpsは単なるツールや技術以上のものです。それは組織の文化を変えることを意味します。このためには、コミュニケーション、共有、透明性を重視し、失敗を恐れずに新しいことを試す勇気を持つことが重要です。

- 自動化の利用：DevOpsは作業の自動化に大きく依存しています。これには、コードのビルド、テスト、デプロイメントなどのタスクが含まれます。自動化は時間を節約し、手作業によるエラーを減らすことができます。

- 連続的インテグレーションと連続的デリバリー：CI/CDはDevOpsの核心的な概念です。これにより、コードの変更が頻繁にかつ安全にプロダクション環境にリリースされることが可能となります。

- モニタリングとフィードバック：プロダクション環境のパフォーマンスを監視し、問題を早期に特定し修正することが重要です。また、顧客からのフィードバックを取り入れ、プロダクトの改善を続けることも同様に重要です。

## 終わりに

DevOpsは、競争の激しいデジタルマーケットにおいて、ビジネスの効率性と効果性を向上させるための一助となること間違いなしです。一方で、これはただ技術を導入するだけでなく、組織全体の文化と思考を変える重要なステップを伴います。しかし、その努力は確実に、より強力で競争力のあるビジネスモデルへと繋がります。
JavaのWindows10でのパス設定について

# 前提条件
* Windows 10
* Java

# 目的
WindowsでJavaのパスを設定するまで環境構築する。

# Javaのダウンロード
下記URLの「Javaのダウンロード」よりJavaの最新版を手元のパソコンにダウンロードする。2023/5/31時点での最新版は「jre-8u371-windows-x64.exe」でした。

https://www.java.com/ja/download/

# Javaのインストール
ダウンロードした「jre-8u371-windows-x64.exe」を実行する。
インストールをクリックすると、Javaのインストールが実行される。
![Javaへようこそ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32439/588c7df8-6bf8-84a5-9dcc-ef06baf9ccb0.png)
Javaのインストール中は、下記のような画面となる。
![Javaセットアップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32439/19b605b1-26e6-399f-b440-4febfa467a39.png)
インストールが完了したら、閉じるをクリックしてJavaのインストールを終了する。
![Javaセットアップ完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32439/5dd62ef4-408c-2287-5dfc-b83dc283c98d.png)

# Javaのパス設定
コマンドプロンプトに以下を入力し、「システムの詳細設定」を起動する
```
%WINDIR%\System32\SystemPropertiesAdvanced.exe
```
「詳細設定」から「環境変数」をクリックする。
![システムの詳細設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32439/5725b33b-86da-fef0-0d5a-623f1f078882.png)
Pathを選択し、「編集」をクリックする。
![パス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32439/f012b2ec-0512-0c17-b4d7-635608c14554.png)
新規をクリックし、※Javaコマンドまでのパス、「C:\Program Files (x86)\Java\jre-1.8\bin」をコピペする。
![javaパス設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32439/012ac9ea-9357-6680-8439-6e2bbad3ae66.png)
※Javaコマンドまでのパスは環境によって、異なることもあるため、ご自身で確認することを推奨します。
「OK」をクリックして、「環境変数名の編集」を終了する。
「OK」をクリックして、「環境変数」を終了する。
「OK」をクリックして、「詳細設定」を終了する。
パソコンを再起動して、Javaのパス設定をOSへ反映させる。
コマンドプロンプトで以下が実行できることを確認し、Javaのパスが通っていることを確かめる。
```
java -version
```
以下の結果となれば良い
```
java version "1.8.0_371"
Java(TM) SE Runtime Environment (build 1.8.0_371-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.371-b11, mixed mode)
```
# 編集後記
下記の投稿でJavaの環境構築を省いたため、自分への備忘録として本稿を書いた。
https://qiita.com/jinbei230525/items/a0b7857578fd58c1878c
ねじり 基本例題3.07 P63「材料力学演習(20221021)」をsympyでやってみた。

 # オリジナル
基本例題3.07 P63
http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=68

「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。＞sympy
https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy

# sympyで
```python
from sympy import *
TC,  TD       =symbols('TC  TD '       ,real=True)
TAC, TCB      =symbols('TAC TCB'       ,real=True)
phiA,phiB,phiC=symbols('phiA,phiB,phiC',real=True)
G,Ip,x        =symbols('G Ip x'        ,real=True)
l1,l2         =symbols('l1 l2'         ,real=True)
myEqA =Eq(TC+TCB-TAC,0)
myEqB1=Eq(phiC-phiA,integrate(TAC/(G*Ip),(x,0 ,l1    )))
myEqB2=Eq(phiB-phiC,integrate(TCB/(G*Ip),(x,l1,l1+l2 )))
myEqB3=Eq(phiB-phiA,0)
myEqB4=Eq(myEqB2.lhs+myEqB1.lhs,myEqB2.rhs+myEqB1.rhs  )
#
myEqB3mB4=Eq(myEqB3.lhs-myEqB4.lhs,((myEqB3.rhs-myEqB4.rhs)*(G*Ip)).simplify())
myEqB    =Eq(myEqB3mB4.rhs*(-1),myEqB3mB4.lhs*(-1))
ans=solve([myEqA,myEqB],[TAC,TCB])
print("#",                     ans[TAC],    ans[TCB]   )
print("#",myEqB1.rhs.subs({TAC:ans[TAC],TCB:ans[TCB]}) )
# TC*l2/(l1 + l2) -TC*l1/(l1 + l2)
# TC*l1*l2/(G*Ip*(l1 + l2))
```
①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
???　タブレット環境で、コピー貼り付けが実行できませんでした。???

https://live.sympy.org/

# Mathematicaで
勉強中

# 作図
勉強中
特徴量エンジンKaskadaにおける外部システムとの統合・データ出力

# はじめに

先日、以下の記事を発表しました。

https://qiita.com/yoshiyuki_kono/items/7dc7bdad5e02ff986f5d

新しいテクノロジーに触れる時はいつでも楽しいものです。
中でも新しいプログラミング言語（のパラダイム）を学ぶことは、特別に楽しいことです。

ということで、まだまだ勉強中ですが、公式ドキュメントの学習過程の記録として、以下の記事をまとめてみました。

本稿情報のソースとして、下記ドキュメントを参照ください。

https://kaskada.io/docs-site/kaskada/main/integrating/index.html

# 特徴量エンジンKaskadaにおける外部システムとの統合・データ出力

##  概要

Kaskada は、さまざまな（入力ソースと※）出力（シンク）をサポートしています。以下に概要を記します。（※本稿では、特に出力に焦点を当てています）

 - Apache Pulsarはソースおよびシンクとしてサポートされています。

 - Apache Cassandra は、 Apache Pulsar シンクおよび Pulsar to Cassandra コネクタを使用する宛先としてサポートされます。

 - Redis は、 Apache Pulsar シンクと Pulsar to Redis コネクタを使用した宛先としてサポートされています。

 - AWS Redshift は、Parquet シンクを使用した宛先としてサポートされています（ Parquet ファイルを Redshift にロードします）。

 - Snowflake は、 Parquet シンクを使用した宛先としてサポートされています（Parquet ファイルを Snowflake にロードします）。



## Apache Pulsar
Apache Pulsar は、オープンソースの分散ストリーミング プラットフォームです。

### Pulsarへの書き込み
以下のようにマテリアライゼーション(`materialization`)を作成することで、クエリ結果をリアルタイムで Pulsar に書き込むことができます。
```javascript
tenant = "public"
namespace = "default"
topic_name = "model_features"
broker_service_url = "pulsar://127.0.0.1:6650"
destination = materialization.PulsarDestination(tenant, namespace, topic_name, broker_service_url)

materialization.create_materialization(
    name = "MaterializedFeatures",
    destination = destination,
    query = "{
      key: Purchase.customer_id,
      max_amount: Purchase.amount | max(),
      min_amount: Purchase.amount | min(),
    }"
)
```

## AWS Redshift
Redshift は、大規模なデータ セットに対してスケーラブルな SQL クエリを提供するホスト型データ ウェアハウスです。

## Redshiftへの書き込み
まず、値を Parquet としてエクスポートします。
その後、`COPY`命令を使用することで、Parquet ファイルをRedshift にロードできます。

以下のように、`--output parquet`を指定すると、結果を出力されるParquetファイルを識別する URL として返すことができます。
```javascript
%%fenl --output parquet
{
  key: Purchase.customer_id,
  max_amount: Purchase.amount | max(),
  min_amount: Purchase.amount | min(),
}
```
そのURLを利用して、Parquet ファイルを、以下のように Redshift テーブルにロードできます。
```sql
COPY feature_vectors
FROM '<file url>'
FORMAT AS PARQUET;
```
## Snowflake
Snowflake は、大規模なデータ セットに対してスケーラブルな SQL クエリを提供するホスト型データ ウェアハウスです。

### Snowflakeへの書き込み

まず、値を Parquet としてエクスポートします。
その後、`COPY`命令を使用することで、Parquet ファイルを Snowflake にロードできます。


以下のように、`--output parquet`を指定すると、結果を出力されるParquetファイルを識別する URL として返すことができます。
```javascript
%%fenl --output parquet
{
  key: Purchase.customer_id,
  max_amount: Purchase.amount | max(),
  min_amount: Purchase.amount | min(),
}
```
結果として得られる Parquet ファイルは、以下のように、Snowflakeの temporaryテーブルにロードできます。
```sql
create or replace temporary table feature_vectors (
  key varchar default null,
  max_amount number,
  min_amount number
);

create or replace file format feature_vector_parquet_format
  type = 'parquet';

create or replace temporary stage feature_vector_stage
  file_format = feature_vector_parquet_format;

put <file url> @sf_tut_stage;

copy into cities
  from (select * from @sf_tut_stage/<filename>.parquet);
```
分報を自分なりに活用してうまく仕事できるようになった話

## はじめに

分報とは何？という方もいらっしゃると思いますが、以下の記事など参考いただければと思います。

https://qiita.com/kojimadev/items/ea8825dec1b0d0d2874c

分報とはチーム内でのTwitterみたいなもので、つぶやきを可視化し協力し合う！という手法ですが、こちら私のチームでも導入しており、自分なりのやり方を模索し実践していたところ仕事をいい感じにできるようになった気がするので整理がてら記事にしてみようと思います。

## 自分がどうやっているか

自分は相談する際なんかに要点をうまくまとめられず、そもそも自分が何に悩んでいるのか言語化するのも非常に苦手で突発で相談したりすると不必要な情報まで相手に与えて混乱させてしまうことがあると悩んでいました。

そこで自分のやっていることだけでなくて、自分の”考え”を含めて分報という文章のかたちで整理しながら仕事を進めるようにしてみました。

(具体例のSlackの画像なんかも出したかったですが、仕事の内容ばっかりだったので断念です・・・)

分報の運用方法として、リアルタイムに何している以外に気持ちとか感情も出していくみたいなのことをやっている方多いかもしれないですが、自分の考えていることをどんどん書き出していくというのはあんまりやられていないのかなと思います。

自分の考えを発信していくことで、周りのメンバもちょっと見てすぐに考えに対する同意や逆に間違っている部分の助言もしやすいですし、考えを整理した下地があることで識者の手が空いてすぐに相談しなくちゃという場合でも論理立てた説明も容易になり、スムーズに相談できるようになったと実感してます。

## どう考えを書いていくか

単純にこういうの思いついたので試しますみたいなのはそのまま書けますが、整理が必要になってくるのは悩むことが必要な問題や課題に直面したときが主だと思います。そういった場合に自分がどのように考えを整理しているかまとめてみます。

整理するためには以下の点を順番に文章化していくことを行います。整理するなかで新しい考えも生まれますし、自分としてどうすべきかという考えもまとまります。
- 問題・課題とは、客観的に何が起こっていて
- 自分としては、問題・課題の原因をこう考えており
- 取り得る選択肢はどれだけ考えられるのか
- そのなかでも自分はこれが最善だと考える

#### ①問題・課題とは、客観的に何が起こっていて

まずはどのような問題・課題が起こっているのか正確に把握できていなければ、後々相談に向かうときにも説明できず困ってしまいます。把握といっても、やることは単純で何が発生していて、何を試し、どんな結果だったかをつらつら書いていき、書ける情報がなくなったあたりで整理してみるだけです。（とりあえず試すことがなくなるまで試したことと結果を残していく感じです。）

#### ②自分としては、問題・課題の原因をこう考えており

もしかしたらこの時点で原因が整理でき、悩まずとも問題が解決できるかもしれません。
しかし、問題・課題を正確に把握できるのであれば、そもそもそんなに悩まないということもあると思います。そういった場合でも自分の知見から可能性が高そうな案をいくつか出してみて、その案を確かめる意味でまた①の手順を繰り返し、自分としてはどう考えているかを固めていきます。

#### ③取り得る選択肢はどれだけ考えられるのか

②で原因がわかればおしまいではなく、それをなんとか解消しなければ先に進めません。①②を試しているうちにパッと直せそうな案は浮かんだり試したりするかもしれませんが、それをそのまま実行しても大抵は最善ではない場合が多く手戻ってしまいます。

原因を対応するような場合として、一般的にはどうするのか、チームとしては類似の問題をどう対応していたか、実装目線では最善かもしれないが設計やテストを考えても最善か、こういった点をしっかり調査・確認した上で解消法を考えなくては最善の答えにはなかなかたどり着けません。

そうやっていくつかの観点から案を考えてみると、案外複数の案が出てくるものです。

### ④そのなかでも自分はこれが最善だと考える

③の状態で識者や上司に相談すれば、よっぽどの場合は答えや助言がもらえると思いますが、自分としてどれが最善かを考えていないと自身の成長につながらずまた同じ悩みで時間を使うはめになります。

最善とは一口にいっても条件や目的で変わってしまうため、なかなか決めるのは難しいですが、自身のプロジェクトが現在品質保証活動中で少しのバグも許さないような状況なのか、新しい機能の試作中でまずは小さくても動くものを作ろうとしている状況なのか、どういった目的でチームが活動しているかはわかると思います。そういった目的を考えることで自身のどの案が最善かというは自分なりに判断できます。

判断がたとえ間違っていたとしても、何が間違えていたのかはここまで整理できていれば具体的にわかるはずです。その間違いを理解し、次に活かしていければ仕事はいい感じに進んでいくようになっていくはずです。

## おわり

長々書いてますが、言語化・文章化すると悩みが整理できるよ。それを分報のかたちでやろうね。ってだけです。

分報に何を書けばいいのかわかんないであったり、書いても誰も反応してくれないなんてことがあっても仕事を進める上での悩みなら、なんらかリアクションしてくれるはずです。自分はそれで仕事がいい感じに進められるようになったのでなんらか参考になれば幸いです。
Mulesoft munitを使ってみた

# はじめに
みんなさん　こんにちは。

今日はMunitの基本的な構成について、紹介していきたいと思います。

# Munitとは
- MUnitはMulesoftが提供するテスト・フレームワーク																												
- Muleコンポーネントのモック機能を備えており、フロー単位のテストを行うことができる。																												
- MUnit自体もMuleコンポーネントとなっており、テスト対象のフローに対するMUnitのフローをテストケース単位で作成していく。

# MUnitの基本形

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/dd2bdf74-199d-17a4-12ee-91042a266cc0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/0b61a64a-1eb6-77c4-6880-1a86cc835c95.png)

# 使用例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/528da452-b351-4664-5504-40997f626f71.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/174c03d4-a73a-8dcf-e377-5d7541173413.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/8c56b5ac-3fd8-8726-7253-c6bb0e37b349.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/a1b8dd98-fe70-7468-fded-ad8e23c50beb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/afb8126f-ae7a-6fba-8f9a-8c70d050b78b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/e92f66c4-bf0b-f282-2d8a-2d8a75eeca18.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/2644ba69-a0fa-2238-f009-0323e8810e6a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/05fd827d-508c-b57a-58f6-fc2b9624692c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/2c315ab2-a851-a379-27fa-93f2d9e502b8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/96cc1281-4bd5-f247-bc41-cccd0bed4cd8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/cec98d85-f778-0fc0-dfa5-8842e2619a1e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/2cb225fe-e690-45eb-3947-ade8b91d1672.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/5ca63e05-2a7f-d927-c67d-bb00cfd36dec.png)

# デモリンク
[Github: munit-demo](https://github.com/qiguang-fang/mule-demo/tree/master/munit-demo)

# 終わりに
最後までお読みいただき、本当にありがとうございました。
Mulesoftに関する、すこし理解できましたら幸いです。気になる点があったらお知らせください。
「配列のすべての要素が条件を満たすならtrueを返す」関数に空の配列を渡した場合の話

「**配列のすべての要素が条件を満たすならtrueを返す**」関数をあなたが作成するとして、**配列が空配列**`[]`だった場合、結果は**true**にすべきでしょうか、**false**にすべきでしょうか。

答えは**true**です。

「一つも要素がないならば、一つも条件を満たせないのだから、falseにすべきでは？」と考える人もいるかもしれませんが、「すべての要素が条件を満たす」という要件に「最低でも一つは条件を満たす」は含まれていません。

コンピュータサイエンスを学んだ人ならば「ド・モルガンの法則」を知っていると思います。この法則は非常に便利で、これを知っているプログラマーは、直感的でない論理式をわかりやすく置き換えるのに活用しているでしょう。

https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%BB%E3%83%A2%E3%83%AB%E3%82%AC%E3%83%B3%E3%81%AE%E6%B3%95%E5%89%87

この法則は、以下の2つが可換であることを示しています。

```C#:全ての要素が条件を満たすならtrue
(A and B and C and D and ...)
```

```C#:いずれかの要素が条件を満たさないならfalse
not (not A or not B or not C or not D or ...)
```

後者に置き換えて考えてみると、空の配列の中には条件を満たさないものは含まれていません。空だから当然です。そう考えると、配列が空だった場合にfalseを返してはおかしいのです。

ですから、正解は「**trueを返す**」となります。

プログラミング言語の論理式（if文の()の中に書かれるような式のことです）は、ド・モルガンの法則に従います。

論理値（true or false）を返す関数は、ド・モルガンの法則に従わないと、プログラミング言語上で扱いにくい、違和感のある、ミスを招きやすい、バグを生み出しやすいものになってしまいます。

実際、多くのプログラミング言語において、「配列のすべての要素が条件を満たすかどうか」をチェックする関数は空配列を渡された時trueを返します。（ChatGPT-4にお手伝い頂きました）

```ruby:ruby
array = []
all_positive = array.all? { |n| n > 0 }  # true
```

```javascript:JavaScript
const array = [];
const allPositive = array.every(n => n > 0);  // true
```

```C#:C#
var array = new int[0];
bool allPositive = array.All(n => n > 0);  //  true
```

```java:Java
int[] array = new int[0];
boolean allPositive = Arrays.stream(array).allMatch(n -> n > 0);  // true
```

```python:Python
array = []
all_positive = all(n > 0 for n in array)  # true
```

# 要件を確認するということについて

この関数の作成を他人から依頼された場合には、ひょっとすると依頼者の意図は「空配列の場合にはfalseを返して欲しい」だったり「例外をスローして欲しい」だったりするかもしれません。しかし、その場合には、要件自体が「配列のすべての要素が条件を満たすならtrueを返す」だけではなかった、と考えなくてはなりません。

- 「配列のすべての要素が条件を満たすならtrueを返す」
- 「空配列の場合にはfalse（又は例外）を返す」

この2つは異なる要件であり、分離して捉えた方が良いプログラムが出来上がります。このような機能を混在させて実装すると、再利用性の低い、勘違いを生みやすいソースコードになってしまうでしょう。

ですから、あなたが作る「配列のすべての要素が条件を満たすならtrueを返す」関数は、空配列の時にtrueを返す方が良いコードとなるでしょう。

# 余談

この話を書くにあたって、「全ての要素が条件を満たすならtrue、但し、空配列の場合にはfalseを返して欲しい」という要件には、具体的にどのようなものあるか考えてみました。

しかし、うまい例が一つも思いつきませんでした。

例えば「工場の製造データに例外値を発見したらアラートを出す」プログラムがあったとします。
その場合のロジックは

「配列の全てのデータが条件を満たす」

になるはずです。上記の条件がfalseの時、アラートを出せばよいでしょう。
そして、製造データが一つもない時にfalseが返ってきてはダメでしょう。なぜなら、例外値は一つもないからです。
つまり、ド・モルガンの法則に従うことが、正しい実装となります。

もしこの時、「製造データが１つもないのはそれはそれでアラートが必要」となったとします。
しかしこれは、先ほどのチェックとはまた別のチェックであり、別のチェック機能として分離して実装した方が良いでしょう。

恐らく、製造データが１つもないことに対してアラートを出すというのは、「例外値を発見する」とは別の要件です。別の要件ですから、チェックするタイミングやチェックを実行する条件自体も別になってくる可能性が高いでしょうし、出力するアラートも別のものになりそうです。

上記をごちゃまぜにして単一のチェック処理としてしまうと、チェック目的が曖昧になり、今後問題となるかもしれません。

そう考えると、プログラミングとは無関係に、要件定義レベルでもこの考え方は正しいと言える気がします。

そもそも要件定義では、お客様の要件を論理的に整理する必要があるのですから、お客様の言う「全ての要素が条件を満たすならtrue」がどういう意味か確認するのは大事だとしても、あなた自身が「全ての要素が条件を満たすならtrue」の意味の中に「空配列の場合にfalseを返す」とか「例外を返す」という意味を含むこともある、というような捉え方をしてしまっては、最終的に定義された要件が論理的に破綻してしまう可能性があるかもしれません。