OmniAICreator/Qiita-1.07M huggingface dataset:
Linuxのディレクトリ構造と作用

# Linuxディレクトリ構造
![截屏2024-06-02 22.16.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941840/a3a23414-8153-01ec-4e2c-4dcf174b37cd.png)

- **/** (ルートディレクトリ)
  - ファイルシステムの最上位ディレクトリ。すべてのファイルやディレクトリの起点となる場所です。

- **/bin**
  - 基本的なユーザーコマンドのバイナリファイルが格納されています。例えば、`ls`、`cp`、`mv`などのコマンドがあります。

- **/boot**
  - 起動時に必要なファイル（カーネル、初期RAMディスク、ブートローダの設定など）が格納されています。

- **/dev**
  - デバイスファイルが格納されているディレクトリ。ハードウェアデバイス（ハードドライブ、USBデバイス、プリンターなど）にアクセスするためのエントリが含まれています。

- **/etc**
  - システム全体の設定ファイルが格納されています。例えば、ネットワーク設定やユーザー管理の設定ファイルがあります。

- **/home**
  - 各ユーザーのホームディレクトリが格納されている場所です。ユーザーごとのデータや設定ファイルがここに保存されます。

- **/lib**
  - システムライブラリファイルが格納されています。これらのライブラリは、基本的なシステムプログラムやコマンドによって使用されます。

- **/media**
  - 外部メディア（CD-ROM、USBドライブなど）がマウントされるディレクトリです。

- **/mnt**
  - 一時的にファイルシステムをマウントするためのディレクトリです。

- **/opt**
  - オプションのソフトウェアパッケージがインストールされるディレクトリです。

- **/proc**
  - システムのプロセス情報が含まれる仮想ファイルシステム。カーネルとランタイムシステム情報にアクセスするためのディレクトリです。

- **/root**
  - システム管理者（rootユーザー）のホームディレクトリです。

- **/sbin**
  - システム管理用のバイナリファイルが格納されています。例えば、`ifconfig`、`reboot`などのコマンドがあります。

- **/srv**
  - システムで提供されるサービスのデータ（ウェブサーバ、FTPサーバなど）が格納されます。

- **/tmp**
  - 一時ファイルを格納するためのディレクトリ。システムが再起動されるとこのディレクトリの内容は消去されることが一般的です。

- **/usr**
  - ユーザー向けのアプリケーションやファイルが格納されるディレクトリ。以下のサブディレクトリがあります：
    - **/usr/bin**: 通常のユーザーが使用するバイナリファイル。
    - **/usr/sbin**: システム管理用のバイナリファイル。
    - **/usr/lib**: システムライブラリファイル。
    - **/usr/local**: ローカルでインストールされたソフトウェア。

- **/var**
  - 可変データファイル（ログファイル、メールスプール、プリントキューなど）が格納されます：
    - **/var/local**
`/var/local` ディレクトリは、ローカルにインストールされたプログラムが自身の可変データを格納するために使用されます。このディレクトリは、システム全体で共有されるべきでないデータを保存するために設けられています。
    - **/var/log**
`/var/log` はシステムログファイルが保存されるディレクトリです。各種サービスやデーモンのログファイルがここに格納され、システム管理者が問題のトラブルシューティングを行う際に使用します。
    - **/var/spool**
`/var/spool` は一時的なデータやタスクを格納するためのディレクトリです。メールスプールや印刷キューなどが含まれます。
    - **/var/lib**
`/var/lib` はアプリケーションやデーモンが実行時に使用する状態情報が保存されるディレクトリです。データベースやパッケージ管理システムのメタデータが含まれます。

