OmniAICreator/Qiita-1.07M huggingface dataset:
Microsoft Entra ID で外部ユーザーを内部ユーザーに変換する

Microsoft Entra ID で外部ユーザーを内部ユーザーに変換する機能がパブリックプレビューとなっていました。

https://learn.microsoft.com/ja-jp/entra/identity/users/convert-external-users-internal/?wt.mc_id=MVP_380462

実際に検証をしてみます。

# 機能の用途

組織の再編、合併、買収等の際に使う機能。
今まで外部ユーザーとして組織に登録されていたユーザーを内部ユーザーにするには、今までは
・外部ユーザーを削除
・新たにユーザーを作成
する必要がありました。
今回のアップデートで、外部ユーザーを内部ユーザーに変換する機能が追加されました。

＜ユーザーの定義＞
内部ユーザー：ローカルテナントで認証を行うユーザー
外部ユーザー：別の組織の Entra ID、Google フェデレーション、Microsoft アカウントなどで認証を行うユーザー

# 外部ユーザーの変換

Graph API もしくは Entra ID ポータルを使用して実行可能です。
クラウドユーザーも Active Directory 同期ユーザーも、どちらも変換可能です。
今回は別の組織のクラウドユーザーでテストを実施します。


・あらかじめ、テストテナントに組織外のクラウドユーザーを組織に招待しておく。
・Microsoft Entra 管理センターに [ユーザー管理者] 以上でサインインする。今回はテストなのでグローバル管理者で実施。
・[ID] > [ユーザー] > [すべてのユーザー] より変換したい外部ユーザーを表示する。
・[B2B コラボレーション] の [内部ユーザーに変換] をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335429/9b4239db-a606-6567-7346-46dfcbc7190f.png)

・新しいユーザー プリンシパル名などを入力し [変換] をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335429/7fb46424-0feb-c4c2-bf60-087bd0346574.png)
以上で変換が完了。

# 変換されるもの

ユーザーを変換したテナントを新テナント、元々のユーザーのローカルテナントを旧テナントとして以下記載します。


・パスワードはユーザー変換時に設定したものを使用する
・表示名は新テナントのものがそのまま使用される
・ユーザーのプロパティは新テナントで設定したものが適用される
・マネージャーも新テナントで設定したものが適用される
・以下赤枠に関しても新テナントで設定したものが適用される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335429/211e47e5-9618-97f3-8bc9-563442f31b89.png)

グループ／ライセンス／ロールあたりを引き継げるのがとても良さそうです。
なお、**新テナントでユーザーを変換後、旧テナントのユーザーには何も影響はありませんでした。**

# さいごに

・ユーザー数が増えれば増えるほど、Graph API を使用するのが現実的ですね。
　力技でやると限界が出るので機械に任せましょう…

・メール切替、Teams 切替はまた別途考慮する必要があります。
　しかし今後 Microsoft がそのあたりの切り替えをスッとできるツールを作成してくれることを期待しつつ、外部ユーザーのプロパティをちゃんと埋めるという作業を今からやっておくといいのかもしれません。

**・協力会社のメンバーをゲスト登録し技術サポート等を受けていたけれど、やはりテナント内ユーザーに変えたいときなどに便利そうです。**
外部ライブラリを利用せずにVecをDistinctしたい

Rustで外部ライブラリを利用せず、VecをDistinctする方法を紹介します。

まずVecをHashSetに詰め替え、再度Vecに変換する方法があります。

```rust
use std::collections::HashSet;

let a = vec![3, 2, 2, 3, 1, 3];
let b = a.into_iter().collect::<HashSet<_>>().into_iter().collect::<Vec<_>>();
println!("{:?}", b); //=> [2, 3, 1]
```

dedupを利用する方法もあります。

```rust
let mut a = vec![3, 2, 2, 3, 1, 3];
a.sort();
a.dedup();
println!("{:?}", a); //=> [1, 2, 3]
```

**環境情報**

```
$ cargo --version
cargo 1.76.0 (c84b36747 2024-01-18)
$ rustc -V
rustc 1.76.0 (07dca489a 2024-02-04)
```
クラス型　フィールド　メソッド引数　戻り値

## has-aの関係
フィールドにクラス型の変数を宣言する
あるクラスが別のクラスをフィールドとして利用している関係
```Sword.java
public class Sword
 String name; // 剣の名前
 int damage; // 
 ```
 ```Hero.java
 public class Hero {
 String name;
 int hp;
 Sword sword; // 勇者が装備している剣の情報
 public void attack() {
  System.out.println(this.name + "は攻撃した！");
  System.out.println("敵に5ポイントのダメージをあたえた！");
 }
}
 ```
 Heroクラスに新しく追加されたフィールド「Sword」は、int型やStirng型ではなくSword型
フィールドにクラス型の変数を宣言ができる
Hero has-a Sword(勇者は剣を持っている)


```Main.java
public class Main {
 public static void main(String[] args) {
  Sword s = new Sword();
  s.name = "炎の剣";
  s.damage = 10;
  Hero h = new Hero();
  h.name = "ミナト";
  h.hp= 100;
  h.sword = s; // swordフィールドに生成済みの剣インスタンス(番地)を代入
  System.out.println("現在の武器は" + h.sword.name); // 勇者「の」剣「の」名前
 } 
}
```
```結果.
現在の武器は炎の剣
```

## クラス型をメソッド引数や戻り値に用いる
クラス型はフィールドの型に用いるだけではなく、メソッドの引数や戻り値にも利用できる
```Wizard.java
public class Wizard {
 String name;
 int hp;
 public void heal(Hero h) { // 引数はHero型
  h.hp += 10; // 勇者のHPに10を加える
  System.out.println(this.name + "が" +h.name + "のHPを10回復した");
  System.out.println(h.name + "のHPが" + h.hp + "になった");
 }
}
```
```Hero.java
public class Hero{
 String name;
 int hp;
}
```
healメソッドが呼び出されると、魔法使いインスタンスは勇者のHPを10回復させる。呼び出されるときに「どの勇者を回復するのか」を引数hとして受け取る必要がある
```Main.java
public class Main {
 public static void main(String[] args) {
  Hero h1 = new Hero();
  h1.name = "ミナト";
  h1.hp = 100;
  Hero h2 = new Hero();
  h2.name = "アサカ";
  h2.hp = 100;
  Wizard w = new Wizard();
  w.name = "スガワラ";
  w.hp = 50;
  w.heal(h1);
  w.heal(h2);
 } 
}
```
```結果
スガワラがミナトのHPを10回復した
ミナトのHPが110になった
スガワラがアサカのHPを10回復した
アサカのHPが110になった
```


参考にした本↓↓　わかりやすいです:relaxed:
### すっきりわかるJava入門
[さくらVPS+Ubuntu22.04]Redisをインストール

## 環境

- さくらVPS
- Ubuntu22.04

## 手順

[Redis公式](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/)のとおりやればサクッと入る。

```さくらVPS
$ curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

$ echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list

$ sudo apt-get update
$ sudo apt-get install redis
```

確認

```さくらVPS
$ redis-server --version
Redis server v=7.2.4 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=44edf16bebe6fed2
```

自動起動も有効にしておくのがベター

```さくらVPS
$ sudo systemctl enable redis-server
```

本番環境の構築だったのでパスワードの設定した

```さくらVPS
$ sudo /etc/redis/redis.conf
```

requirepassのコメントアウトを解除してパスワードを追加

```/etc/redis/redis.conf
# IMPORTANT NOTE: starting with Redis 6 "requirepass" is just a compatibility
# layer on top of the new ACL system. The option effect will be just setting
# the password for the default user. Clients will still authenticate using
# AUTH <password> as usually, or more explicitly with AUTH default <password>
# if they follow the new protocol: both will work.
#
# The requirepass is not compatible with aclfile option and the ACL LOAD
# command, these will cause requirepass to be ignored.
#
requirepass ${パスワード}
```

redis再起動

```さくらVPS
$ sudo systemctl restart redis-server
```

## インストール時の各コマンドの解説

```さくらVPS
$ curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

$ echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb (lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
```

これを実行したけど、なにをやっているのか。

```さくらVPS
$ curl -fsSL https://packages.redis.io/gpg
```

