OmniAICreator/Qiita-1.07M huggingface dataset:
Socks5 を経由して ssh で github にアクセスする

## 秘密鍵を生成する

すでに秘密鍵をあるが、生成から手順を記しておく。

```zsh
ssh-keygen -t ed25519 -C "your.email@example.com"
```

## github に接続する

socks5 プロキシが 10.8.0.1 の 1080 ポートを listen している場合のコマンド。

ssh コマンド内でnc (netcat) を実行して、socks5 を経由させる。

```zsh
$ ssh -T git@github.com -o "ProxyCommand nc -X 5 -x 10.8.0.1:1080 %h %p" -i ~/.ssh/id_ed25519_github_key
Enter passphrase for key '/Users/centipede/.ssh/id_ed25519_github_key':
Hi centipede! You've successfully authenticated, but GitHub does not provide shell access.
```

### コマンドを ~/.ssh/config に記入して接続を簡単にする

```zsh
$ vi ~/.ssh/config
$ cat ~/.ssh/config
Host github-socks5
    HostName github.com
    User git
    ProxyCommand nc -X 5 -x 10.8.0.1:1080 %h %p
    IdentityFile ~/.ssh/id_ed25519_github_key
```

接続してみる。

```zsh
$ ssh github-socks5
Enter passphrase for key '/Users/centipede/.ssh/id_ed25519_github_key':
PTY allocation request failed on channel 0
Hi centipede! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
```

接続に成功。

## socks5 経由で git clone をしてみる

```zsh
$ git -c "http.proxy=socks5h://10.8.0.1:1080" clone git@github-socks5:centipede/example-repo.git
Cloning into 'example-repo'...
Enter passphrase for key '/Users/centipede/.ssh/id_ed25519_github_key':
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (5/5), 5.31 KiB | 2.66 MiB/s, done.
```

:::note warn
ホスト名に注意
socks5 を経由しない通常の git clone する場合は、 `git@github.com:centipede/example-repo.git` を指定するが、github.com のホスト名を、~/.ssh/config で設定したホスト名 `github-socks5` に変更して git clone している。
:::

:::note warn
socks5 の指定に注意
私の環境上、github.com の名前解決を sock5 に任せるため、`socks5h://10.8.0.1:1080` と指定している。ローカル環境で名前解決をする場合は、`socks5://10.8.0.1:1080` でよい。
:::

### .git/config に proxy 設定を追加する。

git clone したリポジトリに移動する。

```zsh
$ tail .git/config.orig
[branch "main"]
	remote = origin
	merge = refs/heads/main
$ git config http.proxy "http.proxy=socks5h://10.8.0.1:1080"
$ tail .git/config.orig
[branch "main"]
	remote = origin
	merge = refs/heads/main
[http]
	proxy = http.proxy=socks5h://10.8.0.1:1080
```

最終行に proxy 設定が追加された。この設定で、socks5　経由でリモートリポジトリにアクセスできるようになった。
標準オブジェクトのロックについて

プロジェクト中にデッドロックに出会った。
正しくは設計を見直すべきだと思うがリリーズに間に合うには・・・

ロック対象がGroupオブジェクトだったので、
対象のデータ（2件）を一気に先行ロックすればいいやと思い　
```Java
Select ... From Group Where ... FOR UPDATE
```
したら、あらら・・・下記のエラーが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159211/5d16e56a-4f39-3778-6dcb-8a1fbbce74f6.png)

どうすればいいのかまだ分からずです。
どなたが回避方法あればご教授お願い致します。

