OmniAICreator/Qiita-1.07M huggingface dataset:
ブラウザにおけるJavaScirptの文字コードを指定する方法

# 背景
WEBシステム構築をしていたところ、Google Chromeブラウザに表示される文字が文字化けが生じました。
原因は単に、UTF-8で記述されていたscriptを読み込んでいる元のHTMLのmetaタグでの文字コード指定が、'uft-8'というタイポにより、ブラウザがscriptの文字コードをUTF-8ではない異なる文字コードとして認識されたためでした。
(当該部分を修正した結果、文字化けは収まりました。）

シーケンス図
```mermaid
sequenceDiagram
  actor U as ブラウザ
  participant S as WEBサーバー

  U->>+S: HTTP GET（HTMLの要求）
  S-->>-U: HTML (HTML応答)
  
  U->>U: レンダリング処理

  U->>+S: HTTP GET（スクリプトの要求）
  S-->>-U: JavaScript（スクリプト応答）

  U->>U: スクリプト実行(文字化け発生)
```

```html:index.html
<!DOCTYPE html>
<html>
<head>
    <title>Sample Page</title>
    <script src="/static/js/sample.js" charset="uft-8"></script>
</head>
<body>
    <input type="button" value="クリックしてください" onclick="myFunction()" />
    <div id="result"></div>
</body>
</html>
```

```javascript:sample.js
function myFunction() {
    document.getElementById('result').innerHTML = 'ボタンが押されました';
}
```

# 調べたこと
スクリプトの文字コードを指定する方法は3つほどあった。

案1,scriptタグにcharsetをつける
案2,scriptタグが記載されているHTML側の<meta charset=>をつける
案3,scriptタグのレスポンスのヘッダのConten-Type:にcharset=を付与し、文字コードを認識させる。（WEBサーバ側のmimeタイプ毎設定で、charsetをセット固定化等が必要。）

今回は案1で実装し、タイポを修正した。

# 気になっていること

 [HTML Living standard](https://html.spec.whatwg.org/#scriptingLanguages) を見たところ、
> For example, scripts with their type attribute set to "text/javascript; charset=utf-8" will not be evaluated, even though that is a valid JavaScript MIME type when parsed.
と記載があるので、案1,は将来的に廃止になるかも。

案2,は、scriptタグを記載しているHTMLの文字コードとJavaScriptの文字コードが一致していることが条件。
案3,については、同サーバ内にあるJavaScriptが文字コードの一致が必要になる。基本UTF-8だと思うけど、個別JavaScriptを実装する場合は案1しかないのかな。（まだ調べられてない。）

あとは、案4として文字コードをそもそも、明示的に指定せず、ブラウザのデフォルトに従う方法もあると考えたが、多種多様のブラウザのデフォルトの仕様に任せるのも気になる。
そもそも、デフォルトのエンコードって何だろうと調べたが、今日はここまで。。。悩まれている先人がいらっしゃったので記録しておく。

https://crieit.net/posts/chrome-UTF-8-5f0ef9d3db43f
【SwiftUI】輝度が低い色ほど透明度を上げる

# はじめに
`luminanceToAlpha`という機能を発見して、使ったことがなかったので調べてみました。
簡単にいうと、Viewの色が明るければ明るいほど、Viewが透明になるよって機能です。

iOS13から使えるようですが、あまり登場シーンがないので存在を知りませんでした。

# サンプルアプリ
![Simulator Screen Recording - iPhone 15 - 2023-12-23 at 22.42.10.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/096d38b4-ad6a-2a0f-28da-7e51c617126e.gif)

# 実装
```swift
import SwiftUI

struct ContentView: View {
    @State private var selectedColor = Color.black

    var body: some View {
        VStack {
            Rectangle()
                .frame(height: 50)
                .foregroundStyle(selectedColor)
                .border(.black)
                .background {
                    Text("これが見えたら透過してるよ").foregroundStyle(selectedColor)
                }
            
            Rectangle()
                .frame(height: 50)
                .foregroundStyle(selectedColor)
                .luminanceToAlpha()
                .border(.black)
                .background {
                    Text("これが見えたら透過してるよ").foregroundStyle(selectedColor)
                }
            
            ColorPicker("", selection: $selectedColor)
        }
        .padding(20)
    }
}
```

# 活用事例を考えてみる
使われないのは可哀想なので活用できる場面を考えてみる


...


思いつかない

# おわり
GitHubでどんな使われ方をしているのか見てみたら`mask`と一緒に使われているのが多かった気がします。

# 公式ドキュメント
https://developer.apple.com/documentation/swiftui/view/luminancetoalpha()
AWS CopilotでARMのFargateを使う場合にPipelineで設定が必要なこと

この記事は **[リンクバルアドベントカレンダー2023](https://qiita.com/advent-calendar/2023/linkbal)** の18日目の記事です。

3日連続[AWS Copilot](https://aws.github.io/copilot-cli/ja/)の記事です！

16日

https://qiita.com/kinchiki/items/476ed1627b182e7dbc34

17日

https://qiita.com/kinchiki/items/09173f9b76381d445b33


## はじめに
コスト削減やサステナビリティで電気代削減のため？に、AWS CopilotのFargateのアーキテクチャをARMにしたい方、いいですね！

しかし、Serviceの `manifest.yml` で `platform: linux/arm64` にするだけではだめです。
より正確には、Pipelineを使う場合はだめです。

CopilotのPipelineは、自動でARMに対応してくれるなんてことはありません(v1.28くらいの時点では)。

## 対応が必要なこと
以下の2つが必要です。

1. pipelineの `manifest.yml` で、CodeBuildのイメージにARMのイメージを指定する
1. `copilot/pipelines/xxx/buildspec.yml` のcopilotコマンドのインストールは、ARM版のURLを指定する

## pipelineの `manifest.yml` で、CodeBuildのイメージにARMのイメージを指定する
`platform: linux/arm64` を指定した場合、ARMアーキテクチャでDocker buildする必要があります。
※それ以外の方法もあります。Docker Buildxを使うなど。

pipelineの `manifest.yml` は `build.image` という項目を設定できます。

公式ドキュメント

https://aws.github.io/copilot-cli/ja/docs/manifest/pipeline/#build-image

v1.32.1時点では、次のように書かれています。

> CodeBuild のビルドプロジェクトで利用する Docker イメージの URI。aws/codebuild/amazonlinux2-x86_64-standard:4.0 がデフォルトで利用されます。

`x86_64` だと！？

ここがハマりどころで、この項目に気づかない限り、pipelienのbuild stageが一生失敗します。

次のように `manifest.yml` を編集しましょう。

```yaml:copilot/pipelines/xxx/manifest.yml
# 略
build:
  image: aws/codebuild/amazonlinux2-aarch64-standard:3.0 # ここでARMのイメージを指定する。バージョンは必要なランタイムに応じて変えてください。
# 略
```

指定できる値はこちらをご覧ください。

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-available.html

##  `copilot/pipelines/xxx/buildspec.yml` のcopilotコマンドのインストールは、ARM版のURLを指定する
CodeBuildをARMにしたら、そこで動くバイナリもARM版にする必要があります。

`copilot/pipelines/xxx/buildspec.yml` は、自動生成のものだとx86版のcopilotコマンドをインストールするようになっています。
そこを、ARM版に変えましょう。

```yaml:buildspec.yml
# 略
phases:
  install:
    runtime-versions:
      # 略
    commands:
      - echo "cd into $CODEBUILD_SRC_DIR"
      - cd $CODEBUILD_SRC_DIR
      # Download the copilot linux binary.
      
      - wget -q https://ecs-cli-v2-release.s3.amazonaws.com/copilot-linux-arm64 -O copilot-linux
      - chmod +x ./copilot-linux
```

ここまでやれば、CopilotのPipelineが成功します！

## おわりに
おわり
その変数、メモリにどう置かれているか意識してますか？

※修正前があまりにもひどかったため、指摘事項の反映もかねて書き直しました。以前の記事にコメントくださった方すいません。

# はじまり
MIDIファイルを読み込み、memcpy()でデータを変数にコピー。
しかしなぜか値が合わない。デバッガでメモリを覗くと順番が変…。
そういえばエンディアンがどうとか聞いたな…。

# 環境

- windows11(intel core i CPUを使用)

# 検証コード
```C
#include<cstdio>
#include<cstdint>


int main(void) {
	uint32_t num = 0x12345678;

	uint8_t* p_num =(uint8_t*)&num;

	printf("uint32_t*:%p 値%#x\n", &num, num);

	for (int i = 0; i < 4; i++) {
		printf("uint8_t* :%p 値%#x\n", &p_num[i], p_num[i]);
	}
}
```

```
<出力>
uint32_t*  :000000E158AFF934 値0x12345678
uint8_t[0] :000000E158AFF934 値0x78
uint8_t[1] :000000E158AFF935 値0x56
uint8_t[2] :000000E158AFF936 値0x34
uint8_t[3] :000000E158AFF937 値0x12
```

**8bitづつ区切って下位ビットから順に置かれている。**
図にするとこんな感じ。~~てっきり上位ビットから置かれているもんだと思ってた。~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2944355/c4a11b7f-d511-c171-78e3-e07e7ebdae9e.png)

# 原因
MIDIファイル(ビッグエンディアン)のファイルから、複数バイトのデータを何も考えずに`memcpy()`していたこと。
使用している環境はリトルエンディアンのため、意図しない値となる。(例えば、MIDIファイルから読み取った`0x12`,`0x34`というデータを`uint16_t型`の変数にそのまま`memcpy()`すると、0x3412となる。)

# 対策
こんな関数をつくってみた。おそらくもっと良い方法がある。
```C
/// <summary>
/// エンディアン変換
/// </summary>
/// <typeparam name="TYPE"></typeparam>
/// <param name="data">変換する変数のポインタ(変換先の型のポインタでキャストすること)</param>
/// <returns></returns>
template<typename TYPE> _inline endian_change(TYPE* data) {
	TYPE num = 0;
	uint8_t* p_buf = (uint8_t*)data;//uint8_tに戻す
	for (int i = 0; i < sizeof(TYPE); i++) {
		num += p_buf[i] << (8 * (sizeof(TYPE) - 1 - i));
	}
	return num;
}
```

# まとめ

メモリを細かく制御するときはエンディアンを意識しよう

~~ビッグエンディアンに統一してくれないかな~~
誰でも簡単Python環境構築！！

# pythonの環境を構築しよう！
誰でもpythonの環境を構築できるようにブログにまとめます。

## インストーラをダウンロードするサイト
https://www.python.org

まずは、こちらのサイトにアクセスしてインストーラをダウンロードします。
下記の画像を参考にして下さい。

黄色で囲っている箇所をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759758/cd51a90a-4cd0-fa3f-0433-858cd9f115ab.png)

バージョンを選択し、ダウンロードをクリックして下さい。
オススメのバージョンは3.9みたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759758/2f37b0ff-c72a-3942-e7c7-736774b66f7a.png)

こちらを参考にしてください。
https://www.pythonic-exam.com/archives/5911

インストーラをダウンロードしたらダブルクリックで実行をしてください。
下記の画面のように操作を行ってください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759758/4401261c-1c90-98cd-31d7-3cff299771d0.png)

