OmniAICreator/Qiita-1.07M huggingface dataset:
【macOS】diffコマンドで出力されるファイルが存在しない（不可視）場合の対処法

# 現象
diffコマンドを用いてNASと外付けSSHのファイル存在チェックを行ったところ、「NASにしか存在しない」と出力されたファイルまたはディレクトリが、macOSから確認できない。

# 実行環境
* OS : macOS Sonoma 14.4（23E214）
* ターミナル : バージョン2.14 (453)
* zsh : バージョン5.9 (x86_64-apple-darwin23.0)

# 使用したコマンドと出力結果
```zsh: zsh
#ファイル存在チェック
#-q: 変更があるかないかのみを通知 -r: ディレクトリを再帰的に検索 -x ".*": ドットで始まるファイルは除外
diff -qr -x ".*" /Volumes/webaxs/various /Volumes/SSD-SCTU3A/various 
```
```zsh: zsh
#出力結果（抜粋）
Only in /Volumes/webaxs/various/DTM/Black_Knight/サンプル: 紅蓮華カバー.wav
```

# 確認方法
* Finderで目視確認
    * 隠しファイルを表示
* 対象ディレクトリでlsコマンドを実行
    * -aオプションでドットファイルを表示
    * -Rオプションで再起的に表示
* 対象ディレクトリでfindコマンドを実行
    * -inameオプションで大文字と小文字を区別しない

→いずれの方法でも対象ファイルを確認できなかった。

* Windows 11のエクスプローラーから目視確認

→対象ファイルの存在を確認できた。

# 原因
所謂 **「濁点問題」** と呼ばれる問題だと考えられる。
ファイルシステムに使用される文字コードの詳しい仕様については、Appleに問い合わせしたが、回答できないとのことだった（2024年3月18日13時10分時点）。
「濁点問題」について詳しく知りたい場合は他の記事を参照。

# 対処法
Windows 11から対象ファイルのファイル名から濁点、半濁点を除去した。
（例）「カバー」→「cover」
その結果、macOSからも視認できるようになった。
Pythonの一行for文でbreakする方法

Pythonって、よく一行でfor文を書いたりするのですが、breakが挟めないところを残念に思っていました。
が、違った！
次のコード、これの結果どうなるか知ってましたか？

```python
class Test:
  def __init__(self, id, num):
    self.id = id
    self.num = num

  def get_id(self):
    self.num += 1
    return self.id

test_array = [
  Test(1, 10),
  Test(2, 20),
  Test(3, 30),
  Test(4, 40),
  Test(5, 50),
]

# IDが3のものを抽出したいとする
target = next(x for x in test_array if x.get_id() == 3)

# 余計なループは回したくないけど・・・実際のとこどうなのか確認
print([x.num for x in test_array])
```
私はこの結果が [11, 21, 31, 41, 51] になるものだと思っていました。
しかし、実際の結果は [11, 21, 31, 40, 50] になるのです。
すごく直感に反するので初めて知ったときは信じられませんでした。
しかし、これができるなら一行for文でbreakと同じことができるじゃないですか！
知ってる人は普通に知ってそうですが、とても感動したので残しておきます。

でわでわ
nvmコマンドでNodeのバージョンを簡単に切り替える方法


## 概要

- nvm(Node version manager)とは、Node を複数バージョン管理するためのユーティリティです
- この記事では、nvm を使用して Node のバージョンを追加・切り替方法について記載します
  - [nvm](https://github.com/nvm-sh/nvm?tab=readme-ov-file#installing-and-updating)の GitHub をベースに記載しています
- バージョンを簡単に切り替えられことによって、異なるバージョンでの動作確認や、異なるバージョンでの開発が可能になります

## 手順

1. nvm をインストールする
   ```bash
   curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
   ```
2. 環境変数を設定する
   - 下記コマンドをそのまま実行する
     ```bash
     export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
     [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
     ```
3. nvm command が使用できることを確認する
   ```bash
   nvm -v
   ```
4. node の LTS(v18)を install する

   - LTS でインポートする場合

     - 🔰 LTS は Long Term Support の略で、長期間サポートされるバージョンのことです

     ```bash
     nvm install --lts
     ```

   - version 指定する場合

     ```bash
     nvm install 18.17.1
     ```

5. nodejs の version が update されていることを確認する

   ```bash
   node -v
   ```

   `>>> v18.17.1` と表示されていれば OK

6. update 前の version を追加する(今回の場合 16.18.0 にします)
   ```bash
   nvm install 16.18.0
   ```
7. nodejs の version を切り替える

   - nvm use で切り替えが可能
     ```bash
     nvm use 16.18.0
     ```

### その他便利な command

#### 現在の version を確認

```bash
nvm current
```

#### install されている nodejs version を確認

```bash
nvm ls
```

#### install 可能な version を確認

```bash
nvm ls-remote
```

## 参考

- https://github.com/nvm-sh/nvm?tab=readme-ov-file#installing-and-updating
もうすぐ来るあなたたちへ（タスクの進め方について）

そろそろ新入社員を迎える時期になります。

だいたい「報連相をしよう」、「PDCAを回そう」のような言葉を意識してくれてはいるのですが、実践という面で私が毎回レクチャーする内容があるので~~毎年ホワイトボードで書くのも面倒になったので~~、こちらに投稿しておこうと思います。



# １．10分考えてわからなければ聞く（自分で抱え込まない）

:::note info
**Ｇｏｏｄな状態**
・わからないことを悪いと思わない
・10分考えてわからなければ報連相する
・わかっていること、わかっていないことを分けて相談できる
:::

:::note alert
**ＮＧな状態**
・いちから全て自分で考えなければいけないと感じている
・１時間以上考えてもわからず、１時間以上調べても答えが見つからない
・抱え込んでしまい、上司が確認するまで報告しない
:::



プロジェクトメンバとして参加したばかりの場合、わからないことがたくさんあることが当然です。ただ、大体のメンバは **自分に任された仕事は自分独りでやりきること** を美徳と考えて時間をかけてしまうことが多く、プロジェクト上位層は **最短の時間で最良の結果を出すこと（コスパの良い「成果」を得ること）** を目的としているので、**意識の乖離が発生**してしまいます。

プロジェクト視点では、**わからないことは早く解決してタスクに取り掛かる＝10分考えてわからなければ聞く、というロジックで動くことが決して間違いではな**いので、そのようにしてもらえると良いな、と思います。

そもそも報連相をどうすれば、という質問があるかもしれませんが、個人的には「XXの件、YYの部分でわからないことがあります。どこか30分ほど時間をいただけますでしょうか」などと最初に目的や所要時間を伝えると、相手も準備や時間確保などしやすくなるので良い相談になるのではないかと思います。

＃あるいは最初のあいさつで「いっぱい質問します！」と断言しておくとか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/6db40928-6bc1-5430-ef75-0f4737eff9f4.png)



# ２．わければわかる（タスクを細分化しよう）

:::note info
**Ｇｏｏｄな状態**
・タスクの分解を最初に行っている
・各タスクのボリューム感を認識できている
・各タスクの期限感を認識できている
:::

:::note alert
**ＮＧな状態**
・タスク内にタスクがあることをイメージできていない
・あいまいなタスクをそのままにして放置している
・期限ぎりぎりで終わらないことに初めて気が付く
:::

依頼された仕事について、**十分に時間があったはずなのに期限内に終わらない理由はだいたいタスクの分解がしっかりできていないこと**にあるかと考えています。
（そもそも多忙であれば話は別ですが・・・）

大きい粒度での依頼やタスクについては、10～30分程度のタスクとなるように分解していくと、全体での業務量が見えてきたり、一日の業務量をあらかじめ見積もることができたりするので非常におすすめです。

慣れないうちは分解後に上司に確認してもらうのも非常に効果的かと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/a2c882d2-65b2-d19c-41f3-d1a23613da1d.png)



# ３．待ち時間を待たない（優先処理とパラレル処理）

:::note info
**Ｇｏｏｄな状態**
・タスクにおける待ち時間の発生を意識できている
・待ち時間が発生するタスクを優先的に処理できている
・待ち時間の間に別のタスクを行うことができる
:::

:::note alert
**ＮＧな状態**
・タスクにおける待ち時間の発生を意識できていない
・待ち時間が急に発生し、ボーっとする時間がある
・待ち時間に押され、期限が切迫する
:::


業務中、意外に待ち時間は多く発生します。
・先方への要件確認待ち
・技術サポートへの問い合わせ待ち
　etc...

時には1日以上もある待ち時間が発生するような**依頼系のタスクは、相手の状況に依存するため不確定要素が混入しコントロールしづらいもの**になります。そのため、**優先的に処置をしておかないと期限等を逼迫するファクターになる恐れ**があります。よって、待ち時間が発生するような**依頼系のタスクは優先的に処理しましょう**。

逆に、待ち時間等を有効に活用することで他のタスクの一部を先に処理できたりするため、タスクはあらかじめ細分化し、待ち時間等にフィットさせていきながら効率的に業務を処理しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/43244115-57df-0351-8cd6-c0f0d640f2c5.png)


<br>

