OmniAICreator/Qiita-1.07M huggingface dataset:
【Docker】ベースイメージで使用するパッケージマネージャと確認方法

Dockerfiでイメージを使用する際、ベースイメージに含まれるパッケージマネージャを正しく理解しておくことが重要です。この記事では、ベースイメージのOSに基づいて適切なパッケージマネージャを確認する方法を紹介します。

## ベースイメージに含まれるパッケージマネージャの確認方法

#### 1. Nginxイメージをbashで起動
まず、NginxのDockerイメージをbashで起動します。これにより、コンテナ内でコマンドを実行できるようになります。

```bash
docker run -it nginx:latest bash
```

#### 2. OSのバージョン確認
次に、コンテナ内で以下のコマンドを実行し、使用されているOSのバージョンを確認します。

```bash
cat /etc/os-release
```

実行結果は以下の通りです。

```bash
root@dfe351b5662d:/# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
root@dfe351b5662d:/#
```

この結果から、`nginx:latest`イメージは `Debian 12 (bookworm)` をベースにしていることがわかります。

※ Debianのコードネームは映画「Toy Story」のキャラクターからつけられており、Debian 12のコードネーム"Bookworm"は、図書室の主である眼鏡をかけたイモムシです。ちなみに、Debain 13のコードネームは`Trixie`、Debian 14のコードネームは`Forky`に決まっています。

#### 3. パッケージマネージャの確認とDockerfileの作成
Debian系のディストリビューションでは、aptが標準のパッケージマネージャです。そのため、以下のコマンドでパッケージを管理できます。

例えば、Dockerfileで`vim`をインストールする場合は、

```Dockerfile
RUN apt update
RUN apt install -y vim
```

とこんな感じに書きます。


## Alpineベースのイメージ (nginx:alpine)
コンテナを起動してshシェルにアクセスします。

```bash
docker run -it nginx:alpine sh
```

コンテナ内でOSのバージョンを確認します。

```bash
cat /etc/os-release
```

実行結果は以下の通りです。
```
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.20.2
PRETTY_NAME="Alpine Linux v3.20"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
```

`Alpine Linux`は`apk`を使用するので、apkを使ってパッケージを管理します。

```bash
apk update
apk add vim
```
PythonでProtoBufを使いたいのに型アシストが無い

# はじめに
PythonでProtocolBufferを使おうとして、protocを用いて`.proto`ファイルをビルドし、生成された`なんとか_pb2.py`を`import`すると、IDEに「リファレンスがないよ」と怒られ、型アシストもないという問題をどうにかしたい。

# 環境
- Windows 11 Home
- Jetbrains Fleet (Preview)
- Python 3.12

# 原因
protocで生成されたPythonファイルは中身がほぼ無く、実行時に型が動的に生成されてるから。

# 解決方法
protocでのビルド時に引数として`--pyi_out=<出力先>`を追加してあげると、`なんとか_pb2.pyi`も追加で生成してくれるようになり、見事IDEの型アシストが効くようになった。  
Python最高！！！
foobar2000でCDから曲を取込（リッピング）

# やり方

『File』の『Open audio CD…』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b1416f62-4c40-d52e-2d09-a8e834eeb6db.png)

『Rip』ボタン。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5f670603-977e-a08f-8e91-923428ee6500.png)

「CD情報を自動でネットから取ってくる？」と聞かれるので『Yes』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/9031e9fd-961b-5bc7-7552-5cad82da3a10.png)

『Actions』の『Proceed to the Converter Setup dialog』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f9c10dd3-7993-0dbf-4649-5fa43b58db86.png)

例えば下記なら
『cd』という名前の取り込み設定は、WAVで取り込む
という設定です。
**左が設定名、右が設定内容** といった感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/44840005-75ae-2c35-fd86-899c91470e06.png)

例えば下記をクリックすれば…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/fb7fa05d-8cab-b557-7993-43a1c8265c49.png)

* どのフォルダーに取り込む？
* ファイル上書き発生したらどうする？
* どういうファイル名で取り込む？

といった設定が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7d026b5d-b8e4-c712-766d-97f6a1802445.png)

下記で『cd』という名前の設定を上書きすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c5e10a70-8769-951d-3361-3c2bac15981c.png)

『Convert』で取込（リッピング）開始。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7cc843da-2cf2-26f7-6150-be1ce841419d.png)

# 蛇足

TODO:『Various Artists』問題
1つのアルバムにいろんなアーティストがいると、全曲のアーティスト名が『Various Artists』になってしまう…。
『track artist』なるメタデータに個別のアーティスト名があるっぽい。
でもその値をアーティスト名にする方法が分からない。

TODO:フォルダー自動作成
フォルダーを手作成している状態なのでCD名から自動で作成する方法あるか調べる。

# 参考サイトさん

https://ordinarysound.com/post-12732/

# バージョン

Microsoft Windows [Version 10.0.22631.4037]
foobar2000 v2.1.5 [×64]
paiza * qiita記事投稿キャンペーンに参加してみた：Cランクスキル「宝くじ C編」

# はじめに
paizaとqiitaの記事投稿キャンペーンに参加してみました。の流れでCランクの問題にもチャレンジ内容を解説しました。

*関連記事*
https://qiita.com/hyonkichi/items/b17aef92bb560d6a53f3

# 問題
https://paiza.jp/works/mondai/c_rank_skillcheck_archive/lottery

# 解答コード
```c
#include <stdio.h>
int main(void){
    // 自分の得意な言語で
    // Let's チャレンジ！！
    char str[1000];
    int i;
    int tousen_num, tousen2_num, tousen3_num;
    int kounyuu_num;
    int ticket_num;
    
    fgets(str, sizeof(str), stdin);
    sscanf(str, "%d\n", &tousen_num);
    tousen2_num = (tousen_num%10000);
    tousen3_num = (tousen_num%1000);
 
    fgets(str, sizeof(str), stdin);
    sscanf(str, "%d\n", &kounyuu_num);
    
    for(i=0; i<kounyuu_num; i++)
    {
        fgets(str, sizeof(str), stdin);
        sscanf(str, "%d\n", &ticket_num);        
        if(ticket_num == tousen_num)    //1等チェック
        {
            printf("first\n");
        }
        else
        {
            if((ticket_num == (tousen_num+1))||(ticket_num == (tousen_num-1)))    //前後賞チェック
            {
                printf("adjacent\n");
            }
            else
            {
                ticket_num %= 10000;
                if(ticket_num==tousen2_num)    //2等チェック
                {
                    printf("second\n");
                }
                else
                {
                    ticket_num %= 1000;
                    if(ticket_num==tousen3_num)    //3等チェック
                    {
                        printf("third\n");
                    }
                    else
                    {
                        printf("blank\n");
                    }
                }
            }
        }
    }
    return 0;
}
```
# 解説
プログラムの流れ
* 変数の定義と初期化:
str[1000]は、標準入力から取得した文字列を格納するためのバッファです。
tousen_numは、当選番号を格納する変数です。
tousen2_numとtousen3_numは、当選番号の下4桁および下3桁を格納するための変数です。
kounyuu_numは、購入した宝くじの数を格納する変数です。
ticket_numは、各宝くじ番号を格納する変数です。

* 抽選番号と購入番号の取得:
最初のfgetsとsscanfで当選番号を取得し、tousen_numに格納します。
tousen2_numとtousen3_numには、それぞれ当選番号の下4桁と下3桁が計算されて格納されます。
2つ目のfgetsとsscanfで、宝くじの数を取得し、kounyuu_numに格納します。

* 当選判定のループ処理:
forループ内で、購入した宝くじの番号を1つずつ取得し、当選番号との比較を行います。
まず、購入した番号が当選番号と完全に一致する場合、1等として"first"と出力します。
その後、前後賞の判定を行います。購入した番号が当選番号の前後1桁違いの場合、"adjacent"と出力します。
それ以外の場合、購入番号の下4桁を当選番号の下4桁と比較し、一致すれば2等として"second"と出力します。
下4桁が一致しなければ、さらに下3桁を当選番号の下3桁と比較し、一致すれば3等として"third"と出力します。
上記のいずれにも該当しない場合は、"blank"と出力します。

* ポイント
1等、前後賞は直感的ですが、2,3等の確認については十進数で表現された番号の"桁を落とす"という工程が発生するのが肝と思います。
16進数であれば0x0FFFのような固定値とANDをとる方法がパッと思いつきますが、今回は十進数なので10000や1000の余りを取得することで頭の桁を落とした番号を算出するのがポイントです。

# 終わりに
点数自体は100点がついたコードですが、
* 各等級の判定処理を関数化して、もっとすっきりした処理かつ再利用性を上げる
* 直値の使用は避ける
など実務では最低限上記を修正したほうが良いだろうと思います。（保険）
名刺バインダー管理 (paizaランク B 相当):Python3解答例

