OmniAICreator/Qiita-1.07M huggingface dataset:
2023年6月 SoucetreeでBitBucketのGitリポジトリをクローンする

久しぶりにBitBucket使ったらブラウザから自動でクローンできなかったのでちょっと手直ししたメモ
# アプリパスワード作成
ざっくり言うと2021 年 9 月 13 日以降、アプリパスワードが必要になったので作る。詳細は[こちら](https://support.atlassian.com/bitbucket-cloud/docs/app-passwords/#Create-an-app-password)。

BitBucketサイトログインし設定の「Personal Bitbucket settings」へGo
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/998f5d66-e576-d852-dc7d-89e3a9335d17.png)

左メニューから「アプリパスワード」へGo
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/bbca5df0-03eb-d28b-a3a5-f77026af603d.png)

アプリパスワードの作成Go
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/18034a7c-b8e3-d476-709b-0e1041e85732.png)

必要な権限つけて作成しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/bfcdb06b-b1cb-ecad-6741-a85ddede28a5.png)

作成すると最初の1回だけパスワードが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/4af89348-1a2c-0715-738d-2721191eceea.png)
しっかりコピーしてなくさないようにしましょう。（画像のやつは作成後すぐ消してあるのでご心配なく）



# リポジトリのページ行ってクローンする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/89a87d97-64c3-06df-c2d8-3b10f066a079.png)

SoucetreeのCloneボタンを利用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/7f1b7ec4-f4a8-fe29-8257-4fac4626215b.png)

このままだとエラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/5ef78950-77fa-df0b-9064-44557a77b58f.png)

先ほど作ったアプリパスワードを使用して、URLが以下の構造になるようにちょっと修正する
``https://{bitbucket_username}:{app_password}@bitbucket.org/{workspace}/{repository}.git``

クローンできるようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/82714996-649a-8c9c-5bef-4425576162e0.png)


以上！お疲れ様でした。
VarmiloのキーボードでCtrlとCapsLockが入れ替わる

# はじめに

あるときペアプロをしているときに、キーボードの入力がうまくいかず(Vim)色々試しているうちにキーボード設定に問題があることがわかったので簡単に残しておきます

# 問題

あるときにCtrlとCapsLockが入れ替わっていることに気づきました
接続しているキーボードでなく、ノートPCのキーボードでCtrlを押すと、Ctrlとして使えたのでキーボードが原因ということがわかりました

またCapsLock+Cでコピーができたので入れ替わっていることもわかりました

キーボードは「**Varmilo**」を使っています

# 解決方法

キーボードをWindows用の初期設定に戻すコマンドでリセットしました

**Fn+D (3秒)**

# おわりに

古いキーボードだったので壊れたかと思いましたが、治ってよかったです

# 参考

https://note.com/isseiroha/n/nd5b02e3f4674
バッチでIPアドレスなど取得します。（複数対応）（こんなニーズあるんか？）

## IPv4アドレスを変数に取り込むバッチです。

こんなニーズあるんか？シリーズです。

ipconfigの出力からIPアドレスを変数に取り込みます。
これを作っていて気が付いたのですが、自宅からVPN接続していると、IPv4アドレスが２つありました。

いくつまで対応すればよいかわからないので、今回は、いくつでも取得できるようにしています。
IPv4を変数に取り込むバッチは、以下の通りです。
もちろん、IPv4の部分をIPv6などに変更すればv6も取得できます。

2023/06/30追記

@DamashiGami(コーポれーしょん 騙し髪)さんに、文字置き換えにワイルドカードが使える事を教えていただいたので、よりシンプルにしてみました。ありがとうございました。
（2023/7/12 我が家の2重ルータを回避し、無事IPv6でアクセスが出来るようになったのを記念して、IPv6の情報も簡単に表示できるようにしてみました。　get_ip 6または、v6で表示できます。）

```bat:get_ip.bat
@echo off
chcp 932 >nul
setlocal enabledelayedexpansion

set key_word=IPv4
if "%1"=="6" set key_word=IPv6
if "%1"=="v6" set key_word=IPv6


rem ipconfigコマンドから情報を取得する。
set count=0
for /f "usebackq delims=" %%a in (`ipconfig^|findstr /i "%key_word%"`) do (
  set contents=%%a
  set "contents=!contents:*: =!"
  set /a count+=1
  set contents[!count!]=!contents!
)

rem 情報を表示する。
for /l %%i in (1,1,%count%) do ( echo %key_word%[%%i]=!contents[%%i]!)

if "%SESSIONNAME%"=="" pause
endlocal
exit /b
```

上記の応用で、ipconfig /allから得られる様々な情報を変数に取り込むことができる拡張バージョンも作りました。こちらは、結果にスペースを含む場合があるので、若干変数加工も増えています。

全くニーズが無いバッチかもしれませんが、コマンドを差し替えたりすれば、更に様々な情報を入手できます。

実はこれを作っていて、前回アップした、不思議な文字置き換え関係のエラーに悩まされました。
皆さんのアドバイスで、（）に関連する不思議なエラーを回避できたので、2023/7/12最終バージョンに更新します。

```bat:get_info.bat
@echo off
setlocal enabledelayedexpansion

rem 欲しい情報が複数回出現する場合があるケースに対応（VPN接続時のIPアドレスなど）

rem PreferredをNOにすると、(優先)、英語モードの場合は、(Preferred)を削除する。
set Preferred=NO

rem パラメータでキーワードを指定することも可能にしておく。
rem 例えば、パラメータに 説明 や、物理アドレスなど、入手したい情報を入れる。（必要か？）
if "%1"=="" ( set key_word=IPv4) else (set key_word=%1)

set get_command=ipconfig /all

rem ipconfigコマンドから情報を取得する。
set count=0
for /f "usebackq delims=" %%a in (`%get_command%^|findstr /i "%key_word%"`) do (
  rem パラメータで、説明を指定した場合など、スペースが含まれる事があるので、''で囲んでおく。
  set contents='%%a'
  call :trim
  set /a count+=1
  set contents[!count!]=!contents!
)

rem 情報を表示する。見つからなかった場合は、何も表示しない。
for /l %%i in (1,1,%count%) do ( echo %key_word%[%%i]=!contents[%%i]!)

if "%SESSIONNAME%"=="" pause
endlocal
exit /b


rem サブルーチン

:trim
set "contents=%contents:*: =%"
set contents=%contents:~-0,-1%

if "%Preferred%"=="NO" (
  set "contents=!contents:(優先) =!"
  set "contents=!contents:(Preferred) =!"
)

:end_trim
exit /b

```
【社内勉強会】マイクロサービスは技術だけでなく組織構成も重要だった

