OmniAICreator/Qiita-1.07M huggingface dataset:
統計検定ワークブック 5章補足

# 離散一様分布
https://qiita.com/fujiwara-san/items/49ca0cd39cd310f4d6d3#%E9%9B%A2%E6%95%A3%E4%B8%80%E6%A7%98%E5%88%86%E5%B8%83
# ベルヌーイ分布
https://qiita.com/fujiwara-san/items/49ca0cd39cd310f4d6d3#%E3%83%99%E3%83%AB%E3%83%8C%E3%83%BC%E3%82%A4%E5%88%86%E5%B8%83
# 二項分布
- 期待値、分散、確率母関数
https://qiita.com/fujiwara-san/items/49ca0cd39cd310f4d6d3#%E4%BA%8C%E9%A0%85%E5%88%86%E5%B8%83
- 積率母関数の性質
独立な確率変数の和のモーメント母関数はそれぞれのモーメント母関数の積となる（ワークブックp10）
- 再生産
https://www.mathwills.com/posts/91
# 超幾何分布
- 期待値と分散の導出
https://avilen.co.jp/personal/knowledge-article/hypergeometric-distribution-derivation/
# ポアソン分布
- 期待値、分散、確率母関数
https://qiita.com/fujiwara-san/items/49ca0cd39cd310f4d6d3#%E3%83%9D%E3%82%A2%E3%82%BD%E3%83%B3%E5%88%86%E5%B8%83
- ポアソン分布と二項分布の関係
https://www.eee.kagoshima-u.ac.jp/~watanabe-lab/misc/%E4%BA%8C%E9%A0%85%E5%88%86%E5%B8%83.pdf
ポアソン分布は「ある期間に平均$\lambda$回起こる現象が、ある期間に$X$回起きる確率の分布」と言い換えらる

# 幾何分布
- 期待値、分散、確率母関数
https://qiita.com/fujiwara-san/items/5769d45b7e3c3ce4f080#%E5%B9%BE%E4%BD%95%E5%88%86%E5%B8%

- 無記憶性
「無記憶性」とは，以前までの結果が後の結果に影響を与えないことを指します。幾何分布は，「コインで初めて表が出るまでにコインを投げる回数」をモデル化したものですが，たとえば，$k$ 回目「裏」だったからと言って，$k+1$ 回目に「表」になる確率が上がるわけではありませんね。それまでの試行は，以降の試行に関係ないわけです

# 負の二項分布
- 期待値、分散、確率母関数
https://qiita.com/fujiwara-san/items/5769d45b7e3c3ce4f080#%E8%B2%A0%E3%81%AE%E4%BA%8C%E9%A0%85%E5%88%86%E5%B8%83

# 多項分布
- 期待値、分散、確率母関数
https://qiita.com/fujiwara-san/items/5769d45b7e3c3ce4f080#%E5%A4%9A%E9%A0%85%E5%88%86%E5%B8%83



# 例題5.1
(1)
発見率pのウイルス検査をn回試行してm個のウイルスが見つかる確率は二項分布に従うので、$P(Y=y) = {}_n C_y(1-p)^yp^{n-y}$
 $P(Y>=1) = 1 -P(Y=0) = 1- (1-p)^n$ 
 
(2)
回答の通り

# 例題5.2
回答の通り

# 例題5.3
(1)
回答より、$E[{X_i}^2] = P(X_i=1)$
$N$人の中から$v$人を無作為抽出するパターンの数は${9}P_4 $となる。このパターン数を全体として、$i$番目が関東出身者であるパターン数を考える。
$i$番目が特定の人（関東出身者人のうちの一人）になるパターン数は$N-1$個から$n-1$個を抽出するパターン数は${N-1} P_{n-1}$

(2)
回答より、$E[X_iX_j] = P(X_i=1, X_j=1)$。
$i \neq j $のとき、(1)の同様の考え方が使える

(3)回答の通り

# 例題5.4
(1)
ポアソン分布の再生産性を用いる
ポアソン分布は平均も分散も$\lambda$
(2)
回答の通り

# 例題5.5
(1)
回答の通り
(2)
回答の通り
[Rails]あ…ありのまま、今起こった事を話すぜ！「おれはorder(created_at: :asc)と実装したと思ったら、created_at descのSQLが実行されていた」

な…　何を言っているのかわからねーと思うが
おれも　何をされたのか　わからなかった…

頭がどうにかなりそうだった…
[reverse_order](https://railsdoc.com/page/model_reverse_order)をチェーンしていただとか超スピードだとか
そんなチャチなもんじゃあ断じてねえ

もっと恐ろしいものの片鱗を味わったぜ…

---

ということで、前置きはここまでにして実際に私が体験した話です。

タイトルの通り`order(created_at: :asc)`と実装したのに、SQLは`created_at desc`と実行される実装について説明します。

ここまでの話だけで、パッと実装が思い浮かぶ方はActiveRecordマスターだと思います…！
私は10年弱Rails触っていますが、初めて気づきましたw

## 実装

わかってしまえば、やり方は簡単です。
Userというモデルがある場合、下記実装では発行されるSQLのorderは逆になります。

```ruby
User.order(created_at: :asc).last
```

```console
> User.order(created_at: :asc).last
User Load (0.6ms)  SELECT `users`.* FROM `users` ORDER BY `users`.`created_at` DESC LIMIT 1
```

実装とSQLでorderが逆になっていますね。

これに初めて気づいたときはとても驚いたのですが、SQLファーストで考えると単純な話で、SQLには最後の値のみを取得する命令がありません。
一方、先頭の値であれば、`limit 1`で取得できます。
そのためSQLで最後尾の値を取得したい場合はorderを逆にして先頭の値のみを取得することでやりたいことが実現できます。

ActiveRecordは実装した通りのSQLを発行するのではなく、全てのチェーンを考慮して効率の良いSQLに変換してくれているのですね。
SQLでは全件取得してRubyの処理で最後の1件だけ返すみたいな非効率なことはしていないようです。

改めてActiveRecordすげーとなりました！

## おまけ1

> SQLでは全件取得してRubyの処理で最後の1件だけ返すみたいな非効率なことはしていないようです。

と書きましたが、最初からこの実装だったのか気になったのでRailsのプルリクエストを探ってみました。

該当のプルリクエストはこちらだと思います。

https://github.com/rails/rails/pull/23377

2016年1月にマージされているので、Rails 5.0.0から、今回紹介した挙動になったと思われます。
それ以前は`last`を使うとSQLでは全件読み込み、Rubyの処理で最後の1件を返却する実装だったようです。

## おまけ2

ActiveRecordでlastを使った場合、指定したorderを逆にするということがわかりました。
全件をメモリにロードするわけではないので非効率ではなさそうですが、最初からorderを逆にしてfirstにしておく方が実装と発行されるSQLが揃うので可読性が上がる気がします。

ActiveRecordでlastを使っている実装を見つけた場合

```
[FYI]
order逆にしてfirstにした方が実装とSQLが揃って可読性が上がります。
lastをした場合、下記のようにRailsが最適化してorderを逆にするため、実装のorderと発行されるSQLのorderが逆になるためです

> User.order(created_at: :asc).last
User Load (0.6ms)  SELECT `users`.* FROM `users` ORDER BY `users`.`created_at` DESC LIMIT 1
```

と指摘できると一目置かれるレビュアーになれるかもしれません！？
パッケージ管理ツールdnfを使ってみた

### 概要
ながらくyumを使っていましたが、ここらで後継といわれるdnfに移行しようかと思い実際に使ってみた。

### 使ってみた
#### コマンドの有無確認
まずはコマンドがインストールされているか確認
```console
// コマンドの有無を確認
[root@marmoset ~]# which dnf
/usr/bin/dnf
```

#### パッケージの更新状況確認
次にパッケージの更新状況を確認
```console
// リポジトリにアップデートがないか確認
[root@marmoset ~]# dnf check-update
```
#### パッケージ更新
差分がわんさか表示されたのでパッケージを更新
```console
// パッケージアップデート
[root@marmoset ~]# dnf update
（更新が終わったので試しにもう一回update）

[root@marmoset ~]# dnf update
Last metadata expiration check: 0:17:43 ago on Wed 03 Jul 2024 07:58:04 AM JST.
Dependencies resolved.
Nothing to do.
Complete!
（ヨシ！）
```
#### 任意のパッケージのインストール状況確認
ウェブサーバーの有無が気になったのでインストール済みのパッケージ一覧を調べる
```console
// パッケージのインストール状況確認
[root@marmoset ~]# dnf list installed | grep httpd
[root@marmoset ~]#
```

#### 任意のパッケージの詳細確認
ないのでパッケージをインストール、とその前にパッケージ情報を確認
```console
// パッケージの詳細確認
[root@marmoset ~]# dnf info httpd
Last metadata expiration check: 0:28:36 ago on Wed 03 Jul 2024 07:58:04 AM JST.
Available Packages
Name         : httpd
Version      : 2.4.57
Release      : 8.el9
Architecture : x86_64
Size         : 45 k
Source       : httpd-2.4.57-8.el9.src.rpm
Repository   : appstream
Summary      : Apache HTTP Server
URL          : https://httpd.apache.org/
License      : ASL 2.0
Description  : The Apache HTTP Server is a powerful, efficient, and extensible
             : web server.
```

#### パッケージインストール
そしてインストール
```console
// パッケージインストール
[root@marmoset ~]# dnf install httpd
（略）
Complete!

// 確認
[root@marmoset ~]# dnf list installed | grep httpd
httpd.x86_64                          2.4.57-8.el9                    @appstream
httpd-core.x86_64                     2.4.57-8.el9                    @appstream
httpd-filesystem.noarch               2.4.57-8.el9                    @appstream
httpd-tools.x86_64                    2.4.57-8.el9                    @appstream
rocky-logos-httpd.noarch              90.15-2.el9                     @appstream
```

#### パッケージ削除
ちなみにパッケージの削除はこんな感じ
```console
[root@marmoset ~]# dnf remove httpd
```
Googleアナリティクスの探索でユーザーエンゲージメントをCSVで書き出したら謎の数字が表示されてるけど何

21分29秒が1289になって何！？ってなったのでメモ

## 結論

秒数っぽい

21分を秒にする→21x60=1260（秒）
29秒を足す→1289（秒）

### フィルタはこれを使う

例えば10秒以上にしたいときはこんな感じで指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13242/e382369e-cbad-8206-55fc-daab784116a8.png)
AWS WAF のカスタムレスポンスで日本語が文字化けする