- `curl`コマンドで`https://packages.redis.io/gpg`にHTTPリクエスト
- `-fsSL`は`-f`と`-sS`と`-L`オプションをまとめて指定してる
    - `-f`:エラーレスポンスのとき、何も表示しない
    - `-sS`:進捗状況を非表示にするが、エラーの場合のみ出力する
    - `-L`:リダイレクトを有効にする

```さくらVPS
$ sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
```

- `sudo`: 管理者権限
- 直前に`curl`で取得した公開鍵を`gpg`コマンドで`/usr/share/keyrings/redis-archive-keyring.gpg`に格納しているのはなんとなくわかる
    - `--dearmor`:バイナリに変換するオプション
    - `-o`: ファイルに出力することを指定するオプション

```さくらVPS
$ echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb (lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
```

- `echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb (lsb_release -cs) main"`: 直前出力した鍵ファイルを使ってredis公式から最新の安定版パッケージを取得
- `sudo tee /etc/apt/sources.list.d/redis.list`: tee以降のファイルに結果を出力
【ヨーダ記法】新人エンジニアが入門書を読んでいたらジェダイマスターに出会った話

## 5/ 4はスター・ウォーズの日

5/ 4はスター・ウォーズの日。

公式ページによると、この日は「映画『スター・ウォーズ』の世界中のファンがスター・ウォーズの文化を祝い、映画を楽しむ日」だそうです。

由来は、作中の有名なセリフ ” **May the Force** be with you ”（フォースと共にあらんことを。）の “May the Force” と “May the 4th” をかけた語呂合わせから来ています。

## スター・ウォーズの英語

まもなく、そんな晴れの日を迎える映画『スター・ウォーズ』シリーズ。実は、英語版でしか分からない、とある 「仕掛け」があることをご存知でしたか？

英語版『スター・ウォーズ』では、英語の訛りによって、人種や出身惑星を区別しているのだそう。例えば、銀河を支配しようと企む「帝国軍」はイギリス英語、対して「反乱軍」にはアメリカ英語を喋らせることで、敵対関係を明確にしています。セキュラ将軍の種族であるトゥワイレックはフランス訛り、共和国の兵士クローントルーパーたちはニュージーランド訛り、そして共和国の敵であり、お金に貪欲なくせに臆病者のニモーディアンは日本語訛り…。

そんな、多様な英語を使い分けている英語版『スター・ウォーズ』ですが、一人だけ、「訛り」では収まりきらない奇妙な英語を喋る人物がいます。それが、かのグランドマスターことマスター・ヨーダ。彼の英語は、補語（C)や目的語（O)を先頭に持ってきた、おかしな文法になっています。例えば、こんな感じ。

- The Greatest Teacher, Failure is. （「失敗こそ、最高の教師じゃぞ。」）
- Not if anything to say about it I have.（パルパティーンの「今日でジェダイは死に絶える」に対して「さてどうかのう。それを決めつけるのはまだ早い」

１つ目は、 “Failure is the greatest teacher” という正規の文法から、主語と目的語を入れ替えています。２つ目は、正しくは、 “Not if I have anything to say about it” と言う強調構文になります（と、隣の席のデンマーク国籍のエンジニアが教えてくれました）。

参考サイト：https://millennium-padawan.com/language

## ヨーダ記法（ヨーダ条件式）とは

さて、本題です。

マスター・ヨーダのおかしな英語、実はプログラミング用語になっているのです！その名も「ヨーダ記法」あるいは「ヨーダ条件式」。筆者は、定番のプログラミング入門書「リーダブルコード」を読んでいる中で、この記法に出会いました。

このヨーダ記法は、プログラミングでよくあるミスを防ぐために生まれた記法です。

初学者のころ、最初に勉強するものの一つに「演算子」があります。代表格が「＝＝（イコール２つ）」。「左と右は同じ値ですか？」と、比較する演算子です。しかし、私たちが昔から馴染みのある「等しい」記号は「＝（イコール１つ）」。単体の＝記号で事足りてしまうと言う感覚が染み付いていることは珍しくないはず…。そんな状態で、「もし、 i が10であれば、~~する。」というif文を書くと、以下のようなミスが発生する可能性があります。

正：

```python
if (i == 10){~~}
```

誤：

```python
if(i = 10){~~}
```

「誤」のコードのように、「＝（イコール１つ）」の式を書いてしまうと、i に 10を代入してしまいます。通常、if 文の中で変数に値を代入するのは不自然ですが、コンピュータ的に見ると「もし、i に 10を代入することに成功したら、~~する。」と言う条件式としてコンパイルが成功してしまうため、間違いに気づけません。

そこで登場するのが、ヨーダ記法です。

ヨーダ記法で、先ほどの正誤の式を書いてみましょう。

正：

```python
if (10 == i){~~}
```

誤：

```python
if (10 = i){~~}
```

「正」の式は、通常通りにコンパイルが成功します。10 と i が等価であることを比較することには、何も問題がないからです。しかし、「誤」の式はエラーがでます。なぜなら、10 に i を代入することは不可能だからです。

このように、条件式で変数と値の位置を入れ替えることによって、思わぬミスを防ぐために生まれたのが、ヨーダ記法です。

## 今はもう使われない…？

そんな、偉大なジェダイマスターの名を冠したヨーダ記法ですが、実は現在はほとんど使われないそう。理由は大きく２つあります。１つは、「コードの流れが不自然になる」こと。確かに、直感的には、わかりにくいですよね。２つ目は、「コンパイラが警告を出してくれる」こと。そもそも、条件部分で代入できる言語には限りがある（C,C++など）ようですが、これらの言語も、条件式の条件部分で代入すると、警告を出してくれるそう。それなら、わざわざ直感的に読みにくい書き方をせずに、コンパイラの力に任せてコーディングしても、問題なさそうです。

## 最後に

2024年にエンジニアになった私にとって、プログラミング言語はすでにさまざまな便利機能を備えたもので、他にもたくさんの便利ツールを使えるのが当たり前。エディターは自動でコードフォーマットを手伝ってくれるし、GPTは命令すればほとんど使える正しいコードを書いてくれます。しかし、その技術進化の歴史には、先人たちの様々な苦労や工夫があったことを垣間みれました。時代の先端にいるからこそ、享受できるたくさんの恩恵（便利ツール）のありがたみを知れたので、使いこなせるよう頑張っていきたい所存です。

May the Force be with all engineers！
robloxでassistant

# 概要
robloxでassistantやってみた。

# assistant

https://create.roblox.com/docs/assistant

# 質問

プロジェクトをコピーしたい

# 回答

1.Roblox Studioを開きます。
2.メニューバーの「File」をクリックし、「Open」を選択します。
3.コピーしたいプロジェクトのファイルを選択し、「Open」をクリックします。
4.メニューバーの「File」をクリックし、「Save to Roblox As...」を選択します。
5.「Place Name」に新しいプロジェクトの名前を入力します。
6.「Create」をクリックして、新しいプロジェクトを作成します。

これで、元のプロジェクトと同じ内容を持つ新しいプロジェクトが作成されます。新しいプロジェクトは、Robloxアカウントに保存されます。

もし他に質問があれば、お気軽にどうぞ！

以上。
【pytest】関数をモックしてテストする

# はじめに
pytestでモックを使ったコードを実装していたので簡単にまとめてみます。


# テストしたいこと(一部)
- fetch_data関数からのステータスコードが200のとき、正しいデータが返ってくること
- データにはfetch_data関数からのレスポンスと、table.get_item関数からのレスポンスが含まれる

# テストする上でのポイント
- モックする関数が2つ(fetch_data、table.get_item)
- unittest.mockのpatchとMagicMockを使って関数の返り値をモック
- boto3がprofileを参照しにいくため、テストでもダミーのAWS認証情報が必要です(未設定だとおこられます)

# テスト対象のコード

```python:app/sample/handler.py
def main(event, context):
    r = fetch_data(event['authorizationToken'])
    status = r.status_code
    if status == 200:
        data = json.loads(r.text)
        context = {
            id: '12345'
        }
    else:
        context = {}
    table_response = table.get_item(Key={'id': 'hoge'}, ProjectionExpression="column")
    table_item = table_response.get('Item')
    response = {}
    if table_item and table_item.get('column'):
        response['config'] = 
        {
            hogehoe
        }
    response['context'] = context
    return response
```