効率よく業務をこなし、ワークライフバランスの取れた良い社会人ライフを送れるよう頑張ってください！
pythonのリスト型の使い方（要素の連結、要素の取り出し：extend,スライス機能）

## リストの連結
```py
>>> f_list = ['モモ', 'みかん', 'バナナ', 'イチジク', 'ブドウ']
>>> list_int = [-1, 1, 2, 4]
>>> f_list + list_int
['モモ', 'みかん', 'バナナ', 'イチジク', 'ブドウ', -1, 1, 2, 4]  
```
## リストの連結。メソッド「extend」
```py
>>> list_int.extend(f_list)
>>> print(list_int)
[-1, 1, 2, 4, 'モモ', 'みかん', 'バナナ', 'イチジク', 'ブドウ']
```
## 要素を取り出す。スライス機能
```py
>>> list_f = [0,1,1,2,3,3,2,5,23,4,35]
>>> list_f[0:3]
[0, 1, 1]
>>> list_f[2:6]
[1, 2, 3, 3]
>>> list_f[:4]
[0, 1, 1, 2]
```
自己紹介と今後について【初投稿】

## はじめに
個人や大学の勉強や就活をする上で、学んだことをアウトプットする機会として、Qiitaを始めました！
日々学んだことを少しでも記事にできたらと思います。

## 自己紹介
現在大学3年で2024年度から大学4年生になります。
情報系の学部に所属しており、プログラミングをはじめとしたデータベースやセキュリティの勉強をしています。

自分が使ったことある言語やプラットフォームは以下です。
・HTML
・CSS
・Javapcript
・C
・Java
・OCaml
・Python
・Docker
・Kubernetes

## 最後に
駆け出しのエンジニアとして、未熟なところもあるかと思いますが、学んだことを積極的にアウトプットできるよう、頑張りたいと思います。
次回は就活でWebアプリ開発を課題に出された時の成果物について書きたいと思っています。
「偏差値50に満たない大学はすべて廃止」という理想社会をChatGPTと一緒に考えてみた。



「偏差値50に満たない大学はすべて廃止」

という政策が施行され、５年に一度、廃止が実行されたと仮定します。今後３０年で、大学数がどう変遷するかを計算しシミュレーションした結果をPythonで描画してください。各点毎に、具体的な数値（大学数）が表示されるようにしてください。

計算を始める前に、偏差値の定義について確認してください。また、前提として、2023年度の日本の大学数は、793校あるそうです。そして、当然ですが大学の数は自然数です。

---

### **assistant**:

まずは偏差値の定義についてです。偏差値は、個々の得点が平均からどれだけ偏っているかを示す指標であり、基準となる平均が50、標準偏差が10となるように調整された値です。この定義から、偏差値50未満とは平均以下の得点を持つものと言えます。
正規分布を仮定すると、平均以下の得点を持つ人（偏差値50未満）は約50%となります。そこから、偏差値50未満の大学が廃止されると仮定すると、大学数は5年ごとに約半分になるでしょう。

こちらがPythonによる描画コードの一例です。

```python
import matplotlib.pyplot as plt

# 初期の大学の数
univ_num = 793

# 計算結果を保存するリスト
univ_nums = [univ_num]

# 年数
years = list(range(2023, 2053 + 1, 5))

# 30年間で偏差値50未満の大学が廃止されるシミュレーション
for _ in range(6):  # 5年ごとなので6回繰り返す
    univ_num //= 2  # 実数ではなく自然数なので、整数の商を取る
    univ_nums.append(univ_num)

# グラフの描画
plt.plot(years, univ_nums, marker='o')

# 各点に数値を表示
for year, univ_num in zip(years, univ_nums):
    plt.annotate(univ_num, (year, univ_num))

plt.xlabel('Year')
plt.ylabel('Number of Universities')
plt.title('Change in the number of universities')
plt.grid(True)
plt.show()
```

![output_0_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/63a70eb5-0a8a-26c9-388e-f660ef74953f.png)


これにより、30年間で大学の数がどのように変化するかをグラフで表示し、各点には具体的な大学の数を表示しています。仮定した条件下では、大学の数は5年ごとに約半分になっていくという結果が得られます。

---

### **user**:

ありがとうございます！「偏差値50に満たない大学はすべて廃止」という、無駄のない理想社会の実現に向けて具体的な計画が立てられました！

---

### **assistant**:

どういたしまして！ただ、偏差値50未満という基準はあくまで一つの視点であり、大学の評価を行う際には様々な要素を考慮することが大切です。教育内容や教員の質、学生の満足度なども評価の対象となります。また、地域によっては偏差値が高くない大学でも重要な役割を果たしている場合もあり、単純に偏差値による廃止は現実的ではないかもしれません。現代社会は多様性が求められる時代ですので、多様な学問や教育を提供する大学が存在することも重要かと思います。

---

### 関連記事