# はじめに
[AXLBIT株式会社](https://axlgear.net/?gclid=CjwKCAjwpuajBhBpEiwA_ZtfhbIxKuD1V3NzUCw-_S_dAUyxWZT9GnPfLpNioimMj5ob215JwIyDnBoCchsQAvD_BwE) のAXLGEAR開発担当をしております、久恒（**Hisatsune**）です！

今回、社内の開発メンバーが外部のマイクロサービスのセミナーに参加したのをきっかけに、社内でもマイクロサービスについての興味が高まったので、報告、および共有の意図で、社内勉強会の開催に至りました。
その概要と、それを受けての個人的感想を簡単に紹介します！

# 勉強会の概要
今回の勉強会は、以下の流れで実施しました。
1. 登壇者発表
    1. マイクロサービスアーキテクチャとは
    1. マイクロサービスの5つの特性
    1. アーキテクチャの比較
    1. マイクロサービスアーキテクチャの組織論
    1. AXLBITに生かすならば
1. 勉強会参加メンバーの感想
1. 懇親会

## 印象に残っている（感銘を受けた）モノ
### 1. アーキテクチャの比較
モノリス・マイクロサービス、`それぞれにメリット・デメリット`がある
### 2. マイクロサービスアーキテクチャの組織論
区切ったプロダクトが小さい場合、 `"two-pizza rule" (="1枚のピザを分け合える人数")`  の小さなチームで回すことが可能


## 上記の選定理由（というか、感想）
1に関して、個人的に `モノリス=悪, 忌むべきもの`・`マイクロサービス=キラキラしたもの, モダン`というイメージを勝手に抱いていた。
ただ、実際にはモノリスで成功体験を収めているところもある [^1] 。 **言われてみれば当たり前** なことだが`モノリスにもマイクロサービスにもメリットデメリットはある`と聞いて、ハッとさせられた。改めて、**銀の弾丸はない**ということを改めて思い知った。
[^1]: ① [サービス分割に備えたモノリス（モジュラーモノリスとかアグリゲートとか）](https://tech-blog.rakus.co.jp/entry/20201026/microservice)　 ② [[翻訳] Shopifyにおけるモジュラモノリスへの移行](https://qiita.com/tkyowa/items/ae9fa550237cb6f48318)

また、2を聞いた瞬間、**いや、1チームあたり人数少なすぎでしょ(笑)** と思ったが、ふと我に返り、自分の周りの環境を鑑みると、**まぁ・・・妥当なのかな・・・**、と思ったり。兎にも角にも、印象に残ったので挙げさせてもらった。
...ソフトウェア開発に関しての組織論は、直感に反するものが多いなぁとつくづく思った。

# 最後に
今回の勉強会を終えて、アーキテクチャに対しての勉強のモチベーションが上がりました。この熱が冷めないうちに、情報のキャッチアップを続けていきたいと思っております。
差し当たって、二つの書籍
1. [マイクロサービスアーキテクチャ 第2版](https://www.amazon.co.jp/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3-%E7%AC%AC2%E7%89%88-Sam-Newman/dp/4814400012/ref=sr_1_1?keywords=%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3+%E7%AC%AC2%E7%89%88&qid=1683190811&sprefix=%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%2Caps%2C352&sr=8-1)
2. [モノリスからマイクロサービスへ (amazon)](https://www.amazon.co.jp/%E3%83%A2%E3%83%8E%E3%83%AA%E3%82%B9%E3%81%8B%E3%82%89%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%B8-%E2%80%95%E3%83%A2%E3%83%8E%E3%83%AA%E3%82%B9%E3%82%92%E9%80%B2%E5%8C%96%E3%81%95%E3%81%9B%E3%82%8B%E5%AE%9F%E8%B7%B5%E7%A7%BB%E8%A1%8C%E3%82%AC%E3%82%A4%E3%83%89-Sam-Newman/dp/4873119316/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3V0PDQGG2SUDZ&keywords=%E3%83%A2%E3%83%8E%E3%83%AA%E3%82%B9%E3%81%8B%E3%82%89%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%B8&qid=1683113007&sprefix=%E3%83%A2%E3%83%8E%E3%83%AA%E3%82%B9%E3%81%8B%E3%82%89%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%B8%2Caps%2C222&sr=8-1)

が手元にある（1は勉強会後に個人的に購入・2は会社の電子書籍）ので、これらを積読[^2]しておきました。時間がある時に読もうと思います。
[^2]:[積読ハウマッチ](https://tsundoku.site/): 積んでいる本の総額がわかる読書管理サービス。他者の積読もわかるようになっているので、読む本に困ったとき等は、このサイトを参考にするといいかも...!!（僕はたまに参考にします！）

今回のように、**学んだことをアウトプットすること**はこうして参加者にもいい影響がありますし、何より登壇者本人への更なる理解を促進させる、言わば**肥料的な役割を担う**一面があると感じております。
これからもこのような発表の場を継続して開催していきたいと思っております！
mongodb を alma9にいれる

almalinux 9 にmongodbをいれる
以下、rootで実行

```ruby:
# dnf update
```
4.2とか4.4とか試したけど入らなかった。

```ruby:
 # vi /etc/yum.repos.d/mongodb-org-6.0.repo

[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/8/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc
```

```ruby:
# dnf install  mongodb-org
MongoDB Repository                                                               25 kB/s |  28 kB     00:01
Dependencies resolved.
================================================================================================================
 Package                                  Architecture   Version                  Repository               Size
================================================================================================================
Installing:
 mongodb-org                              x86_64         6.0.6-1.el8              mongodb-org-6.0          11 k
Installing dependencies:
 compat-openssl11                         x86_64         1:1.1.1k-4.el9_0         appstream               1.5 M
 cyrus-sasl                               x86_64         2.1.27-21.el9            baseos                   71 k
 cyrus-sasl-gssapi                        x86_64         2.1.27-21.el9            baseos                   26 k
 cyrus-sasl-plain                         x86_64         2.1.27-21.el9            baseos                   23 k
 mongodb-database-tools                   x86_64         100.7.3-1                mongodb-org-6.0          51 M
 mongodb-mongosh                          x86_64         1.10.1-1.el8             mongodb-org-6.0          43 M
 mongodb-org-database                     x86_64         6.0.6-1.el8              mongodb-org-6.0          11 k
 mongodb-org-database-tools-extra         x86_64         6.0.6-1.el8              mongodb-org-6.0          16 k
 mongodb-org-mongos                       x86_64         6.0.6-1.el8              mongodb-org-6.0          22 M
 mongodb-org-server                       x86_64         6.0.6-1.el8              mongodb-org-6.0          31 M
 mongodb-org-tools                        x86_64         6.0.6-1.el8              mongodb-org-6.0          11 k

Transaction Summary
================================================================================================================
Install  12 Packages

Total download size: 149 M
Installed size: 528 M
Is this ok [y/N]: y
```
インストール終了。

起動
```ruby:
# systemctl start mongod
```
【Android】マルチモジュール化によるビルド高速化はどれくらい効果があるのか？調べてみた【Refactoring】

# はじめに

with Androidチームでは、**Jetpack Compose化** と、**モジュール分割** の二つの大きなリファクタリングを進めており、自分はモジュール分割を主に担当しています。
マルチモジュール構成でアプリを実装することの大きなメリットとしては、「モジュール間の依存制限による、誤った依存の防止」や「ビルド速度の向上」などがよく挙げられますが、効果のほどはわからず進めていました。
ということで、自分のリファクタリングがどんな影響を及ぼしているのかを知るために、モジュール分割によってビルド時間がどれくらい変化しているかを調査してみました。

## 前提

with-androidは、ざっくり下記のような構成でできています。

```
.
├── app
├── data
├── domain
├── playground
├── presentation
│   ├── atomicdesign
│   ├── atomicdesigncatalog
│   ├── auth
│   ├── common
│   ├── dialog
│   ├── feature
│   └── presentation
└── shared
```

今回はこのうち、`:presentation:presentationモジュール`に存在するファイルを、機能単位でモジュール分割してfeatureに入れていきます。
`:presentation:presentationモジュール`には、presentationレイヤーで使用するファイルが丸ごと入っていました。機能追加に伴い、リソースファイルやコードが増えていったことで、このモジュールが占めるビルド時間が一番多くなっていたため、モジュール化を通してビルド時間を改善していきたいという意図があります。

また、調査は下記の方法で実施してみます。

1. モジュール分割前に、`:presentation:presentationモジュール`配下のファイルAを変更した際のビルド時間を調査する。
→**元のビルド時間を調査するのが目的**

2. モジュール化後に、`:presentation:presentationモジュール`配下のファイルBを変更した際のビルド時間を調査する。
→**モジュール分割によって、`:presentation:presentationモジュール`のサイズが小さくなったことの影響を調査するのが目的**

3. モジュール分割後に、`:presentation:feature:hogeモジュール`配下のファイルA'を変更した際のビルド時間を調査する。
→**モジュール分割によって、`:presentation:feature:hogeモジュール`に存在するファイルのみが差分ビルドされるようになったことの影響を調査するのが目的**

ビルド時間は、Android StudioのBuild Analyzerを使用して調査します。

## 1.モジュール分割前に、`:presentation:presentationモジュール`配下のファイルAを変更した際のビルド時間を調査する。

まずは現在のビルド時間を調査します。
結果はこちら。

![スクリーンショット 2023-06-26 10.33.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474683/2bcce553-e7ba-76b1-ff67-62782bcd7b8b.png)

## 2.モジュール化後に、`:presentation:presentationモジュール`配下のファイルBを変更した際のビルド時間を調査する。

次に、変更によるサイズ減少の影響を調査します。
結果はこちら。

![スクリーンショット 2023-06-26 10.38.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474683/84df59e2-c629-39da-12ee-b696ccd2294f.png)

分割前と分割後で比較すると、ほんのちょっとだけ速くなっています。
長い目で見た時や、リソースファイルのサイズが大きい機能をモジュール分割した場合は影響が大きいのかもしれませんが、今回の修正でのビルド時間に対するインパクトは小さいことがわかりました。

## 3.モジュール分割後に、`:presentation:feature:hogeモジュール`配下のファイルA'を変更した際のビルド時間を調査する。

最後に、分割による差分ビルドの影響を調査します。
結果はこちら。

![スクリーンショット 2023-06-26 10.37.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474683/816844c0-eeed-dcbe-9fd2-4838a35fa7ea.png)

1→2と比較すると、結構速くなっているのがわかります。
差分ビルドによって、`:presentation:presentationモジュール`に存在する無関係のファイルがビルドに含まれないことの影響が大きいということがわかりました。



## 結果

- モジュール分割をすることで、ビルドするモジュールのサイズが小さくなることの影響は小さい。
- モジュール分割をすることで、分割されたモジュールのみがビルドされるようになることの影響は大きい。
- ということは、今後分割したモジュールのみを修正する際は、ビルド速度向上の恩恵を受けることができる。
    - 関係があるファイルを適切にモジュール分けするのも大事

# おわりに

今回の調査では1つのファイルしか修正しなかったので、もしかしたら複数ファイルを修正したり、リソースを追加したりすると結果が変わる可能性もあるかなと思っています。
とはいえ、「状況によってはモジュール化リファクタリングをすることでメリットがある」という事実を知ること、実感を得ることができました。
おかげで今後もモチベーション高く進めていくことができそうです。

おわり。
HTMLでmeta使ってページアイコンを作りたい話

# はじめに
最近作ったページのアイコンを付けたくなったので、
記事に書くほどではないが、書いていきたいと思います。
# いつもの
今日はMaterialize使わないです。
~~~html:icon.html
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>icon</title>
</head>

<body>
  
</body>

</html>
~~~
# アイコン画像の用意

<img width="150" src="https://s3-ap-northeast-1.amazonaws.com/qiita-image-store/0/3374328/46bd0bf1f62fab1b9d2883c5439fef40b01b9590/x_large.png?1685413809">
僕のアイコンを使います。

# アイコン書き込み
書き込みは`meta`を使ってやります。
~~~html:icon.html
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>icon</title>
  <link rel="icon" href="Atsu1209.png">

</head>

<body>
  
</body>

</html>
~~~
hrefのところに画像パスか画像URLを貼り付けてください。
`<link rel="icon" href="Atsu1209.png">`このコードを使ってます。]

# 最後に
めっちゃ短い記事になったけど、意外と役に立つ。
では.
SQLを使用した平均値と中央値の計算

平均値を求めるのが一般的ですが、中央値が必要な場合もあります。
両方について説明しよう。

# 平均値

式で平均値を算出する：
`avg = (x1 + x2 + x3 + ... + xn) / n`

このサンプルデータを使用してみましょう。
``` sql
SELECT * FROM data;

1
2
3
4
5
9
```

この数字を使って、平均値を計算してみましょう。
`(1 + 2 + 3 + 4 + 5 + 9) / 6 = 24 / 6 = 4`


**上の式をSQLで書きましょう。**
``` sql
SELECT SUM(score) / COUNT(score) FROM data;

4
```

(1 + 2 + 3 + 4 + 5 + 9 ) / 6 なので、これは正しいです。

正確な値を使用するために、実際にはfloatを使用する必要があります

``` sql
SELECT CAST(SUM(score) AS FLOAT) / COUNT(score) FROM data;

4.0
```


幸いなことに、SQL にはクエリを簡素化する標準メソッドがあります。
``` sql
SELECT AVG(score) FROM data;

4.0
```

# 中央値
中央値を求めることが難しくなります。

中央値は、数を大きさの順に並べたときの真ん中の数です。計算方法は次の通りです。


`数が奇数個（n）の場合、中央値は (n+1)/2 番目の数値です。`
`数が偶数個（n）の場合、中央値は n/2 番目と (n/2)+1 番目の数値の平均です。`

この例では値が6つあるので偶数です。真ん中から2桁必要です: 3, 4
平均値が計算します： `( 3 + 4 ) / 2 = 3.5`

**SQL で同じことをしましょう：**

```  sql
SELECT AVG(score) AS median
FROM (
    SELECT score
    FROM (
        SELECT score, ROW_NUMBER() OVER (ORDER BY score) as row, COUNT(*) OVER () as total_rows
        FROM data
    ) sub    
WHERE row in ((total_rows + 1) / 2, (total_rows + 2) / 2)
);

3.5
```

このクエリでは：
    1. ROW_NUMBER() 関数を使用して、スコアで並べ替えた各行に行番号を割り当てます。
    2. COUNT(*) OVER() 関数を使用して、行の総数を取得します。
    3. WHERE 句は、行の総数が奇数の場合は中央の行を選択し、行の総数が偶数の場合は中央の2つの行を選択します。
    4. 最後に、外部クエリが AVG(score) を取得し、これが中央値となります。


# まとめ
中央値を見つけるのは一見難しいが、バラバラにするとより理にかなっている。
【初心者向け】params[:id]について理解しよう

:::note 
目次
1. [はじめに](#はじめに)
2. [paramsとは何か](#paramsとは何か)
3. [paramsのコード(ハッシュ)としての仕組み](#paramsのコード(ハッシュ)としての仕組み)
4. [params[:id]の役割](#params[:id]の役割)
5. [params[:id]の使用例](#params[:id]の使用例)
:::

# はじめに

Ruby on Railsを学び始めたばかりの段階で
Todoアプリや記事投稿アプリを作成することが多いかと思われます。
そんなときにparams[:id]というのを
コントローラー内などで目にするかと思います:runner_tone2:

```Ruby:
class ArticlesController < ApplicationController
  def show
    @article = Article.find(params[:id])
  end
end
```

# paramsとは何か
では、Railsにおけるparamsとは一体何なのでしょうか？

これはユーザーから送られてきたデータを
コントローラーが受け取るためのハッシュ（連想配列）です

**つまり、データを格納するための箱となります**

どのような手段でデータを送るのかというと、
以下のような例となります
(他にもパターンとしてあります)

:::note 
ユーザーがフォームに情報を入力し、そのフォームを送信する

URLの一部として情報が含まれている場合
たとえば `/users/1` のようなURLの情報のページがロードされた瞬間
:::

このparamsを利用することで、
ユーザーから送られたデータにアクセスすることができます。

# paramsのコード(ハッシュ)としての仕組み
こちらはparams[:id]に焦点を当てた内容と
少し内容がそれるので、見なくても大丈夫です:bow_tone1:

先程、paramsはハッシュ(連想配列)であると述べました。
ではparamsの中身がどうなっているのか見ていきましょう！

paramsでは配列内の各キーが
ユーザーから送られてきた情報（例えば名前やメールアドレス等）を表し、
それに対応する値がその情報の実際の内容となります:point_up:

具体的にユーザーがフォームで
名前やメールアドレスを入力したときは、
以下のようにparamsハッシュに保存されていきます!

名前を"John"
メールを "john@example.com"と入力したとします。

```Ruby:
params = { "name" => "John", "email" => "john@example.com" }
```
このような形でフォームを設定して、
入力するとデータの箱ができていきます

# params[:id]の役割

さて、本題のparams[:id]を見ていきます:point_up:

params[:id]は、URLから特定の情報のIDを取得する際に使用します！

例えば、ユーザーが特定の記事（例：IDが5の記事）を表示したいとき、
URLは/articles/5のようになります。

このとき、
params[:id]を使用して5というID情報を取得します:ok_woman:
```Ruby:
params = { "id" => "5" }
```
このときの箱(ハッシュ)の中身はこのようになっています

# params[:id]の使用例
具体的にどのようにparams[:id]を使用するか見てみましょう。

```Ruby:
class ArticlesController < ApplicationController
  def show
    @article = Article.find(params[:id])
  end
end
```

この例では、params[:id]を使用して、
表示したい記事のIDを取得し、
それをArticle.findメソッドに渡して、
データベースから該当の記事を取り出しています。

params[:id]は以下のように変換されます
```Ruby:
params = { "id" => "5" }
# (params[:id]) => (params[5])
```
-----------------------

以上、params[:id]の役割と使用方法についての説明でした:bow:

このparams[:id]は、Railsで頻繁に出てくると思うので、
ぜひイメージを掴んでいきましょう！
お疲れ様でした:relaxed:
ミドルウェア、ファームウェアって何？：ファームウェア

<h3>■ファームウェアって何？</h3>

組込ソフトに従事している人は、「ソフト書いてます」とは言うかもしれませんが、「アプリ書いてます」とは言わないですよね（私も）。もっと言うと、「ファームウェアを書いています」って言いたいですよね。相手が理解してくれれば。

そう。またまた大問題の「相手が理解してくれるか」【ファームウェア】編です。

ファーム（Firm)ですから、辞書で確認すると「固い」ですね。この反対側にあるのは「ソフト」（柔らかい）なんでしょうね。これ、疑いもないと思います。つまり、「ソフト」じゃないという意味？
あれ？先ほど「ソフト書いてます」とは言うよね？っという話をしました。でも、ソフトじゃないファームを書いているとは？？
やっぱり混乱を生む言葉「ファーム」ですね。。。

固いとは？と、これまたググると、
「原則として変更を行わない事からハードに近いからFirm」だそうです。原則として変更を行わない？？？？
「中の人」から見ても、今となっては変更を行わない、は無いよね、、という事になると思います。

更に、その「ファーム」に対しての比較が、「ソフト」だという点。「ファーム」の反対だとすると、書き換えが容易で非ROM搭載だと「ソフト」？？？

また、一般の人を混乱させてしまう言葉になりかけていますよね。

そもそも、「ファーム」と（一般に言われる）「ソフト」との違いは何だろうか？っと考えてみましょう。
一般に「ソフト」と言われると「アプリ」ですかね。正確には「アプリ」も「ファーム」も含んでソフトウェアだと思うんですが、一般の方から見ると、「ソフト」はネットからダウンロードして買えたり、ちょっと昔ならCDが入った「パッケージソフト」として量販店などに並んでいて買うもの。最近はスマホの「アプリ」と言われている感覚でしょうか。

ではこれら「ソフト」と「ファーム」の根本的な違いは？？？

最初に答えを言っちゃうと、「ソフト」はWindowsやLinux、MacやiOS、AndroidなどのリッチなOS環境で、かつデスクトップ的な画面が存在する様なコンピュータシステム上で動くことを想定された、「アプリケーションのみのプログラム」が「ソフト」であり「アプリ」です。OS環境が無いと動かない、OS環境を前提としたプログラムとも言えると思います。

「ファーム」は、OSから（前回 https://qiita.com/Cente_mw/items/3cec7a3e76f7cdac3d7e にて説明した）ミドルウェアやアプリケーションをすべて同梱して、CPUがこの「ファーム」を読み込みながらOSを起動してミドルウェアを動かしてアプリケーション動作をする、、、全ての機能が1つのソフトになっているのが「ファーム」だと思います。

組込の場合、開発環境は多くの場合Windows上のIDE(Integrated Development Environment：統合開発環境）の中でコードを書き、クロスコンパイルして、組込CPU向けのプログラムコードを吐き出します。（https://qiita.com/Cente_mw/items/ae2fb536d881d8ce17cf 参照）
このプログラムコードは、組込CPUがコールドスタート（電源ONして起動する）したときに、最初に読み込まれて機能します。ミドルウェア編（https://qiita.com/Cente_mw/items/3cec7a3e76f7cdac3d7e ）でお話ししたように、必要最低限の機能をレゴブロックの様に組み合わせたプログラムをすべて読み込んでCPUが動くのです。この段階で初めてOSが立ち上がり、ミドルウェアを起動して、アプリケーションが起動する、、、という事です。

一般のWindowsで、VisualStudioなどで「ソフト」を開発して＊＊＊＊.exe(例）を生成したとしましょう。このexeファイルにはOSが入っていませんよね？既にOSが起動している状態で、その上で起動されることを期待したexeファイルなのです。

このように「ファームウェア」は、Firm（固い）という意味合いではなく、コンピュータ（CPU)をゼロから起動するソフトウェアすべてを含んでいるプログラムです。ですから、「ファームウェア」開発では、CPUの起動やデバイスの制御、OSの起動、ミドルウェアの導入、という、アプリケーション層を書くまでのハードウェア由来の技術要素をしっかり理解していないと開発できないのです。
「アプリ」書きの様に、例えば、Windows環境での「アプリ」の書き方を知っていれば良いのではなく、CPUの起動からすべてスコープに入ってくるのが「ファームウェア」なのです。だから難しい。。

https://www.cente.jp/about/cente-introduction の表現で言うと、「Linuxの場合」にある「アプリケーション」が「ソフト」「アプリ」であり、右側の「Centeの場合」にある RTOS、ミドルウェア、アプリケーションを結合したもの。。これが「ファーム」です。
ですから、「ファーム」は原則として変更を行わない事からハードに近いから、、、というよりは、ROMに格納されるから？が一番近い回答な気がします。OSなども同梱した組込CPU用ソフトウェア（プログラム）、という事になると思います。

<h3>■ファームウェアとアプリの違いの「結論」</h3>
結局、ぎゅっとすると、、、

　<b>ファームウェア ... 組込CPU上で動作するOS自身を含むプログラムのこと
　アプリケーション ... OS上で動くことを想定したプログラムのこと</b>

ですね。言いたかったのは、この「違い」について理解していますか？っという点。理解したうえで、スキルを磨きましょうね！っという事を言いたかった。それぞれ要求されるスキルは異なる訳で、単に「言語」を操作できるから「ソフト」が書けるわけじゃなくて、どんな環境で、どんな機能を実現するのか、、をよく考えて開発スキルを積みましょうね！っという感覚です。


<h3>■今日の閑話</h3>
何でこんな話を今更書いたのか？っというと。<br>
Windows環境で「ソフト」を書いた実績のあるエンジニアは、組込の領域に移籍しても「ソフト」は書けるんだろうか？経験者として開発にどの程度順応できるんだろうか？っと問われたこと。経験のある「ソフト」の立ち位置をちゃんと理解してさえいれば、他の環境で何を追加で勉強するのか、逆に環境に頼って開発できるのか、などが理解出来ると思います。<br>
最近、Phython書けます、Ruby書けます、C++書いてました、、という履歴書を読みます。さて、どんな環境でプログラミングをしていて、そのプログラムはどう動いているのか？そこを意識できているか、説明できるか、がエンジニアとしては問われると思います。<br>
<br>

Cente：
https://www.cente.jp/


お問合せはこちら：
https://www.cente.jp/otoiawase/
Postfix をローカルで使う

こちらと同じことを、クロムブックの linux で行いました。
[ローカル環境下で使えるメールサーバをセットアップする　Postfix編](http://holiday-programmer.net/postifx_install/)

## 使った環境

```text
$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
```

## インストール

postfix のインストール

```bash
sudo apt install postfix
```

>サーバーの選択は、LOCAL を選びます。

テストに使う　telnet のインストール

```bash
sudo apt install telnet
```

## 環境の設定

```text:/etc/postfix/main.cf
（省略）
#
home_mailbox = Maildir/
```

Postfix の再起動

```bash
sudo systemctl restart postfix
```

## ユーザーの作成

```bash
sudo adduser -uid 1220 holiday001
```

## テスト

```bash
telnet localhost 25
```

holiday001@penguin.lxd にメールを送ります。

```text
$ telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 penguin.lxd ESMTP Postfix (Debian/GNU)
mail from:holiday001@penguin.lxd
250 2.1.0 Ok
rcpt to:holiday001@penguin.lxd
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
Hello
.
250 2.0.0 Ok: queued as B83604FF3F
quit
221 2.0.0 Bye
Connection closed by foreign host.
```

メールが届いていることを確認

```bash
sudo ls -l /home/holiday001/Maildir/new
```

```text
$ sudo cat /home/holiday001/Maildir/new/1687912721.V32I4ff40M231351.penguin
Return-Path: <holiday001@penguin.lxd>
X-Original-To: holiday001@penguin.lxd
Delivered-To: holiday001@penguin.lxd
Received: from localhost (localhost [IPv6:::1])
        by penguin.lxd (Postfix) with SMTP id B83604FF3F
        for <holiday001@penguin.lxd>; Wed, 28 Jun 2023 09:38:15 +0900 (JST)
Message-Id: <20230628003825.B83604FF3F@penguin.lxd>
Date: Wed, 28 Jun 2023 09:38:15 +0900 (JST)
From: holiday001@penguin.lxd

Hello
```

mail コマンドで確認

ユーザーの切り替え

```bash
su holiday001
```

```text
$ mail
Mail version 8.1.2 01/15/2001.  Type ? for help.
"/var/mail/holiday001": 1 message 1 unread
>U  1 holiday001@pengui  Wed Jun 28 07:10   15/490   
& p
Message 1:
From holiday001@penguin.lxd  Wed Jun 28 07:10:31 2023
X-Original-To: holiday001@penguin.lxd
Date: Wed, 28 Jun 2023 07:10:17 +0900 (JST)
From: holiday001@penguin.lxd

Hello
Good Morning

& q
Saved 1 message in /home/holiday001/mbox
```
【AWS】Active Directoryでユーザー名を変更すると、WorkSpacesにサインインできなくなってしまう

# 概要
AD Connectorを使用してWorkSpacesを起動後、Active Directoryでユーザー名を変更しても問題ないのかを検証しました。

検証前に勘違いしていたこと：Active Directoryでユーザー名を変更したらAD ConnectorがWorkSpacesに連携してくれそうなイメージだったため、問題ないだろうと思っていました。

# 結論
Active Directoryでユーザー名を変更すると、WorkSpacesにサインインできなくなります。

# 試した手順
#### ①　ユーザー名を変更前に、WorkSpacesにサインインできることを確認
ユーザー名：【変更前】ramune
![ログイン画面ramune.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491382/5009b61f-9dc0-3fd1-3580-64a51f34bf24.png)

#### ②　Active Directoryでユーザー名を変更
ユーザー名：【変更前】ramune
　　　　　　【変更後】AfterChange
![ユーザー名変更前.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491382/369043e7-e8b2-a770-b350-5366432ff73a.png)

#### ③-1　AWS マネジメントコンソール上で、WorkSpacesのユーザーネームを確認
⇒「ramune」から「AfterChange」に変わっていてほしかったのですが、変わっていませんでした。
![ユーザーを編集ボタン - コピー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491382/a9e9b356-f041-607e-f619-5d07e3b3caf4.png)

#### ③-2　「ユーザーを編集」を選択
⇒AD Connectorを使用しているため、ユーザーを編集できませんでした。
（:writing_hand:この機能は、AWS Managed Microsoft ADまたはSimple ADを使用している場合にのみ利用できます。また、実行できる編集は「名」、「姓」、「メールアドレス」のみです。）
![ユーザー編集もできない.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491382/37114910-58a1-44c5-a4ad-dcb53ab1ad33.png)

#### ④　WorkSpacesにサインインを試みる
**1.　「ユーザー名：AfterChange」で「サインイン」を押下**
⇒失敗。「不明なエラーが発生しました」と表示されてしまいました。
![AfterChangeでログインしてみる.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491382/ae87a3a2-5dea-9398-eb6b-2910427bf93f.png)

**2.　「ユーザー名：ramune」で「サインイン」を押下**
⇒失敗。「認証が失敗しました」と表示されてしまいました。
![変更前のユーザーでログインを試みる.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491382/527dbe65-8e58-2521-f5fe-4742e86e6e6d.png)

**3.　Active Directoryで「ユーザー名：ramune」に戻した後、「ユーザー名：ramune」で「サインイン」を押下**
⇒成功。
![ログイン成功ramune.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491382/5e22e762-91cf-3fba-faa0-2d7db3d6d386.png)

# まとめ
Active Directoryでユーザー名を変更すると、WorkSpacesにサインインできなくなってしまいました。

AWS 公式によると、
「現在、ユーザー名の変更はサポートされておらず、WorkSpacesのユーザー名を変更することはできない」とのことです。

AWS re:Postには、以下の記載がありました。
> WorkSpaces では、Active Directory ユーザーのユーザー名属性の変更はサポートされていません。WorkSpaces と Active Directory のユーザー名属性が一致しない場合、認証は失敗します。
> 

# 回避策
名前を変更したユーザーに新しいWorkSpacesをプロビジョニングするという回避策があるようです。
> 1.    ユーザーボリュームから Amazon WorkDocs や Amazon FSx などの外部の場所にファイルをバックアップします。
> 
> 2.    WorkSpace を削除します。
> 
> 3.    ユーザー名属性を変更します。
> 
> 4.    ユーザーのために新しい WorkSpace を起動します。

# 参考
https://repost.aws/ja/knowledge-center/workspaces-authentication-error

https://docs.aws.amazon.com/workspaces/latest/adminguide/manage-workspaces-users.html#edit-user
CentOS7にKimchiをインストールする2023

2023年のいま、CentOS7にKimchiをインストールする手順です。
インストール手順を検索しても失敗する記事が多かったのでここでメモしておきます。

```
# CentOS Linux release 7.9.2009 (Core)
```

なおKimchiについての説明はしません。
* [An HTML5 management interface for KVM guests](https://github.com/kimchi-project/kimchi)

:::note info
ここでインストールするKimchiは2.5.0です。
CentOS7には3.0.0はインストールできないようです。
:::

# インストール手順

CentOSのセットアップは終わっているものとします。
自分は以下の対応をしました。
* selinuxの無効
* firewalld停止
* ntp設定


## Kimchiインストール
以下の通り。これでqemu-kvm関係まるっとインストールされます。
```
# yum -y install epel-release
# yum -y install https://github.com/kimchi-project/wok/releases/download/2.5.0/wok-2.5.0-0.el7.centos.noarch.rpm
# yum -y install https://github.com/kimchi-project/kimchi/releases/download/2.5.0/kimchi-2.5.0-0.el7.centos.noarch.rpm
# systemctl start wokd
# systemctl enable wokd
```

※gingerbaseはインストールしなくてもいいです。

:::note info
[Ginger ベース ホスト] タブでは、システム情報、システム統計、ソフトウェア アップデート、リポジトリ、デバッグ レポート機能などのベース ホスト機能が提供されます。

また、Ginger Base はシャットダウン、再起動、接続のオプションを提供します。
:::
→ [gingerbase](https://github.com/kimchi-project/gingerbase)



あとはブラウザでアクセス

```
https://localhost:8001/
```

以上でインストールできました。
Kimchiは2020年に3.0.0にバージョンアップしてCentOSでインストールできなくなったようです。
検索で引っかかる、インストール手順のページは3.0.0のリリース以前に書かれたもので2023の今では
インストールに失敗してしまうようです。


# トラブル

vnc関係のトラブル。ブラウザでコンソール開けない。Spiceなら開ける。
短期運用の予定なのでこの件は放置。
Email-To-Flow

[Flowに関するまとめページに戻る](https://qiita.com/Keiji_otsubo/items/55ebc9c634a3216f3990)

-------------


面白いフローを見つけた思いましたが、もしかして有償なの？


+ [Introducing Email-To-Flow, a low-code Email Service](https://unofficialsf.com/introducing-email-to-flow-a-low-code-email-service/)

+ [【元の質問】Automating Case Flow from UNID in Email Body](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000076ACVC)
[AtCoder] Beginners Selection - ABC085C - Otoshidama [Elixir Livebook]

## はじめに

AtCoder の Beginners Selection コンテスト ABC085C - Otoshidama 問題を Elixir Livebook で回答しました

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/tree/main/livebooks/atcoder/abc085/abc085_c

## 問題

https://atcoder.jp/contests/abs/tasks/abc085_c

## 入出力例

以下のようになれば OK です

```elixir
"""
9 45000
"""
|> Main.solve()
|> then(&(&1 == "0 9 0"))
```

```elixir
"""
20 196000
"""
|> Main.solve()
|> then(&(&1 == "-1 -1 -1"))
```

```elixir
"""
1000 1234000
"""
|> Main.solve()
|> then(&(&1 == "2 54 944"))
```

```elixir
"""
2000 20000000
"""
|> Main.solve()
|> then(&(&1 == "2000 0 0"))
```

@koyo-miyamura　さんが書いている通り、答えが複数ありうる場合、テストを書くのが難しいですね

https://qiita.com/koyo-miyamura/items/9f224a3e56ea75939dca#%E7%AC%AC-8-%E5%95%8F--abc-085-c---otoshidama-300-%E7%82%B9

## 回答１

```elixir
defmodule Main do
  def main do
    :stdio
    |> IO.read(:all)
    |> solve()
    |> IO.puts()
  end

  defp split_words(words) do
    String.split(words, " ")
  end

  def solve(input) do
    [n, y] =
      input
      |> String.trim()
      |> split_words()
      |> Enum.map(&String.to_integer/1)

    t = div(y, 1000)

    for num_10000 <- 0..n,
        num_5000 <- 0..(n - num_10000),
        num_1000 = n - num_10000 - num_5000,
        num_10000 * 10 + num_5000 * 5 + num_1000 == t do
      "#{num_10000} #{num_5000} #{num_1000}"
    end
    |> Enum.at(0, "-1 -1 -1")
  end
end
```

ほぼ @torifukukaiou　さんの後追いになりました

https://qiita.com/torifukukaiou/items/2a17b1cb850cde75f664#%E5%95%8F%E9%A1%8Cc---otoshidama

合計を予め 1000 で割っておいたくらいですね

実行時間は 408 ms でした

## まとめ

これ以外のパターンが思い浮かびませんでした
SERAイベントに参加してきて

# 前提
6/16(金曜)、品川でseraのイベントが行われたのでオフラインで参加してきました。
ここではシステムオブシステムズに関連する内容や、サステナビリティについても言及されていたので共有いたします。

# 代表理事 内田さん「MBSE for A-SPICEについて」
ここではSysMLなどをもちいての簡単な説明がされました。
すでに既知の内容が多くあまり新たな発見はありませんでしたが、
読んだことある書籍にも出ていたものと重複またはリンクしていたもので印象深いものをここに残します。

### ミスユースケース
端的に言うと悪意を持ったアクターが対象システムに対して良からぬことをするユースケース。
この考察がなされていないと、頻繁に不測の事態が多発するシステムが出来上がってしまい、
ユーザーから信用されず使われないシステムが完成してしまう。
結果的に莫大なコストかけて作ったのに使われず、初期投資コスト回収できずという事態に。

## STAMP/STPA
あるユースケースに対して、特に何のリスク対策をしないと前述のミスユースケースに繋がってしまう。
そのため最悪の事態が起こっていないという前提での通常のユースケースに加えて、
各ユースケースに対して最悪の状況が起きているという状況を前提としたミスユースケース
を考察したうえで、
その中で影響度や考えられる発生頻度、法的に必ず満たさなくてはいけないという要因などから
優先順位付けが高いものに関してはSTAMP/STPA用いてリスク軽減・回避の非機能シナリオを考察する。

【主張】
個人的にはコスト軽減のため、優先順位付けが中くらいのものに関しては、
わざわざSTAMPを用いずとも、ラフスケッチなどを通してのリスク軽減分析で充分と考えている。
特に重要なリスクに対してと、中くらいのリスクに対して、まんべんなくリスク軽減ではなく、
重みづけをした上でのリスク軽減の注力の度合いの分配を顧客との対話なども通して上で行うことが重要であると考えている。

## ステートマシン図
【事実】
ステートマシン図は、対象システム全体にどのような種類の状態があるのか？
そして状態の移り変わりが俯瞰して読み解けるため、描くことを推奨されていた。

【主張】
これは神崎さんの要件定義フレームワークRDRAでも必ず描いていたので、
システムオブシステムズでも定義すべきだと改めて感じた。
RDRAでは対象システムの理解向上にステートマシン図が一躍買っていた。
同時にDADCのフレームワークには、状態図がなかったのでこれは先方にお伝えすべき内容と感じた。
もしも小坂さんたちが問題ないよっていうのであれば、次回の対面時にそれとなしに
「状態図はこういう理由からあった方がいいですよ」とお伝えしてみようと思っています。

# 鷲崎さん「DX時代の IoT・ AI・サステナブル・ソフトウェアエンジニアリング  ならびにリカレント教育 – スマートエスイー」
これからはシステムは連携するのが当たり前な時代のため、
セキュリティは第一級品質として当たり前なものになっている。
もともとは品質の１つであったが、必ずマストなため他の品質とは別扱いに変わっている。
(恐らくUAFでセキュリティビューがあるのはこれが理由)

アジャイルセキュリティプラクティスなるものもあり、
多くのIoTでは、【相互運用性】【セキュリティ】【保守性】をメインに扱う。

また動的な品質に関しては、積極的にAIを使用する。
[機械学習システムのためのメタモルフィックテスティング入門 - Qiita](https://qiita.com/tokumoto/items/cd3d17cae3b099badaf6)

## サステナビリティ
省エネ化には２種類あると述べられていた。
①ソフトウェア自体のの省エネ化
これは横断的関心事のように存在するため、アスペクト指向を用いて
低消費電力系のものをあとから差し込む形を取って実現する。

②ソフトウェア開発の省エネ化
リソースの再利用や自動生成等による開発作業の効率化と利用電力の削減。
ただし、最初から効率化を重視すると他の品質の多くが犠牲になることが品質パターンからわかっているため、
ここは電力削減と実現したいソフトウェアの特性とのトレードオフ分析が常に求められる。


# 萩本さん「SE4BSの価値駆動開発プロセスについて」
理論とかというよりも直感的で感覚で作成したフレームワークだと述べられている。
匠メソッドでは知情意という３つの観点が大切にされているが、
意をいきなり意識して始めると視野狭窄になりやすいため情から始めるのがオススメとのこと。
[3\. 価値駆動開発の基本 - SE4BS](https://se4bs.com/sites/foundation/)

このあとは匠メソッドの主要なモデルの解説に入ったので、その中で特に印象的だったものをここに残す。

## 価値デザインモデル
このモデルでは、自分たちのプロジェクトの強みを定義するのだが、この中でストーリーという項目がある。
ここでは、AsIsからToBeまでの道のりの説明を書き、これがプロジェクト境界になってくる。
このスコープの中で詳細化していくので、このスコープの中か外かが無関係な実現要素化を決める判断軸となる。
また、価値はストーリー形式で書くのが１番他人も分かりやすい。
どのような人がどんな時に、どういう手段によってどう嬉しいのか？というスタイルで記載する。

# 気づき
システムオブシステムズの案件に入っているからそこに関心が主に行きがちであったが、
特に意識したいと思ったポイントとして、レイヤーのレベルに応じてステークホルダーの粒度も変わってくることに気づいた。
<img width="400" alt="KIMG0887 (1).JPG (146.3 kB)" src="https://img.esa.io/uploads/production/attachments/5827/2023/06/19/135213/d2aa547c-79eb-48ef-9087-dfc9bbd5e384.JPG">
上図を参考。

個人のレイヤーは１つ１つのリソース、つまり人含めた１つのシステムのレイヤー。
そこから上は下のレイヤーを１つのシステムと見立てた際のＳｏＳのレイヤーという関係になっている。
１番下の個人のレイヤーでは、どんな人に対しての価値なのか？という
より具体的な粒度のステークホルダーであるが、チームのレイヤーからはどんな人にとって価値があるのか？
という粒度は、あまりにも細かすぎる。
どんなチームに対しての価値なのか？という基準の粒度でステークホルダを出すべきである。
同様にして、企業のレイヤーではどんな企業に対しての価値なのか？という
この企業レベルの粒度のものがステークホルダとなり、
業界レイヤーでのステークホルダ分析では、どんな企業に対しての価値か？というのは
細かすぎるためどのような業界の人々に対する価値なのか？というステークホルダ粒度で定義することが求められる。
Javaで画像上にテキストを描画する方法

こんにちは、みなさん。今日はJavaで画像上にテキストを描画する方法をみなさんにご紹介します。プログラミング初心者の方でも、この記事を読んでいただくことで、具体的なコードを使って、画像上にテキストを挿入することが可能になるでしょう。

# 1. 必要なファイルの読み込み

まず、フォントと背景画像を読み込むためのコードを書きます。以下のように`Font.createFont()`と`ImageIO.read()`を使用します。

```java
var font = Font.createFont(Font.TRUETYPE_FONT, Main.class.getResourceAsStream("/IBMPlexSansJP-Text.ttf"));
font = font.deriveFont(50f);
final var originalImg = ImageIO.read(Main.class.getResourceAsStream("/background.png"));
```

# 2. 画像のリサイズ

画像を特定のサイズにリサイズします。アスペクト比を保ちつつ、新しいBufferedImageオブジェクトを作成し、そこに元の画像を描画します。

```java
final var width = 1024;
final var height = (int) (((double) width / (double) originalImg.getWidth()) * originalImg.getHeight());
final var img = new BufferedImage(width, height, originalImg.getType());
final var g2dResized = img.createGraphics();
g2dResized.drawImage(originalImg, 0, 0, width, height, null);
g2dResized.dispose();
```

# 3. テキストの準備と配置

テキストを作成し、それを画像上に描画します。ここではテキストを中心に配置する方法を解説します。テキストの配置は、全体の高さ（行数 x 行の高さ）を元に計算し、それを画像の高さの半分から引くことで実現します。

```java
final var g2d = img.createGraphics();
g2d.setFont(font);
g2d.setColor(Color.BLACK);

final var originalText = "こんにちは、世界！あいうえおかきくけこさしすせそたちつてと";
final var text = Main.insertNewlines(originalText, 12); // 12 characters per line
final var x = img.getWidth() / 2;
final var numLines = text.split("\n").length;
var y = img.getHeight() / 2 - (numLines * lineHeight) / 2 + fm.getAscent();

for (final String line : text.split("\n")) {
    final var textWidth = fm.stringWidth(line);
    g2d.drawString(line, x - textWidth / 2, y);
    y += lineHeight;
}

g2d.dispose();
```

# 4. 最終的な画像の生成

最後に、BufferedImageを`ImageIO.write()`を使用して出力ファイルに書き込みます。

```java
ImageIO.write(img, "jpg", new File("output.jpg"));
```

以上の手順により、Javaで画像上にテキストを描画することができます。このコードを活用し、自分だけのオリジナル画像を生成してみてください。新たな発見があるかもしれませんよ！

# 5. 改行文字の挿入

テキストを適切にフォーマットするためには、適切な位置で改行を挿入することが必要です。このプログラムでは、`insertNewlines()`メソッドを使用して、12文字ごとに改行を挿入しています。

```java
public static String insertNewlines(final String original, final int charsPerLine) {
    final var sb = new StringBuilder();
    var start = 0;
    while (start < original.length()) {
        final var end = Math.min(start + charsPerLine, original.length());
        sb.append(original, start, end);
        if (end < original.length()) {
            sb.append("\n");
        }
        start = end;
    }
    return sb.toString();
}
```

以上、Javaを使って画像上にテキストを描画する方法についてご紹介しました。この方法を使えば、自分だけの画像にテキストを追加し、オリジナルのビジュアルコンテンツを作成することが可能になります。

こちらで作ったソースコードはこちらにアップしておきます。

https://github.com/blue-islands/edit-picture-java

それでは、みなさんもぜひ挑戦してみてください。楽しいプログラミングライフを！
【Unity】Prefab VariantのParentを差し替える、BasePrefabの継承を挿入する（親プレハブをXに置換し、A→Bの継承をA→X→Bにする）

# 概要

たびたび話題に上がっているこの問題。
<a href="https://forum.unity.com/threads/change-base-of-prefab-variant.635119/">Change base of prefab variant.(Forum)</a>

Unityは2022.2で神アプデが入りました。
<a href="https://blog.unity.com/ja/engine-platform/prefabs-whats-new-2022-2">Unity 2022.2 のプレハブ関連の新機能</a>

でも、公式のドキュメントはわかりにくく、PrefabVariantのParentをインスペクターから差し替えようとすると一見グレーアウトされててParentを変更するのは無理に見えます。でもできます。
![GrayOut.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272076/3d5b79c1-4ae9-9cbc-9a43-58cc246844bf.png)

# やり方

HogeA → HogeA Variant B
を
HogeA → HogeA Variant X → HogeA Variant B

に差し替えるとします。
HogeA Variant BはHogeにRigidBodyコンポーネントを追加したものとします。

以下の手順で差し替えが可能です。

①HogeA Variant Xを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272076/575b7440-5286-dce8-7f8f-97654cbf4938.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272076/e2fb1339-2125-2ff1-5db1-8781cdc2de43.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272076/03de77c0-871f-a961-7f3d-7812368a3ae2.png)

②親を差し替えたいHogeA Variant Bをシーンに配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272076/43a15799-7114-61a3-6469-c40a117a069d.png)

③一度Unpackします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272076/a193d36c-d22e-7a97-c460-bef657819d80.png)

④継承元をHogeA Variant Xに差し替えます。このとき「Replace and Keep Overrides」を選択します。これにより、アタッチされているRigidBodyコンポーネントは残ります。
![Switch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272076/00fce9ef-0be0-4ca2-f00c-489dd5e3fb98.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272076/36b41bad-e360-c6d1-6acc-a7ce43811f4d.png)

④（補足）
もしくは、Hierarchy上でゲームオブジェクトHogeA Variant Bを右クリックし、Prefab→ReconnectPrefabでもいけます。UnpackしてPrefabでなくなった対象にも使える手法であるため、こちらのほうが確実かもしれません。

⑤シーンビューのHogeA Variant XをProjectViewのHogeA Variant Bにドラッグアンドドロップで上書きします。警告が出ますがReplace Anyway→Prefab Variantを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272076/3a5186bc-882c-c6ef-6547-b58f4b93e6e4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272076/9d727386-60d4-346c-ff7d-b952305a50bf.png)

⑥完了です。HogeA Variant Bの親がHogeA Variant Xになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272076/73ed96b4-79b1-2bf3-2ce6-7718efde0929.png)
macOSターミナル起動時の「command not found: complete」解決方法

# 環境
- macOS Ventura 13.4.1 (Intel)
- シェルはデフォルトのzsh

# 現象
ターミナル起動時に「command not found: complete」というエラーメッセージが出ます。

```shell:ターミナル
Last login: Tue Jun 27 17:40:39 on ttys003
/Users/xxxxx/.zshrc:29: command not found: complete
$ 
```

# 解決方法
~/.zshrcに次の記述を追加します。

```shell:~/.zshrc
autoload -Uz compinit && compinit
autoload -U +X bashcompinit && bashcompinit
```

# 参考URL
https://superuser.com/questions/1714374/command-not-found-complete-message-appears-every-time-i-open-the-terminal#:~:text=If%20you%20are%20mac%20user%20using.zsh%20just%20add,for%20more%20info%20refer%20to%20link%20%3A%20https%3A%2F%2Fgithub.com%2Feddiezane%2Flunchy%2Fissues%2F57
東京都の私立大学に在籍する障害者はどれだけ支援を受けられるか

# 東京都の私立大学に在籍する障害者はどれだけ支援を受けられるか

## 法的整備
- 2016/04/01施行の[障害者差別解消法](http://www8.cao.go.jp/shougai/suishin/law_h25-65.html)では、事業者に対しては「努力義務」に留めているが、
- 2018/10/01施行の[東京都の差別解消条例](http://www.fukushihoken.metro.tokyo.jp/shougai/shougai_shisaku/sabetsukaisho_yougo/kaisyoujourei/sabetsu_kaisho_jourei.html)では、事業者に対して「義務」とされている

## 事業者とは?
「東京都の差別解消条例」の第二条の二で「事業者」を定義。</div>

> 事業者 法第二条第七号に規定する事業者のうち、
> 都の区域内において商業その他の事業を行う者をいう

「法第二条第七号」は、「障害者差別解消法」の次の規定を指す。

> 事業者　商業その他の事業を行う者（国、独立行政法人等、地方公共団体及び地方独立行政法人を除く。）をいう。

この事業者に「学校法人」（私立大学など）も含まれるようである。

## 補助金は?
[日本学生支援機構](https://www.jasso.go.jp/gakusei/tokubetsu_shien/guide_kyouzai/guide/kyotsu/kyotsu_hojokin.html)に、次の記事がある。

> 障害のある学生を受け入れる大学等を対象に、
経常的経費に対する補助として日本私立学校振興・共済事業団が交付する私立大学等経常費補助金の一般補助において、
次により算定される額を加算しています。＜平成25年度＞

>｛（障害のある学生の数×1,600千円）＋（障害のある学生に対する具体的配慮の取組数×400千円）｝×5/10×増減率（定員充足率等の状況により学部等ごとに131%～1％）

> ※ 予算額との兼合いから、算定結果に一律の圧縮率を乗じることがあります。
※ 参考：「私立大学等経常費補助金取扱要領・配分基準」

確認してみると、確かに、[私立大学等経常費補助金](https://www.shigaku.go.jp/s_haibunkijun.htm)の「平成29年度 取扱要領・配分基準」の45ページに数字がある。

## 合理的配慮をどう勝ち取れるか?

合理的配慮の合意形成のプロセスが、最終的な砦となる。

合理的配慮は「負担が重すぎない範囲」で対応するわけで、何をもって「負担が重すぎないのか」という合意形成が必要となる。

内閣府の「[合理的配慮提供における合意形成プロセス](http://www8.cao.go.jp/shougai/suishin/tyosa/h27kokusai/h3_3_5.html)」に少し記事があるが、日本におけるプロセスについてはわかってないが、「[相談窓口](http://www8.cao.go.jp/shougai/suishin/sabekai.html)」はある。使ったことがある方、いらっしゃるのだろうか？

最終的には、私立大学における日本学生支援機構の「**補助金の使われ方**」がキーになると思うのだが、障害者はどこまで知る（開示請求）ことができるのだろうか？
[Chrome拡張]　ポップアップメニューを表示する方法

Chromeブラウザのツールバーにあるアイコンをクリックし、
ポップアップメニューを表示する方法をご紹介します。

:::note info
新しく作成したchrome拡張を公開しました。
そこで使用した技術を備忘録として共有できればと思い、記事を書いています。
[こちらがそのChrome拡張の記事です。ご興味があれば](https://qiita.com/doran/items/8c3ca80de3f149dce0e0)

[こちらは別のChrome拡張の記事です。合わせてどうぞ](https://qiita.com/doran/items/6613ea2d92b330bae2c9)
:::

#### 用意するファイル
```
root/
 　├ manifest.json
 　├ popup.html
 　└ img/
 　　  ├ icon32.png
  　　 └ icon48.png
```
#### popup.html
Chromeブラウザのツールバーに表示されるアイコンをクリックしたときに呼び出されるHTMLを用意します。
ポップアップのサイズは、そのコンテンツに合わせ自動的に調整されます。
サイズを指定する場合、最小が25x25、最大が800x600まで指定できます。
```html
<!DOCTYPE HTML>
<html lang="ja">
  <head>
    <meta charset="utf-8" />
  </head>
  <body style="min-width: 160px;">
    <p>ポップアップメニューテスト</p>
    <button id="btn1">ボタン1</button>
    <button id="btn2">ボタン2</button>
  </body>
</html>
```
#### manifest.json
***action*** - ***default_popup***にポップアップメニューのHTMLを指定します。
```json
{
  "name": "ポップアップメニュー表示テスト",
  "version": "1.00",
  "description": "ポップアップメニュー表示テスト",
  "action": {
    "default_icon": {
      "32": "images/icon32.png"
    },
    "default_popup": "popup.html"
  },
  "icons": {
    "48": "images/icon48.png"
  },
  "manifest_version": 3
}
```
#### 実行結果
ツールバーのアイコンをクリックすると。。。
![スクリーンショット 2023-06-20 9.20.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/25007cc4-d0a4-c7c0-e8bc-9f5cebd2ef7b.png)
ポップアップメニューが表示されます。
![スクリーンショット 2023-06-20 9.20.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/53270c8f-4be8-9542-63e5-9581e0c0c325.png)
おしまい。
#### その他のChrome拡張の実装方法
以下はこれまでに投稿したChrome拡張の記事です。用途に応じてご覧ください。
[[Chrome拡張]　ツールバーのアイコンをクリックしてHTMLページを表示する方法](https://qiita.com/doran/items/743f687eb413c41432e1)
[[Chrome拡張]　Chrome拡張メニューからページを操作する方法](https://qiita.com/doran/items/9203789b570632e2456e)
[[Chrome拡張]　Webページ(content scripts)からChrome拡張画面へメッセージを送る方法](https://qiita.com/doran/items/faf21f816b168606cfbe)
[[Chrome拡張]　Chrome拡張画面でタイマー(定期実行処理)を使用する方法](https://qiita.com/doran/items/c2c5c225691fd423b2e6)
[[Chrome拡張]　Content Scriptsでタイマー(定期実行処理)を使用する方法](https://qiita.com/doran/items/2620b2c8f2ac2c5548b6)
[[Chrome拡張]　Chrome拡張メニューからWebページを操作する方法](https://qiita.com/doran/items/8045701ba688f50d6295)
[[Chrome拡張]　Chrome拡張メニューからWebページを操作する方法(jQueryを使う)](https://qiita.com/doran/items/817432932bf77c781002)
[[Chrome拡張]　Chrome拡張メニューとWebページでやりとりする方法](https://qiita.com/doran/items/7ccf10bb310ab46478d4)
[[Chrome拡張]　Chrome拡張メニューとWebページでやりとりする方法(Content Scriptsを使う)](https://qiita.com/doran/items/e69ba19cbd2f5049bc97)
[[Chrome拡張]　Chrome拡張メニューから開いていないWebページの情報を取得する方法](https://qiita.com/doran/items/c2d3249c53b97ddeed0d)
[[Chrome拡張]　ポップアップメニューを表示する方法](https://qiita.com/doran/items/6684c939c5dc2b9d091a)
[[Chrome拡張]　ポップアップメニューからWebページを操作する方法](https://qiita.com/doran/items/c34be1c03353a02cd04f)
[[Chrome拡張]　ポップアップメニューからWebページを操作する方法(jQueryを使う)](https://qiita.com/doran/items/6b7181e369cd1be7dfc4)
[[Chrome拡張]　ポップアップメニューからWebページを操作する方法(スタイル変更)](https://qiita.com/doran/items/00ea4f88862031811ed4)
[[Chrome拡張]　ストレージ(chrome.storage.local)を利用する方法](https://qiita.com/doran/items/38a89bcaf4b89c758725)
[[Chrome拡張]　オプションページを表示する方法](https://qiita.com/doran/items/8154f96c200b73bb9e38)
Unityについての理解を深める(スクリプトの基本)

# はじめに
自分はUnityを独学で勉強して少ししか開発をしていなかった時期も含めてもうすぐ3年が経とうとしている大学院生です
最初はとりあえずゲームが作れれば大丈夫という認識でいたのですが、最近ちゃんといろんなことを理解しないといけないなと思いこういう記事を書いています。


今回は以下の順に説明していきます
* Unityとは
* usingとは
* Monobehaviourとは

# Unityとは

ここでは細かい説明は省きますが、簡単に説明するとゲームを開発するプラットフォームです。
2Dゲームや3Dゲームを作ることができ、世の中のゲームもUnityを使用しているのは少なくないと聞きます。
ほかの記事で紹介しているUnreal Engineもゲームを開発するプラットフォームになりますが、そちらよりも学習をしやすいということで一般的にはUnityを使ってゲームを開発する人が多いです（自分が聞いただけなので本当かどうかはわかりません...）。


# usingとは

Unityでゲームを作る際に基本的に必要になってくるものとしてスクリプトがあります。これは別になくても大丈夫ですが、リアルタイムでキャラクターを動かしたりする場合は必要になります。
そのスクリプトの最初に書かれているのがusingになります。


![スクリーンショット 2023-06-28 063549.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/357a934a-53b2-0d43-1a41-d90ef6d94d30.png)


で、このusingが何なのかというとusingの後に続く機能群を使えるようにしますよということなんですね。
この行をusingディレクティブといいます。
何を言っているんだと思われるかもしれませんので下の記事も一緒に確認しながら見てもらえればと思います。

https://qiita.com/JunShimura/items/3c2e23bb77cc9085bfda

pythonを使っている人はimportを思い浮かべてみると少し理解しやすいかもしれません。（完全に一緒とは言いませんが）
今後はusingをインポート、その右に書かれているのをインポートされる側と呼んでいきます。


次にインポートされる側ですが、こちらはNameSpace（名前空間）と呼ばれます。先ほどの画像の "System.Collecrions" や "UnityEngine"ですね。


# Monobehaviourとは

Monobehaviourはコンポーネントの基底クラスになります。
簡単に説明するとこれがないとオブジェクトを動かしたりすることができなくなるということですね。

Unityエンジニアは基本的にこのMonobehaviourで処理を書いたり、ここから派生クラスを作成してオブジェクトに動きなどを追加していきます

ただ、ロジックのみを書いたりする場合にはMonobehaviourを使用する必要がなかったりします。前回自分が業務委託をしていた会社では基本的にMonobehaviourを使っておらず理解するのに必死でした...
【Snowflake Summit 2023】セッションレポート：Data Quality and Pipeline Reliability at Scale: Intro to Data Reliability Engineering (DRE)

Snowflake Summit 2023で聞いてきた内容をまとめていきます。
今回聞いてきたのはSREの考え方をデータパイプラインの構築やデータの信頼性の保証にも活用しよう！というお話です。

# データ信頼性エンジニアリング

データ信頼性エンジニアリング（Data Reliability Engineering、DRE）は、サイト信頼性エンジニアリング（Site Reliability Engineering、SRE）の原則をデータ品質監視に適用する手法です。DREの目的は、ビジネス運営と意思決定に重要なデータパイプラインの信頼性を確保することです。

## データ信頼性エンジニアリングの原則

SREの7つの原則は、データ品質監視にも適用できます：

1. **リスクを受け入れる**: システムの一部である失敗を受け入れ、その影響を最小化するように作業します。
2. **基準を設定する**: データの品質と信頼性に対する明確な期待値を設定します。
3. **単調な作業を減らす**: 自動化によって手動の作業を最小限に抑えます。
4. **すべてを監視する**: データパイプラインのすべての側面を注意深く監視します。
5. **自動化を利用する**: パイプラインを可能な限り自動化することで、人間のエラーのリスクを減らし、効率を向上させます。
6. **リリースを制御する**: データパイプラインへの変更を慎重に管理して新たな問題の導入を避けます。
7. **シンプルさを好む**: エラーの可能性を減らし、メンテナンスを容易にするために、システムを可能な限りシンプルに保ちます。

## 具体事例

DREの具体的な事例として複数の企業の活動を例示しています。

- **Intuit**: Circuit Breakerパターンをデータ品質監視にも活用していくお話です
- **Airbnb**: Airbnb内で運用されている信頼できるデータを提供するためのデータの認証プロセスであるMidasについて
- **Uber**: Uber社内で運用されているデータ品質の問題を監視し、自動的に検出し、対処するための一元化されたデータ品質プラットフォーム（UDQ）について


## DRE（データ信頼性エンジニアリング）を行うメリット
最後にDREを行っていくことで得られるメリットについての話がありました。

**信頼性の高いパイプラインを構築することによってメンテナンスコストが軽減される**: 信頼性の高いデータパイプラインを構築すると、そのメンテナンス作業が大幅に減少します。これにより、他の重要なタスクにリソースを集中することが可能になります。

**データプロダクトの影響力を高める**: データの品質と信頼性を保証することで、データ製品の価値と影響力が向上します。これにより、組織全体の意思決定におけるデータの役割が強化されます。

**明確な所有権、問題解決の迅速化**: DREによってデータパイプラインの所有権が明確になり、問題が発生した場合の対応が迅速になります。これにより、問題の早期解決とダウンタイムの最小化が可能になります。

**信頼性の向上＝投資の増加**: データの信頼性が高まると、そのデータへの信頼も高まります。これにより、データプロジェクトへの追加投資が期待できます。これは、データがビジネス上の意思決定や戦略的方向性を導く重要な資源であると認識されているためです。
Vis.Jsでハマったこと(REACT)

https://qiita.com/EasyCording/items/3643c482b29c87841207

# 自分の個人プロジェクト
・ネットワークグラフを書くところまでは完成している　https://create-react-app-yamap-y6hp.vercel.app/
・今回はグラフにＵＩを付けるところを実装

# ハマったこと
・今もハマり続けている
・最終的にはライブラリ自体が原因であった

# 解決方法
・```react-vis-graph```　→　ダメ（丸１週間悩む）
・```react-vis-graph-wrapper```　→　５秒で解決

# 課題感
・CHATGPTでは解決できず
・Googleで粘って検索　→　やはり、ここは重要

# 詳細
・グラフコンポーネントに与えるgraph引数が、ライブラリの中でID重複のエラーが発生する
```A duplicate id was found in the parameter array. at n.value (data-set.ts:259:1)```


ソース
```graph.js
import React, { useState, useEffect } from "react";
import VisGraph, {
  GraphData,
  GraphEvents,
  Options,
} from 'react-vis-graph-wrapper';

import options from '../options';

const GraphPage = (props) => {
  const events = {};

  const filteredNodes = props.data.nodes.filter((node) => node.isOn);

  // Check for duplicate node IDs
  const nodeIds = new Set();
  const uniqueNodes = [];
  filteredNodes.forEach((node) => {
    if (!nodeIds.has(node.id)) {
      nodeIds.add(node.id);
      uniqueNodes.push(node);
    }
  });

  // Remove edges.id from the filteredEdges array
  const filteredEdges = props.data.edges.filter((edge) => {
    return (
      uniqueNodes.find((node) => node.id === edge.from) !== undefined &&
      uniqueNodes.find((node) => node.id === edge.to) !== undefined
    );
  });

  return (
    <VisGraph
      graph={{ nodes: uniqueNodes, edges: filteredEdges }}
      options={options}
      events={events}
    />
  );
};

export default GraphPage;
```

# 不具合レポート

issueに上がっているが、解決せず
https://github.com/crubier/react-graph-vis/issues/150

神様登場　→　どこかに深いissue有とコメントに書かれている
```This package is a complete rewrite of react-graph-vis started by ZachHaber in this gist mentioned somewhere deep in issues.```

https://github.com/Wokstym/react-vis-graph-wrapper
Backtesting.py を使って FX の勝てる手法を探してみた (2)

「[Backtesting.py を使って FX の勝てる手法を探してみた (1)]」では、エントリーポイント（Trigger）のみを使って勝てる手法を調査しました。

評価が高かったエントリーポイント（Trigger）は以下の四つです。

* Mav004 (4H)
* Mav005 (4H)
* Bko000 (1H, 30min, 15min)
* Bbd000 (1H, 30min, 15min)

手法の意味は「[Backtesting.pyを使ってFXの手法を実装してみた]」を参照願います。

今回は、上記勝てるエントリーポイント（Trigger）に環境認識（Trigger）をプラスして、より勝てる組合せを調査していきいたいと思います。エントリーポイントは３つの時間足で評価が高かった Bko000 と Bbd000 のみとし、1H/30min/15min足で調査します。

# バックテスト条件

1. エントリーポイント（Trigger）は Bko000 と Bbd000 のみとし、それぞれに対し、すべての環境認識を組み合わせてバックテストする。
1. 取引時間はロンドン市場の9時から17時のみとする。
1. 利確ポイントは50pips固定とする、
1. 損切りポイントは50pips固定とする。
1. 通貨ペアは USDJPY だけとする。
1. 時間軸は 1h, 30min, 15min とする。

# バックテスト結果

各時間軸ごとに「Profit Factor が高い手法ベスト5」と「SQNが高いベスト5」を抽出しました。

バックテストの評価基準項目や結果の表における手法の列については「[Backtesting.py を使って FX の勝てる手法を探してみた (1)]」を参照願います。

以下が「Profit Factor が高い手法ベスト5」です。赤枠については自身の評価が高い手法です。詳細は追って説明します。
![バックテスト結果 Profit Factor ベスト5](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100918/178d7c0c-01ec-deb5-2254-cfd3607c0b6c.png)

以下が「SQN が高い手法ベスト5」です。
![バックテスト結果 SQN ベスト5](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100918/c90da3e8-71bd-361a-8420-9d1231edfe4b.png)

# 評価

「Profit Factor が高い手法ベスト5」および「SQN  が高い手法ベスト5」の中から自身がオススメする手法を各時間軸ごと二つずつ選出しました。

Profit Factorが高く、トレード回数が極端に少なくないというのが高評価の基準です。

| 時間軸 | setup | trigger | Trades | Win Rate | Profit Factor | SQN |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 1H | Mov002 | Bko000 | 1931 | 54,2 | 1.20 | 3.33 |
| 1H | Bbd002 | Bbd000 | 558 | 54.7 | 1.30 | 2.79 |
| 30min | Adx002 | Bko000 | 5653 | 51.2 | 1.10 | 3.07 |
| 30min | Sar000 | Bbd000 | 5648 | 51.4 | 1.10 | 2.96 |
| 15min | Mav000 | Bbd000 | 6184 | 51.2 | 1.10 | 3.54 |
| 15min | Adx005 | Bko000 | 7574 | 50.9 | 1.10 | 3.54 |

Profit Factor が最大 1.30 とあまり高くなのですが、強い環境認識とエントリーポイントの組合せが抽出できたいことは今回の調査の成果だと思っています。

今後は、利確や損切りの手法を変化させたり、他の通貨での調査を実施していきたいと考えています。

[Backtesting.py を使って FX の手法を実装してみた]: https://qiita.com/naninuneter55/private/665c46d8ccb700ce08cb

[Backtesting.py を使って FX の勝てる手法を探してみた (1)]:https://qiita.com/naninuneter55/private/4877dcd162c8656f2223