OmniAICreator/Qiita-1.07M huggingface dataset:
レコードタイプに割り当てられたページレイアウトが表示されない




+ [Record Type not displaying assigned page layout](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eruO9)

2 つの新しいレコード タイプ (ストアと慈善事業) を作成し、それぞれのページ レイアウト (ストア レポート レイアウト、慈善事業レポート レイアウト) を作成し、レイアウトをレコード タイプに割り当てましたが、「新規」を選択して「慈善事業」レコード タイプを選択すると、ストア ページ レイアウト フィールドが引き続き表示されます。プロファイル権限の割り当てを確認しましたが、私の知る限り、それらも正しく割り当てられています。 

改善されるかどうか確認するために、ログアウトして再度ログインしてみましたが、効果はありませんでした。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/96cc95f3-b042-bea6-66d6-ec5cfc2dde6d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4b0f38d0-8c42-4c60-8e7a-c23d1c94039a.png)

見た感じ問題なさそうなのですが...


動的フォームは有効だと問題なるらしい

https://salesforce.stackexchange.com/questions/385140/correct-page-layout-for-a-record-type-is-only-working-in-salesforce-classic-but

以前は有効にしていましたが、動的フォームにアップグレードするかどうかを尋ねられるようになったため、現在は無効にしていると思います (スクリーンショットを参照)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0f91681e-1e06-6249-7148-d7563f285cf3.png)

原因が分からん


# 動的フォームが問題になっている例

+ [新しいレコードのページレイアウトは完全に空白です](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A97NUSAZ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/85de019f-46c7-5b9a-50e0-032dc2e3c338.png)
voicevox web api v1を利用してテキストファイルを音声に変換するスクリプト 'yurie.py'

タイトル通りです。今はv3が出ていますが、v1になってるのは、v3は認証が必要なので。

```yurie.py
import requests
import json
import time
sid=0
file_name = "sample.mp3"

def generate_audio(text):
    url = f"https://api.tts.quest/v1/voicevox?text={text}&speaker={sid}"
    response = requests.get(url).json()
    while True:
        statusurl=response["audioStatusUrl"]
        status=requests.get(statusurl).json()
        if status["isAudioReady"]:
            break
        time.sleep(1)

    audio_url = response["mp3DownloadUrl"]
    return audio_url

def save_audio(audio_url, file_name):
    audio_content = requests.get(audio_url).content
    with open(file_name, "wb") as file:
        file.write(audio_content)

def main():
    f=open(input("Input file name to speak:"),"rt")
    text = f.read().replace(' ','').replace('\t','').replace('\n','')

    print(text)
    audio_url = generate_audio(text)
    print(audio_url)
    save_audio(audio_url, file_name)

if __name__ == "__main__":
    main()
    exit(0)
```
AppStoreのトランザクションレポートの管理方法が変わるという告知メールを読んだ

### メールの意味と対応ステップ

Appleから届いたメールには、特定の国や地域での委任販売業者の変更に伴い、トランザクションレポートの管理方法が変わると書いてあります。この変更は、2024年10月26日以降に発効し、影響を受ける国々にはブータンや韓国、カンボジア、パラオなどが含まれます。

> We’re reaching out to let you know of an upcoming change to your appointed commissionaire that impacts how your transaction reports are provided.
As of October 26, 2024, your appointed commissionaire will change from Apple Distribution International Limited, an Ireland-based company, to Apple Services Pte. Ltd., a Singapore-based company, for the following locations: Bhutan, Brunei, Cambodia, Laos, Macau, Maldives, Micronesia, Mongolia, Myanmar, Nepal, Palau, Sri Lanka, South Korea, Fiji, Nauru, Papua New Guinea, Solomon Islands, Tonga, and Vanuatu.
View updated reports
Transactions in South Korea will still show in the South Korea report in the Payments and Financial Reports section of App Store Connect. Transactions in the other 18 locations will be consolidated in a new report for South Asia and Pacific (USD), which you can download once financial data from October 26, 2024, is available. Transactions from these locations will initially appear in two reports, reflecting transactions from before and after the change.
For automated report downloads with the App Store Connect API, the 18 locations will be split between Rest of the World (USD) and South Asia and Pacific (USD).

> Use “AP” as the region code for the new South Asia and Pacific (USD) report.
Continue using “WW” as the existing region code for Rest of World (USD).
Continue using “KR” as the existing region code for South Korea.


#### 1. トランザクションレポートの書式変更が起きる
まず、Appleの販売業者がアイルランドのApple Distribution International LimitedからシンガポールのApple Services Pte. Ltd.に変更されるという通知が重要です。この変更により、特に対象地域でのトランザクションレポートが影響を受け、従来とは異なるフォーマットで報告されることになります。

#### 2. 対象地域
変更の対象となるのは、主にアジアと太平洋諸国です。これに該当する国や地域は19か国あり、特に韓国は従来のトランザクションレポートの形式を維持する一方、その他の18地域は新しい「South Asia and Pacific (USD)」レポートに統合されます。

#### 3. レポートの確認方法を再設定
10月26日以降のトランザクションは、従来の「Rest of World (USD)」レポートではなく、「South Asia and Pacific (USD)」レポートで確認する必要があります。APIを通じて自動的にレポートをダウンロードしている場合、以下の設定変更が必要です。

- 「AP」を使用して「South Asia and Pacific (USD)」レポートを取得
- 「WW」を引き続き「Rest of World (USD)」レポートに使用
- 韓国については「KR」をそのまま使用

これにより、各国の売上情報を適切に管理することが可能です。

#### 4. トランザクションの監査と記録
委任販売業者の変更に伴い、財務データが正確に反映されるかどうかを確認するため、10月26日以降のトランザクションレポートを細かく監査することが重要です。この時点で、売上データが2つの異なるレポートに分割されるため、特に新しいレポート形式が正確に適用されているかをチェックしましょう。

#### 5. トランザクション管理ツールのアップデート
APIを使用している場合は、レポートの自動ダウンロードのために、スクリプトやレポート管理ツールの設定を「AP」レポートを取り扱うようアップデートしましょう。

#### 6. 不明点があればAppleに連絡
不明点がある場合や、レポートの新しいフォーマットに関して疑問がある場合は、contact usのリンクからApple Developer Relations Teamに連絡してサポートを受けることをおすすめします。迅速な対応が今後の業務効率に直結するため、早めの準備が望ましいです。

以上のステップを踏んで、レポート形式の変更に円滑に対応し、アプリの売上データを正確に管理しましょう。
ブラウザによるUIの関連リストコンポーネントの表示の違い



+ [ページでクイック リスト関連コンポーネントを使用していますが、問題は、Microsoft Edge ブラウザーでは関連リストが 1 列で表示され、Chrome ブラウザーでは関連リストが 2 列で表示されることです。なぜこのようなことが起こるのでしょうか。解決策はありますか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erqFh)

+ Chrome
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2d1233d6-8bdd-4b3a-7c36-56d673252377.png)

+ Microsoft Edge 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/74a6fecc-123d-34af-3ebe-414715772601.png)

本当かな？

:::note
これはブラウザ固有の問題のようですが、ブラウザ間の CSS レンダリングの違いが原因と考えられます。 
:::
日銀統計データ取得

日銀のデータは下記のサイトから取得できるがapi等エンジニア扱いやすいよう整備されておらず、通常手作業で取得する必要がある。そこでこれら全てのデータを整形し扱いやすい形式にまとめたい。
https://www.stat-search.boj.or.jp/ssi/cgi-bin/famecgi2?cgi=$nme_s060

下記は公開データ一覧
https://www.stat-search.boj.or.jp/info/statistics_menu_list_j.pdf


本記事ではとりあえずサイトの構造を理解するためにもデータを1つseleniumで取得してみたのでコードを記載します。