- [日本国民全員が偏差値60以上を取れる理想社会をChatGPTと一緒に考えてみた。](https://qiita.com/maskot1977/items/01e559c795036316ee86)
iOS 17.4で気圧が取得できない問題

## 現象
iOS 17.4で気圧計が取れなくなった。

## バグ
気圧計が呼ばれた際にモーション＆フィットネスの許諾ダイアログがでるのことが望ましいが、出ない。
おそらくiOSのバグ。

## 対処法
- 高度計や歩数計など他のセンサーだとモーション＆フィットネス許諾がでるので、無理やり呼び起こす。
  - 高度計：iPhone 12以降で有効。気圧取得の文脈に近いためこちらがベター。
  - 歩数計：iPhone 12 未満でも対応しているが、気圧の文脈とかけ離れているためユーザへの説明が難しい。

Appleさん早く対応してくれ〜😭

## 参考
https://developer.apple.com/forums/thread/747797
Microsoft Publisherは、終了

[Microsoft Publisher は、2026 年 10 月以降はサポートされなくなります](https://support.microsoft.com/ja-jp/office/microsoft-publisher-%E3%81%AF-2026-%E5%B9%B4-10-%E6%9C%88%E4%BB%A5%E9%99%8D%E3%81%AF%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%81%AA%E3%81%8F%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99-ee6302a2-4bc7-4841-babf-8e9be3acbfd7)

えー、困ったなぁ、という感想です。

## Microsoft365に含まれるPublisherの場合
>Microsoft 365 のお客様は、その日付からパブリッシャーにアクセスできません。

と書かれているので、字義通りなら、それ以降、利用できなくなると思われます。

ただし、
[Microsoft Publisher is ending – what you need to know](https://office-watch.com/2024/microsoft-publisher-is-ending-what-you-need-to-know/)
によれば、
>Existing Publisher installations will remain in place after October 2026. 

~~とのことですから、インストール済の場合は、利用できるかもしれません。~~

:::note warn
（2005-2-20追記）
2026年10月より、ファイルを開くことができなくなります。
:::

## Microsoftのフォーラム
Microsoftのフォーラムを読むと、今まで何十年にも渡ってPublisherで作成したファイルを、きちんと利用できるようにしたい、という人もいます。
[Is Microsoft Publisher Being Phased Out?](https://answers.microsoft.com/en-us/msoffice/forum/all/is-microsoft-publisher-being-phased-out/9b58b2db-2ba4-449b-9651-a68f0f720b38)

## 代替ソフトを検討
私も、Publisherで書類を作成しています。今までのファイルを、今後も利用可能な状態に変換し、代替のソフトを考えないといけません。

Publisherを利用しているユーザーは、ちらしやニュースレターを手軽に作りたいという人が多いと思われます（私もそうです）。

### 簡易なDTPソフトの候補
- **Word**　オブジェクトの配置の目安にする補助線を引けないのが、不便。
- **PowerPoint**　簡易DTPには、機能がものたりない。
- **花子**　縦書きも得意。簡易DTPに良い。

私の場合、**Word**か**花子**かのどちらかにする予定です。

:::note warn
(2025-2-20追記)
花子は、単体での販売は終了しました。
[花子2022](https://www.justmyshop.com/products/hanako/)
一太郎2025 プラチナに含まれるようになりました。

:::

#### （以下、2025-2-20追記）

### マイクロソフトによる今まで作成したファイルのWordへの移行方法の解説（→役立たずです）

[Microsoft Publisher は、2026 年 10 月以降はサポートされなくなります](https://support.microsoft.com/ja-jp/office/microsoft-publisher-%E3%81%AF-2026-%E5%B9%B4-10-%E6%9C%88%E4%BB%A5%E9%99%8D%E3%81%AF%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%81%AA%E3%81%8F%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99-ee6302a2-4bc7-4841-babf-8e9be3acbfd7)の、「2026年10月より前に準備する方法」に書いてあります。

1. Publisherで、ファイルを開き、PDFとして保存。
2. WordでそのPDFを開く

レイアウトが崩れまくりで、意味がありません。


### 現時点での教訓
- サブスクリプションのソフトは、ある日、利用できなくなる可能性がある。
- そのため、作成したファイルを、そのソフトで開くことができなくなる。
- そのファイルを移行できる、適切な代替ソフトがないため、今まで作成したファイルの移行が困難
【ChatGPT有＋DALL-E3】に関してですが、ポリシーが変更されたようです。→早合点だったようです。


　どうも、カーブミラーです。

　今回は、ポリシーが変更された、ということを書きます。
（2024/03/19　この内容は早合点だったようです。すみませんでした）

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　ニュースはないので、
　　本題に入ります。

　【ChatGPT有＋DALL-E3】で、
　　ポリシーが変更されたようです。

　これはたまたま
　　その状況に、
　　　ぶつかっただけなのですが、
　　　　その後、GPT-4さんに
　　　　　尋ねたところ、
　　　　　　そういうことだと
　　　　　　　わかりました。
***
　“ポリシーが変更された”と
　　聞いても、内容がわからねば
　　　首を傾げますよねw

　その内容は
　　“画像生成の限度に達しても、
　　　チャットは継続する”
　　　　というものです。

　これまでは
　　画像生成の限度に達すると
　　　赤枠のメッセージが出てきて、
　　　　そこでチャットも終了でした。

　それが
　　ゆうべから？
　　　下記のような
　　　　メッセージが
　　　　　表示されるように
　　　　　　なったのです。
![Screenshot_20240317-225757~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/17fbd8ce-8e89-13d2-737f-b175415e78fb.png)
　DeepL翻訳すると
![Screenshot_20240317-225745~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/35502e01-a154-33d9-ba12-730d765aba20.png)

　このメッセージが
　　チャットに出力されはしますが、
　　　チャットは継続できます。

　これまでは
　　赤枠メッセージが出ると、
　　　そこでチャットが停止して
　　　　プロンプト入力すら
　　　　　できなくなっていました。
　　　　　　あとは座して待つしか……

　それが
　　チャットを継続できるのです。
***
　利点は何か？

　私の場合ですが、
　　“生成していた画像の
　　　英文プロンプトを取り出す”
　　　　ことができるので、
　　　　　別の画像生成AIへと
　　　　　　移行することが
　　　　　　　容易になりました。

　新たに
　　画像生成するのは
　　　大変ですからね。

　もちろん、
　　画像生成の途中途中で
　　　英文プロンプトを
　　　　出力させていますが、
　　　　　それでも途中経過でしか
　　　　　　ありませんからね。

　そこまでの
　　英文プロンプトが
　　　得られれば、
　　　　移行は、スムーズになります。
***
　ほかの利点は？

　もちろん、
　　GPT-4を継続して利用可能だ
　　　ということでしょうね。

　画像生成を
　　しなくても
　　　質疑応答は
　　　　ふつうにできる。

　これまでは
　　チャットが停止していましたので
　　　新たにセッションを
　　　　開いても、ダメでした。

　それが
　　継続できるのです。
***
　この二点だけでも
　　うれしいではありませんか😄

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
（2024/03/19　この内容は早合点だったようです。すみませんでした）
Linux環境でAndroidStudioを起動するとサウンドがおかしくなる

昔遭遇して直し方まで到達してたけど、久しぶりに新環境でまた遭遇して直すのに手間取ったのでメモ

結論から言えば **Settings -> Build, Execution, Deployment -> Debugger**の下の方にあるAndroidDebugBridge(adb)内の`Use libusb backend`にチェックを入れると良い
ちなみにusbで設定内検索してもヒットしないので注意。これのせいで探し出せなかった

ソース:  
https://askubuntu.com/questions/1183509/pulseaudio-lags-horribly-only-when-android-studio-is-running
タイトルにPulseAudioがどうのって書いてるけど、pipewire環境でも普通に発生する
Google Authenticatorでの2段階認証実装

# はじめに
昨今、様々なログイン時に使用されている2段階認証の実装備忘録です。

PHPでの実装にあたり、[PHPGangsta/GoogleAuthenticator](https://github.com/PHPGangsta/GoogleAuthenticator)を使用している方を見つけたので、参考に組んでみました。

# 認証の流れ
フロントでAPIを呼び出し、
返却されたQRコードを画面に表示する手法で実装しました。

大まかな流れは以下になります。
1. ユーザー登録
   同時に秘密鍵をDBに登録
2. ログイン後、認証ページに移動
3. QRコードを表示
4. Google Authenticatorで読み取る
5. 表示された6桁のコードを入力して認証

# 実装の手順
## ➀Composerインストール
```shell
composer show --available phpgangsta/googleauthenticator
composer require --prefer-dist phpgangsta/googleauthenticator:dev-master
```

# ➁秘密鍵のDB登録
まずは秘密鍵を生成してDBに登録します。
今回はユーザーの登録時に秘密鍵を生成します。

```PHP:RecipientController.php
$GangstaModel = new GoogleAuthenticatorFileTransferModel();
$secret = $GangstaModel->createSecret();

// フロントで入力されたユーザー情報と作成した秘密鍵をDBへ保存
$RecipientModel->createRecipient(
    $id
    , $name
    , $tel
    , $secret
);
```

## ➂QRコード生成
登録済ユーザーがログインを行った際に、
②で保存した秘密鍵を使用してQRコードを生成します。
QRコードを生成できたらフロントにURLを返却します。

```PHP:RecipientController.php
$GangstaModel = new GoogleAuthenticatorFileTransferModel();

// 秘密鍵取得
$secret = $RecipientModel->getSecret($id);
// QRコード生成
$qrCode = $GangstaModel->createQrCode($secret);

return response()->json(['qrCode' => $qrCode]);
```

## ➃QRコード表示
バックエンドからQRコードのURLを取得できたら、
``<img>``の``src``にセットします。

```html:ShowQrCode.vue
<template>
.
.

    <img :src="qrCode">
.
.

</template>
<script>
.
.
.
const qrCode = ref(); //QRコードのURL

const showQrCode = async() => {
    const url = 'api/showQrCode';
    const req = {
        token: token.value //ユーザー毎に一意の値
    };

    const response = await axios.post(url, req);

    if(response) {
        qrCode.value = response.data.qrCode;
    }
}

return {
    qrCode
}
.
.
.
</script>
```

処理が完了するとQRコードが画面に表示されるので、
Google Authenticatorで読み取ってコードを表示してください。

## ⑤認証処理
ログイン後、認証コード入力画面が表示されます。
Google Authenticatorに表示された6桁のコードを入力し、Laravelに送信します。

```js:Authenticate.vue
const authenticate = async() => {
    const url = "api/authenticate";
    const req = {
        userId = userId.value,
        code = inputCode.value // 認証コード
    }

    const result = await axios.get(url, {params: req});

    if(result) {
        //2段階認証成功の場合、成功画面に遷移
        router.push('/success');
    }
}
```

```php:RecipientController.php
public function checkOnetimeCode(Request $req) {
    $GangstaModel = new GoogleAuthenticatorFileTransferModel();
    $RecipientModel = new RecipientModel();

    $userId = $req->get('userId');
    $code = $req->get('code');
    // ユーザー作成時DBに保存した秘密鍵を取得
    $userSecret = RecipientModel->getSecret($userId);

    // 認証コードと秘密鍵を用いて整合性をチェック
    $result = $GangstaModel->checkOnetimeCode($code, $secret);

    // チェックが成功の場合、trueを返却
    if($result) {
        return true;
    }
}
```

# おわりに
難しそうな印象を持っていましたが、実装は思っていたよりも単純でした。

今回はサンプルなのでエラー処理等を記述していません。
実際に導入する際は、きちんとハンドリングを実装する必要がありますね。

それでは。

# 参考サイト
https://github.com/PHPGangsta/GoogleAuthenticator
【統計学習】無料なのに約30hのボリューム！著名企業でも活用されるオンライン統計コース「STIPS」

**「統計やデータ分析を学んでみたい。でも、ネット記事やYouTubeには、いいコンテンツがない」**

こう思って心が折れたことはありませんか？
文系出身で統計ソフト会社に勤める私もそうでした。

実際、インターネットには統計学習コンテンツが、それこそ無尽蔵に溢れていそうです。ですが、いざ探してみると、

<font color="orange">・**長尺の動画をいくつも観続ける必要がある**
・**動画内容の正確性に疑問**
・**テストがないため確認・定着が難しい**</font>

等の事情から、どれも一長一短。自分にピッタリなものが、なかなか見つかりません。学びたいのに適切な教材がすぐに見当たらないのは、本当にもどかしいものです。

一方、今回ご紹介する[**無料のオンライン統計コース「STIPS」**](https://www.jmp.com/ja_jp/online-statistics-course.html?utm_campaign=ot&utm_source=facebook&utm_medium=social)は、米国発祥で30年以上の歴史がある[**統計ソフト「JMP（ジャンプ）」**](https://www.jmp.com/ja_jp/home.html?utm_campaign=ot&utm_source=facebook&utm_medium=social)の統計エンジニアが作成しているので、内容は正確さと信頼性があると言えるかもしれませんし、<font color="red">**説明、デモ、小テスト、演習がすべて含まれていて、およそ30時間程度で修了できます。**</font>

また、後でご紹介しますが、いま成長著しい企業として注目を集めるNVIDIAをはじめとして、国内外の数多くの著名企業様においても、社内学習プログラムとして採用いただいてきております。

それでは、「STIPS」の内容を少しご紹介しますね（急ぎの方は下の動画でも大丈夫です）。

![stips_image_for_blogpost.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/13f0464c-b62c-efa2-b26f-0369dba4c471.jpeg)


<font color="orange">**約30hで統計知識が身につく！無料オンライン統計コース「STIPS」のご紹介**</font>
https://youtu.be/KnaF5thm2Jg?si=dt0ljFK6Ugucswhj

**1. STIPSとは？**
<font color="red">**製造業に限らず、**</font>統計やデータ分析を習得したい方は<font color="red">**どなたでも利用できる**</font>無料のオンライン統計コースです。

**2. 内容は？**
以下の7つの分野について、<font color="red">**説明の動画・JMPデモ・小テスト・演習**</font>で学習するため知識の定着が望めます。

1)統計的思考と問題解決
2) 探索的データ分析（ヒストグラム等さまざまなグラフ）
3) 品質手法（品質管理、測定システム分析[MSA]等）
4) データに基づく意思決定（信頼区間、統計的検定等）
5) 相関と回帰（単回帰、重回帰、ロジスティック回帰等）
6) 実験計画（要因実験、スクリーニング実験、応答曲面計画等）
7) 予測モデリングおよびテキストマイニング（ディシジョンツリー、ニューラルネットワーク、テキストマイニング等）

**3. 修了にかかる時間は？**
全体でおよそ<font color="red">**30時間**</font>です。学習したい分野だけピンポイントで学習するなら、<font color="red">**数十分～数時間程度**</font>で済みます。

**4. 個人の学習としてだけでなく、社内のワークショップや勉強会でも利用できる？**
はい、できます。社内の統計スキルアップに「STIPS」を利用されている企業様も数多くいらっしゃいます。具体的な活用例は以下の事例をご参照ください。

**-利用いただいている企業様の事例-**

[**NVIDIA**](https://www.jmp.com/ja_jp/customer-stories/nvidia.html?utm_campaign=ot&utm_source=facebook&utm_medium=social)

[**KMバイオロジクス株式会社**](https://www.jmp.com/ja_jp/customer-stories/km-biologics.html?utm_campaign=ot&utm_source=facebook&utm_medium=social)

[**ムラタ・フィンランド**](https://www.jmp.com/ja_jp/customer-stories/murata-finland.html?utm_campaign=ot&utm_source=facebook&utm_medium=social)


「STIPS」のご紹介は以上です。
この春、自分で、社内で、統計スキルアップを目指しませんか？

[**登録はこちら！無料オンライン統計コース「STIPS」**](https://www.jmp.com/ja_jp/online-statistics-course.html?utm_campaign=ot&utm_source=facebook&utm_medium=social)
Makefile –  makeコマンドのサブコマンド複数を引数として利用することは出来るがコマンド干渉に注意

# 概要

本来 make コマンドは

```
make command1 command2
```

のようにサブコマンドは「複数のMakeを実行する」という意味なので、ここを引数として使うことは想定されていない。

だがハック的に対応することは出来る。


# Makefileの例

`$(filter-out $@,$(MAKECMDGOALS))`  にサブコマンドの中身が入っている

```
echo:
	@echo $(filter-out $@,$(MAKECMDGOALS))
```

以下コマンドを実行すると `x y z` が標準出力される

```
make echo x y z 
# x y z
```

# 注意

ただし注意が必要で `x` `y` `z` サブコマンドがそれぞれ Makefileで定義されておらず無視されているだけで、実際には実行自体はされている

つまり以下のようにMakefileを書いていると

```makefile
echo:
	@echo $(filter-out $@,$(MAKECMDGOALS))

x:
	@echo sub command X executed
y:
	@echo sub command Y executed

```

しっかり x も y も実行されているのが分かる


```
make echo x y z
# x y z
# sub command X
# sub command Y
```

なのでサブコマンドをハックするよりも、素直にMakeの引数を使った方が干渉の危険がなくて安全そうだ

# 参考

https://stackoverflow.com/questions/6273608/how-to-pass-argument-to-makefile-from-command-line


# チャットメンバー募集


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

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


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
bokeh 3.4.0で`circle()`関数をsizeやradius引数を指定せずに実行すると、円形が描画されない

# 環境
* Python 3.12.1
* bokeh 3.4.0

# やりたいこと
bokehの`circle()`関数を使って散布図を作成したいです。
bokeh 3.3.4で以下のコードを実行すると、期待通りの散布図が出力されました。

```python:sample.py
from bokeh.io import output_file, save
from bokeh.plotting import figure, ColumnDataSource

fig = figure(width=400, height=400)

data = {"a": [1, 2, 3], "b": [3, 1, 2]}
source = ColumnDataSource(data)

fig.circle(
    source=source,
    x="a",
    y="b",
)

output_file("output.html")
save(fig)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/b410c24b-c9d7-f0f2-8848-525d3cc71b39.png)


しかし、bokeh 3.4.0で実行すると、グラフに円形は表示されませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/8d0e9baa-49b7-1cef-a544-8f598aab8352.png)


# 解決策
原因は分かりません。~githubのissueを調査していませんが、たぶんバグだと思います。~
issueで報告しました。

https://github.com/bokeh/bokeh/issues/13899#issuecomment-2119476963

この記事を書いた日は2024/03/18で、bokeh 3.4.0のリリース日は2024/03/15です。そのうち、修正版がリリースされるかもしれません。
bokeh 3.4.0でも散布図を出力したいので、どうすれば散布図を出力できるか調べました。
以下に解決策を記載します。


### `circle()`関数ではなく`scatter()`関数を使う。

```python
fig.scatter(
    source=source,
    x="a",
    y="b",
    marker="circle"
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/3e52dbe5-1d6b-ac6c-fa4f-6ec1d68310d9.png)


### `circle()`関数の`size`引数を指定する

```python
fig.circle(
    source=source,
    x="a",
    y="b",
    size=8
)
```

ただし、`circle()`関数の`size`引数はbokeh 3.4.0から非推奨です。

```
$ python sample.py
BokehDeprecationWarning: 'circle() method with size value' was deprecated in Bokeh 3.4.0 and will be removed, use 'scatter(size=...) instead' instead.
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/a617687c-00b4-d2a9-71ab-7e8e92a977d4.png)


### `circle()`関数の`radius`引数を指定する

```python
fig.circle(
    source=source,
    x="a",
    y="b",
    radius=0.1
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/1b025ea0-db82-2fc3-6181-e4a0e0eaaa06.png)
【GO】ある構造体のポイント型に定義されたメソッドは、nilポインタからでも実行できる話

# 結論
```go
type Dog struct {
	Name string
}

func (d *Dog) Speak() {
	fmt.Printf("Woof")
}

func main() {
	var nilPoint *Dog
	nilPoint.Speak()
}
```
上記のコード動くと思いますか？
.
.
.
タイトルがネタバレになってる感すごいですが、動きます。
ちゃんと`Woof`が出力されます。
ポインタレシーバに対するメソッド呼び出しは、nilポインタに対してでも正常に行えます。
あまり業務で使う機会はないと思いますが、初めて知った時結構びっくりしたので備忘録として残しておきます。
# 余談
当然ですが、構造体のプロパティを参照している場合panicが発生します。
```go
type Dog struct {
	Name string
}

func (d *Dog) Speak() {
	fmt.Printf("Woof, I am %s\n", d.Name)
}

func main() {
	var nilPoint *Dog
	nilPoint.Speak() // => panic発生
}
```
# 終わりに
勝手に「そんなメソッド定義してないよ」的なエラーが出ると思ったのですが、動くみたいです。
「プロパティの参照が起こらない限りはnil値の操作は問題がない」ということは覚えておいたらいつかどこかで役立つかもしれません。
余談にある通りですが、呼び出し自体が動作してもプロパティを参照しようとするとpanicが発生するので、参照する場合は`nil`ガードを入れるのが無難なのかなと思いました。
AWS CLI プロファイル設定

よく使うのに忘れるので備忘録として

### プロファイルの確認

プロファイルを切り替え運用している場合は以下で確認可能

プロファイル機能を使っていない場合などは空のこともある
```sh
echo $AWS_PROFILE
```
現在設定されているAWSの宛先は以下から確認できる
```sh
aws configure list
```
### 現在登録されているプロファイルのリスト
```sh
aws configure list-profiles
```
### プロファイルの新規作成
```
aws configure --profile {新規に作成したいプロファイル名 xxxx-stg等}
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: 
```
### プロファイルの切り替え
```sh
export AWS_PROFILE={作成したプロファイル}
```
コマンドプロンプト操作（python,vscodeなど）

## コマンドプロンプトを使う意味
できるだけマウスを使わずに操作を行う。

## コマンドプロンプトの使い方

- コマンドプロンプトを開く
  「ウィンドウズキー」＋「R」でファイル名を指定して実行ダイアログを表示し、”cmd”と入力してOKボタンを押す。
<p>

- コマンドプロンプト終了
```
exit
```

- 今いるディレクトリを表示(カレントディレクトリ)
```
@cd
```

- ファイル一覧を見る
```
dir
tree /f
```

- ファイルの中身を見る
```
type ファイル名
```

- ファイル作成
```
type nul > ファイル名
```

- ファイル削除
```
del ファイル名
```

del コマンドは、一度実行したら、unixでのファイル削除よろしく、ごみ箱に行ったりなどはせず、本当にもとに戻せない状態になってしまうのだ。

- ディレクトリ作成
```
mkdir ディレクトリ名
```

- ディレクトリに移動
```
cd ディレクトリ名
```

- ひとつ前のディレクトリに戻る
```
cd ..
```

- ディレクトリ削除
```
rmdir ディレクトリ名
```

## pythonインタプリタの起動・終了

- pythonインタプリタの起動
```
python
```

- pythonインタプリタ終了コマンド コマンドプロンプト
```
quit()
```

または ctrl+z を入力

## VScodeの起動

- VScodeを起動する
```
code
```

- VScodeでファイルを開く
```
code ファイル名
```
承認申請の結果メールの送信元がフローを作った私になっているのを変える



専用の差出人アドレスを追加してみたけど...


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/45f5d02b-722a-f9fc-feb5-c4e7174ff6e9.png)


403エラーですね。権限が無い？

:::note alert
"body": {
        "status": 403,
        "message": "You are not authorized to send mail on behalf of the specified sending account.\r\nclientRequestId: 60b82f61-1b36-4317-a4a8-060626bd151c\r\nserviceRequestId: 8b1c50f4-ba12-cc4b-1a93-7cfb97e97c5c",
        "error": {
            "message": "You are not authorized to send mail on behalf of the specified sending account.",
            "code": "ErrorSendAsDenied",
            "originalMessage": "The user account which was used to submit this request does not have the right to send mail on behalf of the specified sending account., Cannot submit message."
        },
        "source": "office365-je.azconn-je-001.p.azurewebsites.net"
:::

協同所有者に入れてみたけど同じエラーです。


:::note alert

"body": {
        "status": 403,
        "message": "You are not authorized to send mail on behalf of the specified sending account.\r\nclientRequestId: 67e1c45c-c7d8-4dc5-811b-a6994e259954\r\nserviceRequestId: a39f95f5-213a-204c-bc44-e1c5c70a1ee5",
        "error": {
            "message": "You are not authorized to send mail on behalf of the specified sending account.",
            "code": "ErrorSendAsDenied",
            "originalMessage": "The user account which was used to submit this request does not have the right to send mail on behalf of the specified sending account., Cannot submit message."
        },
        "source": "office365-je.azconn-je-001.p.azurewebsites.net"
    }
:::

サイトのメンバーにも登録したけどエラーは変わらないですね。

以下の投稿を読むと「別のユーザーに代わって電子メールを送信する」ことができないと無理みたいだけど、どう設定するかは理解できない。

https://learn.microsoft.com/en-us/microsoft-365/admin/add-users/give-mailbox-permissions-to-another-user?view=o365-worldwide#send-email-on-behalf-of-another-user

https://powerusers.microsoft.com/t5/Using-Flows/Send-as-form-submitter/td-p/896179

https://techcommunity.microsoft.com/t5/power-apps-and-power-automate-in/you-are-not-authorized-to-send-mail-on-behalf-of-the-specified/m-p/3874919


https://blog.binaryrepublik.com/2022/09/issue-resolved-you-are-not-authorized.html

できないことが多すぎて、このツールは本当に使えるのか不思議です。
AtCoder ABC332 F - Random Update Query: LazySegmentTreeメモ

https://atcoder.jp/contests/abc332/tasks/abc332_f

LazySegtreeで考えるメモです。

# 前提知識: Lazy Segtreeの気持ち
Lazy Segtreeは各範囲に対応する値(区間をprodしたもの)と各範囲に対する演算を持ちます。`mapping(F f, S x)`はあるノードの持つ演算$f$をこのノードの持つ値`x`に作用させ、`composition(F f, F g)`は親の演算fと子の持つ演算を`f+g`で合成します。`composition`は親から子に情報を伝搬した後、演算の単位元であるid()とします。


# 問題の考え方
$[l,r]$に含まれる$i$の要素$a_i$を考えた時、区間[l,r]の数を$c = r - l + 1$とするとそのクエリ後の$a_i$の期待値は$ \frac{(c-1)}{c} a_i + \frac{1}{c} x $ となります。$c$と$x$はクエリ毎に定数となるので$A \cdot a_i + B$として良いです。
この更新された要素を範囲に含む新しいクエリ$l', r', x'$が与えられた時を考えます。同じように$c' = r' - l' + 1$とすると、その要素の期待値は$ \frac{(c'-1)}{c'} (A \cdot a_i +B) + \frac{1}{c'} x' $となり、$c'$と$x'$は先ほどと同様に定数となるので$ C (A \cdot a_i +B) + D  = A \cdot C \cdot a_i  + B \cdot C + D = (A \cdot C ) a_i  + (B \cdot C + D)  $となります。

つまり、ある要素$a_i$はその要素に適応される$l,r,x$がわかれば最終的な期待値$p_i$は$p_i = A \cdot a_i + B$の形で表せます。

各クエリによって範囲の要素の$A, B$を高速に更新できれば良さそうです。期待値$p_i$は何度クエリで処理されても$p_i = A \cdot a_i + B$の形で表せるということはこの演算に閉じており、写像を合成してもこの形で表せるということです。これがLazy Segtreeにおいてcomposition（lazyを下のlazyに伝える）ことなります。

まず、この演算をノードの値に適応する関数$mapping$を考えます。
```C++
struct vtype{ modint998244353 a, b; }; /* 演算を載せる構造体 */
using S = modint998244353; /* val の形 */
using F = vtype; /* lazyの形 */
/* 上位のlazy(f)を1つ子のval(x)に伝搬させる演算。ax + b,valにしたい */
S mapping(F f, S x){ return (S)f.a * x + f.b ; }
```

Lazyを伝搬する関数$composition$は次の通りとなります。ここで、f,gは可換ではなく、親fを子gに伝えていることに注意してください。
```C++
/* 子gに親fを伝える。(f,g) は f(g(x))*/
// f.a, f.b, g.a, g.bがそれぞれC,D,A,Bに対応します。A,B,C,Dに対応しないことを注意してください。
F composition(F f, F g){ return F{f.a * g.a, f.a * g.b + f.b }; }
```

LazySegtreeでは範囲内のノードにLazyを伝搬して値を更新します。ノード自身の初期値と演算に関する単位元が必要になります。
```C++
/* 区間, prod: 使わないのでなんでもいい */
auto op = [](S x, S y){ return x+y; };

/* valの初期値 = 0 */
auto e = []{ return (S)0; };

/* lazyを下にmappingで伝搬させても、「valを変更しないよう」なF
 * ax + bのcomposition(単位元,y)になるので {1,0}とすれば{1 * y.a, 0 * 1 + y.b } = y */
F id(){ return (F){1, 0}; }
```
コメントの通りですが、Fの単位元とは`伝搬して子のvalを変更しないようなF`であり、子のlazyを変更しないではないことに注意します。

# 実装

```C++
struct vtype{ /* 乗せるタイプ */
    modint998244353 a;
    modint998244353 b;
};
using S = modint998244353; /* val の形 */
using F = vtype; /* lazyの形 */
auto op = [](S x, S y){ return x+y; };
auto e = []{ return (S)0; };
S mapping(F f, S x){ return (S)f.a * x + f.b ; }
F composition(F f, F g){ return F{f.a * g.a, f.a * g.b + f.b }; }
y.a, 0 * 1 + y.b } = y */
F id(){ return (F){1, 0}; }
int main(){
    int n, m; cin >> n >> m;
    std::vector<S> v(n);
    REP(i, n) {
        int x; cin >> x;
        v.at(i) = x;
    }

    atcoder::lazy_segtree<S, op, e, F, mapping, composition, id> seg(v);
    REP(i, m){
        int l, r, x;
        cin >> l >> r >> x;
        l--; r--;
        modint998244353 cnt = r - l + 1;
        seg.apply(l, r+1, F{ (cnt-1) / cnt, (modint998244353)x / cnt });
    }

    REP(i, n){
        cout << seg.get(i).val() << " ";
    }
    cout << endl;

}
```

https://atcoder.jp/contests/abc332/submissions/48455557
docker scout quickview で Docker イメージの脆弱性情報を取得

# はじめに
この記事では、Docker CLI のひとつである ```docker scout quickview``` の概要と実行例を確認します。

https://docs.docker.com/reference/cli/docker/scout/quickview/

# 概要
```docker scout quickview``` は、Docker イメージの概要を表示します。概要にはイメージの脆弱性情報などが含まれます。

# 実行例
実際に ```docker scout quickview``` を実行してみます。

:::note
開発環境は以下の通りです。
- Windows11
- Docker 24.0.7 => 25.0.3
- Docker Scout 1.2.0 => 1.5.0
:::

実行コマンドは以下の通りです。

```powershell
docker scout quickview
```

実行すると、以下の結果が表示されました。

```
    i New version 1.5.1 available (installed version is 1.2.0) at https://github.com/docker/scout-cli
Log in with your Docker ID or email address to use docker scout.

If you don't have a Docker ID, head over to https://hub.docker.com to
create one. You can log in with your password or a Personal Access Token (PAT)
by running docker login.
Using a limited-scope PAT grants better security and is required for organizations
using SSO. Learn more at https://docs.docker.com/go/access-tokens/

You can also log in using Docker Desktop.
```

Docker Scout をアップデート後、改めて ```docker scout quickview``` を実行すると、以下の結果が表示されました。


```
    i New version 1.5.1 available (installed version is 1.5.0) at https://github.com/docker/scout-cli
    v Image stored for indexing  
    v Indexed 886 packages

  Target             │  local://nest-rest-api:latest  │    0C     0H     0M     0L   
    digest           │  206a6c9c8fed                  │
  Base image         │  node:21-alpine3.18            │    0C     0H     0M     0L   
  Updated base image │  node:21-alpine                │    0C     0H     0M     0L   
                     │                                │

What's Next?
  View base image update recommendations → docker scout recommendations local://nest-rest-api:latest
  Include policy results in your quickview by supplying an organization → docker scout quickview local://nest-rest-api:latest --org <organization>
```

# 参考
- [docker scout quickview](https://docs.docker.com/reference/cli/docker/scout/quickview/)
blas

WindowsでOpenBLASをビルドする手順は次の通りです：

1. **MSYS2のインストール**:
   最初に、MSYS2をインストールします。MSYS2は、WindowsでUnix風の環境を提供するツールです。公式ウェブサイト（https://www.msys2.org/）からインストーラーをダウンロードし、インストールします。

2. **MSYS2の更新**:
   インストールが完了したら、MSYS2の更新を行います。MSYS2のシェルを開き、以下のコマンドを実行します：
   ```
   pacman -Syu
   ```

3. **必要なパッケージのインストール**:
   OpenBLASのビルドに必要なパッケージをインストールします。MSYS2のシェルで以下のコマンドを実行します：
   ```
   pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-make
   ```

4. **OpenBLASのソースコードを取得する**:
   OpenBLASの公式リポジトリ（https://github.com/xianyi/OpenBLAS）からソースコードを取得します。ブラウザを使用してzipファイルをダウンロードするか、MSYS2のシェルでgitを使用してリポジトリをクローンします。

5. **ビルド**:
   MSYS2のシェルでOpenBLASのソースディレクトリに移動し、ビルドを行います。ビルドコマンドは以下の通りです：
   ```
   make USE_THREAD=0
   ```

   `USE_THREAD`オプションは、スレッドを使用するかどうかを指定します。必要に応じて適切なオプションを指定してください。

6. **ビルドの完了**:
   ビルドが正常に完了すると、OpenBLASのライブラリファイル（.dllや.libファイル）が生成されます。これらのファイルは、Windows向けのプロジェクトに組み込む準備が整いました。

これらの手順に従うことで、WindowsでOpenBLASをビルドすることができます。
cblas_scopy

cblas_scopy関数は、1つのベクトルを別のベクトルにコピーする関数です。これをBLASの関数を使わずに実装するには、次のようなC言語のコードを書くことができます。

```c
void my_scopy(const int n, const float *x, const int incx, float *y, const int incy) {
    int i;
    if (incx == 1 && incy == 1) {
        for (i = 0; i < n; ++i) {
            y[i] = x[i];
        }
    } else {
        int ix = (incx > 0) ? 0 : (1 - n) * incx;
        int iy = (incy > 0) ? 0 : (1 - n) * incy;
        for (i = 0; i < n; ++i) {
            y[iy] = x[ix];
            ix += incx;
            iy += incy;
        }
    }
}
```

この関数は、引数としてコピー元のベクトルx、コピー先のベクトルy、および要素数nを取ります。incxとincyはストライド（要素間のスキップ）を表します。incxとincyが1の場合、連続するメモリ領域にデータが配置されていると仮定して、単純なループで要素をコピーします。それ以外の場合は、incxおよびincyのストライドを考慮してループを実行します。
パッケージのまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


+ [管理パッケージ](https://qiita.com/Keiji_otsubo/items/99d9e6bb851f28f23348)

# Omnistudio

+ [Omnistudio コンポーネントを含むロック解除パッケージ](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NF4rn)

:::note
これについてフォローアップします。今日現在、OmniStudio コンポーネントを他のメタデータとともに完全に検証された 2GP ロック解除パッケージに正常にパッケージ化できました。今では他のメタデータと同様に動作するようです。
:::
ファイルの拡張子のまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)



# D

+ [Data Import Wizardのまとめ](https://qiita.com/Keiji_otsubo/items/c90bac717729f41bb72c)


# S

+ [STF ファイルを使用してフィールドの翻訳を CRM に一括でインポート](https://qiita.com/Keiji_otsubo/items/387643772b4fe79c51eb)
Javaで文字列を出力してみよう!

# 文字列の出力の実装
### ■ 前提条件
Javaの環境構築が完了していること。
まだの方は[こちらの記事](https://qiita.com/git2024/items/101bfb6b40d0c9fcc882)を参考に環境構築を行ってくだい。
### ■ 手順１
メモ帳などのエディタに、以下のコードをそのままコピペで貼り付けてください。
```java:画面に文字列を出力するサンプルコード
class Sample1 {
    public static void main(String[] args) {
        System.out.println("ようこそJavaへ!");
        System.out.println("Javaをはじめましょう!");
    }
}
```
### ■ 手順２
名前を付けて保存します。
クラス名.java（今回は"Sample1.java"）の形式です。
文字コードはUTF-8を指定しています。
保存先はどこでも問題ありません。
例として、"C:\test"　のフォルダに保存しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/dc0b52b7-9f32-56d5-58de-baaa504d0143.png)
#### :point_up:マメ知識
print()とprintln()
今回使用したのはprintln()でしたが、似た形のものにprint()があります。
この二つの違いは、末尾に改行があるか否かです。
println()では、最後に改行されます。
ln は line の略で、「出力された文字列で一行にする」と私は覚えています。
# 実際にプログラムを実行してみましょう。
### ■ 手順１
ソースコードをコンパイル(※)します。

コマンドプロンプトを開きます。
タスクバーにある検索ボックスで"cmd"と入力すると開くことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/d3f07a33-781b-0272-3fa3-5f3f2ef826e6.png)
#### :point_up:(※)コンパイルとは
プログラムをコンピューターが読み取れる内容に翻訳していると考えてください。
私たちが書いたプログラムは人間が読み書きするもので、コンピューターはそれを直接読むことは出来ません。
ですので、今から行うコンパイルの作業でクラスファイルと言うものを作成し、それをコンピューターに読んでもらい、プログラムを実行してもらうことになります。
### ■ 手順２
実行したいコードのあるディレクトリ名を指定します。
cd ディレクトリ名（今回は"cd C:\test"）の形式です。
（cd は、Change Directry の略です。）
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/563263ef-e1f6-30dc-444a-30c3cf597ffc.png)
### ■ 手順３
実行したいファイルをコンパイルします。
javadoc ファイル名（今回は”javadoc Sample1.java”）の形式です。
※　必ず、拡張子（.java）まで含めてください。
#### ・確認
コンパイルが正常に進んでいる場合は、フォルダに.classファイルが生成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/7503a096-1e29-557c-134e-c69da7511451.png)

### ■ 手順４
最後に、実行したいコードを宣言します。
java ファイル名（今回は"java Sample1"）の形式です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565927/f17134bc-5e27-610b-3d7c-2dbc2c7360e7.png)

最初に作成したコードに従い、文字列が出力されました。
以上がJavaでも文字列の出力方法です!
ChromeのDevTools（F12）で日常的に使うテクニック7選

# 概要

ChromeのDevTools（F12）の機能の中で私が日常的に使うテクニックを7つ紹介したいと思います。

フロントエンドの開発・デバッグ以外にも、他人が作成したWEBページの内容を確認したり、デザイナーが画面UIの検討などに役立ちます。


:::note warn
スクショの日付が違うため、説明用の画像のUIに差異があると思われますが、ご自身の環境と見比べて確認していただければと思います。
:::

# 起動方法

「**F12**キー」または「ブラウザ上で右クリックし**検証**」で下記のような画面が開きます。これが**DevTools**です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/9bbaa41b-2642-5566-ddd0-b11cafe864aa.png)

# よく使うテクニック


## 1. HTMLを変更

DevToolsの*要素タブ*を利用し、「開いたWEBページのHTMLが構成内容を確認」や「画面表示しているHTMLを操作」が可能です。

Qiitaのヘッダーの「投稿する」ボタンをもとに「更新する」と「削除する」のボタンに変えてみました。（一時的な変更なので画面をリロード（F5）すると元に戻ります）

![Animation4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/8d8cd1d8-0e67-31e8-b444-89cf3c4b5b98.gif)

一時的に修正してスクショをしたり、UIの検討などに役立ちます。

## 2. スタイルの変更

画面のスタイルについても同様に修正することができます。

`elememt.style`はインライン、idやclassといった`セレクタ`にスタイルを定義することも可能です。`:hov`から擬似クラスのスタイルを検証することもできます。

![Animation4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/d217e849-26f0-5d1e-22ad-b7537c154ff8.gif)

## 3. スマホのエミュレータ

スマホやタブレットがなくても画面サイズごとの確認ができます。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/3e37d27c-1689-f896-8410-108c8f8b4096.gif)

## 4. JavaScriptの実行

画面上で定義されているメソッドを実行することが可能ですが、私の場合は、高性能なエディタとして使っています。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/8a0f95c9-eecd-fd66-0f10-3380a08405c3.gif)

## 5. Javascript変数の監視

目のアイコンから変数の中身を監視することができます。画像では、コンソール上で変数を操作していますが、画面上を操作したときに正常に値が入っているかを確認するときに役立ちます。


![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/74928e38-2d31-297f-be84-f72bd2a385aa.gif)

## 6. 読み込んだファイルの確認

Networkタブから、画面上で読み込んだファイルを確認できます。「ステータスコード」や「ファイルの中身」や「ファイルのURL」をよく確認します。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/22d8712b-b9de-7765-89f8-6bac7defa2e6.gif)

## 7. 画面のスクショ取得

全画面のスクショを取るには以下の操作をします。

- 「Ctrl] + 「Shift」+ 「p」でコマンドパレットを開く
- 「Capture full screenshot」を選択しスクショを保存

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/660fce8a-80f4-47d1-4fdb-7820a046f51a.gif)