# 例

普通にHTMLで charset / content / lang 指定をすればOK

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="content-language" content="ja">
<title>タイトル </title>
</head>
<body>
メッセージ
</body>
</html>
```



# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
USDの実践メモ 01 : Xformable なノードの作成

USD の自己学習が進みましたので，私個人の専門分野への応用を念頭におきながら実践編へと移ってまいります。

## Xformable なノードの作成

Xformable なノードが定義されたステージファイルを作成してみます。ステージに /World という名のノードがひとつあるだけのごくシンプルなファイルです。

```Python
from pxr import Usd, UsdGeom

def create_stage():
    stage = Usd.Stage.CreateInMemory()
    return stage

def create_node(stage, path):
    node = UsdGeom.Xform.Define(stage, path)
    return node


if __name__ == '__main__':
    # ステージ作成
    stage = create_stage() 
    
    # ルートノード作成
    rootNode = create_node(stage, '/World')
    
    # USDファイルにエクスポート
    stage.GetRootLayer().Export('./World.usda')
```

上記プログラムを実行すると，USDファイル「World.usda」が無事に生成されます。
念のために，usdchecker に掛けてみましょう。

```bash
$ usdchecker ./World.usda

Stage does not specify an upAxis. (fails 'StageMetadataChecker')
Stage does not specify its linear scale in metersPerUnit. (fails 'StageMetadataChecker')
Stage has missing or invalid defaultPrim. (fails 'StageMetadataChecker')
Failed!
```

警告が 3 つ表示されてしまいました。
「upAxis」と「metersPerUnit」は指定が無くともデフォルト値が入るので，その範囲内で使用する分には問題ないはずですが，正確性を期して指定することにしましょう。「defaultPrim」も同様に明確化しておきます。
修正版は次のようになります。

```Python
from pxr import Usd, UsdGeom

def create_stage():
    stage = Usd.Stage.CreateInMemory()
    UsdGeom.SetStageUpAxis(stage, UsdGeom.Tokens.y)
    UsdGeom.SetStageMetersPerUnit(stage, 0.01)
    return stage

def create_node(stage, path, is_defaultPrim=False):
    node = UsdGeom.Xform.Define(stage, path)
    if is_defaultPrim is True:
        stage.SetDefaultPrim(node.GetPrim())
    return node


if __name__ == '__main__':
    # ステージ作成
    stage = create_stage() 
    
    # ルートノード作成
    rootNode = create_node(stage, '/World', is_defaultPrim=True)
    
    # USDファイルにエクスポート
    stage.GetRootLayer().Export('./World.usda')
```

できあがった USD ファイルは次のようなものです。

```USD
#usda 1.0
(
    defaultPrim = "World"
    metersPerUnit = 0.01
    upAxis = "Y"
)

