OmniAICreator/Qiita-1.07M huggingface dataset:
【ASUS PC】モニターが “No signal” 表示 & 画面の明るさ調整が効かないトラブルを解決

***

## 【ASUS PC】モニターが “No signal” 表示 & 画面の明るさ調整が効かないトラブルを解決！

先日、愛用している ASUS の PC で、以下のような症状に見舞われました。

*   **外部モニターに「No signal」と表示され、映らない**
*   **Windows の明るさスライダーや Fn キーでの調整に反応しない**

突然のことで焦りましたが、**ASUS の公式サイトから最新のグラフィックドライバーを上書きインストール** したらあっさり解決！\
この記事では、その時の手順とポイントをシェアします。

***

### どんなトラブルだったの？

*   **No signal で外部モニターが認識されない**
*   **画面の明るさを調整しても全く変わらない**

いろいろ調べた結果、どうやら **グラフィックドライバーが正しく動作していない** ことが原因っぽいと判明しました。\
OS のアップデートやソフトの競合などで、ドライバーに不具合が出たのかもしれません。

***

### 解決：ASUS 公式サイトからドライバーを再インストール

今回の症状は、以下の作業でスムーズに改善しました。

1.  **ASUS 公式サイトで最新ドライバーをダウンロード**
    *   [ASUSサポートダウンロードセンター](https://www.asus.com/jp/support/download-center/) で、PCの型番を入力。
    *   グラフィックドライバー（Intel / NVIDIA / AMD など）を見つけて、最新バージョンを入手。

2.  **ドライバーを「上書きインストール」**
    *   事前に古いドライバーをアンインストールしなくても、最新ドライバーのインストーラーを起動するだけでOKでした。
    *   インストール時に出るウィザードに従って操作し、完了後は念のため再起動。

3.  **PCを再起動して動作確認**
    *   再起動後、No signal だったモニターが普通に表示されるように！
    *   画面の明るさスライダーも正常に機能するようになりました。

***

### ドライバー再インストールのコツ

*   **公式サイトのドライバーを使う**\
    サードパーティ製のドライバーは使わず、必ず ASUS 公式 or GPUメーカーの公式からダウンロードしましょう。
*   **再起動を忘れずに**\
    インストールしただけで反映されない場合があるので、再起動して反映されるか確認します。

***

### まとめ

*   突然モニターが「No signal」になったり、Windows の明るさ調整が効かなくなったら **グラフィックドライバーの再インストール** を試してみる。
*   古いドライバーをアンインストールしてから入れ直す方法もありますが、今回のケースでは **上書きインストールだけで問題なく解決** できました。
*   その後は再起動すれば正常に戻る可能性が高いです。

もし同じような症状でお困りの方がいれば、ぜひお試しください。\
少しでもお役に立てれば嬉しいです！
Flask+MySQLでDocker環境を構築

## 概要

このドキュメントでは、FlaskとMySQLを使用したWebアプリケーション開発環境をDockerで構築する手順について説明します。また、この環境をCloudRunにデプロイすることを視野に入れています。

## 開発環境
- **フレームワーク**: Flask (Pythonベース)
- **データベース**: MySQL

## ディレクトリ構成
プロジェクトのディレクトリ構成は以下のようになっています：

```
├─backend
|   ├─controllers
|   |   ├─index.py       # メインページの処理
|   |   ├─quiz.py        # クイズページの処理
|   |   └─result.py      # 結果ページの処理
|   ├─data               
|   ├─gpt                
|   ├─static
|   │  ├─js            
|   │  └─style          
|   ├─templates          
|   ├─__init__.py        
|   ├─Dockerfile         # Flaskアプリ用Dockerfile
|   └─model.py           
├─docker-compose.yml      # Docker Compose設定ファイル
├─.env                    # 環境変数設定ファイル
└─run.py                  # アプリケーションエントリーポイント
```

## ファイル詳細

### `Dockerfile`
Flaskアプリケーション用のDockerfileです。

```Dockerfile
FROM --platform=$BUILDPLATFORM python:3.10-alpine AS builder

WORKDIR /code

# 必要なライブラリをインストール
RUN apk add --no-cache gcc musl-dev mariadb-connector-c-dev

# Pythonライブラリをインストール
COPY requirements.txt /code/
RUN --mount=type=cache,target=/root/.cache/pip pip3 install -r requirements.txt

# アプリケーションコードをコピー
COPY . .

# アプリケーションの起動に必要な環境変数を設定
EXPOSE 8000
ENV FLASK_APP=run.py
ENV FLASK_ENV=development
ENV PYTHONPATH=/code

FROM builder AS dev-envs
RUN apk add --no-cache git

CMD ["flask", "run", "--host=0.0.0.0", "--port=8000"]
```

### `docker-compose.yml`
FlaskアプリケーションとMySQLデータベースを構成するDocker Compose設定です。

```yaml
services:
  db:
    image: mysql:8
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: my-secret-pw
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASS}
    expose:
      - "3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-p${DB_PASS}"]
      interval: 5s
      retries: 5
      start_period: 30s

  backend:
    build:
      context: ./backend
      target: dev-envs
    env_file:
      - .env
    ports:
      - "8000:8000"
    volumes:
      - .:/code
    depends_on:
      db:
        condition: service_healthy
    environment:
      - PYTHONPATH=${PYTHONPATH}  
    command: flask run --host=0.0.0.0 --port=8000
```

### `.env`
アプリケーション全体で使用する環境変数を管理します。

```
DB_NAME=example_db
DB_USER=example_user
DB_PASS=example_password
PYTHONPATH=/code
```

### `run.py`
Flaskアプリケーションのエントリーポイント。

```python
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return "Hello, World!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)
```

## 手順

### 1. 環境変数の設定
`.env`ファイルを作成し、必要な環境変数を設定します。

### 2. Docker Composeでコンテナを起動
以下のコマンドでコンテナをビルドして起動します。

```bash
docker-compose up --build
```

### 3. 動作確認
ブラウザで`http://localhost:8000`にアクセスし、無事動作しました｡
cannot lock ref 'refs/heads/...': 'refs/heads/...' exists; cannot create...の解決法

## 本文
備忘録なので簡単にまとめる

新たにブランチを作ろうとしたところエラーとなってしまった
```bash
$ git checkout -b test/single-choice-answer
fatal: cannot lock ref 'refs/heads/test/single-choice-answer': 'refs/heads/test' exists; cannot create 'refs/heads/test/single-choice-answer'
```

原因としては、testというブランチがすでにいることである。

```bash
$ git branch
  feature/add-exam-metadata
  feature/export-exam-as-zip
  feature/improve-exam-index-page
* main
  test
```

test/hogeとするように階層を作成しようとすると、実際にはすでにtestというブランチがいるため、新たに階層上に作成できないようだ

既に利用しないブランチである場合は削除すると解決できる。
もしくは作成する側を「-」でつなぐなどつなぐことで対処可能である。

## ひとこと
普段は、「-」でつなぐ派であったため初めてのエラーが出てびっくりした
【Sequel Ace】DBをアプリで確認する方法

# 記事概要
Sequel Aceアプリの使用方法をまとめる。

# 前提
- Sequel AceアプリをPCにインストールしている
- アプリで表示するデータベースはローカル環境で作成済みである

# 手順
1. Sequel Aceアプリを起動する
1. 下記のように設定を行う
    - `TIC/IP`タブを選択する
    - `Host`に「localhost」と入力する
    - `Username`に「root」と入力する
1. Connectボタンをクリックする
    [![Image from Gyazo](https://i.gyazo.com/77b110d7c33c1f3226865e7b87d65289.png)](https://gyazo.com/77b110d7c33c1f3226865e7b87d65289)
1. 「データベースを選択」をクリックする
    [![Image from Gyazo](https://i.gyazo.com/92ece61ceb1f3dae911118d109b45763.png)](https://gyazo.com/92ece61ceb1f3dae911118d109b45763)
1. 表示したいデータベースを選択し、保存済みデータが表示されることを確認する

# 備考
- Sequel Aceアプリのインストール方法は、[こちら](https://qiita.com/likapantrip/items/ac9b3c9262316213d259#手順10sequel-ace)を参照
250105_no Java in Android Studio

1.no Java in Android Studio
2.新建项目的时候无法选择Java语言，创建出来的是kotlin项目
3.新しいプロジェクトを作成する際に、Java言語を選べなくて、作成したプロジェクトはKotlinプロジェクトになって、「Android StudioでJavaが使えない」となっている。


1.Solution: When creating a new project, do not select "Empty Activity" (it will default to Kotlin and you won't be able to choose Java).
Instead, choose either "No Activity" or "Empty Views Activity" to create the project. The former has no activity, while the latter comes with a default main activity.
2.解决：
新建project的时候不要选Empty Activity(会启用kotlin, 无法选择java);
可以选择No Activity或Empty Views Activity来新建项目。
No Activity没有activity。
Empty Views Activity有默认的main acitivty.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978218/43b1fbcb-c7d5-8914-aab5-d350b807bb35.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978218/c7c50f2d-b6f3-ffc1-a842-f506708b268a.png)
3.解決策：
新しいプロジェクトを作成する際に「Empty Activity」を選ばないようにしましょう（これを選ぶとKotlinがデフォルトで有効になり、Javaを選べなくなります）。
代わりに、「No Activity」または「Empty Views Activity」を選んでプロジェクトを作成します。前者はアクティビティがなく、後者はデフォルトでメインアクティビティが含まれています。
【React + TypeScript + Vite】デジタル名刺アプリの作成からデプロイまで

## はじめに
デジタル名刺を登録しシェアできるアプリの開発を行いました。

自己紹介やGitHub,Qiita,Xへのリンクを登録・閲覧することが可能です。

今回の開発では、中間テーブルを用いた多対多のリレーションやReact Routerを用いたルーティング、レコードの登録・削除のトランザクション処理、GitHub Actionsのクーロンジョブで定期的にテーブルのレコードを削除するなど新しいスキルの獲得にも挑戦しました。

今回開発したアプリと内容をご紹介します。

## 開発の流れ
1. React + TypeScript + Viteでプロジェクトを作成
1. Supabaseに中間テーブルを用いた多対多のリレーションテーブルを作成
1. アプリの機能を作成し、Chakra UI V3でUIをスタイリング
1. Jest + React Testing LibraryでCIを作成
1. Firebaseでデプロイ + GitHub ActionsでCICDパイプラインを作成

## 完成したアプリ
TOPページ
![スクリーンショット 2025-01-05 18.43.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289947/bceb525b-1249-b6e7-4f8a-70d40c64b038.png)

新規名刺登録画面
![スクリーンショット 2025-01-05 18.44.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289947/181b1b9f-acb3-9e3f-1e01-e1792273e79d.png)

※ React Hook Formを使用しており、必須項目にはバリデーションがかかります
![スクリーンショット 2025-01-05 19.11.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289947/566cddeb-1c89-6a32-042a-d08cf43ea7e1.png)

名刺詳細ページ
* TOPページからIDを入力して閲覧可能
* GitHubなどの各リンクへ遷移可能
![スクリーンショット 2025-01-05 18.45.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289947/3c30b480-a44f-3e07-7aaa-d0748afb437f.png)

GitHub Actionsのクーロンジョブを設定し、毎朝6時に前日の名刺データを削除する設定にしています。

## 開発で苦労した・学んだ点
以前TODOアプリを作成した時の感想とも重複していますが、Chakra UI V3がまだ安定版ではないので、buildやJestのテストを実行した際に型のエラーが多発した点が最も苦労した気がします。

型エラーが出ないように型の定義を合わせたり、どうしても解決できない箇所は型チェックを無視させるその場しのぎの対応になってしまいました。

次回のアプリ開発では現時点の安定版であるChakra UI V2を使おうと思いました。

DBはSupabaseを使いましたが、Supabaseで中間テーブルを用いた多対多の設定をGUI上で行ったり、トランザクション処理の際はSupabase上でPostgreSQLの構文を使ってトランザクションのメソッドを作成しフロントエンドで呼び出すなどの処理の仕方を覚えることが出来て、バックエンドの知識も増やすことが出来ました。

React Routerのルーティングを使うことでページ遷移が出来てより実用的なアプリになったと思います。

GitHub Actionsのクーロンでバッチファイルを実行させる設定では、ts-nodeではなくtsxでTypeScriptのバッチファイルを実行させたり、環境変数の読み込ませ方にも注意したりと色々と知識を増やすことが出来ました。

## まとめ
以前開発したTODOアプリでは単一のページを使ったアプリでしたが、今回はルーティングや多対多のリレーションテーブルを使うことでより実用的なアプリを開発することが出来て良かったです。

新しい技術を使うことにより、未知のエラーに遭遇することも増えましたが自身の引き出しを増やしているんだと思ってこれからも頑張っていきたいです。

次の開発では、よりユーザーの課題を解決できるようなアプリ作成を目標に挑戦していきたいです。

## JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてください！
▼▼▼

https://projisou.jp
Raspberry PiでC#（ASP.NET）のWebアプリを動かす

## やりたいこと
開発マシン（PC）で作ったASP.NETのWebアプリをRaspberry Piで動かしたい。

## 技術的要件
#### ソフト
- Webアプリ：C#(ASP.NET)

#### ハード
- 開発マシン：Windows PC
- サーバーマシン：Raspberry Pi 3B

## 手順
### 開発用PC：ASP.NETアプリを発行する
Visual Studio等を使用して、新しいASP.Netプロジェクトを作成する。
基本的なコーディング以外に下記の2点を行う。

#### ルーティング設定
同ネットワーク内のPC・スマホからRaspberryPiにアクセスするため、IPアドレス0.0.0.0にサーバーが立ち上がるように設定する。
※ポート番号はWebアプリが立ち上がるポートに合わせる。

```sql 
var builder = WebApplication.CreateBuilder(args);

// raspi用に追加
builder.WebHost.UseUrls("http://0.0.0.0:44400");
```

#### 発行
1. プロジェクトを右クリック＞発行
1. ターゲット：フォルダ を選択後、完了
1. すべての設定を表示＞ターゲットランタイム：linux-arm を選択![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/36d28f38-e9a7-8722-659c-e59d26f878bd.png)
1. 保存後、発行

### Raspberry Pi：dotnetコマンドのインストール＆実行
#### dotnetダウンロード
.Netのダウンロードページ(https://dotnet.microsoft.com/ja-jp/download/dotnet) から、対応するバージョンのバイナリ(Arm32)をダウンロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/48008f6c-3dac-5e03-107f-5c57c77087a1.png)
ブラウザからダウンロードするか、以下のようにwgetコマンドを使う。 
```
wget https://download.visualstudio.microsoft.com/download/pr/4b1d565b-7a3d-4e7e-87ad-7c662ec59020/4c6cb8a150efb42f7cea7e0b4c2f61cf/dotnet-sdk-7.0.410-linux-arm.tar.gz
```
解凍する。
```
tar xvfz  dotnet-sdk-7.0.410-linux-arm.tar.gz
```
dotnetコマンドが実行可能であることを確認する。
```
[解凍したフォルダ]/dotnet --version
```
#### 実行ファイルをRaspberry Piに転送する
開発マシンで発行した実行ファイルをRaspberry Piに転送する。
1. bin＞Releaseフォルダ配下のPublishフォルダをzip化する
1. TeraTerm の ファイル＞SSH SCP でzipファイルをRasPiのフォルダに転送する。
1. RasPi側でunzipコマンドを使ってzipファイルを解凍する。

#### Raspberry Piで実行する
dotnetコマンドを使用して実行ファイル(.dll)を実行する。
```
[解凍したフォルダ]/dotnet XXXXX.dll
```

PCからアクセスできることが確認できた！

## 参考にさせて頂いた記事
[Raspberry Pi で .Net を使う](https://qiita.com/ekzemplaro/items/f4eea6d7587dd9841afb)
[ASP.NET Core webアプケーションを公開する](https://qiita.com/takmot/items/ce3b6780e4e58c17d1a4)
Kaggleで「Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.」が出る場合

Kaggle Notebookを開こうとしていて、
「Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.」
「NotFoundError: Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.」と出ていて、
無駄に時間を過ごしていました…


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954816/22a7926c-3e0c-da0f-66f3-84859e2c1a7f.png)


「**Edge**」であれば開けました。
~~Chrome以外のブラウザであれば開けるのかもしれません~~
Chromeの場合、拡張機能が関係していそうです

変に時間を使ってしまったため、
念のため、記事として残しておきます。
間違って上げたenvファイルをコミット履歴からも消去する


# 問題
.envファイルを間違えてGitHubにあげてしまいました。
.envファイルは消したものの、過去のコミット履歴に情報があるのはよくないので、消したいです。

# 解決方法
基本ドキュメント通りですが、少しはまった箇所がありました。

リポジトリからの機微なデータの削除
https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository


git-filter-repoのインストール
```
xxxyyy@MacBook-Air-2 % brew install git-filter-repo
```

リポジトリのクローンを作成(最初、元々の作業ディレクトリの中にクローンを作成したが、デスクトップなど、元々のreposiitory_nameの作業ディレクトリとは別のディクトリが良さそう)
```
xxxyyy@MacBook-Air-2 % git clone --mirror https://github.com/github_name/reposiitory_name.git
```

クローンしたプログラムのディレクトリに移動
```
xxxyyy@MacBook-Air-2 % cd reposiitory_name.git
```

リポジトリの全てのコミット履歴から.envファイルが削除。これにより、過去のコミット履歴に含まれていた.envファイルの情報も完全に削除される。
```
xxxyyy@MacBook-Air-2 reposiitory_name.git % git filter-repo --path .env --invert-paths
```

.envファイルが含まれているコミットから、該当ファイルが削除されているか確認
```
xxxyyy@MacBook-Air-2 reposiitory_name.git % git log --stat
```

.envファイルが含まれているコミットが存在しないことを確認
```
xxxyyy@MacBook-Air-2 reposiitory_name.git % git log --all --pretty=format:'%H' --name-only | grep '.env'
```

.envファイルの履歴を表示。履歴が表示されない場合、.envファイルが削除されている
```
xxxyyy@MacBook-Air-2 reposiitory_name.git % git log --follow -- .env
```

forceで上げようとしたところ、エラーになった
```
xxxyyy@MacBook-Air-2 reposiitory_name.git % git push origin --force --all
fatal: 'origin' does not appear to be a git repository
fatal: Could not read from remote repository.
```

remoteとの接続を確認したところ、接続がなかった
```
xxxyyy@MacBook-Air-2 reposiitory_name.git % git remote -v
```

remoteを設定
```
xxxyyy@MacBook-Air-2 reposiitory_name.git % git remote add origin <リモートリポジトリのURL>
```

forceで上げることができた
```
xxxyyy@MacBook-Air-2 reposiitory_name.git % git push origin --force --all
```

# おわりに
便利なツールがあってありがたいです。
個人開発だったのでそれほど大変ではなかったですが、複数人で開発していたら大変そうです。
気をつけます。

# 参考
リポジトリからの機微なデータの削除
https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository
EC2へのSSH接続の際に聞かれる質問の意味

```
ssh -i "<SECRET>.pem" ec2-user@<INSTANCE-ID>.compute.amazonaws.com
The authenticity of host '<INSTANCE-ID>.compute.amazonaws.com (<IP-ADDRESS>)' can't be established.
ED25519 key fingerprint is SHA256:<FINGERPRINT>.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? 
```

この質問に安易に「yes」と答えていませんか？

これから、この警告メッセージの意味と、確認せずに「yes」と回答することのセキュリティリスクについて解説します。

まず、この警告の意味について説明します。

**これはSSHのホスト認証に関する警告メッセージです。**

ホスト認証とは、接続しようとしているサーバーが正当なサーバーであることを確認するためのセキュリティメカニズムです。

このメッセージを適切に検証するためには、接続先サーバーの管理者に連絡を取るか、直接サーバーにアクセスして、サーバーの公開鍵フィンガープリントを確認する必要があります。

Linuxシステムでは、SSHのホスト鍵は`/etc/ssh`ディレクトリに保存されています。

標準的なLinuxサーバーには以下のようなSSH関連ファイルが存在します：

```
ls /etc/ssh
moduli  ssh_config  ssh_config.d  ssh_host_ecdsa_key  ssh_host_ecdsa_key.pub  ssh_host_ed25519_key  ssh_host_ed25519_key.pub  sshd_config  sshd_config.d
```

EC2インスタンスでは、２種類のキーペアが作成されました。これは、SSHクライアントとの互換性確保のためです。

- ED25519: 最新の高速で安全な暗号化アルゴリズム。多くの現代のSSHクライアントでサポート
- ECDSA: より広く普及している従来のアルゴリズム。互換性のために維持

サーバー側でED25519公開鍵のフィンガープリントを確認するには：

```
$ ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub
256 SHA256:<FINGERPRINT> <HOSTNAME> (ED25519)
```

このフィンガープリントが、SSHクライアントが表示したものと一致することを確認します。

## 検証をスキップすることのリスク

ホスト認証を適切に行わない場合、中間者攻撃（Man-in-the-Middle attack）の危険性があります。

中間者攻撃の一般的な手順：

1. 攻撃者がDNSポイズニングなどの手法で、正規サーバーへの通信を攻撃者のサーバーに誘導
2. 初回接続時や`known_hosts`が削除されている場合、適切なホスト認証なしでは不正なサーバーとの接続が確立される可能性がある

## 補足情報

`/etc`ディレクトリは、Linuxシステムのグローバルな設定ファイルを格納する標準ディレクトリです。これはFilesystem Hierarchy Standard (FHS)で定められています。

SHA256は暗号学的ハッシュ関数の一種で、入力データを256ビットの固定長出力に変換します。同じ入力に対して常に同じハッシュ値が生成されます。

## 参考文献

https://zenn.dev/isosa/articles/d68586bc2a7f17
perlのdo{}whileでつまづいたこと

# はじめに
以前、perlのdo{}while実装をした時に変数スコープでつまづいたことを思い出しながら記事に残していこうと思います。また、前々から記憶の取り出しが苦手だなーと思っていたので、今回からちょこちょこコーネルメソッドを意識して書いていきたいなと思っています。
(コーネルメソッドについてはぜひ調べてみてください)

# Cue
Perlのdo{}while実装時に変数スコープでつまづいたことは？

# Note
### perlのdo{}whileについて
- 一度は必ず関数内の処理が実行され、その後にwhile条件の評価がされる。
- whileの条件が一番最後に来るので、少し可読性が落ちる...ような気がしています。
- また、last, nextなどの機能が正しく働かない場合もあるので非推奨としているサイトもある。(いつもお世話になっているperlゼミさん)

### do{}while関数、evalの変数スコープ
- 変数`$result`はdo{}whileブロック外で宣言しないと、スコープ外のためwhileの評価の時に参照できない。このため、`$result`はdo{}while関数の外で宣言する必要がある。
- evalブロックで宣言された変数`$commit_result`もeval外で参照不可。このため`$commit_result`はeval外で宣言する必要がある。
```perl
do {
	eval {
		my $sql = "SELECT name FROM $table_name WHERE delete_flg = 0";
		my $result = $self->db->executeSql($sql);
		my $commit_result = $self->db->commit();
	};
	if ($@) {
		$self->logger->fatal("Execution Error: $@");
		die "Cannot get data from $table_name\n";
	}
     #ERROR $commit_result
	if ($result < 0 || $commit_result < 0) { 
		$self->logger->fatal($self->db->getErrMsg());
		die "Cannot get data from $table_name\n";
	}
 #ERROR $result
} while ($result > 0);
```
### 解決方法
```perl
my $result;
my $commit_result;
do {
	eval {
		my $sql = "SELECT name FROM $table_name WHERE delete_flg = 0";
		$result = $self->db->executeSql($sql);
		$commit_result = $self->db->commit();
	};
	if ($@) {
		$self->logger->fatal("Execution Error: $@");
		die "Cannot get data from $table_name\n";
	}
	if ($result < 0 || $commit_result < 0) { 
		$self->logger->fatal($self->db->getErrMsg());
		die "Cannot get data from $table_name\n";
	}
} while ($result > 0);
```

# Summary
- evalブロック内で宣言した変数は、外から参照することはできない。
- do{}while関数は必ず一回は実行され、最後に評価が行われる。また、評価に利用される変数はdo{}while関数外に宣言する必要がある。

# 最後に
普段あまりdo{}whileを使う選択をしないので、変数のスコープなど再度意識する良いきっかけになりました。
参考になれば幸いです🍏

### 参考

https://www.kent-web.com/perl/chap5.html

https://perlzemi.com/blog/20171225151420.html
【TyeScript】never型の概要

# はじめに
この記事では、TypeScript の never型の概要を記載します。

# never型とは
never型は、値を持たないことを示す型です。

「値を持たない」の具体例としては、以下のような例が挙げられます。

## 必ずエラーが発生する関数

```sample.ts
function throwError(message: string): never {
  throw new Error(message);
}
```

## 終了しない関数

```sample.ts
function infiniteLoop(): never {
  while (true) {
      // Infinite loop
  }
}
```

## 作り得ない型

```sample.ts
type NumberString = number & string;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/d699e67b-2a81-a0ea-e81c-fb0a0331c16f.png)


# never型への代入 / never型の代入
never型にはnever型以外の値を代入することはできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/ee956b46-7bee-88e7-00a0-d00eb6ac4530.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/44df056b-671b-080e-0511-d4fca9bfe262.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/b6ed3984-2552-ca3e-2e6b-61947fee963a.png)

一方、never型はどんな型にも代入できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/8d15ba59-0471-79c1-e4bd-2ef138f9ba93.png)


# 参考
- [never](https://www.typescriptlang.org/docs/handbook/2/functions.html#never)
- [never型](https://typescriptbook.jp/reference/statements/never)
- [Type Compatibility](https://www.typescriptlang.org/docs/handbook/type-compatibility.html#any-unknown-object-void-undefined-null-and-never-assignability)
XserverにBaserCMS5をインストールしてみた　(4)BaserCMSの初期設定

XserverにBaserCMS5をインストールした記録をまとめておきます。

BaserCMSのインストール完了後の初期設定です。
この作業は、BaserCMSのダッシュボード（トップページURLの後に /baser/admin/　をつけたもの　例 htttp://www.xxxxx.com/baser/admin/）から行います。

# 1.システム基本設定
![initial01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23994/2a2d60a2-4038-b8f8-d7b6-125d02e159f7.png)


- WebサイトURL：正確なURLを記入
- 公開状態：メンテナンス中にすると、公開を一時停止できる。各ページの準備ができるまではメンテナンス中にしておくと良いです。

# 2.設定→ユーザ管理ー→ユーザー
ダッシュボードにログインするユーザーを追加しておきます。

![initial04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23994/adbe1ca2-141c-9fcd-6d90-68e8ce6d083e.png)

![initial05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23994/f3d5c140-2f6d-8d4e-dfc3-b5149c5c5024.png)

- アカウント名：ログインするためのアカウント名（半角英数字）　入力しなかった場合は、Eメールにてログイン
- ニックネーム：ブログ投稿者として表示される名称

# 3.設定→テーマ管理→テーマ
テーマを切り替えることにより、サイトの見た目を変えることができます。
![initial06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23994/700ddaeb-adfe-6e61-0254-89b6276e3a90.png)

https://baserproject.github.io/5/theme/


# 3.1 BaserMarketからテーマをダウンロード

標準では、「サンプルテーマ BcThemeSmaple」「BcColumn」が入っています。
BaserMarketから、好きなテーマをダウンロードすることもできます。「baserCMS５対応」のものを選択しましょう。

https://market.basercms.net/products/list.php?category_id=2

# 3.2 テーマをアップロード
ダウンロードしたテーマをアップロードするには、「テーマ管理」の「新規追加」メニューを開きます。ダウンロードしたzipファイルを選択し、アップロードボタンをクリックすると、テーマがアップロードされます。
アップロードされるフォルダ　/ドメイン名/public_html/plugins/

![initial07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23994/4a2846c7-c639-2bc8-6392-0050b3f2b92f.png)

# 3.3 テーマを適用

![initial08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23994/70313de2-d279-03fa-68b6-ee0e0b55414b.png)

- テーマを適用するには、チェックボタンをクリック
- テーマに付属しているサンプルデータを読み込む場合は、「初期データ読込」ボタンをクリック
初期データ読込を実行した場合、作成済みのブログやページのデータは全て初期化されるので注意が必要です
- 適用後、左上の「サイト表示」をクリックすると、テーマが適用されたページを見ることができます。

# 4.設定→サイト管理→サイト

サイトの名称などを設定。メインサイトのほか、サブサイトを作成することもできます。（https\://www.xxxxx.com/sub/ というように）
![initial02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23994/391959ba-63b0-d792-609e-29494ab53df0.png)


![initial03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23994/094e2b61-b5b6-21b1-477c-75fabac8b965.png)

- サイト名：サイトの正式名称：ヘッダーなどに表示されます。
- サイトタイトル：titleタグに反映されます。




---

https://qiita.com/rosenzu/items/6a869dbab81589a66704

https://qiita.com/rosenzu/items/4a9970cae7f3dd43bea7

https://qiita.com/rosenzu/items/a8d44dd0aa080650a489
deviseのメソッドってどこで定義されてるの？GitHubで調べてみた

# はじめに

エンジニアのみなさま、日々の学習お疲れ様です。
また本記事まで足を運んでいただき本当に感謝です。

年末年始、暇すぎたのでRailsをずっと触っていました。deviseを使って「ログアウト」「ログイン」「サインアップ」の実装をしたのですが、deviseを使えば、数行書くだけで機能するのが便利すぎ。ありがたい……！
一方で、初学者がdeviseを使った時に、コードを数行書くだけで機能が実装できてしまう違和感も出るだろうなとも思ったので、どこを見れば確認できるのかを、簡単にまとめてみました。


# deviseとは

[Warden](https://github.com/wardencommunity/warden)を基盤とした認証ライブラリで、モジュール構成により柔軟な認証機能を提供します。パスワード認証、OmniAuth対応、確認・復旧・記憶・追跡・ロック・タイムアウト機能などを備えています。


# 今回使ったdeviseのメソッド

1. **ログアウト関連**
    - `after_sign_out_path_for`
2. **サインアップ関連**
    - `configure_permitted_parameters`


# アプリ内を検索してみる

`after_sign_out_path_for`メソッドを実装したアプリケーション内で検索してみます。
検索でヒットしたのは実装で使った1件のみです。

![スクリーンショット 2025-01-05 16.59.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/23178f85-8c3c-492e-e728-6fe8b5a2c3bf.png)

これだけだと、『このメソッドの詳細ってどこに書かれてるの？』が分からないですね。
学習初期だと『とりあえずログアウトできてるし、ログアウト後にログイン画面へ遷移してるからOK！』で先に進めてしまう人もいるのではないでしょうか？
僕はそうでした笑


# deviseのGitHubを見てみる

『devise ドキュメント』や『devise GitHub』みたいにググると出てきます。

https://github.com/heartcombo/devise/tree/main

`after_sign_out_path_for`メソッドを検索してみます。

![スクリーンショット 2025-01-05 17.15.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/22407fe8-8fdf-7bb5-865c-6c0df285b929.png)

5件ヒットしました。1番上の内容を見てみます。

![スクリーンショット 2025-01-05 17.18.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/a9222252-94d6-f88e-0302-0d418af6725a.png)

devise/lib/devise/controllers/helpers.rbファイルに`after_sign_out_path_for`メソッドの詳細がちゃんと書かれてますね。

![スクリーンショット 2025-01-05 17.20.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/9acb7046-fcc2-258b-5573-21905dba0e4e.png)

`after_sign_out_path_for`メソッドは『サインアウト後のリダイレクト先を決定するためのメソッドなんだ（ざっくり）』となります。
何も情報がない時よりも少し理解度が深まります。


# さいごに

公式ドキュメントやGitHubを読むと、新しい発見が多くて良いですね！
こんな便利なGemを開発できるエンジニアになりたい……

# おまけ

弊社のご紹介もさせてください！

### 「日本で一番エンジニアが成長できる会社を創る」

https://prum.jp/

### エンジニアリングの募集

https://www.wantedly.com/projects/1808638

### PM・Webディレクションの募集

https://www.wantedly.com/projects/1355235

### セールス・事業開発の募集

https://www.wantedly.com/projects/1792065

### コーポレート系の募集

https://www.wantedly.com/projects/1752874

### コンサルティングの募集

https://www.wantedly.com/projects/1794481

弊社メンバーは日々学習した内容をアウトプットしております！
少しでもご興味を持たれた方は求人を見てみてください！
ご応募もお待ちしております！

### 最後までご覧いただき、ありがとうございました！
Mac mini M4にPodmanとKindでk8s環境を構築する（さらにKnativeが動作するまで）

## 前書き
Mac mini M4を新たに導入したのでKubernetesの開発環境を整備しようと思いました。
先人の智慧を活用してmultipassを利用して環境を作ろうと思いましたが、mutipassが起動しない状況だったのでたの方法を模索した際のメモです。

## PodmanのインストールとPodman machineの作成

```
brew install podman
podman machine init --cpus=4 --memory=8096 --disk-size=50
``` 

### ~/.config/containers/containers.confにhelper_binaries_dirを設定する
```
[engine]
  helper_binaries_dir = ["/opt/homebrew/Cellar/podman/5.3.1/bin","/opt/homebrew/Cellar/podman/5.3.1/libexec"]
```

### gvproxyがないと怒られる
この状態でpodman machine startするとgvproxyが無いと怒られる。

https://github.com/containers/gvisor-tap-vsock/releases

からgvproxy-darwinをダウンロードしてpodmanのバイナリと同じ場所に配置してあげる

```
mv gvproxy-darwin /opt/homebrew/Cellar/podman/5.3.1/bin/gvproxy
chmod 755 /opt/homebrew/Cellar/podman/5.3.1/bin/gvproxy 
podman machine start   
podman system connection default podman-machine-default-root
export DOCKER_HOST='unix:///var/folders/04/3p3cfcms3134k04jgcvzw3jm0000gn/T/podman/podman-machine-default-api.sock'
```
※DOCKER_HOSTに設定する値はpodman machine start 時に表示された値

## kubectlとkindをインストールする

```
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/arm64/kubectl"
chmod 755 kubectl
sudo mv kubectl /usr/local/bin/.
sudo chown root: /usr/local/bin/kubectl
brew install kind
```

### Knativeをインストール、kindクラスタ作成、サンプルサービスの動作確認をする
```
brew install knative/client/kn   
brew install knative-extensions/kn-plugins/quickstart
export KIND_EXPERIMENTAL_PROVIDER=podman  
kubernetesVersion="v1.32.0" 

kind create cluster --config=<(echo "---                
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: knative
networking:
  apiServerAddress: "0.0.0.0"
nodes:
- role: control-plane
  image: kindest/node:$kubernetesVersion
  extraPortMappings:
  - containerPort: 31080
    listenAddress: 0.0.0.0
    hostPort: 80
")
```

### kubeconfigを修正
```
sed -i '' 's/https:\/\/:/https:\/\/localhost:/g' ~/.kube/config
```

## knativeをQuickstartで起動してサンプルを起動

```
kn quickstart kind --name knative
kn service create hello \        
--image gcr.io/knative-samples/helloworld-go \
--port 8080 \
--env TARGET=World \
--revision-name=world

curl http://hello.default.127.0.0.1.sslip.io
Hello World!
```

いったん、ここまで
知っておきたいZshの基本とHomebrewのインストール方法

## はじめに

この記事は、入社後のパソコンセットアップで躓かないようにするためのガイドです。特に、macOS Catalina以降でデフォルトとなったZshと、開発環境の構築に欠かせないHomebrewのインストール方法について解説します。新しい環境でスムーズにスタートを切るための参考にしてください。

## zshとは
Zsh（Z Shell）は、ターミナルでコマンドを実行するためのシェルの一種です。
例えばターミナルでlsと入力すると、以下の流れでシステムが動作します

##### 1. シェルがコマンドを解釈する
ユーザーが入力したlsというコマンドを、Zsh（または他のシェル）が認識します。
シェルは「lsという名前の実行可能なプログラムがどこにあるか」をPATHという環境変数を使って探します。

##### 2. シェルがOSにリクエストを送る
シェルが見つけたlsというプログラムを実行するように、OSにリクエストを送ります。OSはこのリクエストを受け取り、lsプログラムを起動します。

##### 3. OSが結果を返す
lsプログラムは、指定されたディレクトリの内容を読み込みます。これをファイルやフォルダのリストとして、OSを通じてシェルに返します。

##### 4. シェルが結果を表示する
シェルは受け取った結果（ファイルやフォルダのリスト）をターミナル上に表示し、ユーザーに見せます。

#### デフォルトシェルの確認
Catalina以降でデフォルトシェルはZshとなっています。今年入社するエンジニアに支給されるM1以降のMacのデフォルトシェルはZshです。本記事ではM1以降のMacを使う際のセットアップ方法を解説します。

```bash
#デフォルトシェルを確認するためのコマンド
echo $SHELL
# 結果 zshの場合
/bin/zsh
```

## 設定ファイルのzshrcを作成する
touch コマンドで空の .zshrc ファイルを作成します。

```bash
touch ~/.zshrc
```

zshrc は、ターミナルを開いたときや新しいZshセッションを開始したときに読み込まれます。
例: 読み込まれるケース
ターミナルアプリを開いたとき。
ターミナルでzshを実行して新しいZshセッションを開始したとき。

## homebrewのインストール
[公式サイト](https://brew.sh/ja/)通りに下記コマンドを実行します。
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
brew -vでHomebrewのバージョンを確認しようとすると下記のように表示されます。
```bash
brew -v
zsh: command not found: brew
```
brew コマンドが見つからない（zsh: command not found: brew）のは、Homebrewをインストールした後にPATHの設定が適切に反映されていないためです。

## PATHを適切に設定する
brew コマンドを実行すると、Zshがそのコマンドの実行ファイルを探します。その場所を決めるのが PATH という環境変数 です。Homebrewをインストールすると、brew コマンドは/opt/homebrew/binにインストールされます。PATH環境変数にHomebrewのインストール先を追加することでシステムがbrewコマンドの実行ファイルを正しく認識できるようになります。これにより、ターミナルから直接Homebrewを使ったパッケージ管理やツールのインストールが可能になります。

##### 1.~/.zshrc を開く

```bash
open ~/.zshrc 
```

##### 2.パスを設定
```bash
# Homebrewのパスを設定
eval "$(/opt/homebrew/bin/brew shellenv)"
```
`/opt/homebrew/bin/brew shellenv` は、Homebrewのパスを通すために必要な環境変数を生成するコマンドです。

##### 3.設定を反映
~/.zshrc を保存して閉じた後、以下のコマンドを実行して設定を反映させます
```bash
source ~/.zshrc
```

##### 4.動作確認
brewコマンドが正しく動作することを確認します
```bash    
brew -v 
#バージョンは異なる場合があります
Homebrew 4.4.14
```

## まとめ
この記事では、Macのセットアップでよくあるつまずきポイントを解消するために、ZshとHomebrewの基本的な設定手順について解説しました。この記事を参考にセットアップを進めることで、開発の初期段階からスムーズに作業を始めることができるでしょう。もしわからないことがあれば、設定を見直したり、周囲のエンジニアに相談してください。新しい環境での成功を願っています！


## 参考文献
[Homebrew install時の最後の一手間で何をしているか](https://zenn.dev/shsw0228/articles/f89f2604bb53b3)
大量のファイルをGitプッシュしたらエラー落ちした件

## 背景
作成途中のプロジェクトをGitリポジトリにpushしようとしたところ、以下エラーが発生した。
```
$ git push -u origin main
Enumerating objects: 72, done.
Counting objects: 100% (72/72), done.
Delta compression using up to 4 threads
Compressing objects: 100% (55/55), done.
error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400
fatal: the remote end hung up unexpectedly
Writing objects: 100% (72/72), 2.37 MiB | 883.00 KiB/s, done.
Total 72 (delta 0), reused 0 (delta 0)
fatal: the remote end hung up unexpectedly
Everything up-to-date
```

## 調査結果
大きなリポジトリやファイルをプッシュする際に、このエラーが発生することがある模様。
この場合、Git の HTTP バッファサイズを増やすことで解決できるとのこと。
今回は以下を実行して、HTTP バッファサイズを 500MB に設定して再実行したところ、解決しました。
```
git config --global http.postBuffer 524288000
```

以上
Dockerのメモ

Dockerに関する簡単なメモです。

## イメージ操作のコマンド

```docker
docker search [options] 検索キーワード
```

GitHubのようにイメージが管理、公開されているリポジトリを提供しているDocker Hubがある。そのDocker Hubにあるリポジトリ（レジストリ）を検索するコマンド。

```docker
docker image pull [options] リポジトリ名[:タグ名]
```

レジストリからイメージをダウンロードするコマンド。

```docker
docker image ls [options] [リポジトリ[:タグ名]]
```

ホストに保存されているイメージの一覧を表示するコマンド。

```docker
docker image tag 対象イメージ名[:タグ名] 新イメージ名[:タグ名]
```

イメージの特定のバージョンにタグを付けるコマンド。Dockerではイメージを更新してビルドする度にイメージIDが振られる（つまりバージョンが変わる）ため、タグ付けすることでどのバージョンか識別しやすくなる。同一のイメージIDに対して複数タグを付けることも可能になっている。

```docker
docker image build イメージ名[:タグ名] Dockerfileパス
```

Dockerfileからイメージを作成するコマンド。

```docker
docker image push [options] リポジトリ名[:タグ名]
```

Docker Hubなどのレジストリにイメージを登録しリポジトリ作成できるコマンド。pushするイメージ内にはパスワードなどを含めないよう注意する。

## コンテナ操作のコマンド

### コンテナのライフサイクル

イメージからコンテナを作成し、作成したコンテナは実行中、停止、破棄の状態がある。コンテナは実行、停止だけではディスクに残り続けるため破棄するまでの考慮が必要である。

```docker
docker container run [options] イメージ名[:タグ名]|イメージID [コマンド] [コマンド引数...]
```

イメージからコンテナを作成するコマンド。ライフサイクルの実行中となる。
よく使うオプションは以下。

- -d
    - コンテナIDを出力してコンテナをバックグラウンドで実行する
- -p ホスト側ポート:コンテナ側ポート
    - ホスト側ポートからコンテナ側ポートへポートフォワードするよう指定できる
- -i
    - 標準入力を継続できる
- -t
    - 擬似端末を利用する
- --rm
    - コンテナ停止時にそのコンテナを破棄する


```docker
docker container ls [options]
```

実行中または停止したコンテナの一覧を表示するコマンド。

```docker
docker container stop コンテナID|コンテナ名
```

実行中のコンテナを停止するコマンド。

```docker
docker container restart
```

停止したコンテナを再実行するコマンド。

```docker
docker container rm コンテナID|コンテナ名
```

停止したコンテナを破棄するコマンド。rmするとコンテナはディスクからも削除される。

```docker
docker container logs [options] コンテナID|コンテナ名
```

指定したコンテナの標準出力を表示することができるコマンド。

```docker
docker container exec [options] コンテナID|コンテナ名 実行したいコマンド
```

コンテナ内で任意のコマンドを実行するコマンド。

```docker
docker container cp [options] コンテナID|コンテナ名:コピー対象ファイルパス ホストコピー先
```

コンテナからホストにファイルをコピーするコマンド。第1引数と第2引数を入れ替えてホストからコンテナにコピーすることも可能となっている。
each_value

# 引数なしだとEnumeratorを返し、ブロックだと自信を返す
>each_value {|value| ... } -> self[permalink][rdoc][edit]
each_value -> Enumerator
ハッシュの値を引数としてブロックを評価します。

>反復の際の評価順序はキーが追加された順です。ブロック付きの場合selfを、無しで呼ばれた場合 Enumerator を返します。

例
```rb
irb(main):002> {:a=>1, :b=>2}.each_value {|v| p v}
1
2
=> {:a=>1, :b=>2}
irb(main):004> p({:a=>1, :b=>2}.each_value)
#<Enumerator: {:a=>1, :b=>2}:each_value>
=> #<Enumerator: ...>

irb(main):005> p({:a=>1, :b=>2}.each_value.class)
Enumerator
=> Enumerator

irb(main):006> a = {:a=>1, :b=>2}.each_value {|v| p v}
1
2
=> {:a=>1, :b=>2}
irb(main):007> a.class
=> Hash
```
https://docs.ruby-lang.org/ja/latest/method/Hash/i/each_value.html
TensorRTをサポートしているGPUについて

## TensorRTをサポートしていないGeforceがある？
VC++でWindowsアプリを作ろうとしているのですが、ONNX-CUDAが思っていたよりも遅かったのでTensorRTを利用しようと思っています。
ただツイッターで検索してみると、どうも最近のTensorRTではサポートされていないGeforceがあるとかで、なんでもGeforce1080はサポートされていないとか。
TensorRTは処理速度の面でONNX-CUDAより有望ですが、一般ユーザ向けアプリを作りたいと思っているので、利用できるユーザーが少ないのは悲しい。
最近のTensorRTがいつのGeforceをサポートしているのか確認しました。

## NVIDIA TensorRTのページで確認する

https://docs.nvidia.com/deeplearning/tensorrt/support-matrix/index.html#hardware-precision-matrix

2025/1/5時点では、次のように書かれています。

> The following table lists NVIDIA hardware and the precision modes each hardware supports. TensorRT has been compiled to support all NVIDIA hardware with SM 7.5 or higher capability. The table also lists the availability of DLA on this hardware. Refer to the following tables for the specifics.

CUDA Compute Capability が7.5以上であればTensorRTを利用できるよ、ということのようです。
じゃあ、7.5っていうのは、一体どのGPUですか？

https://developer.nvidia.com/cuda-gpus

ここから`CUDA-Enabled GeForce and TITAN Products`というところを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/a16b70ac-442b-c3dd-02e5-2572b1c42291.png)

- Geforce 2060 ~~、1650~~ あたりが下限の7.5でTensorRT利用可能（1650はCUDAはともかくtensorrtは使えない気がするので消しておきます）
- Geforce 1080など、10x0系は6.1で最近のTensorRTは使えない
- デスクトップ用チップとノート用チップで差はない

ということのようです。RTXと言い出した頃ならサポートしているということでしょうか。（TensorRTだから？）
ちょっとTensorRTを試してみたい！という方は、この表も参考にしてみてはいかがでしょうか。

ちなみにデータセンターは次のようになってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/9653bbad-7b0d-6048-664a-cbc84ee35354.png)

## それにしても
2025/1/7に開催されるCES2025でNVIDIAもいろいろ発表すると思うので、もしかするとすぐに古新聞になるかもしれません。（あまりに変わってそうなら更新します）
cssのscroll-snap-typeを使って簡単にカルーセルを作る

## はじめに
モバイルのフロントエンドの実装をしていると、カルーセルを作る場面が多いですよね。

UIライブラリを使ったりして簡単に実装することもできますが、UIライブラリーだとちょっとしたカスタム要素を入れるために無駄な工数がかかることもあります。

そこで、cssを使うと簡単にカルーセルを作れることがわかりましたのでまとめてみました。

## カルーセルとは？
> クリック（タップ）などの操作により、複数のコンテンツを横にスライドさせることで、メインの表示を切り替えられる仕組み

https://www.xserver.ne.jp/bizhp/carousel/

よくあるモバイルページとかの横に流れるやつです。

![Screen Recording 2025-01-05 at 16.49.31.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754242/0952261c-21ea-5c10-5cdb-045a58b1c6f1.gif)

## 実装してみる
### jsで実装
ライブラリを使わず、jsで実装するためには以下のような要件があります。

- スクロールイベントの監視とスクロール位置の計算が必要
- アニメーションの実装
- パフォーマンスの考慮（特にモバイル端末）
- タッチデバイスでの挙動制御

例えば以下のようなjsでスクロールを実装することができます。

``` js
// スクロールの終了位置を計算して アニメーションする
const smoothScroll = (element, target) => {
  const start = element.scrollLeft;
  const distance = target - start;
  const duration = 300;
  let startTime = null;

  const animation = (currentTime) => {
    if (startTime === null) startTime = currentTime;
    const timeElapsed = currentTime - startTime;
    const progress = Math.min(timeElapsed / duration, 1);
    
    element.scrollLeft = start + distance * easeInOutQuad(progress);
    
    if (timeElapsed < duration) {
      requestAnimationFrame(animation);
    }
  };
  
  requestAnimationFrame(animation);
};
```

しかし、この関数は万能ではなく、細かいスクロールの挙動を追加するとなったら考えるべきものが増えてきます。

### cssで実装

例えば以下のようなhtmlがあるとすると

``` html
<div class="container">
  <div class="item" style="background-color: #ff6b6b;">
    <h2>Section 1</h2>
    <p>最初のスライド</p>
  </div>
  <div class="item" style="background-color: #4ecdc4;">
    <h2>Section 2</h2>
    <p>2番目のスライド</p>
  </div>
  <div class="item" style="background-color: #45b7d1;">
    <h2>Section 3</h2>
    <p>3番目のスライド</p>
  </div>
</div>
```

簡単なcssでカルーセルが実装できます。

``` scss
.container {
  scroll-snap-type: x mandatory;
  overflow-x: scroll;
  display: flex;
}

.item {
  scroll-snap-align: start;
  flex: 0 0 100%;
}
```

## 関連css
カルーセルに関するcssは以下のようなものがあります。

- scroll-snap-type: スナップの方向と強さを指定
  - x/y: スナップする方向
  - mandatory/proximity: スナップの強さ

https://developer.mozilla.org/ja/docs/Web/CSS/scroll-snap-type

- scroll-padding: スナップ位置

https://developer.mozilla.org/ja/docs/Web/CSS/scroll-padding

- scroll-snap-align: 要素のスナップ位置
  - start/center/end: どの位置でスナップするか

https://developer.mozilla.org/ja/docs/Web/CSS/scroll-snap-align

- 通り過ぎることを許可するか

https://developer.mozilla.org/ja/docs/Web/CSS/scroll-snap-stop

## おわりに
これらのcssは互換性も優れていて、MDNでも`Baseline Widely available`がついています。どんなブラウザでも使えるので使いやすさはさらに上がりますね！

cssだけでも色々できますし、暇な時にもっとMDNを熟読してみたいです。
【Rails】Rake::Taskを再実行できない問題

# はじめに
Ruby on RailsでRakeタスクを実行していると、同じタスクを再実行したい場面が出てくることがあります。しかし、Rakeタスクはデフォルトで一度実行されるとキャッシュされ、同じプロセス内で再度呼び出しても実行されません。この記事では、この問題の詳細と解決策としてreenableメソッドを紹介します。

# Rakeタスクの基本動作

Rakeタスクは以下のように定義されます：
```ruby
namespace :example do
  desc 'Sample task'
  task :my_task do
    puts 'Task is running'
  end
end
```

上記のタスクをコマンドラインで実行すると、以下のようになります：
```ruby
$ bin/rake example:my_task
Task is running
```

しかし、同じタスクを同一プロセスで再実行すると、何も出力されません。
```ruby
Rake::Task['example:my_task'].invoke # ‘Task is running’ と出力
Rake::Task['example:my_task'].invoke # 何も出力されない
```

これはRakeタスクが一度実行された後は、その状態を記憶して再実行を防ぐ仕様があるためです。

# 解決方法

この問題を解決するために、Rakeタスクのreenableメソッドを使用できます。reenableを呼び出すことで、タスクの実行状態をリセットし、再実行が可能になります。

以下に具体例を示します：
```ruby
namespace :example do
  desc 'Sample task'
  task :my_task do
    puts 'Task is running'
  end
end

# タスクの再実行
Rake::Task['example:my_task'].invoke
Rake::Task['example:my_task'].reenable
Rake::Task['example:my_task'].invoke
```

実行結果：
```ruby
Task is running
Task is running
```

reenableメソッドを使用することで、タスクを明示的に再実行できるようになります。

# 実用例

以下のような場合に使用できます：

データベースの初期化後に、複数の初期データを投入するタスクを順番に実行したい。

テスト環境で同じタスクを繰り返し実行してデバッグを行いたい。
G検定(2024 #6)合格記録

この度、G検定に合格したため、こちらに記録として残します。ご覧になった方の参考になれば幸いです。

# 受けたきっかけ
近年のAIに対する需要の高まりや、仕事で「AIもやってみたい」という周りからの要望を聞くようになり、勉強としてG検定を受験することに決めました。

私自身、文系大学の人間ですので、AI技術など遠い存在のように感じていました。
仕事の影響が大きいですが、やはり「これからはAI技術も求められそうだ」と思うようになりました。

# 勉強スケジュール
G検定を受けるにあたって、2~3ヶ月ほど要しました。少し間が空いた時期もありましたので、実質は1~2ヶ月だったかもしれません。
テキスト勉強に1ヶ月、問題演習に1ヶ月の感覚です。

教材は「ディープラーニング G検定(ジェネラリスト) 最強の合格テキスト」を使用しました。
また、問題演習としてスキルアップAIが提供しているG検定対策アプリを使用しました。

# 結果
冒頭にもありましたが、結果は合格しました。
ただ、かなりギリギリの合格でしたので、下記の反省をもとに次の受験に活かしたいと思います。

# 今回の受験での反省
### 良かったこと
- ChatGPTの活用
- テキスト学習に没頭しすぎず、問題演習のフェーズに移行した

### 悪かったこと
- シラバスの確認をしなかった
- 問題演習の種類が足りなかった

特に今回のG検定で感じたこと、これからG検定を受ける方に気を付けていただきたいのは、シラバスの確認です。
私の受験した回はシラバスの変更があった回で、そのことを私は把握しておりませんでした。そのため、試験範囲でなくなったのに勉強していたり、新たに追加された試験範囲が全くできなかったりと、今回のギリギリ合格の原因はこのシラバスの確認1つに尽きます。
特にAI技術は進歩の早い分野ですので、他のAI系資格においてもシラバスの確認は重要だと思いました。

# 最後に
G検定としては合格したので、一旦は満足ですが、今後AI系の資格を取っていくにあたってはシラバスの確認は必ず実施しておきたいと思います。
また、今回の勉強は途中でG検定から離れたこともあったので、モチベーションの保持ができるように「この期間はこの資格に集中する！」とある程度決めてスケジュールを立てたいと思います。

ベンダー資格でAIの勉強をするのもおススメですが、AI技術を基礎から偏りなく勉強したい方はぜひG検定に挑戦してみてください。

G検定に関する情報、教材は下記のURLをご参考ください。
[G検定についての公式ページ](https://www.jdla.org/certificate/general/ "G検定についての公式ページ")
[ディープラーニング G検定(ジェネラリスト) 最強の合格テキスト 第2版](https://www.amazon.co.jp/%E3%80%90Amazon-co-jp-%E9%99%90%E5%AE%9A%E3%80%91%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0G%E6%A4%9C%E5%AE%9A%EF%BC%88%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88%EF%BC%89%E6%9C%80%E5%BC%B7%E3%81%AE%E5%90%88%E6%A0%BC%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%EF%BC%BB%E7%AC%AC2%E7%89%88%EF%BC%BD-%EF%BC%BB%E5%BE%B9%E5%BA%95%E8%A7%A3%E8%AA%AC-%E6%A8%A1%E8%A9%A6%EF%BC%88PDF%EF%BC%89%EF%BC%BD-%E3%80%8C%E3%82%B3%E3%82%B3%E3%81%8C%E8%A9%A6%E9%A8%93%E3%81%AB%E5%87%BA%E3%81%BE%E3%81%99%EF%BC%81%E3%80%8D%E5%90%88%E6%A0%BC%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88/dp/4815622752/ref=pd_lpo_d_sccl_1/356-0600414-1547865?pd_rd_w=9OXmV&content-id=amzn1.sym.855d8f70-df76-4181-80b0-56e48ae3bb9b&pf_rd_p=855d8f70-df76-4181-80b0-56e48ae3bb9b&pf_rd_r=CPAB9Y88WPS69YJF46JB&pd_rd_wg=2FLT2&pd_rd_r=8119412f-a762-406d-9de7-5eef0f00242e&pd_rd_i=4815622752&psc=1 "ディープラーニング G検定(ジェネラリスト) 最強の合格テキスト 第2版")
[G検定対策アプリ](https://www.skillupai.com/general-app/ "G検定対策アプリ")

:::note warn
注意
テキストは最新版のものであることを確認するようにお気を付けください。
G検定対策アプリは有料(買い切り)です。
:::

最後までお読みいただきありがとうございました。
JUCE Tips

極めて個人的なJUCEのTips。

## Yes/Noのダイアログ (非同期)
これを書いてる今の時代、ダイアログボックスは基本的に非同期で扱うべきものらしい。

```sample.cpp
void showYesNoDialog()
{
    // ダイアログオプションを設定
    auto options = juce::MessageBoxOptions()
        .withIconType (juce::MessageBoxIconType::QuestionIcon)
        .withTitle ("Confirmation")
        .withMessage ("Do you want to delete this item?")
        .withButton ("Yes")
        .withButton ("No");

    // 非同期でダイアログを表示
    juce::AlertWindow::showAsync(options, [this, rowNumber](int result) {
        if (result == 1) // "Yes" ボタンがクリックされた場合
        {
            processor->deleteServerPatchData(rowNumber);
        }
        else
        {
            //  "No"の場合の処理
        }
    });
}
```
Yes/No/Cancelの場合は下記。
```sample.cpp
void showYesNoCancelDialog()
{
    // ダイアログオプションを設定
    auto options = juce::MessageBoxOptions()
        .withIconType (juce::MessageBoxIconType::QuestionIcon)
        .withTitle ("Confirmation")
        .withMessage ("Do you want to delete this item?")
        .withButton ("Yes")
        .withButton ("No")
        .withButton ("Cancel");

    // 非同期でダイアログを表示
    juce::AlertWindow::showAsync(options, [this, rowNumber](int result) {
        if (result == 1) // "Yes" ボタンがクリックされた場合
        {
            processor->deleteServerPatchData(rowNumber);
        }
        else if (result == 2)
        {
            //  "No"の場合の処理
        }
        else if (result == 0)
        {
            //  "Cancel"の場合の処理
        }
    });
}
```
ABC387-C を Python で解いた

ABC-387 C - Snake Numbers
https://atcoder.jp/contests/abc387/tasks/abc387_c


350点のC問題はいつも警戒してしまうんですが、今回も例に漏れず難問でした。60分以上かかりましたが、問題との相性が良かったのか運良く正解できました。解けて気分がよかったので解説記事を書いてみました。

## コンテスト中の自分の動き
途中で諦めてD問題にも挑みましたがそちらも解けるかどうか怪しく、C・Dどちらに残り時間(45分ほど)を費やすか悩み、そしてこのC問題を選びました。理由としてはグリッド問題よりも整数問題の方が手元での検証がやりやすいこと、ヘビ数の法則自体はわかっていて残りの問題は実装だけだったことが挙げられます。腹をくくってABC3完を目標に据え、落ち着いて時間をかけて取り組むことにしました。最終的にはDも解決できてめでたく4完&自身2度目の水パフォ達成となりました。2完になってもおかしくなかったです。

## 法則を考える
10から順にヘビ数を書き出してみます。

2桁の場合

* 10
* 20, 21
* 30, 31, 32
......

十の位の数を d とすると、d 個ずつ並びます。合計値は Σd 。

3桁の場合

* 100
* 200, 201, 210, 211
* 300, 301, 302, 310, 311, 312, 320, 321, 322
* 400, 401, 402, 403, 410, ......
......

百の位の数を d とすると d^2 個ずつ並びます。合計値は Σ d^2 。

書き出してみると N 桁の場合、一番上の位の数字を d とすると下 N-1 桁に使われるのは 0 から d-1 の d 種類の数字で、つまり d 進数です。下 N-1 桁には d 種類の数字を使って作れる全ての数字が並ぶので、これを 10 進数に変換すれば「あるヘビ数がその桁数のヘビ数の中で小さい方から何番目であるか」がわかるようになります。例えば 4321 なら 4桁の中で 1xxx が 1 個、2xxx が 8個、3xxx が 27個あり、4進数 321 を10進数に変換すると 57 なので全部足せば OK です。

N 進数に変換しなくてもこの桁についてはこれより小さな数が何個あって……みたいに数えてもできますがかなり複雑です。最初それでやった際、与えられた L, R がヘビ数であるとは限らないと気づいていなかったこともあり沼にはまりました。


## 解き方
ヘビ数が与えられたときに何番目であるのかはこの考え方で求められますが、与えられた L, R がヘビ数であるとは限りません。L , R 以上で最小のヘビ数をそれぞれ求めます。最上位の数字を d として、2桁目から順に見ていって d 以上の数字が現れたらそれ以降を全て 0 にし、最後に見ていた桁の 1 つ前に 1 を加えます。得られたヘビ数をそれぞれ LL, RR とします。

LL, RR がそれぞれ小さい方から数えて何番目のヘビ数であるのかを求めます。何桁のヘビ数が何個あるのかは容易に求められますし、その桁の中で何番目であるのかは先の考え方からすぐにわかります。

最後に「RR が何番目か」から「LL が何番目か」を引けば終わりです。R 自身がヘビ数だった場合 +1 個すればいいです。


## 実装

```Python
# n 進数を 10 進数に変換する
def base_n_to_10(n, string):
  string = string[::-1]
  n10 = 0
  for digit in range(len(string)):
    n10 += n ** digit * int(string[digit])
  return n10
  
# 桁数ごとに何個あるかをまず求めておく。19桁まで計算しておく。
count_by_digit = [0 for _ in range(20)]
for digit in range(2, 20):
  total = 0
  for num in range(1, 10):
    total += num ** (digit - 1)
  count_by_digit[digit] = total
# 使いやすくするため、累積和にして持っておく。
cum = [0 for _ in range(20)]
for i in range(1, 20):
  cum[i] = cum[i-1] + count_by_digit[i]

# 入力
L, R = input().split()
# L 以上の最小のヘビ数を求める。
LL = int(L[0]) 
for i in range(1, len(L)):
  if int(L[0]) <= int(L[i]):
    LL += 1
    LL *= 10 ** (len(L) - i)
    break
  else:
    LL = LL * 10 + int(L[i])
LL = str(LL)
# R 以上の最小のヘビ数を求める。
RR = int(R[0])
for i in range(1, len(R)):
  if int(R[0]) <= int(R[i]):
    RR += 1
    RR *= 10 ** (len(R) - i)
    break
  else:
    RR = RR * 10 + int(R[i])
RR = str(RR)

# LL が何番目であるのかを調べる。1 桁目を d とすると 2 桁目以降は d 進数の数になる。
d = int(LL[0])
order_L = base_n_to_10(d, LL[1:]) + 1 # 2 桁目以降を 10 進数に変換して何番目かを調べる。
for i in range(1, d): # 1 桁目が 1 から d-1 であるヘビ数の数を数える。
  order_L += i ** (len(LL) - 1)
order_L += cum[len(LL) - 1] # 桁数の少ない分を足す。
## RR についても同様。
d = int(RR[0])
order_R = base_n_to_10(d, RR[1:]) + 1
for i in range(1, d):
  order_R += i ** (len(RR) - 1)
order_R += cum[len(RR) - 1]

ans = order_R - order_L
if R == RR: # R 自身がヘビ数だったら 1 個余分に数える。
  ans += 1
print(ans)
```
5年目に入るので「よかったこと」「後悔していること」を振り返る

# はじめに

4月からエンジニア5年目の節目ということで、過去を振り返ってみることにしました。
私の後悔や学びが、読んでくださる方の何かの参考になれば嬉しいです。

# 入社経緯

私は今でこそシステムエンジニアをやっていますが、もともとはコンサル会社を志望していました。というか、実は今もコンサル会社に在籍してはいます。

弊社には社内のお困りごとを解決するためのシステム（多くはウェブアプリ）を開発する部署が存在し、私はそこに配属されているというわけです。

「狙い通り、コンサルの会社に入れたぜ！」と思ったら「君はITの部署に配属ね！」となったわけです。私はIT系の学部出身というわけではないどころか文系の学部出身だったため、当初はこの配属に納得感ゼロだったのですが、なんだかんだで5年続いていることを考えると、この配属を決めた人事は素晴らしいセンスの持ち主だったのだと思います。

# 環境

社内のお困りごとをITで解決しよう部（以下IT部）はごく少数の組織でした。実際にエンジニアリングをしている人は1人しかおらず（！）、その人も熟練のエンジニアというわけではありませんでした。

また、IT部で新卒を受け入れるのは私が初めてということで、教育の経験・ナレッジ・仕組みはなかったです。こんな状況で私を育ててくれた先輩にはとても感謝しています。

このような環境で求められるのは「動くものを作る」ことでした。

# 1〜5年目をざっくり振り返る

### よかったこと

- やりたいことを「やりたいです」と言う
- やったことがないことに積極的にチャレンジするマインド
- 資格取得に前向きに取り組んだ

マインドや行動を含め、上記の3つがよかったかなと思います。

前述の通り、私はプログラミングの「プ」の字も知らない状態での配属となったため、０から全てを学ばなくてはならない状態でした。部にとっては完全なお荷物状態です。そんな中で自分がやりたいことを主張するのはなんとおこがましいことかとも思いましたが、これを言っていたおかげで1年目のうちにフロントエンド、サーバーエンド、DB設計に触れることができました。これらを一通り触れせていただいたのもあり、2年目からは要件定義やシステム設計に関わらせていただいたりと、ゼロスタートとは思えない経験を早くから積ませていただくことができました。

これらの経験ができたのは、**やりたいことをちゃんと伝えていたこと**に加えて、**やったことがないことに積極的にチャレンジするマインド**も大きかったのかなと思います。

資格取得についてもとても良い経験だったと思いますが、少し反省もあります。資格の勉強に大学受験のような感覚で臨んでしまった事はよくなかったと思っています。大学受験の勉強は受かってしまえばOKみたいなところがあったのですが、基本情報技術者などの学習は、業務だけでは学ぶことができないエンジニアとしての基礎知識を固める、という意味があります。これを理解せず、ただ合格することだけを目標とした学習をしてしまっていたのは反省しています。おかげで5年目になる今でも勉強し直すことが多々あります。

ただ、脳が若いうちに応用情報技術者まで採れたことは大きかったと思っています。この手の勉強に苦手意識がなくてよかった。

### 後悔していること

- 「後で調べよう」（調べない）
- 結果を追い、理論がおろそかになっていた
- 質問を遠慮してしまった

主に後悔していることはこの3つです。

「後で調べよう」と思って調べなかったことが多すぎました。ブックマークやQiitaのストックは溜まる一方でしたし、タスクを進める上で疑問に思ったことが解決されないまま、次のタスクに手をつけてしまっていました。この結果、エラーが出ないようにコードを修正することができるが、なぜそのように修正するとエラーがなくなるのかがわからない、知識穴ボコへっぽこプログラマーが誕生しました。今でも後輩からの素朴な疑問に、「ちょっと調べるから待ってね…」と回答する頼りなさ。とても後悔しています。

環境のパートでも触れましたが、この部ではとりあえず動くものを提出することの優先度が高かったです。そのため、動くものができ、ぱっと見不具合がなさそうならプルリクエストを作成し、その確認も大雑把になっていました。このような環境的な要因も、へっぽこプログラマー誕生に一役買っていました。今でも初歩的な指摘を受けることがあるのは恥ずかしい限りです。

しかもこのへっぽこプログラマーは、先輩への質問をかなり遠慮してしまっていました。先輩が話している中でわからないことが出てきても、後で”自分で”調べようと考え、その場で質問しませんでした。そしてこれらは前述のとおり、調べられることはありませんでした…。最近よく見させてもらっている後輩は、たくさん質問してくれます。自分も1年目の時にこうできていたらな〜、と思います。

# 1年目の自分に声をかけるなら…

もし1年目の自分に声をかけるなら、以下のようなことを言いたいです。

- マインドは素晴らしい！　継続してくれ！
- 「後で調べよう」を調べる時間を確保すること！
- 調べたことはどこでもいいからアウトプットしろ！
- 1年目はタスクの締め切りよりも、学ぶことのほうが大事なこともある！
- 思っている2倍は質問してもいいぞ！

# 終わりに

私は今、過去の精算を必死に進めています。知識が穴だらけのへっぽこプログラマーが再生産されないことを願うばかりです。

一緒に勉強、頑張りましょう！
XserverにBaserCMS5をインストールしてみた　(3)レンタルサーバーの設定更新

XserverにBaserCMS5をインストールした記録をまとめておきます。

BaserCMSのインストール完了後に、以下の設定をしておくとよいです。
[Xserverのサーバーパネル](https://secure.xserver.ne.jp/xapanel/login/xserver/server/)を利用して行います。

## 1.WEBサイトの常時SSL化設定
初期状態のURLは、**http:**//www.xxxxx.com/ と **https:**//www.xxxxx.com/ のどちらも有効になっています。**https://**だけを有効にするためには、以下の設定を行います。

https://www.xserver.ne.jp/manual/man_server_fullssl.php

「ホームページ」メニューの「.htaccess編集」
先頭に以下を追加
~~~
# httpでのアクセスはhttpsにリダイレクト
RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
~~~
![htaccess1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23994/06a2e212-9798-a480-647d-9c65a6acc387.png)


参考記事

https://www.xserver.ne.jp/bizhp/homepage-https/

## 2.URLをwwwに統一する設定
初期状態のURLは、www.がつかない https\://xxxxx.com/ と https://**www**.xxxxx.com/ のどちらも有効になっています。
これは、必須ではないですが、SEOの観点から、wwwありに統一したほうが良いでしょう。
なお、初期ドメインxsrv.jpの場合は、この設定はしないでください。

「ホームページ」メニューの「.htaccess編集」
先頭に以下を追加 xxxxの部分は、ドメイン名に置き換えてください。
~~~
# wwwなしの場合、ありにリダイレクト
RewriteEngine on
RewriteCond %{HTTP_HOST} ^xxxxxx\.com$
RewriteRule ^(.*)$ https://www.xxxxx.com/$1 [R=301,L]
~~~
![htaccess2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23994/c8aa7cbe-2b9b-2115-2f06-7b9787fad8c0.png)

参考記事

https://seotimes.jp/www-unification/



---
Xserverのサーバーパネルでは、設定対象ドメインを選択できます。
設定対象ドメインを変更するには、以下の方法で行えます。
![setteidomain.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23994/90929bd0-9fac-a5c1-12a1-1580aba6a015.png)


---

https://qiita.com/rosenzu/items/6a869dbab81589a66704

https://qiita.com/rosenzu/items/4a9970cae7f3dd43bea7

https://qiita.com/rosenzu/items/a80afdbf8fa1ec039263