OmniAICreator/Qiita-1.07M huggingface dataset:
KappControllerConfigを修正してkapp-controllerの設定値を変更する

小ネタ。
TKG2.1以降のclass-basedで作成したクラスタのkapp-controllerのconfigは、従来のkapp-controller-configの変更方法では変更できない。
kapp-controller-configを編集しても、リコンサイルで元に戻ってしまう。
これを編集する方法のメモ。
## 編集方法
Workload Clusterのkapp-controller-configはManagement Clusterの`kind: KappControllerConfig`のオブジェクトで管理されている。
```
$ k get kappcontrollerconfigs -A
NAMESPACE    NAME                                           NAMESPACE    GLOBALNAMESPACE   SECRETNAME
default      imurata-wdc-huge-tap-kapp-controller-package   tkg-system   tkg-system
tkg-system   v1.23.17---vmware.1-tkg.1                      tkg-system   tkg-system
tkg-system   v1.24.11---vmware.1-tkg.1                      tkg-system   tkg-system
tkg-system   v1.25.7---vmware.2-tkg.1                       tkg-system   tkg-system
tkg-system   wdc-huge-mc-kapp-controller-package            tkg-system   tkg-system
```
このリソースを`kubectl explain`で見ると、`spec.kappController.config`のところに[kapp-controllerのconfig](https://carvel.dev/kapp-controller/docs/v0.46.0/controller-config/)と同じような項目が確認できる。
```sh
$ kubectl explain KappControllerConfig.spec.kappController --recursive
KIND:     KappControllerConfig
VERSION:  run.tanzu.vmware.com/v1alpha3

RESOURCE: kappController <Object>:

DESCRIPTION:
     <empty>

FIELDS:
   config	<Object>
      caCerts	<string>
      dangerousSkipTLSVerify	<string>
      httpProxy	<string>
      httpsProxy	<string>
      noProxy	<string>
   createNamespace	<boolean>
   deployment	<Object>
      apiPort	<integer>
      concurrency	<integer>
      hostNetwork	<boolean>
      metricsBindAddress	<string>
      priorityClassName	<string>
      tolerations	<[]map[string]string>
   globalNamespace	<string>
```
実際に書き換えて反映されるか確認してみる。
今回はHarborの証明書を追加してみる。
現在のWorkload Clusterのconfigの内容は以下となっている。
```json
$ kubectl get cm -o jsonpath={.data} -n tkg-system kapp-controller-config | jq .
{
  "caCerts": "",
  "dangerousSkipTLSVerify": "",
  "httpProxy": "",
  "httpsProxy": "",
  "noProxy": ""
}
```
KubeControllerConfigを編集する。使い回せるよう、yttによるoverlay+attachで編集する。
一度ファイルに落とし込む。
```
kubectl get kappcontrollerconfigs imurata-wdc-huge-tap-kapp-controller-package  -o yaml | kubectl neat -f - > ./kapp-config.yaml
```
overlayファイルを作成する。なお、Harborの証明書はカレントディレクトリにca.crtで置いてあるものとする。
```yaml
cat << 'EOF' > ./overlay.yaml
#@ load("@ytt:overlay", "overlay")
#@ load("@ytt:data", "data")
#@ cert = data.read("ca.crt")
#@overlay/match by=overlay.subset({"kind":"KappControllerConfig"})
---
spec:
  kappController:
    #@overlay/match missing_ok=True
    config:
      caCerts: #@ cert
EOF
```
overlayして適切に値が変わっているか確認する。
```sh
ytt -f overlay.yaml  -f kapp-config.yaml  -f ca.crt 
```
問題なければ、yttで生成したyamlを使ってapplyする。
```sh
ytt -f overlay.yaml  -f kapp-config.yaml  -f ca.crt | k apply -f -
```
コマンド実行後、再びkapp-controller-configを見てみる。
```json
$ kubectl get cm -o jsonpath={.data} -n tkg-system kapp-controller-config | jq .
{
  "caCerts": "-----BEGIN CERTIFICATE-----\nMII..(省略)",
  "dangerousSkipTLSVerify": "",
  "httpProxy": "",
  "httpsProxy": "",
  "noProxy": ""
}
```
上手く設定されたようだ。
【swift】いつオプショナルをつけるべきか

swiftを書き始めて約一ヶ月が経とうとしているが、オプショナルで宣言すべきタイミングがどうも掴めていないため、ご指摘をこうことも含めてこの記事を記述する

# オプショナル
ある変数に対してnilを許容する型のこと

```swift
var temp1: Int = 1// Int型
var temp2: Int? = 1// Int?型
```

- Int型とInt?型は全くの別物
- Int?型はIntとして扱えない。
    - 扱う為にはアンラップが必要

```swift
print(temp2) // Optinal(1)
print(temp2!) // 1
```
temp2 = nilの場合 temp2!で参照するとエラーが発生する

オプショナルに関する記事は以下
https://qiita.com/maiki055/items/b24378a3707bd35a31a8

# オプショナルをつけるべきタイミング

nilになりうるものをどう判断すべきか? 私の意見を述べたいと思う。

## 1. nilになりうるオブジェクトをフィールドとして持つとき

```swift
class Hoge {
var field : Int?

func getField()-> Int? {
return field
    }
}

let hoge: Hoge = Hoge()
var temp: Int? = hoge.getField()// (1) 
```

`hoge.getField()`の戻り値はInt?型であるため変数は`Int?`で宣言する必要がある。

## 2.クラスの参照を参照するとき

```swift
import exModule

let hoge1: UtilObject = ExModule().utilObject// utilObjectは非nil
let hoge2: UtilObject? = hoge1

```

`hoge1`はUtilObjectの参照を変数に格納しているため、`hoge2`もメモリ上は参照を格納している。
（swiftのclassは参照アクセス）

hoge1が破棄されたときhoge2は`nil`になる可能性があるため、オプショナルで定義するべき。
GASで課題の提出状況を把握しよう！

# 背景
弊社はグループウェアとしてGoogleWorkSpace（旧GSuite）を導入しています。
半期に一度行われる社員総会で全社員対象のワークをおこなったりするんですが、その際に事前に資料の準備をしてもらってます。

Googleドライブの特定のフォルダにファイルを提出してもらうんですが
誰が提出し終わってるのかリアルタイムで把握できるようにしたいのが悩みですよね（少し無理やりwww）

ないなら、どうする？ そう！ **作っちゃおう！**

# やったこと
* 特定のフォルダに格納されているファイルの一覧取得
* ファイル情報の取得
* ファイル開いた時に操作メニューを表示する（おまけ） 

# 特定のフォルダに格納されているファイルの一覧取得
フォルダIDはURLの一番最後の部分になります。
`https://drive.google.com/drive/folders/{ここ}`

```javascript
  var folderId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
  // フォルダ内ファイル一覧取得
  var folder = DriveApp.getFolderById(folderId);
  var files = folder.getFiles();
```
# ファイル情報の取得
今回はファイル名とオーナーを取得します。

```javascript
  //ファイル名
  var fileName = file.getName()
  //ファイルのオーナー（メールアドレス）
  var fileOwnerEmail = file.getOwner().getEmail();
```
# ファイル開いた時に操作メニューを表示する（おまけ）
スプレッドシートのメニュー一覧にタブボタンを表示します。

```javascript
  //メニューを追加するスプレッドシートの指定
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  //name：メニュー名、functionName：押下時に実行するメソッド
  var entries = [
    { name: "ファイル一覧取得実行", functionName: "main" }
  ];
  //第一引数：タブ表示の文言、第二引数：押下時に表示されるメニュー
  sheet.addMenu("ファイル一覧取得", entries);
```

# 最後に
GASでめんどくさいを自動化してハッピーライフ✨

# 参考
[GASとは](https://developers.google.com/apps-script)
JavaScript コレクションで重複データ除去


JavaScriptで重複データを除去するケースがあるとおもうので、書いてみた。

## そもそも重複したデータを追加したくない

Setを使えばOK。

```js
const array1 = new Set();

array1.add('A');
array1.add('B');
array1.add('A');  // 重複
array1.add('C');

for (let val of array1.values()) {
  console.log(val);
}
```

```console:実行結果
A
B
C
```

重複値「A」が追加されていない！！

## オブジェクト型のデータも重複して登録したくない

標準のSet.addではオブジェクトの重複チェックはないので、ちょっと改造が必要です。

```js
const array1 = new Set();

// 既存のaddメソッド上書き
array1.add = function(obj) {
  for (let o of this) {
    if (o.id === obj.id) {
      //存在済み
      return;
    }
  }
  Set.prototype.add.call(this, obj); // もともとのSet.addをコール
}

array1.add({id: 'A', name: 'たろう'});
array1.add({id: 'B', name: 'じろう'});
array1.add({id: 'C', name: 'はなこ'});
array1.add({id: 'B', name: '次郎'}); // IDが重複

for (let val of array1.values()) {
  console.log(val);
}
```

```console:実行結果
{id: 'A', name: 'たろう'}
{id: 'B', name: 'じろう'}
{id: 'C', name: 'はなこ'}
```
ID:B の重複データが登録されていない！！

## 重複値を除去したい

既存の配列の重複値を除去する場合もSetを使えばOK。

```js
const array1 = ['A', 'B', 'C', 'D', 'A', 'C'];

const uniqueArray = new Set(array1).values();

for (let val of uniqueArray) {
  console.log(val);
}
```

```console:実行結果
A
B
C
D
```

## オブジェクト型の重複値を除去したい

既存のオブジェクト型の配列の重複値を除去する場合は、ちょっと工夫します。

```js
const users = [
{id: 'A', name: 'たろう'},
{id: 'B', name: 'じろう'},
{id: 'C', name: 'はなこ'},
{id: 'B', name: '次郎'}, // IDが重複
];

const uniqueArray = new Map(users.map((user) => [user.id, user])).values();

for (let val of uniqueArray) {
  console.log(val);
}
```

```console:実行結果
{id: 'A', name: 'たろう'}
{id: 'B', name: 'じろう'}
{id: 'C', name: 'はなこ'}
```

### りくつ
```
const uniqueArray = new Map(users.map((user) => [user.id, user])).values();
```
これで、なんで重複除去できるんだ？？
ですが、1つづ分解してみます。

まず
usersの配列から新しい値の配列を作成します。

```js
users.map((user) => [user.id, user])
```

```console:実行結果
[
  ['A', {id: 'A', name: 'たろう'}]
  ['B', {id: 'B', name: 'じろう'}]
  ['C', {id: 'C', name: 'はなこ'}]
  ['B', {id: 'B', name: '次郎'}]
]
```

次に
この結果からMapオブジェクトを作成します。
Mapオブジェクトのコンストラクタは
```
new Map([[キー1, 要素1], [キー2, 要素2]])
```
なので、

```js
new Map(users.map((user) => [user.id, user]))
```

は、こんなイメージになります。

```js

new Map(
[
  ['A', {id: 'A', name: 'たろう'}]
  ['B', {id: 'B', name: 'じろう'}]
  ['C', {id: 'C', name: 'はなこ'}]
  ['B', {id: 'B', name: '次郎'}]
]
)
```

この時、キーの値「B」の値が重複しているのでMapは
```
  ['A', {id: 'A', name: 'たろう'}]
  ['B', {id: 'B', name: 'じろう'}]
  ['C', {id: 'C', name: 'はなこ'}]
```
になり、この結果、重複が無くなる、っていうことです。

## 補足
上記の検証では、valuesメソッドを使用してますが、
このメソッドの戻り値はIterator（反復処理)オブジェクトが戻ってくるので
forとかでグルグル回せますがが、push等の配列処理は出来ないので注意して下さい。

もし、重複除去後に要素追加などをするのであれば

```js
const uniqueArray = Array.from(new Set(array1).values());
```

```js
const uniqueArray = Array.from(new Map(users.map((user) => [user.id, user])).values());
```

のようにArrayオブジェクトにしましょう。


以上です。
GitHubエラー

# 背景
ようやく重い腰を上げてGitHubアカウントを作り、vscodeから初git pushをしたところ下記のエラーが発生して15分ほど詰まってしまいました

> remote: Support for password authentication was removed on August 13, 2021.

# 結論
2021年8月13日以降、GitHubリポジトリにアクセスするには、ユーザ名とパスワードではなく**アクセストークン**が必要になった。

# 手順
1. GitHubにログイン
2. 右上の自分のアイコンをクリック
3. 「Settings」をクリック
4. 左メニュー下部の「Developer settings」をクリック
5. 左メニューの「Personal access tokens」をクリック
6. 右上の「Generate new token」をクリックしてアクセストークンを作成➡Select scopes：repoと、admin:repo_hookとdelete:repoは必須でチェックを入れる
6. vscodeのターミナルでIDとパスワードの代わりにアクセストークンを入力してログイン


以上です。
これだけは覚えておこう！【スプレッドシート関数編】

# これだけは覚えておきたい関数

ExcelやGoogleスプレッドシートはデータの計算や分析に広く利用される強力なツールです。さまざまな業務やプロジェクトで使われる関数を紹介します。これらの関数は効率的な作業や正確な結果を得るために欠かせません。

## 1. SUM関数

```excel
=SUM(範囲)
```

選択した範囲内の数値の合計を計算します。例えば、`=SUM(A1:A10)`はセルA1からA10までの数値を合計します。

## 2. AVERAGE関数

```excel
=AVERAGE(範囲)
```

選択した範囲内の数値の平均を計算します。例えば、`=AVERAGE(B1:B5)`はセルB1からB5までの平均値を求めます。

## 3. VLOOKUP関数

```excel
=VLOOKUP(検索値, テーブル範囲, 列番号, 真偽値)
```

指定した検索値をテーブル範囲内で探し、対応する値を返します。列番号は検索値が存在する範囲内での位置を示します。真偽値は近似検索の可否を指定します。

## 4. IF関数

```excel
=IF(条件式, 真の値, 偽の値)
```

指定した条件式が真であれば真の値を、偽であれば偽の値を返します。例えば、`=IF(C2>100, "合格", "不合格")`はセルC2の値が100を超える場合は「合格」を表示し、それ以外の場合は「不合格」を表示します。

## 5. CONCATENATE関数

```excel
=CONCATENATE(テキスト1, テキスト2, ...)
```

指定したテキストを結合して1つのテキストとして返します。簡単に複数のセルの内容を結合する際に使用します。

## 6. COUNTIF関数

```excel
=COUNTIF(範囲, 条件)
```

指定した条件に合致するセルの数を数えます。例えば、`=COUNTIF(D1:D10, ">50")`はセルD1からD10の中で50を超える値の数を数えます。

# 最後に

効率的な作業を身につけて、ハッピーライフを✨

## 参考文献
https://support.google.com/docs/table/25273?hl=ja
【Git】コミットメッセージを間違えたので取り消したい

コミットメッセージを間違った状態でenterしてしまい取り消したいシチュエーション
何度か経験したものの、毎度忘れるためメモ

`git reset --soft HEAD^`

これにて解決。


cf) git revert とは
    git commit --amend とは