# テストのコード
```python:app/tests/test_handler.py
import pytest
import os
from unittest.mock import patch, MagicMock
import json

from sample.handler import main


@pytest.fixture()
def fetch_data_response_200():
    response = MagicMock()
    response.status_code = 200
    response.text = json.dumps({
        'id': 'user123'
    })
    return response


@pytest.fixture()
def example_event():
    return {
        'authorizationToken': 'hogeToken',
        'methodArn': 'hogeArn'
    }


def test_main_200(fetch_data_response_200, example_event):
    with patch('sample.handler.fetch_data', return_value=fetch_data_response_200), \
         patch('sample.handler.table.get_item') as mock_get_item:
            mock_get_item.return_value = {
                'Item': {
                    'id': {'S': '123'},
                    'column': {'L': [{'S': 'hogehoge'}]}
                }
            }
            result = main(example_event, {})
            assert result['context']['id'] == '12345'
```

# おわりに
今回はチームメンバーが実装したコードに後からテストを加えたのですが、関数毎に実装してくれていたのでテストが書きやすかったです。mainの中身を関数の呼び出しのみに留めることができればもっと書きやすくなりそうです。
Eclipseのデバック入門

# デバックのやり方

Eclipseのデバックについてまとめた。
OSはwindows。

## ブレークポイント
+ プログラムの実行を一時停止するポイント
### 設定方法
+ 設定したいソースコードの行番号の左側をダブルクリック

![スクリーンショット 2024-04-29 180504.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767613/d475f3d2-e6ea-79c5-6335-94f0d95bbd01.png)

### 解除方法
+ もう一度ダブルクリック

## 動作
|コマンド|説明|備考|
|:-:|:-:|:-:|
|F11|デバック実行|Ctrl + F11で普通の実行|
|F5|次の1行を実行|メソッド内部まで見たい場合|
|F6|次の1行を実行|そのまま下の行に移動|
|F7|メソッドを最後まで実行し呼び出し元へ戻る|
|F8|次のブレークポイントまで実行|ブレークポイントがない場合は最後まで実行|
|Ctrl + R|カーソルがある行まで実行|
|Ctrl + 2|処理を中断|

## ビュー
+ デバック時の状況を確認するのに必要
+ 「ウインドウ」→「ビューの表示」からそれぞれ選択可能

![スクリーンショット 2024-04-29 181943.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767613/a5acab29-47c3-b266-638a-0b9ff8e8f533.png)

|ビューの名称|説明|備考|
|:-:|:-:|:-:|
|デバック|デバック時の履歴の確認|
|変数|デバック時の変数の確認||
|ブレークポイント|ブレークポイントの確認・除去|全除去可能|
Macの備忘録 (超初心者) <Directory(path)の検索方法>

<h2>
Macから一時ファイルを削除する方法
</h2>

<h3>
一時ファイル
</h3>

<h5>
Cache fileと一時ファイル(temp file)には、CookieやPassword、Web browzerのcacheや履歴、Messaging cache folder、一部完了したdownload、applicationのtemp fileとfolder等、Mac(PC)の容量を取る全てのものが含まれます。
</h5>

| 一時ファイル | 説明 |
|:-:|:-:|
|ブラウザのCookie|ブラウザが、訪問したウェブサイトから受け取るデータで、そのウェブサイトを再び開いたときに、より便利に、そして早く動作する用に使われます。|
|古いシステムログ|システムの活動に関する情報を含む古いログファイルのことです。|
|アプリケーションキャッシュ|アプリで一度使ったことのあるデータを保存しておくことで、同じ作業を再度繰り返さず、高速化するために使用されます。|
|ドキュメントの編集段階のバージョン|定期的に一時保存されるドキュメントの編集情報|

<h2>
一時fileの保存されるpath
</h2>

<h3>
path
</h3>

```bash
~/Library/Caches/
```
:::note
他にも
/var/foldersにtemp file有り
:::

<h5>
Terminalで実行する場合のCodeは下記
</h5>

```bash
cd ~/Library/Caches/
```
<h5>
Fileの一覧を表示するcodeは下記
</h5>

```bash
ls ~/Library/Caches/
```

![スクリーンショット 2024-05-01 10.44.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575336/e72384fe-e039-c9e3-4107-8b30c42e3520.png)

<h5>
Fileの削除するcodeは下記
</h5>

```bash
rm -rf ~/Library/Caches/*
```
<h6>
上記の実行で一時Fileが削除されるのでPCに少し空きが出るかも。
</h6>
PHPの参照渡し方法


# PHPの参照渡し方法

参照渡しについて説明しているサイトは下記のようなプログラムの書き方をしています。


```php
<?php

$message = "php";
rewrite($message);
print($message);

function rewrite(&$args) {
	$args = "TestMessage";
}
?>
```

これで**TestMessage** と出力されます。
**$message** を直接変更していないのに、**rewrite関数** 内での変更が **$message** に対して有効になります。
関数の引数に **&** をつけなければ、上書きされることはありません。

次に、変数代入の参照渡しを説明します。

## 変数代入の参照渡し

```php
<?php

$message = "php";
$b = & $message;
$b = "TestMessage";
print($b);
?>
```

これは、**TestMessge** と出力されます。
2行目で **$message** の持つ参照先が **$b** に渡されているため、**$message** の変更と **$b** の変更は同義となっています。

## 関数の戻り値の参照渡し

```php
<?php
class TestMessage {
	var $val = "message";
	
	function &getValue() {
		return $this->val;
	}
}

$message = new TestMessage();
$a = & $message->getValue();
$a = "HelloWorld!";
print($message->val);
?>
```
これは、**HelloWorld** と出力されます。
関数 **&getValue** の **&メソッド** 実行に戻り値 **=&$message->getValue();** のどちらかの **&** が抜けても参照渡しにはなりません。
ECHONETLite2MqttのMqtt Broker Port設定

日本でスマートホームを利用する際に欠けないライブラリECHONETLite2Mqttの設定をしましたが、Mqtt Brokerのポートを変更したい時ちょっとハマってました、一旦記録しておきます。

https://github.com/banban525/echonetlite2mqtt

結論から言うと、Mqtt Brokerのポートを変更する時、`MQTT_BROKER`と`MQTT_OPTION_FILE`を両方設定しないといけないです。

例えば、僕の場合Mqtt Brokerポートを`21883`に変更したい、最初は`MQTT_BROKER`だけを`MQTT_BROKER=mqtt://192.168.1.11:21883`に設定したが、WebUIの右上に`Disconnected`が表示され、Dockerのログを見るとまた`1883`ポートが使われています。
なので、`MQTT_OPTION_FILE`でオプションファイルを作って、指定したらOKになりました。

```json
{
  "port": 1883
}
```
配列（Array）とスライス（Slice）について

配列（Array）とスライス（Slice）について
それぞれの特徴をまとめた

# 配列（Array）

・配列は固定長のデータ構造であり、要素数を宣言時に指定し、後から変更することはできない。
・配列は要素の型と要素数を指定して宣言する例えば、 var arr [5]int は、int型の要素を5つ持つ配列となる
・配列はメモリ上に連続した領域を確保し、要素のインデックスを使ってアクセスする
・配列は静的なサイズを持つため、動的に要素を追加したり削除したりする必要がある場合には適していない

```
// 配列の定義
var arrayName [size]dataType

// 例: 整数型の配列を定義する
var numbers [5]int

// 初期化された配列
var numbers = [5]int{1, 2, 3, 4, 5}

// 要素数を省略することもできる（要素数は初期化された要素の数で決まる）
var numbers = [...]int{1, 2, 3, 4, 5}

// 特定のインデックスに値を設定する
numbers[0] = 10
```

# スライス（Slice）
・スライスは可変長のデータ構造であり、動的に要素の追加や削除が可能
・スライスは配列の部分列を表現するため、既存の配列からスライスを生成することができる
・スライスは、要素のインデックスを使ってアクセスするが配列とは異なり、スライスの長さや容量が動的に変化する
・スライスは make() 関数を使って作成する。例えば、 var slice []int = make([]int, 5) は、int型の要素を5つ持つスライスとなる
・スライスは動的なサイズを持つため、動的なデータ構造を扱う場合や、要素の追加や削除が必要な場合に適している。
```
// スライスの定義
var sliceName []dataType

// 例: 整数型のスライスを定義する
var numbers []int

// 初期化されたスライス
numbers := []int{1, 2, 3, 4, 5}

// スライスの一部を取得する
var partOfSlice = numbers[startIndex:endIndex]

// スライスに要素を追加する
numbers = append(numbers, 6)
```