[名刺バインダー管理 (paizaランク B 相当)](https://paiza.jp/works/mondai/b_rank_skillcheck_archive/name_card)

https://paiza.jp/works/mondai/b_rank_skillcheck_archive/name_card

### 背景
![スクリーンショット 2024-08-17 20.24.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527611/015c47bf-1587-6236-3af8-9e1eaf57f0b3.png)

1枚のファイルには、n個のポケットが横に並んでおり、表と裏の両面から名刺を眺めることができます。
このため、1つのポケットには、2枚の名刺が背中合わせに入っています。

- 1番からn番の名刺は、1枚目のファイルの表面から見たときに左詰めに並んでおり、
- n+1番から2n番の名刺は、1枚目のファイルの裏面から見たときに左詰めに並んでいます。
- 2枚目以降のファイルにも同様に名刺が並んでいます

このプログラムは、名刺を収納したバインダーにおいて、与えられた名刺番号 `m` に対応する裏側の名刺番号を求めるものです。各ポケットには2枚の名刺が背中合わせに入っており、1枚のファイルには `n` 個のポケットが並んでいます。

### 全体のコード

以上のステップをまとめると、最終的なコードは以下のようになります。

```python
# 入力を受け取る
n, m = map(int, input().split())

# 名刺番号を調整するために m-1 を計算
adjusted_m = m - 1

# adjusted_m を n で割った商に n を掛けた値を base とする
base = (adjusted_m // n) * n

# adjusted_m を n で割った余りを remainder とする
remainder = adjusted_m % n

# adjusted_m を 2*n で割った余りが n より小さい場合
if adjusted_m % (2 * n) < n:
    # base に 2*n を足して、余りを引いた値を result とする
    result = base + 2 * n - remainder
else:
    # そうでない場合、base から余りを引いた値を result とする
    result = base - remainder

# 名刺番号を出力
print(result)
```


### 例

たとえば、`n = 3`、`m = 5` の場合：
- `adjusted_m = 4` です。
- `base = 3` になります。
- `remainder = 1` です。
- `adjusted_m % (2 * n) = 4` なので、`4 < 3` は偽です（つまり、名刺は裏側にあります）。
- `result = base - remainder = 3 - 1 = 2` となり、出力されるのは `2` です。

### ステップごとの詳細

このコードは、名刺の番号 `m` が与えられたときに、その名刺がファイルのどちらの面にあるかを判断し、その裏側にある名刺の番号を計算して出力するものです。以下にコードの各部分を詳しく説明します。

### コードの解説

#### 1. 入力を受け取る
```python
n, m = map(int, input().split())
```
まず、n と m の2つの整数値を標準入力から受け取ります。この際、input() 関数で入力を受け取り、split() でスペース区切りの値に分割し、map() 関数を使ってそれぞれを整数値に変換します。
- `n`: 1つのファイルに含まれるポケットの数を表します。
- `m`: 名刺の番号です。
- `input().split()` は、入力された文字列をスペースで区切り、それを整数に変換して `n` と `m` に代入します。

#### 2. 名刺番号を調整する
```diff_python
adjusted_m = m - 1
```
- 名刺番号 `m` を0ベースに変換するために、`m-1` を計算して `adjusted_m` に代入します。これにより、計算が簡単になります。

#### 3. `adjusted_m` を `n` で割った商に `n` を掛けた値を `base` とする
```python
base = (adjusted_m // n) * n
```
- `adjusted_m` を `n` で割った商（整数部分）に `n` を掛けた値を `base` として計算します。これは、名刺が属するファイルのブロックの開始番号に相当します。

#### 4. `adjusted_m` を `n` で割った余りを `remainder` とする
```python
remainder = adjusted_m % n
```
- `adjusted_m` を `n` で割った余りを `remainder` として計算します。これは、名刺がそのブロック内で何番目に位置しているかを示します。

#### 5. 条件による分岐
```python
if adjusted_m % (2 * n) < n:
    result = base + 2 * n - remainder
else:
    result = base - remainder
```
- `adjusted_m % (2 * n) < n`: 名刺がファイルの表側にあるかどうかを判断します。
  - 表側にある場合 (`adjusted_m % (2 * n) < n`)：
    - `result = base + 2 * n - remainder`: `base` に `2 * n` を足し、`remainder` を引いた値を `result` とします。これにより、裏側の名刺番号を計算します。
  - 裏側にある場合：
    - `result = base - remainder`: `base` から `remainder` を引いた値を `result` とします。これにより、表側の名刺番号を計算します。

#### 6. 裏側の名刺番号を出力
```python
print(result)
```
- 最後に、計算された `result`（裏側の名刺番号）を出力します。
AWS認定(SAP)合格

# 初めに

AWS認定(SAP)、やっと受かりました。
あまり参考にはならないかと思いますが、難関といわれるSAPが私でも合格できるという事を皆さんに知っていただきたいので記事にします。

## SAPとはなんぞや
AWSのSolution Architectの上位資格で、AWS でのクラウドアーキテクチャの設計とデプロイにおいて 2 年以上の実践的な経験を持つ個人を対象とするもの。
[AWS Certified Solutions Architect - Professional](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)

## 来歴
- 27歳くらいまで福祉関係の仕事をしていた
- インフラエンジニア歴2年半
- AWSは2年ほど経験
- 勉強は嫌いだが技術は好き
- 所持するAWS認定はSAAとDOA

## 受験までの道のり
1. 会社でSAPを取得している新人の方が入ってきて焦る(当時はSAAだけ合格している状態)
自分も取りたいと思う。しかし、SAPの試験難易度は高く勉強嫌いが災いしほどなくあきらめる。
2. 半年間SAPを忘れて過ごす。その後転職する。
3. 転職した会社にもSAP取得済み新人の方が入ってきて焦る(2回目)。
4. 問題集を引っ張り出して勉強を始める。焦りが高じて1ヶ月後の受験を計画する。
5. 2024の猛暑にやられて思うように勉強できず2週間くらい前に本格的に勉強を始める。
6. 受験の一週間前はお盆で里帰りをする。親戚へのあいさつや家族イベントに追われる毎日。
7. 受験の前々日に帰宅。いそいそと勉強を始める。

## 受験前日
このままでは受からないと気づく。
[Cloud License](https://cloud-license.com/exam/sap/)は受験者の評価が高いのでこれに賭けるしかないと思い、とにかく練習問題に専念。
一日中問題を解き、もうゴールしてもいいよね...と思いながら寝た。

## しくじった事
- 受験直前に係員さんから受験の言語を英語に設定しているが間違いがないかと聞かれる
- 間違いだったが、直前の変更はできないようなのでそのまま受験する事に
- 日本語で勉強していたため、受かる自信は30%位になった

## 結果
問題は英語表記だったが、それほど難しい表現がなかったのでとりあえず全問解く事はできた。
すべて解いた後、終了時間ぎりぎりまで見直しをしていた。
慣れない英語に疲労感は増しつつ、3時間...。もうこれだけで十分頑張ったと思った。

結果は...829点で合格！
え、本当に受かっていいの？


# 終わりに
新人が入ったことで自分の立ち位置を気にして勉強を始めるという情けないスタートだったが、勉強している間に今後役に立ちそうな知識をつけることができたため結果オーライにしたいと思った。
とはいえ、SAPを受ける前にDevOpsやらSysOpsを合格する方が順番として正しかったはず。
資格を持っていればいるほど良いというわけではないけど、真面目にやるなら順番を守ることをお勧めしたい。
AtCoder Beginner Contest 134

## C - Exception Handling

https://atcoder.jp/contests/abc134/tasks/abc134_c

### 解説

- 累積maxが使える
    - L: 0からi-1までの累積max
    - R: nからi+1までの累積max
- ソートする方法もあり？

### 実装例（C++）

```cpp
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n;
    cin >> n;

    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }

    vector<int> L_max(n, 0);
    vector<int> R_max(n, 0);

    // L_max[0] = 0
    for (int i = 1; i < n; i++) {
        L_max[i] = max(L_max[i-1], a[i-1]);
    }

    // R_max[n-1] = 0
    for (int i = n-2; i >= 0; i--){
        R_max[i] = max(R_max[i+1], a[i+1]);
    }

    int result = 0;
    for (int d = 0; d < n; d++) {
        result = max(L_max[d], R_max[d]);
        cout << result << endl;
    }
}
```
【豆知識】なぜunique: trueを追記するのか？

# はじめに
学習過程において「一意」という日本語が「？」でした。この言葉と出会ったのが`unique: true`というコードを知った時です。このコードは一体どのような意味なのか？追記することの利点は何なのか。調べたことをアウトプットしたいと思います。

## 環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3

## unique: trueはどういうものか
`unique: true`は、データベースのテーブルやフィールドに設定するオプションになります。このオプションを付けるメリットや特徴、例は以下の通りです。

### 【メリット・特徴】
**重複値の防止**: 同じ値が複数存在することを許さないから、データの整合性が保たれる。
**検索性能の向上**: ユニークな値が保証されることで、インデックスが効率的に利用される。
**エラーの早期発見**: 重複したデータを挿入しようとするとエラーが発生するため、早めに問題がわかる。


### 【簡単な例】
1. **ユーザーのメールアドレス**
    - `email: { type: String, unique: true }`
    - 同じメールアドレスのユーザー登録を防ぐ。
2. **商品コード**
    - `product_code: { type: String, unique: true }`
    - 同じ商品コードを持つ商品が存在しないようにする。
3. **IDフィールド**
    - `user_id: { type: Number, unique: true }`
    - 各ユーザーに一意のIDを持たせ、重複を防ぐ。
4. **投稿のタイトル**
    - `title: { type: String, unique: true }`
    - 同じタイトルの投稿が複数できないようにする。
5. **ライセンスキー**
    - `license_key: { type: String, unique: true }`
    - 同じライセンスキーが複数のユーザーに割り当てられないようにする。

### **追記しない場合と追記する場合の違い**

- **追記しない場合**: 例えば、ユーザーのメールアドレスが重複して登録できてしまう。これにより、同じメールアドレスを持つ複数のアカウントが存在することになり、ログインや通知の際に混乱が生じる可能性がある
- **追記する場合**: ユーザーが登録しようとした際に、既に存在するメールアドレスであればエラーが返され、登録が拒否される。これにより、データの整合性が保たれ、ユーザー体験も向上する


## 私が課題の中で遭遇したunique: trueについて
パスワードリセットに関する機能で、作成されたマイグレーションファイルのコードには`unique: true`が含まれていませんでした。
内容は、users テーブルに reset_password_token カラムのインデックスを追加するためのものですが、このままだと上記で説明したように他のユーザーが同じトークンを持つことになってしまいます


```java
変更前
class SorceryResetPassword < ActiveRecord::Migration[7.1]
  def change
    add_column :users, :reset_password_token, :string, default: nil
    add_column :users, :reset_password_token_expires_at, :datetime, default: nil
    add_column :users, :reset_password_email_sent_at, :datetime, default: nil
    add_column :users, :access_count_to_reset_password_page, :integer, default: 0

    add_index :users, :reset_password_token
  end
end


変更箇所
    add_index :users, :reset_password_token, unique: true
```

- 一意のインデックスを追加することで、データの整合性が保証され、複数のユーザーが同じトークンを持つことによる混乱を防ぐことが可能となりました！


## 最後に
プログラミングを学習していく中で、コードの意味が分からなくてつまずくことはもちろんありますが、それ以前に日本語で躓いてしまうことがあるので、わからない今がチャンスと思い、すべて暗記は難しいですが、「確か、こんな意味だった・・・」レベルまでには到達したいもの。いや到達する！
今回の記事が何か参考になれば幸いです。
【VRChat】Unity2019＆VRCSDK3のワールドをUnity2022かつVCCに対応させる

# はじめに
2024年の8月になってようやく**Unity2019&VRCSDK3のワールドをVCC対応させつつUnity2022にアップデート**したので雑に記録しておきます。
手順としては
1. VRCSDK3をVCCに対応させる(SDKのバージョンアップ)
2. Unityのバージョンを2022にアップデート

の順番に別々の作業として行います。VCC対応済みの方は1.を飛ばしても構いません

VCCやUnity2022が必要になるのでインストールなどは各自で調べてやっておいてください。インストールについては以下を参考にするといいかも

https://vr-lifemagazine.com/vrcguide_avatarsetup/#VCC


# 環境
- Unity2019.4.31f を Unity2022.3.22f1 にアプデ
- VRCSDK3WORLD(バージョンは分からない) を VCC に対応
- Windows11

# 1. VRCSDK3をVCCに対応させる
## 1-1. VCCへアップデート
VCCを開きます。
`Project`の`Create New Projectの▼`から`Add Existing Project`を選択します。エクスプローラーが開くので任意のプロジェクトを選択しましょう。選択したら一覧にそのプロジェクトが並ぶはずです。

プロジェクトタイプが「Legacy」と表記されるので右側の`Upgrade SDK`をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303641/1b77af63-fd17-414e-321f-e46edb8c4692.png)

ウィンドウに`Migrate in place`と`Migrate in place(you have a backup)`の2つのボタンがあると思います。
前者がプロジェクトを自動でコピーしてからSDKをアプデで、後者はコピーせずにそのままSDKをアプデします。
事前にバックアップを取っていない場合は`Migrate a Copy`を選びましょう。
ちなみに`Migrate in place`の場合はボタンを2回押す必要があります。まあ押せば分かる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303641/78b06fd5-e6f8-606e-03ca-5c6826c94549.png)