```python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# ChromeDriverのパス
driver_path = '/usr/local/bin/chromedriver'

# WebDriverを初期化
service = Service(driver_path)
driver = webdriver.Chrome(service=service)

# URLにアクセス
driver.get('https://www.stat-search.boj.or.jp/ssi/cgi-bin/famecgi2?cgi=$nme_a000&lstSelection=FM08')

try:
    # 展開ボタンをクリック
    expand_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, '//*[@id="menuSearchTabpanel"]/div[2]/div[1]/div[2]/input'))
    )
    expand_button.click()
    print("展開ボタンをクリックしました。")

    # 全てのデータ系列を選択するチェックボックスをクリック
    select_all_checkbox = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, '//*[@id="menuSearchTabpanel"]/div[2]/div[2]/div[1]/label'))
    )
    select_all_checkbox.click()
    print("全てのデータ系列を選択しました。")

    # 抽出条件に追加ボタンをクリック
    add_condition_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, '//*[@id="menuSearchTabpanel"]/div[2]/div[2]/div[4]/a'))
    )
    add_condition_button.click()
    print("抽出条件に追加ボタンをクリックしました。")

    # 抽出ボタンをクリック（新しいウィンドウが開く）
    extract_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, '//*[@id="resultArea"]/div[4]/ul/li[1]/a'))
    )
    extract_button.click()
    print("抽出ボタンをクリックしました。")

    # 新しいウィンドウが開かれるのを待つ
    WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))

    # 新しいウィンドウに切り替え
    window_after = driver.window_handles[1]
    driver.switch_to.window(window_after)

    # ダウンロードボタンをクリック（さらに新しいウィンドウが開く）
    download_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div/div[2]/table/tbody/tr[2]/td[5]/a'))
    )
    download_button.click()
    print("ダウンロードボタンをクリックしました。")

    # さらに新しいウィンドウが開かれるのを待つ
    WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(3))

    # CSVファイルのリンクがあるウィンドウに切り替え
    window_csv = driver.window_handles[2]
    driver.switch_to.window(window_csv)

    # CSVファイルのリンクを取得
    csv_link = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, '/html/body/div[2]/div/div/div/table/tbody/tr/td/a'))
    )

    # リンクのURLをターミナルに出力
    csv_url = csv_link.get_attribute('href')
    print(f"CSVファイルのリンク: {csv_url}")

except Exception as e:
    print(f"エラーが発生しました: {e}")
finally:
    # WebDriverを終了
    driver.quit()
Groveクロスケーブルを作って遊ぶ。(GroveLED,M5NanoC6)


x 過去ログを見よ!!


目的
精密ドライバー等でほじって信号を入れ替える

結果

![o_coq458.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1b92bfe2-8f5c-63e6-116e-26f020c21e06.jpeg)

![o_coq459.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a40cd21c-78e7-8e88-1f94-e3e700416d3a.jpeg)

![o_coq460.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f07d1d7b-8bc7-357a-7b6b-557c21377dc6.jpeg)


プログラム

```c++


//PWM_2LED_test1_C6_1


//初期化
void setup() {

  //出力ピンの初期化
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);

} //setup


//メインループ
void loop() {

  //256回繰り返す
  for (int i = 0; i < 256; i++) {

    analogWrite(1,       i); //PWM出力(1)

    analogWrite(2, 255 - i); //PWM出力(2)

    delay(20); //20ms待つ

  } //for i

} //loop


```
ボタンをhoverした時に高さがズレないようにする


## はじめに

hover 時に border を使用している要素で、レイアウトシフトが起こってしまう現象を解決します。

## 問題と原因

これは、border-width プロパティが hover 時と hover 前で異なってしまうために発生する現象です。

```html
<div className="grid grid-cols-1 md:grid-cols-3 gap-6 p-6 max-w-4xl">
  <div
    className="bg-white p-4 rounded-lg shadow-md hover:border-2 hover:border-slate-600"
  >
    <h2 className="text-lg font-bold">Item 1</h2>
    <p>これはアイテム1の説明です。</p>
  </div>
  <div className="bg-white p-4 rounded-lg shadow-md">
    <h2 className="text-lg font-bold">Item 2</h2>
    <p>これはアイテム2の説明です。</p>
  </div>
  <div className="bg-white p-4 rounded-lg shadow-md">
    <h2 className="text-lg font-bold">Item 3</h2>
    <p>これはアイテム3の説明です。</p>
  </div>
  <div className="bg-white p-4 rounded-lg shadow-md">
    <h2 className="text-lg font-bold">Item 4</h2>
    <p>これはアイテム4の説明です。</p>
  </div>
  <div className="bg-white p-4 rounded-lg shadow-md">
    <h2 className="text-lg font-bold">Item 5</h2>
    <p>これはアイテム5の説明です。</p>
  </div>
  <div className="bg-white p-4 rounded-lg shadow-md">
    <h2 className="text-lg font-bold">Item 6</h2>
    <p>これはアイテム6の説明です。</p>
  </div>
</div>
```

![tips-hover-fit-border.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772341/efe0879d-9205-d53f-37de-4efe0f3e5a83.gif)

## 解決方法

background-color と同じ色、hover 時と同じ大きさの border を設定すれば、
hover してもレイアウトシフトが発生しません。

```html
<div className="grid grid-cols-1 md:grid-cols-3 gap-6 p-6 max-w-4xl">
  <div
    className="bg-white p-4 rounded-lg shadow-md hover:border-2 hover:border-slate-600"
  >
    <h2 className="text-lg font-bold">Item 1</h2>
    <p>これはアイテム1の説明です。</p>
  </div>
  <div
    className="bg-white p-4 rounded-lg shadow-md border-2 border-white hover:border-2 hover:border-slate-600"
  >
    <h2 className="text-lg font-bold">Item 2</h2>
    <p>これはアイテム2の説明です。</p>
  </div>
  <div className="bg-white p-4 rounded-lg shadow-md">
    <h2 className="text-lg font-bold">Item 3</h2>
    <p>これはアイテム3の説明です。</p>
  </div>
  <div className="bg-white p-4 rounded-lg shadow-md">
    <h2 className="text-lg font-bold">Item 4</h2>
    <p>これはアイテム4の説明です。</p>
  </div>
  <div className="bg-white p-4 rounded-lg shadow-md">
    <h2 className="text-lg font-bold">Item 5</h2>
    <p>これはアイテム5の説明です。</p>
  </div>
  <div className="bg-white p-4 rounded-lg shadow-md">
    <h2 className="text-lg font-bold">Item 6</h2>
    <p>これはアイテム6の説明です。</p>
  </div>
</div>
```

![tips-hover-fit-border2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772341/ed5b7eb8-3b40-b348-d1df-b56b47906264.gif)

## おわりに

こういう css 周りの tips って多すぎて、把握しきれませんよね。

ほなまた。
初心者なりのPrompt Engineering手法解説【Few-shot編】

今回はプロンプトエンジニアリング手法の一つの**Few-shot prompting**について解説していこうと思います！
本記事の実装環境で使用しているLLMはGPT-4oです。

## Few-shot prompting
この手法は、LLMに対して例を提示することで、そのタスクに関する理解やパフォーマンスを向上させる手法です。

具体的には、モデルに対していくつかのサンプル入力と期待される出力を与え、その例に基づいて新しい未見のデータに対する適切な出力を生成するように誘導します。

数学を解く際によく例題があるように、LLMの扱いは人間と同様なので、例を提示することで回答精度が上がります。

早速解説していきます！

```
以下の文章を例を元に、要約してください。

例1:
文章: "クラウドコンピューティングは、企業がコスト削減を行うために重要な技術となっており、IT業界全体でその導入が進んでいる。"
要約: "クラウドコンピューティングは企業のコスト削減において重要な技術である。"

例2:
文章: "再生可能エネルギーは、地球温暖化対策の中心的な役割を果たしており、多くの国が積極的にその導入を進めている。"
要約: "再生可能エネルギーは地球温暖化対策に貢献しており、各国が導入を推進している。"


文章: "AI技術は急速に発展しており、様々な産業での応用が進んでいます。特に、ヘルスケアや自動運転、自然言語処理分野において、その影響力は大きく、今後も多くの進展が期待されています。"
要約:
```

上記のプロンプトでは、例を元に要約するように命令しました。
GPTが作成した要約は以下になりました↓
```
AI技術は急速に発展し、ヘルスケアや自動運転、自然言語処理での応用が進んでいる。
```

Few-shot promptingでは、具体的な要約の例が与えられているため、モデルはそれを参考にして、よりフォーマットに沿った、必要な情報を残した一貫性のある出力を生成します。

「ヘルスケア」「自動運転」「自然言語処理」といった具体的な応用分野が保持され、要約としての情報密度が高まっています。


では逆に、Few-shot promptingを行わなかった場合どうなるのか確認します。

## Zero-shot prompting
Few-shot promptingを行わなかった場合すなわち、Zero-shot prompting手法になります。

例なしに、いきなり質問を投げるプロンプトです。

モデルはタスクについて事前に具体的な情報や例を与えられないため、一般的な理解に基づいて出力します。
出力は概ね適切ですが、求められる具体的なフォーマットや要約のスタイルを学習していません。
そのため、結果が安定しない可能性があります。

```
次の文章を要約してください:
"AI技術は急速に発展しており、様々な産業での応用が進んでいます。特に、ヘルスケアや自動運転、自然言語処理分野において、その影響力は大きく、今後も多くの進展が期待されています。"
```
上記のプロンプトがZero-shot promptingの例になります。
シンプルに回答を求めるのが特徴的、と言いますか皆様が普段使用している手法だと思います。

作成された回答が以下になります↓

```
AI技術は多くの産業で応用されており、今後も進展が期待される。
```

Zero-shot promptingでは、特定の例を与えずにタスクをモデルにその場で理解させるため、出力は一貫性が欠けたり、情報が不完全だったりすることがあります。
この例では、出力が要約として成立していますが、重要な「ヘルスケア」「自動運転」「自然言語処理」といった具体的な応用分野が省略されてしまっています。

## まとめ

Zero-shot promptingでは、モデルが一般的なパターンに基づいて要約しますが、詳細な情報が省略されることがあるため、要約の質が一定ではありません。

Few-shot promptingを使う場合は、いくつかの例から学習したフォーマットや重要な情報の扱い方をモデルが理解しているため、より一貫した、重要な情報を正確に含んだ要約が生成されやすくなります。
具体的なタスクやフォーマットに基づいた正確な出力が求められる場面で多く使用されています。

Few-shot promptingを使用することで、必要な情報をしっかり含んだ、より質の高い出力が期待できます。
GoでHTTPサーバーをゼロから構築する方法

## はじめに

最近、Go言語のシンプルさと高いパフォーマンスに興味を持ったため、
試しにHTTPサーバーを構築してみました。


## 1.Goのインストール
Go言語は、公式サイトから各OSに合わせたインストーラーを使用して簡単にインストールできます。

https://go.dev/dl/

私はMacを使用しているので、Macのインストーラーを使用しました。
このコマンドでバージョン情報が表示されれば準備完了です。

```shell
% go version
go version go1.23.1 darwin/amd64
```

## 2. Goプロジェクトの作成
Goプロジェクトの依存関係管理には、Go Modulesを使用するのが一般的です。
ここでは、Goプロジェクトのディレクトリを作成し、初期化する手順を説明します。
まず、新しいGoプロジェクト用のディレクトリを作成します。

```shell
% mkdir go-http-server 
% cd go-http-server
```

次に下のコマンドを実行してプロジェクトをGoモジュール化します。

```shell
% go mod init example.com/go-http-server 
```

これにより、プロジェクトのルートディレクトリにgo.modファイルが生成され、プロジェクトの依存関係が管理できるようになります。

フォルダー構成については以下のようにします。

```
go-http-server/
├── cmd/
│   └── app/
│       └── main.go
├── internal/
│    └── handlers/
│     └── handler.go
└── go.mod
```

- **cmd/:**  アプリケーションのエントリーポイントとなるコードを配置します。main.goはこのフォルダーに置き、サーバーの起動処理を記述します。
- **internal/:**  プロジェクトの内部で使用するコードを配置します。この例では、HTTPリクエストを処理するハンドラー関数をinternal/handlers/に配置します。
- **go.mod:**  Go Modulesを使用してプロジェクトの依存関係を管理するための設定ファイルです。

## 3. 各ファイルの実装内容
`cmd/app/main.go`
このファイルには、サーバーを起動するためのコードを記述します。Goプログラムでは、main.goがアプリケーションのエントリーポイントとなり、HTTPサーバーの実行がここから開始されます。

```Go
package main