ということで、スライスのほうが融通効くためスライスを利用するパターンが多いそうだ。
でも配列は配列で使い道がありそう。今業務で作ってるテストデータ作成ツールでも固定要素の配列を使用しているし、、
適宜使い分けましょうということで。

そしてスライスをより便利につかう関数があるということで調べてみた結果が以下

# len() 関数
len() 関数は、スライスや配列、マップ、文字列などの長さ（要素数）を返す。
```
s := []int{1, 2, 3, 4, 5}
fmt.Println(len(s)) // スライスの長さを出力する
```

# cap() 関数
cap() 関数は、スライスの容量を返。スライスの容量は、スライスが内部的に割り当てられている配列のサイズを表す。
```
s := make([]int, 5, 10) // 容量10のスライスを作成する
fmt.Println(cap(s)) // スライスの容量を出力する
```

len() はスライスや配列、マップ、文字列などの長さを取得し、cap() はスライスの容量を取得する
おそらくよく使用することになると思うので、勝手に覚えるとは思うが頭の片隅に潜めておく。
ffmpeg でノイズゲート (指定より小さい音を除去) を適用したい

## きっかけ

8mm ビデオテープの映像を、キャプチャボードでダビングしていたとき。

ノイズゲートを適用しようとしたが、「ffmpeg ノイズゲート」で検索しても、なぜか思ったものが出てこなかったので記事作り。

## ノイズゲートとは

簡単に言うと、音声データに対し「指定音量より小さい部分は、完全に音量 0 にする」こと。

例えば、普通に聞く分には無音に感じるが、波形とかで見てみると小さくノイズがのっている、以下 (メモリ 0.0~1.9) のような部分について。

![noise-gate-none.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540894/e2d963ed-f64f-eb64-7e76-d10a1daebc64.gif)

ほとんど聞こえないので放っておいてもよいのですが、余計なデータを消せるに越したことはありません。そこでノイズゲートの出番です。

## agate フィルタの適用

[ffmpeg](https://ffmpeg.org/) は、コマンドラインで動画ファイルや音声ファイルなどを色々やりくりできる万能なオープンソースソフトウェアです。多彩な映像・音声フィルタも搭載しており、先述のノイズゲートも実装されています。

ノイズゲートを適用するには、音声フィルタ `agate` を使います。まずはパラメータをデフォルトのままでやってみましょう。

```sh
ffmpeg -i input.mp3 -af "agate" output.mp3
```

波形を見てみると？

![noise-gate-def.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540894/b812fdcf-8919-df0d-5e2f-0eae304c319b.gif)

いい感じに無音化されました。デフォルトのパラメータで割と十分そうです。

## パラメータ調整

ただ、よく見てみると･･･？

![noise-gate-compare.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540894/8297809e-46a9-abb1-8dd8-8544bd67ff61.gif)

必要な音が少し減衰している･･･！(とはいっても、集中して聞き比べないとわからないレベルではありますが。)

パラメータを調整してみましょう。`agate` フィルタのパラメータはこちらの通り。

https://ffmpeg.org/ffmpeg-filters.html#agate

色々触ってみた結果、(この音声データでは) `threshold` を `0.05` にするだけでようさそうでした。

```sh
ffmpeg -i input.mp3 -af "agate=threshold=0.05" output.mp3
```

![noise-gate-thr.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540894/5cc9d68c-534e-724f-6cb7-1c85eb0cbc1d.gif)

余計な部分の無音化もされつつ、必要な音の減衰も気にならなくなりました。

:::note warn
ちなみに、パラメータを下手にいじるといびつな音になってしまいます。慣れていない、詳しくないうちは、デフォルトパラメータを基本にすることを推奨します。
:::
git actionsでgit push時お名前のVPSサーバ(ubuntu)のソースを更新する

# 鍵を作成
お名前のデフォルトの秘密鍵は使わず、自分でパスワードなしの秘密鍵を作成しその鍵で接続できるようにします
※ここではその説明は省きます

# Simple workflowを作成
該当のリポジトリーのActionsを選択し「Simple workflow」を検索する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/2b8142f4-9287-8368-6da3-159523ad20fe.png)

# ワークフローを作成

```
name: CI
on:
  push:
    branches: [main]
  pull_request:
    branches: [ main ]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install SSH Key for Deploy
        uses: appleboy/ssh-action@master
        with:
          key: ${{ secrets.SK }}
          host: ${{secrets.SSH_HOST}}
          username: ${{secrets.SSH_USERNAME}}
          port: ${{secrets.SSH_PORT}}
          script: |
            cd github/laravel-app
            git pull origin main     
```

# 環境変数を設定する
該当のリポジトリーの[Settings]-[Settings]-[secrets and variables]-[Action]の「Repository secrets」を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/004d6aef-b6db-f375-b6fd-b8ea421dad48.png)


| 項目 | 設定値 | 内容 |
|:-:|:-:|:-:|
|SK|秘密鍵のキー|SSH の 秘密キー|
|SSH_HOST|157.x.xxx.xxx|VPS の IPアドレス|
|SSH_USERNAME|user|VPS で設定したユーザーネーム|
|SSH_PORT|22|SSH へ接続する PORT 番号（デフォルトは 22）|
ファイルコンテンツの取得アクションを使う



+ [「ファイルコンテンツの取得」とは](https://rpahack.com/powerautomate-get-file-contents)

+ [Power Automate 「ファイル コンテンツの取得(SharePoint)」アクション](https://blog-tips.sekenkodqx.jp/2021/01/31/power-automate-action-get-file-content-sharepoint/)

+ [Power Automate の Microsoft SharePoint コネクタ](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers)


ファイルのコンテンツ（中身）はIDを指定してファイルコンテンツの取得アクションを使うみたい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b108896a-ea7d-cbcd-e6b1-d77b29f27de9.png)


# 補足

自分で投稿しておきながら、再度見たら意味が分かりませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/84a75cbf-38b0-45a2-8519-e8e9b1e54369.png)

/ を入力して動的な値を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/00d6fad2-2312-4e57-9aca-883c697b2411.png)

おおお、やっと意味が分かった。トリガーで選んだIDを選べばいいということだな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5fdcda4e-756c-43ec-aa62-3dfccdd1c325.png)

# Apply to each がないんですよねぇ

やめて欲しい。こんな日本語意味が分からん。
外国語は全く理解できませんが、プログラム等のコマンドは変な日本語を使わないで欲しい。探せない。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/11d3bbda-7071-4677-83ed-0cb153e4274f.png)

ここでは本文は使えないんだろうか？ない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/457a72ff-f8b1-4aa3-9d95-977d6a60aed4.png)

変数には追加できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b586c6d3-dedb-400f-90f1-70741037bc70.png)

おおお、また同じ現象ですね。本当には実務で使えているのだろうか？

+ [選択したファイルの場合はどこから利用できるんだろうか？](https://qiita.com/Keiji_otsubo/items/6fdd84b638633a00a2ea)

やっぱり起動できません。腐っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4ddc1459-f3e1-4227-97f6-bcd7c8081e98.png)


# セキュリティの構成によりコンテンツは表示されません。

おいおい、作った人にも表示させないってデバッグすらできん。何だこの仕様は？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7e404504-9fb0-4d45-9075-0ff70f6fb887.png)

嫌がらせにしか思えない。これで金払っているって考えると、とても腹立たしい。


https://community.powerplatform.com/forums/thread/details/?threadid=8b6f6a28-a46f-ef11-a670-6045bdd49017

# "status": 404, "message": "File Not Found\r\nclientRequestId:

何で！！！特殊文字とかないよ

https://community.powerplatform.com/forums/thread/details/?threadid=09405c28-0fe1-469d-8389-5e8c90aa1182
SESのSMTPでコマンドラインからメール送信

##### Postfix のインストール
```bash
dnf --assumeyes install postfix
systemctl --now enable postfix
```