インストールが終了したらバージョンの確認を行います。
versionが表示されたらインストールされています。
```
python --version
```

## VScodeインストール
pythonをインストールしたらコードを実際にコードを書いてみましょう！
まずは、VScodeをインストールします、

インストーラを下記のサイトからダウンロードします。

https://code.visualstudio.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759758/3e6f07a0-515b-ed18-2f68-59a6bf4b6357.png)

自分が使用しているOSを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759758/c552b20c-f9de-06aa-d8c2-6d4bf58be42a.png)

PCにダウンロードされたらインストーラを実行したらVScodeがインストールされています。

VScodeがインストールされたらpythonのファイルを作成します。
拡張子(ファイル名の後ろ)を「.py」にしてファイルを作成します。

`例）sample.py`
以下を実行してみて下さい。
```python
print('Hello world')
```

コマンドに「Hello world」が表示されたら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759758/fb404d88-63c2-957c-41ed-8a386ea8b1ca.png)
【覚書き】ブラウザでファイルダウンロードさせるためのAPIレスポンスの設定

# 初めに
あるファイルをAPIレスポンスとして返す際、そのファイルをダウンロードしたい時があると思います。今回はその際に必要なAPIレスポンスの設定を調べたので、備忘を兼ねてアウトプットします。

※使用したブラウザはGoogle Chromeです。

# 結論
レスポンスヘッダに以下のヘッダーをつければOKです。
ダウンロードするファイルはContentに設定してください。

|ヘッダー項目|設定値|備考|
|--|--|--|
|Content-Disposition|attachment; filename=[ダウンロードするファイル名]||
|Content-Type|ファイルの形式に合わせて設定<br>例）application/octet-streamなど|※1|
|Access-Control-Allow-Origin|ダウンロード先サーバのオリジン|※2|

※1：なくても一応ダウンロード可能。
※2：APIとダウンロード先のサーバが違う場合は必須。同じ場合は不要。

# 必要な設定について
それぞれの設定について解説します。

## Content-Disposition
ファイルをWebページとして表示させるか、ダウンロードするかどうかを設定する項目です。
今回は```attachment; filename=[ファイル名]```を指定してダウンロードします。

|値|詳細|
|--|--|
|inline|Webページとして表示する|
|attachment|ダウンロードする|
|attachment; filename=[ファイル名]|ファイル名を指定してダウンロードする|


## Content-Type
返したいファイルの形式を指定します。
一般的なものは以下です。
※指定しなくてもなくても一応ダウンロードはできるようです。

| Content-Type                | 説明                                       |
|-----------------------------|--------------------------------------------|
| text/plain                  | プレーンテキスト                           |
| text/html                   | HTMLドキュメント                           |
| application/json            | JSON形式のデータ                           |
| application/xml             | XML形式のデータ                            |
| application/x-www-form-urlencoded | HTMLフォームで使用される標準のエンコード形式 |
| multipart/form-data         | フォームデータのマルチパートエンコード      |
| application/octet-stream    | バイナリデータ                             |
| image/jpeg                  | JPEG画像                                   |
| image/png                   | PNG画像                                    |
| application/pdf             | PDFドキュメント                            |
| application/zip             | ZIPアーカイブ                              |
| application/vnd.ms-excel    | Microsoft Excelスプレッドシート             |
| application/vnd.ms-word     | Microsoft Wordドキュメント                 |
| audio/mpeg                  | MPEGオーディオ                             |
| video/mp4                   | MP4ビデオ                                 |



## Access-Control-Allow-Origin
APIとダウンロード先のサーバが異なる場合、ブラウザによってはCORSで処理がうまくいかない場合があります。
その場合、ヘッダーの値でダウンロードファイルが存在するサーバのOriginを指定する必要があるようです。
※自分の場合は同じサーバ内だったため指定は不要でした。

CORSについては以下参照

https://qiita.com/att55/items/2154a8aad8bf1409db2b


# 終わりに
普段フレームワークを使ってるとそんなに意識せずに実装できてましたが、改めて調べてみるとこんな仕組みになっているんだと知ることができて面白かったです。
今回した実装も今度書く予定です（多分）。

ご覧いただきありがとうございました！


# 参考
https://qiita.com/yutoo89/items/c59a6a920b1bd6a72d59
https://qiita.com/att55/items/2154a8aad8bf1409db2b
Azure cloudshell で "not registered to Microsoft.CloudShell Namespace" と出たら、名前空間設定

# 背景

なんか使えないことがあったので、対処した記録

以下エラー詳細

> not registered to Microsoft.CloudShell Namespace
Storage fileshare subscription ********-****-****-*********** is not registered to Microsoft.CloudShell Namespace. Please follow these instructions "https://aka.ms/RegisterCloudShell" to register. In future, unregistered subscriptions will have restricted access to CloudShell service.

# 結論

以下で名前空間を登録すれば問題無し

> az provider register --namespace Microsoft.CloudShell

但し、コマンドは、デフォルトサブスクリプションに対して実行するものなので、サブスクリプションを切り替えてない場合は、先に切り替えて使う事

https://learn.microsoft.com/ja-jp/cli/azure/provider?view=azure-cli-latest

https://learn.microsoft.com/ja-jp/azure/cloud-shell/get-started?tabs=azurecli

## デフォルトサブスクリプションの切り替えと確認

> az account set -s "{subscription ID or Name}"

で、サブスクリプション名か、サブスクリプションIDを指定して切り替える

> az account list

で、一覧表示して、

**isDefault** が **true** になっていれば、OK

詳細は以下

https://learn.microsoft.com/ja-jp/cli/azure/manage-azure-subscriptions-azure-cli

# あとがき

最初、デフォルトサブスクリプション、という考え方を知らず、コマンドが効かねーってなってた :sweat: 

Azure ML を使うときも、デフォルトサブスクリプションに対するコマンド、という考え方は同じなので、CLI 使うときは、現状のサブスクを意識しないといけない。
HRTech SaaSのエンジニアリングマネージャーが読んで良かったと思う書籍10選【2023年版】


めぐろLT Advent Calendar 2023 24日目の記事です。

https://qiita.com/advent-calendar/2023/meguro-lt

## はじめに