import (
    "log"
    "net/http"
    "example.com/go-http-server/internal/handlers"
)

func main() {
    http.HandleFunc("/", handlers.HelloHandler)  // ハンドラーの設定

    log.Println("Starting server on :8080...")
    log.Fatal(http.ListenAndServe(":8080", nil))  // サーバーをポート8080で起動
}

```

`internal/handlers/handler.go`
このファイルには、リクエストに対してレスポンスを返すハンドラー関数を定義します。
今回は、シンプルな **Hello, World!** を返すハンドラーを定義します。

```Go
package handlers

import (
    "fmt"
    "net/http"
)

func HelloHandler(w http.ResponseWriter, r *http.Request) {
    name := r.URL.Query().Get("name")
    if name == "" {
        name = "World"
    }
    fmt.Fprintf(w, "Hello, %s!", name)  // リクエストに応じて動的なレスポンスを返す
}
```

## 4. プロジェクトの実行
プロジェクトのコードを書き終えたら、次にサーバーを実行します。

```shell
go run cmd/app/main.go
```

サーバーが正常に起動すると、ブラウザで http://localhost:8080 にアクセスできます。
クエリパラメータnameが指定されていない場合は **Hello, World!** と表示され、
http://localhost:8080/?name=Go のようにクエリパラメータを指定すると"Hello, Go!"というメッセージが表示されます。

## 終わりに
Goを使用して、HTTPサーバーをゼロから構築してみました。
Goの標準ライブラリだけで簡単にサーバーを立ち上げることができました。
次のステップとして、ミドルウェアの追加やデータベースの連携など、さらに高度な機能を実装していこうと思います。
VSCodeの拡張機能をインストールして、ubuntu22.04にssh接続する

# ubuntuの設定
1.opensshをインストール
```console
$ sudo apt install openssh
```
2.configファイルの設定
・パスワード認証でログインする場合
```console:/etc/ssh/sshd_config
PasswordAuthentication yes
```
無効になっている場合は、公開鍵認証等他の認証方法を設定する必要があります。


# VScodeの設定
1.VSCodeインストール
※インストール手順は割愛

2.ExtentionsからRemoto-SSHをインストール
拡張機能(Extentions)の検索欄に{remote ssh}と入力してインストール
![vs-remote.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3887509/ee5d1b79-9edc-efb6-84b6-498a94497af1.png)

3.RemoteExplorerから歯車マークをクリックし、configファイルを開きます
![vs-remote-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3887509/b9be7d92-48c8-a0df-f285-4f3b9585b95c.png)

4.configファイルの設定
```console:C:users/{$ユーザー}/.ssh/config
# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host Ubuntu
    HostName {接続先のIP}
    User ｛接続先のユーザー名｝
```
| 項目 | 値 |
|:-|:-|
| Host  | VScodeに表示される名前で何でも構いません  |
| HostName  | UbuntuのIP  |
|  User |  Ubuntuのユーザー名 |

5.connect in New Windowsをクリックしssh接続
![vs-remote-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3887509/d62709d6-ca48-8b79-17c6-b560490b3e9e.png)

6.パスワードを入力し、OpenFolderでUbuntu上のファイルを確認できます
![vs-remote-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3887509/149d8515-87ca-e6a3-84b0-46e2e5ba8646.png)

7.適当なファイルを右クリックし、[Open in integrated Terminal]を選択するとファイルシステムが表示されます。

8.VScodeでファイルを開く
```console:/etc/ssh/sshd_config
$ code [ファイルパス]
```
paiza.ioでmysql

# 概要
paiza.ioでmysqlやってみた。
練習問題やってみた。

# 練習問題
AUTO_INCREMENTを使え。

# サンプルコード

```
CREATE TABLE book(
    id INT(10) AUTO_INCREMENT NOT NULL,
    name VARCHAR(30) NOT NULL,
    author VARCHAR(30) NOT NULL,
    age INT(3),
    PRIMARY KEY (id)
);

INSERT INTO book(name, author, age) VALUES ('SQL入門', 'Masumi', 25);
INSERT INTO book(name, author, age) VALUES ('Flutter入門', 'Masumi', 25);
INSERT INTO book(name, author) VALUES ('HTML入門', 'Hiro');
INSERT INTO book(name, author, age) VALUES ('GitHub入門2', 'Emma', 22);
INSERT INTO book(name, author, age) VALUES ('Flutter上級', 'Oliva', 45);

SELECT * FROM book;