### 参考文献

https://qiita.com/shuntaro_tamura/items/06281261d893acf049ed
Salesforceでレポートを作成しよう～活動レコードが存在しない商談一覧を作成しよう～

こんにちは
本橋孝昭です

今回はSalesforceのレポートで
・活動レコードが存在しない商談一覧
作成方法をお伝えします

# ステップ１　商談　レポートタイプを選択

レポートタイプ「商談」でレポートを作成します
![商談01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/077aa7e1-2cd2-044b-d32a-9e143113419e.png)



# ステップ２　商談　クロス条件を追加　を選択

![商談02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/daeb68a9-8a7d-7c21-f635-14011f8c8ea7.png)

# ステップ３　商談　クロス条件で　「商談」「関連しない」「活動」を選択
![商談03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/49232d41-07ad-9b8f-1c99-4294e3139965.png)

# ステップ４　レポートを保存&実行　をする

これで活動が存在しないレポート作成が可能です


# 補足　レポートタイプでなんとかならないか？


よくある疑問として「レポートタイプで何とかならないか」と思いますが
商談と活動のレポートタイプでは

・商談と活動両方あるレポート
![レポートタイプ１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e13422b6-2458-bdeb-6bf2-26eee07acb50.png)

・商談はすべてある　（活動の有無は問わない）
![レポートタイプ２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/621029cc-3edc-0e9d-3cd9-548fa2e36e0c.png)


の２タイプしか作成することはできません
なのでレポートタイプの設定では
活動レコードが存在しない商談一覧を作成　することはできません

活動レコードが存在しない商談一覧を作成　をするにはクロス条件を使いましょう
<button>タグがsubmitされるときの解決

# はじめに

モーダル制御などで、閉じるボタンに
```
<button></button>
```
を設定していて、JavaScriptで制御しようとしたらsubmitされてしまうため、思うように動かず。
# 解決策
```
<button type="button"></button>
```
formタグ内のbuttonタグは、type属性を設定しないと`type="submit"`になるらしい。
思わぬ落とし穴。。
# 参考文献

https://developer.mozilla.org/ja/docs/Web/HTML/Element/button
シリアライズ言語の比較

# シリアライズとは
直列化を意味し、オブジェクトが持つデータをコンピュータが読み書きできるようにバイナリデータへ変換すること。
これによってデータをファイルとして保存したり、ネットワークで送受信できるようになる。
シリアライズ言語はシリアライズしたデータを表すためにフォーマット

# シリアライズ言語
## JSON
- 「JavaScript Object Notation」の略で、「JavaScriptのオブジェクトのオブジェクトの書き方を元にしたデータ定義方法」のこと
- 拡張子は「.json」
- JavaScriptなどのクライアント言語とRailsなどのサーバサイド言語間のデータのやり取りで使用される。

#### 基本の書き方
- データのキーと値を{ }に中にコロン(:)で区切って記載。
- 二つ以上のデータがある場合には、カンマで区切って記載
- 文字列、数値、null、bool値、オブジェクト、配列のデータ型に対応。文字列のみダブルクォーテーションで囲む。
例）
```
{
	[
	"id": 1,
	"name" : "taro",
	"address" : "tokyo"
	],
	[
	"id": 2,
	"name": "Hanako",
	"address": "kyoto"
	]
}
```


## XML
- 「Extensible Markup Language」の略で、「拡張可能なマークアップ言語」と訳される。
- 拡張子は「.xml」
- HTMLの記法を元にしたデータ定義方法で、データ定義言語と呼ばれる

#### 基本の書き方
- HTMLと同じように<要素名>内容</要素名>で分ける
- 要素名は自由に決めることができる
例）
```
<?xml version="1.0" encoding="utf-8"?>  
<data>  
  <item>
    <id>1</id>
    <name>taro</name>
    <address>tokyo</address>
  </item>
  <item>
    <id>2</id>
    <name>hanako</name>
  </item>
</data>
```