def Xform "World"
{
}
```

usdchecker を起動すると，こんどは「Success!」となりました。

## まとめ

Python で Xformable なノードが定義されたステージファイルを作成しました。
「defaultPrim」，「metersPerUnit」，「upAxis」は明示しておいた方がよさそうです。

## 参考資料

ft-lab (Yutaka Yoshisaka) さん，あんどうめぐみさん による以下のサイトが理解の助けになりました。

https://github.com/ft-lab/Documents_USD/tree/master?tab=readme-ov-file

https://ft-lab.jp/blog_3dcg/?p=4836

https://fereria.github.io/reincarnation_tech/usd
Azure VMSS の 「均一オーケストレーション」 と 「フレキシブルオーケストレーション」

こんにちは、アーキテクトのやまぱんです。

 Azure VMSS (Virtual Machine Scale Sets) の 「均一オーケストレーション」 と 「フレキシブルオーケストレーション」 について自分用に簡単にまとめます。

間違ってたら<font color="red">**優しく**</font>教えてください！

## VMSS (Virtual Machine Scale Sets) / 仮想マシンスケールセット とは
そもそも VMSS とは 一言でいうと、仮想マシン（VM）のグループを自動的にスケールイン（削減）およびスケールアウト（拡張）することができる機能です。

+ MS Learn - Virtual Machine Scale Sets とは何ですか?

https://learn.microsoft.com/ja-jp/azure/virtual-machine-scale-sets/overview

そのなかでオーケストレーションモードがあり、具体的には **「均一オーケストレーション（Uniform Orchestration) 」** と **「 フレキシブルオーケストレーション（Flexible Orchestration）」** があります。

+ MS Learn - Azure での Virtual Machine Scale Sets のオーケストレーション モード

https://learn.microsoft.com/ja-jp/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-orchestration-modes

## 「均一オーケストレーション」 と 「フレキシブルオーケストレーション」 の比較
簡単な比較表 をつくるとこんな感じです。(2024/07/03 現在)
その他詳細な違いは[MS Learn](https://learn.microsoft.com/ja-jp/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-orchestration-modes#basic-setup) をご覧ください。
Azure VM バックアップ の対応・非対応などいろいろ違いがあります。

| 項目 | 均一オーケストレーション（Uniform Orchestration） | フレキシブルオーケストレーション（Flexible Orchestration） |
|------|-----------------------------------------------|-----------------------------------------------|
| **スケール方法** | 同一のVMモデルを使用 | 異なるVMモデルを使用可能 |
| **アップデート** | [アップグレード ポリシー対応(自動、手動、ローリング)](https://learn.microsoft.com/ja-jp/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-upgrade-policy) | [アップグレード ポリシー対応(自動、手動、ローリング)](https://learn.microsoft.com/ja-jp/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-upgrade-policy) *執筆時時点で[プレビュー](https://learn.microsoft.com/ja-jp/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-set-upgrade-policy?tabs=portal)|
| **VMの異種性** | 全て同一構成 | 異なる構成のVMを混在可能 |
| **カスタムイメージ** | 一つのカスタムイメージのみ使用可能 | 複数のカスタムイメージを使用可能 |
| **可用性セット** | 同じ可用性セット内でのみスケール | 可用性ゾーンを跨いだスケールが可能([執筆時時点でプレビュー](https://azure.microsoft.com/ja-JP/updates/public-preview-azure-vmss-zonal-expansion/)) |
| **負荷分散** | 単一の負荷分散ルールを使用 | 複数の負荷分散ルールをサポート |
| **使用ケース** | シンプルで同質な環境向け | 複雑で異質な環境向け |

## MS Learn 抜粋
+ ゾーンをまたいだ可用性セットについて

https://azure.microsoft.com/ja-JP/updates/public-preview-azure-vmss-zonal-expansion/

https://www.softbanktech.co.jp/special/blog/cloud_blog/2024/0032/
 
https://learn.microsoft.com/ja-jp/azure/virtual-machine-scale-sets/overview
> フレキシブル オーケストレーションでは、リージョン内の障害ドメインまたは可用性ゾーン内で VM を分散することで、(最大 1,000 個の VM まで) 高可用性を保証します。

https://learn.microsoft.com/ja-jp/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-orchestration-modes#high-availability

> 可用性 SLA：障害ドメイン間で分散しているインスタンスの場合は 99.95%。複数のゾーンに分散しているインスタンスの場合は 99.99%。

+ 負荷分散の違いについて
　均一オーケストレーション:
このモードでは、単一の負荷分散ルールが使用されます。すべてのVMは同一の負荷分散設定のもとで動作し、単一のスケールセットに統合された形で管理されます​
 　フレキシブルオーケストレーション:
このモードでは、複数の負荷分散ルールをサポートします。異なる構成のVMを混在させることができ、それぞれ異なる負荷分散設定を適用することが可能です


## その他 参考


+ Azure Virtual Machine Scale Sets (VMSS) の更新方法まとめ

https://qiita.com/nakazax/items/a75d5a26a7e4021ba55e

少し古い記事ですが、大変わかりやすいです。
インターンシップを受け入れる意図と意義

## 弊社のインターンシップについて

弊社では2018年にインターンシップの受け入れを行いました。当時の内容は下記の記事をご覧ください。

https://www.wantedly.com/companies/add-more/post_articles/165227

また、今月から6年ぶりのインターンシップ受け入れを実施することになりました。

:::note info
2024年度のインターンシップ募集は終了しています。
:::

## インターンシップを受け入れる意図

### 短期的なパフォーマンスは重要視しない

募集媒体を運営している会社からは、労働力を期待して募集している企業が多いということを伺いましたが、私達の場合は労働力という観点はそれほど重要視していません。

未経験から入社後すぐにパフォーマンスを出せるような、比較的シンプルな作業は安定して存在しないため、じっくりと腰を据えて長期的な観点で力になって頂ければと考えています。

また、その他にも下記の目的があります。

* よい化学反応を観測したい
* ご縁を育みたい

### よい化学反応を観測したい

https://qiita.com/koji-yamauchi/items/4ba85aa1c86e7b16bae2

> チームにおいて良い変化をもたらす触媒になりたいと考えています。
仕事はよい化学反応を観測できたときにやりがいや楽しさを感じられるものだと思います。
> この化学反応を起こす仲間を探しています。興味のある方はコーポレートサイトまたはWantedlyからご応募ください。

こちらの記事で書いた通り、よい化学反応を観測したいと考えています。

新しいメンバーは組織に新しい風を吹かせてくれると思っています。
経験が浅くても、新しいことにチャレンジする姿、真面目に物事に取り組む姿は、私を含め既存メンバーにとって初心に返り取り組む機会へつながると考えています。

経験の浅さが固定概念に囚われない自由な発想へつながるかもしれませんし、世代を超えた考えが新たな価値の創造のヒントになるかもしれません。


### ご縁を育みたい

世の中はいたるところで人の繋がりがあります。
元同僚や取引先や友人、同級生など色々なところで実は繋がりがあったのだなと驚くことがあります。

弊社でも仕事をご一緒した人からの評判などで新しい出会いがあったり、そういったご縁の一つ一つが大切なものだと考えています。

インターンシップによるご縁が、もしかすると卒業後の入社動機につながったり、もしくは友人へのご紹介につながる可能性、社会人になって数年してから一緒に仕事をするきっかけになるかもしれません。

世代を超えた縁を育む良い機会になればと考えています。
集計表から不要なカテゴリを排除する(SPSS Modeler データ加工逆引き11-16)

# 集計表から不要なカテゴリを排除する

![スクリーンショット 2024-07-01 10.19.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e1d01e58-e866-697d-dd62-e9d50b1ead59.png)

## 1.想定される利用目的

・分類マスタが複雑化し集計表に不要なカテゴリが表示される場合の対処

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/table_extraction.str

## 3.サンプルストリームの説明

![スクリーンショット 2024-07-01 10.19.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d034cd24-b00b-9a65-3657-8c17f747607b.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2024-07-01 10.22.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7ba792da-ff33-0edc-3862-77dd28efaedf.png)


b.　[レコード集計]ノードを編集します。[フィールドにレコード度数を含める]にチェックを入れて[度数]と名称変更しています。
![スクリーンショット 2024-07-01 10.22.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/40df5373-3b05-d6de-f7f3-839388153ce6.png)

c.[ソート]ノードを編集します。
![スクリーンショット 2024-07-01 10.23.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/24995341-1fce-9c72-cbb5-33329b741c75.png)

[デーブル]ノードを実行します。
![スクリーンショット 2024-07-01 10.23.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2daca22e-6159-fb38-c01f-7f627ad30992.png)

[99]と空白のカテゴリを削除します。該当セルをハイライトしたまま[生成]メニューから以下のよう[条件抽出ノード(OR)]を選択します。dが自動生成されます。

![スクリーンショット 2024-07-01 10.24.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9679d783-e332-04c8-876d-95611463c6ea.png)

d.[条件抽出]ノードを編集します。赤枠のように条件を[破棄]します。
![スクリーンショット 2024-07-01 10.24.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a331c548-ecfe-bd1a-d927-907fcadf7a6c.png)

[デーブル]ノードを実行します。
![スクリーンショット 2024-07-01 10.25.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/55599c8a-3313-d3b3-1a11-629b34f48bcc.png)


#### 注意事項

最終集計のみの調整の場合は上記でOKですが、プロセス全体から該当カテゴリを削除する場合にはdを冒頭に組み込みます。

![スクリーンショット 2024-07-01 10.25.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/88f13a41-8d83-c238-663c-6d4b0140ed78.png)

## 4.参考情報

####  空白/空文字レコードを確認して削除/抽出する

https://qiita.com/416nishimaki/items/0269ca0733cfb283646c

####  棒グラフからカテゴリを抽出/排除する

https://qiita.com/416nishimaki/items/ad8d3ffcbcfadfcf50e8

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
IBM i Services Directory : QSYS2.NVMe_Info ビュー　NVMeデバイスの詳細情報検索

NVMeデバイスのステータスを返します。ハードウェアリソース名や容量といった基本情報以外にチップ温度？まで返してくれます。

## 概要
■表名：QSYS2.SYS2.NVME_INFO
■カテゴリ：ストレージサービス
■サポート：IBM i 7.4 SF99704 Level 13, Enhanced: SF99704 Level 15以降
■参照URL（IBM i 7.5）：https://www.ibm.com/docs/ja/i/7.5?topic=services-nvme-info-view

## 使用例
```
SELECT * FROM QSYS2.NVME_INFO;
```

実行例です。ちなみにNVMeを搭載・割当していないIBM i 環境では行が返されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b6380a38-2925-a681-c77a-37672c2f7485.png)

上記では2枚のNVMeが認識されています。
※あれ、英子文字が文字化けしてますね…CCSIDでしょうか。SQLスクリプト実行ジョブのCCSID変更ではならないようです。確認してみます。。

***ファームウェアレベルFIRMWARE_LEVEL***はNVMeのファームレベルでしょうか。
***IOP_NAMEで接続されているIOPパスがわかります***
***ロケーションコードLOCATION_CODEでハードウェアスロットが分かります***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/471d8983-268c-b2a5-8227-e3b3d310bde8.png)

NVMeのストレージ容量などが返されていますね。このシステムのDST(SST)パスワードが分からず、、後ほど確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/8ad54244-7601-473d-12fe-f3d1b9687a02.png)

LIFE_REMAININGがNVMeの耐用寿命推計です。マニュアル記載では
```
実際の使用量とメーカーによる NVMe 寿命の予測に基づく、メーカーによる残りの NVMe デバイス寿命のパーセンテージの見積もり。
```

DEGRADEDというのはNVMeデバイスの信頼性を表示する、との事で、YESは信頼性が低下している状態だそうです・・H/W的な寿命が近いとか、故障でエラーが多発した状態ではYESになるのでしょうか。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e5b9fb04-abce-6d16-a3de-4c969c943330.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/433b37a3-6697-91e3-605c-25beb62a1252.png)
データのREAD回数・WRITE回数、はマニュアルでは、、

```
NVMe デバイスから読み込まれた 512 バイト・データ単位の数。 この値は千単位で報告されます (値 1 は、読み取られた 512 バイトの 1000 単位に相当します)。
この値はリセットされません。 これはデバイスの存続期間中です。
```


POWER_CYCLESはNVMeデバイスがオンオフされた回数＝通常IPL回数と同一でしょうか？また、書き込みエラーなどハードウェアレベルのエラー回数もとれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1c13431c-915c-d9ea-a00f-a8098818cc8e.png)


ほかに、温度関連も細かにデータが取れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/62c13cac-faf5-3828-2d98-75c8abd59b16.png)
React 学び

# 参考
https://ja.react.dev/learn/rendering-lists#keeping-list-items-in-order-with-key

https://ja.react.dev/learn/conditional-rendering#logical-and-operator-

https://ja.react.dev/learn/rendering-lists#displaying-several-dom-nodes-for-each-list-item

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329005/d6712444-bace-cd57-1ec9-9ed2d574e077.png)

https://ja.react.dev/learn/tutorial-tic-tac-toe#lifting-state-up

https://ja.react.dev/learn/thinking-in-react#step-1-break-the-ui-into-a-component-hierarchy

https://de-milestones.com/react-mount-rendering/

https://ja.react.dev/learn/render-and-commit#epilogue-browser-paint

https://react-uncle-blog.netlify.app/blog/eslint-rule-no-nested-ternary

https://ja.react.dev/learn/synchronizing-with-effects#step-3-add-cleanup-if-needed

https://ja.react.dev/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development

https://ja.react.dev/learn/you-might-not-need-an-effect#caching-expensive-calculations

https://ja.react.dev/learn/you-might-not-need-an-effect#caching-expensive-calculations

https://ja.react.dev/learn/removing-effect-dependencies#wrapping-an-event-handler-from-the-props
windowsでiverilog その148

# 概要　
windowsでiverilogやってみた。
verilog見つけたので、やってみた。

# 参考にしたページ

https://qiita.com/Hiroki11x/items/ec8ce716d3117360313f

# サンプルコード

```