```

# 実行結果

```
id	name	author	age
1	SQL入門	Masumi	25
2	Flutter入門	Masumi	25
3	HTML入門	Hiro	NULL
4	GitHub入門2	Emma	22
5	Flutter上級	Oliva	45
```

# 成果物

https://paiza.io/projects/XDTIMlBw6bVXVhNugWsyEQ


以上。
【Git・GitHub】いちばんやさしいgit&githubの使い方を読んでみた

# はじめに
エンジニアになるべく、GitやGitHubは使えないとまずいと聞いていたので、体系的な知識を入れるために書籍で勉強しようと考えました

Gitを勉強するなら動画がいいとあるYoutuberが言っていましたが、私の場合は本のような全体概要をつかみやすい教材のほうがあっているなと思いました。これは人それぞれだと思います。

この本を読み終わるのに4日くらいかかりました。もともと本を読むのは得意ではないので早い方はもっと早いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883070/f9936d92-cf8b-bfd6-60cf-506c748d4e1d.png)

# 1章 Gitの基本をまなぼう
* Gitはなぜつかう
* なぜバージョン管理をする必要があるのか
* GitとGitHubの違いは
* ローカルレポジトリとリモートレポジトリの仕組み

正直ローカルレポジトリとリモートレポジトリの仕組みはめちゃわかりやすくて、これのおかげでこの後読み進めるときに混乱しませんでした

# 3章 ファイルをバージョン管理してみよう
* ローカルレポジトリで使用するコード一覧
* ローカルレポジトリの仕組みとコードがどう関係しているかの図
* コードの実践

こちらの書籍は図がとてもわかりやすいのでコードがローカルレポジトリのどの部分で動いているかがわかります
コードの実践は`init`,`add`,`commit `,`rm`,`checkout`,`reset`,`status`,`diff`,`log`をやりました。

# 4章 GitHubのレポジトリをパソコンに取得する
* GitHubの公開鍵の作成とリンク
* レポジトリのフォークとクローン
ここではじめてGitHubができてました。GitHubを触るための準備という感じでした

# 5章 ブランチを使ってファイルを更新しよう
* ブランチとは
* ブランチの作成と切り替え
* プルリクエストの作成（レビュアーのつけ方とかものってます）、コメント、承認等
* マージの方法(マージコミット、スカッシュ、リベース)

マージの方法についてはイメージがわかなかったり、どう違ってどのようなメリデメがあるかを調べていたらだいぶ時間がかかってしまいました

わたしのことを応援してくれている現役エンジニアにマージについて聞いたところ、現場はマージコミットやスカッシュが多いとのこと。リベースはマージでは使用しないがコミットを並び替えるのに使用するらしいです。

ちなみに本書でリベースをつかってコミットの並び替えの方法については触れられていませんでした

また、GitHubフローの概念をサラッと説明していましたが、Gitフローの説明やGitHubフローの踏み込んだ説明はありませんでした。
入門書なので踏みこみすぎた説明はないので、初学者の私にとってはとてもわかりやすいと感じました

# 6章 複数ブランチを使ってファイルを更新する
* ここからはこの章まで学んできた内容を実践する章になっている
* コマンドのショートカットもこの章から出てくる
* ブランチの同時作業の際は、ほかのブランチでマージが行われたら自分のローカルレポジトリにmasterブランチをpullで読み込んでマージする必要がある

ここから実践的でした。コードだけでなく写真や図がとても多いので詰まることなく読み進めることができました

# 7章 コンフリクトに対応しよう
* コンフリクトを理解するためにわざとコンフリクトを発生させる
* コンフリクトはほかのブランチで編集したと自分が作業しているブランチの編集部分が重複した際にどちらを選択するか、Gitが教えてくれる
* コンフリクトが起きても、修正をしてpullすればそこまで怖いことではない

まずコンフリクトが起きたら、相談するのがよさそうですね。
ここで予期しないデータを上書きしてしまったらまずいと思うので。

# 8章 GitHubをさらに使いこなそう
* GitHubにはたくさんのオープンソースがある
* 具体的にどのように活用していくかの説明はなかった

# まとめ
Git,GitHub入門書にこまったらまよわずおすすめの1冊です
しかし現場レベルまで理解できたかというとまだまだなので、もう1~2冊Git関連の書籍を読みたいと思います。
Unityのショートカットメモ

そのうち増えるかもしれない

## VisualStudioの起動
- Alt+A→O

## 複製
- Ctrl+D

## ONOFF切り替え
- Alt+Shift+A

## Explorerで開く
- Alt+A→S→Enter

## Play関連
- Ctrl+P 開始/終了
- Ctrl+Shift+P Pause
- Ctrl+Alt+P Step

## 子オブジェクトを開く(Hierarchy)
- Shift+C
【C#】初心者向け：Nullチェックの is演算子 vs 等価演算子

## 記事の目的
nullチェックで
```C#
if(value is null)
if(value is not null)
```
を使うか
```C#
if(value == null)
if(value != null)
```
を使うかの判断ができるようになる

## どっちがいいの？
先に結論から
nullチェックに関してはis演算子を使用します。

## なぜis演算子の方が適しているのか

大きく分けて
1. is演算子を使うメリット
1. 等価演算子を使用するデメリット

があります。

### 1. is演算子を使うメリット

is演算子はユーザーがオーバーロードした等価演算子を呼び出すことが無い為、安全で高速なnull比較を行うことが可能です。

### 2. 等価演算子を使うデメリット

等価演算子はオーバーロード可能な演算子であるため、実装によってはnullチェックに対して必ずしも正確な値が返ってくるとは限りません。

また、等価演算子がオーバーロードされていた場合、nullチェックにおいては不必要な処理を通る可能性があり、処理速度が低下する恐れがあります。

## 結論
nullチェックにおいてはis演算子を使うようにしましょう。

## 参考資料
https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/is

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/operator-overloading
Ubuntuで電通大のVPN設定をしたい人に向けて

# はじめに
ありがたいことに電通大のインフラ関係のお悩みごとは情報基盤センターのウェブサイトを見ることでほとんど解決します。それはVPNの設定についても例外ではありません。
しかしながら弊学、WindowsやmacOSでVPNを設定する方法は書いてあっても、Ubuntuで設定する方法は全く書いてありません。Ubuntuを使う学生なんて少数ですし需要がないのでしょう。もちろん電通大ですからUbuntu...というかLinux系列のOSを使っている学生は存在しますが、そのほとんどはVPNの設定を難なくこなせると思います(だってわざわざLinux使うような変態だもん)。
しかし、極々少数ではありますが、私のようにpcに興味をもってUbuntuで過ごしていこうというpc初心者もいるはずで、その人にとって苦行となってしまうことは間違いありません。
この記事では私の備忘録も兼ねてUbuntuで電通大のVPNを設定する方法を残します。皆さんの参考になれば幸いです。
# 設定方法
### 0. 実行環境
Ubuntu 22.04.4
### 1. L2TPを追加
以下のコマンドを叩く。
```bash
sudo apt update
sudo apt-get install network-manager-l2tp network-manager-l2tp-gnome
```
### 2. 共有鍵の取得
[情報基盤センター ITCユーザーズガイド](https://www.cc.uec.ac.jp/ug/ja/remote/vpn/l2tp/index.html)にある`VPN 事前共有鍵配布ページ`から共有鍵を取得してくる(コピーしてくればいいよ)。
### 3. VPNの設定
Settingを開いてNetworkを選択。すると以下のような画面が出てくるので＋ボタンを押す。

![Network画面の画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632250/92c3f47a-1a39-b921-a5b2-646cf3a66525.png)

すると選択肢が出てくるので`Layer 2 Tunneling Protocol (L2TP)`を選択する。
選択したら以下のような画面になる。

![VPNの設定画面の画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632250/4486b765-de2c-c3fe-391a-3659d31892d6.png)

この画面には次の情報を入力する。
- `Name` : VPNの名前(これは自分の好きなように設定する)
- `Gateway` : vpn.cc.uec.ac.jp
- `User name` : 自分のUECアカウント
- `Password` : UECアカウントのパスワード
以上の情報を入力し終わったら`IPsec Settings...`というボタンを押す。すると次のような画像が出てくる。

![事前共有鍵入力画面の画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632250/5741a482-7d96-aaff-aa82-41e262efcd1b.png)

出てきたら`Enable IPsec tunnel to L2TP host`のチェックボックスにチェックをつけ、`Pre-shared key`のところに「2. 共有鍵の取得」で取得してきた事前共有鍵をペーストする。

以上の設定を行うことでUbuntuで電通大のVPNに接続することができます。やったね！

# 終わりに
UbuntuのVPNの設定を初めて行ったのは去年の12月(2024年10月時点)で、初めて自分のpcにUbuntuをいれて、分からないながらも頑張って設定したのをよく覚えています。それから紆余曲折あり、環境を破壊しつつまたUbuntuを入れ直して、もう一度VPNの設定をしようといったときにまた手間取ったことがこの記事を書く原動力になりました。稚拙な記事ではありますが、誰かの助けとなれば嬉しい限りです。

それでは、よいUbuntuライフを。

...書いた内容がおまかんだったらごめんなさい。
Google App Scriptでの関数の名前によるエラー

# 今回発生していた不具合
 **judegement()** という名前で定義していた関数の戻り値に連想配列を設定していた。
しかし、実行してみると戻り値が勝手にboolean型に変換されていた。


## このエラーの解決方法
関数名を **judgement()** から **judge()** に変更した。

## メモ
誰か同じことで困っている人の助けになればと思いこの記事を書いた。自分用のメモだから大変手の抜いた構成と文章。
もし、これが有名な仕様だったら恥ずかしいので教えていただきたい。
[paiza]レベルアップ問題集解答案(C#)【文字列の配列】辞書順に出力 Boss

# 問題
https://paiza.jp/works/mondai/array_primer/array_primer__string_dictionary_boss

# C#解答案
```c#
using System;
using System.Linq;

class Program
{
    static void Main()
    {
        int[] num = Array.ConvertAll(Console.ReadLine().Split(' '),int.Parse);
        int N = num[0];
        int K = num[1];
        string[] list = Console.ReadLine().Split(' ');
        var list2 = list.OrderBy(x => x).ToArray();
        Console.WriteLine(list2[K-1]);
    }
}
```
React 遅延読み込みコンポーネントについて (<Suspense>タグ, lazy)

遅延コンポーネントを表示しようとしたらエラーになった。

<h2>🆘 エラーになった時のコード</h2>

```react:App.js
import { lazy, Suspense } from 'react';
import './App.css';

const App = () => {
  const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
  const LazyImage = lazy(() => sleep(2000).then(() => import("./LazyImage")));

  return (
    <Suspense fallback={<p>Now Loading...</p>}>
        <LazyImage />
    </Suspense>
  );
};

export default App;
```

```react:LazyImage.jsx
export const LazyImage = () => {
    return (
        <img src="https://m.media-amazon.com/images/I/61UydAS35JL.jpg" />
    );
};
```

<h2>📞 エラーの内容</h2>

```:Error
Element type is invalid. Received a promise that resolves to: undefined. Lazy element type must resolve to a class or function.
```
とりあえず英語が読めないので翻訳↓↓

```:エラー
要素タイプが無効です。undefinedに解決するプロミスを受け取りました。Lazy 要素型はクラスまたは関数に解決する必要があります。
```
とのことです。
日本語も読めないので何を言っているのか全く分かりません！！


<h2>🚑 結論</h2>

こちらのおかげで解決しました！
https://github.com/fuse-box/fuse-box/issues/1646#issuecomment-979481455

引用
>You must export default the foo file component

翻訳 ↓↓ (別に翻訳しなくても読めるけどね😉)
>fooファイルコンポーネントをデフォルトでエクスポートする必要があります

とのことなので、自分の実装コードでfooファイルに該当する `LazyImage.jsx`ファイルを下記のように修正しました。

```react:LazyImage.jsx
const LazyImage = () => {
    return (
        <img src="https://m.media-amazon.com/images/I/61UydAS35JL.jpg" />
    );
};