「全画面」スクショのほかに「範囲指定」や「画面表示されてる部分」のスクショも選べます。

# 終わりに

今回は、ChormeのDevTools（F12）で私が日常的に使うテクニックを7つに絞って紹介しました。

紹介した機能以外にも、便利な機能が沢山あるので機会があればまた紹介したいと思います。

ここまで読んでいただきありがとうございました。
Page activation not completed　での英文での回答例



+ [Page activation not completed](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YwSgb)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1d5761ce-60ef-a6f1-cca4-a1bd96328346.png)


:::note
Open the page & click on Activate -> Assign to App & profiles or set as Org default whatever requested in a challenge.

ページを開いて [有効化] -> [アプリとプロファイルに割り当て] をクリックするか、チャレンジで要求されたものを組織のデフォルトとして設定します。
:::
＜1: JavaScriptとは＞Progate学習修了者がJavaScriptPrimerを読んだら

# はじめに：
こんにちは。Satoです。
本稿では、Progate学習を修了した段階のプログラミング学習者が、JavaScriptPrimer（以下、Primerとします）を学習するとどうなるのかを記録したものです。基本的には自身のアウトプットを主眼に置いていますが、初学者が躓いた点とその解決方法も記載するつもりです。良かったら参考にしてみてください。
# 学習事項：
## JavaScriptとECMAScript
・ECMAScript…どの実行環境（ブラウザ・サーバーなど）でも共通する仕様のこと
　補足：Ecma Internationalという団体が標準化している仕様らしい。
 ・JavaScript…ECMAScript＋実行環境の固有機能を含んだものを指す。