module counter(CLK, RST_X, cnt);
	input RST_X, 
	CLK;
	output reg [3:0] cnt;
	always @(posedge CLK)
	begin
		if (!RST_X)
			cnt <= 4'h0;
		else
			cnt <= cnt + 4'h1;
	end
endmodule

module top();
	reg CLK, 
		RST_X;
	wire [3:0] w_cnt;
	counter counter_instance(CLK, RST_X, w_cnt);
	initial 
	begin
		CLK = 0;
		forever #10 CLK = ~CLK;
	end
	initial 
	begin
		RST_X = 0;
		#30 RST_X = 1;
	end
	initial 
	begin
		#500 $finish();
	end
	always @(posedge CLK) 
	begin
		$write("[%t] counter: %b\n", $time, w_cnt);
	end
	initial 
	begin
		$dumpfile("test.vcd");
		$dumpvars(0, counter_instance);
	end
endmodule

```

# 実行結果

```
>vvp a.out
VCD info: dumpfile test.vcd opened for output.
[                  10] counter: xxxx
[                  30] counter: 0000
[                  50] counter: 0001
[                  70] counter: 0010
[                  90] counter: 0011
[                 110] counter: 0100
[                 130] counter: 0101
[                 150] counter: 0110
[                 170] counter: 0111
[                 190] counter: 1000
[                 210] counter: 1001
[                 230] counter: 1010
[                 250] counter: 1011
[                 270] counter: 1100
[                 290] counter: 1101
[                 310] counter: 1110
[                 330] counter: 1111
[                 350] counter: 0000
[                 370] counter: 0001
[                 390] counter: 0010
[                 410] counter: 0011
[                 430] counter: 0100
[                 450] counter: 0101
[                 470] counter: 0110
[                 490] counter: 0111
counter.v:34: $finish called at 500 (1s)
```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/4c24321b-4dfc-338e-4a43-a88513e4816c.png)


以上。
【SQL】すぐに使えるパフォーマンス改善

## はじめに
今までは適切なデータを抽出するクエリの書き方しか視野に入れられませんでしたが、次第にパフォーマンスのことも考慮するようになりました。

複雑なSQL文になればなるほどかなり重要になってくるので、少しでもパフォーマンスが改善できる記載を備忘録として残そうと思います:writing_hand_tone1:

:::note warn
データの内容によってパフォーマンス結果が変わってくるので、すべてに適用されるとは限らないことを予めご承知おきください。
:::

## パフォーマンス改善4選
### 1. SELECT句の"*"
SELECT句は取得したいカラムを指定しますが、"*"はすべてのカラムを取得します。
必要なカラムのみを指定するときとで負荷がだいぶ異なるので、取得したいカラム名のみを記載することをおすすめします。

<details><summary>employeeテーブル</summary>

| id       | name    | busyo     | shikaku   |
|:--------:|:-------:|:---------:|:---------:|
| 1        | A       | 開発部    | あり      |
| 2        | B       | 管理部    | あり      |
| 3        | C       | 営業部    | あり      |
| 4        | D       | 採用部    | あり      |
| 5        | E       | 管理部    | あり      |
| 6        | F       | 営業部    | なし      |

</details>

```非推奨例.sql
SELECT * FROM crane.employee;
```

```推奨例.sql
SELECT busyo FROM crane.employee;
```

### 2. WHERE句の条件指定の順番
WHERE句は取得したい条件を指定しますが、複数条件の場合記載した順に実行されます。
負荷を軽減するには、条件で絞った結果が少なくなる条件を先に記載すると、2つ目以降の条件実行の際にパフォーマンス力が向上します。

資格取得の人数が多い会社のテーブルから資格未保持で絞ってデータを取得するとなると、" shikaku = 'なし' "を先に記載したほうが良いです。
※データの特色によるので、レコード数が多いほど最初に全体を眺めて把握したほうが良いかと思います。

<details><summary>employeeテーブル</summary>

| id       | name    | busyo     | shikaku   |
|:--------:|:-------:|:---------:|:---------:|
| 1        | A       | 開発部    | あり      |
| 2        | B       | 管理部    | あり      |
| 3        | C       | 営業部    | あり      |
| 4        | D       | 採用部    | あり      |
| 5        | E       | 管理部    | あり      |
| 6        | F       | 営業部    | なし      |

</details>

```非推奨例（部署を先に絞り込み）.sql
SELECT * FROM crane.employee
WHERE busyo = '営業部'
AND shikaku = 'なし';
```

```推奨例（資格を先に絞り込み）.sql
SELECT * FROM crane.employee
WHERE shikaku = 'なし'
AND busyo = '営業部';
```

### 3. ORDER BY句のカラム名指定
ORDER BY句はカラムごとに並び順を指定しますが、列番号を指定することも可能です。
しかし、列番号にするとカラムの解読処理が実行されるため、カラム名を指定するほうが良いみたいです。

<details><summary>employeeテーブル</summary>

| id       | name    | busyo     | shikaku   |
|:--------:|:-------:|:---------:|:---------:|
| 1        | A       | 開発部    | あり      |
| 2        | B       | 管理部    | あり      |
| 3        | C       | 営業部    | あり      |
| 4        | D       | 採用部    | あり      |
| 5        | E       | 管理部    | あり      |
| 6        | F       | 営業部    | なし      |

</details>

```非推奨例.sql
SELECT * FROM crane.employee
ORDER BY 3;
```

```推奨例.sql
SELECT * FROM crane.employee
ORDER BY busyo;
```

### 4. テーブルに別名
テーブルに別名をつけSELECT句のカラムに別名を指定すると、カラムがどのテーブルの情報なのか解析する処理を省略できるようです。

<details><summary>employeeテーブル</summary>

| id       | name    | busyo     | shikaku   |
|:--------:|:-------:|:---------:|:---------:|
| 1        | A       | 開発部    | あり      |
| 2        | B       | 管理部    | あり      |
| 3        | C       | 営業部    | あり      |
| 4        | D       | 採用部    | あり      |
| 5        | E       | 管理部    | あり      |
| 6        | F       | 営業部    | なし      |

</details>

```非推奨例.sql
SELECT busyo FROM crane.employee;
```

```推奨例.sql
SELECT E.busyo FROM crane.employee AS E;
```

## 最後に
今回は、SQLのパフォーマンスを向上する記載方法をご紹介いたしました。
大幅に改善できる見込みがある書き方は勉強中なので、今後新たな学びを得られたら記事にしようと思います。

最後までお読みいただき、ありがとうございました:unicorn:
fnm useコマンドで「error: We can't find the necessary environment variables to replace the Node version.」が出るときの対処法

## 概要

https://nodejs.org/en/download/package-manager

Node.jsの公式のインストール手順で「fnm use」を実行したときに

> error: We can't find the necessary environment variables to replace the Node version.

のエラーが出た時の対処法。

## 解決法

https://stackoverflow.com/questions/78606679/unable-to-install-and-use-nodejs-using-fnm

他にもいろいろ提案されている対応策があったが、ここに書いてあることをやれば治った。

`fnm use` コマンドの前に以下のenvの設定を実行する。

`> fnm env --use-on-cd | Out-String | Invoke-Expression`

その後、 `fnm use` 以降を実行することでうまくいく。
Virtual Box でクローン

### 目的
* クローン後のホスト名や固定IP設定などをまとめる
### 前提
* クローン元のホストの名前をmomongaとする
* クローン先のホストの名前をmarmosetとする
* momongaのIPアドレスを 192.168.56.120、marmosetのIPアドレスを 192.168.56.130 とする

### クローンからリモート接続まで
#### クローンする
1. Virtual Box起動
1. momonga を右クリックして「クローン」をクリック
1. 名前に marmoset と入力して「次へ」をクリック
1. 「すべてをクローン」が選択されていることを確認して「完了」をクリック
暫く待つとmarmosetが作成されるので、右クリック→起動→通常起動 でサーバーを起動

#### ホスト名変更
1. VirtualBox のコンソールでrootでログイン（パスワードはmomongaと同じ）
1. ホスト名変更
```console
[root@momonga ~]# hostname
momonga
[root@momonga ~]# hostnamectl set-hostname marmoset
[root@momonga ~]# hostname
marmoset