export default LazyImage;
```

これで解決です！


<h2>👐 余談</h2>

`LazyImage` をデフォルトエクスポートせずに普通に importして使う場合下記のように `{}` をつけるじゃないですか。
```react
import { LazyImage } from './LazyImage';
```
ということで思ったんです、デフォルトエクスポートをしない場合は
```react
const LazyImage = lazy(() => sleep(2000).then(() => import("./LazyImage")));
```
この部分のコードを
```react
const { LazyImage } = lazy(() => sleep(2000).then(() => import("./LazyImage")));
```
このようにしたらできるんじゃないかと！
まぁできなかったんですけどね😉
もしかしたら同じことが気になった方もいるかなと思ったので一応補足でした。

<h2>余談2</h2>

ちなみに遅延コンポーネントに使用する際は必ずデフォルトエクスポートで定義する必要がある。というのも変な気がするなと思ったのでデフォルトエクスポートせずにやる方法もあるのか調べてみたところ下記のコードでも可能なようです。(試しましたができました)
```react
const LazyImage = lazy(() => sleep(2000).then(() => import("./LazyImage").then((module) => ({ default: module.LazyImage }))));
```

この部分がデフォルトエクスポートに変換をするコードのようです。
https://zenn.dev/bmth/articles/react-lazily#%E5%80%8B%E5%88%A5%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

```react
import("./foo").then((module) => ({ default: module.SomeComponent }))
```

<hr />
デフォルトエクスポートに変換をする。
という挙動について気になることがありますが長くなるので一旦別で調べたいと思います。

<h2>まとめ</h2>

勉強して1週間経ってないので考え方自体がずれているところがあるかも知れませんが許してください！
まだ何も分かりませんが楽しんで勉強していきたいと思います🫠

それにしても記事を書くのって難しい・・・
僕のお師匠様の言語化能力や疑問を網羅的に調べる能力の高さが改めて身に染みます。。
⛩️🙏
我が家のbiome.json

2024年9月現在はこれ。

``` JSON
{
  "$schema": "https://biomejs.dev/schemas/1.9.1/schema.json",
  "vcs": {
    "enabled": true,
    "clientKind": "git",
    "useIgnoreFile": true
  },
  "files": {
    "ignoreUnknown": false,
    "ignore": []
  },
  "formatter": {
    "enabled": true,
    "formatWithErrors": false,
    "indentStyle": "space",
    "lineEnding": "lf",
    "indentWidth": 2,
    "lineWidth": 100,
    "attributePosition": "auto"
  },
  "organizeImports": {
    "enabled": true
  },
  "linter": {
    "enabled": true,
    "ignore": ["!./.server", "!./.client"],
    "rules": {
      "recommended": true,
      "correctness": {
        "noUnusedImports": "warn",
        "noUnusedVariables": "warn"
      }
    }
  },
  "javascript": {
    "formatter": {
      "jsxQuoteStyle": "double",
      "quoteStyle": "double",
      "trailingCommas": "es5",
      "semicolons": "always",
      "arrowParentheses": "always",
      "bracketSpacing": true,
      "bracketSameLine": true,
      "attributePosition": "auto"
    }
  },
  "overrides": [
    {
      "include": ["*.json"],
      "formatter": {
        "indentWidth": 2
      }
    }
  ]
}

```
VS CodeでFormatterがうまく動かないときに確認すること

# 対象読者

VS Codeで保存時にオートでFormatterを通したくて設定を一通り終えた人
まだ終えてない人はこちらから→（ https://biomejs.dev/ja/guides/integrate-in-editor/ ）
こういうの出て、「いろいろ設定はしたはずなんだけど……」な時に読んでください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657549/80d127e8-33d1-4825-38cd-166bbbd8cf22.png)

```
Extension 'Biome' is configured as formatter but it cannot format 'TypeScript JSX'-files
```
```
Extension 'Prettier' is configured as formatter but it cannot format 'JSON'-files
```
間のFormatterとかファイル形式とかは適宜読み替えてください。

# 結論

VS Codeで開くフォルダを間違えている

# どういうこと？

たとえば今、`D:\Projects\flams`を開いたワークスペースがあるとします。
`npx create-remix@latest`でremixのアプリを作ります。（ReactでもNext.jsでも可）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657549/7ea449a4-5912-6360-ca84-77676219bb55.png)

名前を`flams-frontpage`にしました。
すると、何も考えなければ今開いているフォルダの一つ下の階層にできあがります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657549/04224039-d7c3-d924-198a-0db276753cce.png)

まさしくこれが原因です。
BiomeやPrettierなどのFormatterはワークスペース直下を読みに行くらしく、こんなエラーが出ていました。
```
Could not resolve Biome in the dependencies of workspace folder: d:\Projects\flams
Searching for Biome in PATH
Extension bundle does not include the prebuilt binary
```
そりゃ読めませんよね……アプリはその1階層下なので……

ということで、ワークスペースで開くフォルダを変更しましょう。
好きな方法でよいですが、たとえば`New Window`→`Open Folder`など。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657549/fbcf001f-029e-8be9-d371-dee002d0eca3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657549/f58e2bcf-6707-468e-916f-e9f3d3c9c79c.png)


先ほど作ったアプリのフォルダを直接開きに行きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657549/777b9898-19fe-0b7f-5b6b-c47aa73d5d04.png)

うまくいきました。なんという罠でしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657549/2886c84b-ad60-0a82-5804-d8e0b7cc6c3d.png)

「せっかくVS CodeのDefault Formatterに設定したのになんかぜんぜん通らないんだけど」という人に届いてほしいです。
なんだか「Next.jsでBiome使おうと思ったのにVS Codeで自動フォーマット動かないしPrettierでいいや……」→「あれPrettierも動かないや……」みたいな例があるっぽいので……おれもそうだったので……
Tomcat コネクションプール超過テスト

## 1.目的
・tomcatプールテスト

## 2.pythonプログラム

```
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
import argparse
import socket

# Tomcatの接続プール数を設定できるように引数を追加
def parse_arguments():
    parser = argparse.ArgumentParser(description='Tomcatのプールを使い切る負荷テストプログラム')
    parser.add_argument('url', type=str, help='TomcatサーバーのURL')
    parser.add_argument('--connections', type=int, default=10, help='同時接続するプール数（デフォルト: 10）')
    return parser.parse_args()

# リクエストを送信し、ステータスを返す関数
def send_request(session, url):
    try:
        response = session.get(url)
        return response.status_code
    except Exception as e:
        return str(e)

# サーバーのポート番号を取得する関数
def get_port_from_url(url):
    try:
        # URLからポート番号を取得
        host = url.split('//')[1].split('/')[0]
        port = int(host.split(':')[1]) if ':' in host else 80
        return port
    except Exception:
        return None

# 使用中のプール数を表示する関数（仮想的にプール数を管理する）
class PoolManager:
    def __init__(self):
        self.active_connections = 0

    def increment(self):
        self.active_connections += 1

    def decrement(self):
        self.active_connections = max(0, self.active_connections - 1)

    def get_active_connections(self):
        return self.active_connections

# メインの実行部分
def main():
    args = parse_arguments()
    url = args.url
    max_connections = args.connections

    # プール管理クラスをインスタンス化
    pool_manager = PoolManager()

    # 使用するポート番号を取得して表示
    port = get_port_from_url(url)
    if port:
        print(f"接続先のポート番号: {port}")
    else:
        print("ポート番号の取得に失敗しました。デフォルトのポートを使用する可能性があります。")

    print(f"指定された接続プール数: {max_connections}")

    with ThreadPoolExecutor(max_workers=max_connections) as executor:
        with requests.Session() as session:
            futures = [executor.submit(send_request, session, url) for _ in range(max_connections)]

            for future in as_completed(futures):
                pool_manager.increment()  # 新しい接続をカウント

                try:
                    status = future.result()
                    print(f'リクエスト成功: ステータスコード {status}、使用中プール数: {pool_manager.get_active_connections()}')
                except Exception as e:
                    print(f'リクエストエラー: {e}、使用中プール数: {pool_manager.get_active_connections()}')

                pool_manager.decrement()  # 処理完了で接続を減らす

if __name__ == '__main__':
    main()

```

## 3.実行方法

```
python tomcat_pool_test.py http://your-tomcat-server:8080/your-app-endpoint --connections 100