ちなみに、
暗黙的なロック動作については下記のシートにまとめてありました。ご参考までに。
[Record Locking Cheatsheet](https://d259t2jj6zp7qm.cloudfront.net/images/20210727114613/SF_Record-Locking-Cheatsheet_web-1.pdf)
RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not workが出た際の対処法

# はじめに
　pydubとsimpleaudioを使って音声を再生しようとしたところ、

warn("Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work", RuntimeWarning)
RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work

　のエラーが発生。
　ネットで検索すると以下のサイトがヒット

https://github.com/jiaaro/pydub/issues/348

# 対処法
まず[ffmpegの公式サイト](https://www.ffmpeg.org/download.html)にアクセス。windowsのマークにカーソルを合わせたうえで、Windows EXE FilesのWindows builds from gyan.devをクリック。（Windows builds by BtbNとの違いは知りません）

すると[このサイト](https://www.gyan.dev/ffmpeg/builds/)が開くのでここのlatest git master branch buildのffmpeg-git-essentials.7zをクリックしてダウンロード。

ダウンロードしたファイルを[7-Zip](https://sevenzip.osdn.jp/)か何かで解凍してffmpeg.exeが入っているbinフォルダをPathに設定。（設定の仕方は下のサイトを参照されたし）

https://atmarkit.itmedia.co.jp/ait/articles/1805/11/news035.html#:~:text=%E6%96%B0%E3%81%97%E3%81%84%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AE%E3%83%91%E3%82%B9%E3%82%92,%E3%81%AE%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E8%B2%BC%E3%82%8A%E4%BB%98%E3%81%91%E3%82%8B%E3%80%82

あとはpip install ffmpegとコマンドプロンプトに入力してsuccessfully installedされれば終わり。
５分で紹介「セキュリティ技術の教科書　情報処理安全確保支援士試験 」

# はじめに
この記事は 
**「セキュリティ技術の教科書　情報処理安全確保支援士試験 」** を**５分**で**この本の魅力や大まかな内容**を理解することを目的とした記事です。

この記事で少しでも興味を持ってこの本を読むきっかけになれば幸いです。

<img width="300" alt="名称未設定のアートワーク 1 (2).jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921163/63aad3f1-3119-e82b-32b6-7387dfd9dc6d.jpeg">

# 目次
**・概要
・個人的な感想
・おすすめの本
・引用**

# 概要
この本は**全415ページ**、**12章**で構成されています。

内容は**情報セキュリティに関わる人材*に向けて書かれていて、
**情報処理安全確保支援士試験の対策セミナー向けのレジュメ**を
ベースに作成されています。

**情報セキュリティ分野の教育経験豊富な著者**が執筆しており、
さらに**技術分野ごとに**知識事項をわかりやすく説明されています。

**グラフや図**が多用されていて、
**視覚的に**わかりやすいようになっています。

**各ページの左側**には**難しい言葉の説明**が書かれています。
さらに重要な言葉は**色が変えられていて**、
重要な部分がわかりやすいようになっています。

各章の最後には**確認問題**がついていて、
自分の知識がしっかり定着しているか確認することができます。

# 個人的な感想
この本を読んで、
この本は**情報セキュリティを学習しようとする人**や、
**情報処理技術者試験における情報セキュリティの分野を学習したい人**に
おすすめできる本だと思いました。

理由は以下の通りです。
**・情報セキュリティ分野の教育経験豊富な著者が執筆している
・視覚的に理解しやすい工夫がされている
・知識を確認するための例題がついている**

このようにこの本は、
**情報処理技術者試験対策目的**だけでなく、
**情報セキュリティ技術全般**を学習することもできる本なので、
**幅広い人**のためになる本であると感じました。

# おすすめの本
この本に関連した以下のような本の記事も書いていますので、
興味があればぜひ読んでみてください。

## 情報セキュリティ
https://qiita.com/Natsume6613/items/1db243cce5f01dfcad95

https://qiita.com/Natsume6613/items/1dcaa61ed96b374d4bac
## 資格勉強
https://qiita.com/Natsume6613/items/20ef85ecca0e8c5af9a2

# 引用
>セキュリティ技術の教科書　情報処理安全確保支援士試験 
著 長嶋仁
2020/3/18

https://shopping.yahoo.co.jp/products/b5dc18fb61
「GPT-4の悲劇 」GPT-4で推理アドベンチャーを生成する

 GPT-4でテキストベースの推理アドベンチャーを生成してみる。
プロンプトはこれ↓だけ

```
以下のような設定で、テクストベースのアドベンチャーゲームを生成してください。

ある屋敷で殺人事件が起きた。プレイヤーは、その操作に駆け付けた名探偵である。
殺人事件の現場は、屋敷の居間で被害者の胸にナイフが突き刺さっている。
容疑者は男性三人と、女性三人である。名前、職業、年齢、被害者との関係は適当に決めて下さい。
また、殺人の動機、共犯関係も適当に決めてほしい。
ナイフが刺さっているからといって、それが真の死因とは限りません。
Playerには助手がいて、その助手が捜査の手助けをします。
Playerはステップ by ステップでコマンドを選択し、謎をといていきます。（真相に迫っていきます。）
また、屋敷の各部屋を回って証拠を探します。
それでは、ゲームスタートです。スタートする場所は、全員が集まった屋敷の居間です。

```

すると、以下のようにゲームが進行します。

![スクリーンショット 2023-03-20 152952.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/728d649f-0917-09f6-aeaa-393f5707de03.png)
![スクリーンショット 2023-03-20 153031.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/b570eec7-10c1-2088-e05e-96d9657261c6.png)
![スクリーンショット 2023-03-20 153057.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/e63c0371-353c-2816-f0d8-12cef32ab758.png)
![スクリーンショット 2023-03-20 153130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/05d19323-36db-10f0-f230-a3f3114df5cc.png)
![スクリーンショット 2023-03-20 153202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/90d26051-d1ea-46e9-2c4e-4724e85edb4e.png)
![スクリーンショット 2023-03-20 153226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/0ed55745-3e55-37b3-eb9b-4d1b17bdf4b4.png)
![スクリーンショット 2023-03-20 153255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/4f03334c-c8cf-2dbc-a088-2820b94e1987.png)
![スクリーンショット 2023-03-20 153407.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/b9236c40-00ff-d456-cfb5-ee7613e4ee01.png)
![スクリーンショット 2023-03-20 153431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/33a747c3-af5f-be31-9c88-ac5b11ccab97.png)

ゲームはまだまだ、続きますが、犯人は？動機は、共犯関係は？


ちなみに、別の回のスタートはこんなです。

![スクリーンショット 2023-03-20 160632.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/77258c6c-a956-ed8e-001a-506c0955b7a1.png)

そして、途中で諦めて事件の真相を聞いてみました。

![スクリーンショット 2023-03-20 163743.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/9d208beb-48c8-73b2-cfd9-87241e0d3c9d.png)
AZ-900対策勉強

# AZ-900受験について

私がAZ-900の試験までに行った対策について記載していきたいと思います。
受験の動機としては、もともとAI-900を受験するつもりで調べていく中で偶然見つけたので受けてみよう！くらいの軽い気持ちでした！
電気電子系の大学院生をしているのでシステムに触れたことがあり前提知識はありましたが、必ず一発で受かりたかったのでしっかり勉強をしました。

### 行った対策

私が試験までに行った対策を記載します
・「Microsoft Azure Virtual Training Day : 基礎」への参加
・「Microsoft Learn」での学習
・試験対策本での学習
・Udemyの模擬試験
振り返ってみて、どれも必要な学習だったと思います。
期間は１か月程度でした。私自身のんびりと学習をしてしまったので予定以上に長くかかってしまいました。反省です、、、。

## 受験までの道のり
以下、詳しく受験までのスケジュールを記載していきます。

### 「Microsoft Azure Virtual Training Day : 基礎」への参加
一番最初にMicrosoftが提供する試験対策講座である「Microsoft Azure Virtual Training Day : 基礎」を半日×２日間の日程で受講しました。
試験突破のための全体像を知ることができるので、はじめにこの講座を受けるのはとてもおすすめです。

https://www.microsoft.com/ja-jp/events/top/training-days/azure?activetab=a1:primaryr4

★また、この講座を受講することで試験を無料で受けることができます。まだ学生なので受験料がちょっと高くて痛手だと思っていたのですが、この講座のおかげで無料で受けることができました。

### 「Microsoft Learn」での学習
講座を受講したら、「Microsoft Learn」で2週間程度かけて学習を行いました。
試験対策講座で学んだ知識の増強というイメージで、詳しいシステムの詳細や名称などを覚えました。
少し分かりづらい表現が多く、理解して落とし込むまで時間がかかってしまいました。

https://learn.microsoft.com/ja-jp/training/paths/microsoft-azure-fundamentals-describe-cloud-concepts/

### 試験対策本での学習
「Microsoft Learn」を学習し終えてから試験対策本を購入し、3章ずつ4日間で学習しました。
私は「Microsoft認定資格試験テキスト AZ-900:Microsoft Azure Fundamentals」という青い本を購入しました。
解説などもわかりやすくおすすめです。

https://amzn.asia/d/75KFLUS

この本しか買っていないため比較できませんが、kindleで数冊試し読みができるようになっているので自身が読みやすい対策本を購入されるのが良いかと思います。

また、振り返ると試験対策本を読んでから「Microsoft Learn」での学習をした方が効率が良かったと思っています。

### Udemyの模擬試験
最後に直前対策としてUdemyで問題集を購入し、2週間程度かけて学習を行いました。
いくつかの種類がありましたが、最新版であることやレビューが高かったのでこの問題集を購入しました。対策本と同じく比較はできないのですが、解説もわかりやすく購入してよかったと思っています。
この問題集で9割の得点率があれば合格できるかと思います。私は得点率8割5分くらいでしたが、もう少し対策していればと後悔していました。
またUdemyは定期的にセールを行っているので、セールしているタイミングで買った方が断然お得です。私も安く買いました！

https://www.udemy.com/share/106ezY/

## 結果
満点が1000点、合格点が700点で私は760点/1000点で無事一発合格することができました。
とはいえかなりギリギリの点数ですが、合格できてよかったです。
今回学習したことは使わないと忘れそうので、気が向いたらAzuleに触れていきたいと思います！
![microsoft-certified-azure-fundamentals.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949441/d395d03c-f004-8717-ccfa-a1b97f2f2c72.png)
ということで、次はもともと取りたかったAI-900の対策をしていきたいと思います！

### AI-900の対策勉強はこちら

https://qiita.com/rika45/items/19e9210df0bed9929d1c
PostgreSql dump取得コマンド

# 書いた理由
AWSのRDSでPostgreSqlの本番DBのリストアとdump取得コマンドよく忘れるので備忘録的にメモろうと思います。

# dump取得コマンド

```
ssh -i ファイル名.pem ubuntu@IPアドレス
pg_dump -Fc -U postgres -h エンドポイント -d DB名 > dumpファイル名

マスターパスワードも要求されるので調べておくこと。
```


# dump取得コマンド
```
①docker desktopでdbコンテナ再起動(接続切るため)

②cd docker (プロジェクトのディレクトリ)

③docker compose exec web bash

④dropdb -U postgres -h コンテナ名 DB名

⑤createdb -U postgres -hコンテナ名 DB名

⑥pg_restore -U postgres -h コンテナ名 -d DB名 < dumpファイル名
```

以上です。
誰かの参考になれば幸いです。
ping「宛先ホストに到達できません」&「要求がタイムアウトしました」の説明と原因、確認すべき項目についてまとめた


## このページの説明
ping command を実行した際、以下の3パターンがあります。

- 成功
- 宛先ホストに到達出来ず失敗
- タイムアウトして失敗

ふと、この2つの失敗パターンの違いってなんだっけな、と思ったので備忘録も兼ねてまとめました。

### 【前提】そもそも ping command とは

ping command は、TCP/IPネットワーク上のデバイス間通信の疎通確認を行うためのコマンドであり、主に以下のような目的で使用されます。
1. ホストまでの接続確認
ホストやサーバーに到達できるかどうかを確認することができます。
2. ネットワークトラブルの調査
ネットワーク上に接続された機器やコンピュータが正常に応答しているかどうかを確認することができます。
3. パフォーマンスチェック
パケットロスや応答時間を測定することで、ネットワークのパフォーマンスをチェックすることができます。

このように、pingコマンドは、TCP/IPネットワーク上のデバイス間通信の疎通確認やトラブルシューティングに幅広く使用されます。


又、念のためですが構文は以下になります。
```bash
$ ping オプション 接続先IPアドレスまたはホスト名
```


## ping 成功パターンと失敗パターン

### （成功）192.168.2.102 に ping を飛ばしたい場合

- 出力結果

```bash
C:\Users\>ping 192.168.2.102

192.168.2.102 に ping を送信しています 32 バイトのデータ:
192.168.2.102 からの応答: バイト数 =32 時間 =4ms TTL=64
192.168.2.102 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.2.102 からの応答: バイト数 =32 時間 =2ms TTL=64
192.168.2.102 からの応答: バイト数 =32 時間 =2ms TTL=64

192.168.2.102 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 4ms、平均 = 2ms

C:\Users\>
```

- 説明

上記は成功パターンです。
4パケット送信して、4パケット受信しているのが分かります。
つまり、パケットロスなども発生していないです。（損失0%）
ちなみに、ラウンドトリップは、Ping を送信して戻ってくるまでにかかった時間の事を言います。
今回の場合だと、4 回の Ping で、最小が 0 ミリ秒、最大が 4 ミリ秒、平均が 2 ミリ秒となります。

### （失敗）宛先ホストに到達できない場合

- 出力結果

```bash
C:\Users\>ping 192.168.2.100

192.168.2.100 に ping を送信しています 32 バイトのデータ:
192.168.2.101 からの応答: 宛先ホストに到達できません。
192.168.2.101 からの応答: 宛先ホストに到達できません。
192.168.2.101 からの応答: 宛先ホストに到達できません。
192.168.2.101 からの応答: 宛先ホストに到達できません。

192.168.2.100 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、

C:\Users\>
```

- 説明

上記の例は、Ping が宛先に到達しなかった状態を示しています。
これは、ネットワーク接続に問題がある場合や、宛先がオフラインである場合に発生する可能性があります。
宛先に到達しなかったため、応答が返されず「宛先ホストに到達できません」と表示されています。

- 考えられる原因
1. IP アドレスが間違えている
2. 宛先がダウンしている。
3. ネットワーク接続に問題がある。
4. ファイアウォールによって接続がブロックされている。

- 確認すべき項目
1. 宛先ホストの IP アドレスが正しいことを確認する。
2. 宛先ホストの状態を確認する。
3. ルーターやネットワークスイッチなど、ネットワークインフラの状態を確認する。
4. ファイアウォールが接続をブロックしていないか確認する。

### （失敗）タイムアウトした場合

- 出力結果

```bash
C:\Users\>ping 192.168.122.1

192.168.122.1 に ping を送信しています 32 バイトのデータ:
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。

192.168.122.1 の ping 統計:
    パケット数: 送信 = 4、受信 = 0、損失 = 4 (100% の損失)、

C:\Users\>
```

- 説明

上記の例は、Ping が宛先に到達したが、応答が遅すぎて応答がタイムアウトした状態を示しています。
これは、ネットワークが過負荷である、またはホストが応答に時間がかかるように設定されている場合に発生する可能性があります。
宛先に到達したが、応答メッセージが時間内に返されなかったため、「要求がタイムアウトしました」と表示されています。
又、応答時間は、デフォルトだと5秒で設定されていますが、以下のように、-w オプションを使う事で時間を変更する事も出来ます。

```bash
ping -w 10 192.168.122.1
```

上記の場合だと、応答が10秒以内に返ってこなかった場合にはタイムアウトと判断されます。

- 考えられる原因
1. 宛先ホストの応答が遅い or 過負荷でリクエストを処理できていない
2. ファイアウォールが原因で接続が遮断されている。
3. ネットワーク接続に問題がある。

- 確認すべき項目
1. ファイアウォールが接続を遮断していないか確認する。
2. 宛先ホストのネットワーク接続やホストのリソース状況を確認したり、負荷状態を確認する。

　
過不足あれば、ご指摘下さい。
以上！終わり！
製品バージョンとファイルバージョン


# 製品とファイルバージョン

## 製品バージョンとファイルバージョンの違いは？

製品バージョンとファイルバージョンは、ソフトウェアのバージョン番号に関連する異なるコンポーネントです。

製品バージョンは、製品全体のリリースバージョンを表します。これには、製品に含まれる複数のファイルやコンポーネント、機能などが含まれます。製品バージョンは、一般的にマーケティングや広告などで使用され、製品の大きなアップデートが行われた場合に更新されます。

一方、ファイルバージョンは、特定のファイルやコンポーネントのバージョン番号を表します。これには、ソフトウェアの各ファイルやDLLファイルなどが含まれます。ファイルバージョンは、一般的にプログラムやアプリケーションの開発者や管理者によって使用され、個々のファイルが更新された場合に更新されます。

製品バージョンとファイルバージョンは、異なる目的のために使用されますが、両方ともソフトウェアの管理やアップデートに重要な役割を果たしています。
Vmmemによるメモリ枯渇への対処備忘録

# 背景
WSL2上のDockerコンテナで環境構築している時に、マシンがやたらと重い。
仕事用のマシンのメモリが8GBしかないのが原因かと思ったが、タスクマネージャーを見るとvmmemが悪さしてそう。

## 対処法
暫定的に~/.wslconfigでメモリ制限を4GBに設定してみた。

## 結果
vmmemは最大でも4GBしか使わなくなった。
ビルドも問題なく行えた。

## 参考文献
https://note.com/ym202110/n/nfa9337b0beea
https://qiita.com/yoichiwo7/items/e3e13b6fe2f32c4c6120
Teradataのリソース使用状況ログ（resusage)について

---	
Teradataのリソース使用状況ログ（resusage)の設定と内容
---	
:::note warn	
警告	
本記事はTeradata Corporationのサイト[Teradataドキュメント](https://docs.teradata.com/)に掲載された内容を抄訳したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については原本をご参照下さい。	
また、修正が必要な箇所やご要望についてはコメントをよろしくお願いします。	
:::	
	
# 概要
Teradataのパフォーマンスログ（resusage)の取得設定方法、及びログ内容についての説明です。

# 前提条件
・当内容はTeradataVantageのバージョン17.20を前提に記載しています。
・TeradataシステムのOSに管理者ユーザ（root）でログインが必要です。

# リソース使用状況ログ（resusage)とは

resusageは以下を目的として使用します。

・システム パフォーマンスの測定
・構成要素のパフォーマンスの測定
・オンサイト ジョブ スケジューリングの補助
・パフォーマンスへの影響の可能性の識別
・インストール、アップグレード、および移行の計画
・パフォーマンスの低下と向上の分析
・ボトルネック、並列処理による非効率、停止中の構成要素、および輻輳などの問題の識別

# パフォーマンスログの取得設定を行う。(ctlユーティリティ）

## 1.TeradataシステムOSにrootでログインしctlを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841241/2c4f7785-b379-c6fb-03d3-33894254251b.png)



## 2.ctlユーティリティのコマンドで現在の設定状況を確認します。
#### コマンド：screen rss
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841241/a6640ff1-76ef-e8f9-3d10-25c4d47eaf32.png)


## 3.取得したいパラメータ番号を指定し、on又はoffを設定します。
### コマンド：パラメータNo=on 又は off
 ※Logging Rateはデフォルトの600を推奨しています。なお、変更したい場合は、0=60などのように（設定番号=秒数）指定します。
 ※RSS Summary Modeは各種パラメータの要約版です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841241/ecb77f85-e183-e712-0edd-a32a2da3fb2c.png)