※ 後でリブートして反映させます
```

#### 固定IP割り振り
nmtui コマンドで設定します。
hostonlyアダプタ（ホスト・ゲスト間の通信）とnatnetworkアダプタの設定をします。
```console
[root@momonga ~]# nmtui
```
(以下UI画面で設定)
Edit a connection を選んで Enter
##### hostonlyアダプタの設定
enp0s8 を選んで Enter
IPv4 CONFIGURATION <Manual>
Address 192.168.56.130/24
Gateway (空欄)
チェック項目は全てチェックなし
[X] Automatically connect 
[X] Available to all users

##### natnetworkアダプタの設定
enp0s3 を選んで Enter
IPv4 CONFIGURATION <Manual>
Address 10.0.2.130/24
Gateway 10.0.2.1
DNS servers 10.0.2.1
チェック項目は全てチェックなし
[X] Automatically connect 
[X] Available to all users

Quit で Enter
再起動
```console
[root@momonga ~]# reboot
```
#### NATネットワークのゲートウェイ確認
nameserver の値が DNS servers で指定した値と同じか確認する（違う場合は修正）
```console
[root@momonga ~]# cat /etc/resolve.conf
# Generated by NetworkManager
nameserver 10.0.2.1
```
#### ユーザー削除と作成
リモートホストにrootでログインして、marmosetユーザーを作ります。
```console
// wheelグループでmarmosetを追加
[root@marmoset ~]# useradd marmoset -g wheel

// パスワード設定
[root@marmoset ~]# passwd marmoset
Changing password for user marmoset.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

// 確認
[root@marmoset ~]# cat /etc/passwd | grep marmoset
marmoset:x:1002:10::/home/marmoset:/bin/bash
```
同時にクローンされたmomongaを削除します。
```console
[root@marmoset ~]# userdel -r momonga
```
##### 設定の確認
rootでログインして下記のコマンドで設定が反映されていることを確認します。
```console
[root@marmoset ~]# hostname
marmoset
[root@marmoset ~]# ip a | grep "inet "
    inet 127.0.0.1/8 scope host lo
    inet 10.0.2.130/24 brd 10.0.2.255 scope global noprefixroute enp0s3
    inet 192.168.56.130/24 brd 192.168.56.255 scope global noprefixroute enp0s8
```
### 鍵交換
既に作成済みの公開鍵をリモートホストに転送・設定します
```console:MS-DOS
C:\Users\post>scp .ssh\id_ed25519.pub marmoset@192.168.56.130:/home/marmoset/
```
```console:linux
// ユーザーをmarmosetに切り替え
[root@marmoset ~]# su - marmoset

// SSH関連ディレクトリ・ファイル作成
[marmoset@marmoset ~]$ mkdir .ssh
[marmoset@marmoset ~]$ chmod 700 .ssh
[marmoset@marmoset ~]$ touch .ssh/authorized_keys
[marmoset@marmoset ~]$ chmod 600 .ssh/authorized_keys

// 公開鍵登録
[marmoset@marmoset ~]$ cat id_ed25519.pug > .ssh/authorized_keys

// 不要なファイルを削除
[marmoset@marmoset ~]$ rm id_ed25519.pub
```
### PuTTYでリモート接続
1. PuTTY起動
1. 「保存済みセッション一覧」からmomongaを選んで「読込」をクリック
1. ホスト名を 192.168.56.130 に変更
1. セッション名を marmoset に変更
1. 左メニューの接続→データ、自動ログインのユーザ名: marmoset に変更
1. 左メニューのセッションの「保存」をクリックして保存したら、「開く」をクリック
パスワードなしでリモートホストにログイン出来たらOK

### vscodeでリモート接続
configファイルに以下の設定を追加します。
```config
Host marmoset
    HostName 192.168.56.130
    User marmoset
    IdentityFile C:\Users\post\.ssh\id_Ed25519
    Port 22
    TCPKeepAlive yes
    IdentitiesOnly yes
```
大量発生していたスパム登録を防ぐことができたreCAPTCHAを紹介

サービスを運用していると、スパムによるユーザー登録に遭遇することがあります。
一度ならまだしも、頻繁にスパム登録をされてしまうと不要なデータが大量に発生してしまいます。

もし、スパム登録にお悩みであればGoogleが提供している[reCAPTCHA](https://cloud.google.com/security/products/recaptcha?hl=ja)の導入をおすすめします。

以前、大量のスパム登録に困ったいたところreCAPTCHAを導入してから途絶えたので、かなり有効なのではないかと思っています。

# reCAPTCHAとは

reCAPTCHAは、悪質なボットなどによるWebフォームからの送信を防ぐ機能です。

年々、ボットもreCAPTCHAの制限を突破するために進化してきているため、reCAPTCHAもバージョンが更新されています。
本記事投稿時点では、v3が出ています。

## v1

v1は歪んだ文字列をユーザーに提示し、入力したものが正解しているかを判定するものです。
現在はボットの画像認識精度が向上し、突破されるようになったため非公開となっています。

## v2

v2は「私はロボットではありません」というメッセージにチェックすると、問題付きの画像を表示させるものです。
よく見かける、自動車の写っている画像を複数ある画像の中から全て選ばせるようなやつです。
現在も使っているサイトが多いのではないでしょうか。

## v2 invisible

v2から「私はロボットではありません」というチェックボックスを無くしたものです。
ボットの可能性がある場合は、v2同様に画像付きの問題が表示されます。ボットでないと判定された場合は、そのままフォームを送信できます。

## v3

v3はユーザーに対して何らかのアクションを求めずにボットかどうかの判定を行います。
仕組みとしてはWebページ上の行動を読み取り、ボットか否かを機械学習で判定します。

# reCAPTCHA導入

導入にあたり、Google reCAPTCHAの初期設定をする必要があります。
こちらの記事で分かりやすく紹介されているため、ご参考にしてください。

https://rishuntrading.co.jp/blog/security/google_recaptcha_v3/

使用するreCAPTCHAのバージョンについては、できるだけ最新のものをおすすめします。

## プラグイン

様々なフレームワークやCMSでreCAPTCHA導入のためのサードパーティが提供されています。個人的に使用して正解だったものや、使えそうなものを一部紹介します。

### Django編

https://github.com/django-recaptcha/django-recaptcha

こちらは実際に使用したもので、導入が容易にできました。

### Rails編

スター数も多く、紹介しているサイトも多くありました。
更新頻度も高かったです。

https://github.com/ambethia/recaptcha

### WordPress

WordPressでフォームを作る時の定番プラグイン、Contact FormにはreCAPTCHAの設定機能が備わっています。

https://ja.wordpress.org/plugins/contact-form-7/

# 参考

https://cheq.ai/ja/blog/fighting-spam-sign-ups/

https://qiita.com/Kazuki7222/items/6e759886a0ff9831e424

https://pikawaka.com/rails/recaptcha
[AWS #15] AMI

## はじめに
こんにちは
今回はコンピューティングサービス分野である **「AMI」** について紹介したいと思います。

## AMI
AMIとは **「Amazon Machine Image」** の略称であり、※**インスタンス**を起動するのに必要なOS(Windowsやmac)やボリュームなどの<font color=red>**情報がまとまったテンプレート**</font>のことを指します。

※インスタンス：**AWS上で稼働する仮想サーバ**のことを指し、仮想サーバを数える際の単位としても使われます。

:::note info
1つのAMIから**いくつでも**インスタンスを**起動する**ことができます
:::
:::note info
AMIにより、**同じ構成**を持ったEC2インスタンスを**複数起動**することができます
:::

またAMIにはOSやアプリケーション、データなどを記しておくことができ、作成したEC2のインスタンスに引き継ぐことができます。

:::note info
AMIはアカウントの**共有が可能**です
:::

## AMIの種類
AMIは大きく分けて4種類あります。
### クイックスタートAMI 
AWSが**予め用意しているAMI**です。
Amazon LinuxやWindowsServer、Red HatなどのOSがインストール済みのAMIです。
### 自分のAMI
**ユーザーが作成したAMIのこと**です。
作成自体は簡単であり、既存のインスタンスから作成することができます。

### AWS Marketplace AMI
**ベンダーなどが作成したAMI**です。
SQL Server、WordPressなどのミドルウェアやソフトウェアがインストールされているAMIです。
### コミュニティAMI
**ユーザーが作成したAMIで公開されているもの**です。
上記3つのAMIが要件を満たさない場合などに選択されることが多いです。

:::note warn
AWSが**中身をチェックしているものではない**ので、利用する際には**注意**が必要になります。
:::

### AMIの料金
AMI自体にかかる**料金はありません。**
しかし、カスタムAMIを作成して保存する場合は**Amazon EBS**のスナップショットも作成されるため、Amazon EBS スナップショットの**ストレージ料金が発生します。**
## おわりに
ちょっとしたまとめになります。

:::note info
AMIとは **「Amazon Machine Image」** の略称です。
インスタンスを起動するのに必要な**OSやボリュームなどの情報がまとまったテンプレート**です。
:::

AMIは、AWS上で**インスタンスを作成する際に非常に役立つサービス**であることが理解できました。最後までお読みいただきありがとうございました！

>日頃より活用している参考書です。
>> **「参考書」**
[AWS認定クラウドプラクティショナー改定第3版](https://x.gd/19i6N)
>
> **「AWS公式サイト」**
[Amazon マシンイメージ (AMI)](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AMIs.html)
>
> **「参考元」**
[AMIとは？初心者でもわかるざっくり解説](https://www.future.ad.jp/futuremedia/20231012/)
>
> **「参考元」**
[【初心者】AWS AMIとは？意外と知らない4つの種類と使用例](https://www.bold.ne.jp/engineer-club/aws-ami)
>
> **「Youtube」**
[【CLF-C02：AWSクラウドプラクティショナー】第19回 AMI (クラウドテクノロジーとサービス分野)](https://x.gd/GQU4n)
Pythonで行う多重比較法(Bonferroni法とHolm法)

今回は多重比較法で用いる補正アルゴリズムについて説明します。
多重比較法は統計的仮説検定のP値を補正する際に用いるアルゴリズムです。
多重比較法はさまざまな算出方法がありますが、今回はBonferroni法とHolm法について記載します。


### Bonferroni法

Bonferroni法は、多重比較法の中でも最もシンプルで直感的な方法です。以下のように有意水準$ \alpha $を補正します：

$$ \alpha_{\text{new}} = \frac{\alpha}{m} $$


- $\alpha$は全体の有意水準（例えば、0.05）
- $m$は検定の数
- $\alpha_{\text{new}}$は個々の検定の新しい有意水準


```python
# P値の補正（Bonferroni法）
import statsmodels.stats.multitest as smm