##### S-nail のインストール
S-nail (または S-mailx) は2010年頃に開発が終了した [Heirloom mailx](https://heirloom.sourceforge.net/mailx.html) のフォーク。[^s-mailx] [^s-nail]
```bash
dnf --assumeyes install s-nail
```

[^s-mailx]: <q>S-mailx は、2010年頃に開発が終了した Heirloom mailx のアクティブなフォークです。 S-mailx は Heirloom mailx の機能のほとんどを維持し、独自の機能を多数追加しています。継承された POP3 と IMAP の機能を削除する計画もありましたが、これらの機能は人気のある要求のために保持されています。 (S-mailx is an active fork of Heirloom mailx which ceased development around 2010. S-mailx has preserved most of the latter's feature set and added many of it's own. While there were plans to remove the inheirited POP3 and IMAP functionality these features have been retained due to popular demand, though a future re-write is likely.)</q><cite>[Hacking](https://www.sdaoden.eu/code.html) - <i>www.sdaoden.eu</i></cite>

[^s-nail]: <q>`s-nail` メール処理システムが、`mailx` ユーティリティーに置き換わりました。`s-nail` ユーティリティーは `mailx` と互換性があり、新機能が数多く追加されました。`mailx` パッケージはアップストリームで維持されなくなりました。</q><cite>[4.6. インフラストラクチャーサービス Red Hat Enterprise Linux 9 | Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/9.0_release_notes/enhancement_infrastructure-services) - <i>access.redhat.com</i></cite>

##### .mailrc の作成
```bash:~/.mailrc
set v15-compat
set smtp-use-starttls
set smtp-auth=login
set smtp=smtp://email-smtp.us-west-2.amazonaws.com:587
set smtp-auth-user=AAAAAAAAAAAAAAAAAAAA
set smtp-auth-password=BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
set ssl-verify=ignore
set from=from@example.jp
set nss-config-dir=/etc/pki/nssdb/
```

##### メール送信
```bash
echo "message" | s-nail -v -s 'Subject' to@example.jp
```
[^send-email-smtp-client-command-line]

[^send-email-smtp-client-command-line]: <cite>[コマンドラインを使用して、Amazon SES SMTP インターフェイスへの接続をテストする - Amazon Simple Email Service](https://docs.aws.amazon.com/ja_jp/ses/latest/dg/send-email-smtp-client-command-line.html) - <i>docs.aws.amazon.com</i></cite>
Wagtaiでviews.pyやurls.pyを使わずにHTMLテンプレートにDBモデルのデータを表示する方法

## きっかけ
wagtailプロジェクトをビルドした際にデフォで作成されるhomeアプリケーションの中の
templatesディレクトリにhome_page.htmlに他のアプリケーションのモデルのデータを
表示したいということがありました。


## 結論:models.pyにコンテキストで渡す
homeアプリケーションのmodels.pyに他のアプリケーションのモデルをimportしてきて
コンテキストでhome_page.htmlにDBのデータを渡すことができます。
前提として、base.pyのINSTALED_APPに他のアプリケーションの登録、プロジェクトアプリのurls.pyに
インクルードする設定は完了していることとします。

shopというアプリケーションがあったと仮定して、そのshopのmodels.pyの内容を
home_page.htmlに表示します。

早速、コンテキストの書き方を紹介します。models.pyにこのように書きます。
```python:models.py
from django.db import models

from wagtail.models import Page
from wagtail.fields import RichTextField
from wagtail.admin.panels import FieldPanel

#shopアプリケーションのモデルクラス(例では"ShopPage")をインポート
from shop.models import ShopPage 


class HomePage(Page):
    body = RichTextField(blank=True)

    content_panels = Page.content_panels + [
        FieldPanel('body'),
    ]



#ここがコンテキスト
def get_context(self, request, *args, **kwargs):
    context = super().get_context(request, *args, **kwargs)

    context['shops'] = ShopPage.objects.live().all()
    
    return context
    
```
これで、テンプレート側にデータを渡す準備が完了です。
テンプレート側で、'shops'という名前で受け取ることができます。
今回は、.live().all()で公開設定のものを全て取得していますが、必要に応じて
他の条件フィルタをかけるなども可能です。

続いてテンプレート側での表示のさせ方を説明します。
このように書いてください。

```html:home_page.html
{% for shop in shops %}
    <div>
        <div>{{shop.name}}</div>
        <p>{{shop.detail}}</p>
    </div>
{% endfor %}

```
forでループさせます。モデルのカラム名(例ではnameやdetail)をドットで繋いでください。

以上です。
[VSCode / Git] 最終 commit 以降の変更箇所を目立たせる機能が、オフになった時の対策

# 何を言ってるの？

以下は VSCode の画面の一部を移した画像です。赤枠と赤色の矢印で示した箇所に、縦の青いラインが見えますよね？|･`ω･´)

![スクリーンショット 2024-04-25 11.53.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/59bfc823-1272-f219-2a3b-9261f0d20fa3.png)

これは、実は、「最終コミット以降に変更された行」(差分) に引かれるラインであり、自分の修正箇所を一目で区別できる便利な機能なのですが、、、

私は、この機能が突如動かなくなる、という現象に遭遇しました(´∩ω∩`\*)

この解決方法を調べたので記載しました。


# 対処方法

VSCode の `settings.json` に以下の行を追加したら、元通り、上記画像のように青色のラインが引かれる状態に戻りました！

```json:settings.json
{
    "scm.diffDecorations": "gutter",
}
```

これだけ！(\*˘︶˘\*)


# 参考記事

この機能が `Gutter indicators` という名前だということを、以下の記事で教えていただきました。

https://qiita.com/TkTkTkTkTako/items/a0b04dfef562bf74366f

対処方法のヒントはこちらに書いてありました。

https://stackoverflow.com/questions/43969277/how-can-you-disable-gutter-indicators-in-vs-code
Mac の外部ディスプレイに DELL 4K ディスプレイを HDMI 接続すると色がおかしくなる症状の改善方法

# はじめに

MacBook Pro に DELL の 4K モニタ U2718Q を HDMI で接続すると YPbPr モードになってしまい色がにじむ現象が自分の環境で発生しました。
この症状の改善方法をメモとして書いておきます。

# 動作環境

- MacBook Pro (13-inch, 2020) Intel Core i7
- macOS Monterey 12.6.3

※ネット情報だと M シリーズCPU環境でも起きるらしいです。

# 解決方法

「このディスプレイは必ずRGBモードで接続してね」という設定ファイルを作ることで解決します。

## 1. rb ファイルのダウンロード

以下の rb ファイル（Ruby スクリプトファイル）をダウンロードします。（制作者さんに感謝！）

https://gist.github.com/adaugherity/7435890

## 2. ディスプレイ設定ファイルの作成

YPbPrモードになってしまうディスプレイをつないだ状態でダウンロードした ruby スクリプトを以下のコマンドで実行してディスプレイ設定ファイルを作成します。

`ruby ./patch-edit/rb`

自分環境だと実行したフォルダの下に `DisplayVendorID-10ac/DisplayProductID-a0e9` というフォルダ＆ファイルが作られました。

## 3. ディスプレイ設定ファイルの移動

生成されたフォルダ＆ファイルを以下の場所に移動します。

`/Library/Displays/Contents/Resources/Overrides/`

自分の場合だと `/Library/Displays/Contents/Resources/Overrides/DisplayVendorID-10ac/` というフォルダに `DisplayProductID-a0e9` ファイルを sudo cp コマンドで配置しました。

## 4. ディスプレイを再接続して動作確認

ディスプレイを再接続すると RGB モードになっていて、色が滲まなくなっているはずです。

# おしまい

U2718Q に限らず DELL の他のモニターでも起きるようなことがネットで書かれていたので同様のトラブルが起きている人はこの方法を試してみてください。
フロントエンドのテストを考える（フロントエンドのテスト①）

※この記事はドラフト版です。
ストーリーが定まらない。。。。

# テストの自動化やテストコードについて
フロントエンドのテストについて考えていきたいと思います。

## フロントエンドのテスト!?
フロントエンドのテストなんて自動化するどころか手動テストもいらないですよね。
一番、削れる部分ですよね。という認識でおります。
※UI・UXを充実させるのとは別の話

フロントエンドのテストを学ぶ中で、この認識が変わると良いなと思います。

## なぜ必要なのか
軽く調べるとモダンなフロントエンド（React）などで自動テストを行っていることが多いようです。
Reactは知らん人が作ったライブラリ依存になるから
ライブラリの変更の度に手動テストをしていると大変という話が見つかりました。
それは確かにそうですね。
「React使うからテストを自動化する必要がある」が答えな気がしてきました。
※なんでそうまでしてReactを使うのかについては、ここでは考えません。

# モダンなフロントエンドのテストの種類
いったん何も考えず、モダンなフロントエンドのテストの基本について考えます。
なんか名前が全体的にオシャレです。。。

- 関数単体テスト
　関数単体のテストです。
- コンポーネント単体テスト
　コンポーネント(htmlとjsの処理の塊と理解）単位のテスト
- コンポーネント結合テスト
  上記コンポーネント間のテストと理解
- コンポーネントビジュアルリグレッションテスト
　表示が変わらないかどうかのテストと理解
　ちなみにリグレッションテストとはデグレを見つけるテストらしいです（おしゃれ...）
- E2Eテスト
　最終の結合テストみたいな理解

# まとめ
別記事でひとつづつ上記のテストを試していこうと思います。
JavaScriptについて少し整理してみた（基本ほりさげ②）

※この記事はドラフト版です。

Javaと同じような感覚で使っていると、すごく違和感があるのでちゃんとJavaScriptの基本から確認してみました。

# オブジェクトとオブジェクトリテラル
```js
let person = {
  name: "John",
  age: 30,
  gender: "male",
  greet: function() {
    console.log("Hello, my name is " + this.name + ".");
  }
};
```
### 定義
オブジェクトはプロパティの集合。プロパティとは名前（キー）と値（バリュー）が対になったもの。
オブジェクトリテラル{}という記法を用いて、オブジェクトを生成できる。

### 現在の認識
よく理解できないので、いったんこの認識で突き進む。

- クラスが前提ではない？javaのようにクラス作ってインスタンス化していく使い方をしない。
- オブジェクトがインスタンスのような感覚？
- 構造体とインスタンスの境目がないようなイメージ？



# オブジェクトの複製
#### パターン１
同じものを書く
```js
let person1 = {
  name: "John",
  age: 30,
  gender: "male",
  greet: function() {
    console.log("Hello, my name is " + this.name + ".");
  }
};

let person2 = {
  name: "Jane",
  age: 25,
  gender: "female",
  greet: function() {
    console.log("Hello, my name is " + this.name + ".");
  }
};
```
#### パターン２
オブジェクトのコピーを作る
1. テンプレートのオブジェクトを作成
1. Object.assignメソッドでテンプレートオブジェクトを新しいオブジェクトにコピー
```js
let personTemplate = {
  name: "",
  age: 0,
  gender: "",
  greet: function() {
    console.log("Hello, my name is " + this.name + ".");
  }
};

let person1 = Object.assign({}, personTemplate);
person1.name = "John";
person1.age = 30;
person1.gender = "male";

let person2 = Object.assign({}, personTemplate);
person2.name = "Jane";
person2.age = 25;
person2.gender = "female";
```

### パターン３
関数を使用してオブジェクトを生成する
※これがclassに近い
```js
function createPerson(name, age, gender) {
  return {
    name: name,
    age: age,
    gender: gender,
    greet: function() {
      console.log("Hello, my name is " + this.name + ".");
    }
  };
}

let person1 = createPerson("John", 30, "male");
let person2 = createPerson("Alice", 25, "female");

person1.greet(); // Output: Hello, my name is John.
person2.greet(); // Output: Hello, my name is Alice.
```

# 継承
### ポイント
1. 子オブジェクト内でcall()メソッドを使って親オブジェクトのコンストラクタを呼びだす
1. Object.create()メソッドを使ってAnimalのプロトタイプをDogに設定

なんかここでnew演算子が出てきた。


```js
// 親オブジェクト
function Animal(name) {
  this.name = name;
}

Animal.prototype.sayName = function() {
  console.log("My name is " + this.name + ".");
}

// 子オブジェクト
function Dog(name, breed) {
  Animal.call(this, name); // 親オブジェクトのコンストラクタを呼び出す
  this.breed = breed;
}

Dog.prototype = Object.create(Animal.prototype); // Animalのプロトタイプを継承
Dog.prototype.constructor = Dog; // constructorの再設定

Dog.prototype.bark = function() {
  console.log("Woof!");
}

// インスタンスの作成
let myDog = new Dog("Buddy", "Golden Retriever");
myDog.sayName(); // Output: My name is Buddy.
myDog.bark(); // Output: Woof!
```

# クラス?
# まとめ
C#でWinRTダイアログを呼び出す


# 環境
Windows 11 Pro (64bit)
Visual Studio Community 2022

# MessageDialog
適当なプロジェクト名のディレクトリを用意する。
例：`C:\Projects\.NET\MsgDlgSample`

```
dotnet new console
```

```MsgDlgSample.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>
```

WinRTを使うためTargetFrameworkを`net8.0-windows10.0.22000.0`とする。

```Program.cs
using Windows.UI.Popups;
using WinRT.Interop;

var dlg = new MessageDialog("hello, world");
InitializeWithWindow.Initialize(dlg, 0x10010);
await dlg.ShowAsync();
```

`0x10010`はDesktopWindowのハンドル。

https://learn.microsoft.com/ja-jp/windows/apps/develop/ui-input/display-ui-objects#winui-3-with-c-also-wpfwinforms-with-net-6-or-later

ビルドと実行。

```
dotnet build
bin\Debug\net8.0-windows10.0.22000.0\MsgDlgSample.exe
```

# FileOpenPicker
適当なプロジェクト名のディレクトリを用意する。
例：`C:\Projects\.NET\PickerSample`

```
dotnet new wpf
```

```PickerSample.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net8.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

</Project>
```

WinRTを使うためTargetFrameworkを`net8.0-windows10.0.22000.0`とする。

```MainWindow.xaml.cs
using System.Windows;
using System.Windows.Controls;
using System.Windows.Interop;
using Windows.Storage.Pickers;
using WinRT.Interop;

namespace PickerSample;

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

    	var btn = new Button();
    	btn.Content = "hoge";
    	btn.Click += btn_Click;
    	Content = btn;
    }

	async void btn_Click(object sender, RoutedEventArgs e)
	{
		var picker = new FileOpenPicker();

		var hWnd = new WindowInteropHelper(this).Handle;
		InitializeWithWindow.Initialize(picker, hWnd);

		picker.FileTypeFilter.Add("*");
		var file = await picker.PickSingleFileAsync();
		if (file != null) {
			((Button)sender).Content = file.Path;
		}
	}
}
```

https://learn.microsoft.com/ja-jp/windows/apps/develop/ui-input/retrieve-hwnd#wpf-with-c

ビルドと実行。

```
dotnet build
bin\Debug\net8.0-windows10.0.22000.0\PickerSample.exe
```
PostgreSQL: コメントの付け方

```text
city=# comment on column cities.id is '識別記号';
COMMENT
city=# comment on column cities.name is '都市名';
COMMENT
city=# comment on column cities.population is '人口';
COMMENT
city=# comment on column cities.date_mod is '改定日';
COMMENT
```

次のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/82a1d9a1-a834-eca9-5717-c02a68e64d9c.png)

次のようにしてコメントを見ることもできます。

```text
city=# \d+ cities
```
シンボリックリンク経由でパスセンシティブなShellスクリプトを実行する方法

# 問題

例えば、`~/myproject/docker-compose.yml`を基にコンテナを起動するShellスクリプトを書いたとします。
```zsh:~/myproject/start
#!/bin/zsh

open -a Docker
sleep 3
docker-compose up -d
```

このスクリプトのシンボリックリンクをデスクトップに置きます。
```bash
chmod 755 ~/myproject/start
ln -s ~/myproject/start ~/Documents
```

このシンボリックリンクをUIからダブルクリック！！としても思う通りに動いてくれません。

```
no configuration file provided: not found
```

# 解決策

- どうにかして実体のパスに移動しましょう！
- 実体が実行されても差し支えないようにしましょう！

以上を満たすのに複雑な操作は必要ありません。
なぜなら、<font color="#f00">シンボリックリンク実行時にも`$0`は実体のパスを指してくれる</font>からです。

```zsh:~/myproject/start
#!/bin/zsh

cd `dirname $0`
open -a Docker
sleep 3
docker-compose up -d
```
シンボリックリンク実行結果
```
[+] Building 0.0s (0/0)  docker:desktop-linux
[+] Running 1/0
 ✔ Container myproject-php-1  Running  0.7s
```

少しでも多くの方の困る時間が5分でも短くなりますように。
MFA必須化を機に、AWSアカウントを閉鎖（解約）した

# はじめに
2024年より、ルートユーザーからAWSアカウントへログインする場合、MFAの設定が必須となりました。
そもそも、利用しないAWSアカウントが存在したため、これを機に閉鎖（解約）を実施しました。
https://aws.amazon.com/jp/blogs/security/security-by-design-aws-to-enhance-mfa-requirements-in-2024/

# 解約方法
- 「アカウント」をクリック


![スクリーンショット 2024-05-01 9.05.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/e3835be3-5c93-c07f-0b1f-8246f405453b.png)

- 「アカウントを閉鎖」をクリック


![スクリーンショット 2024-05-01 9.09.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/9e1f84c9-583f-e3eb-9935-e7d2a615f89c.png)
![スクリーンショット 2024-05-01 9.12.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/40b18bed-37c0-331c-f4da-81b9079bef80.png)

- 閉鎖をクリックした後、添付画像のように一切利用できなくなります

![スクリーンショット 2024-05-01 9.17.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/359afe33-958c-4ac5-adc9-defd727c0fb3.png)

- 再度ログインしたところ、閉鎖できてることを確認できました。90日までであれば、復活できるようです。

![スクリーンショット 2024-05-01 9.18.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/9f6abcbc-6c7c-dd19-24db-b516c9b46014.png)
Bootstrapを初めて使った話

# Bootstrapってなんだ…？
・HTML／CSS／JavaScriptから構成されるWEBフレームワーク
　→簡単にボタンやフォームなどを装飾できる！
 公式ドキュメント：https://getbootstrap.jp/

# 具体的にどう使うの？
・htmlのclassにbootstarpで定義されたクラス名を書く

```html:普通のボタン
<button type="button">Primary</button>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782060/25106c55-d1b9-60de-f4f4-2dd4ef5cbc39.png)


```html:bootstrapを使ったボタン
<button type="button" class="btn btn-primary">Primary</button>
//class="btn btn-primary"を追記
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782060/1752eec2-00c8-44bd-d934-a510ff7497cc.png)

# 使った感想
・簡単におしゃれな見た目を作れるのがうれしい！
・javascriptを使った動きがある装飾も簡単にできるのがうれしい！
・htmlにclass名を書いていって装飾するので、装飾しまくると肥大化しそう…。
・ある程度スタイルは決まっているので、もっとこうしたい！とカスタマイズ欲がわいてくる。
    →独自の色を使いたくて、カスタマイズ(Sass?)を試みたがうまくいかなかった…。
ユーザを無効にした場合に一時的に特別なユーザに割り当てる


+ [組織は、アカウント、テリトリー、商談、予測などに割り当てることができるプレースホルダー ユーザー ライセンスをどのように処理しますか?たとえば、営業担当者が退職し、そのテリトリーをオープン要求ユーザー アカウントに割り当てたい場合、どうすればよいでしょうか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bL9SU)

これらの議論を読むと、Salesforce ライセンスを使用する必要があると思います。

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X8qgMSAR

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8fOcSAJ

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8HkQSAV
Flutterでゲームが作れる！「Flutter Casual Games Toolkit」を使ってみた感想

# Flutter Casual Games Toolkitとは

<ul>
<li><b>Flutterでゲームを開発しやすくする</b>ための「まとめサイト」に近いもの(Flutter公式)</li>
<li>GitHub上にサンプルプロジェクトを上げている</li>
<li>解説動画やドキュメントをあげている</li>
</ul>

Flutterの公式サイトの中にある
https://flutter.dev/games

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925070/f65f3e28-c261-cef6-917d-cc8c7217d5ec.png)