こんにちは。[@yug1224(Yuji Yamaguchi)](https://x.com/yug1224)です。

HRTech SaaSでプロジェクトマネジメントやピープルマネジメントを担当しています。

今回は2023年に読んだ書籍の中から、個人的に良かったと思ったものを10冊ご紹介します。

## 1on1系

- **[ヤフーの1on1―――部下を成長させるコミュニケーションの技法](https://www.amazon.co.jp/gp/product/4478069786)**
- **[シリコンバレー式 最強の育て方 ― 人材マネジメントの新しい常識 1on1ミーティング](https://www.amazon.co.jp/gp/product/4761272864)**

1on1といえばやはりヤフーですかね。これまで1on1文化がある企業で働くことが多かったので、体験として知っていることも多かったですが、言語化された1on1のノウハウを再確認することができました。

1on1系の書籍ではシリコンバレー式の書籍も良かったです。ヤフーの1on1よりも具体的な型化の例が多く載っているので、より論理的で実践的な内容に感じました。

## 100のツボ系

- **[図解 人材マネジメント 入門 人事の基礎をゼロからおさえておきたい人のための「理論と実践」100のツボ](https://www.amazon.co.jp/gp/product/4799326120)**
- **[図解 組織開発入門 組織づくりの基礎をイチから学びたい人のための「理論と実践」100のツボ](https://www.amazon.co.jp/gp/product/4799328247)**
- **[図解 目標管理入門 マネジメントの原理原則を使いこなしたい人のための「理論と実践」100のツボ](https://www.amazon.co.jp/gp/product/4799329421)**

HRTech領域で働くようになってから知ったのですが、坪谷邦生さんの『「理論と実践」100のツボ』シリーズも良かったです。

図表を多用してわかりやすくまとめられているので、人材育成や組織開発をやろうとしている人にオススメです。

入門とありますが読み応えのある内容になっているので、自分はすぐ手に取れる場所に置いておき、逆引き辞典のように気になった箇所を読むという使い方をしています。

## エンジニア特化系

- **[エンジニアのためのマネジメント入門](https://www.amazon.co.jp/gp/product/4297133342)**
- **[スタッフエンジニア　マネジメントを超えるリーダーシップ](https://www.amazon.co.jp/gp/product/429607055X)**
- **[世界一流エンジニアの思考法](https://www.amazon.co.jp/dp/4163917683)**

専門職であるソフトウェアエンジニアは、他職能とは異なる価値観や考え方を持っていることが多いので、エンジニアに特化した内容を押さえるために読んでいました。

SNSでも話題になっていた書籍ですし、実際に読んでみて内容も共感する部分が多かったです。

しかし、これまでキャリアパスとしてあまり存在してこなかった「スタッフエンジニア」になりたいと思うエンジニアが急激に増えた時に、我々は適切な対応をとることができるのだろうかと考えさせられる内容でもあるなと思いました。

## 思考系

- **[とにかく仕組み化 ── 人の上に立ち続けるための思考法](https://www.amazon.co.jp/dp/4478117748)**
- **[コンサルが「マネージャー時代」に学ぶコト 知るだけでビジネスモンスターになれる79のスキル/思考と矜持](https://www.amazon.co.jp/dp/480261439X)**

まだ読み終わってはいないのですが、話題の2冊も押さえておきたいと思っています。どちらもシリーズ化されていて、前作が良かったので期待している2冊です。

個人的に業務では「型化」「再現性」を意識することが多いので、ルールで人を動かすという考え方はその通りだなと感じました。

さらに、たとえば「サーバントリーダーシップ」のような支援や優しさだけでは人や組織を変えるのは難しいと感じることもあったので、「インテレクチュアルリーダーシップ」という考え方は個人的にはとても納得できるものでした。

## 最後に

いかがだったでしょうか。

普段業務ではエンジニアの人材育成や組織開発について考えることが多いので、ピープルマネジメント寄りの内容が多くなってしまいました。

同じような立場の方に参考にしてもらえたら嬉しいですし、他にも良い書籍があれば教えていただきたいです！

以上、2023年に読んで良かった書籍10選でした。

## PR

HRBrainでは一緒に働く仲間を募集しています。歴史に残るトライをしよう！

https://www.hrbrain.co.jp/recruit
CRUDについてメモ

# CRUDとは
CRUDはデータを取り扱うソフトウェアに要求される4つの基本機能である
* Create(生成)
* Read(読み取り)
* Update(更新)
* Delete(削除)

のイニシャルからできた用語である

# Database
CRUDをデータベースで表すと以下のようになる
|CRUD|操作|SQL|
|:---:|:---:|:---:|
|Create|生成|INSERT|
|Read|読み取り|SELECT|
|Update|更新|UPDATE|
|Delete|削除|DELETE|

CRUD は、オブジェクトデータベース、XMLデータベース、フラットファイルデータベース、特定のファイル形式などにも実装可能である
OpenWrtで、syslog serverを構築する

1.以下のパッケージをインストールする。
　luci-app-log-viewer
　syslog-ng

2.SSH経由でファイルを修正
```
vi /etc/syslog-ng.conf
```
他の端末のsyslogを受け取るように、以下のコメントを外す。
        # uncomment this line to open port 514 to receive messages              
        #source(s_network);

3.OpenWrtのLuci画面にて、サービス->Log viewer が追加されている。
Filter settingsにて、syslog設定をしたターゲットのログを絞り込むことができる。
クラウドサーバを無料で使いたい

# クラウドサーバを無料で使いたい。

広告じゃないよ

実験台としてクラウドサーバは欲しいよね

## クラウドサーバは高い
月額1000円くらいが相場のようです。スペックによりますが。
VPSとかレンタルサーバとかそのへん

## クラウドサーバがあるとできること
### 実験 何かするときに実験台にできる
ローカル以外で何かするときに使えます。
### webサービスの提供とか 
開発するときに使えます。

## クラウドサービスで立てる
AWSやAzureは一定のクレジットがあったりします。
しかし、一年間安定して使うことができない場合が多いようです。

## シン・クラウドというのがあるらしい
https://www.xfree.ne.jp/

クラウドサーバが無料で使える。広告もなくwordpressも使える。SSHだめなよう。
なんかあったらちょっとした実験台、ブログの運用に使えそうだね。
【Firebase In-App Messaging】デバイスでテストがうまく動作しない時に確認すること

この記事は [リンクバルアドベントカレンダー2023](https://qiita.com/advent-calendar/2023/linkbal) の23日目の記事です。

Firebaseのサービスの中に、アプリ内にダイアログなどでメッセージを送ることができるIn-App Messaging(FIAM)というものがあります。

以下はメッセージのイメージです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923880/484875a3-7e90-62e7-5042-ecd248550ecf.png" width="200px">

その中のテスト機能を使って、メッセージ表示のテストをしているときに、あることを見落としていて、時間を食ってしまうということがありました。

その時は検索しても情報が出てこなかったので、同じ問題に直面している方に向けて記事を書きました。

### Firebase In-App Messagingの使い方を軽く紹介
FIAMではカスタムイベントトリガーというものがあり、これを使うと、任意のタイミングでメッセージをユーザーに表示させることができます。

詳しくは省略しますが、プロジェクトでFirebaseを使えるように設定をした後、
Swiftの場合、アプリ側では以下のように記述して、

```swift
InAppMessaging.inAppMessaging().triggerEvent("onClick");
```

Firebaseコンソール側では以下のようにtriggerEventで設定したイベントを追加します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923880/9539b331-b190-557c-7e87-bb2b2573a672.png" width="300px">

このように設定すると、アプリでonClick引数を指定したtriggerEvent関数が呼ばれたときに、メッセージが表示されます。

### 遭遇した問題：デバイスでテストでイベントがうまくトリガーされない
FIAMではユーザーに配信する前に、特定のデバイスでテストをすることができます。
遭遇した問題は、デバイスでテストの時に、triggerEventが呼ばれた時でなく、
アプリの起動時にメッセージがトリガーされてしまうというものです。

### 問題の原因：テストメッセージの自動トリガー
原因はデバイスでテストする際の注として、しっかり書いてあるのですが、
デバイスでテストする際はアプリ起動時に自動的にトリガーされるというものでした。
要はただの見落としです😭


![スクリーンショット 2023-12-23 21.50.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923880/c5c1bfb3-1793-390b-1139-af2845152dec.png)

### 他の原因
ただの見落としでなく、そもそも表示がされない、という問題に直面することもあるかと思います。
その場合の確認すべき点もいくつかまとめてみました。

１,APIが無効になっている
Firebase In-App Messaging APIが有効になっていないと、使えないので、GCPのコンソールでAPIについて確認して、無効になっていたら有効にしてみてください。

2,インストールIDが間違っている
デバイスでテストする時には端末固有のインストールIDをログから調べて、コンソールで設定するかと思います。
それが、正しいか今一度ログで確認してみてください。特にシュミレーターを複数使っている場合などは、違うIDを使ってしまっているかもしれません。

### 最後に
FIAMは2023年現在はベータ版ということもあり、情報が少ない気がしますが、とても簡単にアプリ内メッセージを実装できるので、積極的に活用していきたいです。

参考
[Firebase In-App Messaging](https://firebase.google.com/docs/in-app-messaging?hl=ja)
Excel方眼紙

[インターネット老人会の魔法書 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ancient-internet) の14日目の記事です。

# Excel方眼紙とは

列の幅を行の高さと同等とすることで、セルの形を正方形にし、方眼紙のようにしたExcelシートのこと。主に文書を作成するときに使われる。

好みの場所から書き始められるので、インデントを自在に制御することができる。
また、申請書など複数の枠が必要となる文書を作る際に、好きな場所にセルの結合で枠を作れるので、素人でもそれなりのレイアウトの文書を作成できる。

# 日本だけ？

このExcel方眼紙の文化は日本だけと言われている。
言わずもがなExcelは表計算ツールなのだが、文書作成ツールのして使われるケースのほうが多いのではないだろうか。
昔のエンジニアはExcel方眼紙で設計書を作ることがプロジェクトのルールで決められている場合も多く、会社秘伝のヘッダーフッター付きシステム設計書Excelフォーマットが存在していた。

# Wordが使われない理由

文書といえばWordを使うべきなのだが、私は今でも使いこなせていなく、Wordで思い通りの文書を作るのは難しい。主におせっかい機能のせいだ。
えらい広いインデントされたり、勝手に箇条書きにされたり、画像が思わぬところにすっとんでいったりと、想定外の動きが多い。

そうなると、書きたい場所に書けばそのまま表示されるExcelは確かに使いやすい。

# でも文書は

文書にはWikiとかMarkdownとかが結局一番書きやすい。
Springで作るWebアプリ作成の流れ（１）フロント作成まで

## 目的
　この記事はJavaのWebフレームワークであるSpringを使ったWebアプリ作成の流れを書いていきます。例として簡単なTODOアプリを作っていきます。
<br>
<br>

 ## おおまかな流れ（適宜追加・修正）
①フロントを作る(HTML・CSS)
②MVCの解説
③Controllerの作成
④データベースの設定
⑤モデルの作成
⑥CRUD
<br>
<br>
## フロントの作成
　今回のメインはSpringを使うことなので、フロントは簡単に作ります。後ほど見やすいようにデザインを修正したいと思います。

　最低限、TODOアプリはTODOの作成画面とTODOの確認の２つのテンプレートがあればできるので、まずはその２つのファイルを用意します。

```HTML:一覧画面
 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>TODOの一覧</title>
</head>
<body>
    <table border="2">
        <thead>
            <tr>
                <th>TODO</th>
                <th>重要度</th>
                <th>登録日時</th>
            </tr>
        </thead>

        <tbody>
            <tr>
                <th>コンソメ買う</th>
                <th>3</th>
                <th>2020/3/2</th>
            </tr>

            <tr>
                <th>たぬきちに会う</th>
                <th>5</th>
                <th>2023/2/3</th>
            </tr>
        </tbody>
    </table>
</body>
</html>
```

```HTML:TODO作成画面
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>TODOの作成</title>
    <link rel="stylesheet" href="css/todo.css">
</head>
<body>
    <form action="" class="todo">
        <label for="">
        <input type="text" placeholder="やるべきこと">
        </label>
        
        <label for="">
            <input type="number" placeholder="重要度">
        </label>

        <input id="btn" type="button" value="送信">
    </form>
</body>
</html>
```

![スクリーンショット (21).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850098/3ad083a8-bc1e-cff4-c01c-73bb74eea6c0.png)

今回は簡単なHTMLの表とフォームを作成しました。右のフォームを送信すると、左の表に追加される形でTODOサイトを作っていきます。
【AWS】Amazon Redshift

# Amazon Redshift
AWSが提供するデータウェアハウスサービス。Redshiftに格納されたデータはJDBC(DBにアクセスするための標準API)で接続が可能。またRedshift Spectrumを使うことで，S3に格納されたデータに直接クエリを発行できる。

**RDS**と同じリレーショナルデータベースの一種だが，RDSは行を読み取る**行指向データベース**に対して，Redshiftは列を読み取る**列指向データベース**と呼ばれる。

Redshiftではコンピュートノード間でデータを複製せず，データを分割して格納している(**SharedNothing**)。また，複数のコンピュートノードで1つの分析を分割して実施するため，高速で処理できる(**Massive Parallel Processing(MPP)**)。

:::note info
**データウェアハウス**
データ分析のための様々なデータを格納する倉庫のこと。POSデータの分析やCRM(Customer Relationship Management)による顧客管理で使用されている。
:::

## Redshiftの構成要素
| コンポーネント | 説明 |
| ---- | ---- |
| リーダーノード | コンピュートノードの制御やコンピュートノードでの並列SQLの実行 |
| コンピュートノード | クエリの実行，S3からのダウンロード |


# 参考
https://www.youtube.com/watch?v=SMJyTzbWx7M&list=PLPzcoMdqG5noLR7rAc552mvPADUmmdSt1&index=16
AWSの基本・仕組み・重要用語が全部わかる教科書
駄目グラフ002

## 円グラフは使うな

「円グラフは使うな」で検索すると山ほど出てくる。

- https://matsuda-blog.info/2129/
- https://jikitourai.net/dont-use-piechart
- https://100athlon.com/dont-use-pie-charts-easily/
- https://dataviz.hatenablog.com/entry/2019/02/05/180316
- https://mainichi.doda.jp/article/2020/03/17/1810
- https://ameblo.jp/saayykka/entry-12793745540.html
- https://www.wingarc.com/product/motionboard/blog/graph_type.html
- https://www.ashisuto.co.jp/qlik-training_blog/article/save-the-pies-for-dessert-japanese.html
- https://www.cresco.co.jp/blog/entry/950.html
- https://qiita.com/takaki03/items/cf8455eb16df0769fbe4
- https://note.com/ari_data_consul/n/nb357247b3ed8
- https://start-bunseki.com/do-not-use-3dand-donut-pie-charts/
- https://note.com/taka_tableau/n/na2f973956027
- https://www.lifehacker.jp/article/2210-when-to-use-bar-charts-instead-of-pie-charts/

...
AWS Copilotで単一リポジトリ（同一アプリケーション名）で複数アプリケーションにしてアカウント管理を楽にする

この記事は **[リンクバルアドベントカレンダー2023](https://qiita.com/advent-calendar/2023/linkbal)** の17日目の記事です。
2日連続[AWS Copilot](https://aws.github.io/copilot-cli/ja/)の記事です！

昨日

https://qiita.com/kinchiki/items/476ed1627b182e7dbc34


## はじめに
AWS Copilotは、複数AWSアカウントにenvをかんたんに作ることができます。
必要なIAMもよしなに設定してくれます。

が、複数アカウント運用だと以下のデメリットがあります。

- 本番リソースとそれ以外のリソースでもろもろの権限を分けられない
    - 厳密にはほぼすべてのリソースに付くtagの `copilot-environment` で設定できますが、私はアカウントごと分けたかったです
        - pipeline系のリソースには付きません、、、
- 一つのAWSアカウントに作られるリソースとenvのAWSアカウントに個別に作られるリソースがあってややこしい

AWS Copilotの思想にはきっと逆らうのでしょうが、これらのデメリットを解決する方法を紹介します。

## 結論
**envを作成したいAWSアカウントの認証情報で `copilot app init` する。**

AWS Copilotは、app initをしたAWSアカウントにApplicationが作成されます。
たとえ他のAWSアカウントで作成したアプリケーションと同じ名前でも、アカウントが異なれば完全に別アプリケーションとなります。

これは当たり前で、そうでなければS3バケットのように世界で一つのApplication名にしないといけませんからね。

## 具体的なコマンド
前提

- `~/.aws/config` に `[profile A]` と `[profile B]` があり、それぞれは異なるAWSアカウントとする
- Aは本番環境、Bはstg環境用とする

```sh
# 実際の作業は、 alias copsand='AWS_PROFILE=sandbox copilot' で copsand を使った

# Aでapplication作成
$ AWS_PROFILE=A
$ copilot app init app_name

# Aでenv作成
$ copilot env --profile A init -a app_name -n prod
# profileやVPCなど適切なものを選択
# 必要に応じてmanifestファイル編集
$ copilot env deploy -n prod

# Aでsvc作成
$ copilot svc init -n frontend
# 必要に応じてmanifestファイル編集
$ copilot svc deploy -n frontend -e prod

# Aでpipeline作成
$ copilot pipeline init -n aaa -p Workloads -u aaaaa
# 必要に応じてmanifestファイル編集
$ copilot pipeline deploy -b aaa --yes

##########

# Bでapplication作成
$ AWS_PROFILE=B
$ copilot app init app_name

# Bでenv作成
$ copilot env --profile B init -a app_name -n stg
# profileやVPCなど適切なものを選択
# 必要に応じてmanifestファイル編集
$ copilot env deploy -n stg

# Bでsvc作成
$ copilot svc init -n frontend
# 必要に応じてmanifestファイル編集
$ copilot svc deploy -n frontend -e prod

# Bでpipeline作成
$ copilot pipeline init -n bbb -p Workloads -u bbbbb
$ copilot pipeline deploy -b bbb --yes
```

なお、aliasを作成することをおすすめします。
構築段階だとcopilotコマンドの実行回数は多く、毎回 `AWS_PROFILE` などを指定するのは面倒ですし、指定漏れが起きるためです。
私は以下のようなaliasを設定しています。

```sh
alias cop='copilot'
alias copprod='AWS_PROFILE=A copilot'
alias copstg='AWS_PROFILE=B copilot'
```


## 注意点
一つのアカウントにだけあればよいリソースもできてしまいます。
それは人によりますが、ECRは一つだけにしたい、という方はいる気がします。


## 参考
公式ドキュメントの以下の2つは必ず読みましょう。

https://aws.github.io/copilot-cli/ja/docs/concepts/applications/

https://aws.github.io/copilot-cli/ja/docs/concepts/environments/

どのリソースがアカウント共通かenvのアカウントごとにできるかは、以下のスライドがひじょうにわかりやすいです！

https://speakerdeck.com/kokuyouwind/1nian-jian-ben-fan-yun-yong-sitewakatuta-sutatoatupukosoaws-copilot-cliwoshi-ubekintunoli-you?slide=74

## おわりに
おわり
【Databricks】All−purpose computeを作成してみた

# 背景
[【Databricks】コンピュートポリシーを作成してみた](https://qiita.com/zumax/items/716cd6d1ab77a6c6f0e2)で作成した、ポリシーを使用してAll-purpose computeを作成してみます。

# 実践
1. ナビゲーションペインで「Compute」をクリックします。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/52df5777-e668-88c6-6b15-c8127d12b8dc.png" width=200 />

1. 「Create compute」をクリックします。
1. Policyで先程作成した「test-policy」を選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/626b79f2-2525-2a92-44bd-a1b8079511f8.png)
1. 各種設定を行い、「Create compute」をクリックします。
1. しばらくすると、Runningになります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d1d79b71-5d57-74ef-24f3-4004e0b741ae.png)


# 参考
https://docs.databricks.com/en/compute/index.html
Azure Cloudshell で "Failed to connect to MSI" と出たら、再ログイン

# 背景

20分ぐらい？で自動的に切れることを知らなかった際に困っていた話

カーソルが反応しない！ってなってたので、最初は意味不明だった・・ :zipper_mouth: 

<br>

エラー詳細は以下

> Failed to connect to MSI. Please make sure MSI is configured correctly. Get Token request returned: <Response [400]>

# 結論

単純に、再ログインすればよかっただけだった・・ :sweat: 

## 再ログイン

> az login --only-show-errors

上記コマンドで、以下のようになるので、コードをコピーして、表示されたリンク先に飛んで、コードを貼り付ければログイン出来る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/3a873045-dec8-f413-546d-c69ca9e4bcde.png)


詳細は以下

https://learn.microsoft.com/ja-jp/cli/azure/authenticate-azure-cli-interactively

# あとがき

cloudshell は便利なんだけど、以下があったので、自宅ではなるべく使いたく無いなぁ・・という貧乏性が・・ :sweat: 

https://qiita.com/baku2san/items/f33d1f2e9030a376326e
VueでJointJSを使用する

今回はVue.jsでJointJSを使う方法を紹介します。

サンプルとして、Vueで定義したボタンをクリックすると四角形が追加されていくアプリを作成しました。

![Untitled.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129526/be73d7d9-d8cf-8ac8-b1b2-fa75c56453b0.gif)

ソースはこちら。

https://github.com/acnaman/jointjs-vue-sample

## 導入方法

今回はVue-cliで作成したアプリケーションにJointJSを導入していきます。
以下コマンドでJointJSを導入します。

```js
npm install --save jointjs
```

## 使用方法

Vue.jsで使うと言っても、基本的な使用方法はこれまでに紹介してきた方法と変わりません。
今までの紹介内容と異なる部分をかいつまんで紹介します。

### モジュールのimport

Vue.jsというよりもnpm経由で導入した場合の話になりますが、ソース内でJointJSの機能を参照できるようにモジュールのインポートを行います。

```js
import { dia, shapes } from 'jointjs';
```

### Graph, Paperの扱い

Vueのコンポーネント内でJointJSを使用する場合は、VueからGraphやPaperを参照できる必要があります。
ですのでVueの`data`にGraphとPaperを含めてあげるようにしましょう。

```js
export default {
  data() {
    return {
      graph: null,
      paper: null,
      startPos: 20,
    }
  },
  // 以下省略
```

GraphとPaperは初期化しないと使えませんが、コンポーネントの要素が生成されていないとPaperの`el`を指定することができません。ですので、Vueのライフサイクル`mounted`で初期化を行います。

```js
  mounted() {
    this.graph = new dia.Graph({}, { cellNamespace: namespace });
    this.paper = new dia.Paper({
      el: document.getElementById('paper'),
      model: this.graph,
      width: 600,
      height: 600,
      drawGrid: "mesh",
      gridSize: 10,
      cellViewNamespace: namespace,
      defaultLink: () => new shapes.standard.Link(),
      linkPinning: false,
      defaultAnchor: {
        name: 'bottomLeft',
      }
    });
  }
```

### Cellの追加

GraphはVueの`data`で定義しているため、`this.graph`でアクセスすることができます。アクセスさえできれば後はVueを使わないJointJSと変わりなく使用することができます。

```js
const rect = new shapes.standard.Rectangle({
    // 省略
});
this.graph.addCell(rect);
```
## まとめ

今回はVue.jsのアプリケーションでJointJSを導入・使用する方法を紹介しました。
フレームワーク内で使用するとデータの扱いはVue側に任せ、図の描画をJointJSに寄せるといった使い分けができ、非常に便利です。VueプロジェクトでJointJSの利用を検討されている方は、こちらの方法を参考に導入してみてはいかがでしょうか。

## 余談：JointJS+を利用している場合

有料版のJointJS+を利用している場合、Vue.jsとJointJSを利用しやすくするための`rappid`というライブラリが使用できるみたいです。私は使ったことがなく解説ができませんので、使用方法を知りたい方は[公式ドキュメント](https://resources.jointjs.com/tutorial/vue-ts)を参照してください。

※この記事は [JointJS Advent Calendar 2023](https://qiita.com/advent-calendar/2023/jointjs) の記事です。他の記事を読む場合はカレンダーのページを参照してください。

https://qiita.com/advent-calendar/2023/jointjs
Mind で「たらい回し関数」の処理時間計測

#### Mind8　で　竹内郁雄先生の「たらい回し関数」を実行して処理時間を計測してみました。
### たらい回し関数
リカーシブコールを使った　単純な計算プログラムで必ず停止し,入力値（x,y,z) から簡単に決まる値になります。
x,y,zは整数でなくても良かったと思いますが整数で実装しました。
#### プログラム
```mind
たらい回し回数は　小数変数。
たらい回しとは
      ｘは  変数
      ｙは  変数
      ｚは  変数
      ｘと  ｙと  ｚに  入れ
　　　 1.0  たらい回し回数を　増加する
      ｘが  ｙ  以下  
            ならば  ｙを  返し
　　　　　　さもなければ
                    ［ｘ － １］と  ｙと  ｚを  たらい回し
　　　　　　　　　　［ｙ － １］と  ｚと  ｘを  たらい回し
　　　　　　　　　　［ｚ － １］と  ｘと  ｙを  たらい回し
　　　　　　　　　　たらい回しし  返す
　　　　　　つぎに。

メインは 
      ｘは  変数
      ｙは  変数
      ｚは  変数
　　　結果は　変数
　　　startTimeは　変数
      stopTimeは　変数
      spanTimeは　変数　

　　　「たらい回し関数を計算します。ｘ、ｙ、ｚを入力して下さい。」と　表示し　改行し
　　　「各数の差が大きいと　とても時間が掛かるので　0～10程度までの数でお願いします。」と　表示し　改行し

	たらい回し回数を　クリアし
      「ｘを入力　→　」と  表示し　数値入力し  　ｘに  入れ　　　　　　　
      「ｙを入力　→　」と  表示し　数値入力し  　ｙに  入れ　　
      「ｚを入力　→　」と  表示し　数値入力し  　ｚに  入れ
　　　 [startTime := クロック]
      ｘと　ｙと　ｚを  たらい回し  結果に　入れる
     
       [stopTime := クロック]
       [spanTime := stopTime - startTime]

　　　結果を　文字列変換し　「　になりました。　」と　　合成し　一行表示
　　　たらい回し回数を ０桁と　０桁で　文字列変換・小数形式し　「回たらい回ししました」と　合成し　一行表示
　　　「処理時間: 」と　spanTimeを　文字列変換し　合成し 「ミリ秒」を　合成し
        一行表示すること。
```
### 処理結果
　大きい数字の　カンマ区切りは後から私が手で入れました。
```dos
c:\mind8\pmind\sample>taraimawashi
たらい回し関数を計算します。ｘ、ｙ、ｚを入力して下さい。
各数の差が大きいと　とても時間が掛かるので　0～10程度までの数でお願いします。
ｘを入力　→　10
ｙを入力　→　5
ｚを入力　→　0
10　になりました。　
343,073回たらい回ししました
処理時間: 30ミリ秒

c:\mind8\pmind\sample>taraimawashi
たらい回し関数を計算します。ｘ、ｙ、ｚを入力して下さい。
各数の差が大きいと　とても時間が掛かるので　0～10程度までの数でお願いします。
ｘを入力　→　15
ｙを入力　→　10
ｚを入力　→　0
15　になりました。　
6,540,246,905回たらい回ししました
処理時間: 491,959ミリ秒
```
### 結果
(15,10,0) だと65億回もコールしてます。
この間、私は風呂に入ってました。

どなたか、JAVAやC＃など他の言語でも実行して比較してみてください。
メモリの4領域〜ヒープ領域・スタック領域・テキスト領域・静的領域〜

# はじめに
Swiftではメモリ管理をしなくても、自動参照カウント ARC(Automatic Reference Counting)を使用して、アプリのメモリ使用状況を追跡および管理をしてくれているので、今までメモリ領域の認識をあまり持っていませんでした。
structとclassについて勉強している際、classは、メモリの「ヒープ領域」と呼ばれる場所に割り当てられ、structの場合は、「スタック領域」と呼ばれる場所に割り当てられる。
ヒープ領域・スタック領域はどちらもRAM上のどこかのセクションの一部に属する。
**ヒープ領域・スタック領域って何**という疑問が出てきたので調べてみました。

RAM・ROMについて何かわからないよって方は下記の記事を参考にしてみてください！

https://qiita.com/hinakko/items/16b677c650ef7b7bf88b

# メモリの4領域
メモリは下記の4領域に分けられる。
### テキスト領域(Program/Code)
機械語に翻訳されたプログラムが格納される。CPUの命令コードが格納されている領域。
この機械語の命令が 1 行づつ実行されることでプログラムが動く。
テキスト領域は読み出し専用なので、プログラム上でテキスト領域に書き込もうとすると割り込みが発生する。
ROM/RAM上であり、コンパイラがはきだす！変更しない領域が入る時はROM上で行われる。
### 静的領域(Static/Data)
プログラムの中で初期値をもつような変数に割り当てられる領域。
グローバル変数や静的変数(static 変数)が割り当てられる。
ROM/RAM上であり、コンパイラがはきだす！変更しない領域が入る時はROM上で行われる。
### ヒープ領域
動的にメモリ領域の確保や解放を行うのがヒープ領域。Swiftの場合、classが割り当てられるのがヒープ領域。
動的にサイズが確保されるため、実行中にヒープ領域のサイズが変化する。
ヒープ領域のアドレスは先に確保したものから**小さい順に割り当てられる。**
RAM上であり、ランタイムで確保する！
### スタック領域
関数内にあるローカル変数や、関数への引数、戻り値などに割り当てられるのがスタック領域。Swiftの場合、structが割り当てられるのがスタック領域で、ポインタで管理されている！メモリの示す先を必要なバイト数ずらしている。
スタック領域のアドレスは、先に確保したものから**大きい順に割り当てられる。**
RAM上であり、ランタイムで確保する！
スタック領域はコンパイラが最大何バイトか決めており、その領域をオーバーすると、スタック・オーバーフローが起こる！

**メモリの4領域の関係を図にすると下の画像のようになります！**

![b9c918761a4d0ddb1d8554ae9c93dc3c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/3f32b25d-9613-f958-34a8-9d42f0884d8f.png)

# 参考文献

https://www.swiftlangjp.com/language-guide/automatic-reference-counting.html

https://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node8.html

https://www.momoyama-usagi.com/entry/info-calc-sys13

https://youtu.be/wnXYRi1M5GY?si=bar4__2-DUjNRAOn
LMDE6のインストールでerror20が発生して止まる

- ASUSUのEEEPC901に入れていたlinux mintのバーションが古くて個々のアプリのアップデートが難しくなっていたので最新版にアップグレードしたときの防備録。

- ちなみに、旧バージョンからのバージョンアップは、アップグレードシステムが現状のバックアップを残そうとするンだけど、EEEPC901のストレージにそんな余裕は無いので断念しました。

- と、いうワケなのでクリーンインストールをします。

- [公式サイト](https://linuxmint.com/download_lmde.php)からisoファイルをダウンロード。

- [rufus](https://forest.watch.impress.co.jp/library/software/rufus/)を使用して、インストールメディアを作成。

- USBからブートし、立ち上がったmintのディスクトップ画面にあるインストーラーを起動します。
 (EEEPC901系だけの問題ですが、このPCは縦の解像度が800しかありません。しかし、mintのインストーラーの画面はそれ以上の縦の解像度を必要としており、しかも固定で変更ができません。はみ出た部分をスクロールさせて見ることもできません。そして、各種コマンドのボタンは、その見えない最下部にあり、ショートカットキーも割り振られていません。解決策して、画面の設定で表示を90度回転させ、縦画面にすることでインストーラーの縦画面を全て画面内におさめることができました。横ははみ出ますが、横の場合はウインドウ自体をずらしてみることができるので致命的ではないです)

- さて、後はインストーラーの指示にしたがって進めれば完走するはずですが、今回は失敗しました。

- インストーラーで Error20発生。「Not a directory '/run/live/dedium/live/filesystem.packages-remove'」と出て、「OK」しか選択肢ないという状態です。

以下はBingAIに聞いた場合の返答です

:::note
LMDE6のインストーラーでエラー20が発生した場合、以下の手順を試してみてください:

1. `/run/live/medium/` (USBドライブが/dev/sdb1にある場合)を読み書き可能に再マウントします。コマンドは次のとおりです: `sudo mount -o remount,rw /dev/sdb1 /run/live/medium`
2. `/run/live/medium/live` (0バイトのファイル)を削除します。
3. `live`という名前のディレクトリを作成します。
4. `/run/live/medium/casper`から`/run/live/medium/live`にすべてのファイルをコピーします。ただし、`filesystem.squashfs`は非常に大きいため、インストールを完了するために必要とは思われません。

これらの手順が問題を解決することを願っています。それでも問題が解決しない場合は、さらなるサポートを求めるために、Linux Mintのサポートフォーラムやコミュニティを訪れてみてください。
:::

- 上記処置を施した後、インストーラーを再度起動しましたが「システムの再起動が必要」というメッセージが出て、インストールが止まりました。Error20が出たときの後遺症だと思うので、指示通りシステムを再起動してから、インストーラーを起動すると、今度は完走できました。
軽深演習 #17 会話

### 軽深（かるしん　なんちゃって圏論） Advent Calendar 2023 17日目の記事です。

演習形式をとっているので、ぜひ　回答を試みてください。

### 前提知識　会話
会話を軽深（かるしん　なんちゃって圏論）的に考察するとどうなるかと言う話です。まずは、[軽深演習 #1 BL33XU](https://qiita.com/zanjibar/items/1c81641dcffe2373ec5b)に書いてあるポアンカレの「数学とは違うものを同じものとみなす技術である」を使いましょう。会話とTCP/IP の類似に着目します。TCP/IPは、インターネットの通信方式の基本中の基本です。
原理は単純で**話している人がいる時は、他の人は黙る**というだけです。

図式で書くと、こんな感じですね。
```mermaid
flowchart LR
A[話し手]-->B[聞き手]
```

さて、自分と相手とすると矢印の方向は、２つありますね。
```mermaid
flowchart LR
A[自分]-->B[相手]
```
```mermaid
flowchart RL
A[相手]-->B[自分]
```
自分から話しかけるか？　話しかけられるのをまっているか？　の違いです。
あまりに単純な図式ですけど。実際のあなたの行動で、自分から話しかけることはどのくらいあるのでしょうか？誰かが話し始めるのを待つことが多いのではないでしょうか？特に会議の場ではそうでしょう。 2人だけの会話の時には少しは違うと思いますけど。

何か起こそうとするならば、自分から声を掛けた方が良いのではないでしょうか？
様子見ばかりをしていると思われてる日本政府が思ってるより主体的に動いてる事例は結構あります。
[アフリカ開発会議（TICAD）](https://www.mofa.go.jp/mofaj/area/ticad/index.html)は、日本政府主導です。何もやってなかったことを想像すればわかるように、 大きな恩恵を日本にもたらしているのではないでしょうか？
普段の会話も自分から声をかけてみようと思うと全然違った会話の在り方になるのではないでしょうか？


### 演習 自分から会話してすごく良かったなと思ったことありますか？

自分から会いに行くのもそうですね。単なる図式を見ただけですけど、自分からやってみるといいことがありそうだって気にはなりませんか？

数学的に厳密な議論とは程遠いですが、図式で表現されると理解が進んだ気がしませんか？
駄目グラフ001

## デフォルト設定でグラフを描くな

### 課題

平均値 50 点，標準偏差 10 点の正規分布に従うと仮定される 1 万人分の試験成績のヒストグラムを描け。


```python
import matplotlib.pyplot as plt
import numpy as np
```

### 架空データの生成


```python
np.random.seed(12345)
x = np.random.randn(10000)*10+50
```

### 何も考えず，デフォルトでヒストグラムを描く


```python
plt.hist(x);
```


    
![output_6_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/2f48f890-8afd-e729-64a0-ae5c3dc21428.png)

    


### 階級設定をちゃんとする

上のグラフは，階級の設定が変！

階級の開始値と階級幅は「きれいな数」にするのが慣例である。
「きれいな数」とは，階級開始値としては，整数値，2，2.5，4，5 で割り切れる数など。階級幅としては階級開始地ともかんするが生成される階級開始値がきれいな数であること。例えば階級開始地が整数ならば 2.5 は階級幅としては不適切になる。

データの分布範囲を確認してみる。


```python
min(x), max(x)
```




    (12.546441226688884, 89.27528040792731)



最小の階級は 10，階級幅は取りあえずきれいな数として 5 を設定してみよう。
最大の階級は 85〜90 になる。


```python
plt.hist(x, bins=range(10, 90, 5));
```


![output_10_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/f5651015-2606-1985-b9c6-02a86613f83d.png)

    


まずまずきれいではある。10≦x<15，x > 80 は ほとんど 0 なので，切り捨ててもよいが，注釈は必要だろう。


```python
plt.hist(x, bins=range(15, 90, 5));
```


    
![output_12_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/457ccbb5-30d1-fa60-7869-868ebf299d5b.png)

    



```python
plt.hist(x, bins=range(15, 90, 5));
plt.xlim(15, 85)
```




    (15.0, 85.0)




    
![output_13_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/2b665984-cac7-540a-37e4-613109334b91.png)

    



なお，投稿論文に記載するような場合には，投稿規定に従うべきであり，上のような図をそのまま添付することはまず許されないであろう。
【Unity×C#】マイクからオーディオを取得しファイルに保存する（UniTask版）

# 概要
前回コルーチンで非同期処理を書いていた以下の記事をUniTaskで書き直したものです。
修正したDemoAudioRecorder.csのスクリプトのみ掲載しています。
残りのスクリプトや使い方等は、以前の投稿をご覧ください。

https://qiita.com/Gamo_2683/items/ec0b9bcc57496b31631a

# 開発環境
Windows 10
Unity 2019.4.31f1
Api Compatibility Level .NET Standard 2.0

# 実装
詳細はスクリプト中にコメントで記載しています。

## DemoAudioRecorder.cs
```csharp
using System;
using System.Linq;
using UnityEngine;
using Cysharp.Threading.Tasks;

public class DemoAudioRecorder : MonoBehaviour
{
    // Start is called before the first frame update
    private string microphone;
    private AudioClip microphoneInput;
    private const int RECORD_LENGTH_SEC = 10;
    private const int SAMPLE_RATE = 41100;

    void Start()
    {
        // 利用可能なマイクを検出
        microphone = Microphone.devices.FirstOrDefault();
        Debug.Log("microphone: " + microphone);
        if (microphone == null)
        {
            Debug.LogError("No microphone found");
            return;
        }

        // 第二引数をtrueにすると循環バッファとしてループ保存
        microphoneInput = Microphone.Start(microphone, false, RECORD_LENGTH_SEC, SAMPLE_RATE);
        Debug.Log("録音を開始します。何か話してください。");

        WaitAndExecute().Forget(); // Forget()メソッドで、awaitが無いけれど大丈夫？という警告を無視
    }

    // Update is called once per frame
    void Update() { }

    /// <summary>
    /// 10秒間待機して、録音結果をWAVファイルに保存
    /// </summary>
    private async UniTask WaitAndExecute()
    {
        // 10秒間待機
        await UniTask.Delay(TimeSpan.FromSeconds(10));
        Debug.Log("録音を終了し、WAVファイルに保存します。");

        // 保存先ファイルの設定
        var filePath = string.Format("{0}/{1}/{2}", Application.persistentDataPath, "recordings", "recordedAudio.wav");
        Debug.Log("filePath: " + filePath);

        // AudioClipからWAVファイルを作成
        SaveWavFile(filePath, microphoneInput);
    }

    /// <summary>
    /// AudioClipからWAVファイルを作成
    /// WavUtilityには以下のコードを利用。ただし、FromAudioClipメソッドの一部を修正
    /// https://github.com/deadlyfingers/UnityWav/tree/master
    /// </summary>
    private void SaveWavFile(string filepath, AudioClip clip)
    {
        // AudioClipからWAVファイルを作成
        byte[] wavBytes = WavUtility.FromAudioClip(clip, filepath, true);
    }
}
```
SourcetreeでGithubからCloneできない対処法

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/2d75bf03-dc99-f33f-5b52-9df1623a61dd.png" width=80%>

SourcetreeでGithubからHttpsでCloneしようとすると
ソースパス/ソース URL として正しくありません
とエラーが出ます。
Https でクローンできない場合は SSH で行います。
すべてSourcetreeにあるツールで可能です。

# ① SSHキーの作成

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/6c5256d6-998f-8d82-9237-ed45b79f3428.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/79301aaa-3dc1-f5e5-2bea-e10c87dafd21.png" width=60%>

1. [ツール][SSHキーの作成]を起動します。
1. Generate を押します。
1. マウスをグリグリします（待ってても進みません）
2. [Save public] と [Save private] で保存します。

# ② GithubにPublicキーを登録

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/734065d5-1bae-a33c-5c74-1e8cd97902fc.png" width=70%>

1. Githubの[Settings][SSH and GPG keys] 画面を開きます。
1. キーだけを取り出し、前に ssh-rsa を付けます。 
1. キーを貼り付けます。

↓ 変更前
```
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "rsa-key-202312"
AAAAB3NzaC1yc2EAAAADAQABAAACAQCFhIcOfXC55/5j7gcId0aN+Yc
22C1roPjcn0xYA2BUlOR6FuxfYMBoNac0VzXgM6sbseIRd/d9tYLpWk
～～～～
4lhfRLH6SoEGYw8XhVMOer0gCBUmJhiWC9IpMQhRXIkWYqrS05idpJY
CUM2PXoDiQ==
---- END SSH2 PUBLIC KEY ----
```

↓ 変更後
コメントを消して前に ssh-rsa を付ける
```
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCFhIcOfXC55/5j7gcId0aN+Yc
22C1roPjcn0xYA2BUlOR6FuxfYMBoNac0VzXgM6sbseIRd/d9tYLpWk
～～～～
4lhfRLH6SoEGYw8XhVMOer0gCBUmJhiWC9IpMQhRXIkWYqrS05idpJY
CUM2PXoDiQ==
```

# ③ Sourcetreeにprivateキーを登録してクローンを実行
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/88ff58d8-a11d-2bde-c72b-37f15a880570.png" width=60%>

1. [ツール][SSHエージェント]を起動しprivateキーを登録。
1. CloneのURLはHttpsではなくSSH（git@github.com）になります。

# あとがき
分かれば簡単なのです。分かれば・・・
Azure ML Studio で ScriptExecution.StreamAcess.Authentication は、RBAC で対処

# 背景

Azure ML Studio でデータアセットを作成しようとしたら、件名のエラーが出た。
その対処記録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f72fb3d5-3396-e1f2-e80b-4354afe8d9d0.png)

# 結論

- 単に、デフォルト設定されていた Role: 共同作成者を削除してしまっていたので、戻すのみ・・ :sweat: 

# 原因

- DevOps で ServiceConnection の検証してる際に、Role が影響しているかを確認する際に、削除したRoleがこっちにも影響してたって話。

# 対処

- 単純に、共同作成者を再度 RBAC で設定するのみ

# あとがき

うーん、愚か :laughing:
Node.js環境でパスは合ってるのにモジュールが見つからないというエラー

## 環境
- Windows10
- Node.js（v18.18.1）
- Express（v4.18.2）
- React（v18.2.0）

## 経緯
- Express環境で、React側と同じ記述を用いてモジュールをインポートしようとしたところ、パスは間違っていないのにモジュールが見つからないというエラーが発生した。

### 詳細
- Reactではファイルインポート時に以下の記述でOK。

```react
import { apiHandler } from "test/apiHandler"
import apiHandler from "test/apiHandler" 
```

- Node.js(Express)だと以下エラーが発生する。

```terminal
Error [ERR_MODULE_NOT_FOUND]: Cannot find module 'C:¥test¥apiHandler' imported from (インポート先のパス)
  at ....
  code: 'ERR_MODULE_NOT_FOUND'
```

## 対処方法
以下のように拡張子をつけて記述する。

```js
import { apiHandler } from "test/apiHandler.js"
import apiHandler from "test/apiHandler.js" 
```

## 理由
ChatGPTさんいわく、以下の通り。

> ReactやブラウザのJavaScript環境では、 **モジュールバンドラー（例えば、WebpackやParcelなど）が、拡張子を省略した際に自動的にファイルの拡張子を補完することができます。** このような環境では、モジュールバンドラーがファイルのタイプを推測し、適切なファイルを見つけることが可能です。
>
> 一方で、 **Node.js環境では、通常はモジュールバンドラーがない** ため、ファイルを明示的に指定する必要があります。Node.jsは、ファイルの拡張子を見てファイルのタイプを特定することができません。そのため、Node.jsでは拡張子を省略すると、ファイルが見つからず、モジュールのインポートが失敗することがあります。

以上
Azure OpenAI を利用しようとした際の、エラーメッセージとその対処

# 背景

Azure OpenA で Function Calling を利用しようとした際に出たエラーメッセージとその際の対処の記録

# エラーメッセージと対処

## Resource not found: リソースが無い

> NotFoundError: Error code: 404 - {'error': {'code': '404', 'message': 'Resource not found'}}

- endpoint の指定が間違っている

https://{yours}.openai.azure.com/**openai**

みたいに、余分なものがついていたりする場合

- 存在しない api-version を指定している

<code>?api-version=2025-12-31-preview</code> みたいな

## DeploymentNotFound: デプロイが見つからない

> NotFoundError: Error code: 404 - {'error': {'code': 'DeploymentNotFound', 'message': 'The API deployment for this resource does not exist. If you created the deployment within the last 5 minutes, please wait a moment and try again.'}}

- deployment_id が間違っている

endpoint はあってるが、model/deployment_id 辺りがおかしいと思われる。

https://qiita.com/baku2san/items/7b2ef9c31dda310f1ea5

## OperationNotSupported: オペレーションが無い

> BadRequestError: Error code: 400 - {'error': {'code': 'OperationNotSupported', 'message': 'The completion operation does not work with the specified model, gpt-35-turbo. Please choose different model and try again. You can learn more about which models can be used with each operation here:

- 対象モデルでは、必要な機能が無い

上記の例では、"completion" が、gpt-35-turbo には無いよって話。

モデルと、機能の関係は、現状は以下な感じ？（バージョンに依る筈）

gpt-35-turbo: **chat completion**
gpt-35-turbo-instruction: **completion**
text-embedding-ada-002: **embeddings**

実際の対応は、以下で調べる。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/models#gpt-35-models

## Unrecognized request argument: 使い方の問題

> NotFoundError: Error code: 404 - {'error': {'message': 'Unrecognized request argument supplied: functions', 'type': 'invalid_request_error', 'param': None, 'code': None}}

- API の使い方が違っている。

api version などによって違っていると思われるので、公式ドキュメントを調べて使い方を正す

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/function-calling?tabs=python

# あとがき

情報を貯めることで、だんだんと見えてくることがあるよね。

だからこそ、自分で試すしかないのかな、とも。 :thinking:
dockerコンテナ内でnvidia-smiが通らなくなる

コンテナ起動直後は`nvidia-smi`コマンドが通っていたのに数日放置すると以下のエラーが出てGPUにアクセスできなくなる現象がある。
```
Failed to initialize NVML: Driver/library version mismatch
```
# 解決法
ネット上の情報を漁ると様々出てくるコンテナ起動時に`--privileged`オプションを入れるのが手っ取り早い。
```
$ docker run --gpus all --privileged [コンテナ名]
```
MAMPを使ってPHPを表示させる

## MAMP
- ローカルにWeb開発環境を作ることができるソフトウェア
- Web開発に必要なLAMP環境が揃っている

## 実現したいこと
- MAMPを使ってPHPが実行できる環境を構築する
- ブラウザで`Hello World`と出力する

## 前提
- MAMPは初期設定のまま
- 使用PCはMac

## 手順
1\. [公式HP](https://www.mamp.info/en/downloads/ "MAMP")からMAMPをインストール

2\. MAMPアプリケーションを開く

　<img width=150 src="https://i.gyazo.com/aba33e8a34b2891ced6e96a69538ac28.png">

3\. アプリケーション内にあるMAMPを開く

　<img width=150 src="https://i.gyazo.com/05e8b96b0ca491d43591fd2db4ac2090.png">

4\. 右上の「Start」ボタンを押してMAMPを起動する

 <img width=500 src="https://i.gyazo.com/5fbb2993a54c1c6fa58a183351f0f87b.jpg">

5\. htdocsフォルダに表示させたいファイルを入れる（今回は`sample.php`を入れて、`Hello World`と出力する）
```php:sample.php
<?php

echo "Hello World";
```

6\. ブラウザで`localhost:8888/sample.php`に接続

7\. 画面に`Hello World`と表示されていれば環境構築完了
```php:localhost:8888/sample.php
Hello World
```

## 補足
### MAMPにPHPが入っているか確認する方法
1\. MAMPを起動した状態で`localhost:8888/index.php`に接続
2\. サーバーやルート情報などが書いてある`Welcome to MAMP`というページが表示される
3\. ページ内に`PHP: 7.4.33`というような表示があればPHPが入っている
Rails7系から追加された便利そうなメソッド

# はじめに
Railsの7系を触っていてあまり見慣れないメソッドに出会う機会が多いので、改めてまとめてみました。

# sole
https://railsdoc.com/page/sole

```ruby
# Userモデルに対して、usernameが特定の値であるレコードを取得しようとする。
# usernameがユニークであることが期待されている場合に使用する。

begin
  user = User.where(username: 'unique_username').sole
  puts user.name
rescue ActiveRecord::RecordNotFound
  # レコードが見つからなかった場合の処理
  puts 'ユーザーが見つかりませんでした。'
rescue ActiveRecord::SoleRecordExceeded
  # 複数のレコードが見つかった場合の処理
  puts '期待されるユーザーが複数存在します。'
end
```

# excluding
https://railsdoc.com/page/excluding

```ruby
post_one = Post.find(1)
post_two = Post.find(2)

Post.all.excluding(post_one, post_two)
# SELECT "posts".* FROM "posts" WHERE "posts"."id" NOT IN (1, 2)
```

# in_order_of
https://railsdoc.com/page/in_order_of
```ruby
User.in_order_of(:id, [1, 5, 3])
# SELECT "users".* FROM "users" ORDER BY FIELD("users"."id", 1, 5, 3)
```

# destroy_by
https://railsdoc.com/page/destroy_by

```ruby
Person.destroy_by(id: 13)
Person.destroy_by(name: 'Spartacus', rating: 4)
Person.destroy_by("published_at < ?", 2.weeks.ago)
```

# delete_by

https://railsdoc.com/page/delete_by

```ruby
Person.delete_by(id: 13)
Person.delete_by(name: 'Spartacus', rating: 4)
Person.delete_by("published_at < ?", 2.weeks.ago)
```


# touch_all
https://railsdoc.com/page/touch_all


```ruby
# 現在時刻に設定
Person.all.touch_all
# "UPDATE \"people\" SET \"updated_at\" = '2018-01-04 22:55:23.132670'"
```
アレー信号処理　ビームフォーミング手法一覧

音響信号処理としてのアレービームフォーミング技術について勉強するために、まずは手法を一覧化することで頭の中を整理する。
アレー信号処理は軍事目的やレーダ技術への応用に向けた研究が古くから行われていたこともあり、アダプティブアレーアンテナを用いた無線通信技術との関わりが深い。

## ビームフォーミング手法一覧表

| 手法名|参考記事|
|:----------|:------|
|遅延和法(DSBF)|[こちら][link-DSBF]|
|最小分散法(MVDR)|[こちら][link-MVDR]|
|最尤法|↑|
|線形拘束付最小分散法(LCMV)|↑|
|一般化サイドローブキャンセラ(GSC)|-|
|最大SNR法|-|
|マルチチャネルウィナーフィルタ(MWF)|-|
|CMA(Constant Modulus Algorithm)|-|
|SCORE(Spectral coherence restoral)|-|

[link-DSBF]: https://qiita.com/TbsYS/items/7c3f09c4ce7bac4af04c
[link-MVDR]: https://qiita.com/TbsYS/items/4f61013f209c2add6b7a

CMAは無線通信におけるFM変調信号の振幅が一定であるという条件を利用した手法、SCOREは変調方式や変調速度により信号の周期定常性を利用した手法となるため、音響信号処理の分野ではあまり馴染みがないかもしれない。


## ビームフォーミング概略
一般的なビームフォーミングの概略図を以下に示す。

![ビームフォーミング構造図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655676/274cff5e-3742-27ec-8f34-9cacd98c0bf3.png)

アダプティブビームフォーミングは、アレーアンテナやマイクホンアレイで受信した信号$x(t)$と出力$y(t)$、外部から与えらえる規範信号$d^*(t)$に応じて重み$w$を決定するフィルタとみることができる。
各マイクロホンで受信した信号は、それぞれ重み係数を掛けられ、その後合成された出力となる。
時間領域$t$、あるいは短時間フーリエ変換した周波数領域(フレーム$l$・周波数$k$)どちらの信号でも取り扱うことができる。周波数領域の場合、重み係数は一般的に複素数となるため、複素共役転置を取って出力は以下の式で表される。
```math
y(l,k) = w(k)^Hx(l,k)
```


## ステアリングベクトル
ビームフォーミングでは、音源信号とアレーアンテナやマイクホンアレイまでの伝達特性を表すステアリングベクトル$a(k)$があらかじめ計算できるとする場合が多い。ステアリングベクトルは、減衰$r_i$と遅延$\tau_i$を用いてモデル化することができる。
![ステアリングベクトル説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655676/fb32e558-7a3f-95ed-8927-b0e5f99391b7.png)

ここで、受信信号$x(k)$を音源信号$s(l,k)$とステアリングベクトル$a(k)$、雑音$n(l,k)$とすると以下の式で表現される。
```math
\begin{align}
x(k) &= s(l,k)a(k)+n(l,k) \\
     &= c(l,k)+n(l,k)
\end{align}
```
音源分離処理として$s(l,k)$を推定するのではなく$c(l,k)$を推定することにすれば、以下のように捉えることでステアリングベクトルの大きさは特に重要な情報ではなくなる。(大きさの不定性[1])
```math
x(k) = \Bigl(s(l,k)\alpha\Bigr)\Bigl(\frac{a(k)}{\alpha}\Bigr)+n(l,k)
```
実際のステアリングベクトルに対し$1/\alpha$倍されたステアリングベクトルで$s(l,k)$を推定しようとした場合、実際の音源信号の$\alpha$倍された信号として推定することになるが、マイクロホン受信信号$c(l,k)$としては変わらない。
よって、ステアリングベクトルの大きさの計算例としては、ベクトルの$L_2$ノルムが1となるような値とする場合が多い。この時、マイクロホン数$M$とすると以下のようになる。
```math
r_i = \frac{1}{\sqrt{M}}
```

#### 参考書籍
[1]戸上真人.「Pythonで学ぶ音源分離」インプレス.2020年