# 参照：
Linux標準教科書(https://linuc.org/textbooks/linux/)
Remixでド新規でプロジェクトを作ってみよう

## 〜宣伝〜

:::note info
個人開発でエンジニア専門マッチングサービスを開発しましたので、是非未経験からエンジニア目指している人！現役エンジニアで教えたい人！使ってみてください！

β版リリース記念キャンペーン中です！

10名様限定、抽選でお好きな技術本1冊プレゼント！
🎉当選者にはメッセージ差し上げます(送付の際に住所はお聞きしません)
詳しくはこちらから↓

https://x.com/dokupro01/status/1796837336145436846
:::
https://dokupro.dev/

## 概要

下記の公式の方法に従ってRemixの新規のプロジェクトを作ってみる

https://remix.run/docs/en/main/start/quickstart

## 環境

筆者の実行環境をまとめる

| 項目 | 内容 | 備考 |
| --- | --- | --- |
| PC | MacBook Pro 16-inch, 2019 |  |
| OS | 14.4（23E214） |  |
| ローカルPCのNode.jsバージョン | v18.18.2 | Voltaにて管理<br>`node -v`コマンドで確認 |

## 方法

1. 下記を実行してremixのプロジェクトを作成（todoアプリを作ってみようと思ったので「todo」というプロジェクト名にした。）

    ```shell
    npx create-remix@latest todo
    ```

1. 「git」の部分でgitのinitの実行可否を聞かれるのでYESを選択してEnterを押下、「deps」の部分で依存パッケージをnpmを使って自動でインストールするか聞かれたのでYESを選択してEnterを押下

    ```shell
    git   Initialize a new git repository? (recommended)
        ● Yes  ○ No
    deps   Install dependencies with npm? (recommended)
        ● Yes  ○ No
    ```

1. カレントディレクトリに「todo」というディレクトリが作られているはずなので移動

    ```shell
    cd todo
    ```

1. 下記を実行して先にgitのコミッターの設定を実施

    ```shell
    git config --local user.name "コミッター名"
    git config --local user.email "コミッターメールアドレス"
    ```

1. Githubにてリモートリポジトリを作成し、下記を実行して一旦push

    ```shell
    git remote add origin リモートリポジトリのアドレス
    ```

1. デフォルトブランチがmainではなくmasterになっていたので下記の方法で修正
    - https://qiita.com/miriwo/items/f9e85c3a436b25b388c5
1. 下記を実行して念の為パッケージのインストールを実施（「Install dependencies with npm?」をYESにしているので多分不要だけと念の為、、、）

    ```shell
    npm install
    ```

1. 下記を実行してローカルサーバーを起動

    ```shell
    npm run dev
    ```

1. 下記のようにターミナル上にローカルサーバーアクセスリンクが出るのでブラウザで開く

    ![CleanShot 2024-06-02 at 15.40.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/db70442b-2b5b-9306-3938-4493ff756430.png)

1. 下記のように表示されれば完了

    ![CleanShot 2024-06-02 at 15.41.14@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/27068300-9776-f5c2-875a-0983c49c5f67.png)
実践低レベル Symbol -チェーン統計-

## チェーン統計格納クラス
以下は、チェーン情報を格納するクラスです。
Restゲートウェイの `/chain/info` に近いですが、ファイナライズの情報が一部ありません。
```NodeInfo.ts
export class ChainStatistics {
  constructor(
    public readonly height: string,
    public readonly finalizedHeight: string,
    public readonly scoreHigh: string,
    public readonly scoreLow: string
  ) {}
}
```

## ノード情報取得クラス
前回作成した `Catpult.ts` を編集します。
ノードと接続した際についでに証明書の期限も取得するようにしています。
```Catpult.ts
import { NodeInfo } from './NodeInfo.js';
import { PacketBuffer } from './PacketBuffer.js';
import { SslSocket } from './SslSocket.js';

export class Catpult extends SslSocket {
  /** パケットタイプ */
  private PacketType = {
    CHAIN_STATISTICS: 5,
    NODE_DISCOVERY_PULL_PING: 0x111,
  };

  /**
   * ChainStatistics取得
   * @returns 成功: ChainStatistics, 失敗: undefined
   */
  async getChainStatistics() {
    let chainStatistics: ChainStatistics | undefined = undefined;
    try {
      const socketData = await this.requestSocket(
        this.PacketType.CHAIN_STATISTICS
      );
      if (!socketData) return undefined;
      const bufferView = new PacketBuffer(Buffer.from(socketData));
      const height = bufferView.readBigUInt64LE();
      const finalizedHeight = bufferView.readBigUInt64LE();
      const scoreHigh = bufferView.readBigUInt64LE();
      const scoreLow = bufferView.readBigUInt64LE();
      chainStatistics = new ChainStatistics(
        height.toString(),
        finalizedHeight.toString(),
        scoreHigh.toString(),
        scoreLow.toString()
      );
    } catch (e) {
      chainStatistics = undefined;
    }
    return chainStatistics;
  }

  // 略...
  
}
```

## メイン
`Catpult` のインスタンスを生成して呼び出すだけです。
```main.ts
import { Catpult } from './Catpult.js';

const catpult = new Catpult('sakia.harvestasya.com');
const result = await catpult.getChainStatistics();
console.log(result);
```


## 実行
```
> yarn tsx ./src/main.ts
ChainStatistics {
  height: '1471559',
  finalizedHeight: '1471544',
  scoreHigh: '0',
  scoreLow: '15108098493857278957'
}
```
mkcert での CA 証明書作成

# 前書き
作成したWebAppをオンプレ環境でSSL化対応する必要があったので備忘記録

# 必要なもの

- mkcert
- openssl
- nginx
- https 化したいアプリ

openssl と nginx の入手方法は割愛

# やることの概要

1. mkcert により ca 証明書を作成する
2. mkcert によりサーバー証明書を作成する(ca 証明書の秘密鍵で作成)
3. リバースプロキシとして nginx を用意し、サーバー証明書を設定する
4. クライアントに ca 証明書をインストールして、サーバー証明書が信頼されるようにする

# 目次

[1. mkcert の入手](#1-mkcert-の入手)  
[2. mkcert によるサーバー用証明書の作成](#2-mkcert-によるサーバー用証明書の作成)  
[3. nginx の設定](#3-nginx-の設定)  
[4. CA 証明書の作成と配布](#4-CA-証明書の作成と配布)  

# 1. mkcert の入手

以下で入手可能  
[https://github.com/FiloSottile/mkcert](https://github.com/FiloSottile/mkcert)

開いたら Release の最新版を導入でよいと思います  
ダウンロードした exe を`mkcert.exe`にリネームしとくと使いやすいです  
(しないと警告出る？かも？)

# 2. mkcert によるサーバー用証明書の作成

以下のコマンドで自分自身の証明書をつくれます  
`./mkcert.exe localhost {自分のIP}`

これにより、`localhost+2.pem`と`localhost+2-key.pem`ができます  
(ファイル名は指定するホスト数などで変動します)

# 3. nginx の設定

## _.pem と_-key.pem のコピー

`mkcert によるサーバー用証明書の作成`で作成した`*.pem`と`*-key.pem`を nginx のインストールしたフォルダを pwd として以下にコピーします  
`./conf/ssl`

## nginx.conf の設定

インストールしたフォルダを pwd として、以下に設定ファイルがあります  
`./conf/nginx.conf`

開いたら以下のように設定

```nginx
http {
  server {
    # httpsで待機
    listen       0.0.0.0:443 ssl;
    server_name  localhost;

    # CA証明書へのパス
    ssl_certificate "{絶対パス}/conf/ssl/localhost+2.pem";
    ssl_certificate_key "{絶対パス}/conf/ssl/localhost+2-key.pem";

    # クライアントへの転送設定
    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # サーバーへの転送設定
    location /api {
        proxy_pass http://localhost:5071;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
  }
}
```

上記までやって`./nginx.exe`を実行するとサーバーが起動します  
(アプリサーバーの起動を忘れずに)

ついでに`./nginx.exe -s reload`で conf ファイルを読み込みなおせます

# 4. CA 証明書の作成と配布

## CA 局証明書について

以下のコマンドを実行すると CA 局としての証明書があるパスを得られます  
`./mkcert.exe -CAROOT`

手順２によって生成した証明書は CA 局としてサーバーに発行する証明書で、  
上記コマンドでアクセスできるフォルダ内の証明書は CA 局自体の証明書

クライアントには CA 局自体の証明書を配ってルート証明書として信頼すると、
CA 局としてサーバーに発行した証明書が信頼されるようになります

## CA 局証明書を クライアント 向けに変換

`./mkcert.exe -CAROOT`を pwd として以下を実行すると der ファイルを作成可能  
`openssl x509 -outform der -in rootCA.pem -out rootCA.der`

上記で生成した`rootCA.der`を nginx のインストールフォルダを pwd として以下フォルダに配置します  
`./html`

これで`index.html`などでリンクを指定すると配布が可能になります
クライアントごとにインストールしてもらうとこれでhttps通信が可能になりますね💯
Git masterブランチの名称をmainに変える

## 〜宣伝〜

:::note info
個人開発でエンジニア専門マッチングサービスを開発しましたので、是非未経験からエンジニア目指している人！現役エンジニアで教えたい人！使ってみてください！

β版リリース記念キャンペーン中です！

10名様限定、抽選でお好きな技術本1冊プレゼント！
🎉当選者にはメッセージ差し上げます(送付の際に住所はお聞きしません)
詳しくはこちらから↓

https://x.com/dokupro01/status/1796837336145436846
:::
https://dokupro.dev/

## 概要

Gitにてmasterブランチの名称をmainに変える方法を簡単にまとめる。

## 方法

1. ローカルリポジトリにて下記を実行し、ブランチ名をmainに切り替える（未pushの場合はこの手順だけで完了となる。masterブランチをリモートリポジトリにpush済みの方はこのあとも継続して作業する必要がある。）

    ```shell
    git switch master
    git branch -m master main
    ```

1. 下記を実行してリモートリポジトリにpushする

    ```shell
    git push -u origin main
    ```

1. リモートリポジトリのサービス（Githubなど）のリポジトリの画面を開く（筆者はGithubユーザーなのでGithubの場合を説明する。）
1. 「Settings」を開く

    ![CleanShot 2024-06-02 at 15.21.35@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/c432e6a7-d3e6-bc9c-47e0-a598fcd155b2.png)

1. サイドバーの「General」をクリックし「Default branch」の「相互矢印マーク」をクリックする。

    ![CleanShot 2024-06-02 at 15.25.00@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/f302f0d4-7b59-af6f-9629-4a63ed011d7c.png)

1. 「master」と表示されているプルダウンをクリックし、「main」をクリックする。

    ![CleanShot 2024-06-02 at 15.25.43@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/2a0a87a8-18d6-3917-2f08-3f51e6ea132f.png)

1. 変更できたら「Update」をクリックする。

    ![CleanShot 2024-06-02 at 15.26.33@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/491f6472-32a8-c00f-a312-fb983f9a7cf2.png)

1. リスクを理解しているか聞かれるので承諾できるなら赤文字のボタンをクリックする。

    ![CleanShot 2024-06-02 at 15.27.17@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b051ddd0-b63d-8c4e-8f0b-30754dca726d.png)

1. Defailt branchがmainに変わった。

    ![CleanShot 2024-06-02 at 15.28.03@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/c416d8f2-9c24-dc9b-9233-1271aa6e2ee2.png)
日本語配列のHHKBで英数-かな入力がうまく切り替えられない時の対処法【Mac】

# はじめに
最近、縁あってHHKBキーボード(JIS配列)を貰い受けました。
その際に英数-かなの切り替えがうまくできず、結構時間を使ってしまったので備忘録兼共有として今回記事にしました。

## 発生した問題
HHKB studio キーマップ変更ツールを使用して、HHKBのキーマップを以下のように変更したが反映されなかった。
![スクリーンショット 2024-06-02 13.59.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778030/b1c54ccf-a5f1-9382-3036-bb031063d468.png)

- かな・英数の部分を押しても切り替えができない
- `Control+Space`で切り替えは可能（でも押しづらいし変えたい）

## 原因
1 DIPSWの変更が反映されていなかった
2 Profileの変更ができていなかった

順に見ていきます。

### 1 DIPSWの変更が反映されていなかった
こちらは単純で、キーボード側で物理ボタンを切り替えた後Macを再起動していなかったことが原因でした。
再起動をしたらちゃんとHHKB studio キーマップ変更ツールで以下のように変更が反映されました。

![スクリーンショット 2024-06-02 14.03.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778030/7a095ade-bd90-3504-9916-5a22fa3ccef5.png)

### 2 Profileの変更ができていなかった
HHKBの記事を見ていると、Profile2がMacの配列に該当するようで、私もProfile2の方を使用していました。
使用しているつもりだったのですが、そもそもProfile1(デフォ)から２に変更できていませんでした。

HHKB studio キーマップ変更ツールのホームでProfileを2にすれば切り替えることができると思い込んでいたのですが、それは間違いでちゃんと手順を踏んで変更する必要がありました。

https://happyhackingkb.com/manual/studio/ug-jis/jp/ug/topic/profile.html

こちらの公式を見てProfileを2に変更することで、意図していた通りのキーマップになりました。

こんなアホなことで結構時間を使ってしまいました...

## おわりに
HHkBを始めて使いましたが、打鍵感いいですね！モチベーションアップにも繋がりそうです。
Arch LinuxでXRDPを使う上で個人的につまづいたこと

Arch LinuxのGnomeデスクトップ環境をリモート操作するため、XRDPをセットアップした際につまづいたポイントのメモ書きです。
[ArchWikiのXrdpのトラブルシューティング](https://wiki.archlinux.jp/index.php/Xrdp#.E3.83.88.E3.83.A9.E3.83.96.E3.83.AB.E3.82.B7.E3.83.A5.E3.83.BC.E3.83.86.E3.82.A3.E3.83.B3.E3.82.B0)では解決できなかった内容が中心です。

# 前提

XRDPを動かすPCには事前に必要なパッケージはインストールしてあるものとします。
筆者の場合は以下のパッケージをインストールしました。
- xrdp （必須）
- xorgxrdp-glamor （グラフィックチップ依存）
- pulseaudio-module-xrdp （サウンドサーバ依存）

詳しくは[ArchWikiのXrdpの記事](https://wiki.archlinux.jp/index.php/Xrdp)を参照してください。

またRDPクライアントには[Remmina](https://wiki.archlinux.jp/index.php/Remmina)を使います。

# つまづいたポイント

## RDP接続してログインした後にすぐ切断される (2024年6月17日 追記)

:::note warn
この部分の挙動はArch LinuxでAURから[xrdp](https://aur.archlinux.org/packages/xrdp)をインストールした場合の挙動です。
AURからのインストール時、[オリジナルのxrdp](https://github.com/neutrinolabs/xrdp/blob/devel/sesman/startwm.sh)に[Arch Linux環境向けのパッチ](https://aur.archlinux.org/cgit/aur.git/tree/arch-config.diff?h=xrdp)が当てられるため、他のディストリビューションではこの情報は参考にならない可能性があります。
:::

**Arch LinuxではXRDPからデスクトップ環境を起動するために[xinit](https://wiki.archlinux.jp/index.php/Xinit)が必要です。
xinitがインストールされていて、なおかつ設定が適切か確認してみてください。**

Arch LinuxにXRDP経由でログインした場合、デスクトップ環境はxinitによって起動されます。
GDMなどのディスプレイマネージャ経由のログインとはプロセスが異なります。

xinitを使ったGnomeデスクトップ環境の起動方法は[ArchWikiのGnomeの記事](https://wiki.archlinux.jp/index.php/GNOME#.E6.89.8B.E5.8B.95)を参照してください。

### もう少し詳しい話

XRDPがデスクトップ環境のセッションを起動する処理は、xrdpパッケージに含まれる `/etc/xrdp/startwm.sh` に記述されています。
Arch Linuxではここに[パッチ](https://aur.archlinux.org/cgit/aur.git/tree/arch-config.diff?h=xrdp)を当てて、xinitで起動するよう処理を改変しているようです。

```bash:/etc/xrdp/startwm.sh
  # arch user
  if [ -r ~/.xinitrc ]; then
    pre_start
    . ~/.xinitrc
    post_start
    exit 0
  fi
  # arch
  if [ -r /etc/X11/xinit/xinitrc ]; then
    pre_start
    . /etc/X11/xinit/xinitrc
    post_start
    exit 0
  fi
```

### 真偽不明のネタ

XRDPとは別の手段でログインしてデスクトップセッションを起動している場合もログインできない、という情報をどこかで見たのですが未検証です。

## 自動サスペンドを無効化していてもPCが自動サスペンドする

**XRDPが動作しているPCで[ディスプレイマネージャ](https://wiki.archlinux.jp/index.php/%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3)、具体的には[GDM](https://wiki.archlinux.jp/index.php/GDM)が動作していないか確認してみてください。**

GDMはそれ単体で自動サスペンド機能を持ちます。
またGnomeデスクトップ環境におけるユーザごとの自動サスペンド設定とは独立した設定を持ちます。

[GDMの自動サスペンドを無効化する](https://wiki.archlinux.jp/index.php/GDM#GDM_.E3.81.AE.E8.87.AA.E5.8B.95.E3.82.B5.E3.82.B9.E3.83.9A.E3.83.B3.E3.83.89_.28GNOME_3.28.29)か、 `gdm.service` 自体を停止させてみてください。

## キーボード配列がおかしい

**RDPクライアントのキーボード配列の設定が適切か確認してみてください。**

[Remmina](https://wiki.archlinux.jp/index.php/Remmina)だと、設定→RDP→キーボードレイアウトから設定変更できます。

xsetkbdで無理やり修正することも出来ますが、ログインするたびに実行が必要なので少々面倒です。

## 音声が鳴らない

**RDPクライアントで音声を有効化しているか確認してみてください。
XRDPが動いているPCとクライアントの両方を適切に設定する必要があります。**

[Remmina](https://wiki.archlinux.jp/index.php/Remmina)はデフォルトの設定では音声がオフになっています。
音声を有効化するには、接続プロファイル→高度な設定→オーディオ再生をローカルに設定する必要があります。
[エラー解決] cublasLtGetStatusString なんて知らん

この記事は実際に自分が遭遇したエラーを解決してくれた stack overflow の記事を日本語訳したものです。


# `version libcublasLt.so.11 not defined in file libcublasLt.so.11 with link time reference?` とかいうエラー出たんやが、どうやって直すんやこれ

`python -c "import torch"` で pytorch をインポートしようとしたらこんなエラー出てきたンゴ……。

```error.sh
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/afs/cs.stanford.edu/u/brando9/ultimate-utils/ultimate-utils-proj-src/uutils/__init__.py", line 13, in <module>
    import torch
  File "/dfs/scratch0/brando9/miniconda/envs/metalearning_gpu/lib/python3.9/site-packages/torch/__init__.py", line 191, in <module>
    _load_global_deps()
  File "/dfs/scratch0/brando9/miniconda/envs/metalearning_gpu/lib/python3.9/site-packages/torch/__init__.py", line 153, in _load_global_deps
    ctypes.CDLL(lib_path, mode=ctypes.RTLD_GLOBAL)
  File "/dfs/scratch0/brando9/miniconda/envs/metalearning_gpu/lib/python3.9/ctypes/__init__.py", line 382, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: /dfs/scratch0/brando9/miniconda/envs/metalearning_gpu/lib/python3.9/site-packages/torch/lib/../../nvidia/cublas/lib/libcublas.so.11: symbol cublasLtHSHMatmulAlgoInit, version libcublasLt.so.11 not defined in file libcublasLt.so.11 with link time reference
```

どうやって直すんやこれ？


# ベストアンサー
eval が言ってる通り、pytorch1.13 が勝手に `nvidia_cublas_cu11`, `nvidia_cuda_nvrtc_cu11`, `nvidia_cuda_runtime_cu11`, `nvidia_cudnn_cu11` をインストールしおったからこうなったんやで

ワイも自分で入れた CUDA toolkit あるのに同じ目に合った

**ワイの場合は `pip uninstall nvidia_cublas_cu11` して解決や**

割とみんな CUDA toolkit 自分で入れてるはずやから PyTorch くんコレ直してくれんかなぁ


# 翻訳元
[how does one fix when torch can't find cuda, error: version libcublasLt.so.11 not defined in file libcublasLt.so.11 with link time reference?](https://stackoverflow.com/questions/74394695/how-does-one-fix-when-torch-cant-find-cuda-error-version-libcublaslt-so-11-no)
2370. Longest Ideal Subsequence の解き方メモ

https://leetcode.com/problems/longest-ideal-subsequence/description

# 問題の概要

以下の条件を満たす文字列を理想文字列と呼ぶ。最長の理想文字列を求めなさい。

- 与えられた文字列sの部分文字列である
- 隣接したアルファベットの差の絶対値がk以下である

# 解き方のメモ

いわゆる「もらうDP」の問題ですね。

たとえば、k=1、s=aaazzzbという入力を考えてみましょう。いま、末尾のbを見ているとします。では、このbにはどこから遷移すれば、最長の理想文字列になるでしょうか? これは明らかに左から3番目のaです。

この例をもとに一般化することを考えてみると、配列dpがあり、dp[i]には「sを左から見ていって、いまi番目の文字列を見ているとき、最長の理想文字列の長さ」が格納されています。このdp[i]には「iより左にあって、アルファベットの差の絶対値がk以下のもののうち、dpに格納されている値がもっとも大きいもの」(★)から遷移すればよいわけです。

課題はこの★をどのように管理すれば効率的かということでしょう。これは以下のような配列aを活用すればよいです

- a[0] : iより左にあって、アルファベットがaのもののうち、dpに格納されている値が最大になるもの
- a[1] : iより左にあって、アルファベットがbのもののうち、dpに格納されている値が最大になるもの
- a[2] : iより左にあって、アルファベットがcのもののうち、dpに格納されている値が最大になるもの
- …

# 提出コード

```rust
impl Solution {
    pub fn longest_ideal_string(s: String, k: i32) -> i32 {
        let n = s.len();
        let mut dp = vec![1; n];
        let mut a = vec![i32::MIN; 26];

        for (i, c) in s.chars().enumerate() {
            for d in 'a'..='z' {
                if (c as i32 - d as i32).abs() <= k {
                    dp[i] = dp[i].max(a[d as usize - 'a' as usize] + 1);
                }
            }
            a[c as usize - 'a' as usize] = a[c as usize - 'a' as usize].max(dp[i]);
        }

        *dp.iter().max().unwrap()
    }
}
```
問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本　備忘録

[問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本](https://github.com/E869120/math-algorithm-book)を読み進めるにあたり、備忘録として記録していいるもの。

第2章　アルゴリズムのための数学の基本知識
2.1.4 
```
#include <iostream>
using namespace std;

int main() {
	int A[4];
	cin >> A[1] >> A[2] >> A[3]; // 入力部分
	cout << A[1] + A[2] + A[3] << endl; // 出力部分
	return 0;
}
```
・[]の役割
　コード内の [] は、配列の要素にアクセスするために使用されている。C++で配列を扱う際、[] を使って配列のインデックスを指定し、その位置にある要素にアクセスする。

・配列の宣言
　ここでは、4つの整数を格納できる配列 A を宣言している。配列のインデックスは 0 から始まるが、このコードでは A[0] を使用していない。
```
int A[4];
```
・入力部分
　この行では、ユーザーから3つの整数を入力として受け取り、それぞれを配列 A のインデックス 1, 2, 3 に格納している。
```
cin >> A[1] >> A[2] >> A[3];
```
・return 0;
　C++のmain関数の終わりでプログラムが正常に終了したことを示すために使用される。main関数は、プログラムのエントリーポイントであり、プログラムの実行が終了する際に終了ステータスを返す。
 
・注意点
　配列のインデックスは 0 から始まるため、A[0] は有効なインデックス。しかし、このコードでは A[0] は使用されていない。また、配列のサイズ 4 は、インデックス 0 から 3 までの範囲を持つことを意味する。もし A[4] を使用しようとすると、それは配列の範囲外アクセスとなり、未定義の動作を引き起こす可能性がある。

以下のように A[0] も含めて配列を利用することができる：
```
#include <iostream>
using namespace std;

int main() {
    int A[4];
    cin >> A[0] >> A[1] >> A[2] >> A[3]; // すべての要素に入力を受け取る
    cout << A[0] + A[1] + A[2] + A[3] << endl; // すべての要素の合計を出力
    return 0;
}
```
WindowsでのGitのgpg署名のNo secret key foundを解決する

備忘録扱いです。

キーの生成手順とかはおそらく他の形の記事のほうが読みやすいと思うので割愛します。

コマンドプロンプトで以下のコマンドを実行します。
```bash
git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"
```

これはどうやらgitにgpgプロバイダーのパスを渡しているものらしく、これがないとsecret keyをgitが見つけに行けないから困ってこういうエラーを履いてるっぽいです。
PacketTracerでネットワークを勉強（DL編）

# PacketTracerって？
ネットワーク機器のシェアが多いCiscoの関連企業、Cisco Networking Academyが提供する勉強用のフリーソフトウェア。
ループの発生やケーブルの切断といった内容の検証作業などを行うことができる。
Vyosのようにほんもののソフトウェアネットワーク機器というわけではなく、あくまで勉強用のソフトウェア。`Packet Tracerの外の機器との接続はできない。`すべてのコマンドがあるわけではないが、`CCNA`はこれを使って勉強することで合格は可能である。

https://www.netacad.com/courses/packet-tracer

上記の公式サイトから、右上`ログイン`からログインする。アカウントがまだないのであればSignUpをして、新たにアカウントを作成する。

![スクリーンショット 2024-05-25 14.29.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/dec5673d-2436-9514-1742-a5ae70cff0f0.png)
![スクリーンショット 2024-05-25 14.29.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/6951a0b9-1265-97f9-a211-7085494a3847.png)

サインアップはgoogleのアカウントを利用することもできる。
国や誕生月、IT歴などを入力する。まだ日本語には対応できていないので、英語で指定しよう。


その後、上部メニューにある、`Download Packet Tracer`を押す。

![スクリーンショット 2024-05-25 14.38.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/1381d1fe-2a88-63aa-0983-dca08c33b74d.png)

少し下にスクロールすると、ダウンロードのリンクがある。
![スクリーンショット 2024-05-26 13.27.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/9ab8832a-d602-6060-ef96-5d777cf086e2.png)

したの32bitはwindowsのみで、上のものはmacとwindows対応らしい。

今回は上をダウンロード。
![スクリーンショット 2024-05-26 13.29.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/4cd21bf7-9005-6525-a128-4e4ebfbe19bb.png)

ダウンロードが完了すると、exeファイルを確認することができる。

1. そして、それをダブルクリック。自分の環境（8.22）だと、ライセンスの同意が出てくるので、それをクリック。
1. そしてDestinationFolderを選択するのだが、デフォルトを選択してNextを押す。
1. そこから、いろいろとりあえずNextを押していくと、ReadytoInstallがでてきて、インストールが始まる。
1. インストールされたら、ダブルクリックするとアプリが立ち上がる。
1. そうしたら再度ログイン画面がでてくるので、作成したアカウントでログインを行う。
1. ゲストログインの方法もあったりするらしいのだが、ここでは確認できなかった。
    1. *ユーザーをログインしていると、設定している環境を保存することができる。
Windowsでのシンボリックリンクの作成

シンボリックリンクとは
端的に言うと「ショートカット」のようなもの。ディスク上で扱うオリジナルのファイルやディレクトリを本来の位置に残しつつ別のファイル、ディレクトリへの参照を作成する手法である。ソフトリンクともいう。
【作成方法】
①コマンドプロンプトを開く。(管理者モード必須)
![1000002061.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803737/51e01690-1eac-bd4d-4482-41097dd9e9a3.png)

②(例)「C:¥TEST2¥本物」をリンク元にし、「C:¥TEST」にシンボリックリンク(偽物フォルダ)を作成する。
構文：「mklink /D 《作成するリンク名パス》 《リンク元のパス》」
![1000002062.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803737/712154f7-5b62-8f13-faf4-654599efdf1b.png)

③.②のコマンドを実行し、C:¥TESTを確認すると、偽物という名前のリンクファイルが出現。
![1000002063.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803737/6241be1c-0c76-f1ad-4510-21b24fc570e4.png)

④確認のためにリンク元のファイルに「テストだよ.txt」を作成。
![1000002064.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803737/e0562504-6b56-bbe0-9b5d-3f0980ad5b4d.png)

⑤リンク先である「C:¥TEST¥偽物」の中にも「テストだよ.txt」が出現。
![1000002065.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803737/aeb1ee5b-0f3a-4417-e875-ca7f649ca07b.png)

(補足)ちなみに管理者モードで実行しないと下記のようなエラーが出る。
![1000002067.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803737/6d3e7d6c-687f-32a0-ca22-cab71cd336b0.png)
プログラムで行列にアクセスする際はアクセス順序を気をつけないといけない話

## はじめに
自社開発のエンジニアをやっているものです。  
Web開発で２次元配列を全件処理をする機会はそれほどないかもしれないのですが、競技プログラミング等の数理計算？を処理する際にはよく使うと思います。  
その際何気なく1行目から順に最終行まで辿るようにアクセスすると思うのですが、1列目~最終列まで処理しても差分はないのかという題材でこの記事を書いていこうと思います。  
## 結論
早速結論ですが基本的には行ごとにアクセスした方が処理速度が**早く**なるようです。  
ただ全てのプログラミング言語がそのような動きにはなっていないようで、MATLABやpythonのnumpyライブラリ等は列毎に処理をした方が早くなるようです。  
今回は例としてgo言語で行基準、列基準の速度を見ていきたいと思います。  
### 行毎にアクセスした場合
```go
// 行ごとに行列に値を格納する
func inputMatrix(matrix [][]int) {
	for i := 0; i < len(matrix); i++ {
		for j := 0; j < len(matrix[i]); j++ {
			matrix[i][j] = 1
		}
	}
}

func main() {
	// 10000x10000の行列を作成
	matrix := make([][]int, 10000)
	for i := 0; i < len(matrix); i++ {
		matrix[i] = make([]int, 10000)
	}

	start := time.Now()
	inputMatrix(matrix)

	// 処理時間を計測
	elapsed := time.Since(start)
	elapsedMilli := elapsed.Milliseconds()
	println("実行時間:",elapsedMilli,"ms")
}  
```
```shell
% go run ファイル名
実行時間: 224 ms
```
### 列毎にアクセスした場合
```go
// 列ごとに行列に値を格納する
func inputMatrix(matrix [][]int) {
  for i := 0; i < len(matrix); i++ {
    for j := 0; j < len(matrix[i]); j++ {
      matrix[j][i] = 1
		}
	}
}

func main() {
  // 10000x10000の行列を作成
	matrix := make([][]int, 10000)
	for i := 0; i < len(matrix); i++ {
    matrix[i] = make([]int, 10000)
	}

	start := time.Now()
	inputMatrix(matrix)

	// 処理時間を計測
	elapsed := time.Since(start)
	elapsedMilli := elapsed.Milliseconds()
	println("実行時間:",elapsedMilli,"ms")
}
```
```shell
    % go run ファイル名
    実行時間: 866 ms
```
## 結果
行毎にアクセスした場合は224msでしたが、列毎にアクセスした場合は866msと約3.8倍ほどに差が出る結果となりました。  
どうしてこのような結果になってしまうのか説明しようと思います。
## 処理速度に差が出る理由
### 配列を生成した時のメモリ内の配置
イメージとして、5*5の二次元配列を生成した場合に1行1列目、1行2列目、1行2列目・・・5行5列目という順番で配置がされているみたいです。
|アドレス1|アドレス2|アドレス3|アドレス4|アドレス5|アドレス6|アドレス7|アドレス8|アドレス9|アドレス10|
|---|---|---|---|---|---|---|---|---|---|
|matlix[0][0]|matlix[0][1]|matlix[0][2]|matlix[0][3]|matlix[0][4]|matlix[1][0]|matlix[1][1]|matlix[1][2]|matlix[1][3]|matlix[1][4]|
### 配列へのアクセスの動き
プログラムが配列にアクセスする場合はまずキャッシュ(I/O速度がより速い)にあるか確認して、ある場合はキャッシュから、なければメモリからアクセスする動きになっているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981863/ba9ff0c7-ebf6-308e-4401-98248fa433bb.png)
そして、メモリからアクセスした場合は付近のアドレスもごっそりキャッシュに一時保存をする動きになっているようです。
ですので、matlix[0][0]を取得した際はその付近（例としてmatlix[0][0]~matlix[0][4]）をキャッシュに保存されると次からその範囲の値を取得するときにはキャッシュから取得できるようになります。逆にその範囲外の値を取得しようとすると、メモリから取得するという動きになってしまうので前者よりも速度が劣ってしまいます。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981863/0fa14d2e-b2c9-d510-0b73-ccd50508d023.png)
以上のことから行毎でアクセスすると都度キャッシュから取得できる動きになるのに対して、列毎でアクセスするとメモリから取得する動きになり実行速度に差が出るということに繋がってしまいます。
## まとめ
言語によって、２次元配列のアクセス方法に気をつけなければいけないことがわかりました。  
特に意識する必要はないと思いますが、ハードウェアに近い仕組みを理解することは知識定着を高めてくれると考えているのでこれからも追求し続けていこうと思いました。
0_1_1_Node-REDのインストール_flipper's circuit Project -電子工作人口を増やすためのプロジェクト-

Node-REDをインストールする手順について備忘録に近いのですが書いてみます。
主な手順は以下の通り

1 Node.jsのインストール
2 Node-REDのインストール
3 コマンドでNode-RED立ち上げ
4 4 「Node-RED」にブラウザからアクセス

私はWindows上にて動作させているので、Windowsでのインストール方法で解説します。
Windows以外のインストール方法は以下の公式サイトで確認ください。
→https://nodered.jp/docs/getting-started/local

# 1 Node.jsのインストール

### ①サイトからインストーラをダウンロード

まずはNode-REDのベースとなる「Node.js」をインストールします。
以下のサイトから環境に合うインストーラをダウンロードしてください。

**今日（2024/06/02）の時点で、v20.14.0のバージョンではNode_REDは動作しませんでした。
v18.20.3は動作したので、念のためv18.20.3をインストールしてください**

https://nodejs.org/en/download/prebuilt-installer

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/710539d6-1d3e-de41-79f4-9f82b7cc89d0.png)

### ②インストーラを実行する

ダウンロードしたファイルを、案内に従ってインストールしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/f3b0b27f-8274-c9c6-e0fe-6a9b80ade224.png)

Native Moduleのツールは一緒にインストールしてください。（チェックする）
ここチェックしないとNode-REDの動作に必要なツールがなくて動きませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/4a856de4-a867-0ec1-d302-4d44717bdbbe.png)

プロンプト画面が立ち上がるので、案内に従ってEnterしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/d052dc9f-7b12-06e1-c473-f99f5883d6b6.png)

インストールが完了したらコマンドを実行し、バージョンを調べてきちんとインストールしているか確認してください。

```
node -v
npm -v
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/50d72631-8697-b0a1-5ed8-2c3292918475.png)

# 2 Node-REDのインストール

Node.jsがインストールできたら、「npmパッケージマネージャ」を利用してコマンドプロンプトでインストールします。


```
npm install -g --unsafe-perm node-red
```

コマンドを実行すると、インストールが開始されます。
しばらくするとインストールのログが表示されるので、待機してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/a52c9a0e-5d5c-9e63-6070-38d808175d45.png)

# 3 コマンドでNode-RED立ち上げ

立ち上げもコマンドで行います。
実行まで少し時間がかかります。
立ち上がりの目安→[info] Starting flows

```
node-red
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/d4dada73-36ee-aa1e-58b9-03d4ee78e392.png)

# 4 「Node-RED」にブラウザからアクセス

Node-REDの立ち上がりを確認したら、ブラウザを起動して「http://localhost:1880」を入力し、アクセスしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/06d73a72-b4d3-9217-308d-09620eea4d04.png)

画面はイメージですが、Node-REDが動作します。

以上がインストール（起動含め）の手順です。

[トップにもどる](https://qiita.com/comchiki66/items/615c0c8cb87cd0c5c575)
「速打ちゲーム」!? ゲーム性を取り入れて、最速で「目的の条文」にたどり着くアイデア《法令.app》

誰でも楽しく法律が読める[《法令.app》](https://jplaws.app)というWebアプリを作っています。

法律関係の開発をする難しさの１つが「データサイズの振れ幅が大きいこと」だと思います。[一行で終わる法律](https://jplaws.app/d/132AC1000000040-m.html)もあれば、[数百万文字(!)もある法律](https://jplaws.app/d/332AC0000000026-m.html)もあります。テキストの処理に苦労していたら、[630ページもあるPDFが添付された省令](https://jplaws.app/d/351M50010000035-a.html)が出てきたりします。(巨大PDF対策については、またQiitaで書きます。フォローお願いします！)

## :shopping_bags: レジ打ちの「イス」は、実は義務だった？

#### ニュース記事：“座るレジ係”増加中…実は立ちっぱなしNGでイスの設置は義務　客の理解進み変わる接客

https://www.fnn.jp/articles/-/706416

根拠法令を読んでみましょう。[労働安全衛生規則 第615条](https://jplaws.app/d/347M50002000032-m.html#Ar-615)です。（文言にこだわる法律で、何でイスが「いす」なんでしょう・・ひらがなに完全に埋もれてテキスト検索で苦労したじゃないか、、:cry:）

> 事業者 は、持続的立業に従事する労働者が就業中しばしばすわることのできる機会のあるときは、当該労働者が利用することのできるいすを備えなければならない。

さて、毎度ベンチマークに使って申し訳ない[E-Gov法令検索の当該ページ](https://elaws.e-gov.go.jp/document?lawid=347M50002000032_20240401_505M60000100022)を見てみます(リスペクトしてます！[^1])。これはＰＣの表示ですが、スマホでも同じく、「目次」から表示されます。
[^1]:「E-Gov法令検索」の、充実した法令APIやアクセシビリティ、そして使わせてもらった元データのXMLファイルを読むと、(XMLを評価する知識はないんですが)膨大な検討とコストがかけられたことが察せられます(人力でやった部分も多いのでは・・ゾッとします・・)。「巨人の肩に乗って」楽しく開発させて頂いています。

ブラウザのテキスト検索で「第六一五条」と入れれば確かに最速ですが、他の箇所にヒットもするので「ピンポイントで探す方法」で考えます。目次は便利です。「[ゆる言語ラジオ](https://www.youtube.com/@yurugengo)」の堀元さんが「目次こそ人類の偉大な発明の１つ」と言っていた(ような気がします)。

<img width=500px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801207/4aced5e8-74be-7dba-8dd8-0d9512b86d0f.png">

しかし、目次がすでに長い。スマホでもＰＣでも５画面スクロールしたところでやっと出てきます。

## :stuck_out_tongue: ユーザーの確認を待たずに問答無用でジャンプする

スマホアプリの[AND六法](https://app-liv.jp/971320/)さんの実装から多大なインスピレーションを受けています（「パクって」ないです！「モチーフ」を発展させました汗）。

https://app-liv.jp/971320/

現在はストアからなくなっていますが、当時の「定番の法律アプリ」だったと思います。無料版の機能はシンプルでしたが動作は速い方で、何より「条番号検索」機能が素晴らしかった。使い方の説明はいっさいなし。下の番号を押すと「押した番号らしき条番号にジャンプ」します。

<img width=200px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801207/de4988be-eb7c-c5a1-eeed-bd58970c0b16.jpeg">

> マロン：じゃあ、２桁以上だとどうなるの？押す度に行ったり来たりしちゃうのか
> ひばり：ちゃんと入力を待ってくれる。全部の桁を入力「できるであろう時間」が経過したら勝手に飛んでいく！それはもう「問答無用で」ジャンプするよ
> マロン：間違えたらどうするの？
> ひばり：打ち直す
> マロン：何を打ったか確認しながらやれば大丈夫か・・
> ひばり：何を打ったか表示されない。なんならボタンの反応も無い。
> マロン：不親切すぎない？
> ひばり：慣れれば速い。スマホで「キーボードが割り込んでくるストレス」に比べたら誤差の範囲。そして、だんだん楽しくなってくる！

[《法令.app》](https://jplaws.app)では入力を確認する表示と「プログレスバー」を付けました、(AND六法の「Ｓっぽさ」も魅力でしたが、少しソフトにしました）。「次の数字」を入力するとカウントダウンはリセットされます。

<img width=400px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801207/e76e803d-7aaa-a65c-426f-34ad378ea115.gif">

小ネタすぎて「ゲーミフィケーション」とまで言えるかは微妙ですが、少しでも楽しく速く操作できるといいので他の機能にも増やしていきたいと思います（[トップページ](https://jplaws.app)では、アクセスの度にランダムにオススメ法令を見せるなどの「ちょっと楽しい」仕掛けもあります）。

ぜひ一度試してみて下さい！

## :alien: すごい人がいるものですね

[AND六法](https://app-liv.jp/971320/)の作者さんは現役の弁護士さんのようです。

https://androppo.hatenablog.jp/

次回紹介する[SmartRoppo](https://qiita.com/lawyer_alpaca/items/0e434235b1254287ef53)のカルアパ(@lawyer_alpaca)さんも弁護士さんのようです。能力もそうですがバイタリティがすごいですね！
B木 と R木 の違いと用途の理解

## はじめに
データ構造の一つとして広く使われているB木（B-tree）とR木（R-tree）について、具体的な特徴と用途を解説します。これらの木構造は、データベースやファイルシステムなどで効率的にデータを管理するために利用されています。

## B木（B-tree）とは？

### B木の概要

B木は、バランスの取れた木構造の一つで、大量のデータを効率的に管理するために設計されています。主にデータベースやファイルシステムのインデックスとして使用され、一定の深さを保ちながら、挿入や削除が効率的に行えることが特徴です。

### B木の特徴

1. **自己平衡性**: B木は自動的にバランスを取るため、特定の操作に対して最悪の場合でも効率的に動作します。
2. **ノードの高いファンアウト**: 各ノードが多くの子ノードを持つことができるため、木の高さが低く抑えられます。これにより、検索、挿入、削除の操作が高速化されます。
3. **一定の深さ**: 全ての葉ノードは同じ深さにあり、挿入や削除の際に木全体が再構成されることがあります。

### B木の用途

- **データベースインデックス**: B木はデータベースのインデックスとして広く使われており、データの検索、挿入、削除が効率的に行われます。
- **ファイルシステム**: ファイルシステムでは、ファイルやディレクトリの管理にB木が使われることがあります。

### B木の例

以下は、簡単なB木の例です。

```
       [10 | 20]
       /    |    \
    [5]  [15]  [25 | 30]
```

この例では、ルートノードに2つの値（10と20）があり、3つの子ノード（[5], [15], [25 | 30]）が存在します。この構造により、データの検索や挿入が効率的に行われます。

## R木（R-tree）とは？

### R木の概要

R木は、空間データ（地理情報など）を管理するための木構造です。主に範囲検索や近傍検索など、空間クエリに対して効率的に動作することが特徴です。

### R木の特徴

1. **空間データの管理**: R木は、2次元またはそれ以上の空間データを効率的に管理します。
2. **ノードの重なり**: 各ノードは矩形で表され、そのノードに含まれる全てのデータをカバーします。ノードの矩形は重なることがあります。
3. **範囲検索の効率化**: 範囲検索や近傍検索が効率的に行えるように設計されています。

### R木の用途

- **地理情報システム（GIS）**: 地理情報システムで空間データを効率的に管理し、検索するためにR木が使われます。
- **マルチメディアデータ**: 画像や音声データの管理にもR木が利用されることがあります。

### R木の例

以下は、簡単なR木の例です。

```
       +-----------+
       |     A     |
       | +---+ +---+
       | | B | | C |
       | +---+ +---+
       +-----------+
```

この例では、ルートノードAが矩形として表され、その中に2つの子ノードBとCがあります。各ノードは矩形で表され、空間データをカバーします。

## まとめ

- **B木（B-tree）**: 主にデータベースインデックスやファイルシステムの管理に使われ、自己平衡性と高いファンアウトを持つ木構造です。
- **R木（R-tree）**: 空間データの管理に特化しており、地理情報システムやマルチメディアデータの管理に使われます。
【AWS】LaravelのDBをRDSからEC2に移行する

# 移行目的

　個人開発アプリの運用には RDS は高いから。業務プロジェクトで RDS から EC2 に移行するケースはないと思う。

# 環境

```shell
# EC2 OS
$ cat /etc/system-release
Amazon Linux release 2023.4.20240429 (Amazon Linux)

# RDS DB Engine
$ aws rds describe-db-instances \
    --db-instance-identifier database-1 \
    --query 'DBInstances[0].[{Engine: Engine, EngineVersion: EngineVersion}]'
[
    {
        "Engine": "mysql",
        "EngineVersion": "8.0.35"
    }
]
```

# 手順

　EC2 インスタンスを作り、MySQL サーバ/クライアントをインストール。その後 dump をエクスポート/インポートする。最後に Laravel が参照する DB ホストを編集する。

## 1. EC2 インスタンスに MySQL をインストールする

パッケージインストール

```shell
package='https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm'
sudo dnf -y install $package
sudo dnf -y install mysql mysql-community-client
sudo dnf -y mysql-devel
sudo dnf -y mysql-server
```

サービス起動

```shell
sudo systemctl start mysqld
sudo systemctl status mysqld
sudo systemctl enable mysqld
```

初期パスワード確認

```shell
$ sudo grep 'temporary password' /var/log/mysqld.log
2024-06-01T22:51:54.694941Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: /I1dkmqoj3SB
```

バージョン確認

```shell
# Client
$ mysql --version
mysql  Ver 8.0.37 for Linux on x86_64 (MySQL Community Server - GPL)

# Server
$ mysql -h localhost -u root -p$PW -e 'SELECT VERSION();'
+-----------+
| VERSION() |
+-----------+
| 8.0.37    |
+-----------+
```

## 2. 初期ログイン

初期パスワードを利用して接続

```shell
mysql -uroot -p/I1dkmqoj3SB
```

パスワード変更

```sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'aV>#fSlBF06+';
```

ユーザーホスト変更

```sql
RENAME USER root@localhost to 'root'@'%';
```

## 3. データベース移行

RDS から dump をエクスポートし、EC2 の MySQL にインポートする。

## 4. セキュリティグループ設定

Laravel 側 EC2 ※インバウンドルールなし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/ac157ff9-6741-1c13-89f4-fb258a133eb5.png)

MySQL 側 EC2 ※アウトバウンドルールなし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/a75f2504-8a40-2e8c-a7cb-dde1984b7a8c.png)

## 5. .env を編集する

`DB_HOST` を EC2 のプライベート IP アドレスに変更

```diff:.env
- DB_HOST=database-1.c3a7vynvhtxw.ap-northeast-1.rds.amazonaws.com
+ DB_HOST=172.31.32.112 
```

# 参考

https://dev.mysql.com/doc/refman/8.0/ja/getting-information.html

https://dev.mysql.com/doc/refman/8.0/ja/alter-user.html

https://dev.mysql.com/doc/refman/8.0/ja/rename-user.html
ソフトウェア テストとは?

表題の通り、テストとは何か?についていかにまとめる

 テストとは、IEEE標準規格 610.12-1990によれば、
 「ある特定の条件のもとで、システムまたはコンポーネントの操作によりその結果を評価または観察して
 システムまたはあるコンポーネントを評価すること」

:::note
※ある特定の条件とは、テストケースを指す。
:::

テストは組織やメンバーが異なるとソフトウェアテストの目的も異なる。
テストもレベルがあり、以下のレベルの分類できる。

:::note warn

- レベル0
    テストとデバックには差もない。
- レベル1
    
- レベル2
    
- レベル3
    
- レベル4
:::

<h3>テストケース<h3>

有効性と効率を追求するなら、テスト設計を怠ってはならない。設計は英語で「design」だが
- 1 心の中で何かを生み出すこと、考えること 
- 2 体系的に、一般的には文書の形を整理すること
- 3 特定の目的や効果を生み出したり、目論んだりすること
- 4 目標や目的を持って取り組むこと
- 5 高いスキルで設計すること

:::note
優れたテスト設計を作成するには、どれも適用される内容である。
:::

ここで改めて、テスト設計について改めてまとめる。
「最小の時間と労力でほとんどのエラーを検出する確率が高くなるように設計すること」である。

きちんとテスト設計しなければいけない要素は以下が該当する。
- 入力
- 出力
- 実行の順番

[入力]
多くの場合、入力はキーボードで入力されることをイメージされると思うが
インターフェース入力機器からのデータ、ファイルからデータの呼び出し、データが到着した時間のシステム状態なども「入力値」に含まれる。

[出力]
出力も入力と同様に多様性が存在する。出力は多くの場合、コンピュータ画面で出力され流ものだと思われがちである。それに加えて、データシステムやインターフェイスにデータが送られるものも該当する。
データはファイルやデータベースによって書き変わることも可能です。これらのことを「出力」と指す。

[実行の順番]
テストする順番は2通りある。

- 順番通りのテストケース
    作成されたテストケース順にテストする方法。テストケースごとに相互影響を及ぼすリスクは存在する。
    Ex.テスト1で起こった内容をテスト2でそのテスト結果を使う場合である。
    -　テストを作成する
    -　テストを読み出す
    -　テストを更新する
    -　テストを読み出す
    -　テストを削除する

※
メリット:テストケースが一般的に小さくて、単純であること

デメリット: 

- 互いに独立しているテストケース
互いに独立しているため、干渉し合わないテストケース。それぞれが独立しあっている。

※
メリット: どんな順番でもテストができること
デメリット: テストケースが複雑でテスト管理が大変であること


[テストの種別]
テスト種別は大きく分けて、２点ある。
1. ブラックボックステスト
    1. 要件や仕様に基づいたテスト。ソフトウエア内部や構造、ファイルパス、実装に影響するテストではない
1. ホワイトボックステスト
    1. テスト対処であるソフトウエア内部、構造、ファイルパスに基づいて、テストする。 テスト対処であるソフトウエア内部、構造、ファイルパスに影響するテスト。プログラミングスキルが必要なテスト

[テストのレベル]
- 単体テスト
    - 単体は、1つの成果物に対してテストする。言語によって、1つの成果物の区切り方は異なるが、ポイントは1つの成果物(機能など)に対してテストすることを指す 大概は一人称でテストすることが多い
- 結合テスト
    - 統合システムでは、単体をサブシステム、最終的にはシステムとして結合させる 単体テストでは機能していても、結合させると動かないことはある。これを検証するテスト
    - 結合するには、通らざるを得ない結合テストである

- システムテスト
    - システムテストは、完全な統合システムが設計仕様に対して機能するかどうかを確認するためのテスト。個々のコンポーネントやモジュールが正しく結合され、システム全体として期待される動作をするかを検証する

システム全体を対象とし、機能テスト、性能テスト、信頼性テスト、セキュリティテストなど多岐にわたる

-受入れテスト
    -受入テストは、ソフトウェアがユーザーやクライアントの要求と期待を満たしているかどうかを確認するためのテスト。システムが実際の運用環境で使用可能であることを確認する最終段階。

ユーザーやクライアントの要求事項を満たすかどうかに焦点を当てる。システム全体を包括することもあれば、特定の機能や業務プロセスに限定されることもあります。
Laravelで見る用語まとめ

## MVCとは
Webアプリを実装するための効率的な方法の一つ
Webアプリの構造を整理するためのデザインパターン
コードの可読性やメンテナンス性を向上させる。

1. Model
    * データベースとのやり取りを担当。
    * データの保存、取得、更新、削除など。
    * Eloquent ORM（Object-Relational Mapping）を使って、データベースのテーブルとオブジェクトを簡単に対応付けることができる。
1. View
    * ユーザーに表示される部分を担当。
    * HTMLやCSSを用いてユーザーインターフェースを作成できる。
    * Bladeテンプレートエンジンを使って、動的なコンテンツを簡単に生成できる。
1. Controller
    * ユーザーからのリクエストを処理し、適切なレスポンスを返す部分を担当。
    * ルーティングを通じて特定のアクションにリクエストを割り当て、モデルとビューを連携させる。

## マイグレーションとは
SQLを直接使わなくても、データベースを管理できるLaravelの仕組み
データベースのスキーマ（構造）の管理やバージョン管理をする
データベースのテーブルやカラムの追加・変更・削除といった操作をプログラムで定義し、ソースコードとして管理することができる。

## Eloquentとは
LaravelにおけるORM（Object-Relational Mapping）システム
Laravelで提供されているデータ操作のための機能
Modelとデータベースを対応づける
データベースから取得したデータをオブジェクトして扱える

## ルーティングとは
ブラウザから任意のURLにアクセスがあったとき、どのController処理やアクションを実行するか定義する
web.phpファイルに処理を記述
HTTPメソッドも定義できる
(GET, POST, PUT, DELETE)

## バリデーションとは
ユーザーから送信されたデータが特定のルールや条件を満たしているかを検証するプロセス

### バリデーションルールの種類
* required：フィールドが必須であること
* string：フィールドが文字列であること
* integer：フィールドが整数であること
* max:value：フィールドの最大値や最大文字数
* min:value：フィールドの最小値や最小文字数
* email：フィールドが有効なメールアドレス形式であること
* unique:table,column：フィールドが指定されたテーブル内で一意であること
QJoyPadでゲームパッドをデスクトップ操作に使う

デスクトップLinuxで後傾姿勢での操作を改善したいと思い、QJoyPadを導入してゲームパッドをマウス操作とEnter/ESC/メディアキー操作に使えるようにしたらQOLが爆上がりしたのでここに書いておきます。

使っているゲームパッドはGameSir T4 Kaleid（Xbox互換モード、Linuxでの標準）のXY/AB入れ替えモードです。このゲームパッドはジョイスティックが軽めなのでデスクトップ操作にも悪くない感じします（ジャンク扱いっだった自分の個体では斜め入力が少し入りにくいのと、右ジョイスティックが弾いたあと逆まで行く問題がありますが個体差かは不明）。

QJoyPadの設定はGUIでの設定だと登録したい一部ボタン（戻る/進むなど）や一部キー（メディアキーなど）が認識されないため、基本的にレイアウトファイル（Export/Import可能）を直接編集して行った方が良いようです。

現在の自分の設定は次のようになってます（ボタン名はPSコン/任天堂コン準拠）:
* 左ジョイスティック (Axis 1-2) でマウス移動
* 右ジョイスティック (Axis 4-5) および十字キー (Axis 7-8) で縦横スクロール（この操作はタブの切り替えや動画の巻き戻しなどでも使うため十字キー側にも欲しかった）
* L2トリガー (Axis 3) でESC
* R2トリガー (Axis 6) でEnter
* Aボタン (Button 1) で左クリック
* Bボタン (Button 2) で右クリック
* R3/背面右ボタン (Button 11)で中クリック 
* Yボタン (Button 4) で戻る
* Xボタン (Button 3) で進む
* スタートボタン (Button 8) でメディア一時停止
* セレクトボタン (Button 7) でミュート切り替え
* ロゴボタン (Button 9) で音量アップ
* 背面左/L3ボタン (Button 10)で音量ダウン 
* L1ボタン (Button 5) で前のメディア
* R1ボタン (Button 6) で次のメディア
```
# QJoyPad 4.3 Layout File

Joystick 1 {
	Axis 1: gradient, maxSpeed 10, mouse+h
	Axis 2: gradient, maxSpeed 10, mouse+v
	Axis 3: throttle+, +key 9, -key 0
	Axis 4: gradient, +mouse 7, -mouse 6
	Axis 5: gradient, +mouse 5, -mouse 4
	Axis 6: throttle+, +key 36, -key 0
	Axis 7: +mouse 7, -mouse 6
	Axis 8: +mouse 5, -mouse 4
	Button 1: mouse 1
	Button 2: mouse 3
	Button 3: mouse 9
	Button 4: mouse 8
	Button 5: key 173
	Button 6: key 171
	Button 7: key 121
	Button 8: key 172
	Button 9: key 123
	Button 10: key 122
	Button 11: mouse 2
}
```

メディアキーの番号については前回の記事を参照してください:
https://qiita.com/vipper36/items/e9138e6531b0396bc49e

欲を言えばもっとキーが欲しいところ（CTRL+WとCTRL+SHIFT+Tを何とかして割り当てたい）で、一応Button 12-15も認識されてるのですが、多分別のモードに切り替えないと使えないはずなのでこの辺にしておきます。
apt と apt-get、結局どちらを使えばいいのか？

# 経緯
私の理解だと、`apt`は`apt-get`の上位互換という認識であった。
そのため、ほぼ`apt-get`は使わず、`apt`のみを使ってきた。

では、なぜ`apt-get`を使い続ける人がいるのだろう？

# 結論
どちらを使ってもいい。
ただし、状況により`使い分けるのがベター`。
- apt
    - `apt-get`をベースに視覚効果などを強化。リッチになっている。
- apt-get
    - 必要最小限。

 つまり、通常の使用（ターミナル上での使用）では、`「aptを使う」`で問題はない。
 だが、シェルスクリプト上で使うのであれば、メモリ消費が少ない`apt-get`を使うべき。

 # 確かに...
 シェルスクリプト・Dockerfileでは、`apt-get`を目にする機会が多いような気がする。
Dockerとは

## 目次
1. Dockerとは
1. Dockerのメリット①
1. Dockerのメリット②
1. Dockerのメリット③
1. Dockerのメリット④
1. コンテナ型と仮想化マシンの違い
1. まとめ

## Dockerとは
#### 「コンテナ型の仮想環境を手軽に構築するためのもの」
Dockerでは、OSやミドルウェアの種類・バージョン・各種設定をDockerfileと呼ばれるコードで管理しており（IaC[^1]）、Dockerfileを元に仮想環境（コンテナ）を作成することができる。

[^1]:Infrastructure as Code

## Dockerのメリット①
#### 「どのコンピュータ上でも全く同じ環境を作成することができる」
コンピュータのOSに依存せず同じ環境を作成できるため、「Windowsを使用しているAさんの環境では動作するが、Macを使用しているBさんでは動作しない」といったことがない。

また、開発チームのメンバーが同じDockerfailを元に環境を作成することにより、メンバー間の開発環境の差異をなくすことができる。


## Dockerのメリット②
#### 「環境設定の再利用・バージョン管理・配布が容易」

環境設定がコード（Dockerfail）で管理されているため、設定の一部を書き換えたり、Gitでバージョン管理を行うことが容易である。

また、開発チームに新しいメンバーが加入した際に、手順書を見ながら1から環境を作成する必要がなく、配布されたDockerfileからコンテナを作成することで手軽に開発環境を作成することができる。


## Dockerのメリット③
#### 「クラウド上に自動でサーバを構築することができる」
Dockerfileから作成したコンテナイメージ[^2]を使用することで、自動でクラウド上にサーバを構築することができる。
それにより、クラウド上のGUIから環境設定を行う必要がなくなる。

[^2]:コンテナを立てるために必要なコマンド・メタデータを含んだ、Docker環境で実行可能なパッケージ。Dockerファイルを元に作成される。


## Dockerのメリット④
#### 「Docker Hubで公開されているコンテナイメージを使うことができる」
Dockerfileを1から記述する必要がなく、予め用意されたコンテナイメージを使用することができる。
（ubuntu、centOS、NGINX、Apache、node、MySQLなど）

また、公開されているコンテナイメージをベースに独自の設定を追記することもできる。


## コンテナ型と仮想化マシンの違い

#### 【コンテナ型】
ホストOSのカーネルを利用して、あたかもゲストOSがあるかのように仮想環境を作り上げているもの。
メリット：軽量で高速に仮想環境の起動・停止ができる。

#### 【仮想化マシン】
仮想化ソフト上にゲストOSを構築しているもの。


## まとめ
Dockerとは、「コンテナ型の仮想環境を作成・配布・実行するためのもの」である。
Dockerを使用することで以下のメリットがある。
　①どのコンピュータ上でも全く同じ環境を作成することができる
　②環境の設定がコード化されているため、再利用・バージョン管理・配布が容易
　③クラウド上に自動でサーバを構築することができる
　④Docker Hubで公開されているコンテナイメージを使うことができる


 ## 参考文献
 https://youtu.be/B5tSZr_QqXw?si=x2cXLIeKKGQvvdRN
 
 https://youtu.be/s1FVLHSDIZE?si=zSxLHLJBLNnn6Edo
0_1_0_Node-REDとは_flipper's circuit Project -電子工作人口を増やすためのプロジェクト-

電子工作を進めるにあたり、ソフトウェア面でのエンジニアリングから触る人も多い（ソフトウェア界隈の方を引き込んだ節もある）ので、そのイメージを具現化できるツール「Node-RED」について少し説明します。
この次の記事で、[実際のインストール方法](https://qiita.com/comchiki66/items/4127c46c1703d9740964)について解説します。

# Node-REDってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308477/c4935f90-9818-fb1c-f5aa-5c63c66eb38d.png)

「Node-RED」は、「ハード」「API」「オンライン・サービス」などを組み合わせて使う際に、それらを簡単につなぐことができるサービスです。
「ハード」と「API」、「API」と「オンライン・サービス」のように別のものをつなぐことはもちろん、「ハード」同士、「オンライン・サービス」同士をつなぐこともできます。

IBM社の「英国はーずりー研究所」で開発された、「MQTTメッセージのマッピングを可視化」する簡単なツールだったそうです。実際使用してみるとわかるのですが、PowerAutomateのような「ビジュアルプログラミングスタイル」ができるツールです。「IoT」のみならず、「RPA」や「ブロックチェーン」の分野でも活用されています。

詳細は公式サイトで→https://nodered.org/

# Node-REDをホスティングしたサービス一覧

| 社名 | 製品 |
| - | - |
| IBM | Node-RED on IBM Cloud |
| Intel | Intel IoT Gateway |
| Uhuru | enebuler |
| STMicroelectronics | STM32CubeMonitor |
| AT& T | AT&T Iot Platform |
| NEC | Obbligato, CONNEXIVE IoT Connectivity Engine |
| LG | Workflow Designer |
| さくらインターネット | さくらのクラウド |
| Samsung | Artik,Samsung Automation Studio |
| GE | Predix Developer Kit |
| Cisco | Meraki |
| Siemens | SIMATIC IOT2020, MindSphere Visual Flow Creator |
| Schneider Electric | Edge Box |
| Sense Tecnic | FRED |
| Partic | IoT Rules Engine |
| 日立製作所 | Lumada Solution Hub |
| Hewlett Packerd Enterprise | Edgeline OT Link |
| 富士通 | COLMINA Platform, INTELLIEDGE A700 Appliance |
| ぷらっとホーム | OpenBlocks |
| 東芝 | SPINEX |
| Nokia | Nolia Innovation Platform |

日本Node-RED協会というものもあるのですね。
https://nodered.jp/

では次の記事で、実際のインストール方法について解説します。

[インストール方法の記事へ](https://qiita.com/comchiki66/items/4127c46c1703d9740964)
【ChatGPT＋DALL-E3】騙し絵を描こう。


　どうも、カーブミラーです。

　今回は、騙し絵を描こうと思います。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　ニュースがないので
　　さっそく本題です😅

　“騙し絵”はご存知でしょうか？

　ChatGPT（GPT3.5）に
　　尋ねてみました。
***
***user***
騙し絵とは？

***ChatGPT（GPT3.5）***
騙し絵とは、見る角度や距離によって異なる図像が現れる絵画や図形のことです。例えば、遠くから見ると一つの絵に見えますが、近づいて見ると別の絵に見えるようなものが騙し絵の一例です。これは視覚の錯覚を利用しているため、驚きや面白さを感じさせる効果があります。

***user***
どんな種類がありますか

***ChatGPT（GPT3.5）***
騙し絵にはいくつかの種類があります。代表的なものをいくつか挙げてみますね。

1. **アンビグラム**：文字や図形が回転することで、複数の意味や形が現れるもの。
2. **モーション絵画**：動くように見える絵画で、視覚的なトリックを利用しています。
3. **立体騙し絵**：平面の絵でも立体的に見えるような錯覚を利用したもの。
4. **隠し絵**：特定の視点から見ると隠れた図像が現れる絵。
5. **ジグソーパズル絵**：複数の絵が組み合わさって一つの絵になるようなパズル状の絵。
6. **幾何学的騙し絵**：幾何学的な形やパターンを利用して視覚的な錯覚を生み出す絵。

これらの種類にはさまざまなバリエーションがあり、視覚的な驚きや興味を引く効果があります。
***

　ここでは、
　　立体騙し絵を
　　　やってみたいと思います。

　やり取りを出しますが、
　　これの前に、少しやって
　　　和文プロンプトを
　　　　持ってきて
　　　　　イジっています。

　では、どうぞ。
***
***user***
若い女性の写実的なだまし絵。 
絵は正方形。
女性は現代的なカジュアルな服を着ており、自然で表情豊かな表情をしている。
髪の長さは中くらいで、少しウェーブがかかっており、手を伸ばしたり傾いたりして立体感を出している。

***ChatGPT***
（リアルイラストだが騙し絵ではない）

***user***
これは紙に描かれています。紙の背景は机の上

***ChatGPT***
（机の上にある）

***user***
飛び出すような騙し絵にして

***ChatGPT***
（飛び出さない）

***user***
騙し絵が紙からはみ出しているように、紙をカットしてください

***ChatGPT***
![1717297159572.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/8dc4b264-cf2e-8429-aad9-2669cca2d9f5.jpeg)

***user***
英語プロンプト出力。略さずに和訳。

***ChatGPT***
### 英語プロンプト
```plaintext
A realistic trompe-l'oeil painting of a young woman in a modern, casual outfit. The painting is on a piece of paper placed on a desk. The woman has medium-length, slightly wavy hair and stands in a way that creates a three-dimensional effect by reaching out with her hand or leaning, giving the illusion that she is popping out of the paper. The paper is cut to fit the edges of the painting, enhancing the illusion that the painting is extending beyond the paper. She has a natural, expressive face. The background is the desk where the paper is placed.
```

### 和訳
現代的でカジュアルな服を着た若い女性の写実的なだまし絵。絵は机の上に置かれた紙の上にあります。女性は中くらいの長さの少しウェーブがかかった髪をしており、手を伸ばしたり体を傾けたりして立体的な効果を生み出し、紙から飛び出しているように見える錯覚を与えます。紙は絵の端に合わせて切られており、絵が紙を超えて広がっているように見える錯覚を強調しています。女性は自然で表情豊かな顔をしています。背景は紙が置かれている机です。

ご確認ください。他にご質問があればお知らせください。
***
　確実に生成できるかは
　　疑問ですが、ここまでできるのは
　　　ありがたいことです。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
結局部品はどこで買った方がいいのか。秋月電子、Digikey、マルツから考えてみる

今回電子部品は、どこから買った方がいいのか何件か相談を受けたので
記事にしてみた。

まず用途によって変わってくると思う。
趣味でよくある部品を使うんであれば、
秋月電子で間違いない。

秋月電子は、Digikeyやマルツと比べると部品の金額が安い。

しかし、製品開発などで部品を購入するならマルツがいい。
部品代は秋月電子の方が安いが色んな部品があるし、
BOM登録ができるので2回目からの注文もし易い。

表にまとめると以下のような感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/54b0edec-8a95-7345-af74-15fed2086a60.png)

私は企業案件が多いのでDigikeyで検索や部品のパーツデータをゲットして、
BOMを作成し、マルツで注文しています。
VirtualBox ネステッドVT-x/AMD-V有効化

# 環境
OS: Windows 10 Home
CPU: intel core i7 11700K
VirtualBox version: 7.0

# したいこと
VirtualBox上で起動した仮想マシン（Ubuntu 22.04)で，仮想マシンを起動したい．
これをするためには，VirtualBoxの設定で「ネステッドVT-x/AMD-V」を有効化する必要がある．

# 問題
![](https://storage.googleapis.com/zenn-user-upload/9fbd847dcfea-20221106.png)

上の画像のように，チェックボックスがグレーアウトされている．
「ネステッドVT-x/AMD-V」を有効化するための条件は満たしているにもかかわらず．

# 解決策
「VBoxManage」コマンドを使用する．

```
PS C:\Users\nyanyanya> VBoxManage -v
7.0.0r153978
```
VBoxManageコマンドが認識されません系のエラーがでてない場合はPathが通っていない可能性があるので，パスを通す．

パスの通し方は以下参照
https://qiita.com/shinakazu/items/ddd7fb51d26f641af041

パスが通っているのを確認できたら，以下のコマンドで「ネステッドVT-x/AMD-V」を有効化できる

```
PS C:\Users\nyanyanya> VBoxManage modifyvm 'ubuntu_22.04.1_TLS' --nested-hw-virt on
```

筆者は仮想マシン名を'ubuntu_22.04.1_TLS'にしているので，適時読み替えるように．

# 結果
![](https://storage.googleapis.com/zenn-user-upload/3f7bcbed0f6f-20221106.png)

「ネステッドVT-x/AMD-Vを有効化」のチェックボックスにチェックが入りました．

起動した仮想マシンの中でも仮想化できるか確認
```
nyanko@ubuntu-22:~$ egrep -c '(vmx|svm)' /proc/cpuinfo
8
```

# はまりどころ
「ネステッドVT-x/AMD-Vを有効化」のチェックボックスにチェックが入ったにも関わらず，起動した仮想マシンの中での `egrep -c '(vmx|svm)' /proc/cpuinfo` の出力が0になってしまう．

```
nyanko@ubuntu-22:~$ egrep -c '(vmx|svm)' /proc/cpuinfo
0
```

原因：Hyper-Vが有効化されていたから．
以下の方法でHyper-Vを無効にしたらいけました．

https://helpdeskgeek.com/virtualization/how-to-fix-vt-x-is-not-available-verr_vmx-no-vmx-error-in-virtualbox/#:~:text=under%20Advanced.-,Fix%202%3A%20Disable%20Hyper%2DV,-Microsoft%20Windows%20has
ABC356回答メモ

# 0.はじめに
　茶色落ち目前のがけっぷちで参加。
 A~Cもややこしくすんなりいきませんでしたが何とかAC。
 D以降はさらに難易度が上がり1時間かけてもDは解けませんでした。
 レートは-8で802とぎりぎり緑に残りましたが、もう誤差の範囲ですね。


# 1.A - Subsegment Reverse
　A問題からなかなか面倒な問題。
  １～Nのリストを作って
  １～L-1のリスト+L~Rを逆にしたリスト+R+1～のリストを
  結合したリストを作り出力
  スライス指定の微調整に時間がかかりましたが無事ACでした。

　https://atcoder.jp/contests/abc356/submissions/54087286


# 2.B - Nutrients
　素直に計算するだけの問題。
 【考え方】
  　各食品ごとの栄養素リストを読み
  　Aの栄養素リストから引いていく。
  　最後にAの栄養素リストを先頭から見て
  　０より大きいものが残っていればNo
  　残ってなければYesを出力して終了

　https://atcoder.jp/contests/abc356/submissions/54092020


# 3.C - Keys
　鍵の数が最大15と少なめなので
 全パターンをbit全探索で調べることはわかったので
 あとはそれの実装方法を考えるだけでした。
 【実装】
 　1.N,M,Kを入力
 　2.テストで使用した鍵リストを保持するリストLを初期化
 　3.テスト結果を保持するリストRを初期化
 　4.以下M回繰り返し(テスト結果読み込み)
 　　-1.リストlに1行入力
 　　-2.リストAにlの2文字目からl[0]文字格納(テストで使用した鍵リスト)
 　　-3.リストANにリストA-1をint型として格納
 　　-4.LにANを追加
 　　-5.Rにl[-1](テスト結果)を追加
 　5.答え用変数ansを0で初期化
 　6.以下2のN乗回繰り返し(変数i＝回数)
 　　～ビット全探索用鍵リスト作成(リストPの0は偽物のカギ、1は本物のカギ)
 　　-1.変数bに”f'{i:0=15b}'”(iを15桁0埋めの2進数に変換)
 　　-2.リストPにbの15-N桁目以降をリスト化してセット
 　　-3.変数okに1をセット(リストPの内容でテストケースがすべて正しければ1)
 　　-4.以下M回繰り返し(変数j=回数)
 　　　-1.変数ca(j回目のテスト時に本物の鍵を使った回数)に0をセット
 　　　-2.リストL[j]を先頭から読み出しcaにint(P[k])を加算
 　　　-3.caがK以上でR[j]が"o"の時は何もしない(テストケースと鍵の真偽が一致)
 　　　-4.caがK以下でR[j]が"x"の時は何もしない(テストケースと鍵の真偽が一致)
 　　　-5.-3、-4以外の時はokを0に変更(テストケースと鍵の真偽が一致しない)
 　　-5.ansにokを加算
 　7.ansを出力して終了

　bit全探索はもう少しスマートな実装があった気がしましたが
 力技になりました。
 無事、TLEもでずACでした。

　https://atcoder.jp/contests/abc356/submissions/54115101


以上