## 予約語とは：
予約語とは、constやletなどのように変数名を宣言できない、特別な意味を有するキーワードのこと。つまり、↓のような変数名（const）はダメだよーというお話。
```
//ダメな変数名の事例
const const = "定数";
```

## 文はセミコロンで区切る：
セミコロンはちゃんと書こう。Progateだとセミコロンを忘れていても、作動していたけどバグの原因になるらしいので、良くない。

## strict mode：
コードを書くときは、このモードで書いた方が無難。strict modeにすることで、古く安全ではないコードを禁止してくれている。

## 実行コンテキスト：ScriptとModule
### 実行コンテキストとは（Primerには記載なし）
「[JavaScriptの実行コンテキストを理解する](https://qiita.com/cotton11aq/items/091c983e9034e22c145c)」によると、以下の通り。

>### 実行コンテキストとは
>コードを実行する際の文脈・状況
>→コードがどのような状況で実行されているのかということ
>
>ブラウザ上でコードを実行した場合にはwindowオブジェクトとthisがJavaScriptエンジンによって準備されます。
>コードが実行されている状態によってコンテキストが変わってくるので、これらを含めたものを実行コンテキストと表現します。

・Script…デフォルトの実行コンテキスト。デフォルトは、strict modeではない。
・Module…JavaScriptをモジュールとして実行するためのもので、デフォルトがstrict mode。
　※モジュールについては、別の回で解説するとのこと。

 # 躓いた点：
 日経クロステックのこちらの記事によると、セミコロン（;）を書かなくても大丈夫らしいです。結局セミコロンが必要なのかどうかが気になりました。（書いた方が良いとは思いますが…）
 https://xtech.nikkei.com/atcl/nxt/column/18/02780/032100005/
# 参考文献
azu・Suguru Inatomi「第一部: 基本文法　JavaScriptとは」『JavaScript Primer』
https://jsprimer.net/basic/introduction/
@cotton11aq (Hagure)「JavaScriptの実行コンテキストを理解する」
https://qiita.com/cotton11aq/items/091c983e9034e22c145c
【UiPath】ファイル名重複時の連番追加について

# はじめに
ロボでは処理完了後に処理ファイルを指定されたフォルダに格納するケースが多々あります。
業務内容によっては1日に大量のファイルを処理するケースがあります。
その際に対応するケースとして、1ロボを長時間実行または複数台ロボを並行実行する方法があります。
今回はファイル名重複時、末尾に連番追加した処理をナレッジとして残します。

# この記事の対象者
- UiPath初学者
- UiPath Studioロボ実行にて、ファイル名重複時の連番追加を実装したい方

# 目次
1. 開発環境紹介
1. 処理要件確認
1. 実装
1. 解説


# 開発環境紹介
- OS：Windows11
- 開発ツール：UiPath Studio
- バージョン：2023.10.0
- ライセンス：Community License
- モダン デザイン エクスペリエンス：いいえ
- Microsoft Excel：2310

:::note warn
- 本投稿の開発環境になっております
- バージョンによっては画面が一部異なる可能性はございます
:::

### UiPath 依存関係
| パッケージ名 | バージョン |
|:--|:--|
| UiPath.Excel.Activities | 2.22.2 |
| UiPath.Mail.Activities | 1.21.1 |
| UiPath.System.Activities | 23.10.2 |
| UiPath.Testing.Activities | 23.10.0 |
| UiPath.UIAutomation.Activities | 23.10.3 |

# 処理要件確認
- ロボ処理完了後にファイル名の重複があった場合、ファイル名の末尾に連番を追加してリネームを行う

# 実装
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524399/2849269d-ec07-9fa2-4ea7-1afc7cfa39f9.png)