# P値の補正（"Bonferroni法）
p_values = [0.005, 0.006, 0.007, 0.008, 0.009, 0.01]
corrected_p_values = smm.multipletests(p_values, alpha=0.05, method='bonferroni')

print("元のP値:", p_values)
print("Bonferroni補正後で検定した際に棄却したかどうか:", corrected_p_values[0])
print("Bonferroni補正後のP値:", corrected_p_values[1])

# 元のP値: [0.005, 0.006, 0.007, 0.008, 0.009, 0.01]
# Bonferroni補正後で検定した際に棄却したかどうか: [ True  True  True  True False False]
# Bonferroni補正後のP値: [0.03  0.036 0.042 0.048 0.054 0.06 ]
```

### Holm法
Bonferroni法は計算アルゴリズムが容易ですが、保守的な手法であります。
Holm法は、Bonferroni法よりも検定の数が多い場合においてより高いを持つ多重比較法です。Holm法では、以下の手順でP値を補正します：

P値を小さい順に並べ、それぞれのP値に対してBonferroni補正を施します。しかし、最小のP値から順に、そのP値が補正後の有意水準以下であれば、そのP値とそれより大きいP値すべてを有意とします。具体的な数式は以下の通りです：

$$ \alpha_{\text{new},i} = \frac{\alpha}{m-i+1} $$

ここで、
- $i$はP値の順位（最小のP値から順に1, 2, ..., $m$）
- $\alpha_{\text{new},i}$は順位$i$のP値の新しい有意水準

```python
import statsmodels.stats.multitest as smm

# P値の補正（Holm法）
p_values = [0.005, 0.006, 0.007, 0.008, 0.009, 0.01]
corrected_p_values = smm.multipletests(p_values, alpha=0.05, method='holm')

print("元のP値:", p_values)
print("Holm補正後で検定した際に棄却したかどうか:", corrected_p_values[0])
print("Holm補正後のP値:", corrected_p_values[1])

# 元のP値: [0.005, 0.006, 0.007, 0.008, 0.009, 0.01]
# Holm補正後で検定した際に棄却したかどうか: [ True  True  True  True  True  True]
# Holm補正後のP値: [0.03 0.03 0.03 0.03 0.03 0.03]
```
VSCode プラグイン Vitest で自動テストをもっと便利に

# はじめに
この記事では、VSCode プラグイン Vitest の基本的な利用方法を確認します。

https://marketplace.visualstudio.com/items?itemName=vitest.explorer

# 開発環境
開発環境は以下の通りです。

- Windows 11
- VSCode 1.90.2
- Extension: Vitest 0.12.3
- Vitest 1.6.0
- @testing-library/jest-dom 6.4.2
- @testing-library/react 14.3.0
- @testing-library/user-event 14.5.2
- TypeScript 5.4.2
- React 18.3.1
- Vite 5.2.11
- Node.js 20.13.1
- npm 10.8.1

:::note
プラグインの利用要件は、以下の通りです。[^1]
[^1]:https://marketplace.visualstudio.com/items?itemName=vitest.explorer

> - Visual Studio Code version >= 1.77.0
> - Vitest version >= v1.4.0
> - Node.js version >= 18.0.0 (follows Vitest)
> - Coverage requires Visual Studio Code >= 1.88.0
:::

# プラグインのインストール
サイドバーの Extensions で "Vitest" と検索すると、表示されるので、そこからインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/cb63e1e5-8196-3385-6a0a-8532e933a8a0.png)

# 機能の確認
プラグインがインストールできたので、どのような機能があるか確認しています。
Testing View とテストファイル2つの箇所からテストを管理できます。

## Testing View
サイドバーの Testing アイコンをクリックすると、Testing View が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/e366dae9-6aa4-66f0-7345-8eeb662235a2.png)

Testing View 上部のタブからは、全テスト共通で操作ができます。以下のように全テストを実行することもできます。

![Extension_-Vitest-react-tests-Visual-Studio-Code-2024-07-03-05-47-11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/c9adc971-72de-699d-82f8-60f7b6b4b29d.gif)

:::note
今回の環境では、Playwright と Vitest で分けてテスト実行するようにしているので、各テスト内で一括実行されるようになっています。
:::

ファイルごとやケースごとのテスト実行もできます。

![Extension_-Vitest-react-tests-Visual-Studio-Code-2024-07-03-05-59-35.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/27e18d9f-cc6e-e6c2-a135-9f266e7507cb.gif)

単なるテスト実行だけでなく、カバレッジの計測も可能です。
ただし、カバレッジを利用するためには、プラグインのインストール及びテスト設定をしておく必要があります。

https://vitest.dev/guide/coverage

![Extension_-Vitest-react-tests-Visual-Studio-Code-2024-07-03-06-15-32.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/606783b6-3f6b-a36e-360c-63303044401f.gif)

また、Testing View からテストファイルへ移動することもできます。

![Extension_-Vitest-react-tests-Visual-Studio-Code-2024-07-03-06-17-17.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/46e1b638-90b9-07f7-7c3e-04142f1ab070.gif)

## テストファイル
テストファイルでも Testing View と同じように一括でのテスト実行、ケースごとのテスト実行、カバレッジの計測などができます。

![App.test.tsx-react-tests-Visual-Studio-Code-2024-07-03-06-22-45.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/d58a26ef-0d8c-44b1-181f-578135c5076c.gif)


# 参考
- [Coverage](https://vitest.dev/guide/coverage)
- [Vitest - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=vitest.explorer)
バーンアップチャートでスクラム開発をもっと効果的に！その活用例を徹底解説


## はじめに
スクラム開発を行う際、進捗管理は非常に重要です。その中でもバーンアップチャートは、チームの進捗を視覚的に把握するための強力なツールです。この記事では、バーンアップチャートの基本的な使い方から、実際のプロジェクトでの活用例までを詳しく解説します。

## バーンアップチャートとは？
バーンアップチャートは、プロジェクトの進捗を視覚的に表現するためのグラフです。縦軸に完了した作業量、横軸に時間を取ります。これにより、プロジェクトの進捗状況を一目で把握することができます。

### バーンアップチャートの構成要素
1. **縦軸（Y軸）**: 完了した作業量（ストーリーポイントやタスク数など）
2. **横軸（X軸）**: 時間（スプリントや日付）
3. **理想線**: 理想的な進捗を示す直線
4. **実績線**: 実際の進捗を示す折れ線

## バーンアップチャートのメリット
バーンアップチャートを活用することで、以下のようなメリットがあります。

1. **進捗の可視化**: チーム全体が現在の進捗状況を一目で把握できる。
2. **問題の早期発見**: 進捗が遅れている場合、早期に問題を発見し対策を講じることができる。
3. **モチベーションの向上**: 目に見える形で進捗が確認できるため、チームのモチベーションが向上する。

## 実際の活用例
### 例1: 新機能の開発プロジェクト
ある新機能の開発プロジェクトで、バーンアップチャートを活用しました。初めに全てのタスクを洗い出し、ストーリーポイントを割り当てました。スプリントごとに進捗を記録し、バーンアップチャートを更新しました。結果として、進捗が遅れている箇所を早期に発見し、リソースの再配分を行うことで、プロジェクトを予定通りに完了することができました。

### 例2: バグ修正プロジェクト
バグ修正プロジェクトでもバーンアップチャートは有効です。バグの修正状況を可視化することで、どのバグが優先的に修正されるべきかを判断しやすくなります。また、進捗が遅れている場合には、追加のリソースを投入するなどの対策を講じることができます。

## まとめ
バーンアップチャートは、スクラム開発における進捗管理の強力なツールです。進捗の可視化、問題の早期発見、モチベーションの向上など、多くのメリットがあります。ぜひ、あなたのプロジェクトでもバーンアップチャートを活用してみてください。

## 参考リンク
- [Scrum.org](https://www.scrum.org/)
- [Atlassian: Burndown and Burnup Charts](https://www.atlassian.com/agile/project-management/burndown-charts)
LLVM IRの勉強メモ #1

個人的な学習メモです。

#### LLVM IRとは[^1]

LLVMコンパイラにおける中間表現(intermediate representation)である。コンパイラの汎用最適化で扱うコードであり、高水準言語とプラットフォームに依存しない表現となっている。
IRにはインメモリコード（LLVMのライブラリでのデータ）、ビットコード、そしてヒューマンリーダブルなIRコードの3つの形式がある。

#### 命令列[^2]

グローバルな関数や変数は`@`、ローカルな関数や変数には`%`が付けられる。

```c
%result = mul i32 %X, 8
```

名前付きの変数は`%result`のような書きかたであり、一時的な変数は`%0`などとなる。オペコード(`mul`)とプリミティブタイプ(`i32`)、オペランドで表現する。

#### モジュール[^3]

IRでもプログラムのモジュール構造は保持されている。

```llvm
; Declare the string constant as a global constant.
@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00"