```

注意点
引数で --connections の値を指定せずに実行した場合、デフォルトで10の接続数になります。
TARGET_URL は実際に接続を行いたいTomcatサーバーのエンドポイントに置き換えてください。
負荷テストやリソース枯渇を意図しているため、実行は必ずテスト環境で行い、本番環境では実行しないように注意してください。
データベースソフトウェアApache Cassandraのインストールでつまづいた箇所の共有

maritosと申します。
今回Apache Cassandraをインストールする機会があり、詰まった箇所があったため共有します。

詰まった箇所
* Javaが必要だと言われてインストールしたのにCassandraがインストールできない
* DBアクセスのためのCQLSHがインストールできない

環境
OS:Almalinux9(x86_64)

## 問題の原因と解消法
* Javaが必要だと言われてインストールしたのにCassandraがインストールできない
**要因1**
Javaのバージョンが適合していない
**解決策1**
Java11-jdkをインストールする。
↓以下コマンド
```
sudo dnf upgrade -y
sudo dnf install -y java-11-openjdk
```
**要因2**
リポジトリにCassandraが存在せず、dnfでインストールできない
**解決策2**
```
/etc/yum.repos.d/cassandra.repo
```
に定義を追加し、インストールを実行できるようにした。
cassandra.repoの内容
```
[cassandra]
name=Apache Cassandra
baseurl=https://redhat.cassandra.apache.org/41x/
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://downloads.apache.org/cassandra/KEYS
```
に変更すると、dnfでインストールできるようになる
```
sudo dnf install cassandra -y 
```

* DBアクセスのためのCQLSHがインストールできない
**要因**
リポジトリにCQLSHが存在しないため何も設定変更しないとdnfでインストールすることはできない
**解決策**
python3をインストールし、pipでインストールした。
↓以下コマンド
```
sudo dnf install python3-pip -y
pip install cqlsh
```

以上です。誰かのお役にたてば幸いです。
【VSCode】スニペットの作成を簡単にする方法

Snippet Generatorという拡張機能を使用すると簡単にスニペットを作成できます。

https://marketplace.visualstudio.com/items?itemName=wenfangdu.snippet-generator

![スクリーンショット 2024-06-22 23.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/1e0b64a1-b4d7-43a9-bbd2-74217ec89703.png)

スニペットを作成したいコードを選択してコマンドパレットから`Generate Snippet`を実行し、必要事項を入力するとスニペットを設定するためのオブジェクトがクリップボードに保存されます。

`Snippets Configure User Snippets`を実行します。

![スクリーンショット 2024-06-23 0.01.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/cccfb97c-6f77-ce0e-3f96-f49b1fc78078.png)


開いた設定ファイルにクリップボードの内容を貼り付けるとスニペットを使用できるようになります。

以下のようにショートカットキーを設定すると`Generate Snippet`の必要事項を入力した後に`Snippets Configure User Snippets`が実行されファイル選択できるようになり、より簡単に作成できます。

```jsonc:keybindings.json
{
  {
    "key": "任意のキー",
    "command": "runCommands",
    "args": {
      "commands": [
        "snippet-generator.generate-snippet",
        "workbench.action.openSnippets"
      ]
    }
  }
}