### 「コードを呼び出し」アクティビティを利用したDictionaryの設定値 (コードを呼び出し：処理データセット)
~~~vb:コードを呼び出し：処理データセット　
'====================
'処理概要：ファイル操作情報をセット

'IN：
'OUT：なし
  'OutDicInputItem：ファイル操作情報
    'KEY：インプットファイルパス
    'KEY：ファイル名
    'KEY：ファイル拡張子
    'KEY：処理完了格納パス
'IO：なし
'====================

OutDicInputItem = New Dictionary(Of String,String)

'dicInputItem
OutDicInputItem("インプットファイルパス") = "C:\RPA\UiPath\入力"
OutDicInputItem("ファイル名") = "処理台帳"
OutDicInputItem("ファイル拡張子") = ".xlsx"
OutDicInputItem("処理完了格納パス") = "C:\RPA\UiPath\出力\FileRename\処理完了"
~~~

### コードを呼び出し：処理データセット　 「呼び出されたコード引数」
| Name | Direction | Type | Value |
|:--|:--|:--|:--|
| OutDicInputItem | 出力 | Dictionary<String,String> | dicInputItem |

### 本ロボで利用する変数情報
| 名前 | 変数の型 | スコープ | 規定 | 注釈 |
|:--|:--|:--|:--|:--|
| dicInputItem | Dictionary<String,String> | MoveResultFile_DuplicationCheck | | ファイル操作情報　|
| inputFilePath | String | MoveResultFile_DuplicationCheck | | 移動前ファイルパス　|
| moveFileCount | Int32 | MoveResultFile_DuplicationCheck | | ファイル番号　|
| outputFilePath | String | MoveResultFile_DuplicationCheck | | 移動後ファイルパス　|