しばらく待つとアップデートが終わります。

## 1-2. エクスプローラーでファイルを削除
アプデが終わったらエクスプローラーでプロジェクトのフォルダまで移動します。

`Assets/UdonSharpフォルダ`と`UdonSharp.meta`を削除します。.metaファイルが見つからない場合は隠しフォルダの表示がオフになっている可能性があります。
さらにUdonSharpを使っているアセット系（Trigger2to3やiwaSyncやワールド用ペン）も同様にファイルと.metaを削除します。

## 1-3. VRCSDKのアップデート
削除が終わったらVCCのProject一覧を開き、先ほどのプロジェクトの右側にある`Manage Project`をクリックします。
package一覧が開くので、そこにある`VRChat SDK-Worlds`を右側の－ボタンを押した後、＋ボタンで追加して入れなおします。
Install Versionが最新になっていれば大丈夫です。

# 2. Unity2022にアップデート
手順はアバタープロジェクトのアプデとほぼ変わりません。

プロジェクト一覧を開き、アップデートしたいプロジェクトのUnityバージョン部分をクリックします。すると`Change Unity Version`タブが開くのでアップデートしたいバージョンを選択します。選択したら'Change to ○○'でバージョンをアップデートします。

SDKのときと同様に`Migrate in place`ボタンが出ますので、バックアップの有無でどちらか選択してクリックしてください。

しばらく待つとアップデートが完了します。
何かしらエラーがあった場合は「セーフモードで開きますか？」的なメッセージが出てきます。何かが壊れている・SDKアプデ時に消し忘れがあるなどの可能性があるので確認しましょう。

無事に終わればプロジェクトが通常通り起動します。

後は、SDKアップデート時に消したアセットがあればそれぞれ対応するものを入れなおしましょう。

# アプデ後に困ったこと
Unity2022アプデ後にワールドをVRChatにアップロードしようとすると

~~~:エラー
AssignSceneNetworkId's reported a failure
~~~

というエラーが出て困っていました。ネットで調べると出てきますが、以下のサイト等を参考にすると解消されましたので参考に。

https://qiita.com/ryousan66666/items/f83c28261b7403fd7e13

https://note.com/tsukiyomirua/n/n04058347db28

# おわりに
以上がアップデート手順でした。
VCCがなかった頃と比べると100倍楽に移行作業が済むようになりました。手作業で呻きながらやってた頃が懐かしい。

それでは便利でモダンな良きVRCライフを……。
お名前.comで購入したドメインをさくらインターネットで利用する（SSL設定まで）

## 前提
- さくらインターネットのレンタルサーバー契約済み

