OmniAICreator/Qiita-1.07M huggingface dataset:
LINE内ブラウザおよびLIFF上で、Androidの動画読み込み時に灰色再生ボタンが表示される問題の対策

## はじめに
動画をWebページや、Webアプリケーションの先頭において自動再生させてリッチに見せるような場面は数多くあるかと思います。iPhoneでは動画が再生される前の読み込み状態の時に何か表示されるということはないのですが、Android端末を使用してLINE内ブラウザおよびLIFF上でページを見ると灰色の再生ボタンのようなものが表示されてしまう場合があります。

その解決法を説明していきます。

> -- LINE内ブラウザおよびLIFF上で読み込み中の動画 --
iPhone ：特に何も表示されない
Android：灰色の再生ボタンが表示される

## 実際の挙動

![537378473333751876.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734276/ed8af50b-e7be-2808-0dc2-d068e7e0c5a9.gif)


## 結論
動画が再生可能な状態になるまで動画を`visibility`または`opacity`で非表示にして、再生可能になったことを検知したら動画を表示すれば良いだけです。

私はVue.jsで開発することが多いのでv-showを用います。

:::note info
display: none;やv-ifなどで切り替えない理由が表示する時のガタ付きは出来る限りないほうがいいと考えているためです。プロジェクトに合わせて正しく使い分けましょう！
:::
　
そのための手順を説明していきます。

## 再生可能な状態を検知して表示する方法

### Vue.jsの場合
```vuejs
<script setup lang="ts">
import { ref } from 'vue';

const isVideoLoaded = ref<boolean>(false);

// ビデオが読み込み可能になったときに呼ばれる関数
const onVideoLoaded = () => {
  isVideoLoaded.value = true;
};
</script>

<template>
  <div>
    <video
      v-show="isVideoLoaded"
      @loadeddata="onVideoLoaded"
      autoplay
      muted
      playsinline
    >
      <source src="your-video-file.mp4" type="video/mp4" />
    </video>
    <!-- ビデオが読み込まれるまで何か表示する場合 -->
    <p v-if="!isVideoLoaded">Loading video...</p>
  </div>
</template>
```
`　説明　`
loadeddataイベントがvideoタグの動画が読み込み完了したかを検知してくれます。
loadeddataイベントが発火すると、トリガーとなるisVideoLoadedがtrueとなって動画が表示されます。逆に読み込み中に表示しておきたい文言やなどは消えます。


### Vanilla JSの場合（HTML）
```vuejs
<!DOCTYPE html>
<html lang="ja">
<head>
  <style>
    /* 動画を初期状態で非表示にする */
    #video {
      visibility: hidden;
    }
  </style>
</head>
<body>
  <div>
    <video
      id="video"
      autoplay
      muted
      playsinline
    >
      <source src="your-video-file.mp4" type="video/mp4">
    </video>
    <!-- ビデオが読み込まれるまで表示するメッセージ -->
    <p id="loadingMessage">Loading video...</p>
  </div>

  <script>
    const video = document.getElementById('video');
    const loadingMessage = document.getElementById('loadingMessage');

    // ビデオが再生可能になったときの処理
    video.addEventListener('loadeddata', () => {
      // 動画を表示してメッセージを非表示にする
      video.style.visibility = 'visible'; // visibilityを変更
      loadingMessage.style.display = 'none'; // メッセージを非表示に
    });
  </script>
</body>
</html>
```

`　説明　`
Vue.jsのコードと同様に、loadeddataイベントがvideoタグの動画が読み込み完了したかを検知してくれます。
Vue.jsと異なる点は、loadeddataイベントが発火すると、直接各要素のCSSを変更し見えるようにしたり、見えなくしたりします。同時にさまざまな要素に対して表示非表示を切り替えたい場合はclassListを使用してclassのつけ外しで実装しても良いかと思います。

## 他のJSイベントでも可
loadeddataイベントで今回は紹介しましたが、他にも動画の様々なタイミングを検知できるイベントがあるので自分のページにあった適切なイベントを設定しましょう！下記は自分のイメージなので使用する際はきちんとMDNなどで確認して使用しましょう。

`loadedmetadata`
再生できるかは関与しない、動画あることは確認しましたイベント

`canplay`
再生できることは確認したけど最後まで再生できるかは知らないよイベント

`canplaythrough`
最後まで再生されることが保証されましたよイベント 

## 最後に
LINE内ブラウザで、Androidで見るという状況で起こってしまい発覚した本件ですが、特定の端末や環境、ブラウザばかりでテストせずに網羅的に色んな環境で確認を行うのは改めてとても大事だなと感じました。細かい部分を妥協せずに全てのユーザーにとってユーザー体験の良いページを作れるように細かい部分でクオリティーを上げていきます！

同じ問題で困っている人の助けになれば幸いです！

失礼します🙇‍♂️
【Error・学習】本番環境メール設定Koyebデプロイ後エラー。環境変数の設定について

## はじめに

今回は開発環境で「パスワードを忘れた方はこちらから」に関係する実装を終えた後のお話。本番環境でもメールの送受信が可能にするための設定を行いました。

デプロイ先を`Koyeb`というサービスを初めて使用してエラーが出たのでエラー内容と解決までの道のり？を記事にまとめていきたいと思います。

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



## ローカル~本番環境のメール設定参考記事
先にローカル～本番環境でのメール設定は次の記事を参考にしました。（私のも載せておきます）

https://qiita.com/wa-chan222/items/9a3e260810383443da21

https://zenn.dev/ebina_shohei/articles/6c3b325a361f19

https://qiita.com/Erika328/items/ae4dde4e9f946eb08832

https://qiita.com/__Wata16__/items/d2d3aa21623f8c026d5d

https://zenn.dev/yuna0960740/articles/12d33231b8a961