GitHubでテンプレあり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925070/17fd70a6-3168-9bae-ce9a-6f9c05062e44.png)


# 良いところ
### 1. サンプルプロジェクトでとりあえず動かせる
GitHub上のプロジェクトを落としてきてビルドすると、ゲームを遊ぶことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925070/ac9e52f2-2e3c-e915-5ba8-d18a9782dddd.png)

### 2. アプリ内課金や広告のドキュメントが参考になる
ゲーム以外のアプリにも参考になるアプリ内課金や広告のドキュメントが充実しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925070/ed0f298d-5f9c-f23c-948a-0a6bc665c820.png)

# 悪いところ

### 1. 2Dのみ
3Dも欲しいところですが、現状2Dのみです。

### 2. 画面上にオブジェクトを置けない

Unityだと以下のようにゲームの画面にオブジェクトを置いて、移動できたり回転出来たりできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925070/de3ded6e-6ab4-9db8-6b64-e6c0c288e4ad.png)

ただFlutterはUIをコードで決定するのでこのようなことはできません。

### 3. コードが分かりにくい
Unityのように「どのオブジェクトにどのコードをアタッチしたか」がFlutterでは分からないです。物体がたくさん出てくるゲームだと厳しそうです。

## 考えうる「使いどころ」

### ECアプリのポイントが貯まる簡単なゲーム？