## CSV
- 「 Comma Separate Values」の略で、「カンマで値を分ける」という意味
- 拡張子は「.csv」
- Excelで表示できる
- データベースへのインポートやエクスポート、基幹システムへのアップロードやダウンロードで利用される

#### 基本の書き方
- カンマ(,)でデータを区切る
- 改行で、データのレコードの区切り(データのかたまり)を表す
- 先頭に記載される区切られたデータの項目名やタイトルをかく（データの利用者が内容を認識していれば必要なし）
例）
```
id,name,address
1,taro,tokyo
2,hanako,kyoto
```

## YAML
- 「YAML Ain't Markup Language」の略。
- 拡張子は「.yml」
- 設定ファイルの記述に使用されることが多い。docker-compose.yml、config.ymlなど。

#### 基本の書き方
- データのキーと値をコロン(:)で区切って記載。
- インデントによってデータの階層の構造(データのかたまり)を表現している
- 文字列をシングルフォーテーション('')やダブルクォーテーション("")で囲む必要がない。
- 行頭に-を入れることで配列として扱うことができる。この時-と値の間には半角スペースを開ける。
例）
```
- id: 1
  name: taro
  address: tokyo
- id: 2
  name: taro
  address: kyoto
```

# 参考にさせていただいた記事
- [JSONとは？データフォーマット（データ形式）について学ぼう！](https://products.sint.co.jp/topsic/blog/json)
- [「JSON」とは？非エンジニアでもよくわかる解説](https://cloudapi.kddi-web.com/magazine/json-javascript-object-notation)
- [CSVファイルとは？使い方やExcelファイルとの違いについて解説](https://am.arara.com/blog/028)
- [yamlファイルの書き方やと特徴](https://qiita.com/supercell1023koeda/items/6b1fd399b1957077651a)
- [シリアライズの語意味を腹落ちさせた備忘録](https://qiita.com/allein-s/items/c125af381600c5b7fa28)
【資格】ワイヤレスIoTプランナー　勉強メモ

アラフォーで、モバイル関連に転職して何もわからない状態でしたので資格試験にトライ。

下記な勉強方法で受かるか試してみました。
https://twitter.com/nekokane/status/1695624782375698859?t=5WjaGNdcIN6wApJB7spJWA&s=09

まず公式テキストを買います。表紙が素敵です。ゴチャ系のイラストが得意な

TAOさんの作品です。
https://twitter.com/nekokane/status/1692474651015020945?s=19

資格は5時間の講習を受けるか、CBT（好なタイミングでテストセンタでパソコンで受けるマーク試験）私はCBTにトライしました。
https://twitter.com/nekokane/status/1692376483267002492?s=19

とりあえず全体像を絵にするとこんな感じ
https://twitter.com/nekokane/status/1692886308048474571?t=s21GAxCrl6G0PME7QAuRbw&s=19

と入っても箱だけだと、、、なので事例でいうと梨を見守るセンサーとネットワーク
https://twitter.com/nekokane/status/1693153091871481878?t=XBHVdOR8O_xXzi44a0GovQ&s=19

無線は4G 5G Wi-Fi以外にも実は色々あります。
低速、低消費電力のものとか。
https://twitter.com/nekokane/status/1693154024940539959?t=kqqQximGqBs-IusEHLOH6A&s=09

AIも試験範囲です。
なんとなくフワッと情報集めて、学習して、出てきた結果を人間が次のアクションに活かすイメージ
https://twitter.com/nekokane/status/1693156769172947189?t=EMZ20VQl5yaG07xhSI6vlA&s=19

全体どうしてDXの実現がテーマ
経営層、現場に、データアナリストがみんなでやらんと成功しないので大変そう。
https://twitter.com/nekokane/status/1693159287303110657?t=sw_AQV6eO39HtdYDv7J3cg&s=19

ここまでのふわっとまとめポンチ絵
https://twitter.com/nekokane/status/1693234450946256910?s=19

IoTはセンサーの数多いので、ネットワーク側の負荷も含めて全体考えないと、
https://twitter.com/nekokane/status/1693238224142151926?s=19

手書きをデジタル化して、デジタルデーデータを自動収集できたら、
解析や新ビジネス創出の出番
https://twitter.com/nekokane/status/1693238798518476815?s=09

IoTデバイスとクラウドの間をつなぐIoTゲートウェイというのがあるので、ここでセキュアなクラウドとの通信担保したりする。
https://twitter.com/nekokane/status/1693239266992959745?s=19

ワイヤレスより有線がいいこともあるので、適材適所大事。
https://twitter.com/nekokane/status/1693239512280023473?t=xjp2TPLycfHYkODL5AEwlA&s=19

ワイヤレスに限らず、装置が大量につながるネットワークは障害起こして、過負荷にならやいように。&なった時どうする。の準備が必要。
https://twitter.com/nekokane/status/1693239803381428304?t=-8n4wmSZEBJ9jrn8ShLdtA&s=09

ワイヤレスの技術も、速さ、消費電力、安さ、等などあるので適材適所。
https://twitter.com/nekokane/status/1693240159624716631?s=19

情報たくさん扱うか、レベルに合わせてセキュリティの対策もせねば
https://twitter.com/nekokane/status/1693240814632362188?s=19


という諸々踏まえて、IoTシステム作ってDXしたら、社員の手作業が減るのか？お客様がどう嬉しいか？
https://twitter.com/nekokane/status/1693241342930075780?s=19

とか言ってると、進まないのでRaspberryとArduinoでプロトタイプ作りましょう
https://twitter.com/nekokane/status/1693241960558199251?s=19

IIJの水田向けセンサーとかこんな感じ
https://twitter.com/nekokane/status/1693406047065764181?s=09

今日はここまで
Get Cloudy  関係のトレイルヘッド


エラーメッセージが変わった可能性があります。

# We can't find a contact named 'Maria Clifton' with the title 'Regional Sales Manager' found on the 'Get Cloudy' account.

+ [How to solve this problem?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007CGhv9)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8829b1ee-c25d-eff1-096e-a348ba9b8f69.png)

:::note
I think the role name is different

Regional Sale Maneger -->  Regional Sales Maneger 
:::

# No contact with the name 'Maria Clifton' with the title 'Regional Sales Manager' found on the 'Get Cloudy' account.

+ [Hello guys, I have problems with the module "Store information about customers"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000MhgIFSAZ)

言語設定を英語にしたらOK
ゲームコンセプトに生成ＡＩ

今の時代、ぽっと出のアイデアをバラまいて、世間の反応を先行してニーズを確認するという、ちょっと新たな営業戦略がありますね。

個人でも世界を動かせる時代になったんじゃないですか？

# 思いついた事例

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">生成ＡＩで適当なゲームコンセプトを製作 <a href="https://t.co/GZbD5U408i">https://t.co/GZbD5U408i</a> <a href="https://twitter.com/hashtag/%E3%82%B2%E3%83%BC%E3%83%A0%E5%A5%BD%E3%81%8D?src=hash&amp;ref_src=twsrc%5Etfw">#ゲーム好き</a> <a href="https://twitter.com/hashtag/%E3%82%A8%E3%82%B3%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#エコチャレンジ</a> <a href="https://twitter.com/hashtag/%E9%95%B7%E6%9C%9F%E6%88%A6?src=hash&amp;ref_src=twsrc%5Etfw">#長期戦</a> <a href="https://twitter.com/hashtag/%E3%82%B0%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B2%E3%83%BC%E3%83%A0?src=hash&amp;ref_src=twsrc%5Etfw">#グリーンゲーム</a> <a href="https://twitter.com/hashtag/%E8%87%AA%E7%84%B6%E6%84%9B%E5%A5%BD?src=hash&amp;ref_src=twsrc%5Etfw">#自然愛好</a> <a href="https://twitter.com/hashtag/%E5%9C%B0%E7%90%83%E3%82%92%E5%AE%88%E3%82%8D%E3%81%86?src=hash&amp;ref_src=twsrc%5Etfw">#地球を守ろう</a> <a href="https://twitter.com/hashtag/%E9%81%8A%E3%81%B3%E3%81%AA%E3%81%8C%E3%82%89%E5%AD%A6%E3%81%B6?src=hash&amp;ref_src=twsrc%5Etfw">#遊びながら学ぶ</a> <a href="https://twitter.com/hashtag/%E3%82%A8%E3%83%B3%E3%83%87%E3%83%A5%E3%83%A9%E3%83%B3%E3%82%B9%E3%83%A2%E3%83%BC%E3%83%89?src=hash&amp;ref_src=twsrc%5Etfw">#エンデュランスモード</a> <a href="https://t.co/u5dVjfHSGS">pic.twitter.com/u5dVjfHSGS</a></p>&mdash; kr4g-mountain (@kr4mountain) <a href="https://twitter.com/kr4mountain/status/1695922298468077888?ref_src=twsrc%5Etfw">August 27, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# BARD見解
生成AIは、ゲームコンセプトの創造に大きな可能性を秘めていると思います。従来、ゲームコンセプトは、ゲームデザイナーの創造性や経験に大きく依存していました。しかし、生成AIは、膨大な量のテキストや画像のデータから学習することで、人間には思いつかないような、新しいアイデアを生み出すことができます。

具体的には、生成AIは、以下の点でゲームコンセプトの創造に貢献できると考えられます。

# 新しい発想やアイデアの創出
生成AIは、既存のゲームの枠組みにとらわれない、新しい発想やアイデアを生み出すことができます。例えば、これまでにないジャンルやテーマのゲーム、従来とは異なるゲームシステムを備えたゲームなど、これまでにないゲームを生み出す可能性が考えられます。

# ゲームの多様性の向上
生成AIは、ゲームの多様性を向上させるのに役立ちます。従来、ゲームは、特定のターゲットやジャンルに偏りがちでした。しかし、生成AIは、あらゆるターゲットやジャンルに対応したゲームを生み出すことができます。これにより、ゲームの裾野が広がり、より多くの人にゲームを楽しんでもらうことが可能となります。

# ゲーム開発の効率化
生成AIは、ゲーム開発の効率化にも貢献します。従来、ゲームコンセプトを検討する際には、膨大な時間と労力が必要でした。しかし、生成AIを使用することで、ゲームコンセプトの検討を迅速かつ効率的に行うことができます。これにより、ゲームの開発期間を短縮し、より早く市場にリリースすることが可能となります。

もちろん、生成AIにも課題はあります。例えば、生成AIは、人間の創造性や感性を完全に再現することはできません。また、生成AIによって生成されたゲームコンセプトが、必ずしも成功するとは限りません。

しかし、生成AIは、ゲームコンセプトの創造に新たな可能性をもたらす、画期的な技術です。今後、生成AIの技術がさらに進歩することで、ゲームの創造性はさらに向上し、ゲーム業界に新たなイノベーションをもたらすものと期待されます。

# 思うところ

　ビルゲイツもジョブズも皆、子供の頃に読んだ本や映画に刺激され、世の中を変える発明をしたんだと思う。
そう考えると２０年後の世界を変えるのは、今の子供たちであって、言うなれば社会実装のシミュレーションをゲームに埋め込めば学校教育の根本が変わるんじゃないかと思う。

　少なくとも５０年もしたら、地球環境との最終戦になることは見えていて、それこそ宇宙開拓以外の活路は、今のところ人類の未来に見えないのは確実である。

　もちろん、以下の映画を見ると、我々人類の住める場所は地球しかないのは、やや自明なのではあるが・・・

https://www.youtube.com/watch?v=XO91eSdP-vk
ポータルでプラットフォームチームを強化

<font color="Grey">*[Empowering Platform teams with Portals](https://aiven.io/blog/empowering-platform-teams-with-portals)の翻訳です。*</font>

2023年3月20日

# ポータルでプラットフォームチームを強化

Backstageのようなプラットフォーム・サービスとセルフサービス・ポータルを使用して、開発チームの生産性を向上させ、より迅速に。

プラットフォームのトレンドは目新しいものではないが、プラットフォームチームは開発者やエンジニアリングチームに一貫したエクスペリエンスを提供することができるようになってきている。このトレンドについて詳しく知りたい方は、このトピックに関するCNCF SIG Appのペーパーをお勧めします。


## プラットフォームチームは生産的な道である


その結果、エンジニアリングチームのベロシティと生産性が向上します。アトラシアンは CNCF の論文から引用して次のように述べています：「プラットフォームチームは、異なるユーザーエクスペリエンスや製品にまたがる、まとまりのあるエクスペリエンスを作成することができます。配信のための最も人気のあるプラットフォームは、人気のある Backstage プロジェクトで、これも Spotify から寄贈された CNCF プロジェクトだ。Backstageの利用が増えるにつれて、私たちは多くの組織内でこれがさらに顕著になるのを見てきた。


## 今日のBackstage


Backstageのエコシステムと統合には、まだ多くのギャップがある。開発者が必要とするアプリケーションやインフラ、その他の関連リソースのプロビジョニングを可能にするクラウドプラットフォームとの統合がなされていないようだ。Aivenの大規模なクライアントの中には、クラウドプロバイダーのOEMと同じように、Aivenをプラットフォームの一部として扱っているところもあります。彼らはAPIから独自のカスタムポータルまで、ユーザーエクスペリエンスを100％コントロールし、Aivenのユーザーエクスペリエンス（Aivenポータル）ではなく、厳密にコントロールされたエクスペリエンスを通じてAivenとインターフェイスします。


## ポータルはどのようにオーナーシップを実現するか


あるお客様は、ポータルとUIを通して、利用状況、課金、詳細な運用管理、観測可能性まで公開しています。これは、当社のTerraformモジュールやKubernetes Operatorを使用している多数の顧客と何ら変わりはなく、インフラ経由で統合している顧客よりもはるかにリッチな体験を提供しているに過ぎない。これはDevOpsの概念をより遠くに持っていくもので、文化的に透明性を生み出すことができるため、開発チームは自分たちが何を構築し、運用しているのか、そしてそれがビジネスにどれだけのコストをかけているのかについて説明責任を果たすことができる。


![Platform Components](https://cdn.sanity.io/images/sczeoy4w/production/04b79371cd5ad57d1cd94a077f9d096d2c891cbc-923x712.png?q=80&fit=min&auto=format&dpr=1.5)


このような開発者ポータルは生産性にも貢献し、開発者のオンボーディングをより迅速にし、生産性を向上させることができる。私が見てきたほとんどの組織は、開発者エクスペリエンスについて、CI/CD、開発環境、その他より基本的なサービスとして話している。


## Kubeconで私と話そう


もしあなたがBackstageについてもっと知りたいなら、ヨーロッパで開催されるKubeconに行くべきです。私は4月19日11:55am <https://sched.co/1HySf> にJaeger Project Maintainerの講演を行います。AivenのBackstageへの統合に興味がありますか？


開発者向けポータルは、観測可能性ツールのような、運用の可視性に関するより豊かな経験を持つべきでしょうか？基本的な管理以外のデータベース管理ツールはどうでしょうか？あなたのご意見をぜひお聞かせください。Twitter @jkowall または LinkedIn <https://linkedin.com/in/jkowall> までご連絡ください。
(AdamW)DECOUPLED WEIGHT DECAY REGULARIZATIONのメモ

# [Decoupled Weight Decay Regularization](https://arxiv.org/abs/1711.05101)

- はじめに
    - 適応的なoptimizerはSGD(with momentum)ほど一般化しない
    - AdamのL2正則化はSGDほどうまくいかない
    - AdamとL2正則化はweight decayと比べて、正則化されにくい
    - ライブラリではL2正則化のみ実装されて、weight decayが実装されてない
    - weight decayはsgdでもadamでも効果ある
    - sgdではL2正則化=weight decayだがadamでは違う
- 2 DECOUPLING THE WEIGHT DECAY FROM THE GRADIENT-BASED UPDATE
    - L2正則化はlossに重みの二乗の項を入れて、重みが0に近づく効果を入れる
    - weight decayは重み更新時に重みを引く項を入れて、重みが0に近づく効果を入れる
        - SGDならこれはL2正規化
    - sgdのweight decayはL2正則化と一緒
    - weight decayの最適な係数があったとしても、L2正則化の係数にもっていくには、学習率が関係してくるので大変
        - →分離したい
    - lossに1/2w^2を入れる話(L2) と更新時にθを0に近づける(weight decay)話を分離する
    - 一緒だと勾配にパラメータの勾配も入ってくるが、分離すると本来の勾配だけになる
    - adamだと大きな勾配を抑制するので、L2も抑制されるが、weight decayは大丈夫
- 4 Experiment validation
    - 4.1 EVALUATING DECOUPLED WEIGHT DECAY WITH DIFFERENT LEARNING RATE SCHEDULES
        - adamwの方がadamよりよかった
        - スケジューラを使うと正則化の最適な係数の範囲がシャープになる
        - コサインアニーリングがよかったので、今後もそれを使う
    - 4.2 DECOUPLING THE WEIGHT DECAY AND INITIAL LEARNING RATE PARAMETERS
        - デカップリングしないと、初期学習率と正則化係数が依存してしまう
        - デカップリングすると、初期学習率に限らず、最適な正則化係数は決まる
    - 4.3 BETTER GENERALIZATION OF ADAMW
        - adamwの方がtest errorは下がった
        - 同じtrain lossでもadamwの方がtest errorが低かった→汎化してる（収束がよくなっただけではない）
    - 4.4 ADAMWR WITH WARM RESTARTS FOR BETTER ANYTIME PERFORMANCE
        - warm start使うと学習が早くなる
2023/8/28主にITとかセキュリティの記事

同じシステム使用する別の日本原燃グループ会社に不正アクセス、約1万人の個人情報漏えいの可能性(8/26)
https://scan.netsecurity.ne.jp/article/2023/08/26/49868.html

WinRARとOpenfireの脆弱性のサイバー攻撃への悪用確認、CISAが警告(8/25)
https://news.mynavi.jp/techplus/article/20230825-2756749/

偽の楽天銀行はメールで取引停止を通告してくる(8/26)
https://ascii.jp/elem/000/004/152/4152259/?rss

アップルギフトカード130万円分をだまし取られる被害　三重県亀山市(8/25)
https://news.yahoo.co.jp/articles/da96f4fc8beac3e0f29b1e25db5a24133bf374d1?source=rss

政府、防衛強化へ重要９技術選定 空港や港を優先整備(8/25)
https://www.topics.or.jp/articles/-/947777

福岡徳洲会病院に不正アクセス、個人情報が外部から閲覧可能な状態に(8/26)
https://scan.netsecurity.ne.jp/article/2023/08/26/49869.html

カーブ危機が示す、DeFiと分散型リスク管理の落とし穴(8/26)
https://www.coindeskjapan.com/198677/

Telegram（テレグラム）は危ないアプリ？危険性とその対策を解説(8/26)
https://crypto-times.jp/telegram-lisk/

犯罪最前線　警察庁が経済安保へ「大きく舵」　北や中国の脅威に対処(8/26)
https://news.yahoo.co.jp/articles/5d6d4e2d445a96588111bb7b79d0b0784fb342c3?source=rss

バイナンスのビットコイン売却疑惑にCZ氏が反論(8/25)
https://coinchoice.net/cz-rebut-binance-bitcoin-dumping/

猛暑でフィッシング詐欺もひと段落!?　いえ、件数自体は過去2番目の多さです(8/26)
https://ascii.jp/elem/000/004/152/4152186/?rss

ＴＢＳ系「ＶＩＶＡＮＴ」　ハッカー名「ブルーウォーカー」の名前の由来は、ある選手から…ＳＮＳ「奇跡の発想」などの声(8/25)
https://news.goo.ne.jp/article/sanspo/entertainment/sanspo-_entertainment_geino_A42EIPMLWBPJDGLS3GBOBJZGEE.html

勉強は実技科目､知識を使うスキルが不可欠だ(8/26)
https://news.livedoor.com/article/detail/24872059/
AWS Certified Solutions Architect - Professional 再認定

## 概要
AWS Certified Solutions Architect - Professionalの更新時期が迫ってきましたので
再認定を受けました。前回認定を受けたときはSAP-C01で現在はSAP-C02となっていますので
試験の違いについてまとめたいと思います。

## SAP-C01とSAP-C02の違いについて
- 出題範囲
公式試験ガイドによると出題範囲は以下のようになっています。
&emsp;&emsp;SAP-C01分野(出題の比率)
&emsp;&emsp;1.組織の複雑さに対応する設計 (12.5%)
&emsp;&emsp;2.新しいソリューションの設計 (31%)
&emsp;&emsp;3.移行の計画 (15%)
&emsp;&emsp;4.コスト管理 (12.5%)
&emsp;&emsp;5.既存のソリューションの継続的な改善 (29%)

&emsp;&emsp;SAP-C02分野(出題の比率)
&emsp;&emsp;1.複雑な組織に対応するソリューションの設計 (26%)
&emsp;&emsp;2.新しいソリューションのための設計 (29%)
&emsp;&emsp;3.既存のソリューションの継続的な改善 (25%)
&emsp;&emsp;4.ワークロードの移行とモダナイゼーションの加速 (20%)

コストの管理は複雑な組織に対応するソリューションの設計に統合されたようで、それ以外については特に出題傾向が大きく変わっていない印象です。

- 問題内容
問題内容や難易度はあまり変わらないように感じました。
ただ、新サービスや新機能によりベストプラクティスが変わることがありますので新機能やアップデートについては積極的に学習したほうがよいと感じました。
（具体的な内容は差し控えますが、例えば課題解決のために以前はAというサービスしかなかったがBというサービスの新機能を使用することがベストプラクティスといった感じです）

- 試験結果
SAP-C01は受験後に数項目のアンケートに回答した後すぐに合否結果が判りましたが、SAP-C02はその場では合否通知されず、5営業日以内に通知されます。
私の場合は受験後24時間後に通知がありましたので、結果が気になる場合は数時間毎にAWS認定サイトを確認してもよいかと思います。

新しい有効期限は再認定された日から3年となります。Azureは有効期限前に再認定受ければ有効期限＋3年が新しい有効期限なので短くなってしまう印象です。ただし有効期限ぎりぎりで受けて不合格になると資格失効するので受験計画については計画的にすすめてください。
【WindowsTerminalのおすすめ設定】ホットキーでどこからでも表示/非表示を切り替えられるよう にする

# はじめに
Macを使っている人はiTerm2で瞬時にターミナルを表示できる設定を入れている人はいると思いますが、
WindowsTerminalでも同じようなことができるのでその設定方法をご紹介します。

# ホットキーの設定
と言っても[globalSummon](https://learn.microsoft.com/ja-jp/windows/terminal/customize-settings/actions#global-summon)のactionを設定
するだけです。  
settings.jsonへの設定例は以下のような感じです。  
この例では`Ctrl + Space`キーで表示、非表示を切り替えることができます。  
設定値の詳しい説明は公式ドキュメントをご確認下さい。  

```settings.json
{
    ...
    "actions": 
    [
        ...
        {
            "command": 
            {
                "action": "globalSummon",
                "desktop": "toCurrent",
                "dropdownDuration": 100,
                "monitor": "any",
                "toggleVisibility": true
            },
            "keys": "ctrl+space"
        }
    ],
    ...
}
```
# 設定後
`Ctrl + Space`キーでWindowsTerminalを前面に表示、非表示を切り替えられるようになりました。  
![hotkey.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244724/d1aac173-63bc-e8e8-0a3f-2aed04b8663b.gif)
WSL + vscode 環境でJupyter Notebookを使えるまでの設定

# WSL + vscode 環境でJupyter Notebookを使えるまでの設定

## TL;DL
- WSL上でvscodeでJupyter Notebookを書きたかったため作業メモ

## 環境
- Host OS: Windows 10
- Linux環境: WSL2 + Ubuntu 22.04.3 LTS
- shell: bash

## Pythonのインストール

Ubuntu 22.04のデフォルト状態ではpythonが入っていないのでインストールする必要がありました。
`apt`コマンドでインストールします。

```shell
$ sudo apt install python3
```

`python3`コマンドを実行するとインタプリタが立ち上がります。verionsは3.10.12です。
```py
Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

`python`コマンドを`python3`に通すため`python-is-python3`パッケージをインストールします。
```shell
$ sudo apt install python-is-python3 
```

## Python仮想環境 venvを作成

作業ディレクトリで仮想環境を`venv`の名前で作成します。
```shell
$ python -m venv venv
```

### venvの有効化
```shell
$ source ./venv/bin/activate
```

プロンプトの前に(venv)が表示されます。
```shell
(venv) $ 
```

## Jupyterをインストール

仮想環境にjupyterをインストール
```shell
(venv) $ pip install jupyter
```

## vscodeのJupyter拡張をインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843716/cb6c68c0-b56d-3f88-eb14-0911ea408ce3.png)


## pythonカーネルの指定
Jupyterに使用されるカーネルを明示的に追加するため`ipython kernel`コマンドを使用します。
```shell
(venv) $ ipython kernel install --user --name=venv --display-name=venv
```

## vscodeでファイル作成

「File」→「New File」からファイルを作成を選択すると、Jupyter Notebookという選択肢が現れるので、ファイル名を入力の上これを選択し作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843716/d34c62ee-6936-a8b5-d568-5c9c8e8555ea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843716/160c9af4-9222-8592-d8a3-e0d87d0cb7bf.png)

ここでは`test.ipynb`というファイル名にし、print文を記述。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843716/aeb4465e-174f-1fff-bf22-4718feb94124.png)
Code部分の▷ボタンを押してとjupyterが実行されます。

初回はjuypterで使用するkernelを選択する必要があり、選択肢が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843716/7aec77bb-9cb5-87bd-0457-16a2edcec989.png)


※venv内の`python`コマンドを選択するのですが、この選択肢に表示されない場合があります。
手元の環境では上記の
- [vscodeのJupyter拡張をインストール](#vscodeのJupyter拡張をインストール)
- [pythonカーネルの指定](#pythonカーネルの指定)

を実施しvscodeの再起動もしたところ、この現象は解消。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843716/f92840cf-1120-26ec-3118-d6801377f81f.png)

### Python仮想環境 venvについて

- python3.3以降で使用可能
- `python -m venv '仮想環境名'`で作成
```shell
$ python -m venv my-env
```

- bashの場合`source /仮想環境名/bin/activate`で有効化
```shell
$ source ./my-env/bin/activate
```

vevnを有効化すると、仮想環境配下(上記例では./my-env配下)のpython系コマンドやLibraryにpathが通り、`pip`コマンドでのパッケージも仮想環境の配下にインストールされます。

有効化コマンドはshellやOSなど環境によって異なります。
[Pythonドキュメント -- venv 仮想環境の作成 -- 仮想環境のしくみ](https://docs.python.org/ja/3/library/venv.html#how-venvs-work) を参照

## その他
WSLがそもそも仮想、かつ手元のお試しのような環境構築にvenv使うのは大して意味がない気も

## 参考

https://atmarkit.itmedia.co.jp/ait/articles/2108/06/news030.html

https://takeg.hatenadiary.jp/entry/2021/05/22/165935

https://docs.python.org/ja/3/library/venv.html
在宅ワークで健康のためにできること

在宅ワークが始まったばかりは、「在宅っていいなー」と思う人が多いです。
が、コロナの影響もあり、この3〜4年間続けてみると「やっぱり在宅違うかも...？」と思う人が増えているそうです。

**実際、コミュニケーションが減ったり、運動や外に出かけることが減って、精神的にも肉体的にもストレスが溜ってきています。**
在宅になって太った話はよく聞きます。
通勤って意外と運動になってたんですね。

というわけで、在宅ワークでも実践したほうがいいと思った、取り入れてみて良かった健康のための習慣について3つ紹介していきます。
最初は違和感や面倒臭さもありますが、少し続けてみると「この習慣良いなー」と思いますよ。

## 在宅ワークで健康のためにやっていること

### 毎日に運動を取り入れる

仕事の前に散歩かランニングをするようにしています。
これ、意外と良いです。

というのも、通勤がある時って仕事の前に運動をしているので、仕事をするスイッチを入れやすいんですよね。
リモートで起きて10分でPCを立ち上げるのとは、全然違います。
仕事への集中力も判断力も。

**色々な本を読んでいて知りましたが、やっぱり人間は行動・カラダを動かすことを大事にしている生き物なんですよね。**
だから、「カラダを動かす」という作業をするだけでも、精神的にも肉体的にもセットアップされます。

ちなみに、休憩時間や仕事終わりも軽くストレッチや散歩を取り入れてます。
これは太らないようにする対策ですね。
仕事終わりの美味しいビールを飲み続けたいので（笑）

### 人と会う予定を作る

**在宅を続けていると、人と話す機会がぐぅーんと減ります。**
**人と話す機会がぐぅーんと減ります。**

大事なことなので、2回書きました。

システム開発もなんだかんだコミュニケーションが大事だったりします。
普段から話しているほうが、コミュニケーションのハードルも下がります。

家族、学生時代の知り合い、同僚、趣味の友達、なんでもいいです。

### 姿勢を良い状態に保つ工夫をする

**システムエンジニアと切っても切り離せないのが、「椅子に座り続ける」ということです。**
最近では、スタンディングデスクというのも出ていますが、まだまだな印象。

そこで簡単でも効果があるのが、椅子に置く姿勢矯正ツール。
これがあるだけで、腰・背骨への負荷を軽減できるのでオススメです。

Amazonでも5,000円台くらいからあるので、リモートの投資だと思えば全然高くないです。
おそらくですが、今だけでなく今後の働き方は、業界や職種に関係なくリモートが増えると思うので、先に買っておいても損しないと思います。

https://amzn.asia/d/is6TwMr
GraphQL: Resource not accessible by personal access token (repository.defaultBranchRef)の解決法

# 発生したエラー
```bash
> gh repo clone my_private_repo
GraphQL: Resource not accessible by personal access token (repository.defaultBranchRef)
```

認証したはずなのにクローンできない

権限周りであることは分かるが, ```gh auth login```でアカウント認証したのでprivateリポジトリもクローンできると考えていた

# 発生した状況
* 仮想マシン上(ubuntu20.04)でghをインストール
* ```gh auth login```でトークンを貼り付け認証
* ```gh repo clone my_private_repo```でクローン

# 解決法
画面右下のSettings→Developer Settings
![スクリーンショット 2023-08-28 1.09.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3131671/b10f14c0-20fd-018c-1ff3-a77358a7ac4b.png)

Fine-grained personal access tokensで作成したトークンを編集
![スクリーンショット 2023-08-28 1.12.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3131671/042ecd02-d1a3-2000-4e87-16d59650fdc9.png)

PermissionsからRepository permissionsを選択し, Contentsのアクセス権限をRead and writeに変更
![スクリーンショット 2023-08-28 1.15.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3131671/7f306894-61f7-fd2c-1007-c8f26739d425.png)

これで```gh repo clone```ができるようになりました.
【Swift】「Set」を扱う方法

## Setとは
`Set`は**要素の順序が保証されていないデータ構造**です。そのため、`Set`の最初の要素を削除する、といったような操作の結果は毎回異なる可能性があります。

:::note warn
本記事では、Setの結果を提示していますが、あくまで参考としてご覧ください。
:::

`Set`では、次のような操作を行うことができます。
* [Setの定義](#setを定義する)
* [Setの追加](#setに要素を追加する)
* [Setの削除](#setの要素を削除する)

## Setを定義する
Setの定義には、次のような方法があります。

```swift:swift
// 空のSetを定義する
var emptySet = Set<Int>()

// 要素を含んだSetを定義する
var numbers: Set<Int> = [1, 2, 3, 4, 5]
var fruits: Set<String> = ["banana", "orange"]
```

## Setに要素を追加する

```swift:swift
var fruits: Set<String> = ["banana", "orange"]

// fruitsにappleを追加する
fruits.insert("apple") // ["banana", "orange", "apple"]
// 同じ要素を追加しても重複は許さない
fruits.insert("apple") // ["banana", "orange", "apple"]
```
:::note warn
Setでは`append`を使うことはできません。
:::

## Setの要素を削除する

Setの要素を削除する方法には次のようなものが挙げられます。

* [特定の要素を削除する](#特定の要素を削除する)
* [セット全体を空にする](#セット全体を空にする)
* [特定の条件に一致する要素のみに変換](#特定の条件に一致する要素のみに変換)

#### 特定の要素を削除する

```swift:swift
var fruits: Set<String> = ["banana", "orange", "apple"]
fruits.remove("banana") // ["orange", "apple"]
// 要素が存在しない場合は無視される
fruits.remove("strawberry") // ["orange", "apple"]
```

#### セット全体を空にする

```swift:swift
var fruits: Set<String> = ["banana", "orange", "apple"]
fruits.removeAll() // []
```

#### 特定の条件に一致する要素のみに変換

```swift:swift
var numbers: Set<Int> = [1, 2, 3, 4, 5]
// Setの要素のうち、偶数のものだけにフィルタリング
numbers = numbers.filter { $0 % 2 == 0 }
print(numbers) // [2, 4]
```

## おわりに

記事内に間違いや補足点があれば、ご指摘いただけると幸いです🙇

最後まで読んでいただき、ありがとうございました。

👋
ある日突然 LINE ボットの定期通知が来なくなった

# 現象

以前毎日2時間置き(1:00, 3:00, 5:00, ... 23:00)に LINE のボットチャネルに送信されるように設定していたある通知が、気づいたら来なくなっていた。おかしなことに、来なくなった日が数日続いたかと思えばまた突如再開し、さらにまた数日して来なくなり、、を何回か繰り返しているような状態が続いた。
この LINE ボットは2年ほど前から稼働させており、過去にこのようなことはなかった。
そこで、（この通知がなくてもさして困ることはないが）気になったので原因を調べてみたので、その時の手順をメモしたいと思う。

# 前提

## 何の通知か？

- 最新の仮想通貨（暗号資産）のレート（1コインあたり何円か）を LINE のボットチャネルに通知してくれるもの。
- 対象の仮想通貨はビットコイン(BTC), イーサリアム(ETH), ビットコインキャッシュ(BCH), リップル(XRP) の4種である。


## アーキテクチャ

![arch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671630/92dd7c84-848a-d8ef-4fcd-ef8bc9772b4f.png)

AWS のサービスを主に使用しており、それぞれの簡易な説明は以下の通り。
- `EventBridge` で定期的な実行をキックする（2時間ごと）。
- `API Gateway` を挟み、`Lambda` で通貨レートの通知に必要な諸々を処理している。
    - 通貨レート情報は、GMO コイン の API をコールして取得している。
    - 通貨レートと共に、前回通知(2時間前)からの差分も表示するようにしているのだが、その時前回レートを保持しておく必要があり、その目的に `DynamoDB` を使用している。
    - Lambda 処理に関するログなどは `CloudWatch` でウォッチしている。
    - レート情報を `LINE Messaging API` を使用して LINE のボットチャネルにプッシュ通知する。

## 通知イメージ

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671630/8c20d656-45aa-1fcf-aa30-cbc2cf6d6f10.png">


# 調査

## Lambda の実行ログ確認(Cloud Watch)

- 仮想通貨 API は問題なくコールできている。
- LINE Messaging API のコールは、429 エラーで、レートリミット超過だった（全然そんなにコールしていないにも関わらず、である）。

## LINE Messaging API に関する情報をコンソールで確認

### Developers コンソール

- プッシュ通知先のボットチャネルの統計情報を `https://developers.line.biz/console/channel/{channelID}/statistics/messages` で確認すると、8/17 に少し減少し、8/18 以降は通知ゼロとなっている。

    <img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671630/e5feabe6-eb2a-0ece-e4cd-a19ab4d4a55b.png">

- 詳しい統計は LINE Official Account Manager をみてねということなので、そうする。

### LINE Official Account Manager

- 「メッセージ通数」ページでは、さらに過去の通知状況を確認することができたので、7月と6月の状況を表示してみた。すると、実際の通知送信数に特定の規則があることがわかった。
    - 各月 17日前後を境に通知されなくなり、**翌月には再度復活していた。**
    - この現象は 2023/6 月から起こっていた。
    - また、画面下の方に表があり、実際に配信されたメッセージ数が 200 となっていたのが気になった。これに関しても、2023/6月以前は、368 などとなっていた。
    - 。。。。
    - 今年の6月から何か変更を加えただろうか？いや、ソースコードは全く触っていない。もしやと思い、「line messaging api 無料メッセージ数」などの検索ワードでググる。

## 原因

LINE Messaging API の料金プランが変更され、無料プラン(コミュニケーションプラン)の場合、200通/月までとなったことにより、今年の6月以降各月で、200通をプッシュ通知を超えた分については送信されなかったようである。

https://www.linebiz.com/jp/service/line-official-account/plan/

## 結論

3rd パーティ製のインフラを利用してサービスを展開する場合は、料金プランや利用規約の変更を把握する必要がある。

# 本記事のリポジトリ

https://github.com/yasuki0707/crypto-currency-rate
【AWS】イメージで理解するIAM Role（何のためにある？）

<script defer class="speakerdeck-embed" data-id="5d688eca1b644bc3b8c53950c551ff61" data-ratio="1.7777777777777777" src="//speakerdeck.com/assets/embed.js"></script>

### 参考

- [AWSのIAMロールとポリシーの違い](https://qiita.com/montama/items/90bb8a3973d101be4690)
- [最小権限実現への4ステップアプローチ 前編](https://aws.amazon.com/jp/blogs/news/systematic-approach-for-least-privileges-jp/)
- [いらすとや](https://www.irasutoya.com/)
流体系相分離のシミュレーション: NS-CH方程式を解く [C,C++]


# 流体系相分離のシミュレーション: NS-CH方程式を解く [C,C++]
2023-0827

車輪の再発明をします．

ここでは，Navie-Stokes方程式とChanHilliard方程式を解く数値解析コードを構築します．

## 結果

流速$u$にTaylor-Green Vortexの初期条件，適当に小さなオーダーパラメータ$\phi$を与えます．

$N_x=N_y=256$
左が$\phi$，右が|u|のプロット．
赤(+1)と青(-1)の2相に分離します．

![phi_uabs.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669376/8bb2dc34-d624-fc2c-9fd6-8ba5434e8ead.gif)


## Navie-Stokes(NS)方程式

非圧縮NS方程式は，流速uについての偏微分方程式：
$$\frac{\partial u}{\partial t}+(u\cdot\nabla)u=\frac{\eta}{\rho}\nabla^2 u - \frac{1}{\rho}\nabla p -\phi\nabla\mu$$
です．ここで，$p$は圧力，$\eta$は粘度，$\phi$はオーダーパラメータ，$\mu$は化学ポテンシャルです．
密度$\rho$は一定とします．
簡単のため，$\rho=1,\eta=1$とします.

拘束条件$\nabla\cdot u=0$を満たす必要があります．

NS方程式部分のベンチマーク問題としては，Taylor-Green Vortexを用いることができる．2次元の場合，$0\leq x\leq 2\pi,0\leq y\leq 2\pi$で
$$u_x=\cos x\sin y e^{-2\nu t},\quad u_y=-\sin x\cos y e^{-2\nu t}$$

## NS方程式の数値解法

コロケート格子，つまりコントロールボリュームの真ん中に物理量$u,p,\phi,\mu$が配置されているとします．

空間的には中心差分で2次精度，時間的に陽的Euler法で1次精度で解きます．

時間積分にはFractional Step法を用います．

1. $n$step目の速度場$u^n$から，圧力項を除き，仮の速度場$u^\ast$を求めます．
$$\frac{u^\ast-u^n}{\Delta t}=-(u^n\cdot\nabla)u^n + \nabla^2 u^n -\phi^n\nabla\mu^n $$

2. 非圧縮条件を満たすように圧力を決定します．Jacobiの反復法を用います．
$$\nabla^2 p = \frac{\nabla \cdot u^\ast}{\Delta t}$$

3. 圧力項の寄与分を足します．
$$\frac{u^{n+1}-u^\ast }{\Delta t}=-\nabla p$$

## Cahn-Hilliard(CH)方程式

オーダーパラメータ$\phi$の時間発展は，化学ポテンシャル$\mu$を用いて，
$$\frac{\partial \phi}{\partial t}+(u\cdot\nabla)\phi=\frac{D}{\alpha}\nabla^2\mu$$
ここで，Ginzburg-Landau型の二重井戸型ポテンシャルから，
$$\mu = \alpha(\phi^3-\phi-\gamma\nabla^2\phi)$$
です．簡単のため，パラメータ$D=\alpha=\gamma=1$とします．

これも上のNS方程式と同様に陽的Euler法で解きます．

## 実装

Github: https://github.com/so-miyamoto/NSCHmpi

実装はmain関数にゴリゴリです．
また，C++の機能をいくつか使いつつも，事実上ほとんどCみたいな記述をしています．

計算ドメインは$N_x\times N_y$点のRegular Gridとする．周期境界条件を課す, ここで$\Delta x=\Delta y=1$とした．

配列は一次元配列で確保し，その後多次元配列にキャストする．
C++っぽく，ポインタを`unique_ptr`で管理し．多次元配列にキャストして利用する．
~~~C++
  auto phi_alloc = std::make_unique<double[]>( 2 * (NXloc+2) * (NY+2)       );
  auto phi = reinterpret_cast<double(&)[2][NXloc+2][NY+2]     >(*phi_alloc.get());
  // phi is 3d array
~~~

MPI実装のため，領域を$x$方向にプロセス数$N_p$等分する．
rank $i$(0-indexed)のプロセスは$[iN_x/N_p,(i+1)N_x/N_p]$の領域を計算する．
各プロセスで1列分の"のりしろ"となる領域を確保するため$(N_x/N_p+2)\times N_y$だけallocationする．
~~~C++
MPI_Sendrecv( &phi[0][NXloc  ],NY+2,MPI_DOUBLE,rank_r,0,
              &phi[0][0      ],NY+2,MPI_DOUBLE,rank_l,0,MPI_COMM_WORLD,MPI_STATUSES_IGNORE);
MPI_Sendrecv( &phi[0][1      ],NY+2,MPI_DOUBLE,rank_l,0,
              &phi[0][NXloc+1],NY+2,MPI_DOUBLE,rank_r,0,MPI_COMM_WORLD,MPI_STATUSES_IGNORE);
~~~



# 参考

Naso, Aurore, and Lennon Ó. Náraigh. 2018. “A Flow-Pattern Map for Phase Separation Using the Navier–Stokes–Cahn–Hilliard Model.” European Journal of Mechanics - B/Fluids 72 (November): 576–585.
KiCad7備忘録　ビアのテンティング禁止　について

# はじめに

KiCad7のガーバ出力の際に出てくるチェックマーク　”ビアのテンティング禁止”　について
及びレジストを被せるビアと被せないビアの両立方法の備忘録

ビアのテンティング禁止はこれ↓
![スクリーンショット 2023-08-27 234013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/81db319e-bf60-60c6-f192-f3585e32cedf.png)

# 説明

適当に作ったデータで説明を行う。
基板にはGNDビアと改造用のユニバーサル基板と同じ寸法の改造用の穴をビアで打ってある。
GNDビアのランドは埋めて、改造用穴ははんだ付けする可能性があるのでランドを埋めたくない。

<font color="red">**☑ビアのテンティング禁止**</font>　の場合
ビアと改造穴どちらもランドがレジストで埋められないデータがガーバ出力される
![スクリーンショット 2023-08-27 022124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/abe2ec0a-cf38-6c6b-7e2e-ede9281f37a0.png)


<font color="red">**☐ビアのテンティング禁止**</font>　の場合
どちらもレジストで埋められました

![スクリーンショット 2023-08-27 022047.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/0d7ed88e-249c-d7c0-8276-53d6f93944d9.png)

# 対策
対策は以下の通り
①改造穴をビアとしてではなく、スルーホールとして打つ
②もしくはF.Mask , B.Mask(両面のレジスト層)にビアの直径と同径の円を作成して被せてビアのランド部分だけレジストを抜く

下の画像は②のやり方でビアの直径と同径の円をF.Mask , B.Maskに作成した所のスクショ

![スクリーンショット 2023-08-27 233619.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/a06640e6-578a-d960-abba-71ba92459423.png)

# 結果

改造穴だけビアのランドを表示させることができた

![スクリーンショット 2023-08-27 233858.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/22bd370b-bd31-c4b7-b1a6-08130ba73643.png)

ほなまた
【React】指定したキーが入力された時に処理を行う方法


# 特定のキーが入力された際の処理

以下のように記述すると`Esc`が入力された際に実行される処理を定義できます。

```tsx
import { useEffect } from 'react';

const Sample = () => {
  useEffect(() => {
    const handleEscape = (event) => {
      if (event.key === 'Escape') {
        // エスケープキーが押された時の処理をここに記述する
        console.log('Escape key was pressed!');
      }
    };

    document.addEventListener('keydown', handleEscape);

    return () => {
      document.removeEventListener('keydown', handleEscape);
    };
  }, []);

  return <div>sample</div>;
};

export default MyComponent;
```
Rails7+Herokuで「ActiveRecord::ConnectionNotEstablished (connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" 」

# はじめに
個人開発のアプリ制作を始めました。
調べながらの実装になるので、メモとして記載しています。

※注意※
プログラミング学習中の初心者です。
記述に間違いがあれば、ご指摘いただけますと幸いです。

# 環境
Mac M1
Rails 7.0.7.2
Ruby 3.2.0
Node.js 20.2.0
Yarn 1.22.19

# 発生事由
ユーザーの新規登録を実装し、Herokuへpushしたところ、　pushはできましたが、下記のエラー画面が出ました。
<a href="https://gyazo.com/0c56b8cbab4d7c3d2cf844130182c3df"><img src="https://i.gyazo.com/0c56b8cbab4d7c3d2cf844130182c3df.png" alt="Image from Gyazo" width="597"/></a>
Herokuのログ
```
ActiveRecord::ConnectionNotEstablished (connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
```
Postgresが落ちているのかと思いましたが、起動していました。
```
$ brew services list

Name          Status  User         File
mysql         none                 
postgresql@14 started ユーザー名 ~/Library/LaunchAgents/homebrew.mxcl.postgresql@14.plist
```
Heroku上でmigrateができていなかったからと行おうとしたところ、やはり同じエラーが表示。
```
$ heroku run rails db:migrate
Running rails db:migrate on ⬢ grow-journey... up, run.4405 (Basic)
rails aborted!
ActiveRecord::ConnectionNotEstablished: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?
```
# 解決方法
調べたところ、Heroku Postgresを追加しなければいけませんでした。(有料)
```
$ heroku addons:create heroku-postgresql
```
再度`$ heroku run rails db:migrate`で無事Herokuの画面上で新規登録ページが表示されました。

# 参考
https://menta.work/post/detail/5320/uwskJaQrLakhiXZqEFHE

https://teratail.com/questions/170344

https://elements.heroku.com/addons/heroku-postgresql
Lombokを利用したしたログ出力でMaskをしたい、またはログ出力させない

## やりたいこと

1. ログ出力時にマスクを掛けて機密情報を出力しない
1. ログ出力時にそもそもログを出力させない

## 環境

+ Java 17
+ lombok 1.18.28


## Maskを掛けない場合

ログ出力対象のユーザークラスを作成し、`@Data`アノテーションを付与

```User.java
import lombok.Data;
import lombok.ToString;

@Data
public class UserInfo {

	private String userId;
	
	private String password;
	
	private String mail;	
}
```

### ログ出力


```java
var userInfo = new UserInfo();
userInfo.setUserId("user1234");
userInfo.setPassword("password");
userInfo.setMail("user123@gmail.com");
		
log.info(userInfo.toString());
```


### ログ出力結果

パスワードがそのまま出力される
```
UserInfo(userId=user1234, password=password, mail=user123@gmail.com)
```


## @ToString.Includeを指定

`@ToString.Include`を付与することで、getterの戻り値を`toString()`で出力できるようになる


+ Maskを行いたいメンバー変数のgetterに`@ToString.Include`を付与する
+ name属性にメンバー変数と同じ名前を指定する


:::note warn
getter名を`getPassword`にするとMaskされた値しか取れなくなるので注意
:::


```User.java
import lombok.Data;
import lombok.ToString;

@Data
public class UserInfo {

	private String userId;
	
	private String password;
	
	private String mail;

	@ToString.Include(name = "password")
	public String getMaskPassword() {
		return "***";
	}
}
```


### ログ出力結果

ログにMaskがかかっている

```
UserInfo(userId=user1234, mail=user123@gmail.com, password=***)
```

`getPassword()`を呼べばMaskがかかっていない値が取得可能


```java
log.info(userInfo.getPassword()); // password
```







## @ToString.Excludeを指定

Maskを掛けるのではなくてログ出力させたくない場合は`@ToString.Exclude`を付与する


+ Maskを行いたいメンバー変数に`@ToString.Exclude`を付与する


```User.java
import lombok.Data;
import lombok.ToString;

@Data
public class UserInfo {

	private String userId;
	
	@ToString.Exclude
	private String password;
	
	private String mail;
}
```


### ログ出力結果

`password`の項目自体がログ出力されない

```
UserInfo(userId=user1234, mail=user123@gmail.com)
```
ApacheとNginxについて

## WEBサーバーとは
Webサイトなどのブラウザから最初に接続されるサーバーで、リクエストに応じてホームページのデータをブラウザに送ってくれるサーバーのことです。
このやり取りにはHTTPと呼ばれる通信規約(プロトコル)が使用されます。

代表的なものにNginxとApacheがあります。この２つで世界シェア約65％を占めています。次いでCloudflare, LiteSpeed, Microsoft-IISが世界シェアの高いものになります。

今回はApacheとNginxについて人に説明できるくらいには知っておこうと思い調べてみました。

## Apacheとは
古くから利用されているWEBサーバーで正式には「Apache HTTP Server」と言います。
無償で利用できるオープンソースで高い安定性と信頼性、情報の多さ、動作の軽さから人気を集めています。ただ同時処理数が多くなるとメモリ消費が高くなってしまいます。(詳しくは後述)

Apacheではhttpd.confファイルに設定を記述します。

## Nginxとは
特徴としては高い処理能力や並行処理能力を持ち、メモリ消費が少ないことが挙げられます。そもそもNginxはApacheの大量に同時接続があるとメモリを大量に使用してサーバーがパンクするという弱点を克服することを目的として設計されています。

Apacheに対して重たいデータの扱いには向いておりません。
nginx.confに設定を記述します。

## C10K問題
C10K(クライアント1万台問題)とは同時接続するクライアントが多すぎるとサーバーがパンクしてしまうことです。
Apacheの場合、1つのリクエストに対して1つのプロセスで対応します。約3万リクエストが最大同時接続数となります。対してNginxは1プロセスで複数のリクエストに対応します。

なぜ1万台かというと1万台前後を目安に性能が下がってくるからだそうです。

## ApacheとNginxの比較
- 処理能力　Nginxの方が高い
- 同時接続数　Nginxの方が高い
- 動的コンテンツ　Apacheの方が得意
- メモリ消費　同時処理数が増えるとApacheの方が多くメモリが消費される

Apacheは少量の同時接続数で重い処理を担当させ、Nginxには大量の同時接続数や軽い性的コンテンツを担当させるのが良さそうです。
AWS CDK - RDSのスナップショットからレストアするとき

CDKでRDSのSnapshotからレストアする際に気をつけたいポイントがあったので、備忘録として🙂

Cloudformationからのレストアは`DBSnapshotIdentifier`の値にスナップショットのIDを指定するとの事。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html

CDKではL2で書いていたものをL1でキャストして`addPropertyOverride`メソッドを使いました。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.CfnResource.html#addwbrpropertywbroverridepropertypath-value

```typescript: typescript
const cfnInstance = rdsInstance.node.defaultChild as rds.CfnDBInstance;
cfnInstance.addPropertyOverride("DBSnapshotIdentifier", "<SnapShotArn>");
```

注意点として、以下がしっかり書いてある。

:::note warn
プロパティを使用して DB インスタンスを復元した後、 DB インスタンスに対する今後の更新に対してDBSnapshotIdentifier 同じプロパティを指定する必要があります。DBSnapshotIdentifier更新にこのプロパティを指定すると、DB インスタンスは DB スナップショットから再度復元されず、データベース内のデータは変更されません。ただし、プロパティを指定しない場合はDBSnapshotIdentifier、空の DB インスタンスが作成され、元の DB インスタンスは削除されます。以前のスナップショット復元プロパティとは異なるプロパティを指定した場合、新しい DB インスタンスは指定されたプロパティから復元されます。 DBSnapshotIdentifierプロパティが削除され、元の DB インスタンスが削除されます。
:::

これはしっかり認識しておかないと事故りそう😇

以上～
macOS Venturaから、UnityのPreferences Windowを開くメニューが、「Unity > Preferences」から「Unity > Settings」に変わった

注：この情報は、2023年9月16日時点の情報です。記載のソフトウェア・OSバージョンで確認をしています。

Preferences Windowは、Unity Editorの設定を変更するWindowです。このWindowはメニューから開くことができます。

![スクリーンショット 2023-09-16 22.10.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/cdb455a8-8a19-b626-1eb8-4116d7fbee96.png)

https://docs.unity3d.com/Manual/Preferences.html

2021年リリースのmacOS Montereyまでは、Preferences Windowを開くメニューは、「Unity > Preferences」でした。

2022年リリースのmacOS Venturaから、Preferences Windowを開くメニューが、「Unity > Settings」に変わりました。
![スクリーンショット 2023-09-16 22.35.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/0592cd3a-1bef-2c8b-aaea-9bd7ce2db59c.png)


次のUnity Editorのバージョン、macOSバージョンで確認しています。

確認したUnityバージョン: 2023.1.13f1、2022.3.4f1、2021.3.18f1
確認したmacOSバージョン: Ventura 13.5.2


注意点として本稿執筆時点では、[公式ドキュメント](https://docs.unity3d.com/Manual/Preferences.html)において、UnityのPreferences Windowを開くメニューは、macOSでは一律「Unity > Preferences」になっていて、「Unity > Settings」については記載がありません。

---

これはUnity側の変更ではなく、Apple・macOS側の変更に伴っての名称変更かもしれません。

* [Change the name of your macOS user account and home folder](https://support.apple.com/en-us/HT201548)、Apple公式フォーラム
* [macOS Venturaからの新しい“Settings”表記と、旧“Preferences”表記からの移行](https://zenn.dev/usagimaru/articles/de5012155f4916)、usagimaruさんのzennポスト

---

この名称変更が厄介なのは

* 最新Unity Editorだけでなく、サポート中の古いUnity Editorでも影響を受ける
* セキュリティーアップデート継続中の古いmacOS（Big SurとMonterey）では、元のメニュー名なまま

という点です。

書籍、ブログ記事、マニュアルを執筆する人で、Preferences Windowの操作方法を記述する人は、注意してください。（特に書籍を執筆する人）

またmacOS Ventura以降を使っていて、

『Preferences Windowを開きたいのに、本に書いてある「Unity > Preferences」なんてメニューは見当たらないぞ？』

と思った方は、「Unity > Settings」というメニューでPreferences Windowが開けます。参考にしてみてください。

---

[公式ドキュメント](https://docs.unity3d.com/Manual/Preferences.html)には、「Report a problem on this page」から指摘をしました。そのうち、修正・追記されることを期待しています。