```
ITリテラシーを基礎から学び直してみた

### はじめに
過去にJavascript、Javaを学んでいたがメンタルを崩していてプログラミングから離れていました。
しかしこの度AIエンジニアとしてwebアプリケーションを作りたいと考えました。
現在Pythonの基礎から勉強中だけど、1年以上離れていたため、プログラミング以前にITの知識が薄れていると感じました。
そこでITリテラシーを再度学び直そうと思いました。参考にした書籍は[基礎からのプログラミングリテラシー](https://amzn.asia/d/6vwQqYp)です。

※ITリテラシーが高い人には当然の知識なので退屈かもしれません。

### 1.クライアントとサーバーの関係
クライアントは私たちユーザー側のことを指します。
今この記事を見ているあなたも、私も、クライアントになります。そして私たちはインターネットを通じて様々なサービスを受けることができます。
web検索、メール送受信、ファイル送受信など。
そしてこの**サーバー**とは、これらのサービスを提供するコンピュータやシステムのことを指します。

- web検索→webサーバー
- メール送受信→メールサーバー
- ファイル送受信→FTPサーバー

このクライアントとサーバー間の構図を **クライアントサーバー** と言います。
分かりやすく例えると下記手順です。

1. Aさん(クライアント)はあるサービスを受けたいから、サーバーへそのサービスのリクエストを送信する
2. サーバーはリクエストに基づいて、サービスの結果をAさんに返す

逆に**P2P**という仕組みは、中央にサーバーを置かずにクライアント同士で直接通信する仕組みのことを指します。また、一部の通話アプリ（例：Skypeなど）でもP2P技術が使われます。


### 2.コンパイラとインタプリタの違い

-コンパイラ（機械語に変換してから実行する）
-インタプリタ（実行しながら機械語に変換する）

プログラムを実行するためには、コンピューターにコードを機械語に変換して実行させる必要があります。コンピューターは、機械語に変換されていないコードをそのままでは実行できません。

ここでインタプリタとコンパイラという概念を覚える必要があります。
まずインタプリタは上から順にコードを読んでいきます。
インタプリタは実行時に逐次コードを解釈して機械語に変換しながら実行するため、事前にすべてのコードを変換する必要がありません。

逆にコンパイラは実行する前に機械語へ変換する必要があります。
インタプリタは実行しながらコードを読み込むため、即座に動作を確認しやすく、デバッグが容易です。一方で、コンパイラは実行前にコード全体を機械語に変換するため、実行時にはより高速に動作することが多いです。

しかし大規模なコードを実行するケースを考えてみましょう。
インタプリタでは、実行と機械語への変換を同時に行うため、時間が掛かります。
コンパイラなら機械語に変換してから実行するだけなので、実行時には手間が掛かりません。


### 3.IPアドレスとNAT＆DHCPの関係
IPアドレスはデバイスやWebサイトをホストしているサーバーに付与される番号です。

このIPアドレスを活用してネットワークと繋いで通信することができます。
IPアドレスに関連した用語でNATとDHCPも重要な役割があります。
NATは、ローカルIPアドレスをインターネット上で使えるグローバルIPアドレスに変換する仕組みで、DHCPはデバイスにIPアドレスを自動的に割り当てる仕組みです。

例えば、会社のネットワークでは、ルーターがあなたのコンピュータにローカルIPアドレスを自動的に割り当てます。この自動割り当ての仕組みをDHCPと呼びます。
ただしローカルのIPアドレスではインターネットに繋ぐことができません。
ルーターがNAT（ネットワークアドレス変換）を使って、ローカルIPアドレスをグローバルIPアドレスに関連付けてインターネット接続を可能にします。

### 4.URLを細分化する

例：[https://www.example.com]

#### ・HTTP
クライアントはサーバーに対してリクエスト情報を送ります。サーバーはそのリクエストに応じてレスポンスを返します。そのレスポンスには、HTML、CSS、JavaScriptなどのコンテンツが含まれています
サーバーからのレスポンスには、HTTPステータスコードが含まれます。ステータスコードの番号によって、リクエストが成功したのか、エラーがあったのかがわかります。

#### ・SSL/TLS、HTTPS
例えばAがデータを暗号化してBにそのデータを送ります。データを受け取ったBはそのデータを復号します。このやり取りは、SSL（またはTLS）を使って実現されます。HTTPで通信されるデータは暗号化されていないため、安全とは限りません。そのため、データを暗号化するためにHTTPSが使用されます。そのため認証局（CA）は、Webサイトが正当なものであることを確認し、その証明書（SSL/TLS証明書）を発行します。証明書が発行され、SSL/TLSが導入されていると、URLの「http」は「https」に変わり、暗号化された安全な通信が行われます。

#### ・ホスト名、DNS
IPアドレスだけ持っていても、数字が羅列された番号だけではとても分かりにくいです。そこでホスト名とIPアドレスを紐付けます。この仕組みをDNSと言います。URLではwww.example.comの部分がホスト名です。www.example.comにアクセスするとコンピュータはホスト名に紐付けられたIPアドレスを探します。このホスト名とIPアドレスの対応関係を管理し、ホスト名からIPアドレスへの対応付けを行うのがDNSの一部であるDNSサーバーです。DNSサーバーは、ホスト名に対応するIPアドレスを探し、その結果をコンピュータに返します。

つまり、[https://www.example.com]では、HTTPSが使用されており、暗号化された通信が行われていることがわかります。

続いてホスト名はwww.example.comです。
ホスト名とIPアドレスはDNSによって紐付けられています。[www.example.com]にアクセスすると、DNSサーバーでホスト名の名前解決(ホスト名とIPアドレスを対応付ける行為)を行い、対応するIPアドレスを探し、その結果をコンピュータに返します。

クライアントがリクエストを送信し、Webサーバーはそのリクエストに対するレスポンスを返します。サーバーの応答はHTTPステータスコードによって、成功したかエラーが発生したかが判明します。

### 最後に
ITから離れていたことでほとんど記憶が無くなっていました。薄れていたとういより、ガッツリ忘れていました。もしくは初めから理解していなかったか……。
自分で言語化してChatGPTに確認すると、修正の嵐で大変でした。
もっと基本から理解しないとダメですね泣
span要素の間に余白が挿入されるのを防ぐ

## span要素の動き

spanはソースコード上にある後続のスペースや改行を余白として反映してしまう。
例えば以下のように定義すると、間に余白が設定される。

#### ソースコード1
~~~html
<span>テスト文字１</span>
<span>テスト文字２</span>
~~~

#### 結果1
~~~html
テスト文字１ テスト文字２
~~~

余白を入れたくない場合は、以下のように定義をする。
#### ソースコード2
~~~html
<span>テスト文字１</span><span>テスト文字２</span>
~~~

#### 結果2
~~~html
テスト文字１テスト文字２
~~~

## htmlを動的に生成する場合
htmlを動的に生成する場合は、むしろ逆のパターンで、ソースコード2のようになるため、余白が設定されない。
余白を設定したい場合は、マージンを設定する。
~~~html
<span style="margin-right:3px;">テスト文字１</span><span>テスト文字２</span>
~~~
【OutSystems】Associate Reactive Developerサンプル問題の解説１１～１５

[前々回](https://qiita.com/Ishimaru_TEC/items/443d926f2fa837748a2e)、[前回](https://qiita.com/Ishimaru_TEC/items/160fe0d14cb3ffa4fe9c)の続き
実際のフローやプロパティの問いが多い。
処理の内容をしっかり見れば、解ける問題もあるのでそこは正解したい。


### 問題と解説

#### 問題１１
![image (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/1b7835de-6ad5-9153-5e2b-aa5167cf2500.png)

答え：D

解説：OptionsTextには、画面で表示したいテキストを指定する。
　BとDで迷うが、ListにGetCountries.Listが指定されているので、GetCountries.の指定は不要になる。

公式の解説
[画面でのデータ表示](https://learn.outsystems.com/ja-jp/training/journeys/web-developer-662/displaying-data-on-screens/o11/110)

#### 問題１２
![image (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/338b294f-85ea-dbe4-95b4-47d0d553437c.png)

答え：C

解説：ブロックは画面の部品のため、指定不可

公式の解説
[UI開発](https://learn.outsystems.com/ja-jp/training/journeys/web-developer-662/ui-development/o11/561)

#### 問題１３
![image (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/c67fd716-3eb8-fd8e-ac6b-c9b2485d047d.png)


答え：C

解説：
　Switchの各フローの処理は、下記の通り。
  　1. (N > 0)　0より大きい時、abs = Nとする
 　2. (N < 0)　0より小さい時、abs = -1 * Nとする
 　3. Otherwise　そのほかの場合、abs = 0とする

　アクションが０を返すケースはどれかと問われているので、
　abs = 0となるOtherwiseのフロー（N = 0）のケースが当てはまる。

　フローや計算系の問いは、-1、0、1･･のように具体的な値で計算すると良い。

公式の解説
[Switch](https://success.outsystems.com/ja-jp/documentation/11/reference/outsystems_language/logic/implementing_logic/logic_tools/switch/)

#### 問題１４
![image (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/9c5df7a8-dbd2-c699-2555-f791dbe23814.png)


答え：B

解説：GetEmployeeByIdアグリゲートの取得結果が0件の場合、GetEmployeeById.List.EmptyはTrueになる。
そのためIF分岐でRecordNotFound側に進み、RecordNotFoundの例外として処理される。

公式の解説
[例外](https://learn.outsystems.com/ja-jp/training/journeys/web-developer-662/exceptions/o11/356)

#### 問題１５
![image (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/99735015-6aba-771e-2060-10a6cb8f6400.png)


答え：A
解説：Functionプロパティを有効化する場合、出力パラメータは１つになる。
　![944b8e093130a594332a246eaacce499.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/71f07165-295c-c61d-9634-9150c4b5590a.png)

Functionプロパティを有効化する大きなメリットとして、式ウィンドウで呼び出しが可能となる。
　![2f6bcc66d4025e364d2948febf2102cd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882879/a5f748d6-06f2-3618-d2f5-d1a49bc35511.png)

公式の解説
[ロジックアクション](https://learn.outsystems.com/ja-jp/training/journeys/web-developer-662/logic-actions/o11/312)
mockito-inlineとPowerMockito の違い

Mockito-inline と PowerMockito は、どちらも Java のテストライブラリ Mockito の拡張機能ですが、目的や使い方に違いがあります。両方とも静的メソッドやコンストラクタのモックを可能にするものとして使われることが多いですが、いくつかの違いがあります。

## 1. Mockito-inline
Mockito-inline は Mockito フレームワークの一部として提供される「インラインモッキング」を実現するためのモジュールです。これにより、追加のツール（例: PowerMock）を使わずに、基本的なモッキングを超えた機能、たとえば final クラスやメソッド、静的メソッドのモッキングが可能です。Mockito-inline は、Mockito 2.1.0 以降で追加されており、インラインモッキングを有効にすると一部の制限されたクラスのモックが可能になります。

#### できること

・final メソッドやクラスのモック
・private メソッドのモック（リフレクションを使う必要はないが、通常は推奨されない）
・静的メソッドのモック（Mockito 4.0以降）
#### 利点

・シンプルで、特別なツールや複雑な設定は不要
・Mockito の最新機能に統合されている
#### 制限

・一部の高度なモッキング（クラスローダの制御など）は対応できない
## 2. PowerMockito (PowerMock)
PowerMockito は、より強力なモッキングフレームワーク PowerMock の一部であり、Mockito と統合されています。PowerMockito は、通常の Mockito では対応できない静的メソッドやコンストラクタのモックを実現するために開発されました。

#### できること

・静的メソッドのモック
・コンストラクタのモック
・プライベートメソッドのモック
・システムクラス（例: System, Thread）のモック
・クラスローダの制御によるより強力なモッキング
#### 利点

・非常に柔軟で、Mockito では対応できないケースにも対応可能
・静的メソッドやコンストラクタのモックが簡単
#### 制限

・セットアップが複雑
・PowerMockRunner などの特定のテストランナーや、`@PrepareForTest` アノテーションを使う必要がある
・テストのメンテナンスが難しくなる可能性がある

## まとめ

・同じことができるか？

一部の機能（例: 静的メソッドや final クラスのモック）は、両者で同じように扱えます。ただし、PowerMockito はより強力で、コンストラクタやシステムクラスのモックにも対応しており、Mockito-inline よりも高度なモッキングが可能です。

・どちらを選ぶべきか？

基本的には、シンプルで効率的なモックをしたい場合は Mockito-inline が推奨されます。より高度で複雑なモッキングが必要な場合、PowerMockito を選ぶのが良いでしょう。ただし、PowerMockito はセットアップが煩雑になる可能性があるため、注意が必要です。

## 追加情報(2024/11/21)

PowerMock の開発は事実上停止している状況です。GitHub 上の Issue や最新のリリース履歴を見ても、PowerMock は以下のような課題を抱えています：

#### Mockito 4.x 以降との互換性が公式にリリースされていない
一部の PR がマージされていますが、リリースとして提供されておらず、直接依存するのはリスクがあります。

#### JUnit 5 への公式対応がない
PowerMock は JUnit 4 に依存しており、JUnit 5 での動作が保証されていません。JUnit 5 に移行したい場合には、PowerMock を使い続けるのは現実的ではありません。

#### 保守が停止している
開発者からの公式コメントの通り、今後の機能追加やバグ修正が期待できない状態です。
https://github.com/powermock/powermock/issues/1117#issuecomment-1477349245

#### PowerMock の公式対応範囲

最新バージョン: PowerMock 2.0.9（2020年11月リリース）
Java バージョン対応状況:
Java 8: 完全対応
Java 9 ～ Java 11: 対応（ただしモジュールシステムに限定的な対応）
Java 12 ～ Java 17: 公式にサポート外（一部で動作するケースはあるが保証されない）

#### まとめ

PowerMock を使い続けることは推奨されません。代替手段を考慮し、テスト戦略を見直すことを強くお勧めします。
IPA SC(情報処理安全確保支援士試験)勉強(4)

[前回](https://qiita.com/ib_tech/items/b1eb3fd8fb14eb2278c3
)

## 目的
過去2回落ちているSC。また申し込んでしまったが勉強とにかく面白くない。ので勉強をしている記事を書くことで何とか向き合おうとするための勉強用ノート。

とりあえず家にあったこれに沿ってやっていく。なお家にあったのは2021年版。2024年版を買っていない辺りにやる気のなさが表れている。

https://www.amazon.co.jp/2024-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E5%AE%89%E5%85%A8%E7%A2%BA%E4%BF%9D%E6%94%AF%E6%8F%B4%E5%A3%AB%E3%80%8C%E5%B0%82%E9%96%80%E7%9F%A5%E8%AD%98%EF%BC%8B%E5%8D%88%E5%BE%8C%E5%95%8F%E9%A1%8C%E3%80%8D%E3%81%AE%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96-%E4%B8%89%E5%A5%BD%E5%BA%B7%E4%B9%8B/dp/4865753176/ref=pd_lpo_sccl_1/356-7197981-9101905?pd_rd_w=tXLtr&content-id=amzn1.sym.855d8f70-df76-4181-80b0-56e48ae3bb9b&pf_rd_p=855d8f70-df76-4181-80b0-56e48ae3bb9b&pf_rd_r=B1QP83MW785GM40MVPWW&pd_rd_wg=pPWGE&pd_rd_r=e6a281d7-6536-46b3-bca0-ee96266216a2&pd_rd_i=4865753176&psc=1

## 勉強開始

### 演習問題2
[H26秋期午後Ⅱ問1](https://www.ipa.go.jp/shiken/mondai-kaiotu/ug65p90000000ye5-att/2014h26a_sc_pm2_qs.pdf)

設問1 (1) 認証cookie
　　　(2) アジアポータル
   　 (3) 依頼元が正しい社員なのか、IDとパスワードは人事システムと一致しているのか確認せずに登録されるおそれがある
設問2 (1) 認証cookieの検証時にエージェントを呼び出すようにカスタマイズする
　　　(2) GDSと各地域のDSの間に信頼関係を結ぶ
　　　(3) 日本と欧米で重複しているIDが存在している
設問3 (1) 人事システムに登録された全員が利用者ではないから
　　　(2) 日本DS、欧米DS1、アジアLDS
設問4 日本　日本認証サーバ
設問5 (1) VPNパスワード、OTPトークン
　　　(2) エージェントが正しく動作するか
   　 (3) わからん
設問6 (1) 日本
　　　(2) wakarann

### 解説を読んで
訳分かんなかった。意味分からなすぎてイライラする。本当に受けるんか？？


## 勉強終了
は～～（クソデカため息）

## 次回
PKI
【ProxmoxVE】監視に関する検討

[【ProxmoxVE】snmpdの導入と設定](https://qiita.com/i_bushclover/items/8b91035ada26444749ab)
[【ProxmoxVE】rsyslogの導入と設定](https://qiita.com/i_bushclover/items/90388ac7955cbeaed9a6)
の2つの記事で紹介した通り、無事ProxmoxVEにrsyslogとsnmpdを導入することができたので、ProxmoxVEの監視に関する考えをまとめてみます。
本番環境を想定し、Zabbixなどの監視マネージャとの連携を前提とした内容になります。

### 監視マネージャとの連携の必要性について
なぜ監視マネージャとの連携を前提とするかですが、ProxmoxVEだけでなくNW機器その他もろもろを監視することを考えるとなにかしらの監視マネージャでまとめて監視できたほうが都合がよいと思うためです。
また、既存システムの更改でProxmoxVEを導入する場合、すでに利用する監視マネージャや監視運用方法が決まっている場合もあるかと思います。

### rsyslogについて
監視だけでなく、ログを保管するという観点でも導入するのが良いと思います。環境によっては「ログを一定期間保管すること」、や「ログを外部保管すること」が求められることもありますので、そういった場合は導入必須となるでしょう。
監視としては、監視マネージャ側の機能にもよりますが、
・転送されたsyslogメッセージを監視対象とする
・転送されたログをいったんファイルへ出力し、そのログファイルを監視対象とする
のどちらの方法も可能です。

また、ProxmoxVEへ独自スクリプトなどを導入する際も、出力したいメッセージをloggerコマンドで出力してあげれば連携対象になるというのも利点です。

### snmpdについて
リソース監視として有用だと思いますので、こちらも導入するのが良いと思います。
やりようによってはrsyslogだけでも足りるかもしれませんが、CPU使用率・メモリ使用率その他もろもろsnmpで取得できる情報は多いですし、監視マネージャ側にsnmp監視のテンプレートがあることも多いです。

ただし、snmpd導入の記事にも書いた通り、ルートパーティションの使用率が正しい値にならないこと、Ceph利用時はCephディスク情報も取得できないことから、ディスク関連の情報はsnmpではなく別途スクリプト等を用意してあげる必要があります。

### rsyslogとsnmpd以外について（snmptrap）
私がかかわってきたシステム運用ではsnmptrapもよく利用されていますが、あえてProxmoxVEにsnmptrapdを導入してtrap連携するところまではしなくてもよいと考えています。
もちろんやってもいいと思いますし、ちゃんと設定できれば便利そうですが、こちらの記事「[LinkUp/Down の snmptrap を送信する。](https://qiita.com/Ki2neudon/items/c9729929593d9a4b93f3)」を見て、Linuxにsnmptrapdを導入・設定して期待しているエラーをすべて検知するというのは、Trap送信可能なメッセージの精査とそこから実際に検知したいメッセージの洗い出しが大変そうだなと感じました。（なので検証してません。。）
HW監視としては、iLOやiDRACなどの管理ポートが搭載されている機器であればそちらを使えばいいと思いますし、そうでなければsyslogで十分かなと思います。
Javaで「UnrecoverableKeyException」エラー

Javaでの「UnrecoverableKeyException」エラーは、一般的にキーストア（Keystore）やトラストストア（Truststore）から秘密鍵や証明書を取得しようとする際に、パスワードが不正確な場合に発生します。このエラーは、以下のような原因によって引き起こされることが多いです。

## 主な原因:
#### 1. キーストアまたはトラストストアのパスワードが間違っている
キーストアファイル（例: .jks や .p12）にアクセスする際に使用するパスワードが誤っていると、秘密鍵を読み取ることができず、このエラーが発生します。

#### 2. エントリのパスワードが間違っている
キーストア内の個々のキーや証明書エントリには、キーストア自体とは別のパスワードが設定されていることがあります。キーストアのパスワードが正しい場合でも、特定のエントリを読み取るためのパスワードが間違っていると、同様にエラーが発生します。

#### 3. キーストアが壊れている
キーストアファイルが破損していたり、フォーマットが正しくない場合も、このエラーが発生する可能性があります。

#### 4. Javaのバージョンやプロバイダの問題
使用しているJavaバージョンやセキュリティプロバイダ（例: BouncyCastleなど）に問題がある場合も、稀にこのエラーが出ることがあります。

## 対策:
#### 1. パスワードの確認
キーストアおよびエントリのパスワードが正しいことを再確認してください。パスワードが暗号化されている場合や、環境変数などから取得されている場合、それが適切に設定されているかを確認します。

#### 2. キーストアの再作成
キーストアが破損している可能性がある場合、新たにキーストアを作成してみて、正しい鍵や証明書をインポートして試してみてください。

#### 3. デバッグログの確認
-Djavax.net.debug=all のオプションを使用して、SSLやキーストア関連のログを詳細に確認することで、問題の特定ができることがあります。

#### 4. Javaのバージョンや設定の確認
使用しているJavaバージョンやセキュリティ設定が正しいかを確認し、場合によってはアップデートやプロバイダの変更を検討してください。

これらのポイントを確認して、パスワードやキーストアの設定が適切かどうか確認すると良いでしょう。
Kali Linuxのデフォルトターミナル(QTerminal)のフォントを変更する

# はじめに
Kali LinuxはデフォルトでQTerminalが使われているのですが、フォントをインストールしてもQTerminalの設定では選択できなかったのでその対応方法を記録します。

# 環境
- OS：Kali Linux 2024.3

# 手順
## 使用するフォントのインストール
今回は[PlemolJP](https://github.com/yuru7/PlemolJP)をインストールしていきます。フォントによっては`apt install`だけでインストールできるのですがこのフォントは別途対応が必要です。

```bash
# PlemolJP NFのダウンロード
wget https://github.com/yuru7/PlemolJP/releases/download/v1.7.1/PlemolJP_NF_v1.7.1.zip