## 本題
記事を参考に私はまず以下の事を行いました
- Google側でアプリのパスワード16桁等を生成
- `gem`ファイルに`gem 'dotenv-rails’`追記しインストール&`.env`ファイル生成・編集
- 本番環境の設定を`config/environments/production.rb`ファイルに入力
- `config/initializers/devise.rb`にも追記
- そして**Koyeb側で「Secrets」から「MAILER_SENDER」と「MAILER_PASSWORD」を追加**(このMAILER_SENDERなどの文字はそれぞれ異なると思います。）
  👇例：NameにはMAILER_SENDER。Valueには`.env`に記載した使用するメールアドレスを入力。同じようにMAILER_PASSWORDも設定。
  ![Koyeb](https://i.gyazo.com/09c79997b51d35a6fe0791e3a246dfbd.png)


## デプロイ後エラー発生
まずはエラー内容から
```
[033adc77-8c39-934b-b16f-2a9f80eed2a9] ArgumentError (SMTP-AUTH requested but missing user name):
[033adc77-8c39-934b-b16f-2a9f80eed2a9]   
[033adc77-8c39-934b-b16f-2a9f80eed2a9] app/controllers/users/passwords_controller.rb:5:in `create'
```
このエラーメッセージは、SMTPサーバーにメール送信の認証を要求しましたが、ユーザー名が見つからないために発生している状態です。具体的には、`Rails`が `MAILER_SENDER` という環境変数で設定したGmailのメールアドレスを認識できていない状態になります。

> ### エラーの内容を分解すると
> 1. **ArgumentError**: Rubyで引数が正しく渡されていないときに出るエラーです。ここでは、SMTP認証の際に「ユーザー名（メールアドレス）」が必要なのに、見つからないためにエラーが出ています。
> 2. **SMTP-AUTH requested but missing user name**: SMTP（メールを送信するためのプロトコル）を使う際に、「ユーザー名」が不足しているというメッセージです。メール送信には、送り元のメールアドレス（ユーザー名）とパスワードが必要ですが、今回の設定ではユーザー名（メールアドレス）が設定されていないか、正しく読み込まれていないためにエラーが発生しています。


## Koyeb上で確かに環境設定したはずなのに？？
Koyeb上で確かに設定はしていましたが。
実は、**もう一つ設定箇所がありました:scream:**（探すまでに結構時間かかった）

以下手順になります
- Overviewから該当アプリを選択
- Settingsをクリック
- Environment variablesを選択しAdd anotherで次のように設定します（**※先にSecretの方で設定することでプルダウンで選択できるようになります**）
  [![Image from Gyazo](https://i.gyazo.com/961b4b067fdf23d093bd423ea286410b.png)](https://gyazo.com/961b4b067fdf23d093bd423ea286410b)


- Add完了したら下の方にスクロールするとある「Save add deproy」でBuildして無事デプロイされれば完了！！


## さいごにまとめ
エラーコードをGPTに確認してもらった際、新たにコードを追加するなど明らかに違うのでは、と少し察することができてよかった（沼ループにはまるところだった💦）
はじめてのデプロイ先で記事が少なかったので、無事に本番環境でもメールの動作を確認出来てよかったです
今回の記事が何か参考になれば幸いです
症状：バッチファイルでcurlコマンドがエラーになる。原因：URLにコマンドライン引数を含んでいるため

# 症状
curlコマンドで以下URLを叩いたところ、バッチファイルから起動した場合とコマンドプロンプト直打ちの場合とで結果異なる。

```bad_pattern.cmd
curl -v "https://www.google.com/search?q=test%252sample"

```


## バッチファイルから実行した結果
```diff_batchfile
curl -v "https://www.google.com/search?q=test%%252sample" |find  "GET"    
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Host www.google.com:443 was resolved.
* IPv6: (none)
* Connected to www.google.com (142.250.198.4) port 443
* schannel: disabled automatic use of client certificate
* ALPN: curl offers http/1.1
* ALPN: server accepted http/1.1
* using HTTP/1.x
+ > GET /search?q=test%252sample HTTP/1.1
```

## コマンドを直に実行した場合
```diff_batchfile
>bad_pattern.cmd
>curl -v "https://www.google.com/search?q=test52sample" 
* Host www.google.com:443 was resolved.
* IPv6: (none)
* IPv4: 142.250.198.4
*   Trying 142.250.198.4:443...
* Connected to www.google.com (142.250.198.4) port 443
* schannel: disabled automatic use of client certificate
* ALPN: curl offers http/1.1
* ALPN: server accepted http/1.1
* using HTTP/1.x
+ > GET /search?q=test52sample HTTP/1.1

```

# 原因
バッチファイル内では「%2」はコマンドライン引数であるため%2=""となり求めるURLにならない


# 対処方法
バッチファイルを以下のように修正する。
```diff_batchfile
- curl -v "https://www.google.com/search?q=test%252sample"
+ curl -v "https://www.google.com/search?q=test%%252sample"

```

# 一言
これだけで２時間ぐらい潰れました。
メモ帳で編集していたのが長引いた原因でした。
VSCODE使っていれば、シンタックスハイライトでもうちょっと早く気づけたと思います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/67954a93-2f0a-6173-3967-bcb9610dd825.png)



# 参考

引数の指定とバッチファイル内で引数を参照する方法
https://www.javadrive.jp/command/bat/index6.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/5ae25d7e-c726-3d88-6f9c-5b98a0be9a7f.png)
【Rails】コールバック　before_create,before_validationの違い

# 【Rails】before_createとbefore_validationの違い

Railsには、データベースに保存する前に指定した処理を実行できる「コールバック」という仕組みがあります。中でもbefore_createとbefore_validationは、データの保存やバリデーション（入力チェック）に関わる重要なコールバックです。今回はこの2つの違いと、それぞれがどう使えるかについてまとめました。

#### この記事の目的

	•	before_createとbefore_validationがいつ実行されるかを理解する。
	•	どんな場合に使えばいいか、実際の使いどころを知る。

### 1. before_createとは？

before_createは、レコードが新しく作成されてデータベースに保存される直前に一度だけ実行されるコールバックです。例えば、レコードを新しく作成するときだけ特定の初期設定を入れたい場合に使います。

使用例

ユーザーのデータを新しく作成するとき、statusを「active」に設定したい場合は、こんなふうに使えます。

```rb
class User < ApplicationRecord
  before_create :set_default_status

  private

  def set_default_status
    self.status = "active"
  end
end

```


	•	実行タイミング: 新しいレコードが作成される直前に一度だけ。
	•	用途: レコードが最初に作成されるときだけ自動で設定したいデータがあるとき（例：初期ステータスの設定など）。

### 2. before_validationとは？

before_validationは、レコードが保存される前のバリデーション（入力チェック）を実行する直前に呼ばれます。このコールバックは、新しく作成されるときも、既存のレコードを更新するときも、バリデーションが走るタイミングで毎回実行されます。

使用例

たとえば、ユーザーが入力したメールアドレスに余分なスペースが入っていてもエラーにならないように、保存する前にスペースを取り除く処理を入れることができます。
```rb
class User < ApplicationRecord
  before_validation :normalize_email

  private

  def normalize_email
    self.email = email.strip if email.present?
  end
end

```


	•	実行タイミング: バリデーションが走る直前。
	•	用途: データの保存前に余分なスペースを削除したり、入力内容を修正したい場合。

### 3. before_createとbefore_validationの違い

コールバック	実行タイミング	使う場面の例
before_create	新規作成直前に一度だけ	初期ステータスを設定するなど
before_validation	バリデーション実行直前に毎回	データをきれいに整える場合

注意点

	•	before_createは新しく作成されるときだけ実行されますが、before_validationはバリデーションの前に毎回実行されるため、新規作成と更新のどちらでも動きます。
	•	入力をきれいに整える処理は、バリデーション前に呼ばれるbefore_validationのほうが向いています。

まとめ

before_createとbefore_validationは、データの保存前に処理を追加したいときに便利なコールバックです。どのタイミングで動いてほしいかによって使い分けると、コードがわかりやすくなり、意図通りに動くようになります。
Oracle Analytics Cloud Classic：ピボットで、列表示されている２つのデータの差を表示する、その３　分析の選択ステップを使う

はじめに
---
Oracle Analytics Cloud ：ピボット表示で、列表示されている２つのデータの差を表示したいという要件が出てきた際に、DataVisualizationのワークブックのピボットでは、総計で差を表示するということを思いつきますが、ある列に対しての差という指定ができません。クラシックの分析（Answers)では、表示結果をもとに新規列を追加する選択ステップ機能があり簡単に対応できます。分析(Answers)の選択ステップで実施する方法をやってみました

![g3_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/0d5b746e-96c5-1fef-b1bd-3e7d08b0bc07.jpeg)


記事記載時のOAC ver：Sep 2024 Update

前提
---
Classicの分析を作成したことがある
対象のデータソースとして、年度、カテゴリ毎の販売実績を利用する

分析の作成
---
ピボットビューを作成します。
![g3_0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/ffa9b5df-bc65-e0f2-16b0-515975afe236.jpeg)

選択ステップの追加
---
選択ステップをクリックします。
![g3_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/1f614fda-27a5-4738-b343-a593d54451b9.jpeg)

CY列に対して追加しますので、CYで、2."次に、新規ステップ"をクリックします
![g3_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/0990bec3-0417-cff0-51ef-e7c04a8adf6a.jpeg)

"グループまたは計算項目の追加"をクリック、"新規計算項目"を選択します
![g3_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/30fe1d63-9a57-6722-9a67-1d23ef29060e.jpeg)

"2019"を選び、">"をクリック、右側の選択済にもっていきます。"-"をセットし、"2018"を選び、">"をクリック、右側の選択済にもっていきます。選択済に'2019'-'2018'と表示されたら、OKをクリックします。
![g3_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/a0d0a682-cb91-22e0-f2fe-d5f7025ba7df.jpeg)

ピボットで、既存の列をつかって、選択ステップで新規の計算列が追加されました
![g3_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/0d5b746e-96c5-1fef-b1bd-3e7d08b0bc07.jpeg)

まとめ
---
ピボットで列表示されているデータを使って新規に列追加する選択ステップ機能があり、Excelでの列追加のような感覚で、ピボットに列追加ができます。選択ステップを利用した２つのデータの差を表示する方法についてためしてみました。

以上
QnapのNASを構築したときのアーカイブ


# rina_nasの構築プロジェクトログ

---

## プロジェクト設立情報
- **プロジェクト名**: rina_nasの構築
- **プロジェクト設立者**: https://twitter.com/Masarina002

---

### NAS構築手順
**2024/05/03 23:13**
1. **プールの作成**: NASのパーティション作成に相当。
2. **ボリュームの作成**: 保存領域を確保する。
3. **共有フォルダの作成**: 作成した共有フォルダが「20KB」と表示されるが、これは実際のファイルサイズではないため注意。

---

### NASにアクセスするための設定手順 (Ubuntu)
**2024/05/05 09:31**
1. **基本アップデート**
   ```bash
   sudo apt update
   apt list --upgradable
   sudo apt install cifs-utils
   ```

2. **ローカルのマウントポイント作成**
   ```bash
   sudo mkdir -p /mnt/Masarina-Nas
   ```

3. **NASボリュームへのマウント**
   ```bash
   sudo mount -t cifs //192.168.＊＊＊/ボリューム名 /mnt/Masarina-Nas -o username=ユーザー名,password=パスワード,vers=3.0
   ```

4. **マウント解除と再設定 (読み書き許可の設定)**
   ```bash
   sudo umount /mnt/Masarina-Nas
   sudo mount -t cifs //192.168.＊＊＊/ボリューム名 /mnt/Masarina-Nas -o username=ユーザー名,password=パスワード,vers=3.0,rw
   sudo chmod -R 775 /mnt/Masarina-Nas
   ```

5. **GUIでのsudo権限アクセス**
   - `Masarina-Nas` ディレクトリを `sudo` 権限でGUI操作するには以下を実行：
     ```bash
     cd /mnt/Masarina-Nas
     sudo nautilus .
     ```

---

### NASデータ保存の要点
- **マウントの基本コマンド**
  ```bash
  sudo mount -t cifs //192.168.＊＊＊/ボリューム名 マウント先ディレクトリパス -o username=ユーザー名,password=パスワード,vers=3.0,rw
  ```

- **マウントしたディレクトリのsudo権限での開き方**
  ```bash
  cd マウント先ディレクトリパス
  sudo nautilus .
  ```

---

以上がプロジェクト `rina_nasの構築` の設定手順です。各手順を丁寧に進めてください。
Oracle Analytics Cloud ：ピボットで、列表示されている２つのデータの差を表示する、その２　総計と書式表示で対応してみる

はじめに
---
Oracle Analytics Cloud ：ピボット表示で、列表示されている２つのデータの差を表示したいという要件が出てきた際に、DataVisualizationのワークブックのピボットでは、総計で差を表示するということを思いつきますが、ある列に対しての差という指定ができません。そんなときに、総計と書式表示で対応する方法についてやってみました。

ピボットで列表示している2019年のデータに2018年のデータを減算して表示したいという要件があります。
![g1_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/b06c7181-6b64-bedd-c5c9-bb5500c04594.jpeg)

データソース上は、CYの列で、2019年、2018年のデータがあり、それをピボットの列で表示しています
![g1_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/d6ee5df5-759a-3a66-9150-9732e928f28c.jpeg)

記事記載時のOAC ver：Sep 2024 Update

前提
---
Data Visualizationでワークブックを作成したことがある
対象のデータソースとして、年度、カテゴリ毎の販売実績を利用する

総計で対応するための仕込み
---
ピボットで列表示されているデータで計算式を利用して、減算されるほうのデータに+1、減算するほうのデータに-1をかけます
計算式を作成します。マイ計算を右クリックします。メニューから"計算の作成"をクリックします。
![g1_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/67ed88e9-00e2-7e9b-3b70-7e90fe4b75fb.jpeg)

計算列の名前を入力します。計算式にセットします。
CASE WHEN 列名=値 THEN メジャー列*(1) ELSE メジャー列*(-1) END
例：CASE WHEN CY=2019 THEN SUM_AMOUNT_SOLD*(1) ELSE SUM_AMOUNT_SOLD*(-1) END
![g2_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/66eb4255-a149-12eb-58af-52c1f30c67f8.jpeg)

ピボットの作成
---
ピボットのビジュアライゼーションで、作成した計算式列を値にセットします
![g2_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/ab3a886e-b3e4-ae44-4a91-cf66f25f421d.jpeg)

"プロパティ"タブをクリックします。"値(#)"タブをクリックします。計算式列で、"合計集計"のところをクリックし、"合計"に変更します
![g2_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/26fb0944-2e8a-d2c8-6108-38b96ad3d975.jpeg)

レイアウトの整形
---
2019、2018の順にソートします。ビジュアライゼーションの右上にマウスカーソルを移動、表示された"ソート"アイコンをクリックします
![g2_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/833b8fdc-e029-bba8-f864-fa666d4a50f4.jpeg)

ソート基準で、CY列、および"ZからA"を選択します。OKをクリックします。
![g2_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/d34f1313-72b7-c188-b385-ee1ee92e09e2.jpeg)

減算する値が"-（マイナス）"表記になっていますので、気になる場合は変更します。
"プロパティ"タブをクリックします。"値(#)"タブをクリックします。計算式列で、負の値を123(赤字)に変更します
![g2_6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/8a89bcb0-d087-8c9c-8a31-30b74b236fc5.jpeg)

赤字から変更したい場合は、条件付き書式をつかいます
ビジュアライゼーションの右上にマウスカーソルを移動、表示された"条件付き書式ルールの管理"アイコンをクリックします
![g2_7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/8cdc78fa-60cb-53aa-6c4a-7b4d7d5a648e.jpeg)

条件付き書式で、0より小さいをセットするため、対象の計算式列を選択し、"<"を選択し、"0"を入力します。色の指定のため、矢印の"書式"アイコンをクリックします。
![g2_8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/008494d3-f01f-bfcb-ec33-22b1998a8612.jpeg)

フォントで、色を黒色にセットします
![g2_9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/05523b26-bbd8-df93-0e9b-13891327265e.jpeg)

黒色のセットは、フォントの色で黒色部分をクリックします。OKをクリックします。
![g2_10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/4d7d1874-5c19-bd1a-f581-c83e7198df2e.jpeg)

OK、保存をクリックします。
マイナス値も黒で表示されました。総計の負の値は赤字で表示されます。
![g2_11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/4fd6bf1b-1d5c-79a1-246e-e3fc526d5607.jpeg)

まとめ
---
ピボットで列表示されているデータは、総計表示の際にどのデータが減算される対象で、どのデータで減算するかの指定がないため、計算式を利用して、対応する方法についてやってみました。

以上
3D モデルを無料で作成できる場所はどこですか?

### 無料で3Dモデルを作成できるサイトのおすすめ

3Dプリント技術の発展に伴い、ますます多くの人々が3Dモデルを作成し、共有できるプラットフォームを探しています。無料で3Dモデルを作成できるサイトをお探しなら、以下のリソースをぜひチェックしてみてください。

**1. Thingiverse**
Thingiverseは、非常に人気のある3Dモデル共有プラットフォームで、ユーザーはここでさまざまなモデルを無料でダウンロードし、共有することができます。このサイトは豊富なリソースを持ち、玩具から工具まで多様な種類をカバーしており、3Dプリント愛好者に最適です。
![5e15efaa0529b4bdfe9e2184668be4a2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/de285353-775a-2e83-817e-ea37042fcf1f.png)


**2. MyMiniFactory**
MyMiniFactoryは、3Dプリントモデルに特化したサイトで、すべてのモデルは審査を経ており、その印刷品質が保証されています。ユーザーは自分のデザインをアップロードしたり、他のクリエイターの作品を無料でダウンロードしたりできます。サイトはコミュニティの交流機能も提供しており、デザイナーとユーザーがコミュニケーションをとることができます。

**3. TurboSquid**
TurboSquidは高品質な3Dモデルを提供するサイトで、ほとんどのモデルは有料ですが、無料のリソースも多数あります。高詳細なモデルを必要とするプロフェッショナルに適しており、建築、キャラクター、シーンなどのさまざまなタイプが揃っています。

**4. Free3D**
Free3Dは、多様なフォーマットの無料3Dモデルを提供するサイトで、ユーザーはニーズに応じた適切なフォーマットを選んでダウンロードできます。サイトのインターフェースはシンプルで使いやすく、さまざまなレベルのデザイナーに適しています。

**5. CGTrader**
CGTraderは、販売と無料ダウンロードが組み合わさった3Dモデル市場で、ユーザーはここでさまざまなタイプのモデルを見つけることができます。多くの高品質モデルは有料ですが、無料のオプションも多数あり、個人や商業利用にも適しています。

**6. Sketchfab**
Sketchfabはオンライン3Dモデルの展示プラットフォームで、ユーザーは自分の3D作品をアップロードし、他の人と共有できます。リアルタイムレンダリング機能を提供し、ブラウザで直接モデルを確認できます。主に展示プラットフォームですが、無料モデルをダウンロードできるものもあります。
![95a648c934eb05a64c2c5fec9c7f8f61.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/88f6bf6c-b82d-a000-a7dd-af3ea7817435.png)


**7. Pinshape**
Pinshapeは3Dプリントに特化したコミュニティとマーケットプレイスで、ユーザーはここでさまざまな3Dプリントモデルをダウンロードし、共有できます。プラットフォームはクリエイターが無料モデルを公開することを奨励しており、デザイナーとユーザーが交流するスペースも提供しています。

**まとめ**
以上のサイトは、3Dモデルの作成と共有に豊富なリソースと便利なツールを提供しています。モデルを探している人や、自分のデザインを共有したい人にとって、これらのプラットフォームは非常に役立ちます。これらのサイトを探索して、インスピレーションを見つけ、自分の3Dクリエイションの旅を始めましょう！

https://www.revopoint3d.com/pages/3d-models
RAG評価ツール「RAGAS」とは？

生成AIの技術を学んでいるとよく聞く、RAGという技術について、自分の学びを記載しようと思います！

自然言語処理の分野では、質問応答や文章生成において、**Retriever-Augmented Generation (RAG)** と呼ばれる技術があります
RAGは、大規模な言語モデルの生成能力と情報検索技術を組み合わせ、質問に対して精度の高い回答を生成するアプローチです。
これに伴い、RAGモデルの性能を正確に評価するためのツールとして、**RAGAS**が開発されました。
本記事では、この評価ツールの特長や使用方法、そして実際の使用例について詳しく説明していこうと思います。

## RAGASとは？
RAGASは、RAGモデルの出力結果を多角的に評価するためのツールです。
RAGのプロセスでは、まず情報検索エンジンが関連する文書を取得し、その後言語モデルがその文書を参照して回答を生成します。
RAGASは、モデルの性能を、検索の精度や生成された回答の品質を基準に総合的に分析します。

## どうしてRAGが必要なのか
RAGは、質問応答や文章生成タスクにおいて、より正確で情報に基づいた回答を提供するために必要です。
通常の言語モデルは、トレーニングされたデータ内の知識だけで回答を生成しますが、動的な情報や新しい知識に対しては限界があります。
RAGは、この制限を補うために、質問に関連する外部データをリアルタイムで検索し、その情報を元に言語モデルが回答を生成するという仕組みを導入します。これにより、最新の情報に基づいた正確な回答が可能となり、特にFAQシステムや専門的な知識が必要なタスクにおいて重要になります。

## RAGの仕組み
大きく2つのステップに分かれます。
まず、質問が入力されると、情報検索エンジンが、事前に用意されたデータベースや文書コレクションから関連する文書を検索します。

次に、検索された文書を基に、言語モデルがその文書を参照して回答を生成します。この際、言語モデルは単にデータベース内の情報を返すだけでなく、その情報を統合・生成するため、自然で文脈に沿った回答が得られます。
RAGは、検索と生成を組み合わせることで、最新かつ信頼性のある情報に基づいた回答を提供する仕組みです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840107/2bd9db45-d686-4666-caa3-4b0256b9a76c.png)
出所：大和総研作成

## RAGASの特徴
RAGASの主な特長は、以下の3点です。

①検索精度の評価
RAGASは、情報検索エンジンがどれだけ適切な文書を取得できたかを評価します。これにより、検索プロセスそのものの性能を明確に分析できます。

②生成品質の評価
言語モデルによって生成された回答の正確さや自然さを評価します。正しい情報が含まれているか、文法的に適切か、回答が質問に対して適切かなど、多角的な基準で生成結果を評価します。

③総合評価
RAGASは、検索プロセスと生成プロセスを統合的に評価し、RAGモデル全体のパフォーマンスを測定します。これにより、検索と生成のどちらがボトルネックとなっているかを特定しやすくなります。

## まとめ
RAGASは、RAGモデルの性能を包括的に評価するための強力なツールです!

検索精度と生成品質の両面からモデルを評価し、結果を自動的にレポートすることで、研究者や開発者が効率的にモデルの改善点を特定できるようにします。今後、RAG技術がさらに普及する中で、RAGAは多くの場面で導入されていくと考えます
UNIXコマンドでデジタル署名付き暗号化メッセージの送受信プロセスを検証してみた

# はじめに
UNIXコマンドでデジタル署名付き暗号化メッセージの送受信プロセスを検証してみました。
Mac環境で実施しております。

使うコマンド
- openssl

:::note warn
この手順は一般的に推奨される方法ですが、暗号化と署名の順序や方法は、使用するプロトコルやセキュリティ要件によって異なる場合があります。具体的な要件に応じて、適切な手順を選択することが重要です。
:::

:::note alert
実際は、鍵の生成や管理において、適切なパーミッション設定や安全な保管場所の確保が必要です。特に秘密鍵は慎重に取り扱い、第三者に漏洩しないよう注意してください。
:::

# 準備
OpenSSLで直接使用するためにSSHキーはPEM形式に変換する必要があります。

```sh:送信者Aの鍵を作る
# PEM形式の秘密鍵を生成する
openssl genpkey -algorithm RSA -out private_key_A.pem

# PEM形式の秘密鍵からPEM形式の公開鍵を作成する
openssl rsa -in private_key_A.pem -pubout -out id_rsa_pub_A.pem
```

```sh:受信者Bの鍵を作る
# PEM形式の秘密鍵を生成する
openssl genpkey -algorithm RSA -out private_key_B.pem

# PEM形式の秘密鍵からPEM形式の公開鍵を作成する
openssl rsa -in private_key_A.pem -pubout -out id_rsa_pub_B.pem
```

# 送受信プロセスの検証
```mermaid
sequenceDiagram
    participant 送信者A
    participant 受信者B

    送信者A->>送信者A: ①メッセージを作成
    送信者A->>送信者A: ②送信者Aの秘密鍵でメッセージに署名
    送信者A->>送信者A: ③受信者Bの公開鍵でメッセージを暗号化
    送信者A->>受信者B: 暗号化メッセージ + 署名を送信

    受信者B->>受信者B: ④送信者Bの秘密鍵でメッセージを復号化
    受信者B->>受信者B: ⑤送信者Aの公開鍵で署名を検証

    alt 署名が有効な場合
        受信者B->>受信者B: メッセージの正当性と整合性を確認
    else 署名が無効な場合
        受信者B->>受信者B: メッセージの正当性が確認できない
    end
```



### ①メッセージを作成
```sh:送信者Aが送るメッセージを作る
echo '寿限無寿限無五劫の擦り切れ海砂利水魚の水行末雲来末風来末食う寝る処に住む処やぶら小路の藪柑子パイポパイポパイポのシューリンガンシューリンガンのグーリンダイグーリンダイのポンポコピーのポンポコナーの長久命の長助' > message.txt
```

### ②送信者Aの秘密鍵でメッセージに署名
```sh:送信者Aの秘密鍵でメッセージに署名
openssl dgst -sha256 -sign id_rsa_A -out message.sig message.txt
```

### ③受信者Bの公開鍵でメッセージを暗号化
```sh:受信者Bの公開鍵でメッセージを暗号化
openssl pkeyutl -encrypt -in message.txt -pubin -inkey id_rsa_pub_B.pem -out encrypted_message.bin
```

### ④送信者Bの秘密鍵でメッセージを復号化
盗聴を防ぐ
```sh:送信者Bの秘密鍵でメッセージを復号化
openssl pkeyutl -decrypt -in encrypted_message.bin -inkey id_rsa_B -out decrypted_message.txt
```

### ⑤送信者Aの公開鍵で署名を検証
なりすましと改ざんを防ぐ
```sh:送信者Aの公開鍵で署名を検証
openssl dgst -sha256 -verify id_rsa_pub_A.pem -signature message.sig decrypted_message.txt
```
AWS IAMアカウントを、ステージングと本番とで分けて、リージョンごとにリソースを作成・閲覧できるようにしたときのメモ

## ふと思ったこと

遊びでIAMアカウントを友達用に作成し、渡したのですが、いざそのIAMアカウントでリソースにアクセスすると、あらやだ。私が作ったリソースも普通に見られてしまうのです。

...やだというのは感情論に過ぎないのですが、もし仕事で、実際に本番稼働しているシステムのステージングに変更を加えようとしたら、誤って本番を更新しちゃった、なんてことも人間はやってしまうと思い、タイトルのような設定ができないか自由研究をしようと思いました。

## 理想の状態

理想としては、「あるIAMアカウントは、あるリージョンでしか作業できない」という状態を目指しました。

| 環境 | リージョン |
| ---- | ---- |
| ステージング | osaka |
| 本番 | tokyo |

上記の設定ができると、友達にも自分の作業を見られなくて済むなと思い、早速設定してみました。

## 実際にやってみた結果

まず、jsonポリシーだけでやろうとしましたが、以下のようなシンプルな指定だけだと、実際に構築する際にエラーが多発しました。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "ec2:*"
            ],
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "aws:RequestedRegion": "ap-northeast-1"
                }
            }
        }
    ]
}
```

結局は「なんちゃらかんちゃらフルアクセス」といったデフォルトでAWSが用意してくれているポリシーをIAMにアタッチしました。

ただ、json側で一部明示的にDenyしてるので、実際にユーザーが他リージョンにアクセスしても、リソースが見られることはありませんでした。

## 最終的な設定

大まかなリソースごとのリージョン制限はアカウントごとにjsonポリシーを作成し、割り当てました。
そして、構築時にエラーが出ないよう、デフォルトで用意されているポリシーをポチポチ割り当てました。

これで、一旦は目指している状態に近づけることができ、リージョンの異なるIAMからはリソース閲覧ができないようになりました。

今後は、現状だと少し権限が強い部分もあるので、少しずつ権限を狭められる努力をしていきたいと思います。
UnityでAndroid14から15へアップデートする際に起きたこととその解決法

# はじめに
UnityでAndroid14から15へアップデートする際、またスムーズにいかなかったので、
エラー内容と解決法を紹介できればと思います。
Unityバージョンは2022.3.45f1で行いました。

# エラー：Unable to detect SDK in the selected directory.
ファイル参照先も存在し中身まであったにも関わらず、SDKが無いと怒られました。

![error_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714377/73eae164-6dfb-e1fa-7df1-23fbdaf862cd.png)


こちらはUnityを再インストールし、プロジェクトを再起動すると解消されました。
インストール時に何か失敗していたのでしょう。

# エラー：Cannot parse project property android.enableR8='' of type 'class java.lang.String' as boolean. Expected 'true' or 'false'.

android.enableR8という変数にtrue,falseではない不正な値が入っているとのことです。
該当箇所をコメントアウトし、修正しました。

```gradleTemplate.properties
# android.enableR8=**MINIFY_WITH_R_EIGHT**
```

# エラー：Play Billing Library のバージョンを更新したはずなのに適応されない
Android14へアップデートした際にPlay Billing Libraryを7へ対応させたのですが、なぜか今回は5.2.1になってると言われました。

```mainTemplate.gradle
dependencies {

configurations.all {
        exclude group: 'com.android.billingclient', module: 'billing'
    }
    def billingVersion = "7.0.0"
    implementation("com.android.billingclient:billing:$billingVersion") {
    force = true}
}
```

明示的に書いているのになぜか適応してくれません。
なんと[公式ドキュメント](https://developer.android.com/google/play/billing/deprecation-faq?hl=ja)に解決方法が載っていました。
どうやら他のライブラリが5.2.1に書き変えてるようなので強制的に7.0.0へ対応させます。
以下をそれぞれ追記しました。

```diff_gradle:MainTemplate.gradle
dependencies {

android {

+  defaultConfig {
+        manifestPlaceholders = [playBillingClientVersion: "7.0.0"]
+      }
    }
}
```
```diff_xml:AndroidManifest.xml
 <application >
+		<meta-data 
+        android:name="com.google.android.play.billingclient.version"
+        android:value="7.0.0"
+		tools:replace="android:value" />
    </application >
```

# おわりに
まだまだビルド時のエラーには手こずりますね。
慣れていきたいもんです。
Oracle Analytics Cloud：ピボットで、列表示されている２つのデータの差を表示する。その１ 計算式を使って表示する

はじめに
---
Oracle Analytics Cloud ：ピボット表示で、列表示されている２つのデータの差を表示したいという要件が出てきた際に、DataVisualizationのワークブックのピボットでは、総計で差を表示するということを思いつきますが、ある列に対しての差という指定ができません。そんなときに、計算式を利用し、列で縦でもっているデータを分割して２つ列を作成して（横持ちして）、対応する方法についてやってみました。

ピボットで列表示している2019年のデータに2018年のデータを減算して表示したいという要件があります。
![g1_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/71d071ae-dd8a-5abb-e35f-67ce783fc385.jpeg)

データソース上は、CYの列で、2019年、2018年のデータがあり、それをピボットの列で表示しています
![g1_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/1d87924d-3b73-063a-6080-a66c72b6ebdf.jpeg)

記事記載時のOAC ver：Sep 2024 Update

前提
---
Data Visualizationでワークブックを作成したことがある
対象のデータソースとして、年度、カテゴリ毎の販売実績を利用する

列表示されているデータを２列に分ける計算式の作成
---
ピボットで列表示されている２つのデータを計算式を利用してわけます
データソースの列で年の列を2018年のデータ用の列と、2019年のデータ用の列に分けます。
ワークブック編集画面を開きます。マイ計算で右クリック、メニューから"計算の作成"をクリックします。
![g1_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/0d14bdd0-93ff-653b-2266-0fc0e2e8c08d.jpeg)

計算式で追加する列に、列の名前を入力します。"2019"と入力します。計算式で"FILTER"関数を利用して、2019年のデータのみを選択する計算式を入力します。保存をクリックします
FILTER( メジャー USING 列名=条件値 ）、例：FILTER(SUM_AMOUNT_SALES USING CY=2019 ）
![g1_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/0de1bcc4-df2b-1a55-3176-02a53af39839.jpeg)

さらに計算式で追加する列に、列の名前を入力します。"2018"と入力します。計算式で"FILTER"関数を利用して、2018年のデータのみを選択する計算式を入力します。保存をクリックします
例：FILTER(SUM_AMOUNT_SALES USING CY=2018 ）
![g1_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/3ec5c7d8-63fc-1b66-4e93-27ca49d1be99.jpeg)

減算の計算式の作成
---
差額を表示する計算式列を作成します
マイ計算に表示されている"2019","2018"をドラッグして、計算式にドロップし、減算します。保存をクリックします
![g1_6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/f342330d-0a59-4e29-8f2b-b3c220f07003.jpeg)

ワークブック作成
---
作成した計算式列を配置します
ビジュアライゼーションは表形式を利用します
![g1_7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/8c381a76-5504-f551-6522-d9932fca17ac.jpeg)

まとめ
---
ピボットで列表示されているデータは、１つの列で縦持ちされているため、計算式で計算をするために縦持ちを横持ちにかえるために、計算式を利用して対応する方法をためしてみました。

以上
ChatGPTに仕事をやらせる時代

## はじめに

「ちょっとググってみようかな」と思ったとき、実はChatGPTに聞くことでさらに効率的に答えが見つかることがあります。ここでは、ChatGPTに調べものを頼むメリットをざっくり紹介します。

## 1. 時間短縮になる

検索エンジンで調べると、膨大なリンクがズラッと出てきて、結局その中から自分に必要な情報を探さないといけないですよね。でも、ChatGPTなら質問にピンポイントで答えを出してくれるので、探す時間を大幅に短縮できます。

## 2. 情報がシンプルでわかりやすい

検索結果には色んな意見や細かいデータが載っていますが、ChatGPTはそれらを簡潔にまとめてくれるのがありがたいポイント。例えば専門的な内容も、できるだけわかりやすく噛み砕いて教えてくれるので、調べた後に「結局これってどういうこと？」となりにくいです。

## 3. 連続で質問できるから便利

「これってどういうこと？」って思ったら、検索エンジンでまた新しいワードを打ち込む必要があるけれど、ChatGPTならそのまま続けて聞けます。「じゃあ、こういう場合はどうなの？」みたいな感じで、どんどん質問を重ねられるのが便利。結果的に、知りたいことが深く理解できます。

## 4. 幅広い内容に対応

ChatGPTは、レシピのアイデアから旅行のプラン、さらに専門的な技術サポートまで、かなり幅広い質問に対応してくれます。特に「ざっくり調べたい」ときも「しっかり調べたい」ときも頼りになるので、使い勝手が良いんです。

## 5. コンテクストを理解してくれる

一度のやりとりで終わりではなく、前の会話も踏まえて回答してくれるので、同じことを何度も説明しなくて済むのもポイント。過去の会話をベースにして、追加の質問にも対応してくれます。

## 6. リアルタイム情報もいける

今のChatGPTは、リアルタイムで最新の情報を取得する機能もあるから、例えば「今週末のイベント情報」や「最新ニュース」を知りたいときもサッと答えがもらえます。最新情報も含めて頼れるのは、今どきの便利な使い方ですね。

## 7. エビデンス探しにも便利

ChatGPTは、特定のテーマに関連する信頼性の高い情報やエビデンスを効率的に示してくれます。例えば、専門的な記事や報告書、統計データなどを取り上げたいときに、その出所や要点を要約して教えてくれるため、特にリサーチ作業や論文執筆の際に役立ちます。信頼性を確認しながら資料集めを進めるのにもってこいです。

## まとめ

ChatGPTを使って調べものをすると、「ちょっと時短したいな」とか「ざっくり知りたい」ときに特に役立ちます。検索エンジンと併用しつつ、ChatGPTならではの効率の良さを活用して、賢く調べものをしてみましょう。

…と、ここまでの内容も実はChatGPTが書きました。検索エンジンと同じくらいChatGPTも頼りになる相棒なんです！

:::note warn
注：ChatGPTの回答が全て正しいわけではありません。情報が正確かどうかは、ご自身で確認するようにしてください。
:::
CompTIA Linux+ 勉強メモ

# 疑問点
2>
ddコマンド
hostコマンド
iopingコマンド
arpコマンド
/var/log/secure
/var/log/syslog
/var/log/messages
/var/log/kern.log

# System Management
・/dev/null
「無」を意味するファイル。「hoge.sh < /dev/null」で入力に使えば引き数なしで実行という意味だし、「hoge.sh > /dev/null」なら実行結果は破棄(=出力しない)という意味になる
https://wa3.i-3-i.info/word11733.html

・/dev/zero
null文字が入ってるファイル。容量ありでファイルの中身を黒塗りしたいときに使うもの？
https://wa3.i-3-i.info/word11744.html
https://qiita.com/umeee/items/4e6b9ef349a0ed291644

・/dev/uramdom

# Security


# Scripting, Containers, and Automation


# Troubleshooting


# コマンド
* lsblk
* rm
ファイルやディレクトリの削除コマンド
  * rm aaa.txt ⇒ aaa.txtを削除
  * rm -i aaa.txt ⇒ 削除前に消していいか確認したうえでaaa.txtを削除


# その他
* linuxでは最初に見つかったハードディスクが「/dev/sda」、２番目に見つかったハードディスクが「/dev/sdb」と命名される
https://www.debian.org/releases/stable/i386/apcs04.ja.html

* リダイレクト「2>&1」について
https://qiita.com/IY_LNX/items/ef7a1158f6084bea1bac
Googleサイトで作ったウェブサイトをCloudflareを使ってネイキッドドメインから転送する

独自ドメインを持っていますが、簡単なGoogleサイトで運用しています。

ドメインはValueDomainで購入しました。

サイトはGoogleサイトで作ったウェブサイトをCloudflareを使ってネイキッドドメインから転送するの形式でwwwサブドメインで公開していますが、wwwなどのサブドメインがない「domain.com」な形式＝ネイキッドドメインと呼びますが、この扱いがなかなか面倒なんです。

Googleサイト（Google Workspace)の機能ではセキュアでない```http://domain.com```と入力した場合に```https://www.domain.com```に転送することはできます。

しかし！　http<span style="font-style:bold;color:red;">s</span>://domain.comのようにSSLサイトだと転送できないんですよね...

いろいろ調べたところ、最初は先入観からかうまくいかなかったんですが、設定自体はごく簡単に実現することができました。

備忘も兼ねて記録しておきます。

## １．まずはCloudflare

GoogleサイトやGoogle Workspace、私の契約しているValueDomainのドメインだけではできませんでした。

そこでCDNやDNSサービスなどが入っているCloudflare（クラウドフレア）を利用して実現します。

![20241101122306.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51116/28088ba8-16d6-4b25-531c-b88616e99df4.png)

まずはCloudflareのアカウントを作成します。実現したい機能であれば無料コースでできました。

[https://www.cloudflare.com/ja-jp/](https://www.cloudflare.com/ja-jp/)

自分のドメインを登録すると現状のDNS設定を吸い出してくれます。これを後で変更します。

ドメインサービス（私はValueDomain）でのネームサーバの値をCloudflareで指示された値にします。画面に指示されます。

これで自分のドメインにアクセスするとCloudflareを参照するようになります。

## ２．Googleサイトの転送機能は不要！

設定はそのままでも大丈夫ですが、不要なので削除します。

Googleサイトでサイト転送機能を使おうとすると、下図の設定をしろと指示されます。

![20241101122326.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51116/d4f66f53-969f-c7fb-8f12-bef40239af79.png)

いままではこのIPアドレスをDNSのAレコードに登録しますが、

**この設定は不要です**

Cloudflareに吸い出された設定を削除しても大丈夫でした。


## ３．CNAMEにネイキッドドメインを設定する

いままではwww.domain.comにアクセスするとサイトが表示されるように設定されているとします。

SSLの```https://domain.com/```にアクセスした場合、サイトが見つからないとなります。

ここでCloudflareのDNS＞レコードで、CNAMEを追加します。

![20241101122319.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51116/ee4a50f4-2f99-40ec-d165-dc7f365b0cca.png)

図の枠で囲んだ様にdomain.comはwww.domain.comと同じCanonical NAME（正規名）と設定します。

なんとこの設定がOK！？

この独自ドメインでメールなども使ってるんですが、普通はdomain.comがwww.domain.comですよと設定するのはNGなはずです。CNAMEにdomain.comを指定してしまうとメールなどのMXの設定もできなくなるはずです。

私もここで？？？となり、しばらくうまくいきませんでした。

CloudflareのCNAME Flatteningという技術で解決しているそうです。

[https://www.mki.co.jp/lp/cloudflare/column_20191206.html:embed:cite]

## ４．ページ転送ルールを設定する

ルールメニューでページ転送を設定します。

```http://domain.com```でも、```https://domain.com```でも```https://www.domain.com```に転送するような設定です。

![20241101140700.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51116/a3ecb8fb-b276-476b-4b4c-d61c6ba486ef.png)

これで完了です！

## まとめ

- CloudflareのCNAME Flatteningという機能を利用してGoogleサイトの様にWebサーバの設定できない場合でもネイキッドドメインを転送することができる様になりました。

- ```https://domain.com/```のままサイトを利用することはできません。www.domain.comに転送します。→ URLは```https://www.domain.com/```となります。

- ネイキッドドメインのままGoogleサイトを使えるようにする設定があれば教えてください。
読んだ技術系の記事ログ 2024/11/01

# 読んだ記事

仕事がらみや趣味で読んだ記事のうち、参考になったもの・印象に残ったものを記録。

## デバッグ手法について
手法や考え方、スタックトレースの読み方などがよくまとまっており人に共有しやすかった。

https://qiita.com/opengl-8080/items/56d31fe80b45773dc808

## OAuth/OIDC

関連仕様のロードマップが欲しかったので助かった。

https://qiita.com/TakahikoKawasaki/items/185d34814eb9f7ac7ef3

## Flutterがフォークされた話

https://flutterfoundation.dev/blog/posts/we-are-forking-flutter-this-is-why/

日本語解説
https://zenn.dev/chooyan/articles/c4e27945b7a883

## Deno v2

よく使っているのでv2関係で現行のプラクティスを理解できてよかった。

https://zenn.dev/uki00a/articles/deno-v2-what-has-changed-from-v1

https://zenn.dev/ame_x/articles/d1742e77fa1351

## アーキテクチャ

https://zenn.dev/manalink_dev/articles/not-perfectionist-architecture

## React

https://zenn.dev/yuya333/articles/92a6984377d8e3

## TypeScript

https://zenn.dev/rio_dev/articles/4b6076001724ba

## JSR


https://zenn.dev/nakasyou/articles/jsr_7m_thoughts

## Rust

https://zenn.dev/boostdraft/articles/31408406d1d867

## Vitest
in-source testingについて。

https://vitest.dev/guide/in-source

## FTP

https://ja.wikipedia.org/wiki/File_Transfer_Protocol

https://qiita.com/middle_aged_rookie_programmer/items/3ed0efeb123220d9bdef

上記を元に構築した。

https://github.com/Showichiro/ftp-spring-boot-example
【Terraform】コマンド一覧

# はじめに
Terraform初心者な私が、よく使うTerraformコマンド等を以下に記載します。
どんどん付け足していきます。初期装備しょぼくてごめんなさい(´・ω・｀)



# 利用フロー

1. 設定ファイル(.tf)の記述
1. 設定ファイルの検証
　 `terraform validate`の実行
1. フォーマット整頓
　`terraform fmt`の実行
1. ワークスペース初期化
　`terraform init`の実行
1. 反映内容の確認
　`terraform plan`の実行
1. 反映
　`terraform apply`の実行


# Terraformコマンド
私が現場で使用しているTerraformコマンドを以下に記載します。


## init
ワークスペースを初期化するための、一番最初に叩くべきコマンドです。
```ruby
piromo $ terraform init
```

`-upgrade`はバージョン制約を満たす中で、一番最新のバージョンを取得します。
```ruby
piromo $ terraform init -upgrade
```

## fmt
Terraform 構成ファイルを標準的な形式とスタイルに書き換えてくれます。
インデントを揃えるのが大変であれば、このコマンドをたたけば一発直してくれます。

```ruby
piromo $ terraform fmt
```
```ruby
piromo $ terraform fmt [options] [target...]
```

### options
| オプション | 用途 |
|:-:|:-:|
| `-list=false`  | フォーマットの不一致を含むファイルをリストに表示しない |
| `-write=false` | 入力ファイルを上書きしない |
| `-diff` | 書式変更の差分を表示する |
| `-check` | 入力がフォーマットされているかどうかを確認する |
| `-recursive` | サブディレクトリ内のファイルも処理する |


https://developer.hashicorp.com/terraform/cli/commands/fmt

## validate
ディレクトリ内の構成ファイルを検証し、構文的に正しいのか確認してくれます。
リモートサービスには接続しません。
```ruby
piromo $ terraform validate
```

https://developer.hashicorp.com/terraform/cli/commands/validate

## plan
実際のリソースの構成情報と、Terraformの構成ファイルの差分を確認し、
リソースに対してTerraformが実施する内容を表示してくれます。
```ruby
piromo $ terraform plan
```

## apply
リソースに対して変更を適用します。
```ruby
piromo $ terraform apply
```

### options
| オプション | 用途 |
|:-:|:-:|
| -refresh-only | |

## import
terraform importコマンドは、Terraform管理がされていないリソース情報をtfstateファイルに取得するコマンドです。
```ruby
piromo $ terraform import [resourceブロックのtype].[resourceブロックのname] [resourceIDやARN]
```
### 使用例
S3バケット情報をインポートしたい場合：
```ruby:main.tf
resources "aws_s3_buceket" "example" {
  bucket = hands-on_example
}
```

```ruby:例
piromo $ terraform import aws_s3_buceket.example hands-on_example
```

https://developer.hashicorp.com/terraform/cli/import
AWS Certified AI Practitioner ふりかえり

## はじめに
**AWS Certified AI Practitioner**（以下、AIF）に合格したので、勉強したことと感じたことをまとめました。受験したのは、AIFがベータ版から正式版になって、2週間後くらいです。


新しい資格が出たからというのもありますが、AIを利用したアプリ開発に携わってはおらず、ただAIを使う側だったので、よりよくAIを使うことができるようになるのではないかと思い、資格取得を目指しました。


点数はまあまあといったところで、完璧ではないですが、合格を目指す方の参考になれば幸いです。

## まずは試験ガイド
試験勉強を始める前に、まずは[試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-ai-practitioner/AWS-Certified-AI-Practitioner_Exam-Guide.pdf)を読むべきです。
出題される分野と各分野で必要となる知識や技術を把握することができます。
 
AIFの試験ガイドの中で重要だと思ったポイントは、はじめにの中で検証される能力のタスクとして、

> 一般的な、またAWS上での、AI、ML、生成AIの概念、手法、戦略を理解する。

と挙げられている点です。ここでいう「一般的な」は、AWSに限らないということを指しています。

そのため、AWSのAI/MLサービスについて知っているだけではなく、一般的なAI、ML、生成AIに関する知識が必要になってくるので、幅広く知識としては抑えておく必要があります。


## 勉強したこと

　私は、AWSクラウドの考え方やAWS責任共有モデル、基本的なAWSサービスの知識は、AIFの受験に際して問題ないと思っていましたが、AI、ML、生成AIについては全く自信がなかったので、

- 一般的なAI、ML、生成AIの専門知識
- AWSが提供するAI、ML、生成AIサービス

という大きく２つの軸で学習を進めていきました。

### 一般的なAI、ML、生成AIの専門知識

　機械学習のパイプランや学習法の種類、生成AIの精度改善やモデル評価の方法について、用語や仕組みを学習しました。業務でAIは使っていないので、はじめて聞く言葉がほとんどでした。
 　AIが得意なことと苦手なことを理解することで、それぞれのユースケースでAI活用し、AIを使うによって起こり得るリスクや責任についても知見を深めました。

### AWSが提供するAI、ML、生成AIサービス

　AIFの試験範囲の中では、やはり、Amazon Bedrock、Amazon Sagemaker がAWSが提供するサービスのメインになります。Sagemakerは関連するサービスが多くあり、各AIサービスの目的や使い方を正しく理解するようにしました。


　また、AI自体を提供するサービスだけでなく、AIに学習をさせるためのデータやAIが出力した結果に対して、アプローチするサービスもあります。AI/MLの領域以外でも使うサービスも多いので、合わせて学習をしていきました。

## 学習リソース

主な学習リソースは、AWS PartnerCastとAWS Skill Builderから以下のコンテンツです。

- AWS PartnerCast
    - AWS パートナー限定 : AWS 認定 AI プラクティショナー特化セミナー
- AWS Skill Builder
    - はじめての生成 AI on AWS (Technical)
    - AWS Partner Certification Readiness (APCR): AWS 認定 AI Practitioner
    - Exam Prep Official Practice Question Set: AIF

その他にもAWSのAI/MLサービスの動画を視聴しました。

個人的には、

- **AWS Partner Certification Readiness (APCR): AWS 認定 AI Practitioner**
(11/1時点ではメンテナンス中) 


が、おすすめです。

- Standard Exam Prep Plan: AIF (AIF-C01)

の日本語版があれば、これで学習していましたが私は英語が苦手なので、日本語コンテンツを中心に使いました。

　AWS Partner Certification Readiness (APCR): AWS 認定 AI Practitioner は、Standard Exam Prep Plan を補強するためのコンテンツで、各分野でいくつかの例題をもとに解答と解説がされています。
 　補助教材的立ち位置ですが解説が充実しており、知識の習得面でも非常に有効でした。各動画は10分前後と見やすいので、スキマ時間を見つけては進めていました。


※ AWS Partner Certification Readiness (APCR): AWS 認定 AI Practitioner はメンテナンス中なことから、メインの学習コンテンツであるStandard Exam Prep Planの日本語版が近々登場するのではないかと思います。登場したら基本的には後者で学習を進めるのが良いはずです。

## 思ったこと
Cloud Practitioner に続く、Foundationalレベルの試験になるので、基本的だからこそ重要な要素が多いと感じました。

また、関連用語をしっかりと理解していないと、問題を読み進める中で「はてなマーク」がたくさんついてしまうので、専門用語や、AWSサービス名とその役割は、抑えておかないといけないと感じました。

受験して良かったことの１つで、生成AIをうまく使えるようになったことがあります。
資格取得に向けた勉強を通して、プロンプトエンジニアリングや推論パラメータを理解でき、生成AIを使う際に、回答の形式や方向性をより求めるものへ近づけられるようになったと思います。

## これから
個人レベルでは、生成AIをうまく使って業務の効率化をより図れるようになったと思います。コーディングでは、かなりお世話になっているので、さらに仲良く付き合っていきたいです。


チームやプロジェクトレベルでは、生成AIや機械学習を使用したアプリケーション開発の足場ができたと思います。本番製品として使うには、まだまだ深い理解が必要になってくると思いますが、知識が発展途上の中でAI/ML開発をする方法を知ることができ、目的に応じてAWSのサービスを使い分けていくことができると思います。

次は、AWS Certified Machine Learning Engineer - Associate を視野に入れて、学習を進めていきます！
Simple Fade Scene Transition System　について

題記のとおり、フェード用アセット「Simple Fade Scene Transition System」について書きます。

使用はこちらから。↓

https://assetstore.unity.com/packages/tools/particles-effects/simple-fade-scene-transition-system-81753?locale=ja-JP

中身はシンプルで、ざっくり言うとCanvasGroupを持ったオブジェクトを作ってアルファ値でファ～ってやってるだけ。

とりあえずやったカスタマイズを投げようと思います。

---

### １. フェード中に他のUI触れねぇようにしてぇな～

Initiate.csの20行目あたりにinit.AddComponentが何個かありますよね。
```
init.AddComponent<GraphicRaycaster>();
```
をぶち込んでください。ただし、他オブジェクトのsortingOrderが1以上の場合はそこも編集する必要があります。

---

### 2. なんかフェードインうまくいかねぇな～

これは一個目にも関連します。だいたいsortingOrder上げれば解決します。
```
init.GetComponent<Canvas>().sortingOrder = (好きな数字);
```

Canvas自体はすでに加えられてるのでGetComponentして「なんとかなれーっ！」して終わりです。

---

### 締め
他にもあれば追記します。
「コード読んだ方が早ぇし楽じゃね」？まったくもってその通りです。
Rust ジェネリック関数で”the size for values of type `str` cannot be known at compilation time”エラー

## コンパイルエラー発生！
このコードを実装したら、コンパイルエラーになりました。
Rust初心者の私には、このエラーの理屈が分からなくて、悩んだので書き留めておきます。
```rust
    fn print_value<T: std::fmt::Debug>(s: &T) {
        println!("{:?}", s);
    }
    
    let s: &str = "Hello, world!";

    // エラーになった
    // the size for values of type `str` cannot be known at compilation time
    print_value(s);
```

## なんでエラーになるの？
`s`は`&str`型なのに、`str`型と認識される理由が分からなかったです。。。。

## まずはstr型について
まずは`str`型についておさらいです。

[The Rust Programming Language 日本語版](https://doc.rust-jp.rs/book-ja/ch04-03-slices.html#%E6%96%87%E5%AD%97%E5%88%97%E3%83%AA%E3%83%86%E3%83%A9%E3%83%AB%E3%81%AF%E3%82%B9%E3%83%A9%E3%82%A4%E3%82%B9%E3%81%A7%E3%81%82%E3%82%8B)によると`&str`は`str`型の参照ですが、`&str`はスライス型です。
"Hello"などの文字列リテラルもスライス型になるようです。
```rust
let s: &str = "Hello";
```

ここで注意です。`&String`と`&str`はまったく別の型です。
- **&String:** String型の参照
- **&str:** str型の参照

### str型は変数、引数、戻り値の型として指定できません
この変数宣言はコンパイルエラーになります。
```rust
let s: str;
```
![{8CD9E973-9975-4E90-97D7-96A01A0E3A22}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477554/15971104-5dd4-7042-8c68-320606841ef3.png)
`str`型はコンパイル時点でデータサイズが未定なので使えません。

しかし、`&str`にすると、参照値（アドレス値）となりデータサイズが分かるので使えます。
下図はVSCODEのスクショです。
![{4AE3CACB-C629-4A18-9684-58048C6BCE45}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477554/79ccc0d6-bf23-0b37-cca0-07decd2624ff.png)
size=16とデータサイズが16バイトであると分かります。

## 次にジェネリック型の型解決の動き
これを理解していなかったのでエラーの理由がわかりませんでした。

こちらのコードは、問題なくコンパイルできます。
```rust
let n:i32 = 10;
print_value(&n);    
```

では、ジェネリックがどのように型を解決（推論）してくか。です。
1. **T = i32** （まずはTの型を解決）
1. **&T = &i32**

と型解決します。
この2段階解決だと知りませんでした。

私は
1. **&T = &i32**

と一発で解決すると思っていました。

この解決の動きだと下記の`&str`の場合は
```rust
let s: &str = "Hello, world!";
print_value(s);    
```
1. **T = str**
1. **&T = &str**

となります。

そうです、1段階の**T = str**の時点で、`T`が`str`となり、`str`は引数の型としては使えないのでダメ！とエラーになるのです。

このエラーを回避するなら
```rust
let s: &str = "Hello, world!";
print_value(&s);    
```
とします。すると
1. **T = &str**（`&s`の型は`&&str`なので、Tの型は`&str`になる）
1. **&T = &&str**

となり、1段階目のTが`&str`になるのでエラーになりません。
【初投稿】技術記事の投稿を始めるにあたって


## はじめに
プログラミング、VR開発、開発環境およびツールに関する技術記事の投稿を始めることにしました。
これから多岐にわたるテーマを共有していければと考えています。

どうぞよろしくお願いいたします。

## プラットフォームの使い分け

### Zennでの投稿予定
- 入門者向けの基礎解説
- ステップバイプステップな実装ガイド
- 技術の基本概念の説明
- よく使う機能のTips集
- チュートリアル形式の解説

### Qiitaでの投稿予定
- 具体的な実装方法
- トラブルシューティング
- 環境依存の問題と解決策
- パフォーマンス最適化
- デバッグ手法
- 実践的なユースケース

## 関連リンク
- [Zenn](https://zenn.dev/tky116)
- [Qiita](https://qiita.com/tky116)
Azure AI製品選定フロー(日本語訳)

フローを翻訳してみました
※誤訳などある可能性あり

引用元：
https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/scenarios/ai/strategy#define-an-ai-technology-strategy

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/9aa4b707-3730-a23e-d3f9-34fe3f9e3fd4.png)

元の画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/da709785-ba3d-89af-aa19-d63f6d6df150.png)
【Unity】現在のシーンを取得するコード

メモ
#### 環境
・Window11
・Unity2022.3.23f1

#### コード
```csharp
SceneManager.GetActiveScene().name
```

#### サンプルコード
```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; // 必要

public class Timer : MonoBehaviour
{
    void Start()
    {
        Debug.Log(SceneManager.GetActiveScene().name);
    }
}
```
終わり
VSCode拡張機能flake8でE501が邪魔だと感じたらすること

## 前置き

はいどうも、たねだです。
ご無沙汰になりました。
プログラミング自体は続けているものの
いかんせんこういう発信の継続が苦手です。

早速本題ですが、当方プログラミング初心者です。
PythonをメインにVSCodeでプログラミングをしており、
フォーマッターとしてflake8を採用しています。

きれいなコードを書くという意味で非常に有用なフォーマッターですが、
割とどうでもいいことなのにエラーが頻発して地味に邪魔。

<b>その名も`E501`。</b>

`line too long (n > 79 characters)`というやつですね。
調べ方が悪くてなかなか対処法が見つからなかったので放置していたのですが、
やっぱり邪魔だなと思いましてこの度片っ端から試しました。
## 対処法
結論から言いますと
<b>設定からflake8のArgsに`--ignore=E501`を入力すればいいだけ！</b>

なんですけども、
それだけだと味気ないですので以下具体的な方法と
ちょっとしたTipsを残しておきます。

### 対処方法
まずはflake8の設定に入ります。
いろいろな入り方があるとは思いますが手っ取り早いのは
VSCodeの拡張機能タブからFlake8の歯車マークをクリックして
設定に入るのがわかりやすそうです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883687/0b994546-27df-a800-9818-c7f1bca3caa6.png" width="50%">

設定に入ると`Flake8: Args`が一番上にあると思いますので
`項目の追加`をクリックして無視したいエラーや、追加したい条件を記述します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883687/91faf16e-5bc9-7f11-ca1e-efe4205a79a1.png">
先述の`--ignore=E501`を入力することで
件のエラーを表示しないようにすることができます。
(`--disable=E501`でも可)

ただ、完全に表示しないようにすることへ違和感がある方向けに
ちょっとしたTipsとして`--max-line-length=○○`を紹介しておきます。
画像では値を<b>100</b>としていますが好きな値にするとよいでしょう。
もちろん、PEP8の原則に従うのであればデフォルトの設定である
1行79文字を超えたらエラーが出るという仕様が正しいのでやりすぎは禁物です。
とはいえどうしたって79文字を超えることなんてざらにあると思うので
その辺りはうまく調整してください。

それでは快適なコーディングライフをお楽しみください。

<details><summary>ちょっとした小言</summary>

初心者並感なのですが2枚目の画像について、

例:
・"flake8.args": ["--rcfile=<file>"]
・"flake8.args": ["--disable=C0111", "--max-line-length=120"]

と例が書かれていますがこれを直接コピペするとエラーが発生します。
これのせいで解決に地味に時間がかかったといっても過言ではないですし、
どう考えても例を書くならコピペして使えるものを書いたほうがいいと思うので
同じ轍を踏まぬよう仕様の書き方には注意をしようと思いました。
</details>
GAS実行日のGoogleカレンダーの予定のタイトルを出力してみる

## 概要

GASを使って実行日のGoogleカレンダーの予定を出力してみる。

## 方法

- 下記の方法で予定を取得したいカレンダーIDを確認

https://qiita.com/miriwo/items/b00b3282cc428fc1c480

- 下記のコードを記載して実行（予定のタイトルが順々に出力される。）

    ```main.gs
    function myFunction() {
      const calendarId = 'カレンダーIDを設定';
      const calendar = CalendarApp.getCalendarById(calendarId);
    
      if (calendar === null) {
        console.log('カレンダーが取得できません。');
        return false;
      }
    
      const today = new Date();
      const todayEvents = calendar.getEventsForDay(today);
      todayEvents.forEach((todayEvent) => {
        console.log(todayEvent.getTitle());
      });

      return true;
    }
    ```

## 参考文献

https://developers.google.com/apps-script/reference/calendar/calendar-event?hl=ja

https://developers.google.com/apps-script/reference/calendar/calendar?hl=ja#geteventsfordaydate
Spanning-tree - globally bpdufilter-enabled command only works on portfast-enabled ports 

## Operating Environment
OS : Windows 11
VM : VMware® Workstation
Software：CML 2.7.2
Hardware：N/A

## Network Topology
![Screenshot 2024-11-01 143839.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/4509adbf-32ba-a298-767b-d2629c5229a1.png)

### Enable portfast on SW2's G0/3
![Screenshot 2024-11-01 145050.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/51d3b5b6-fc58-e1b2-a4c6-515bbd2da78f.png)

### Enable bpfufilter globally but ony works on portfast-enabled ports
![Screenshot 2024-11-01 152252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/cf8f249a-91f9-f851-28ce-897e97fa5c0a.png)
![Screenshot 2024-11-01 154117.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/d7967a57-e410-fdd9-19d4-89dd2193535d.png)
![Screenshot 2024-11-01 154307.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/6890b611-0db1-eb9c-bfec-d1c6ec6723b5.png)
Google カレンダー カレンダーIDの確認方法

## 概要

GoogleカレンダーのカレンダーIDの確認方法を簡単にまとめる。

## 方法

1. Googleカレンダーを開く
1. 左サイドバーのマイカレンダーの三点リーダーをクリック
1. 「設定と共有」をクリック
1. 「カレンダーの統合」の「カレンダーID」を確認
MySQLのXプロトコルでハマった話

# 概要
jsp/servletの学習をしていて、JDBCでMySQLに繋ごうとしても繋がらずにハマった際の対応書いた備忘録です。

# MySQLのプロトコルは二つある
jspで書いたwebアプリからJDBCを使ってMySQLに繋がらない・・・
エラーには`X protocol`云々と書いてある・・・
```text
Cannot create PoolableConnectionFactory (Unsupported protocol version: 11. Likely connecting to an X Protocol port.)
```

# 解決
下記の参考文献によると、MySQL Client/Server Protocol (MySQL C/S Protocol) と X Protocol という2つのプロトコルが使われているとのこと。
デフォルトのポート番号は、前者が3306、後者が33060。
後者のポート番号を指定して接続しようとしていたことが原因だった。
ポート番号3306を指定したところ、接続することができた。

# 参考文献
https://goropikari.hatenablog.com/entry/self_made_mysql_connector_xprotocol

https://codenote.net/posts/3579/
リレーショナルデータベースについて

リレーショナルデータベースについて学習した内容をアウトプットとしてまとめてみました。
同じように学習されている方の参考になれば幸いです。

## リレーショナルデータベースとは
リレーショナルデータベース（関係型データベース）は、データを表形式で管理し、複数のテーブル（表）同士を関連付けて扱うことができるデータベースシステムです。

## テーブルの基本構造

### 1. 行（レコード）と列（カラム）
テーブルは以下の要素で構成されています。
- 行（レコード）：テーブルに格納されたデータ1件分
- 列（カラム）：データの項目を定義する部分

例）生徒テーブルの場合：
- 行：生徒1人分のデータ
- 列：学籍番号、氏名、生年月日など

### 2. データ型
各カラムには、保存できるデータの種類を指定します。
例えば以下のようなものがあります。
- 数値型：整数や小数を扱う（例：年齢、成績）
- 文字列型：文字を扱う（例：氏名、住所）
- 日付型：日付や時刻を扱う（例：生年月日、登録日時）

### 3. 制約
データの整合性を保つための規則です。
代表的な制約は以下の2つです。
- **NOT NULL制約**：空の値（NULL）を禁止
- **UNIQUE制約**：重複する値を禁止

## キー（KEY）の種類と役割

### 1. 主キー（Primary Key）
- テーブル内のデータを一意に特定するためのカラム
- 重複と空欄（NULL）は許可されない（主キー制約）
→ 1つのテーブルに1つだけ設定可能

### 2. 外部キー（Foreign Key）
- 他のテーブルの主キーを参照するためのカラム
- テーブル間の関連付けに使用する
- 参照先のテーブルに存在しないデータは保存できない（外部キー制約）

## テーブルを分けるメリット

例えば、生徒と教室の情報を管理する場合

**良くない例（1つのテーブルで管理）：**
- 教室名が変更された場合、その教室の生徒全員分のデータを修正する必要がある
- データの重複が多く、管理が煩雑

**テーブルを分けて管理した場合：**
1. 生徒テーブル：生徒ID、氏名、教室ID
2. 教室テーブル：教室ID、教室名

この場合：
- 教室名の変更は教室テーブルの1箇所の修正で済む
- データの一貫性が保たれやすい
- 保存容量も少なくて済む

##
最後まで読んでいただきありがとうございました！

## 参考
https://pikawaka.com/curriculums/web-service-development/relational-database-term

https://wa3.i-3-i.info/word11770.html
AWS CloudWatchとDatadogの使い分け

AWSを使いこなす上で、インフラのパフォーマンスや状態のモニタリングは重要です。その際に役立つのが、AWS CloudWatchとDatadog。どちらもAWS環境のモニタリングを行うサービスですが、それぞれ特徴やメリットが異なり、環境によって使い分けが求められます。

本記事では、CloudWatchとDatadogの特徴や、どんな環境でどちらを使うのが最適かを解説していきます。

1. CloudWatchとは？
AWS CloudWatchは、AWSが提供するネイティブなモニタリングサービスです。AWSリソース（EC2、Lambda、DynamoDBなど）のメトリクス収集やログ管理、アラート設定を行えます。

CloudWatchの特徴

 AWSと統合: AWSサービスをシームレスに監視でき、AWSアカウント内のリソースのモニタリングに最適です。

シンプルな設定: 各種メトリクスの収集、アラーム設定、ダッシュボード作成が簡単に行えます。

低コスト: AWS内で使う限り、他のツールよりコストが抑えられます。

CloudWatchの活用シーン
 AWSリソースの基本的なモニタリング: EC2のCPU使用率や、Lambdaの実行状況を手軽に監視。
 システム全体の状態を把握: トラフィックの急増に伴うオートスケーリングや通知設定に利用。

2. Datadogとは？
 Datadogは、複数のクラウドやオンプレミス環境でのモニタリングを得意とするサービスです。CloudWatchにはないAPM（アプリケーションパフォーマンスモニタリング）や分散トレーシングの機能があり、複雑なシステムに向いています。

Datadogの特徴
 マルチクラウド対応: AWSだけでなく、AzureやGCP、オンプレミス環境の一元監視が可能。
 多機能なモニタリング: APMや分散トレーシング機能を備え、パフォーマンスを詳細に分析できます。
 柔軟なダッシュボード: データの可視化が柔軟で、チーム全体での情報共有が容易です。

Datadogの活用シーン

複雑な分散アプリケーション: マイクロサービス環境やリアルタイムのパフォーマンスが重要なシステム。

ハイブリッド環境: マルチクラウドやオンプレミスを含む環境全体を一元管理したい場合。

3. CloudWatchとDatadogの比較
![スクリーンショット 2024-11-01 151128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758876/6ce86c95-1cc4-8d86-5203-d5e69698946c.png)


4. どちらを使うべきか？ 使い分けのポイント
AWS中心の環境
AWSリソースが主な環境であれば、CloudWatchの利用が適しています。ネイティブサービスのため設定も簡単で、コストを抑えつつ基本的な監視ができます。

マルチクラウドや複雑なパフォーマンス監視が必要
複数のクラウドプロバイダーやオンプレミスも含む環境を一元管理したい場合や、APM、分散トレーシングが必要な場合は、Datadogが適しています。

両方を併用するケース
AWSリソースの基本的なメトリクスはCloudWatchで監視しつつ、複雑なパフォーマンスの分析やマルチクラウド環境での可視化はDatadogを併用するという方法もあります。例えば、EC2インスタンスのメトリクスはCloudWatchでモニタリングし、アプリケーションパフォーマンスはDatadogで分析する、といった組み合わせが可能です。

5. まとめ
AWS CloudWatchとDatadogは、モニタリング対象や必要な機能によって使い分けるのがポイントです。AWSリソース中心のシンプルなモニタリングにはCloudWatch、マルチクラウドや高度なパフォーマンス分析にはDatadogが適しています。適切なツールを選択し、効果的なモニタリング環境を構築していきましょう！


参考リンク
AWS CloudWatch公式ドキュメント
Datadog公式ドキュメント