ローソンのポンタ(ポイントカード)のゲームがあるみたいです

![221028_pontafriends_750x464.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925070/daadfadf-9f6f-d186-8025-4d3786f87494.png)

このような「元々はゲームではないが、おまけ要素ぐらいでほしい！」の時に使えそうです

# まとめ
UnityやUnreal Engineのようなものを求めてはいけないですね。ただ、Flutterを使う人は一度ドキュメントを読んでみると面白いと思いました！
ヒストグラムをマウスでビン分割しバンドを作成する(SPSS Modeler データ加工逆引き10-13)

# ヒストグラムをマウスでビン分割しバンドを作成する

![スクリーンショット 2024-04-22 10.53.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1d503ecf-f47d-1fe5-3b07-8274faa98fdf.png)

　この内容は逆引き3-15内でも紹介されています。

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

・　特徴量作成のために分布を確認しながら値をカテゴリに分割する
・　集計のために分布を確認しながら値をカテゴリに分割する

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

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

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

![スクリーンショット 2024-04-22 10.54.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5b497aaf-931c-1178-8685-017a7f637b4a.png)

a.入力するデータは次の通りです。
![スクリーンショット 2024-04-22 10.56.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d03db9f8-3182-1ad9-d1ef-ab9f57b21343.png)

b.[ヒストグラム]ノードを編集します。
![スクリーンショット 2024-04-22 10.57.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/183b5b8f-2e1a-ceed-9761-89da9e44a0e5.png)

　
[実行]します。
![スクリーンショット 2024-04-22 10.58.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5d6ef261-ddce-6829-d689-5b94f4241b1b.png)

#### 分布を確認しながら任意の閾値でビン分割する

[表示]メニューから[インタラクティブ]にチェックを入れて、ツールボタンを表示させます。
![スクリーンショット 2024-04-22 10.58.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2c24f83a-bde7-7759-d81a-269e7f20ca09.png)

赤枠ボタンを押して以下のように2箇所にビンを立てます。
![スクリーンショット 2024-04-22 10.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/00fce66e-3777-8918-b9d4-be3ef8dda6be.png)

[生成]メニューから[バンドのフィールド作成ノード]を選択します。cのノードが自動生成されます。
![スクリーンショット 2024-04-22 11.06.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d57dd85f-e1b4-93ff-206e-5a823c97f33f.png)

c.[フィールド作成]ノードを編集します。
![スクリーンショット 2024-04-22 11.12.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e9f39b7e-a590-2b36-acc9-06ac511e9de9.png)

[テーブル]ノードを実行します。
![スクリーンショット 2024-04-22 11.13.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ad51a357-a54f-1be0-fe98-ccad2edaeecc.png)

d.[ヒストグラム]ノードを編集して実行します。
![スクリーンショット 2024-04-22 11.14.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5a1d5b21-2a69-dc3b-b27e-664c52693601.png)

#### 注意事項

マウスでビン分割した後に以下のように値を整える場合には不等号の表記に気をつけます。

![スクリーンショット 2024-04-22 11.37.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c2737611-f079-dfcb-6c20-461e9492d8d0.png)


## 4.参考情報

#### 値を任意の閾値でランクに分割する

https://qiita.com/416nishimaki/items/0742e7ad71cf563a6ebf

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
Javaアプリケーションサーバ一覧