# PlemolJP NFの解凍
unzip PlemolJP_NF_v1.7.1.zip

# PlemolJP NF用のディレクトリを作成してフォントを移動
sudo mkdir -p /usr/local/share/fonts/PlemolJP_NF

# すべての .ttf ファイルを再帰的に検索してコピー
sudo find PlemolJP_NF_v1.7.1 -name "*.ttf" -exec cp {} /usr/local/share/fonts/PlemolJP_NF/ \;

# フォントキャッシュの更新
sudo fc-cache -fv

# インストールの確認
fc-list | grep "PlemolJP"
```

## QTerminalの設定変更
:::note warn
注意
QTerminalを開きっぱなしにしていると設定が反映されないため閉じてから作業を進めてください。
:::

ファイルマネージャー（Thunar）を起動し「表示」から「隠しファイルを表示」を選択します。
![2024-09-26_QTerminal_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629032/d2ed1adf-c30f-f6d4-d862-e80c2ca45d94.png)

隠しファイル（.configなど）が表示されていることを確認します。
![2024-09-26_QTerminal_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629032/60bfd48c-e303-4c06-478f-7b7a32afee21.png)

`~/.config/qterminal.org/qterminal.ini`を開きます。
![2024-09-26_QTerminal_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629032/bbda5327-f94d-06da-40f2-80b2efc3945f.png)

「fontFamily」に使用するフォント（今回は`PlemolJP Console NF`）を記載します。
![2024-09-26_QTerminal_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629032/3d2adf08-7bfb-5f31-f329-4545da7f9357.png)

このファイルを保存して改めてQTerminalを表示するとフォントが変更されていることが確認できます。