; External declaration of the puts function
declare i32 @puts(ptr nocapture) nounwind

; Definition of main function
define i32 @main() {
  ; Call puts function to write out the string to stdout.
  call i32 @puts(ptr @.str)
  ret i32 0
}

; Named metadata
!0 = !{i32 42, null, !"string"}
!foo = !{!0}
```

一般にモジュールはグローバル値（関数や変数）のリストで構成される。グローバル値はポインタで表され、以下のリンケージタイプのいずれかを持つ。

#### リンケージタイプ[^4]

| リンケージタイプ | 意味 |
|---|---|
| private | モジュール内のオブジェクトからのみアクセスされる変数を表す |
| internal | Cの`static`に相当し、オブジェクトファイルでのローカルシンボルを表す |
| available_externally | 外部宣言の明示で、グローバル値の定義がモジュール外のどこにあるか分かっていることを表す（インライン化などの最適化を行うために存在しているリンケージタイプ） |
| linkonce | このリンケージタイプを持つグローバル値はリンケージが発生すると、同じ名前の他のグローバル値とマージされる（インライン関数やテンプレートなど、それを使用する各翻訳単位で生成する必要があるコードを実装するために使用できる） |
| weak | linkonceと同じマージセマンティクスを示すが、未参照のグローバル値は削除されない |
| common | weakと似ているが、C言語のグローバルスコープでの「int X;」のような暫定的な定義に使われる。未参照の場合は削除されない |
| appending | 配列へのポインタ型のグローバル変数にのみ適用できる。このリンケージを持つ2つのグローバル変数が一緒にリンクされると、2つのグローバル配列が一緒に追記される |
| extern_weak | このリンケージのセマンティクスは、ELFオブジェクト・ファイル・モデルに従う。シンボルはリンクされるまでweakで、リンクされなければ、未定義の参照ではなくNULLになる |
| linkonce_odr, weak_odr | `odr`サフィックスはそのすべてのグローバル値が等価であることを示す（これは関数をインライン化し、定数を折りたたんでロードできることを意味する） |
| external | グローバル値は外部から見えており、外部のシンボル参照を解決するために使用することができる | 

[^1]: https://llvm.org/docs/LangRef.html#introduction
[^2]: https://llvm.org/docs/LangRef.html#identifiers
[^3]: https://llvm.org/docs/LangRef.html#module-structure
[^4]: https://llvm.org/docs/LangRef.html#linkage-types
Google Apps Script（GAS） xlsx ライブラリのスクリプトID

#### Google Apps Script（GAS） xlsx ライブラリのスクリプトIDを知りたいのですが、ID直接、または探し方をご教示願います。
目的：GoogleSpread のサイドバーのjavascript でローカルPCのExcelファイル(.xlsx) を読込みする。
知りたいこと：gasのライブラリに　'xlsx' を追加する際の　スクリプトIDを知りたいのです。
ITパスポート 業務分析

・業務分析手法

・特性要因図
魚の骨のような図
要因と特性の関連を把握する

・パレート図
降順の棒グラフと累積値の折れ線グラフ
重点項目を把握する
・ABC分析
ある項目の件数を降順に並べた結果、全体に対する比率によって、A群（70%）、B群（20%）、C群（10%）のようにクラス分けをする

・ヒストグラム
収集したデータをいくつかの区分に分類し、各区分に属するデータの個数を棒グラフで表した図
データのばらつきを把握できる

・箱ひげ図
長方形の箱とその両端から伸びるひげで表した図
データの分布とばらつきを把握できる

・管理図
基準値となる中心線と上下の管理限界線を引き、製品などの特性値を折れ線グラフでプロットした図
品質不良や製造工程の異常を検知して不良原因を把握できる

・散布図
座標上をプロットした図
２種類のデータの相関関係を把握する
相関関係には、正の相関、負の相関、相関なしがある
２種類のデータのうち、予測したい要素を目的変数、目的変数に影響を与える要素を説明変数という

・ヒートマップ
様々な集計データを、数値の大小により色の濃淡や色相で色分けして表した図
分布や傾向を分析できる

・データの視覚化
・系統図（ロジックツリー）
目的を達成するための手段と、さらにその手段を実施するためのいくつかの手段を考えることを繰り返し、細分化する
・マトリックス図
二つの要素を行と列で表したもの
・モザイク図
複数の帯グラフを横に並べたもの
・コンセプトマップ
概念地図という意味で、キーワード同士の関連を表現する

・TQC
企業が製品やサービスを提供するに当たり、製造部門だけでなく、各部門が垣根を超えて全社的に品質管理に取り組むこと

・TQM
経営陣がトップダウンの形で継続的に品質の向上を図るマネジメント手法
緊急事態、非常事態における、Web開発現場でのマネジメントの手法

## 概要

本稿では、サービス停止、重大なセキュリティホール、本番データの欠損、機能欠損クレームなど、緊急事態発生時のマネジメントについて解説します。迅速な復旧と組織の成長を両立させるためのポイントをまとめました。


### 緊急時におけるマイクロマネジメントの重要性

緊急事態発生時のマネジメントは、平時のマネジメントとは大きく異なります。迅速な意思決定と行動が求められるため、**トップダウン**での意思決定と**マイクロマネジメント**が不可欠となります。これは、問題解決に一刻一秒を争う場合や、経営危機に発展する可能性があるためです。現場任せにして問題が先送りされ、経営危機に陥る事態は避けなければなりません。

このような状況における効果的なマネジメント手法、意識すべきポイントを記載します。

### 緊急事態におけるゴール

緊急事態のゴールは、***今起きている問題を暫定的に除去し、一刻も早くサービスを機能・復活させること***です。**抜本解決や恒久解決を絶対に混ぜてはいけません**。よくありがちなのですが、サービスが停止しているのに、

マネージャー「何故こんな事が起きたのか？」
部下「ダブルチェックを怠りました」
マネージャー「どうしたら防げた？」

みたいな議論はしてはいけません。目的の為に必要十分な事だけに集中しましょう。

## 緊急事態の対応手順

### 1. 報告：迅速かつ的確な情報共有

#### 上位マネージャーへの報告

緊急事態発生時には、速やかに上位マネージャーに報告することが重要です。事業的な観点からの対応、部署横断での連携、自チームの業務優先順位などを判断するためにも、包括的な情報が必要です。現場レベルでの判断や独断による対応は避け、全体像を把握した迅速な報告を心がけましょう。

#### 上位マネージャーへの報告のポイント

* 問題発生を認識したら、速やかに報告する
* 危機状況が確信できない場合でも、疑惑段階で報告する
* 発生場所、状況を明確に伝える
* 原因究明や影響調査は後回しにし、迅速な復旧を優先する

緊急事態は時間との戦い。原因や影響を調べるよりも、まずは報告を第一に行いましょう。貴方が適任だと判断されたら、上位マネージャーから「復旧作業を進めながら、原因や影響範囲も調査するよう」指示が来ます。

#### 作業進捗の定期報告

報告後も、定期的に上位マネージャーへ作業進捗を報告しましょう。状況変化や課題なども共有し、迅速な意思決定を促します。

### 2. 危機意識の共有：チーム全体で取り組む体制構築

#### チーム全体への共有
対応を自チームで行う場合、真っ先にやるべきことは、チーム全体に「危機的な状況にある」ことを共有することです。

#### 共有の理由

* 緊急事態への対応を最優先事項と認識してもらう
* 不急の業務(定例ミーティングや他部署からの相談)をキャンセルしてもらう
* 細かい指示や状況確認への迅速な対応を促す
* 作業進捗や状況変化を逐次報告してもらう

共有を怠ると、現場のメンバーが別の業務を優先したり、進捗状況が不明確になり、復旧が遅れる可能性もあります。

### 3. タスクの優先度と人的リソースの振り分け

#### タスクと担当者の選定
以下の表を参考に、タスクの優先度と担当者を決定します。

| タスク | スキル | 経験 | 緊急度 | 担当者 |
|---|---|---|---|---|
| 初期対応 | 低 | 高 | 特急 | サーバ/プロダクト管理者 |
| 原因究明(不明) | 高 | 高 | 急 | 経験豊富なエンジニア |
| 原因究明(あたりがつく) | 中 | 中 | 急 | 該当箇所を担当したエンジニア＋補佐 |
| 暫定処置 | 中 | 低 | 急 | 原因究明の中心となったエンジニア |
| 影響範囲の調査 | 低〜中 | 低 | 緩 | 開発ディレクター、経験の浅いエンジニア |


- 影響範囲の調査は、開発ディレクター、経験の浅いエンジニア等をアサイン

#### 外部への協力依頼
自チームだけで人選が不足する場合は、上位マネージャー経由で他部署に応援をお願いしましょう。

### 4.実作業中に注意すべきポイント

#### 定期的な訓練の重要性
緊急事態が発生した時に、パニックになったり、暫定処置が遅れたりするリスクを減らすため、常日頃から非常事態を想定した防災訓練を開発環境などを利用して、チームでしておくことをオススメします。

詳しくは、別途防災訓練について書いたコチラをご覧ください。

https://qiita.com/michi_taka/items/002cf6a039ddfe8dbdd6

#### 具体作業時の心がけ

緊急事態の基本は、「**ミス無く、安全に、最速で暫定処置まで終わらせる**」ことです。それを意識した上で、以下のことを心がけると良いと思われます。

- **人を責めない**
    - 原因になった人を責めても、問題は解決しません！
    - 指導や反省会とかも後回し
- **余分な事をしない、させない**
    - 緊急事態の解消だけに留める
    - バグのあった機能改修や、恒久対応や関連機能のリリースなどを混ぜ込まない
    - 暫定処置に恒久対応を混ぜ込まない事を担当者に念を押す
- **密なコミュニケーションを取る**
    - 何か事態が進展したらすぐ報告してもらう
    - 報告が無くても、適宜進捗確認
    - 暫定解消以外の事をしていないか確認
- **進展があった場合の上位マネージャーへの報告**
    - 初期対応で何をしたか
    - 解消までの目処
    - 影響範囲や規模の定期的な報告
- **本番操作はダブルチェックを基本に慎重に**
    - 声出しすることも重要


### その他

上記はあくまでも、私が意識している事を網羅的にまとめたに過ぎません。もし他にも重要な事や、不足していること、実際に役立った／問題に発展したことなどあれば、コメント等いただけると幸いです。
大半の人が間違えるであろう「0を除く整数から数を選択したときに正である確率」を小学生でも分かるようにしたい


## 予防線of予防線

私の数学力は偏差値40レベルです。OK？
君より頭悪いからそんな熱くならないでちょ。

## 問題

0を除く整数全体から無作為に数を選択した場合、それが正である確率は1/2である。
これは正しいか？

## 答え（多分）

正しくない。

## 理由

無限集合で一様分布となる確率分布が定義できないから。

## 小学生でも分かるように説明したい

### 案1. 確率が定義できないから

例えば、10個あるボールから特定のボールを選ぶ確率は1/10だよね。
じゃあ無限にあるボールから特定のボールを選ぶ確率はなんだろうね。
1/無限で0になっちゃうね。じゃあそもそも確率が定義できないね。

### 案2. 思いつかない

案1が優秀すぎて他が思いつかない。

## ついでにChatGPT君に聞いてみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/7f0f1819-2a9f-fbae-e09d-59adf57b6791.png)

うん。

## どうでもいいが

プログラム組んで検証しても意味ないですよ。
整数の範囲が有限なんで。

## 参考（自分は理解していない）

https://sokrates7chaos.hatenablog.com/entry/2019/05/03/013225

https://jp.quora.com/%E6%95%B4%E6%95%B0%E3%81%AE%E4%B8%AD%E3%81%8B%E3%82%891%E3%81%A4%E3%82%92%E9%81%B8%E3%82%93%E3%81%A0%E3%81%A8%E3%81%8D-%E3%81%9D%E3%81%AE%E8%87%AA%E7%84%B6%E6%95%B0%E3%81%8C%E5%81%B6%E6%95%B0%E3%81%A7%E3%81%82

https://mathlog.info/articles/487
rspecのtravel_toって便利

## はじめに
最近、rspecでtravel_toを使いテストを書きました。
使ってみて便利だなと思ったので共有します。

## travel_toとは
ActiveSupport::Testing::TimeHelpersのtravel_toメソッドです。

https://api.rubyonrails.org/classes/ActiveSupport/Testing/TimeHelpers.html

travel_toはある時刻を渡してあげれば、その時刻についてのテストを実装することができます。
実際にやってみたいと思います。

## travel_toのテスト例
travel.rbというmodelでcurrent_yearというメソッドを定義します。
これは単純に現在の時刻の年を返すメソッドです。
```rb:app>models>travel.rb
class Travel < ApplicationRecord
  def self.current_year
    Time.zone.today.year
  end