Javaアプリケーションサーバーを一覧にしてみた。
|組　　　織|種　　別|製　品　名|製品ページ|
|:-|:-|:-|:-|
|IBM|商用|WebSphere AS ND/Base|https://www.ibm.com/jp-ja/products/websphere-application-server|
|IBM|商用|WebSphere AS Liberty Core|https://www.ibm.com/jp-ja/products/cloud-pak-for-applications/liberty|
|IBM|OSS|Open Liverty|https://openliberty.io/|
|RHEL|商用|JBoss EAP|https://www.redhat.com/en/technologies/jboss-middleware/application-platform/|
|RHEL|OSS|WildFly|https://www.wildfly.org/|
|RHEL|OSS|Quarkus|https://quarkus.io/|
|Oracle|商用|WebLogic Server|https://www.oracle.com/jp/java/weblogic/|
|Oracle|OSS|Helidon|https://helidon.io/|
|Eclipse|OSS|GlassFish|https://glassfish.org/|
|Eclipse|OSS|Jetty|https://eclipse.dev/jetty/|
|Apache|OSS|Tomcat|https://tomcat.apache.org/
|Apache|OSS|TomEE|https://tomee.apache.org/|
|NEC|商用|WebOTX AS|https://jpn.nec.com/webotx/appserver/|
|日立|商用|uCosminexus AS|https://www.hitachi.co.jp/Prod/comp/soft1/cosminexus/apserver/|
|富士通|商用|Interstage AS|https://www.fujitsu.com/jp/products/software/middleware/business-middleware/interstage/products/apserver/|

https://qiita.com/TTakakiyo/items/35c59037a09639437066
VSCode上でシーケンス図/クラス図/フローチャートをサクッと書きたい ~Mermaid Graphical Editor~

# はじめに
- Mermaid Graphical EditorというVSCodeの拡張機能にとても感動したので一筆書きました

## こんな方におすすめ

- シーケンス図/クラス図/フローチャートをサクッと書きたいけどmermaidとか難しそう 😢

## できること

* VSCode上でポチポチしながらシーケンス図/クラス図/フローチャートを描けるようになる
* mermaid記法のコードも自動生成されるよ

## 個人的メリット

- mermaidの学習コスト0 
- 紙で書くよりも修正しながら書きやすい 

# 導入手順 （簡単7steps）

(1) VSCode上で「Mermaid Graphical Editor」という拡張機能をインストールする
![スクリーンショット 2024-04-30 21.50.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582018/6f072c1e-a56c-f47f-b438-ef6c07d15312.png)

(2) 新規mdファイルを作成する
(3) 以下のようにファイルに入力する
````md 
```mermaid
``` 
````
(4) すると、薄い文字でMermaidEditorと出てくるのでクリックする
![スクリーンショット 2024-04-30 21.55.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582018/63118d39-8fe4-795f-5a52-3826e56975d3.png)

(5) 右側にEditorが表示され、フローチャート、シーケンス図、クラス図が選択できるので作成したいものを選択
![スクリーンショット 2024-04-30 21.57.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582018/2c21c181-5d1c-a533-f9d1-b8452f98371f.png)

(6) 例えばシーケンス図だとライフラインや矢印などが選べるサブメニューが出てくるので、ポチポチしていきます
![スクリーンショット 2024-04-30 21.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582018/6e5ccee2-c0fb-3e54-5a62-ce6343fe2c65.png)

(7) 良い感じに書けます！ mermaid記法のコードも自動生成されます
![スクリーンショット 2024-04-30 22.32.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582018/1b3bfe40-2291-776e-fcc0-192325154a0b.png)

↑例として私が自作したslack appで、メンションするとChatGPTからの応答が返ってくるアプリのシーケンス図を書いてみました（UML初心者すぎて色々間違っていたらすみません、、）

# 感想
フローチャート、シーケンス図、クラス図の作成は私のような初心者エンジニアにとってはハードルが高く活用できてなかったのですが、Mermaid Graphical Editorを利用するとサクサクっと書けるのでUMLを活用し始めるきっかけになりました。

これきっかけでつい最近からUMLを勉強し始めたのですが早速活用できまくっていて、APIで余分にDB接続している箇所に気付けたり、そのDB接続回数を減らすためにどこをどう改善したら良いなど図を活用しチームで議論できたりしています。

# おまけ （自動生成されたmermaidをそのままqiitaに貼り付けてみた）
```mermaid
sequenceDiagram
  actor line_1 as ユーザー
  participant line_2 as Slack 
  box AWS
    participant line_3 as Slack Bolt App
    participant line_5 as Slack Client
    participant line_4 as OpenAI Client
  end
  participant line_6 as Azure OpenAI Service
  line_1 ->> line_2: Appをメンションして<br>ChatGPTに質問する
  activate line_2
  activate line_3
  line_2 ->> line_3: 
  line_3 ->> line_5: channel, thread_ts
  activate line_5
  line_5 ->> line_2: api request
  line_2 ->> line_5: スレッド全体のメッセージ情報
  line_5 ->> line_3: 
  deactivate line_5
  Note over line_3, line_3: スレッド全体のメッセージを<br>繋げてChatGPTへの<br>リクエストを構築する
  line_3 ->> line_4: request()
  activate line_4
  line_4 ->> line_6: request (ユーザーのmessage)
  activate line_6
  line_6 ->> line_4: messageに対する<br>ChatGPTの返答
  deactivate line_6
  line_4 ->> line_3: response
  deactivate line_4
  line_3 ->> line_2: reply
  deactivate line_2
  deactivate line_3
  line_2 ->> line_1: ChatGPTからの返答
```

すごい！

# さいごに

ここまで読んでいただきありがとうございました！
本記事が少しでも良いなと思った方はぜひ「いいね！」していただけるとめちゃくちゃ喜びますmm
【Suno AIでつくった楽曲】1960年代ジャズソング ver.2【動画 45秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル 【Suno AIでつくった楽曲】1960年代ジャズソング ver.2【動画 45秒】.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/9569e41f-43fe-d6f1-b6ef-88ebb16c1b7b.png)



* # 動画URL
    * https://youtu.be/wrvFV3_YDsY

<br>

* # 動画タイトル
    * 【Suno AIでつくった楽曲】1960年代ジャズソング ver.2【動画 45秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2024-04-19(金)

Suno AIとは、文章から音楽を生成することができるAI( Text-to-Music-AI )です。
わたしは、2024-04-02(火)に初めてSuno AIで有償プランを契約してから、時々楽曲をつくって遊んでいます。

🎦【Suno AI】文章から音楽を生成するAI( Text-to-Music-AI )で、3分間で2曲、6分間で4曲作りました【試聴可能】1)伴侶の曲 2)税理士の曲【動画 16分11秒】
https://youtu.be/QKfhk4HgQ_g

🎦“Suno AIでつくった楽曲”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe

🎦“効果的にSuno AIを活用するヒント”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


今回は、Suno AIでつくった曲をMP3で出力してから、動画編集いたしました。
ぜひ聴いてみてください。

作曲日:
2024-04-02(火)

契約の種類:
Pro Plan

楽曲の正式名称:
Numbers in the Groove ver.2

Suno AI Library URL:
https://bit.ly/suno-Numbers-in-the-Groove-ver-2

With Vocals:


---


Lyrics:

[Verse]
Doo ba doo bop, doo ba doo bop
I'm crunching numbers in the groove
Tap tap tap, on my calculator
Bringing rhythms to the room

[Verse 2]
Slide slide slide, across the spreadsheet
As the numbers dance in time
Be-bop, scat, and syncopate
A jazzy melody unwinds

[Chorus]
In this digital age, I find my bliss
Numbers and jazz, a perfect mix
From accounting to IT, I'm in the zone
Making music with my calculator in the unknown


---


Suno AIへの指示文章( プロンプト ):


🇬🇧English

A thoughtful and upbeat 1960s jazz song for an accountant proficient in IT and online meetings, as I have requested numerous times.


🇯🇵日本語訳

わたしが何度も依頼しているITとオンラインミーティングに強い税理士のための、思慮深くて積極的な曲調の1960年代ジャズソング


---


Suno AI 公式URL
https://accounts.suno.ai


---


✓ 🎥この動画と関連が強いわたしの動画 ↙
　・“Suno AIでつくった楽曲”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe


　・“効果的にSuno AIを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/447nGIh