## 4.writeコマンドにより設定を反映します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841241/d2d98bee-c0ba-864d-f282-c697c8e2ffbc.png)


## 5.設定がされたことを再度確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841241/7663e4e5-cf21-c1a2-e055-09e245340749.png)




# Resusageの種類

|分類|パラメータ|テーブル|内容
|:-------|:--------|:--------|:--------|
|ノードデータ|SPMA|ResUsageSpma|システム全体のノード情報
|        |IPMA|ResUsageIpma|システム全体の内部ノード情報
|CPUデータ|SCPU|ResUsageScpu|ノード内のCPU毎の情報
|VPROCデータ|SVPR|ResUsageSvpr|各仮想プロセッサに固有のデータ
|        |IVPR|ResUsageIvpr|システム全体の内部vproc情報
|ホストおよびLANデータ|SHST|ResUsageShst|Teradataと通信するホスト・チャネルおよびLANに固有の情報
|論理デバイス・データ|SLDV|ResUsageSldv|論理デバイス – ディスクI/Oに固有の情報
|ディスクデータ|SPDSK|ResUsageSpdsk|Pdiskに関する統計の情報
|        |SVDSK|ResUsageSvdsk|AMP レベルのストレージ統計の情報
|AWTデータ|SAWT|ResUsageSawt|AMPワーカータスク（AWT）に関する統計の情報
|ワークロードデータ|SPS|ResUsageSps|定義されたワークロードに関する情報

:::note warn
詳細は以下のドキュメントを参照してください。