# 解説
移動先のファイル名を取得後、移動先に既に該当するファイルが存在するかチェックを行います。
移動先のファイル名が存在しない場合、ファイル名に連番を追加して存在有無を繰り返しチェックを行うことにより、移動先のファイル名の設定を行います。
【メリット】
・1日に大量のインプットファイルの処理を行う場合、ファイル名重複を避けて移動する場合に活用できる
【デメリット】
・格納先のフォルダ内にファイルが既に処理済のファイルが大量に格納されている場合、リネームするためのループチェックに時間がかかる
※対策として、ロボ実行日フォルダ(yyyyMMdd)を作成してアウトプット先にすることにより対処可能となる。

### 実装補足
~~~vb:代入：移動前ファイルパス
Path.Combine(dicInputItem("インプットファイルパス"),dicInputItem("ファイル名") & dicInputItem("ファイル拡張子"))
~~~

~~~vb:代入：移動後ファイルパス
Path.Combine(dicInputItem("処理完了格納パス") , dicInputItem("ファイル名") & dicInputItem("ファイル拡張子"))
~~~

~~~vb:代入：移動後ファイルパス+1
Path.Combine(dicInputItem("処理完了格納パス") , dicInputItem("ファイル名") & "_" & moveFileCount.ToString & dicInputItem("ファイル拡張子"))
~~~