## お名前.comでのドメイン購入
[お名前.com](https://www.onamae.com/)で好きなドメインを購入してください

## お名前.com側でネームサーバーの変更
- ネームサーバー＞ネームサーバーの変更

![スクリーンショット 2024-08-17 19.43.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079496/06515f01-562e-d357-65b2-d528d603f3bd.png)

- 購入したドメインを選択し、その他のサービスのネームサーバー1、2に以下の情報を入力
ネームサーバー1：ns1.dns.ne.jp
ネームサーバー2：ns2.dns.ne.jp

![スクリーンショット 2024-08-17 19.44.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079496/2a511aa1-0751-0596-3c72-fda17107d44a.png)

- 確認＞OKをクリック

**以上でお名前.com側の設定は完了です。**

## さくらサーバーでの設定
- サーバコントロールパネルにログイン
- ドメイン/SSL　> ドメイン/SSLをクリック
![スクリーンショット 2024-08-17 19.47.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079496/96a13bab-ca07-e67f-b08b-c0043629748c.png)

- ドメイン新規追加 > 他社で取得したドメインを移管せずに使う > 追加をクリック
![スクリーンショット 2024-08-17 19.48.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079496/c8abcf1a-3fd9-984f-393a-216d07c017af.png)

- 購入したドメイン名を入力し、追加をクリック
![スクリーンショット 2024-08-17 19.48.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079496/e9015dbc-e9c0-2d2b-34b9-83e79607d119.png)

- 設定 > SSL設定
![スクリーンショット 2024-08-17 19.52.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079496/dd5ad4da-7727-7d3e-3d43-fb6a6f4e958b.png)

- 登録設定を始める > Let's Encrptを利用する
![スクリーンショット 2024-08-17 19.54.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079496/9e89fa53-f88c-e389-c8dd-9a78f565593a.png)

-（SSL設定が完了後）基本設定>Httpsを利用するにチェック 
![スクリーンショット 2024-08-17 19.56.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079496/7b9ae600-484f-06b0-c540-5c999f4fccd6.png)

## メール利用時の設定
https://qiita.com/ishizuki/items/52099399c81aee89f728

## 神サイト様たち
- [初心者向け！お名前.comでドメイン取得後さくらサーバーで設定する方法まとめ](https://tekito-style.me/columns/domain-sakura-server)
- [無料SSL（Let’s Encrypt）を設定したい](https://help.sakura.ad.jp/rs/2153/)
- [独自SSLとは？共用SSLとの違いも合わせてわかりやすく解説](https://shared.gmocloud.com/lp/iinkai/ssl/)
Firebase HostingでデプロイしたReactアプリが表示されない

# 解決方法

## 1. `npm run build`を実行

```console
npm run build
```
buildフォルダの生成を確認できたら成功。

## 2. `firebase.json`を確認する

```json
{
  "hosting": {
    "public": "build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}

```

`"public":`の部分が`"public"`ではなく`build"`になっていることを確認する。

### 3. `firebase deploy`を実行する

```console
firebase deploy
```
リンク先で正常に表示されるか確認する。
Raspberry Pi 5 のファン制御について

Raspberry Pi 5にはファンコネクタが存在するRaspberry Pi5のボード上のGPIO 40 ピンとUSBボートの間にコネクタキャップ付きで配置されている。
使用するには、コネクタキャップカバーをはずして、JST-SH PWMコネクタに挿すことで使用できる。
Raspberry Pi財団のActive CoolerやRaspberry Pi Casse for Raspberry Pi 5が紹介されているが、
Geekworm P511-Bなども安価で使いやすい。

Raspberry Pi OSでは自動制御となっており、温度条件に合わせてファンが制御される
Ubuntuなど、他のOSではFan Coolingのモジュールが入っていないのか、自動制御されない。

## 標準の自動制御仕様

|ラズパイ温度|回転速度の仕様|
|:--|:--|
|50℃未満|0%|
|50℃|30%|
|60℃|50%|
|67.5℃|70%|
|75℃|100%|

温度低下時は、それぞれのしきい値より5℃下がると、ファン速度が低下する。

参考： [Raspberry Pi hardware - Fan cases](
https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#fan-connector-pinout)

## Raspberry Pi5のボード温度確認方法

```
$ vcgencmd measure_temp
```

## Raspberry Pi5のFANコネクタの状態確認

### デフォルトの状態
```
$ sudo pinctrl FAN_PWM
45: a0    pd | lo // FAN_PWM/GPIO45 = PWM1_CHAN3
```

### 一時的に停止した場合
```
$ sudo pinctrl FAN_PWM
45: op dh pd | hi // FAN_PWM/GPIO45 = output
```

### 一時的に100%回転した場合

```
$ sudo pinctrl FAN_PWM
45: op dl pd | lo // FAN_PWM/GPIO45 = output
```

## 一時的な制御変更の方法

### ファンを停止にする
```
$ sudo pinctrl FAN_PWM op dh
```
### ファンを100%回転する
```
$ sudo pinctrl FAN_PWM op dl
```

### ファンの自動制御にもどす

```
$ sudo pinctrl FAN_PWM a0
```
## 自動制御のしきい値変更サンプル

以下の用に設定していくことで、閾値を変更できる。
```:/boot/firmware/config.txt
#Fan PWM
dtparam=cooling_fan=on
dtparam=fan_temp0=50000
dtparam=fan_temp0_hyst=5000
dtparam=fan_temp0_speed=75
dtparam=fan_temp1=60000
dtparam=fan_temp1_hyst=5000
dtparam=fan_temp1_speed=125
dtparam=fan_temp2=67500
dtparam=fan_temp2_hyst=5000
dtparam=fan_temp2_speed=175
dtparam=fan_temp3=75000
dtparam=fan_temp3_hyst=5000
dtparam=fan_temp3_speed=250
```

※変更したら再起動を行うこと。

## 番外）kernel callなどででスピード変更できるのでは？

以下で一時的にスピード変更ができる。ただし自動制御が入った状態では、そのうち勝手に止まる。

```
$ echo 250 | sudo tee /sys/devices/platform/cooling_fan/hwmon/hwmon2/pwm1
```

## TODO
- 各しきい値のテスト
- FANスピードのモニタリング、可視化
Entra ID のセキュリティの既定値群を無効にする

Azureの無料アカウントを作成したので、最初に実施してみる。

# どういう設定か

https://learn.microsoft.com/ja-jp/entra/fundamentals/security-defaults?WT.mc_id=Portal-Microsoft_AAD_IAM

この設定を有効のままにしておくと、Entra ID Freeでも一般ユーザー含めて全員がMFA強制になるため、無効にしておく。
Entra ID P1以上の組織の場合、条件付きアクセスを使うことが多いと思うので、その場合も無効にするはず。

>### セキュリティの既定値群を無効にする
>セキュリティの既定値群を置き換える条件付きアクセス ポリシーを実装する組織では、セキュリティの既定値群を無効にする必要があります。
>
>ディレクトリでセキュリティの既定値群を無効にするには、次のようにします。

# 無効化手順

>1. セキュリティ管理者以上として Microsoft Entra 管理センターにサインインします。
>2. ID>概要>プロパティ を参照します。
>3. [セキュリティの既定値群の管理] を選択します。
>4. [セキュリティの既定値群] を [Disabled (not recommended)] (無効 (非推奨)) に設定します。
>5. [保存] を選択します。

1.でMicrosoft Entra 管理センターとあるが、Azure Portalの[Microsoft Entra ID]管理画面でも実施可。この2つの画面で実施できることはほとんど同じはず（おそらく）。

以下、画面の通りに実施していく。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862159/2bc18731-d91d-14b6-c962-08585088b1b2.png">
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862159/4620aaec-ff38-b119-3e35-799abc86ec24.png">
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862159/cc2c92a9-9141-c578-4c03-f297941e1f08.png">
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862159/f5fe7c2f-554a-3c65-d33d-6e031390e589.png">

無効にする理由をどれか選択しないと保存が押せない。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862159/d809a9eb-46a2-3d8a-3984-b6cf202efcce.png">
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862159/57346c74-9132-c1c2-1c87-342573ceef78.png">
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862159/7ddc2e35-bdc2-636f-ebe8-dfd3145950f2.png">
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862159/9d756a56-8e94-b180-b209-799858651b7a.png">

以上。
今更 pc 用電源ユニットに関する tips とか

ウチでは例えば NEC の LAVIE MY28 などの 「 標準的な micro ATX のマザーボードを使っているスリム PC 」 を中古で仕入れ中身を入れ替えて小間使い用に構成する、ということを、しばしばやります。 

中古 PC でも新しいもの（概ね LGA1150 以降 ？）は 12v 単一の電源とマザーボードが多くなってきているようですが 12v マザーボードは市販されていませんのでこれは今のところ除外したいところですけど外側からは区別がつきませんので CPU の世代で切るしかない、かと。
<br>

さてさて、

今般、「 電源落としたら二度と立ち上がらなくなった事案 」が発生し電源を入れ替えることになりましたがその際いろいろ調べているうちに TFX なる規格というか区分があることを知りました。 正に「 何を今更 」なんですが。

<br>

せっかくなのでちょっと要点とかを まとめて書き出しておくことにしました。 


- Haswell｜Intel Core 4th 以降の省電力機能
    - 出力が 12V 単一なもの
    - Haswell からC6/C7という省電力状態が追加
    - 所謂 deep sleep で最小負荷 50mA を要求
    - ATX 2.31 仕様で規定
    - SCYTHE CORE-TFX275 などの電源は対応していない
- ATX 12V
    - CPU への降圧レギュレータへの供給（黄色と黒の 4 ピン）を付加したもの
- ATX 12VO
    - 出力が 12V 単一なもの
- TFX 12V
    - スリムデスクトップなどに使われている W85mm/D175mm/H64mm なもの
    - 一部メーカに少しだけ異なるものが混在

<br>

参考にしたサイト

- 　https://pcinformation.info/powerunit/standard.html 
- 　https://garesumo.net/pcgarage/index.html
(1話)熱波師おかんのsnowpro core挑戦記：IT未経験の私が挑む資格取得の道

皆さん、こんにちは！関西在住のアキコと申します。私は40代のおかんで、普段は外国人の生活補助を本職にしながら、サウナの熱波師を目指して頑張っています。はい、ここまでだと「なんでサウナのおかんがITの資格に挑戦するの？」と思われるかもしれませんよね。

実は私、ITのことなんて全然わからんし、これまで仕事でパソコンを使うこともそんなにありませんでした。でも、子供たちが大きくなって少し自分の時間が増えた今、何か全く新しいことに挑戦したいと思ったんです。今までの延長線上ではない、全く新しいなにか。で、ひょんなことからSnowflakeという何かわからんもんに出会って、「これ、やったろ！」って思ったんです。

とはいえ、正直言うて、私が本格的にITの資格を取ろうなんて思う日が来るとは、全然想像してなかったです。でも、「思い立ったが吉日」という言葉があるように、やるからには本気で挑んでみたいと思い、取り組みはじめました。

というのが実は1年以上前のことなんです。このブログでは未経験から学んだことを書き出すことで整理と、誰かの参考になったら嬉しいと思って始めました。なのでその道のりを記録していこうと思っています。どうぞ、温かく見守ってくださいね。



Snowflakeとは？
さて、ここからは私が勉強している「Snowflake」について、簡単にご紹介します。

まず、クラウドってわかる？私は最初、全然わからんかったんやけど、調べてみたら「クラウド」って、インターネット上にある見えない場所に、データやらを置いておけることを言うんやって。家に置いてるパソコンとかスマホの中じゃなくて、遠くのデータセンターっていう大きなコンピュータが集まった場所に、データが保管されてるってこと。

例えて言うなら、昔は自分で押入れを用意して、そこに服やら布団やらしまってたのが、今ではみんなで使える巨大な倉庫に預けるようなもんやと思ったらいいかも。そうすると、家がスッキリするし、必要なときにその倉庫からいつでも取り出せる。これがクラウドっていうもんなんやなって理解したわけです。

で、Snowflakeっていうのは、そのクラウド上で使えるデータベースなんです。データベースって聞くと、ちょっと難しく聞こえるかもしれませんけど、要は「大事な情報をしまっておくデジタルな引き出し」みたいなもんやと思ってます。

普通のデータベースやったら、自分でサーバー（データを保存したり処理したりするためのコンピュータ）を用意して、その上で管理するけど、Snowflakeはそんな面倒なことを全部クラウドでやってくれるんです。クラウドのどこかにある大きな引き出しを借りて、そこにデータを入れておく感じですね。

たとえば、冷蔵庫を例にとってみると、自分で大きな冷蔵庫を買ってきて、家に置いて管理するんが普通のデータベースやとしたら、Snowflakeは、どっかの巨大な冷蔵庫を借りて、そこに食材を預けて、必要なときに取りに行くみたいなもんです。しかも、その巨大な冷蔵庫は自動で管理してくれて、いつでも新鮮な状態で食材を取り出せる、そんな感じやと私は思ってます。

そして、Snowflakeのええところは、たくさんのデータを扱う時でも、めっちゃ早く動いてくれるところです。忙しい時は冷蔵庫をどんどん大きくして、一気に料理を作る（つまりデータを処理する）ことができるし、暇な時は冷蔵庫をちっちゃくして節約できる、そんな柔軟さがあるんです。

これから、私のこのSnowflaekを勉強の様子を書いていって、資格のことも詳しく紹介したいとおもいます。初心者やけど、コツコツ頑張りますので、応援してもらえると嬉しいです！
AWS Cloud Practitioner Essentials コースを受講してみた感想


こんにちは！看護師→プログラミング初学者の我那覇です。最近、プログラミングにハマって記事をポンポン書いてる26歳です。今回は、AWS Cloud Practitioner Essentials コースを受講してみた感想をサクッとシェアしたいと思います！

![スクリーンショット 2024-08-17 17.37.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763893/0b69c421-728b-8aab-075e-1f9d3d35cfd4.png)


## AWSを学ぼうとした動機
実は、オリジナルアプリをデプロイしようとした時に、うまくいかず、意味もなくインスタンスを増やしてしまったことがあったんです。気づかず放置していたら、予想外の料金がかかってしまって…かなり苦い経験でした。その時、「ちゃんとAWSを学ばなきゃ」と強く思ったんです。で、ゆくゆくはAWSの資格にも挑戦したいな、ってことで、このコースを受けてみることにしました。

## コース概要
このコース、めっちゃ内容が濃いんです。モジュールが11個もあって、以下の内容を学べます：

- **モジュール 1: クラウドの基礎**  
  クラウドって何？からスタートして、オンプレミス環境とどう違うのか、クラウドがどうビジネスに役立つかを学びます。

- **モジュール 2: AWS の概要**  
  AWSって何？から、コンピューティング、ストレージ、データベースなどの基本サービスについて学びます。これが基礎中の基礎！

- **モジュール 3: AWS グローバルインフラストラクチャ**  
  AWSのリージョンとかアベイラビリティゾーンって何？って思ってたけど、ここでバッチリ解説してくれます。

- **モジュール 4: セキュリティの基本**  
  AWSのセキュリティモデルとか、IAM（アクセス管理）の話です。クラウドって聞くとちょっと不安だったけど、ここで安心感が得られました。

- **モジュール 5: 料金とコスト管理**  
  AWSの料金体系とコスト管理の方法について学びます。節約好きな人にはここ大事かも！

- **モジュール 6～10: AWS サービスの深掘り**  
  EC2とかS3、RDSといった主要サービスを深掘り。実際にどう使うのか、どうやってサービスを組み合わせるのかが具体的に分かります。

- **モジュール 11: 認定試験の準備**  
  AWS認定クラウドプラクティショナー試験についての解説。試験に合格するためのポイントとかを学べます。

## 感想
### 無料でこの充実っぷり
なんといっても、このコースが**無料**で受けられるのはかなり嬉しいポイント。AWSの基本からしっかり学べて、実際にどうやって使うかも具体的にイメージできるから、エンジニア初心者でもサクサク進めます。

### 動画＋トランスクリプトで効率的に学べる
コースの内容は基本的に動画で進めていくんだけど、時間がない時や動画を見るのが面倒って人には**トランスクリプト**がめちゃ便利。これがあるおかげで、サクッと内容をチェックできて、忙しい時でも無理なく学習できるのがありがたい。

### 初学者でも安心！リンクで深掘りできる
![スクリーンショット 2024-08-17 18.15.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763893/3190e61d-0f85-58cb-51a0-3af47706b466.png)

AWS Cloud Practitioner Essentials の中には、専門用語や概念に関する詳細リンクもたくさん用意されてます。これのおかげで、「ちょっと難しいかも？」と思った内容でも、自分で調べたり深掘りできるから、知識が着実に身についていく感じがします。初学者にはめちゃありがたいポイントですね。

### 時々理解度テストが挟まれるから、メリハリがあって飽きない
![スクリーンショット 2024-08-17 18.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763893/62302832-a485-b6a0-9193-b218488ee869.png)

このコース、内容が詰まってるんだけど、ところどころで**理解度テスト**が出てきて、学んだことをすぐに確認できるんです。これがあるおかげで、「ここまで学んだこと、ちゃんと分かってるかな？」って自分でチェックできるし、いい感じにメリハリがついて飽きずに進められます。

### 直感的な操作でスムーズに進められる
AWS Cloud Practitioner Essentialsの良いところは、**直感的な操作性**。進捗状況が一目で分かるし、動画も補足資料も整理されてるから、学習がめっちゃスムーズ。わからないところはナレッジチェックやテストで確認できるのも助かりました。

### 実際に役立つ知識が身に付く
このコース、AWSの具体的なサービス（EC2、S3、RDSなど）について、どうやって実際に使うかをしっかり教えてくれるのがポイント。実践的な内容が多いから、学んだことをすぐに応用できる感じです。

## まとめ
AWS Cloud Practitioner Essentials コースは、無料でめちゃくちゃ内容が濃いから、エンジニアを目指す初心者には超おすすめ。動画＋トランスクリプトで、忙しい人でもしっかり学べるし、用語や概念のリンクで深掘りもできる上に、理解度テストでしっかり定着も図れます。興味があるならぜひ試してみてください！
【セッションレポート】「 Sprocket の Google Cloud 全移行 〜DynamoDB から Cloud Spanner へ〜」に参加しました

# はじめに
本記事はGoogle Cloud Next Tokyo 2024 のDay2(8/2)において 株式会社Sprocket 山下寛人氏 が講演された「Sprocket の Google Cloud 全移行 〜DynamoDB から Cloud Spanner へ〜」のレポートです。

# 公式セッション紹介
> Web 接客ツール「Sprocket」では、エンドユーザーから得られる膨大なデータを管理しており、インフラコストが大きな負担となっていました。そこで、コスト削減を目的としたデータベースの移行プロジェクトを実施しました。
本セッションでは Spanner の導入・移行を検討されている皆様へ、弊社の事例をもとに移行プロセスや効果などについてご紹介いたします。

# 発表資料
- アーカイブ動画は9月に公開されるとのこと(Google Cloud Next Tokyo 2024として)

# 概要／おすすめポイント

ユーザーのWebサイト内での履歴データを「行動データ」としてDynamoDBに保存していたが、書き込み・読み取りが多いシステムであったためDynamoDBの利用コストが大きくなっていたことと、SQLが利用できないために調査や復旧が難しくPoCを経た上でSpannerへの移行を選択した、という話になります。

PoCにおいてSpannerを採用した基準やマルチクラウド構成となる中で何を中心に確認したのか、についても触れられていたので、同じような構成を想定される場合には参考になるかと思いました。

# セッション内容の紹介

セッション内容としては「DynamoDB利用時の課題とSpanner選定のポイント」がメインと捉えました。

#### 1. DynamoDB利用時の課題とPoCのポイント

DynamoDB利用時の課題は次の2点をあげられていました。
- インフラコスト
    - DynamoDBでは書き込み・読み込み・ストレージ料金が発生するが書き込み・読み込みが多くコストがかかっていた
- メンテナンスコスト
    - SQLが利用できないため調査・復旧に時間がかかっていた

Cloud Spannerを選定した理由は次の4点をあげられていました。
- システム要件
    - 現行と同等以上のパフォーマンスが期待できる
    - フルマネージド・高可用性
- インフラコスト
    - 読み込み・書き込みに依存しないコスト体系
- メンテナンスコスト
    - SQLの利用によるメンテ性の向上
- BigQuery連携
    - 将来的にBigQueryにデータを連携したい

Spannerでの性能検証とAWS → Google Cloud のデータ連携箇所の検証をPoCとして実施し、問題ないことを確認されたとのことでした。

ちなみに、DynamoDBからSpannerへの移行については「[DynamoDB から Spanner への移行](https://cloud.google.com/spanner/docs/migrating-dynamodb-to-cloud-spanner?hl=ja)」という資料も公開されており、今回は無停止での移行ということもあり定点移行とストリーム処理を組み合わせて行ったそうです。

テラバイトオーダーの移行も数時間で実施することができたとのことでした。
少なくとも 100GB/h 以上の速度で単純なファイルデータではなく**NoSQL(KVS)からRDBMSへのデータ連携**を実現できているのでだいぶ高速ですね。

# まとめ

このCloud Spannerへの移行を実施することで、45%のインフラコストの削減を行うことが、また、SQLでアクセスできるようになったため、メンテ負荷も低減されたと報告されていました。
ちょうど当日に Bigtable の SQLサポートが発表されていたので、もう少し発表が早ければこちらでもよかったかもしれませんね(Bigtableも読み書きでのコストではないため)。


DynamoDBにはSQLは実行できませんが、[PartiQL](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/ql-reference.html)というSQL互換の言語が利用できます。
コストがメインのお話だったので本質ではないかもしれませんが、APIだけだと辛い場合にはPartiQLなどの利用も検討されると良いと思いました。
ResoniteがUbuntu 22.04 LTSでfpsがでない原因を調べる

2024/8/17時点です

結論　2024/3/1時点でResoniteが動かない為対策の「互換性」をやめるだけです
最近fpsがでなくて今までは70fpsは超えていたのが25fpsしかでなくなりました
「互換性」を設定しなくても動作するようになってました

↓「互換性」を設定

https://qiita.com/t-yamanashi/items/3864cf587f6a8a07ffd8

# 今までの経験で
- GPUのドライバー更新で解決する
- マルチモニターの場合は周波数をすべてのモニターを統一する
  - 　過去240Hzのモニターに液タブ60Hzを追加した時fpsが60Hz以上でなくなりました
    - 他のアプリは240Hz付近でてました
「kaggle Groundmasterに学ぶ機械学習実践アプローチ」の感想

# 難しかった
kagglerが何をしているのかを短くまとめた本。

kaggleに必要なことを一通り舐めることを目標としている。

sklearnやpytorch出来合いのライブラリをゴリゴリ使っていくスタイルで、その中身についての解説はあまり詳しく書かれていない。納得しながら進みたい人には向いてない。

kaggleをやる上での道標にはなるが、その中に出てくる内容を細かく知りたかったら他の本を当たる必要がある。

自分には早すぎたかも。

もっとかんたんな本で勉強したらまた戻ってきたい。
CCTV Cameras: Balancing Security and Privacy in the Digital Age

In today's world, CCTV cameras are ubiquitous, found in nearly every public space and increasingly in private homes and businesses. These devices have become synonymous with security, offering a reliable means to monitor, record, and deter criminal activities. Their presence is a clear signal that safety is a priority, and they play a crucial role in protecting people and property alike.
The evolution of CCTV technology has greatly expanded the capabilities of these systems. High-definition cameras now provide crystal-clear images, even in low-light conditions, making it easier to identify individuals and incidents. Moreover, the integration of smart technologies, such as cloud storage and remote access, allows users to monitor footage in real-time from virtually anywhere, adding convenience and flexibility to traditional surveillance methods.
Despite the clear benefits, the widespread use of CCTV cameras has sparked important discussions about privacy. The ability to record and store vast amounts of footage raises concerns about how this data is used and who has access to it. In public spaces, individuals may feel uncomfortable knowing they are being constantly watched, leading to debates on where to draw the line between necessary surveillance and unwarranted intrusion. Addressing these concerns requires careful consideration and the implementation of clear policies that protect privacy without compromising security.
As technology continues to advance, the future of CCTV cameras will likely see even more sophisticated features, such as AI-driven analytics and enhanced cybersecurity measures to protect against hacking. While these advancements promise to make surveillance more effective, they also underscore the need for a balanced approach that respects individual rights while enhancing public safety. Moving forward, it will be essential to ensure that the deployment of CCTV cameras is both ethical and transparent, maintaining the trust of those they are designed to protect.
![CCTV1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863659/831c602f-73c6-5ccb-6cab-3ed54bdb5794.png)
マイグレーションファイルを作成してもschema.rbファイルが更新されない時の対応


        
初めまして2litrewtと申します。
ruby on railsの学習中に起きた問題とその解決法について説明していきます。


# マイグレーションファイルを作成してもschema.rbファイルが更新されない時の対応

　　
学習中にマイグレーションファイルを作成しました。
(dockerを利用しているので文頭にdocker compose run webをつけています。)
```terminal
docker compose run web rails generate migration CreatePosts title:string body:text user:references
```  


      

      
実行はできたのですがschema.rbファイルには生成したテーブルの情報は記載されず...

```schema.rb
ActiveRecord::Schema[7.0].define(version: 2024_08_17_090454) do

  enable_extension "plpgsql"

  create_table "users", force: :cascade do |t|
    t.string "email", null: false
    t.string "crypted_password"
    t.string "salt"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["email"], name: "index_users_on_email", unique: true
  end
end
```
　　 
一度マイグレーションの適用状況を確認します
```terminal
docker compose run web rails db:migrate:status


database: sample_app_development

Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240815135115  Sorcery core
  down    20240817090454  Create posts
```

どうやらdownになっていたようです。
これを下記コマンドupにします。

```terminal
docker compose run web rails db:migrate:redo
```  

    


      
無事記載されました！！
```schema.rb
ActiveRecord::Schema[7.0].define(version: 2024_08_17_090454) do

  enable_extension "plpgsql"

  create_table "posts", force: :cascade do |t|
    t.string "title"
    t.text "body"
    t.bigint "user_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["user_id"], name: "index_posts_on_user_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "email", null: false
    t.string "crypted_password"
    t.string "salt"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["email"], name: "index_users_on_email", unique: true
  end

  add_foreign_key "posts", "users"
end
```

# まとめ

一度マイグレーションの適用状況を確認するのが重要ですね。
Numpyの基本を学んでみた

# NumPyの基本を学んでみた

今回は、YouTube動画「[NumPyの基本](https://www.youtube.com/watch?v=k4YzlaOXfvQ)」を視聴しながら、Google Colabを使って自分で実装しつつNumPyの基礎を学びました。以下、その学習内容をまとめました。

## NumPyとは？
NumPy（Numerical Python）は、Pythonで数値計算を効率的に行うためのライブラリです。多次元配列（ndarray）をサポートし、ベクトル演算や行列計算を高速に処理できます。

## 学習の進め方
YouTubeで動画を視聴しつつ、実際にColabでコードを試しながら理解を深めました。Colabのノートブックは[こちら](https://colab.research.google.com/drive/1vy0jjJBZC_7eXcg3RJOTtAQsHrWXbn-s?usp=sharing)で公開しています。

## 学んだ内容のまとめ
以下は、今回学んだNumPyの基礎的な内容です。

### 1. 配列の作成
```python
import numpy as np

# 配列の生成
a = np.array([1, 2, 3])
b = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
print(b)
```

### 2. 基本的な演算
```python
# 要素ごとの演算
c = a + 2
d = b * 3
print(c)
print(d)
```

### 3. 形状の操作
```python
# 配列の形状変更
b_reshaped = b.reshape(3, 2)
print(b_reshaped)
```

### 4. スライシングとインデックス指定
```python
# 配列の一部を取り出す
print(b[:, 1])
```

## 今回の感想
動画と実際の実装を並行して行うことで、NumPyの基本操作がスムーズに理解できました。NumPyはデータサイエンスや機械学習の基礎となるライブラリなので、しっかりと理解しておくと後々の学習が楽になります。

## まとめ
NumPyはシンプルながら強力なライブラリです。今回の学習を通じて、その基礎を身につけることができました。これからさらに応用的な使い方や、データ分析にどう活用するかも学んでいきたいと思います。
フロントエンド・バックエンド共にNext.js(TypeScript) + Dockerで環境構築した方法

# はじめに
CCNAの勉強を始めてコードを書く機会が減って来たので、リハビリがてら何かNext.jsで作ってみたいと思い、環境構築をしたところ、思った以上にうまく行かなかったので、備忘録として投稿します。

# ディレクトリ構成
```
------------------------
|-- backend
|-- frontend
|-- docker-compose.yml
|-- DockerfileBack
|-- DockerfileFront
```
frontendとbackendにNext.jsのソースコードが入ってきます。Dockerfileはfrontend、backendディレクトリに入れてしまうと、Next.jsのcreate-next-appを実行するときにエラーが出てしまうので外に出しておきましょう。

# ソースコード
```DockerfileBack
FROM node:22-alpine
WORKDIR /backend
```
```DockerfileFront
FROM node:22-alpine
WORKDIR /frontend
```
フロントエンド・バックエンド側のDockerfileに大きな違いはありません。

```docker-compose.yml
version: "3.8"
services:
  frontend:
    build: 
      context: .
      dockerfile: DockerfileFront
    ports:
      - "3000:3000"
    volumes:
      - ./frontend:/frontend
    command: sh -c "npm run dev"
    stdin_open: true
  backend:
    build: 
      context: .
      dockerfile: DockerfileBack
    ports:
      - "3001:3001"
    volumes:
      - ./backend:/backend
    command: sh -c "PORT=3001 npm run dev"

```
Next.jsではデフォルトのポートに3000番を使用しており、フロント・バックエンド共にNext.jsを使用しているため、起動するときに被らないようにバックエンド側のポートを3001番に指定しています。

## 実行
```
docker compose run --rm backend sh -c 'npx create-next-app . --typescript'
```
```
docker compose run --rm frontend sh -c 'npx create-next-app . --typescript'
```
上記の二つのコードを実行してfrontend、backendディレクトリにNext.jsの環境を構築します。

# 最後に
簡単ですが、メモ書き程度に書きました。誰かの参考になれば幸いです。
【git】リモートブランチで更新かけてローカルブランチでコミットしてプッシュしたら・・・

## はじめに
gitでかなり横着したら少しハマった・・・
リモートブランチでREADME.mdをgithub上から更新をかけて、
そのことを忘れていて普通にローカルブランチで作業してコミットしてプッシュしようとしたらgitにプッシュできないと怒られた。

```ブランチ関係.txt
develop -> origin develop
```
これをリモートブランチの更新をローカルブランチに取り込みつつローカルブランチのコミットも維持してリモートブランチを更新する方法を備忘録として残しておく。


## エラー内容
```error.txt
From https://github.com/sample/hogehoge * branch develop -> FETCH_HEAD 
hint: You have divergent branches and need to specify how to reconcile them. 
hint: You can do so by running one of the following commands sometime before
hint: your next pull: 
hint: 
hint: git config pull.rebase false 
# merge hint: git config pull.rebase true 
# rebase hint: git config pull.ff only 
# fast-forward only 
hint: 
hint: You can replace "git config" with "git config --global" to set a default 
hint: preference for all repositories. You can also pass --rebase, --no-rebase, 
hint: or --ff-only on the command line to override the configured default per hint: invocation. 
fatal: Need to specify how to reconcile divergent branches.
```


## 解決方法
```resolve.txt
git fetch
git merge origin/develop
git push origin develop
```
ローカルリポジトリにあるリモートブランチ情報を更新してローカルブランチにリモートブランチをマージすることでうまくいったみたいだ。
コレでプッシュもできた。


## まとめ
地味にだるいなぁ。
でも便利なgit。
【AtCoder】modintの使用例

## 例題
### 例題１：[069 - Colorful Blocks 2（★3）](https://atcoder.jp/contests/typical90/tasks/typical90_bq)

```C++
#include <bits/stdc++.h>
#include <atcoder/modint>
using namespace std;
using namespace atcoder;
using mint = modint1000000007;
using ll = long long;

int main() {
  ll N; int K;
  cin >> N >> K;
  
  mint ans = K;
  if (N == 1) {
    cout << ans.val() << endl;
    return 0;
  }
  
  ans *= K - 1;
  if (N == 2) {
    cout << ans.val() << endl;
    return 0;
  }
  
  ans *= mint(K - 2).pow(N - 2);
  cout << ans.val() << endl;
}
```

<br>

### 例２：[ABC145D - Knight](https://atcoder.jp/contests/abc145/tasks/abc145_d)

```C++
#include <bits/stdc++.h>
#include <atcoder/modint>
using namespace std;
using namespace atcoder;
using mint = modint1000000007;

int f(int n) {
  mint res = 1;
  for (int i = 1; i <= n; i++) res *= i;
  return res.val();
}

int main() {
  int X, Y; cin >> X >> Y;
  int x = max(X, Y), y = min(X, Y);
  int diff = max(X, Y) - min(X, Y), rest = min(X, Y) - diff;
  if (rest < 0 || rest % 3 != 0) {
    cout << 0 << endl;
    return 0;
  }
  
  int a = rest / 3, b = a + diff;
  mint ans = mint(f(a + b)) / f(a) / f(b);
  cout << ans.val() << endl;
}
```
クラウド版Jiraを試す

https://qiita.com/ikedahideya/items/b21c535a7db0aa03395c

## タスク構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131136/ba7961d4-f64c-58eb-ef83-90079eec0a1a.png)

## エピック構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131136/5b8242a1-cda4-0406-9096-4ac769f493ed.png)


## ボードがカンバンボードなの？
そう

## プロジェクト作成
上段メニューのプロジェクト→プロジェクトを作成→左メニューのソフトウェア開発→カンバン→テンプレートを使用→チーム管理対象プロジェクトを選択→プロジェクト名を入力

# タスク／エピック／サブタスクの入力項目を決める
プロジェクト選択→プロジェクトの設定→左メニューのプロジェクト設定の課題タイプ


## 課題／エピックを全部みたい
左メニューのリスト

## エピック別に分ける
右上にグループ分け→エピック
これ見たことないかも

## タスクを別画面で開きたい
チケット番号を右クリック→新しいタブで開く

## エピックとタスクの紐づけ

- タスク作成時には無理そう。管理者権限がいる
- 作ったあとにチケット開いて上部からエピック設定可能

→親のリンクをエピックにすればOKだた
## 子チケット・サブタスク
なぜか作れなくなった、エピックのせい？

## ボードで開始日、終了日が見えない
むりっぽい

## 子レベルの課題をスケジュール表示
左メニューのボード→ライムライン→子レベルの課題をスケジュールを有効

どういう効果かわかってない→必要。エピック配下にタスクを表示

## 通知設定

## ステータスはどこで管理？
？？　→わからんがこのままでいこう
slackがいいね

## 開始日を過ぎたタスク、終了日を過ぎたタスクを表示したい
プロジェクト選択→ボード→カスタムフィルターを管理→カスタムフィルターを作成→



- 開始日超え
    - 開始日になってもステータスが進行中、待ち、完了になっていないタスク
        - "Start Date" <= now() AND status NOT IN ("In Progress", "Done")
- 終了日超え
    - 期限になってもステータスが完了していないタスク
        - due <= now() AND status != "Done"
上部のフィルター→すべての課題を表示→新規検索→JQL

## WBS／ガントチャートを作りたい
タイムラインという名前になってそう
start date
期限
でスケジュール作れそう

## タスクの複製

画面右上の...からclone
エピックは複製されなかった
設定するか、目的のエピックまでドラッグしてもいい

## ステータスどこいった？
タスク開いて右上
場所動かせない

## 運用
タスクが全部完了になれば、リーダがエピックをクローズする


## エピックなしタスク
タイムラインに表示されない
ボードには出る

## サブタスク（子チケット）
なぜか指定できない
→タスクを開く→＋→子課題を追加

できたけど、デフォルトでは表示されないし、つかわない

## 通知
通知→設定
メアドがあるので、チームのMLにすればいいかも
【git】バッファ不足でgitに怒られた話

## はじめに
いつも通りローカルブランチで作業して変更を確定してプッシュしようとしたらgitに怒られた。
画像等のファイルで一度にプッシュするファイルが大量になってバッファが足りなかったみたいだ。
びっくりした。
自分用の備忘録として残しておく。

## エラー内容
```error.txt
www-data@www-datanoMacBook-Air sample % git push origin develop
Enumerating objects: 105, done.
Counting objects: 100% (86/86), done.
Delta compression using up to 8 threads
Compressing objects: 100% (59/59), done.
error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400
send-pack: unexpected disconnect while reading sideband packet
Writing objects: 100% (65/65), 9.74 MiB | 10.21 MiB/s, done.
Total 65 (delta 16), reused 0 (delta 0), pack-reused 0
fatal: the remote end hung up unexpectedly
Everything up-to-date
```

## 解決方法
```resolve.txt
git config http.postBuffer 524288000
```
どうやらgitのデフォルトでは1MBらしい。
上記コマンドで500MBまで上げたら余裕だった。
むしろ余裕すぎた・・・


## まとめ
意外とハマる予感がするので覚えておこう。
Python  正規表現を使って文字列から情報を抽出する

## はじめに
正規表現（Regular Expression）は、文字列から特定のパターンを検索したり、情報を抽出したりするための強力なツールです。Pythonでは、`re`モジュールを使用して正規表現を扱うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/9d95b6a8-8d74-ddcc-36a2-4198b96ada02.png)

## 1. 基本的な使い方

まず、`re`モジュールをインポートします：

```python
import re
```

次に、`re.search()`や`re.findall()`などの関数を使用して、文字列からパターンを検索します。

### 例1：メールアドレスの抽出

```python
text = "連絡先は、example@email.com と another.example@email.co.jp です。"
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'

emails = re.findall(pattern, text)
print(emails)
```

出力:
```
['example@email.com', 'another.example@email.co.jp']
```

## 2. グループの使用

正規表現内でかっこ`()`を使用すると、マッチした部分を個別に抽出できます。

### 例2：日付の抽出

```python
text = "イベントは2023年5月15日から2023年5月17日まで開催されます。"
pattern = r'(\d{4})年(\d{1,2})月(\d{1,2})日'

dates = re.findall(pattern, text)
print(dates)

# 日付を整形して表示
for year, month, day in dates:
    print(f"{year}年{month.zfill(2)}月{day.zfill(2)}日")
```

出力:
```
[('2023', '5', '15'), ('2023', '5', '17')]
2023年05月15日
2023年05月17日
```

## 3. 名前付きグループ

`(?P<name>...)`構文を使用して、グループに名前を付けることができます。

### 例3：個人情報の抽出

```python
text = "名前：山田太郎、年齢：30歳、職業：エンジニア"
pattern = r'名前：(?P<name>.*?)、年齢：(?P<age>\d+)歳、職業：(?P<job>.*)'

match = re.search(pattern, text)
if match:
    print(f"名前: {match.group('name')}")
    print(f"年齢: {match.group('age')}")
    print(f"職業: {match.group('job')}")
```

出力:
```
名前: 山田太郎
年齢: 30
職業: エンジニア
```

## 4. 注意点

- 特殊文字（`.`, `*`, `+`, `?`, `^`, `$`, `\`, `|`, `(`, `)`, `[`, `]`, `{`, `}`）を文字列として扱う場合は、バックスラッシュ`\`でエスケープするか、raw文字列（`r'...'`）を使用します。
- 複雑な正規表現は可読性が低下する可能性があるため、コメントを付けるなどして説明を加えることをお勧めします。

正規表現は非常に強力ですが、適切に使用しないと予期しない結果を招く可能性があります。実際のデータで十分にテストし、エッジケースも考慮することが重要です。

## 5. 参考になる公式情報

Pythonの正規表現について詳しく学びたい場合は、以下の公式ドキュメントが参考になります：

1. Python公式ドキュメント - re — 正規表現操作:
   https://docs.python.org/ja/3/library/re.html

   このページでは、`re`モジュールの全ての関数と機能について詳細な説明があります。

2. Python公式ドキュメント - 正規表現HOWTO:
   https://docs.python.org/ja/3/howto/regex.html

   正規表現の基本から応用まで、実例を交えて解説しています。

3. Python公式ドキュメント - 正規表現の構文:
   https://docs.python.org/ja/3/library/re.html#regular-expression-syntax

   Pythonで使用できる正規表現の構文について詳しく説明しています。

これらの公式ドキュメントを参照することで、正規表現の理解を深め、より効果的に活用することができます。
npx createでエラー、UNABLE_TO_GET_ISSUER_CERT_LOCALLYの対処メモ

# 問題
npx create-next-app@latest でプロジェクトが作成できない。
エラー文は以下。
```
npm error code UNABLE_TO_GET_ISSUER_CERT_LOCALLY
npm error errno UNABLE_TO_GET_ISSUER_CERT_LOCALLY
npm error request to https://registry.npmjs.org/create-next-app failed, reason: unable to get local issuer certificate
```

## 環境
macOS sonoma 14.6.1


## 解決策

実行したこと。

### 1. npm の registry 設定
```
npm -g config set registry https://registry.npmjs.org/
```
設定は初回のみでOK。
URLは ```http://registry.npmjs.org/``` との情報もある。

### 2. npm の SSL証明書の検証を無効にする設定
```
npm -g config set strict-ssl false
```
### 3. 失敗した npx create を再試行
```
npx create-next-app@latest my-next-project
...
...
...

Success! Created my-next-project at...
```


プロジェクト作成が成功したことを確認できた。

### 4. 検証設定を元に戻す
npm の SSL証明書の検証を有効に設定。
```
npm -g config set strict-ssl true
```
### 5. 設定の確認
```
npm config list
```

## 参考サイト

- [[Node.js] npm の proxy と registry 設定](https://qiita.com/LightSpeedC/items/b273735e909bd381bcf1)
- [npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATUREの対処法](https://qiita.com/c8h9no2/items/9b7563b17e2afbf82c15)
DTOとRepository

理解齟齬がありそうなことと思いましたので投稿しました。

DTO（Data Transfer Object）とリポジトリー（Repository）は、異なる目的を持つ設計パターンです。簡単に説明すると、それぞれの役割は次の通りです。

### DTO（Data Transfer Object）
- 役割: 異なるシステムやレイヤー間でデータを転送するためのオブジェクト。ビジネスロジックは持たず、データの集約や転送に特化。
- 主な用途: フロントエンドとバックエンド間、またはサービス間でデータをやり取りする際に使用。
### リポジトリー（Repository）
- 役割: データベースや外部ストレージに対するデータアクセスを抽象化し、ビジネスロジックとデータ操作ロジックを分離する。
- 主な用途: データベースのCRUD操作（Create, Read, Update, Delete）を一元管理し、データソースへのアクセスを統一する。

### 要約
- DTOは単にデータを持ち運ぶだけで、データ操作のロジックを持たないのに対し、リポジトリーはデータの取得や保存、更新といった操作を抽象化します。
- DTOはプレゼンテーション層やサービス層との間で使用され、リポジトリーはドメイン層やデータ層で使われることが多いです。

### まとめ
DTOはデータの転送、リポジトリーはデータの操作を担当し、それぞれが異なる関心事に対応している


ご不明な点があれば、お気軽にご質問ください。また、行き届いていない説明があればご指摘いただきたいです
Visual Studioで不要なUsingを削除したい

Visual Studio で 不要なUsingを削除したい場合、ソースコード上で右クリックし「Usingの削除と並び替え(E)」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/424a4b83-66fe-24b6-dfa5-b716cbb1cd99.png)

もちろんショートカットでも、不要なUsingを削除することができます: Ctrl+R, Ctrl+G

**環境情報**

```
Microsoft Visual Studio Community 2022 (64 ビット) - Current
Version 17.10.4
```