ctlユーティリティ
[Teradata Vantage™ - データベース ユーティリティ](https://docs.teradata.com/r/Teradata-VantageTM-%E3%83%86%E3%83%BC%E3%82%BF%E3%83%98%E3%83%BC%E3%82%B9-%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3-17.20/Control-GDO%E3%82%A8%E3%83%86%E3%82%A3%E3%82%BF-ctl)   
resusageのデータ内容
[Teradata Vantage™ - Resource Usage Macros and Tables](https://www.docs.teradata.com/r/Enterprise_IntelliFlex_VMware/Teradata-VantageTM-Resource-Usage-Macros-and-Tables-17.20/Resource-Usage-Tables)
:::



#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
rex0220 フィールドサイズ設定プラグイン

kintone のフィールドサイズを数値で設定するプラグインです。

主な特徴
・３ヶ国語対応

Ver.2
・プラグイン設定画面のデザイン変更対応

# 概要

プラグイン設定画面で指定した項目のサイズをフォームに反映します。

![2023-03-20_15h08_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/354d8111-f740-d5c7-233e-eb87fddbb0a4.png)

# プラグインの設定

- No: 番号
- POS：　行位置と項目位置
- テーブル名：　テーブル名・グループ名
- タイプ：　項目のタイプ
- フィールドコード
- 幅：　項目の幅
- 高さ：　項目の高さ
- 運用環境に反映

※幅をラベル表示幅などより小さくした場合、ラベル表示幅で表示されます。

![2023-03-20_15h08_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/244456ea-9ede-7ecb-0bc7-b4740fd31171.png)

# 注意事項

他でフォーム変更を行った場合、revision エラーになります。
プラグイン設定画面を再表示して、最新の状態にしてからサイズ調整を行ってください。

![2023-03-20_15h17_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c1fa436a-3571-63e4-53e4-ba44f4d42fba.png)
【Debian 12】nvidia-driverの依存を解決させる方法

最近はもっぱらDebian 12を使っています。いつものように雑に`sudo apt update && sudo apt upgrade`をしたところ、`nviria-driver`の依存である`nvidia-driver-dkms`のバージョンが存在しないと言われたのでその対策方法を書きます。

## 結論
一部のパッケージが[分離された](https://www.debian.org/devel/debian-installer/News/2023/20230219)ので`non-free-firmware`レポジトリ(?)を新たに追記する必要があるようです。

```diff:/etc/apt/sources.list
+ # 2023-03-20 add non-free-firmware, see Debian's post.
- deb http://deb.debian.org/debian/ bookworm main non-free contrib
+ deb http://deb.debian.org/debian/ bookworm main non-free non-free-firmware contrib
- deb-src http://deb.debian.org/debian/ bookworm main non-free contrib
+ deb-src http://deb.debian.org/debian/ bookworm main non-free non-free-firmware contrib

- deb http://security.debian.org/debian-security bookworm-security main non-free contrib
+ deb http://security.debian.org/debian-security bookworm-security main non-free non-free-firmware contrib
- deb-src http://security.debian.org/debian-security bookworm-security main non-free contrib
+ deb-src http://security.debian.org/debian-security bookworm-security main non-free non-free-firmware contrib

# bullseye-updates, to get updates before a point release is made;
# see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports
- deb http://deb.debian.org/debian/ bookworm-updates main non-free contrib
+ deb http://deb.debian.org/debian/ bookworm-updates main non-free non-free-firmware contrib
- deb-src http://deb.debian.org/debian/ bookworm-updates main non-free contrib
+ deb-src http://deb.debian.org/debian/ bookworm-updates main non-free non-free-firmware contrib
```

## 補足
Debianは2022年下半期からnon-freeなファームウェア (典型的にはAMDやNVIDIAのGPUドライバ) をインストーラーで有効化するかどうか議論がなされてきました。その結論として、新たに*non-free-firmware*をnon-freeとは別に**新設**し、その中にnon-freeなファームウェアを移動することにしたようです。

## あとがき

[GNUが言う「自由なディストロ」](https://www.gnu.org/distros/distros.html)は実益とは相容れない。Minecraftだってnouveauだと[まともに動かない](https://gitlab.freedesktop.org/mesa/mesa/-/issues/5871)し[^1]。現実には「完璧な自由」など存在しないといういい例だと思います。

[^1]: `minecraft nouveau: kernel rejected pushbuf`で検索するとForgeのロード画面の絡みで割と出てくる。
Reactでスクロール終了イベントを検知する

# はじめに
Reactで無限スクロールしたい時にスクロール終了イベントを検知したい時があったので、その方法をメモとして残す。
スクロールライブラリはたくさんあるようなので、使用するライブラリを不用意に増やしたくない場合などに参考になれば。

# サンプルプログラム
#### 挙動
ベースのリストを用意してスクロールが終了したタイミングで、表示させるリストにベースのリストを追加し続ける。

#### コード
```index.tsx
import type { SyntheticEvent } from 'react';
import { useEffect, useState } from 'react';

export default function Index() {
  const [list, setList] = useState<string[]>([]);
  const baseList = [
    'Japan',
    'United States',
    'Canada',
    'Mexico',
    'Argentina',
    'Brazil',
    'France',
    'Germany',
    'Italy',
    'Spain',
    'United Kingdom',
    'Russia',
    'China',
    'India',
    'Indonesia',
    'Thailand',
    'Australia',
    'New Zealand',
    'South Africa',
    'Egypt',
    'Nigeria',
    'Kenya',
    'Ethiopia',
    'Ghana',
    'Morocco',
    'Tunisia',
    'Saudi Arabia',
    'Iran',
    'Iraq',
    'Israel',
    'Turkey',
  ];

  /**
   * 高さを計算してスクロールの最後まで来ていたら、リストを追加する
   */
  const addList = (event: SyntheticEvent) => {
    const currentTarget = event.currentTarget;
    if (currentTarget.scrollHeight === currentTarget.scrollTop + currentTarget.clientHeight) {
      setList([...list, ...baseList]);
    }
  };

  useEffect(() => {
    setList(baseList);
  }, []);

  return (
    <main style={{ height: '100vh' }}>
      <ul style={{ overflowY: 'scroll', height: '100%' }} onScroll={addList}>
        {list.map((value, index) => {
          return (
            <li key={value + index} style={{ height: 50 }}>
              {index + ' - ' + value}
            </li>
          );
        })}
      </ul>
    </main>
  );
}
```

#### 説明
スクロールしている要素のonScrollイベントにてスクロール位置を取得することができる。
ここから、高さを計算しスクロールが終了しているかを判断する。終了していればリストを追加する。
スクロールが終了する前に追加リストを取得したい場合などは、高さの計算時にマージンを追加して対応する。

#### デモ
![encyufhgo6yXFEO0RkgG1679291703-1679291717.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2639110/dc6ea895-5cb8-c455-2082-8a3dec166970.gif)

# 参考
https://qiita.com/teshima/items/1ef13b6aa01e7b95c996
slack bot x chatgpt x GAS

備忘録向け。
botをメンションして使いたかったので、zapierじゃなくこちらでやってみた。

slack app作って、ポチポチする必要あり。

GASは下記

```
function doPost(e)
{
  // slack appsのEvent Subscriptionsのchallenge。同期する時に利用。
  var params = JSON.parse(e.postData.getDataAsString());
  if('challenge' in params)
  {
    return ContentService.createTextOutput(params.challenge);
  }

  // textを取得
  var textSlack = params.event.text.substr(0, params.event.text.length);

  // chatGPTに問い合わせ
  var resultStr = getChatGptMessage(textSlack);
　var contents = `${resultStr}`;

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : JSON.stringify(
      {
        "text" : contents,
        link_names: 1 // ユーザー名やリンクを変換してくれる
      }
    )
  };
  // slack連携
  // incoming webhookを入れる
  UrlFetchApp.fetch("https://hooks.slack.com/services/XXXXXX", options);
}

// ChatGPTのAPIを呼び出し応答を取得する
// openai api keyはGUIでスクリプトプロパティに入れておく
function getChatGptMessage(message) {
  var uri = 'https://api.openai.com/v1/chat/completions';
  const apiKey = PropertiesService.getScriptProperties().getProperty('openai_api_key');
  var headers = {
    'Authorization': 'Bearer ' + apiKey,
    'Content-type': 'application/json',
    'X-Slack-No-Retry': 1
  };
  var options = {
    'muteHttpExceptions' : true,
    'headers': headers, 
    'method': 'POST',
    'payload': JSON.stringify({
      "model": "gpt-3.5-turbo",
      "messages": [{ "role": "user", "content": message }]
    })
  };
  try {
      const response = UrlFetchApp.fetch(uri, options);
      var json=JSON.parse(response.getContentText());
      return json["choices"][0]["message"]["content"];
  } catch(e) {
    console.log('error');
  }
}
```

あと、上記のgasをデプロイしたら、発行されたリンクを、slack側の方で、「event subscription」でrequest urlに登録しておく。
あと、同じく「Subscribe to bot events」で、`app_mention`を追加しておく。

ここまでで、botにメンションすると、その発言を読み取って、chatgptが返答を返してくれる。

Consとしては、Incoming webhookを設定する際に、このbotはどこに投稿するか、チャンネルを聞かれる（チャンネル権限的な）

botを好きなチャンネルにinvして、そこでも返す、みたいに、channel情報を送って、そこに返答を返すには、Bot User OAuth Tokenを発行してやる必要がありそう。
テキストファイルからN行おきに行を抽出するには

1行目、6行目、11行目、、、のように5行おきに出力するには

```bash
$ sed -ne 1~5p < data.txt
$ awk NR%5==1 < data.txt
$ perl -nle '$.%5==1 && print' < data.txt
$ ruby -nle '$.%5==1 && print' < data.txt
```

5行目、10行目、15行目、、、のように5行おきに出力するには

```bash
$ sed -ne 0~5p < data.txt
$ awk NR%5==0 < data.txt
$ perl -nle '$.%5==0 && print' < data.txt
$ ruby -nle '$.%5==0 && print' < data.txt
```

これだけ見ると、PerlとRubyは親戚に見える。
Connect REST API エンドポイント /connect/notifications を使用して空の通知リストを受け取りました。


# Connect REST API エンドポイント /connect/notifications を使用して空の通知リストを受け取りました。

+ [how to call Connect Rest API endpoint from Workbench](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000OqjGZSAZ)
+ [I receive an empty list of notifications using the Connect REST API endpoint: /connect/notifications](https://salesforce.stackexchange.com/questions/355621/i-receive-an-empty-list-of-notifications-using-the-connect-rest-api-endpoint-c)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/18579816-90a1-0862-d3d3-501078422e88.png)


> The API uses the context of the requesting connected app and returns notifications for the appropriate types.

Since you seem to accessing the API using rest explorer which uses the 'Workbench' connected app in SF to access Salesforce as per predefined policies. Since this app does not have the correct context of fetching the notifications data, hence you did not receive the necessary data. In order to verify your callout response you can trigger the callout from execute anonymous window using APEX HTTP request and response classes.


> API は、要求元の接続アプリケーションのコンテキストを使用して、適切なタイプの通知を返します

事前定義されたポリシーに従って Salesforce にアクセスするために SF で「Workbench」接続アプリを使用するレスト エクスプローラーを使用して API にアクセスしているようです。このアプリには通知データを取得するための正しいコンテキストがないため、必要なデータを受け取りませんでした。コールアウト応答を確認するために、APEX HTTP 要求および応答クラスを使用して、匿名ウィンドウの実行からコールアウトをトリガーできます。
zapier x chatgpt連携

備忘録に。

zapierで、chatgpt連携する。

形としては、slack -> chagpt -> slack。

1. slackのeventで、new message posted to channelで発火
2. zapierのchatgpt連携の方に、api key入れて、slack messageをgptに送る
3. gptから返ってきたメッセージをslackへpost

割と一瞬でできる。
が、botをメンションで発火させたり、特定チャンネル以外で利用するなどの自由度は無さそう。
cloud9から接続して、herokuのレコードを直接SQL書いて弄る

毎回なんだっけ？とググるのでメモ。

まずログイン
```
heroku login -i 
```

コンソールに接続。
```
heroku pg:psql -a app-name
```

コンソールから出る時
```
\q
exit
```

---
会議でファシリテータをする時に気をつけていること６選

# はじめに
最近、チームのミーティングでファシリテータ（以下ファシリ）を務めることが何かと増えてきました。
そんな中で、ミーティングの流れを良くするために気をつけていることを、アジャイルコーチに教わったことに自己流風味を付け足して書いていきます。

前提として、6~7人の会議をする場合で考えています。

# 1. 相槌は声に出す
１つ目は、ファシリがというより、ミーティングに参加する人はみんな心掛けると良さそうな観点です。
自分が話し手側の時に、誰か１人でも聞いている雰囲気を醸し出してくれていると話しやすいなあと思った経験からきています。
大事なのは、「うんうん」でも「ほー」でも「なるほど」でも、何でもいいので声を出し続けて、話し続けて良いよ、ちゃんと聞いてるよとアピールすることです。
できれば目を見たり顔を合わせるとより良くなるらしいですが、こちらは個人的に得意ではないです。

余談ですが、話し手は緊張や気張りから物理的に視界が狭くなることが多いので、無言で赤べこ状態（首振りマシーン）になっても、相槌を打っている事は伝わりにくいなあと、ファシリをするようになって気づきました。

# 2. 尋ねる
話し手が何かを言い終わった後に、曖昧に思ったりもっと聞きたいなと思った点をどんどん聞いていきましょう。
ファシリとは直接関係ありませんが、「なぜ」を５回くらい繰り返すと良い感じになるとどこかで誰かが言っていた気がします。
流石にそこまでやらないとしても、そうやって話題の解像度を上げていって、チームで共有する際の認識を出来るだけ統一することが目的です。

尋ねる場面でで個人的によく使う質問デッキを列挙しておきます。
- ５W1Hの中の「いつ（when）」「何（what）」「どうやって（how）」あたり
- ポジティブな話題で「何でうまくいったのか」
- ネガティブな話題で「何が難しかった」「次やるときはどうすればうまくいくか」
- 変わり種で「それができたら何が嬉しいか」（ゴールや実験することを決める時に使いやすい）

# 3. 話を振り続ける
ディベートなどがその代表的な手法ですが、物事に対して複数の角度から焦点を当ててみる（＝複数人に話を聞いてみる）と、１方向から考える時よりもメリット・デメリットなどが見えやすくなることが多いです。
また、ファシリがいるミーティングは、油断すると話し手とファシリの会話だけで終わってしまうし、参加者全員が自発的に発言できるわけではないことも多いので、それを何とかしようとする下心の賜物だったりもします。

当事者がある程度話し切ったように見えるタイミングで、ツッコミでも質問でも意見でも何でも良いので、関係者にも話を振って別角度の何かを貰いましょう。

あまりにも似たような意見しか出ない ＋ その話題にあまり絡まない人がミーティングにいる時は、荒技ですが その人に話を振って考えてもらうのもありだと思っています。
ただ、やりすぎるとその人をしんどくさせてしまうので、用法用量には注意するようにしています。

# 4. 打ち切る
ある話題について、１人が話し続けたり、限られた人だけが会話している状態になったら、心苦しいですがあまり遠慮はせずにぶった斬ります。
こういう場面では、会話に混ざっている人以外の意識が浮遊状態になっている場合が多いからです。
その状態で何か決まったとしても、実感が伴わないのですぐに忘れ去られがちだったりします。

打ち切り方として使えるのは
- いちにのえいやで一旦止める
- 重要かつちゃんと話し合う方が良さそうな場合、このミーティング後にさらに時間をとりましょうと先送りにする
- あらかじめタイマーをセットしておき（話題ごとに３分・５分・７分など）、時間が来たことを理由に止める

あたりです。

ただ、遮られる方もあまり良い気持ちはしないと思うので、どう止めれば嫌な気持ちにさせずに次に進めるかは永遠の課題です。
今のところ、２つ目と３つ目をミックスして使うと、話し手にもその他にも良好な雰囲気の状態で次に進めることが多いので、個人的ベスプラだと思っています。

# 5. 自分の意見は極力言わない・通さない
なんとなく、ファシリはよく話す忍び（？）のようなイメージなので、ひたすら場を回すことに徹することが大事だと思っています。
話題の中でファシリ自身を中心に置いてしまうと、その前後を客観的に考えることが難しくなるからです。

ただ、もちろん完全にファシリ自身の意見を殺してしまうと良くない場面もあります。
例えば、私は普段スクラムイベントでファシリをしますが、スクラムイベントで決まったことは自分に大きく影響するので、そこで何も話さないのは流石に悪手です。
そこのバランスは少しずつ調整していく必要がありますが、自分の意見を言わない・通さないスタンスは今後も変えないつもりです。

余談ですが、もし究極のファシリテーションがあるとすれば、ファシリ自身は会議の結果にほぼ影響されない第三者であるけれど、その会議の流れ・目的はわかっている状態だろうなと考えています。

# 6. 具体的な行動に議論を持っていく
これは最近気がついたことなので、あまり深いことは書けませんが、、、

人によってあまりにも考え方がばらつく話題の場合、いろんな人に話を振った結果、議論が発散しすぎて「で、なんなの？」となる場面が時々あります。

そういう時は、「具体的にどうするのが良いのか」の観点で話を持っていくと、肌感ですが、話題に対し何の結果も出ないということが起こりにくい気がします。

# おわりに
何かと話題の尽きないChatGPTくんにも聞いてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605286/531b764c-ce0d-1361-d157-0919a43540e0.png)

ChatGPTくんも言っているように、記事で挙げたこと以外にも、できることは山ほどありそうです。
今度、勉強がてらに１冊ファシリ関連の本を読んでみます。
Googleデジタルマーケティング＆Eコマース：倫理的なメールの書き方

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/bc50df6f-2af4-4c58-96fb-829e0752d0af.png" width="800">

# 倫理的なメール・マーケティング

キャンペーンを成功させるために重要なことは、倫理的なメール・マーケティングを実施することです。倫理的なメール・マーケティングとは、あなたのビジネスのモラルを維持しながら、読者に真の価値をもたらす戦略を立てることを意味します。倫理的なメールの書き方には様々な配慮が必要ですが、そのひとつが「言葉の選び方」です。 

以下に、適切な言葉遣いで倫理的なメール・マーケティングを行う方法について説明します。

### <font color="MediumBlue">倫理的な言葉を使う</font>

メールマーケティング担当者として、使用する言葉はコミュニケーションの受け取られ方に影響します。

倫理的なマーケティング用語に従わないメールは、スパムフィルターに引っかかり、顧客のメールボックスに届かない可能性があります。たとえ届いたとしても、読者にネガティブな感情を抱かせ、あなたの会社やその手法に不信感を抱かせる可能性があります。これは、あなたのブランドの声と誠実さを危険にさらす可能性があります。

あなたの言葉が操作的、誇張的、非倫理的、絶望的であると思われる場合、あなたのブランドの声と誠実さが危険にさらされる可能性があるのです。

### <font color="MediumBlue">信頼できる、誠実な言葉を使う</font>

読者は、常にあなたを信頼できると感じているはずです。ブランドの声で本物の言葉を使うことで、読者との信頼関係が構築されます。会話形式で、顧客が心地よいと感じるようなフレーズを選ぶことを心がけましょう。

時間的制約のある言葉やフレーズは除外することを検討しましょう。

- "URGENT: Act Now" のような表現よりも
- "10% off inside"

のようなシンプルな表現のほうが、読者を惹きつけることができます。

スパムフィルターに引っかかる言葉の例としては、以下のようなものがあります。

- 今すぐ行動する(Act now）
- 今すぐ申し込む（Apply now)
- 急募(Urgent)
- 独占契約(Exclusive deal)
- 重要なお知らせ(Important information regarding)
- 残りわずか(This won’t last)

### <font color="MediumBlue">提供するものを正直に伝える</font>

オファーが何であるかを正確に示すフレーズや言葉を選びましょう。

- セール商品がさらに50％オフ

であれば、その旨を明記しましょう。視聴者は、あなたが全体像を伝えていないとは思いたくないのです。ですから、あまりに大げさな表現を使うと、読者に伝わらない可能性があります。また、もしメールが届いたとしても、相手に「騙された」と思われるようなことは避けたいものです。

大げさなフレーズの例としては、以下のようなものがあります。

- 最高のオファー(Best offer ever)
- 素晴らしい取引(Fantastic deal)
- フリーマネー(Free money)
- キャッチフレーズなし(No catch)
- 手数料なし(No fees)

これらのフレーズは、お客様が騙されたと感じたり、誤解したりしないように、一般的に避けるべきフレーズです。

### <font color="MediumBlue">付加価値のある言葉を使う</font>

何らかの価値を与える言葉を使うことで、読者がメールを開き、興味を持ってくれる理由を作ることができます。読者は、あなたがメールを開くよう、あるいは購入するよう懇願しているように感じたくはないでしょう。

- 私たちは、あなたがこれを好きだと思う(We think you'll like this)
-  あなたのことを思って作りました(We made this with you in mind)

などのフレーズを使うと、読者はこのメールは自分のためのものであり、楽しんでくれるはずだと思い起こすことができるのです。

下記のフレーズは避けましょう。

- ご一読ください（Please read）
- あなたの力が必要です（We need your help）
- ご覧ください（You need to see this）
Xserver VPSでhttps化【SSL化】

# certbotのインストール

```bash
# Ubuntu/Debian系
sudo apt install -y certbot

# CentOS/AlmaLinux/RockyLinux系
sudo dnf install -y certbot
```

# 証明書の取得
独自ドメインを使用する場合は、AレコードにVPSのIPアドレスを設定し、`$HOSTNAME.static.xvps.ne.jp`を独自ドメインに置き換えてください

```bash
# XAMPPを使用する場合
sudo certbot certonly --webroot -w /opt/lampp/htdocs --register-unsafely-without-email --agree-tos --non-interactive -d $HOSTNAME.static.xvps.ne.jp

# XAMPPを使用しない場合
sudo certbot certonly --standalone --register-unsafely-without-email --agree-tos --non-interactive -d $HOSTNAME.static.xvps.ne.jp
```

# 証明書を設置し、Apacheを再起動

```bash
sudo cp /etc/letsencrypt/live/$HOSTNAME.static.xvps.ne.jp/fullchain.pem /opt/lampp/etc/ssl.crt/server.crt
sudo cp /etc/letsencrypt/live/$HOSTNAME.static.xvps.ne.jp/privkey.pem /opt/lampp/etc/ssl.key/server.key
sudo /opt/lampp/lampp reloadapache
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127414/38c4d1a6-cb10-411a-9ff2-74a1f3eaf322.png)
TypeScript5で追加されたconst type parametersを使ってみる

# はじめに
先日TypeScriptの最新バージョンが5に変更されました。リリースノートは[こちら](https://github.com/microsoft/TypeScript/releases)で、変更や修正の詳細は[こちらの記事](https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/)に記載されています。
この記事ではTypeScript5で追加された`const type parameters`という機能について解説します。

# `const type parameters`とは
`const type parameters`はTypeScriptが型推論を行うときに一般的な型ではなく、より具体的な型に推論させるような機能です。
`string`のような型ではなく`'hello'`のような型、`readonly number[]`ではなく`[1, 2, 3]`のような型に推論させます。
## 例
例としてオブジェクトの一部から値を取り出すようなケースを考えます。
```ts
const getLangs = <T extends { langs: readonly string[] }>(
  args: T,
): T['langs'] => {
  return args.langs;
};

const langs = getLangs({ langs: ['ja', 'en', 'fr'] });
```
`langs`の型は`readonly string[]`になります。
関数の戻り値である`langs`の型を代入したオブジェクトに応じて`readonly ['ja', 'en', 'fr']`のようにしたいとします。
そのためには、関数の定義方法を変更するのではなく呼び出すたびに`const assertion`を用いて記述することで達成されます。
```ts
const langs = getLangs({ langs: ['ja', 'en', 'fr'] as const });
```
他にも関数側でこの挙動を実現するために、以下のように型をこねくり回して記述できます。
```ts
type Narrowable = string | number | boolean | symbol | object | undefined | void | null | {};
const getLangs = <N extends Narrowable, const T extends (N | T)[] | []>(
  args: { langs: T },
): T => {
  return args.langs;
};

const langs = getLangs({ langs: ['ja', 'en', 'fr'] });
```
(他にも方法があるかもしれませんが)このようにこれまでは、実現したい関数の挙動を実現するために呼び出す側で記法の矯正を行う保守性に優れない実装になったり、複雑で可読性の低いコードになってしまいました。

`const type parameters`はこの挙動を関数側で簡単に実現可能にする機能です。
```ts
const getLangs = <const T extends { langs: readonly string[] }>(
  args: T,
): T['langs'] => {
  return args.langs;
};

const langs = getLangs({ langs: ['ja', 'en', 'fr'] });
```
行った変更は型変数の宣言前に新たな修飾子`const`を配置した点です。これだけで`langs`の型は`readonly ['ja', 'en', 'fr']`になります。

## 注意点
呼び出したパラメータに直接値を渡さなければ具体的な方に推論されないことに注意してください。
```ts
const obj = { langs: ['ja', 'en', 'fr'] };
const langs = getLangs(obj);
```
`obj`を作成した時点で`obj`の型が`{ langs: string[] }`に推論されてしまっていることが原因です。
直接代入するか、
```ts
const obj = { langs: ['ja', 'en', 'fr'] as const };
```
推論される型が`readonly ['ja', 'en', 'fr']`となるように`obj`を作成してください。
NewRelicのTips 個人備忘録

# NewRelicのTips 個人備忘録
## 概要
- 仕事で使っているNewRelicのTipsを個人メモから転機

## NRQL

### capture
- データの値を正規表現で有用なデータとして抜き出すとても便利な関数
- FACETやSELECT、WITH ASなどで利用できる
- [NRQLを活用して意味のあるデータを抽出するために - capture関数](https://newrelic.com/jp/blog/how-to-relic/nrql-regrex-capture)
- https://docs.newrelic.com/docs/query-your-data/nrql-new-relic-query-language/get-started/nrql-syntax-clauses-functions/#func-capture

#### 例
- URLの最初の'/'まででFACET
```
FACET capture(uri, r'(?P<path>.*)/.*')
```
- Logのmessageから正規表現で抜き出した複数の値を使う
```
FROM Log WITH capture(message, POST to carts: (?P<URL>.*) body: {"itemId":"(?P<UUID>.*)","unitPrice":(?P<unitPrice>.*)}.*') AS (URL,UUID, unitPrice) ...
```

### LIMIT制限
- NQRLでは暗黙的なLIMITの制限が存在する
- FACET句のLIMITはデフォルト 10
- SELECT * クエリの場合はデフォルト １００
- LIMIT で設定できる最大値は 2000 。 LIMIT MAX = LIMIT 2000
- https://docs.newrelic.com/jp/docs/query-your-data/nrql-new-relic-query-language/get-started/nrql-syntax-clauses-functions/#sel-limit

### TIMESERIES句
- 指定期間単位の時系列としてデータを返す
- 簡単にいうとグラフ化するために指定する
- 時間間隔指定はしたほうが良い、求める値にもよるが最大値や95%ileの値などは集計間隔が変わると値が変わるため
  - 例えば時間間隔を未指定(AUTO)だと、表示するチャートを1時間から1日に変えた場合間隔が1分から30分に変わる
  - グラフがレスポンス時間の95%ileだった場合、同じ時間でも値が変わる
- 時間間隔のデフォルトは "AUTO" 表示する時間に合わせて適切に設定される。
  - 1時間のチャート : 1分間隔
  - 1日のチャート : 30分間隔
  - 1週間のチャート : 6時間間隔
- ”MAX"を設定すると、間隔数を最大にする = 間隔が細かく、短く設定される
  - 1日のチャート : 4分間隔
【Unity】UIElementsでListViewを使いたい

UIElementsでListViewを使うとき、はじめの一歩が難しかったので備忘録

# 環境
Unity 2022.1.10f1

# 
ListViewのmakeItem, bindItem, itemSourceを設定していく

```csharp
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class UIElementsEditorWindow : EditorWindow
{
   [SerializeField] VisualTreeAsset rootVisualTreeAsset;
   [SerializeField] VisualTreeAsset listViewContent;

   [MenuItem("Tools/UIElements Editor Window")]
   static void ShowWindow()
   {
       GetWindow<UIElementsEditorWindow>("UIElements").Show();
   }
   
   struct Context
   {
       public int ID;
       public string Name;
   }

   void CreateGUI()
   {
       rootVisualTreeAsset.CloneTree(rootVisualElement);
       var listView = rootVisualElement.Q<ListView>();

       List<Context> contexts = new ()
       {
           new Context { ID = 1, Name = "太郎" },
           new Context { ID = 2, Name = "花子" },
           new Context { ID = 3, Name = "ジョン" }
       };
       
       listView.makeItem = () => listViewContent.Instantiate();

       listView.bindItem = (item, index) =>
       {
           var context = contexts[index];
           
           var idLabel = item.Q<Label>("IDLabel");
           var nameLabel = item.Q<Label>("NameLabel");

           idLabel.text = $"ID:{context.ID}";
           nameLabel.text = $"Name:{context.Name}";
       };

       listView.itemsSource = contexts;
   }
}

```

選択したものを取得したい時はおじいちゃんのBaseVerticalCollectionViewを見る(selectで検索)


# 見るもの
https://docs.unity3d.com/ScriptReference/UIElements.ListView.html
https://docs.google.com/presentation/d/1Vc1b-fUe1AvGlkey1Z0OP5M2A7ZXEpm7G3HnuQxPpAQ/edit#slide=id.g1b51ec6c54d_0_285
https://light11.hatenadiary.com/entry/2022/09/06/194132
https://light11.hatenadiary.com/entry/2020/03/08/202458
RailsにおけるGitHub Copilot活用事例

## 本記事について

![20230227091824.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/4a5bbead-fb61-c199-1d86-456c720fda4a.png)

GitHub Copilotを2ヶ月使用し、その便利さを体感しました。
本記事では便利さを感じた活用事例を紹介します。 (本記事で示すコードは全て本記事のために作った適当なサンプルです。)

■ 書く

- 活用事例
- 使用感

■ 書かない

- 導入方法
- 他ツールとの比較
- Rails以外での使用感
- Copilot for Businessについて

## 対象

- Railsエンジニアの方 (※GitHub CopilotはRuby以外の言語でも活用できます)
- AIを用いた開発に興味のある方
- 使ったことないけど、自分で書いたほうが早いだろうと思っている方(過去の私)

## 環境
Mac (M1 Pro)
Visual Studio Code
Copilot for Individuals

## GitHub Copilotとは
https://github.com/features/copilot

一言でいうと「スーパー予測変換」です。

「こういうコード書きたいんですよね？」っていう候補を提示してくれます。

公式ページの「Your AI pair programmer」という言葉通り、ペアプロしてる体験に近いです。

実際どんなときに便利だと感じたのかを以下に示していきます。

## ドキュメント
構文の類に強い。

### YARD

![img1_yard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/69ea98b7-b24c-bb95-a724-03f9890fb279.png)

透明(グレー)の部分がGitHub Copilotが提案している部分。

`# @`ぐらいで書いてくれる。型も予想して書いてくれる。

### OpenAPI

![img2_openapi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/9e14ec72-fc3e-454f-2765-1e1c0e5ae1c6.png)

## ActiveRecord
![img3_active_record.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/cee361c1-11e1-89f5-3b07-f1bb65520a3f.png)

1. コメントでクエリの内容書く
2. メソッド名と引数書く

と中身はGitHub Copilotが書いてくれる。それを修正する。とても楽。

## Migration
![img4_migration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/eb897914-1341-b7fd-d512-81dadbcfee93.png)

コメントで詳細書いておくと、クラス名とコメントから予想して中身を書いてくれる。

## Test

![img5_1_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/1bf2c3c5-3eb6-b1e6-4949-f34f27ff5d25.png)
なんのテストなのか


![img5_2_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/e0965b11-2f60-e152-a814-56ea4f943ea6.png)
必要なデータ

![img5_3_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/bf7e6b19-5e28-174d-3c32-ef2d67462bc6.png)
期待値

ちょっと入力して採用ってことが多い。

特にデータ作るところが楽で良い。

## 使用感

とても便利で強くおすすめできます。

もうAIなしの開発生活には戻れません。

■ 良かったこと

- 提案されたコードを採用するという行為はあまり頭を使わないため疲れにくい。頭を使うべきところに集中できる。
- 候補を出す速度がとても早い。打ってる途中に出てくることもあるほどに早い。
- 使ったほうが実装が早い。
- 体感全くエディタの動作が重くならない。


■ 良くなかったこと

![hash.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/c6e3708d-425f-0321-70e8-1ab5cb7fb572.png)

`c = { a:, b: }`

## おわりに

2022/3時点 無料期間2ヶ月あるのでぜひ試してみてください。
Google Cloud でデフォルトの組織ロールを放置すると起きること

こんにちは、京セラコミュニケーションシステム 石関 (@kccs_daisuke-ishizeki）です。

以前[こちらの記事](https://qiita.com/kccs_daisuke-ishizeki/items/171b637aa4b52a5626d1)で 企業が Google Cloud を使い始める際は、Google Workspace(または Cloud Identity) を利用して Google アカウントを作成・管理することが推奨されている旨ご紹介しました。

この記事では組織で Google Cloud を使い始めた際に発生しやすい課題とその対処法についてご紹介します。

:::note warn
記事中の`hoge.com`は架空の組織（ドメイン）です。
:::

## この記事の対象者

- Google Cloud を使い始めた方
- 会社や部門のIT管理者

## デフォルトの組織ロールとは

まず、デフォルトの組織ロールとは？ですが赤枠で囲った IAM 設定を指します。
![IAM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/00813969-78f8-e070-efee-3cac7911d43e.png)

:::note warn
ポイントはプロジェクトの IAM ではなく、**組織**に対する IAM 設定である点です。
:::

対象画面には以下の操作で辿り着けます。
1. [Google Cloud Console](https://console.cloud.google.com/) からページ上部にある [組織の選択] プルダウンリストで組織（この例では`hoge.com`）を選択
2. ナビゲーションメニューより [IAM と管理] - [IAM] を開く

## 放置するとどうなるか

こうなります（断言）。
![こうなる_プロジェクト.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/ec4152a9-d7cc-e722-9bb3-77511be09a86.jpeg)

無数の **My First Project** が生まれる😇

これ以外のプロジェクト名がついたプロジェクトも多数作成され、そのほとんどが使われていないプロジェクトと推測できる状況かと思います。

こうなると不要なプロジェクトをシャットダウン（削除）して整理したくなりますが、プロジェクトの利用者に確認したり、シャットダウンを依頼することになるため、ちょっと面倒です。

![こうなる_請求先アカウント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/633b0e3d-2734-fa21-f045-684ddd00a5df.png)

無数の **請求先アカウント** が生まれる😇

おそらくほとんどが、Google Cloud を無料トライアルした際に作成された、個人のクレジットカードが登録された請求先アカウントです。先ほどの **My First Project** などのプロジェクトにリンクしているものと想像できます。

これ自体が良いのかどうかは会社のポリシーによってさまざまだと思いますが、個々人が個別に経費精算する状況が望ましくないケースもあるかと思います。

:::note warn
組織のすべての請求先アカウントを list するには、組織リソースに対し請求先アカウント閲覧者などのロールが割り当てられている必要があります。
組織の管理者ロールのみでは組織の請求先アカウントを list できませんのでご注意ください。
:::

## どうしてこうなるの？

デフォルトで組織リソースに対し、組織（ドメイン）のすべてのユーザーに権限があり、自由に作成できるためです。

ドキュメント[^1]に以下の記載があります。
> デフォルトでは、組織リソースを作成すると、ドメインのすべてのユーザーに請求先アカウント作成者とプロジェクト作成者のロールが付与されます。
> このデフォルトのロールは、ユーザーがすぐに Google Cloud の使用を開始できるようにするためのものであり、組織リソースの通常運用での使用を意図したものではありません。

文字だけではイメージしにくいかなと思うので、具体例で示します。
![IAM2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/8cac7d08-016f-0dfd-3e08-053e9fb174a9.png)

ポイントは左下赤丸の **hoge.com** となっている箇所です。
これが**組織（ドメイン）のすべてのユーザー**を表しています。タイプのアイコンも`ドメイン`になってますね。

この例では（イメージ図記載のとおりですが）以下の設定になっています。

- `hoge.com` というリソースに対し
- `hoge.com （ドメイン）すべてのユーザー`に
- `プロジェクト作成者`、`請求先アカウント作成者`ロールを割り当てる

## どうすれば良いか

やることは単純で、

- 組織リソースに対し、組織（ドメイン）に割り当てられているデフォルトロール（`プロジェクト作成者`、`請求先アカウント作成者`）を削除する

をすれば先ほどの状況は回避できます。

ただ、これだけでは利用したい人がセルフでプロジェクトを作成できなくなるため、会社のポリシーに合わせどのように利用させるか検討が必要です。

以下、設定の一例です。

- 例：管理部門がプロジェクトの作成を担うケース
  - 管理部門メンバーの Google アカウントなどのプリンシパル[^2]に
    - 組織リソースに対し、`プロジェクト作成者`を割り当てる
    - プロジェクトをリンクさせる請求先アカウントに対し、`請求先アカウントユーザー`を割り当てる
- 例：プロジェクトの作成を利用者に委譲するケース
  - 対象メンバーが所属する Google グループなどのプリンシパル[^2]に
    - 特定のフォルダリソースに対し、`プロジェクト作成者`を割り当てる
    - プロジェクトをリンクさせる請求先アカウントに対し、`請求先アカウントユーザー`を割り当てる

Cloud Build などからプロジェクトの作成を行いたい場合は、上記プリンシパルをサービスアカウントに置き換えることで実現できます。

## 参考

[^1]: https://cloud.google.com/resource-manager/docs/default-access-control?hl=ja
[^2]: https://cloud.google.com/iam/docs/overview?hl=ja#concepts_related_identity
Vue3デビューcomposition APIとoptions APIについて簡単に比較してみた

# はじめに

Vue2 の経験がある著者が Vue3 の書き方で大量のはてなマークを量産したためまとめる。

Vue2 の書き方と Vue3 の書き方の差について理解の一助となれば幸いです。

# Options API について

まずは Vue2 の書き方の Options API のサンプルを記述してみます。

カウントアップのアプリの script タグ内を考えてみましょう。

```vue
<script>
export default {
  data: () => {
    return {
      count: 0,
    };
  },

  methods: {
    countUp() {
      this.count++;
    },
    reset() {
      this.count = 0;
    },
  },
};
</script>
```

default 内では data メソッドでリアクティブな値、methods プロパティでリアクティブな値にアクセスするメソッドを記述します。

この問題としては **リアクティブな値にアクセスするためには this によるアクセスを必須となり、View と分離ができない** という点があります。

それ故に一つのコンポーネントファイルの巨大化、共通処理を各コンポーネントに記述するといった冗長化が発生しがちです。

# 救世主 Composition API について

そこで登場したのが Vue3 の書き方の Composition API です。サンプルを記述してみます。

```js:define.js
import { ref } from "vue";

export const useCounter = () => {
  const count = ref(0);

  const addCounter = () => {
    count.value++;
  };
  const resetCounter = () => {
    count.value = 0;
  };

  return {
    count,
    addCounter,
    resetCounter,
  };
};
```

上記のようにステートフルなロジックをカプセル化することを Composable と呼び、Composable は import を経由して呼び出しが可能です。

```vue:use.vue
<script>
  import { ref } from "difine";

  const { count, addCounter, resetCounter } = useCounter()
</script>
```

呼び出す側では import してプロパティとメソッドにアクセス可能になります。

# Options API と Composition API の比較

## data

```js:optionsApi
data: () => {
  return {
    count: 0
  };
}
```

```js:compositionApi
import { ref } from "vue"

const count = ref(0);
```

Options API では data メソッドで定義していましたが、Composition API では ref（もしくは reactive）関数で定義します。

## methods

```js:optionsApi
methods: addCounter() {
  this.count++;
}
```

```js:compositionApi
const addCounter = () => {
  count.value++;
}
```

Options API では methods プロパティ内に定義していましたが、Composition API では通常の script ブロック内で関数定義することで呼び出しが可能になります。

リアクティブな値の変更は value プロパティを利用します。

# まとめ

Composition API を利用することでロジックの分離と再利用が容易になりました。

とはいえ銀色の弾丸ではなくこれまでの Options API の方が View とセットでわかりやすい場合もあります。

作りたいものからどちらを選ぶかは別途検討する必要があります。

（個人的には自由度の高いもので十分に抽象化されている設計をできると気持ち良いので Composition API を推します。）


# 参考ページ
[Composition APIとは？Options APIとの違いを徹底解剖【Vue公式パートナーが解説】](https://jp.code-dict.com/media/vue/5876/)
１．技育祭2023春に参加しました

 # はじめに
　本記事では、技育祭2023春に参加した感想やそこで得た知識をまとめます。
　個人的な記録として書くため主観的な内容となります。
 # 技育祭とは
　日本最大の学生向けテックカンファレンスです。技育とGEEKをかけているらしい。
 # 感想と得た知識
　ここからは技育祭に参加した感想やそこで得た知識を書いていきます。
 ## 感想
　現役のエンジニアやCTOの方々からリアルな話が聞けてかなり参考になった。
　学生向けということもあり、エンジニアリングの専門的な話だけでなく、
　就活についてや新卒採用後の話、それぞれの企業についてなど幅広い内容だった。
 ## 得た知識
 ### ゲーム開発について
 - 特別な知識は必要ない
 - とにかく作る
 ### キャリアについて
 - エンジニアのキャリアは最初が肝心
 - 細分化されたエンジニアのキャリアの中でどの方向に行きたいのかで選ぶ企業が変わる
 ### 就活について
 - SNSが履歴書、GitHubが経歴書になる
 ### エンジニアとして
 - 知識の深さ・幅が重要
 - どこか一つでも突出した能力を身に着ける
 - PDCAを意識する
 # まとめ
　様々なキャリアを持つエンジニアの方々の話が聞けるので、
　参加はできるだけしたほうがいいです。
　Zoomのコメントを見ると、ほかのエンジニアを目指す学生の状況が
　薄っすらと分かってモチベーションにつながります。
　初めての参加でしたが、オンラインということもあり気楽に参加できて楽しかったです。
QNAPのNASでlessコマンドを使う　vimで日本語も使う

QNAPのNAS TS-453Dを使っています。
sshでログインしてあれこれ作業する時に、vimは使えてもlessコマンドがありません。
catで代用するには大きなファイルは、画面がいっぱいになるし、vimで代用すればいいのかもしれませんが（最後をq!にすればいいだけだから）、lessコマンドをインストールしてみました。

思わぬ効果として、vimで日本語も使えるようになりました。

・「App Center」を開き，右上の「設定（歯車マーク）」をクリック．「アプリリポジトリ」タブを選択
![スクリーンショット 2023-03-20 11.42.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45016/14cf3e64-9b41-4d98-8bf0-8c30e365f480.png)

・「追加」をクリックしURLに「OPKG Store」の URL「 https://www.qnapclub.eu/en/repo.xml 」を入力．
　名前は「OPKG Store」とした

・OKをクリックすると、「OPKG Store」が追加されている
![スクリーンショット 2023-03-20 11.41.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45016/5c91ca7c-9e50-bc45-a3a2-bbd93e578ca1.png)

・検索で「Entware」を検索して、Entware-std 1.03をインストール

・これでopkgコマンドがインストールされて、lessコマンドがインストールできるのだが、パスが通っていないので、この時点はフルパスを指定した
```
$ sudo /share/CACHEDEV1_DATA/.qpkg/Entware/bin/opkg install less
```
・less コマンドへのパスを.profileに追加
```
$ cat .profile
PATH=$PATH:/share/CACHEDEV1_DATA/.qpkg/MariaDB10/bin:~/:/share/CACHEDEV1_DATA/.qpkg/Entware/bin
```
・ここまで実行して日本語の問題も解決できないかと、opkgコマンドでvimをインストール
```
$ sudo  /opt/bin/opkg install vim-full
```
・vimを起動すると、メッセージがでたので、.vimrcを作成
```
$ touch .vimrc
```

・あとは元々のvimへのシンボリックリンクを削除して、新たにシンボリックリンクを作成した
```
$ ls -lh /bin/vi
lrwxrwxrwx 1 admin administrators 20 2023-03-20 10:07 /bin/vi -> /mnt/ext/opt/vim/vim*
$ ls -lh /bin/vim
lrwxrwxrwx 1 admin administrators 20 2023-03-20 10:07 /bin/vim -> /mnt/ext/opt/vim/vim*

$ sudo rm /bin/vi 
$ sudo rm /bin/vim
$ sudo ln -s /opt/bin/vim /bin/vi
$ sudo ln -s /opt/bin/vim /bin/vim
$ vi README 
$ vi test
$ cat test
テスト
```

* * *
##### SynologyのNASでの方法
QNAPでの方法は理解して実施したが同じ方法がSynologyではできなかった
（追加するリポジトリは「https : //www.cphub.net」らしいが、この時点で指定してもエラーになった）
2025/03/17追記
SynologyのNASでの方法は別記事、[SynologyのNASでlessコマンドを使えるようにしてみた]にまとめました。当初書いた方法では、/optにファイルがあるケースもあり、どんな場合にも使えるか方法とは思えなくなっていました。(https://qiita.com/taro373/items/9ff024acbef1e5b1f772)

= = = = =　（この下が当初の方法です）　= = = = =
以下は備忘録、参考にされる場合は、理解した上で自己責任でお願いします
とくに「rm -rf /opt」の部分、既になにかファイルがあったら削除してしまってなにが起きるのか、非常に不安。空のサブディレクトリがあっただけだったので。今回はこの通りに実施している。
※　ご存知の方いらしたら教えてください
[こちら](https://www.my-hacks.info/2021/06/17/post-1729/)「SynologyのNASでAPCUPSDを使う方法」を参考にさせていただき、インストールしている

```
#インストール先のフォルダを作成
mkdir -p /volume1/@entware-ng/opt
#　インストール先は空であることが必要？らしく、以下のコマンドを実行
rm -rf /opt
ln -sf /volume1/@entware-ng/opt /opt
#Entware-ngをインストール
（以下から該当するプロセッサモデルのスクリプトを選びます。）
# x86-64
wget -O - http://bin.entware.net/x64-k3.2/installer/generic.sh | /bin/sh
# パーミッション変更　　700を755に変更
sudo chmod 755 /volume1/@entware-ng
# パスの追加
export PATH=$PATH:/volume1/@entware-ng/opt/bin
```