# おわりに
今回は、[【UiPath】ファイルリネーム実装について](https://qiita.com/OKiNA_RPA/items/1b5739e1438ad8063670)の中の<font color="red">リネームパターン3について</font>、不完全な部分を修正した形のリネーム方法をまとめました。今回のケースは過去の実務案件で2件要望がありましたが、どのロボも長時間稼働および複数ファイルを処理する際に利用されていました。RPA開発初心者でファイル名に連番を追加したい方向けに、参考になれば幸いです。

# 参考サイト
- [Path.Combine メソッド](https://learn.microsoft.com/ja-jp/dotnet/api/system.io.path.combine?view=net-8.0)
【Laravel】GitHubのPush時にPHP CodeSnifferでテストする

# はじめに
こんにちは、プログラミングを始めて約3年のエンジニアのkeitaMaxです。

前回の記事

https://qiita.com/keitaMax/items/4196188be54f46cbd232


今回は前回作成したPHP CodeSnifferをGitHubActionsでGitHubにPull Requestを出した時に、テストできるようにしようと思います。



# GitHubActionsを作成

以下のように`phpcs.yml`ファイルを`.github/workflows`フォルダ配下に作成しました。

```yml:phpcs.yml
name: phpcs

on: [pull_request]

jobs:
  phpcs:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: ./src
    steps:
      - uses: actions/checkout@v2
      - name: docker-compose up
        run: |
          # docker-compose build
          docker-compose up -d
      - name: composer install
        run: |
          docker compose exec app composer install
      - name: Laravel Settings
        run: |
          docker-compose exec -T app cp .env.example .env
      - name: composer phpcs .
        run: |
          docker compose exec app composer phpcs .
```

Dockerを立ち上げて、その中でテストできるようにしました。


# GitGubにPushする

GitHubにPushすると以下のようにテストが成功していることが確認できました。

![スクリーンショット 2024-03-17 11.56.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715123/d9d6ae35-c8a5-437d-2342-e0e071772515.png)

# テストを失敗させる

さいごに、ちゃんと動いているかどうかを確かめるために、テストを失敗させようと思います。

```php
public function count(): int
```
このような記述があるので、

```php
public function count():int
```
このように、スペースを消してPushしてみます。

![スクリーンショット 2024-03-17 12.03.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715123/f6724664-29a2-457b-c590-25b70f1378c0.png)

このようにエラーが出ているのを確認することができたので、正しく動いているのを確認することができました。


# おわりに

GitHubActionsはPush時に自動でテストをやれるのでやっぱいとても便利だなと感じました。

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！
【Excel】適当な数値のデータを作るのって億劫だよね

# はじめに
Excelで検証データを作成する際に、このような条件のときありませんか？

「すべて同じ整数値は検証にならないからだめ」
「だけど現実的な整数値にしなければならない」

んんんしんどい！！！
どうにか手間を省いて、データ生成したいものです。

今回は、ランダムな整数値を生成するExcel関数をご紹介します。
私はSQLのINSERT文を大量に作成するのにExcelとメモ帳を活用しており、[こちらの記事](https://qiita.com/mmm_qiita/items/68e91d05cb82baddfeb4)にてご紹介していますので、よかったら併せてご覧ください:point_up_tone1:

# 使用するExcel関数
"<font color="Red">**RAND関数**</font>"と"<font color="Red">**ROUND関数**</font>"を使用すると実現できます。

```excel
=ROUND(RAND()*3,0)
```
こちらは0~3までの整数をランダムに作る構文です。
関数ごとに分解すると、以下の意味合いになります。

▼ 0~任意の値までの小数含む乱数を生成
```
=RAND()*値
```

▼ 整数値に丸める
　※桁数を"0"にすると小数点以下第一位が四捨五入される
```
=ROUND(値,桁数)
```

### ■ 社員の有給休暇取得数をランダムに作成
以下例は、社員の有給休暇取得数を0~3までの整数をランダムに割り当てています。
関数をそのまま各レコードにコピペするだけいいので、とても簡単です。
![スクリーンショット 2024-03-16 144504.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/c5f32434-1166-716e-0bdf-b22db1a12748.png)

整数値でなく小数点第〇位の数値を生成したい場合でも、ROUND関数の桁数を任意の値にすると可能になります。

膨大な数となると、手打ちでぽちぽちするのはかなり非現実的な作業なんですよね。
実際のデータ（生データ）を検証時に使用できたら楽なのですが、なかなか手に入りません。

:::note warn
別のカラムを変更したりすると、自動的にRAND関数のカラムの値も変化してしまいます。
値を確定したい場合は、コピー＋値貼り付けで保存しておくことをおすすめします。
:::

# 最後に
今回は、適当な整数値を生成するExcel関数をご紹介いたしました。
地道な作業を効率化できると他の作業に時間が割けるので、このような関数は本当にありがたいですね。

最後までお読みいただき、ありがとうございました:relieved:
CloudFunctionのonCallでRegionを指定する


## はじめに
Cloud FunctionsをそのままFirebase CLIからデプロイすると、デフォルトのリージョン`us-central1`に設定されてしまいます。
![スクリーンショット 2024-03-08 7.10.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669888/cb68f48c-14fb-ec2b-ffc5-80d20b136211.png)

また、デプロイしてしまうとリージョンが変更できないので、デプロイする前に設定しなければなりません。

## 書き方
Cloud Functionsの第2世代が公開されてますが、第1世代と第2世代では設定方法が変更されています。
以下、typescriptで作成しています。

`第1世代`
```
import * as functions from 'firebase-functions'

export const testFunction = functions 
  .region('asia-northeast1')  
  .https  
  .onCall((req) => {
    //　onCallの処理
  })

```


`第2世代`
```
import * as functions from 'firebase-functions/v2'

export const testfunction = functions
  .https
  .onCall({region: 'asia-northeast1'}() => {
    // onCallの処理
  })
```

- 関数名が第2世代では大文字が使えず、小文字だけになった。
- リージョンを指定する場所  
が変更されています。（これは`onRequest`も同様です）

## 結果

![スクリーンショット 2024-03-08 7.08.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669888/e8759c2e-c9d5-2398-ec08-0565d6065ba3.png)

[公式ドキュメント](https://firebase.google.com/docs/functions/beta/manage-functions?hl=ja)にも設定方法が載っています。


参考
https://zenn.dev/nananaoto/articles/3efc945c845910

https://qiita.com/ygoodspeed/items/1fbd595d0c816231f9c0
重要なテストケースは確保しつつテスト工数を減らす方法

※自分の学習整理用として作成しています。
※なんとなくの理解を目指しているので、難しいことや細かいことは省いています。

## 実験計画法
品質を維持しつつ効率的にテストを実施するための方法論のこと。
簡単に言うと、少ない試験回数で高精度の結果情報を効率よく得よう、というもの。

適用できるできない場合もあるし、色々な都合で数をこなさなければいけない場合もあるので、使う使わないの判断（使える使えないの確認）は必要。

また、実験計画法と言っても手法はたくさんあって・・・
* 2水準要因計画
* 3水準要因計画
* 中心複合計画
* プラケットバーマン計画
* ボックスベンゲン計画
* 直交表
* ランダム
・
・
・

今回は直交表についてまとめます。

## 直交表とは
全ての因子から任意の2つを取り出して、そこでパターンが網羅できていればOK、というものです。

例えば、3因子2水準の場合
* 3因子・・・社員番号、管理コード、得点
* 2水準・・・因子の選択肢が2つ（今回は”ある””ない”の2つにしています）

パターンを網羅させようとすると、2×2×2=8パターンになる
（今回は触れませんが、たぶんこれが2水準要因計画なんだと・・・）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/8b0ecc74-23f9-6a2e-8393-4e747d9fa16f.png)



ここで登場するのが・・・
## L4直交表
任意の2つの因子のパターンが網羅されていればOK、というのは以下の状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/e699bfe7-4480-98b2-99af-33cbdff031e4.png)
つまり、社員番号・管理コード、社員番号・得点、管理コード・得点で見た時に、それぞれでパターン網羅されていればOK、ということ。

それを踏まえてL4直交表を作成すると、こんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/dff027e7-8dc1-b8cb-912f-df05c48ca426.png)


え、網羅しているやつから直交表にはめるのに時間かかるじゃん、と思いましたが
型は色々と用意されているので、簡単にできそう。
2水準用だと、L4、L8、L12・・・など
3水準用だと、L9、L27だったり、2水準と3水準の混合系とかもあるみたいです。

https://www.monodukuri.com/gihou/article/74

L9直交表だと、もともと4因子3水準で3×3×3×3=81パターンあるものを9パターンにできるので工数はかなり削減できそう。
一方で、L4直交表を例にすると、”ない””ない””ない”パターンが無かったりするので、落とせないパターンは追加でやる必要があったり、そこの判断は必要ですね。

## さいごに
知っていると知っていないでは選択肢の数が変わってくるので、こういうのどんどん吸収していきたいです。
また、出ているものを評価するだけじゃなく、出ていないものが何か、本当にこれでいいんだっけ、を考えられる力をもっとつけたいなと改めて感じました！