end
```

rails_helper.rbでTimeHelpersをincludeします。
```rb:spec>rails_helper.rb
RSpec.configure do |config|
  config.include ActiveSupport::Testing::TimeHelpers
end
```

travel_spec.rbで以下のテストを作成します。
```rb:spec>models>travel_spec.rb
require 'rails_helper'

RSpec.describe Travel, type: :model do
  describe 'current_year' do
    it '2023が返る' do
      travel_to('2023/07/03 00:00'.in_time_zone) do
        expect(described_class.current_year).to eq(2023)
      end
    end
    it '2022が返る' do
      travel_to('2022/07/03 00:00'.in_time_zone) do
        expect(described_class.current_year).to eq(2022)
      end
    end
  end
end
```

上を実行すると、テストが通ります。
つまり、travel_to('2023/07/03 00:00'.in_time_zone)で現在時刻が'2023/07/03 00:00'となり、現在の年が2023となります。2022年の場合も同様です。

## 終わりに
便利なメソッドなので、使えるときは使っていきたいと思います。
Javaで「文字列から指定したインデックスの文字を取得する」の動作を確認してみた

# 概要

Javaで「文字列から指定したインデックスの文字を取得する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/string/index5.html

# 実装

以下のファイルを作成しました。
```JSample5_1.java
class JSample5_1{
  public static void main(String[] args){
    String msg = "東京都港区赤坂";

    for (int i = 0; i < msg.length(); i++){
      System.out.println( i + "；" + msg.charAt(i));
    }
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample5_1.java 
$ java JSample5_1 
0；東
1；京
2；都
3；港
4；区
5；赤
6；坂
```

# まとめ

何かの役に立てばと。
(調査中)クラスローダーを使用してリソースのURLを取得。特定のディレクトリの指定されたパターンのプロパティファイル名を取得

```java
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.regex.Pattern;

public class JarFileUtils {

    public static void main(String[] args) {
        try {
            // ディレクトリパスとパターンを指定
            String directoryPath = "/config";
            String pattern = ".*\\.properties";
            List<String> propertiesFiles = getPropertiesFilesFromJar(directoryPath, pattern);
            propertiesFiles.forEach(System.out::println);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static List<String> getPropertiesFilesFromJar(String directoryPath, String pattern) throws IOException {
        List<String> propertiesFiles = new ArrayList<>();

        // クラスローダーを使用してリソースのURLを取得
        URL resourceURL = JarFileUtils.class.getResource(directoryPath);

        if (resourceURL != null && resourceURL.getProtocol().equals("jar")) {
            // URLをデコードしてJARファイルのパスを取得
            String jarPath = URLDecoder.decode(resourceURL.getPath(), "UTF-8").substring(5, resourceURL.getPath().indexOf("!"));

            try (JarFile jarFile = new JarFile(jarPath)) {
                Enumeration<JarEntry> entries = jarFile.entries();

                Pattern regexPattern = Pattern.compile(pattern);

                while (entries.hasMoreElements()) {
                    JarEntry entry = entries.nextElement();
                    String entryName = entry.getName();
                    
                    // 特定のディレクトリ内の指定されたパターンに一致するファイルをフィルタリング
                    if (entryName.startsWith(directoryPath.substring(1)) && regexPattern.matcher(entryName).matches()) {
                        propertiesFiles.add(entryName);
                    }
                }
            }
        } else {
            System.out.println("The resource is not inside a JAR file.");
        }

        return propertiesFiles;
    }
}
```