OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Administrator(AZ-104)：Azure でのストレージの実装と管理「ファイル共有やBLOBデータのためのストレージ比較」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「ファイル共有やBLOBデータのためのストレージ比較」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure でのストレージの実装と管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-storage/)
◇対応するモジュール
[ファイル共有や BLOB データのためのストレージを比較する](https://learn.microsoft.com/ja-jp/training/modules/configure-azure-files-file-sync/2-compare-files-to-blobs)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure でのストレージの実装と管理「Azure Storageセキュリティのベストプラクティス」](https://qiita.com/fsd-jume/items/efec36da3babac40bdae)

## ファイル共有やBLOBデータのためのストレージ比較
### Azure Filesの特性
・下記を介してアクセス可能なクラウド上のフルマネージドのファイル共有
　-業界標準のSMBプロトコル(Windows/Linux/macOSクライアント)
　-NFSプロトコル(Linuxクライアント)
　-Azure Files REST API
・データを階層構造のフォルダ形式で格納可能
・任意の数のAzure VMがAzure Filesストレージ共有を同時にマウント可能
⇒複数のVMでファイルへの共有アクセスが可能
・下記はAzure Filesストレージ共有をマウントしてファイルデータにアクセス可能
　-Azure VMで実行されているアプリ
　-クラウドサービスで実行されているアプリ
・一般的なOSにクラウド/オンプレミスデプロイで同時にマウント可能

### Azure Files使用時の考慮事項
**◆置き換え/補完オプションを検討**
・下記の置き換え/補完が可能
　-従来のオンプレミスファイルサーバ
　-NASデバイス

**◆グローバルアクセスを検討**
・世界中のどこからでも、ほとんどのOSでAzure Files共有に直接アクセス可能

**◆リフトアンドシフトのサポートを検討**
・ファイルアプリやユーザデータをファイル共有に保存
⇒アプリをクラウドに簡単にリフトアンドシフト可能

**◆Azure File syncエージェントを検討**
・Azure Files共有をオンプレミス/クラウドのWindowsサーバにレプリケート可能
⇒データを分散キャッシュしてパフォーマンスを向上

**◆共有アプリを検討**
・一般的に分散アプリは集中管理された場所に構成ファイルを配置
・Azure Filesに共有アプリの設定(構成ファイルなど)を格納
⇒ユーザがローカルで共有をマウントすることでアクセス可能

**◆診断データを検討**
・診断データ(ログ/メトリック/クラッシュダンプなど)をAzure Filesに格納
⇒開発者はローカルコンピュータに共有をマウントしてアクセス可能
⇒使い慣れた既存のツールでクラウド開発を継続可能

**◆ツールとユーティリティを検討**
・クラウド内のVMで作業している開発者/管理者
⇒一連のツール/ユーティリティが必要になることが多い
⇒これらを各VMにコピーする作業に時間がかかる
・ローカルからVMにAzure Files共有をマウント
⇒ツール/ユーティリティに素早くアクセスが可能になり、コピーが不要

### Azure Files/Azure Blob Storage/Azureディスクの比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/82f66884-a0ca-5c72-e656-bd664c7430fc.png)

## 次の学習内容
**◆Azure Files共有の管理**

https://qiita.com/fsd-jume/items/5d4a539ca4c81df5e532

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
GitHub ActionsでPHPUnitしたい！

# 概要
- GitHub Actionsのservicesでdocker on dockerする
- マウントの設定が一手間かかる


# GitHub Actionsでテストを実行する

GitHub Actionsでは `runs-on` の設定でジョブを実行する環境を設定できる。

https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idruns-on

しかし、テストを実行する際はアプリケーション稼働と同じ環境で実施したい。

## servicesを使う

そこで、 `services` の設定でコンテナを起動し、そのコンテナ内部でテストを実行する。

https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idservices

`services` は以下のように設定できる。
アプリケーションのDockerfileやdocker-composer.ymlと同じように必要なコンテナをセットする。

```yml
jobs:
  test:
    runs-on: ubuntu-latest

    services:
      php:
        image: public.ecr.aws/docker/library/php:9.0-fpm-alpine
        options: --name php --workdir /application --entrypoint php-fpm
        volumes:
          - /home/runner/work/project/project/application:/application
      db:
        image: mysql/mysql-server:5.7
        env:
          MYSQL_ROOT_PASSWORD: password
          MYSQL_DATABASE: database
          MYSQL_ROOT_HOST: '%'
        ports:
          - 127.0.0.1:3306:3306
```

## マウントフォルダの問題

`services` の設定を使うと、 `Set up job` の次に `Initialize containers` というステップが追加される。
つまり、ソースコードのチェックアウトより先にマウント用のフォルダが作成されてしまう。

マウント用のフォルダに対してgit cloneやファイルのコピーをすると、 `fatal: destination path '.' already exists and is not an empty directory.` というエラーが発生してしまう。

そこでマウントしたときのオーナーを変える。

```yml
    steps:
      - name: chown user
        run: |
          sudo chown -R runner:docker application
```

## あとはいつもどおりテストをする

composerのDLに時間がかかるようであればキャッシュしておくといい。

```yml
      - name: Composer Cache
        uses: actions/cache@v3
        id: composer-cache
        with:
          path: |
            /home/runner/work/project/project/application/vendor
          key: "${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}"
          restore-keys: |
            "${{ runner.os }}-"

      - name: composer install
        run: |
          cd application
          composer install \
              --ignore-platform-reqs \
              --no-interaction \
              --no-plugins \
              --no-scripts \
              --prefer-dist
```

AWS SDKを使っていてかつテストでAws\MockHandlerを使用しているなら、適当な認証設定を追加する必要がある。

```yml
      - name: setup app
        run: |
          cd application
          cp .env.example .env

          # Aws\MockHandlerに必要、実際のAWS環境を使うテストができたら消すこと
          echo "AWS_ACCESS_KEY_ID=x" >> .env
          echo "AWS_SECRET_ACCESS_KEY=x" >> .env
          echo "AWS_SESSION_TOKEN=x" >> .env
          echo "AWS_COGNITO_USER_POOL_ID=x" >> .env

          docker exec php docker-php-ext-install -j$(nproc) pdo_mysql

      - name: execute test
        run: |
          docker exec php php artisan test
```
EventBridgeとECSで定時バッチ実行させるときに気をつけるメモ

# 概要
- ECSで定時バッチを実行するのにはEventBridgeが使える
- EventBridgeからECSを直接呼び出すとECSタスク起動失敗を把握できないときがある
- 確実にやるならStepFunctionsを使おう


# ECSで定時バッチを実行する

## 実行するときだけECSタスクを起動したい理由

- コストを抑えたい
- 不要な監視対象を作りたくない
- 稼働中のアプリケーションサーバと別にすることで負荷を減らしたい
- etc.


## ECSタスクスケジューリング機能を使う

cronなどを設定して定期的なECSタスク実行ができる機能が既にある。
実行時間の設定とターゲットとなるECSタスクのタスク定義などを設定するだけで定時バッチが組める優れもの。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/scheduling_tasks.html

## EventBridgeを使うときの罠

EventBridgeから直接ECSタスクをターゲットにする流れは以下のとおり。

```plantuml
start

:EventBridgeのルール実行;

if (ECSタスク起動を呼び出し) then (成功)
    #fa0:EventBridge成功;
    if (ECSタスク起動) then (成功)
        #fa0:タスク定義に応じた内容が実行される;
        stop
    else (失敗)
        #f00:突然の死;
        stop
    endif
else (失敗)
    :EventBridgeエラー;
    end
endif
```

EventBridgeによるECS起動呼び出し後のECSエラーについてEventBridgeは責任を持たないという罠がある。
以下の記事も参考されたし。

>スケジュールされたタスクは、EventBridge ルールをトリガーに RunTask API によって起動されます。RunTask API の実行に失敗した場合、EventBridge の再試行ポリシーに従いリトライが行われますが、RunTask API はタスクの開始が行われた時点で正常実行として終了します。

https://dev.classmethod.jp/articles/tsnote-ecs-scheduled-tasks-are-rarely-executed-why-is-this/

ECSタスク起動自体の失敗が実際に発生すると、ECSタスクの異常系ログ監視では気がつけないので非常に厄介。
さらにEventBridgeからリトライもやりにくい。


# StepFunctionsはいいぞ

前述の記事でも紹介されているStepFunctionsを噛ませる流れは以下のとおり。
ちなみに複数のバッチそれぞれにタスク定義を作るのではなく、バッチ用の共通タスク定義に各バッチのコマンドを上書きしている。

StepFunctionsはEventBridgeと違い、ECSタスクが突然の死を迎えた時にもエラーとして扱う。

```plantuml
@startuml
skinparam shadowing false
start

group EventBridge
:EventBridgeルール;
note right: cronと実行コマンドの設定

:バッチ用StepFunctions呼び出し;
note right: コマンドをECSタスクに上書き
endgroup

group StepFunctions

if (ECSタスク呼び出し) then (成功)
    if (初回ECSタスク実行・コマンド実行) then (成功)
    else (失敗)
        repeat
        if (リトライ) then (回数終了)
            :エラー通知;
            end
        endif
        repeat while (ECSタスク実行・コマンド実行) is (失敗) not (成功)
    endif
else
    :エラー通知;
  end
endif

group Lambda
:バッチの成功ログ確認;
:正常系通知;
endgroup

endgroup

stop

@enduml
```


## EventBridgeからStepFunctionsの呼び出しは失敗するのか

サポートに確認した。

>はい。なんらかの影響により失敗する可能性はございます。
再試行ポリシー[1]がございますので、こちらの内容をご確認いただきますようお願いいたします。
---[1]関連部位抜粋---
ルールで指定されたターゲットにイベントが正常に配信されないことがあります。
例えば、ターゲットリソースが使用できない場合や、EventBridge にターゲットリソースへのアクセス許可がない場合、またはネットワーク状態が原因で発生します。
再試行可能なエラーのためにイベントがターゲットに正常に配信されない場合、EventBridge はイベントの送信を再試行します。

ECSタスクを直で起動するときのような罠はないらしい。

>また、失敗した場合には、ドキュメント[1]記載のとおりメトリクス[2]で確認可能でございます。


バッチの数が多くなったときのために、 `FailedInvocations` のメトリクスを監視するとより完璧に近づくと思う。

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-monitoring.html

## ECSタスクからCloudWatch Logsへのログの転送遅延について（追記）

この構成で実装したところ、ECSタスクは問題なく実行されたのにLambdaで成功ログを見つけられないエラーが発生した。

考えられる原因はLambda関数の不具合かECSタスクからログ転送の遅延が考えられ、今回は後者の可能性があると踏んでサポートに問い合わせてみた。

>ECS タスク を確認したところ基盤側には問題がなく、またネットワーク疎通に関する問題も確認できませんでした。
一方で、実際には CloudWatch Logs へのログ反映が遅くなっていた事象が発生しております。
原因を明確に特定できずに恐れ入りますが、状況からはログの送信が遅延していた可能性が考えられるものとなります。

> ログはネットワークを経由して送信するものとなりますため、遅延は発生しうるものとなります。
ここで SLA のような形で規定秒数以内に送信完了することは保証されておらず、具体的にどの程度の遅延となるかの情報は公開されていないため、遅延内容に関する具体的な内容をご案内することが叶わず恐れ入ります。

とのことなので、手っ取り早く解決したい為今回はLambda関数の呼び出し前にWait処理を入れることで回避することにした。
Snowflakeで分毎のウェアハウス実行状態を取得してクレジット消費量（と消費額）の概算を取得する

## 背景
「ある人が◯◯分〜◯◯分までSnowflakeを使いある検証を行っていた。そのときのクレジット消費量を知りたい」ということを知りたかったのですが、SnowflakeではWebUIからクレジット消費量を時間毎までしか見れず、分毎のクレジット消費量を取ることはできない。

欲しい情報は分単位でのクレジット消費量（そして消費額）で、WebUIからは取得できなさそうだったので、それを出すクエリを書きましたので共有です。

## クエリと使い方
### クエリの説明
#### 前提
まず、前提として、概算しか取れないです。それほど正確ではないのでご注意ください。

そして、ウェアハウスの起動時間が1分になっていること & クエリの実行時間が数秒以下の短いクエリが大多数であることが前提です。
これらの前提をもって、クエリの実行時間をもとにして、ウェアハウスの起動時間を予想して、そこからクレジット消費量を予想しています。

#### クエリで何をやっているか
まず、ほしい期間の時分のリストを作ります。

その各時分に関して、その時分のときにクエリが実行されているかを見ます。

クエリが実行されているのであれば、その時分ではウェアハウスが動いているのでクレジット消費がされています。

というのをすべての時分に関して行えば、ほしい期間のどの時分でウェアハウスが動いているかがわかります。

それらの時分をコピーしてエクセルとかに貼ってい、フィルターしたり合計したりすることでクレジット消費量がわかります。

クレジット消費量に単位クレジット消費額をかければクレジット消費額がわかります。
クレジット料金は[こちら](https://www.snowflake.com/pricing/?lang=ja)から。

### 実際のクエリ
```sql
-- 15日前から15日分の毎分のタイムスタンプが入ったテーブルを作る
WITH date_series AS (
  SELECT
    -- 15日前からという指定
    date_trunc(minute, DATEADD('MINUTE', SEQ4(), CURRENT_TIMESTAMP() - INTERVAL '15 DAYS')) AS minute
  FROM
    -- 15日間の分数を取得するという指定
    TABLE(GENERATOR(ROWCOUNT => 60 * 24 * 15)) -- ここでは過去30日間の毎分のタイムスタンプを生成
),
-- 動いていた時点を分の精度で取得する
wh_working_minute_series as (
    select
        distinct
        date_trunc(minute, start_time) start_minute,
        date_trunc(minute, end_time) end_minute,
        warehouse_name,
        warehouse_size
    from 
        SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
    where
        -- （オプション）ユーザーの指定
        user_name = 'HAGIWARA'
        -- （オプション）ウェアハウスの指定
        warehouse_name = 'HAGIWARA_WH'
        -- ウェアハウス名がnullのときはクエリ実行しても課金がされないようなので除外する
        and warehouse_size is not null
)
SELECT
  -- 時分
  minute,
  -- ウェアハウスが動いていたか
  exists (
    select 1
    from wh_working_minute_series wh
    where ds.minute between wh.start_minute and wh.end_minute
  ),
  -- そのときのウェアハウスのサイズ
  (
    select
      max(wh.warehouse_size)
    from wh_working_minute_series wh
    where ds.minute between wh.start_minute and wh.end_minute
  )
FROM
  date_series ds
ORDER BY
  minute;
```
Slack APIがSSLエラーで呼び出せない！


# はじめに

Slack APIを使ったシステムを運用していたら突然SSLのエラーが表示されて利用できなくなったので、その時の対応メモを残しておきます。

# 環境

サーバー：AWS、EC2、linux2

環境：Rails

Gem：slack-ruby-client、faraday

# 状況

Slack APIを呼び出そうとすると次のようなエラーメッセージが表示された。

```
SSL_connect returned=1 errno=0 state=error: tlsv1 alert protocol version
```

ローカル開発環境では問題は起きなかった。

# 原因

SlackのAPI接続に使うCA証明書が有効期限切れになった。
（LetsEncyptに変更された模様）


Slackのブログは[こちら](https://status.slack.com/2023-03-14)

AWSの資料は[こちら](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-expired-certificate/)


# 対応

```
# SSHログインのメッセージでlinux2と判別（前述のAWS資料よりLinux2の対応を実施）

$ sudo yum list installed | grep ca-
# CAバージョンを確認

$ sudo yum update ca-certificates
# バージョンアップ

$ sudo yum list installed | grep ca-
# バージョンアップ後のCAバージョンを確認
```


# 最後に

問題が発生した際、エラーが発生する環境と何のエラーも起きない環境があったので問題の切り分けが難しかったです。

T氏の情報提供のおかげで無事対処できました。
[有料級]　Rails7(Turbo), Docker, Bootstrap5を使ったtodoリストの作り方第0章-2 (Bootstrap5導入編)

## 前回のあらすじ
前回は環境構築編で環境を構築していきました
[[有料級]　Rails7(Rurbo), Docker, Bootstrap5を使ったtodoリストの作り方第0章-1(環境構築編)](https://qiita.com/streasure0426/items/dae00c2eb2b6c72324a3)
まだみていない方は是非みていただけるとありがたいです！

## 事前準備
Dockerを一度止めている方はこちらのコマンドでDockerを起動しましょう。
``` bash
docker-compose up -d
```
## Javaspcptの設定
今回はRails7を使うのでimportmapを使ってBootstrap5のJavaScriptライブラリを追加します。

### JavaScriptライブラリの追加
こちらのコマンドで前回作ったDockerコンテナに入ります
``` bash
docker-compose exec app bash
```

JavaScriptライブラリを追加します。
``` bash
bin/importmap pin bootstrap
```

すると`config/importmap.rb`に下記の2行(8、9行目くらい)が追加されるので確認してみましょう。
```ruby:config/importmap.rb
pin "bootstrap", to: "https://ga.jspm.io/npm:bootstrap@5.2.3/dist/js/bootstrap.esm.js"
pin "@popperjs/core", to: "https://ga.jspm.io/npm:@popperjs/core@2.11.7/lib/index.js"
```

### JavaScriptファイルの編集
最後に`app/javascript/application.js`の最後に下記の記述を追加します。
```javascript:app/javascript/application.js
import "bootstrap"
```

## Javaspcptの設定(FontAwesome)
ついでにFontAwesomeも追加しておきましょう

### JavaScriptライブラリの追加
``` bash
bin/importmap pin @fortawesome/fontawesome-free
```

すると`config/importmap.rb`に下記の1行(10行目くらい)が追加されるので確認してみましょう。
```ruby:config/importmap.rb
pin "@fortawesome/fontawesome-free", to: "https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.4.0/js/fontawesome.js"
```

最後の部分を`all.js`に変えます
```ruby:config/importmap.rb
pin "@fortawesome/fontawesome-free", to: "https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.4.0/js/all.js"
```

### JavaScriptファイルの編集
最後に`app/javascript/application.js`の最後に下記の記述を追加します。
```javascript:app/javascript/application.js
import "@fortawesome/fontawesome-free"
```
こちらでFontAwesomeは使えるようになります。

## CSS関連の設定
### GemfileにBootstrapを追加
Gemfile内にBootStraのGemを追加します。
``` bash:Gemfile
gem 'bootstrap', '~> 5.1.3'
```
追加したら`bundle install`をします。
``` bash
bundle install
```

### Scssファイルの編集
`app/assets/stylesheets/application.css`のファイル名を`application.scss`に変更します。
``` bash
mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss
```

名前を変更したら`application.scss`に下記のコードを追加します。
```css:app/assets/stylesheets/application.scss
@import "bootstrap";
```

これでBootstrap5の導入が終わりました。

今回はここまで！
続けて読んでもらうとありがたいです！

[[有料級]　Rails7(Turbo), Docker, Bootstrap5を使ったtodoリストの作り方第1章-1 (Todoリスト準備編)](https://qiita.com/streasure0426/items/45446e2b2c5d3fa3104a)
tableタグをレスポンシブHPでうまく使用する方法

レスポンシブサイトを制作する際、「tableタグ」でつまずくことが多いかと思います。

長さ指定を行うと、端末の幅を越えてしまう…
今度は長さを指定しないと自動的に文字数分の流れになってしまう…

このような現象はありませんか？
tableタグは長さを指定しないと自動的に幅を詰めてしまうものの、一方で詰める加減は中身の文字数に影響を受けます。

これによって何かしら長さを指定する必要がありますが、長さを指定してしまうと、どういった端末でもその幅を守ります。そして画面幅を越えてしまいレイアウトが破壊されてしまうトラブルが起きます。


■横方向に内容が多くある場合、最低幅の関係で端末幅を越えてしまう問題

![abaout table tag image1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307917/73e5d8e5-1ae5-2623-34e2-56eb6ae92b73.jpeg)

スマホは以前よりもサイズが大きくなっているものの、それでもPCと比較しまだまだ解像度的に小さいです。
そのため、table内の内容が横に多い場合、最低限要する幅が大きくなり、画面内に入りきらない状態になります。


≪この問題への対処法1≫CSSでの解決
まずはPC用もモバイル用もtable幅をCSSのみで設定する方法です。「thタグ」や「tdタグ」では長さ指定を行わず、「display:block;」を指定します。

![abaout table tag image2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307917/3b3c061d-1f1b-483f-ac28-8162deb02e5b.jpeg)

thやtdタグは何も明示がない際、display属性に「table-cell」という値を持っているのです。
こちらをblockと指定することにより、divタグのような形で、その場所で取れる最大横幅を確保してくれます。

これによって、table内の文面ボリュームに関わらず。画面幅内でテキストが折り返されるように変わるのです。こちらの対処法はいかがでしょうか？

その他の対処法に関しましては[参考サイト](https://www.exe-creation.com/creator/2018/03/20180308.html)にてご覧になれます。
python maya change camera asceptRatio

```python
import maya.cmds as cmds
import math

# Get the name of the current camera
current_camera = cmds.modelPanel(cmds.getPanel(withFocus=True), q=True, camera=True)

# Set the film aspect ratio of the current camera to 1.78
cmds.setAttr(current_camera + '.cameraAperture', 1.78, type='double2')

# Set the camera aperture to correspond to a 1.78 aspect ratio
diagonal = math.sqrt((36**2) + (20.25**2))
horizontal = diagonal / math.sqrt((1.78**2) + 1)
vertical = horizontal / 1.78
cmds.setAttr(current_camera + '.horizontalFilmAperture', horizontal)
cmds.setAttr(current_camera + '.verticalFilmAperture', vertical)
```
safariで表示崩れ対処法

## case1: 固定ナビゲーションロゴが動く、消える

【原因】
・headerにposition:stickyを設定している
・headerにposition:sticky、子要素にposition:fixedを設定している

## case2: 画像がボケる、荒くなる
【原因】
・画像サイズが小さい/サイズを設定するCSSが書かれていない。
（画像サイズは表示の2倍書き出し）


:::note warn
-webkit-を追加、imagerendaringの値を変更等は特に効果がなかった。
一部、imagerendaringの値を変えることで改善する部分もあった。
（2023/3/31時点）
:::
Git コミット差分も含めて歴史を確認する

# 概要

- git logだけだとコミットの概要の歴史しか知ることが出来ない。コミットでの修正内容も合わせて確認する場合の方法をまとめる。

# 方法

- `$ git show`コマンドを使う。特にオブションや引数を指定しない場合、今のブランチの歴史を差分込で表示してくれる。

    ```
    git show
    ```

- 下記の様にコミットIDを指定することで特定のコミットの概要と差分を確認する事ができる。

    ```
    git show コミットID
    ```

# 参考文献

- `$ git show --help`の出力内容を元に本記事を記載
CASE式をUPDATE文に対して使う

「達人に学ぶ　SQL徹底指南書」という本を読んで、SQLつよつよになるために勉強しています。
今回は第1章「CASE式のススメ」を読んだので、例題と一緒にまとめます。

**この記事は、自分の勉強記録用なので、情報が間違っている可能性もあります。ご了承ください。**

# CASE式とは何か
CASE式は、SELECT 文などで使い、条件を上から順番にチェックしていき、最初に合致した条件に指定した結果を返します。

# 例題を解く
下記のようなテーブルがあったとします。

ID   | Name           | Age  | Gender
|---|---|---|---|
1    | 山田 太郎     | 25   | 男性
2    | 鈴木 あやこ   | 32   | 女性
3    | 佐藤 花子     | 40   | NULL
4    | 中村 恵子     | 27   | 女性
5    | 小林 一夫     | 21   | 男性

このテーブルから、以下の条件に従って、更新用のSQLを作成します。
1. Ageが30歳未満の場合、Genderカラムを”Unspecified”に更新する
2. Ageが30歳以上で、かつGenderがNULLの場合、Genderカラムを”Unknown”に更新する
3. Ageが30歳以上で、かつGenderがNULLでない場合、Genderカラムの値をそのまま保持する

上記の条件に対して、CASE式を使わないとなると、WHERE文で条件分岐を設定する必要があります。
例えば、1.を実現するSQLをWHEREを使って書くと、以下のようになります。
```
UPDATE customers SET gender = ”Unspecified” WHERE age > 30;
```
また、2.と3.についても、同様にSQL文を発行しなくてはならないので、パフォーマンスが悪くなります。

「達人に学ぶ SQL徹底指南書」では、次のように書かれています。
>「WHERE句で条件分岐させるのは素人のやること。プロはSELECT句で分岐させる」

今回は表の更新なので、SELECT分ではなく、UPDATE文ですが、CASE式で分岐させることが出来ます。

以下のようになります。

```
UPDATE customers SET 
	gender = 
        CASE 
        	WHEN age < 30 THEN "Unspecified"
            WHEN age >= 30 AND gender IS NULL THEN "Unknown"
            WHEN age >= 30 AND gender IS NOT NULL THEN gender
        	ELSE NULL 
        END;
```



実行結果（正解）は、以下のようになります。

ID   | Name           | Age  | Gender
|---|---|---|---|
1    | 山田 太郎     | 25   | Unspecified
2    | 鈴木 あやこ   | 32   | 女性
3    | 佐藤 花子     | 40   | Unknown
4    | 中村 恵子     | 27   | 女性
5    | 小林 一夫     | 21   | Unspecified

引き続き、SQLつよつよを目指して頑張ります。
Salesforce認定アソシエイト試験の公式練習問題解説してみた-12

こんにちは
本橋孝昭です

Salesforce認定アソシエイト試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回は
認定資格試験の準備: Salesforce 認定アソシエイト＞
データモデルについて学ぶ

の問題4問目を解説します

今回の内容は動画でも解説しています

https://www.youtube.com/watch?v=D2fgtSMZhIs&list=PLz8HSF-SrLeGA3OcX5wuL6b9Tfdm0xf6W&index=9

<iframe width="560" height="315" src="https://www.youtube.com/embed/D2fgtSMZhIs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>




https://trailhead.salesforce.com/ja/content/learn/modules/cert-prep-salesforce-certified-associate/study-up-on-the-data-model

本日の問題はこちらです

![０４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f0b81edd-a2cc-3ed6-3632-4a24e8e6b863.png)

正解はBです

カテゴリ　という選択リストの値により
サブカテゴリ　の選択リストの値を設定することが可能です

こちらは連動選択リストで設定することが可能です

![連動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c4b2e0d6-0176-5740-0462-35c1804adaab.png)

これにより入力ミスが防げます


ぜひこちらの設定をして項目入力のミスを防ぎましょう。

### 他の認定アソシエイトの勉強方法について

他の勉強方法についてはこちらをご確認ください

https://qiita.com/Takaa/items/d35c9955fe8eb889d76b
JavaScript 配列の中のオブジェクトの要素を一つ一つ取り出して判定する

# 概要

- 配列の中のオブジェクトの要素を一つ一つ取り出して判定する方法をまとめる。

# やりたい事

- 下記のような配列があったとする。

    ```javascript
    let data = [
      {
        'id': 'null',
        'rent': '100',
        'name': 'A'
      },
      {
        'id': '1',
        'rent': '200',
        'name': 'B'
      },
      {
        'id': '2',
        'rent': '300',
        'name': 'C'
      }
    ];
    ```

- 各オブジェクトのidが「null」という文字列のオブジェクトをid_nullの配列に、idが「null」という文字列以外のオブジェクトをid_unnullの配列に分けたい。

# 方法

- `filter()`メソッドを使って下記の様に記載することで実現できる。

    ```javascript
    let data = [
      {
        'id': 'null',
        'rent': '100',
        'name': 'A'
      },
      {
        'id': '1',
        'rent': '200',
        'name': 'B'
      },
      {
        'id': '2',
        'rent': '300',
        'name': 'C'
      }
    ];
    
    let id_null = data.filter(function(datum) {
        return datum.id === 'null';
    })
    
    let id_unnull= data.filter(function(datum) {
        return datum.id !== 'null';
    })
    
    console.log(id_null);
    console.log(id_unnull)
    ```

- 下記の様に出力される。

    ```
    [ { id: 'null', rent: '100', name: 'A' } ]
    [
      { id: '1', rent: '200', name: 'B' },
      { id: '2', rent: '300', name: 'C' }
    ]
    ```

# 簡単な解説

- `filter()`メソッドの引数に無名関数を与え、その無名関数がtrueを返した時、当該のオブジェクトを返す。

# 参考文献

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
CloudFormationの実行ロールについてのメモ

![スクリーンショット 2023-03-31 18.03.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45794/567c0657-abae-d2db-c837-93abb2eae48b.png)

CloudFormationの実行権限を開発者権限に付与しようとして色々と調整したところ、CloudFormationで操作するリソースの権限を全て設定したのにどうにも実行でエラーになる。

 エラーの内容としては、実行時になにかの値が取れないということで暗号化されたエラーメッセージみたいなものが表示されていた。

で、色々と調べたところ、どうやら以下の設定が必要になる模様。

```json
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "iam:PassRole",
                "iam:ListRoles"
            ],
            "Resource": "arn:aws:iam::〓:role/*"
        }
```

ユーザーID部分は伏せ字。
ListRolesの方はすべてのリソースになるようなので、ビジュアルエディタで編集するとResourceは "*" になった。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_passrole.html

どうも、権限を他のロールに引き渡せる権限らしい。
`role/*` ではなく、特定のロールを指定したほうが良いのかも？
もう少し調整する予定なので試してみよう。

そのうち忘れそうな気がするので備忘録としてメモ。
IPoE(ipv4 over ipv6)を3方式(v6アルファ, OCNバーチャルコネクト, HGW)試した

## 動機
長年OCN 光 with フレッツを契約しているが、数年前、混雑時間(特に夜)になると回線速度が落ちるのが気になっていた。
そこで、PPPoE方式からIPoE方式への乗り換えを考えた。
当時OCNではIPoE(ipv4 over ipv6)を「v6アルファ」という有料サービスとして提供していたので、契約することにしたのが本記事の始まりである。
## v6アルファ方式
v6アルファを契約すると、専用のレンタル無線ルーターが届き、それを使用することでIPoE接続が可能になる。
~~よく分からない~~セキュリティ機能がついていたりするが、無線ルーターとしては力不足感がありわざわざv6アルファを追加契約する人間が満足するようなものではなかった。

苦肉の策で、
INTERNET == HGW(PR-400KI) == 専用ルーター == WG2600HP3(ブリッジモード) == クライアント端末
として、専用ルーターの無線機能は無効化して使用していた。

この時点ではHGWと専用ルーターで所謂2重ルーター状態なのが気持ち悪い以外は、速度も安定するようになって問題なかった。
※ ちなみにv6アルファは内部的にバーチャルコネクトと同様な物のようで、バーチャルコネクト対応ルーターなら専用ルータを介さずとも非公式ながら接続できるらしい (WG2600HP3はバーチャルコネクト非対応)。

## OCNバーチャルコネクト方式
それからしばらく経った2020年6月、OCNからIPoEの無償提供が開始された([リンク](https://www.ntt.com/about-us/press-releases/news/article/2020/0611.html))。

[OCNのHP](https://service.ocn.ne.jp/hikari/ipv4overipv6/)やマイページを見ると、v6アルファを契約しているとHGWを使用した接続方式が解放されないことが分かった。とりあえず月額をかける理由もなくなったのでv6アルファは解約し、一旦PPPoE方式に戻した。
しかし、解約して暫くしてもHGW方式は未提供のままであり、待っていられなくなったので2021年にWi-Fi6化も兼ねてOCNバーチャルコネクトに対応するWX3600HPを購入し、設定した。

この時点で接続は、
INTERNET == HGW(PR-400KI) == WX3600HP == クライアント端末
とずいぶん簡略化された。

しかしながらやっぱり2重ルーター(HGW & WX3600HP)が気になっていた。いくつかネットの情報を参考に解消できないか試したが無理だった。

## HGW方式
しばらくそんなことも忘れていたが、ふと思い出したのでOCNのテクニカルサポートにHGW方式を有効化してほしい旨を電話した。
この時点で自分は「以前v6アルファを契約していたせい」で自動提供から外れていると考えていた。
しかしながら、そこで言われたのは「フレッツ・ジョイントによるソフトウェア配信機能を利用する手続きをしていない」ということでした。
その場でフレッツ・ジョイントの利用手続きをしてもらい、1時間後にはHGW方式でipv4 over ipv6が可能になりました。

最終的に、
INTERNET == HGW(PR-400KI) == WX3600HP(ブリッジモード) == クライアント端末
となり2重ルーターが解消されました。

ちなみに上記2方式との速度差はほとんど感じませんでした...


## 結論
困ったことがあったらサポートに電話連絡するのが一番早い。
NoSQLについて学んでみた

## はじめに
普段MongoDBを使っているのですが、最近MySQLに触れる機会があってMySQLって便利だなと思ったと同時に、なぜNoSQLが採用されることがあるのだろうとふと思ったので調べてみました。
## NoSQLデータベースとは
NoSQLはRDBMS以外のデータベースの総称です。
## NoSQLが使われるようになった経緯
従来のRDBMSはデータの一貫性や複雑な検索や集計が可能といったメリットがある反面、拡張性が低くかったり、データが大量になると処理速度が遅くなるといったデメリットもありました。時代とともに大量の複雑なデータを扱う必要性が高まるなかで、豊富なデータを保存でき高速な処理を行えるNoSQLが台頭してきました。
## NoSQLのメリット
#### 高速な処理
RDBMSはトランザクションを使用してデータの整合性を保つために多くの処理が必要になるため、処理が遅くなる可能性があります。一方、NoSQLは必要な処理が少なく、処理速度が速いです。
#### 柔軟なデータモデル
RDBMSはデータの整合性を保つために、データは固定の構造に従っている必要があります。これに対して、NoSQLは、データ構造が柔軟であり、構造化されたデータ以外にも、XMLやJSONなどのような半構造化データや画像や音声などのような非構造化データを扱うことができます。
#### スケーラビリティ
RDBMSはテーブルと呼ばれる形式でデータを整理し、データの整合性を保ちながら管理するために、元々1つのコンピュータ上で動作するように設計されています。
一方、NoSQLは、複数のサーバーにデータを分散させることができます。これにより、データの増加や負荷増加に対して、柔軟に拡張することができます。

## NoSQLのデメリット　
#### 整合性は欠ける
トランザクションを使用しないのでRDBMSに比べ整合性は欠けます。ただし最近ではトランザクションをサポートするNoSQLデータベースもあるようです。

#### クエリ言語の制限
SQLと比べ複雑なクエリを実行することが困難な場合があります。


## まとめ
なぜ普段MongoDBを使っているのかわかった気がします。自分が使う技術の特徴を理解するのは大切だと感じました。

## 参考
https://atmarkit.itmedia.co.jp/ait/articles/1102/24/news098.html
https://www.integrate.io/jp/blog/the-sql-vs-nosql-difference-ja/
https://products.sint.co.jp/siob/blog/rdbms
https://www.itreview.jp/labo/archives/8914
https://zenn.dev/nameless_sn/articles/nosql-manual
【🌸新社会人に送る】社会人１年目の過ごし方

# 社会人１年目を振り返る

皆様、こんにちは！
社会人になって、エンジニアとして仕事をして１年が経ちました❗️
時間的にはあっという間でしたが、内容で言うと１年以上に感じています😊

振り返りをしつつ、
**絶対にやった方がいいこと**、**やっておけばよかったこと**を書いていきます❗️❗️

## (もっと)やればよかったこと

### 🎮あそぶ

自分で言うのも何ですが、私は結構マジメなタイプだと思います
仕事や自己研鑽のことばかり考えて、趣味を全くやってなかったということもしばしば・・・

しっかりメリハリをつけた上で生活をすれば良いことが沢山あると思います❗️

* 単純に人生が楽しい

    * 趣味を極められる🎮

        * 社会人になって趣味に使えるお金も増えるはず！

    * 新しい出会いがあるかも・・・？👥

* 心にゆとりが生まれる

    * 仕事の効率も上がる💻

        * 収入を増やし、さらに趣味に突っ込むという好循環！
        * 貯蓄や投資をして将来の安心,時間を買っても良いかも？

    * 新しいアイデアや挑戦する気力が生まれる🔥

冷静に考えると社会人としての生活は定年を70歳と考えると**５０年近く**あります。
であれば、ゆとりを持って**趣味**や**人間関係**を楽しみながら生活しても良いと思います❗️

### 👀目立つ(良い意味で)

学生のようにテストがあって、点数で評価されるわけではありません
では、良い評価を得るためにはどうしたら良いかというと**アピール**が大切になってきます❗️

では、どのようにアピールしたら良いのか・・・？🤔
正直なところ、苦手な分野なのであまり分かりませんが、

* やりたいことや得意なことを**しっかりと伝える**(自分の土俵で戦うために)
    * 上司の方との1on1 など

* 上手くいったことを**発信**
    * 自分で発信する
    * 発信してもらう

「発信してもらう」については、先輩に頂いたアドバイスです❗️
*「自分で発信するのが苦手なら、発信してくれる上を味方につければ良い」*
これは「確かにな〜🤔」と感じました。

しっかりと自分がやったことはやったと発信して納得のいく評価をもらいましょう❗️
もちろん嘘はダメですが・・・😅

## やってよかったこと

ここからは一般的に言われている気がしますが・・・
良いものはやっぱり良いということで！😂

### 📝インプット

何やかんや大事です(笑)
インプットの仕方も２種類あると思っています

#### 業務内でのインプット

業務内容にキャッチアップするための調査などです❗️
こちらは単純に頑張るしかないですね😅

私がやったこととしては、

* 会議中に出てきた謎の単語を調査する
* 上司や先輩の作成した資料を読んでみる
* 業務を行う中で適宜、調べる
* 受けたレビューから学ぶ

そして、「わからない場所はしっかりと聞く！」
これは**大事**ですが、私は上手く出来ていないので、頑張ります！！
以下の記事はとても参考になるかなと思います

https://qiita.com/seki_uk/items/4001423b3cd3db0dada7

#### 業務外でのインプット

自分に合った方法でやると良いと思います🤔

* 資格を取得📖
* 新聞を読む📰
* SNSで情報収集する📱
* ネットの記事を読み漁る💻　などなど

私に1番合っていたのは「**資格を取得**」でした！
この１年目で以下の資格を取得しています

* 基本情報技術者
    * 基礎の復習になった

* AWS クラウドプラクティショナー
    * AWSのサービスについて何となく知れた

* AWS ソリューションアーキテクト
    * AWSでベストプラクティスとなるアーキテクトについて学べた

また現在は4月の応用情報技術者試験に向けて勉強中です！(あまり進んでいないけど😂)

資格取得でインプットする際の注意としては、**取得を目的にしないこと**です❗️
暗記しようとするのではなく、実際に活用することを考えながら勉強を進めましょう！

### 🗣アウトプット

やはりインプットをするだけではなく、アウトプットも大切です❗️

#### 📝記事の執筆

* 自分のペースで振り返りを行えます
    * 振り返ってみて、気づくことやあらためて大事だと思うことを意識付け出来ます！

#### 🙋‍♂️イベント参加

意外とハッカソンやLT会などイベントは沢山開催されています！
個人的には**ハッカソンは参加のハードルが低めで、楽しく、おすすめ**です

* 自分の今の能力を何となく知ることが出来ます！

    * ダメダメだと思っていたら、意外と？みたいなことも

* 他のコミュニティの人との関係を構築できます！

    * 人に自分のやっていることを話す良い機会に
    * 別の分野の知識や話はいい刺激に

#### 🛠なんか作ってみる

現在、私が挑戦中のものです！

今まで作ってみたいものなんてないと思っていたのですが、
ハッカソンに参加してみて、色々な刺激を受け、触ってみたいと思う技術が増えました❗️

また作りましたら、記事にして発信したいと思います！！！

## まとめ

仕事とプライベートのバランスを上手くとって、
素敵な社会人生活にしてあげてください❗️

私も2年目を頑張ります！！！
Railsのルーティング

## ルーティングとは
Railsにおいて**ルーター**とは、Webアプリケーションに対するリクエストの処理を担当する機能である。URIによるHTTPリクエストを、どのコントローラーの、どのアクションに渡すべきかを判断する。

ルータが行うアクションへの振り分け作業を**ルーティング**と呼び、どのコントローラーのどのアクションを呼び出すかという振り分けの設定を**ルート**と呼ぶ。

ルート設定には、configディレクトリにあるroute.rbというファイルを使用する。

### HTTPメソッド
主なHTTPメソッド
|メソッド  |目的  |
|---|---|
|GET  |情報をサーバーから取得する  |
|POST  |情報をサーバーに取り込む  |
|PUT  |情報を置き換える  |
|PATCH  |情報の一部を置き換える  |
|DELETE  |情報を削除する  |

### 基本の書き方
```ruby:route.rb
Rails.application.routes.draw do
  get  "posts/new"  => "posts#new"
  post "posts/create" => "posts#create"
end
```
このように記述している場合、「posts/new」は、ドメイン:ポート番号/posts/newという宛先に相当し、「posts#new」は、PostsControllerのindexアクションであることを示している。

### リソースフルルート
モデルを介したリソースに対するデータの追加、既存データの更新、削除、取得、および複数データの一覧表示といった、リソースを満たすルートを**リソースフルルート**と呼ぶ。

Railsではresourcesとして表現される。resourcesルートを設定すると、対象となるモデルに対する7つの標準的なアクションに対応するルートを一括して設定してくれる。

Userモデルに対するリソースフルルートを設定するには、route.rbに次のように記述する。
```ruby
$ resources :users
```
この設定の結果、以下のルートが実装される。
|Prefix |メソッド  |URI  |コントローラー#アクション  |処理|
|---|---|---|---|---|
|users|GET  |/users|users#index|一覧画面表示|
|users|POST  |/users|users#create|登録処理|
|new_user|GET  |/users/new|users#new|新規画面表示|
|edit_user|GET  |/users/:id/edit|users#edit|編集画面表示|
|user|GET  |/users/:id|users#show|詳細画面表示|
|user|PATCH/PUT  |/users/:id|users#update|更新処理|
|user|DELETE  |/users/:id|users#destroy|削除処理|

また、Railsでは1つのリソースに対するリソースフルルートとして、resourceルートが用意されている。

### リソースフルルート以外のルートの設定方法
リソースフルルート以外のルートの設定には、getやpostを使用することができる。基本的にはこれらはHTTPメソッドに対応している。その際、リクエストされる宛先は 「URIパターン」として指示する。

設定の基本形式は次のようになる。

```
HTTPメソッド 'URIパターン', to:'コントローラーアクション'
```
     
ルートの実装は、
```ruby
$ rails route
```
で確かめることができる。

### ルーティングのネスト
Userモデルとその子モデルとしてのHobbyモデルを考える。それぞれのリソースに相当するデータベースのテーブル名は、usersとhobbiesになる。
親子関係のルートを入れ子にするには、親のリソースルートのブロックの中に、子のリソースルートを設定すればよい。
```ruby
resources :users do
  resources :hobbies
end
```
このように記述することで、どのuserに対してのhobbyであるかをルーティングで紐づけることができる。
Db2 SQLでデータサイエンス：機械学習ストアド・プロシージャご紹介

データサイエンス・プロジェクトにおいて、機械学習に関しては一般に次のようなパイプライン作業が必要とされています(+*トラブルシューティング*)。


*データ探索->データ変換->モデル構築->モデル実行->モデル評価->モデル・チューニング
->モデル管理*

Db2ユーザーの方がデータサイエンス・プロジェクトに参加することになり、
「機械学習用データはDb2内にある。機械学習のパイプライン作業もできるだけ自動化したい。」時、
**Db2 V11.5.4(#1)以降からサポート**されるようになった、**機械学習ストアド・プロシージャ**がお役に立てます。

*(#1)この記事の執筆段階では、**Linux版のみでのサポート**となっています。ちなみにDb2 Warehouseでは以前からサポートされていました。*


# メリット1 (パイプライン作業がSQL文で記述可能)
機械学習のパイプライン作業(*データ探索、データ変換、モデル構築、モデル実行、モデル評価、モデル・チューニング、モデル管理、トラブルシューティング*)などの一般的な機械学習タスクを馴染みのあるDb2 SQL文で記述し、実行できます。

# メリット２（自動化）
上記のSQL文を次々に呼び出すようなDb2アプリケーションを開発し、実行することで、パイプライン作業を自動化することができます。

# メリット３（サーバー集中処理）
上記のパイプライン作業は、データをDb2から外部システムへネットワーク経由で転送することなく、Db２サーバー内部で実行されます。
このため、ビッグデータをネットワーク転送するオーバーヘッドがない、データ転送時のデータ漏洩のリスクが少ない、ことも利点になります。

# サポートされているアルゴリズムについて
機械学習のアルゴリズムは、教師あり/なし学習、強化学習といったカテゴリーや、分類、クラスタリング、回帰などで分類されたりしますが、実に様々なものが存在します。
Db2 Linux V11.5.4以降のストアド・プロシージャでサポートされているのは、分類、クラスタリング、回帰のアルゴリズムであり、次の通りです。 
# (a)分類
1. 決定木(デシジョン・ツリー)
デシジョン・ツリーは、データを分類するのに役立ち、階層的なグラフィカル構造(樹形図)で表現されます。
教師あり学習の一つ。

2. 単純(ナイーブ)ベイズ
Naive Bayes 分類アルゴリズムは、確率的分類器です。 
これは、強力な独立性の仮定を組み込んだ確率モデル(ベイズの定理)に基づいています。
教師あり学習の一つ。

# (b)クラスタリング
1. K-means クラスタリング
K-means アルゴリズムは、明示的な距離測定を使用してデータ セットをクラスターに分割する、最も広く使用されている非階層的クラスタリング アルゴリズムです。
教師なし学習の一つ。

# (c)回帰
1. 線形回帰
線形回帰は、予測分析で最も一般的に使用される方法です。 
従属変数 (ターゲット) と 1 つ以上の独立変数 (予測変数) の間の線形関係を使用して、ターゲットの将来を予測します。 
予測は、ターゲットと予測子の間の関係が従属的または因果的であるという仮定に基づいています。
教師あり学習の一つ。

先に提供されているアルゴリズムをご紹介しましたが、機械学習で必要になるタスク視点では、次のようなカテゴリーのストアド・プロシージャが提供されています。

# (a)データ探索
これらのストアド プロシージャを使用して、選択した機械学習アルゴリズム用にデータを前処理する前に、データの内容を評価します。 
データの分布、特徴のプロパティ、欠損値、およびその他の重要な領域を特定することにより、重要な洞察を得ることができます。

# (b)データ変換
これらのストアド プロシージャを使用して、機械学習アルゴリズムに渡す前にデータを変換します。

# (c)モデル構築
これらのストアド プロシージャを使用して、機械学習モデルを構築します。 
線形回帰、決定木、単純ベイズ、k-means クラスタリングなどの一般的なアルゴリズムを使用して、機械学習モデルを構築できます。

# (d)モデル実行
これらのストアド プロシージャを使用して、トレーニング済みの機械学習モデルで予測を行います。

# (e)モデル評価
これらのストアド プロシージャを使用して、予測を実際の値と比較することにより、モデルのパフォーマンスを評価します。 混同行列を作成し、精度、精度、再現率、平均絶対誤差、平均二乗誤差などの指標を評価します。

# (f)モデル・チューニング
これらのストアド プロシージャを使用して、機械学習モデルを微調整します。 これは、モデルのオーバーフィッティングやアンダーフィッティングなどの一般的な落とし穴を回避するための重要なステップです。

# (g)モデル管理
これらのストアド プロシージャを使用して、古いモデルとテーブルをクリーンアップします。

# (h)機械学習ストアド プロシージャのトラブルシューティング
分析ストアド プロシージャを使用しているときに発生する問題を診断、回復、および解決するのに役立つストアド・プロシージャが提供されています。

今回はDb2の機械学習ストアード・プロシージャを簡単にご紹介しました。
「もっと詳しく！」という方は、ぜひDb2マニュアルのトピック”**In-database machine learning in Db2**”をご参照ください。
説明は割愛しましたが、このストアド・プロシージャを利用するためには、**事前準備作業**(**Db2データベース・パラメーターの更新、データベース・オブジェクト群の作成など**)が必要となっています。
こちらに関しては、Db2マニュアルのトピック”**Prerequisites for machine learning in Db2**”をご参照ください。
rails クラスメソッドの勘違いしたこと

備忘録

そんな挙動だったの！？ってなったやつです。
なぜそうなるのかわからないので　しってる人いたら

## 前提
group、userクラスがある
groupにユーザーが紐づいている

```
class Group
  has_many :users, dependent: :destroy
```

```
class User
   belongs_to :group
```

下記みたいな感じ
今回はgroupAに3件userが紐づいてる
User全体では100件存在している

```
Use.count
=> 100
```

```
group_a.users
→　[user1, user2, user3]
3件紐づいている

user1.group 
→　group_a 
```

## クラスメソッド呼び出し側
コントローラー側から呼んでます
```
　group_a.users.to_count
```

## モデル側クラスメソッド

user.rb
```
  def self.to_count
     User.count
  end
```


### 結果

```
group_a.users.to_count
=> 3
```

### つまり

User.countだと100件返ってくる想定だとおもって作っていたんですが
レシーバーの分しかカウントが取得できない

`group_a.users`=`User`みたいな扱いになっている認識になりました。

### 勝手な考察

クラスメソッド定義する際に
`def self.to_count`
もしくは
`def User.to_count`
で定義ができる
つまりself = USer
selfはレシーバーが入るので

レシーバー　＝　self　=　User

になるのかな？と考えています。

だれか真相を教えてください(>_<)
OracleのSQL文でINDEXヒント句を与えているのですが、違うインデックスを使用されていることがあります。これはなぜでしょうか？

INDEXヒント句は、SQL文を実行する際に使用するインデックスを指定するための手段です。ただし、INDEXヒント句を使用しても、Oracleデータベースは実行計画を最適化し、最適なインデックスを選択するために自動的にインデックスを切り替えることがあります。そのため、指定したインデックスと異なるインデックスが使用されることがあります。

これは、Oracleデータベースが実行計画を作成する際に、使用可能なインデックスを総合的に評価し、最適な実行計画を作成するためです。具体的には、Oracleデータベースは、インデックスの統計情報、表のサイズ、フィルタリング条件、結合条件など、複数の要素を考慮して最適な実行計画を作成します。

したがって、INDEXヒント句を使用しても、Oracleデータベースが自動的に別のインデックスを選択することがあります。ただし、INDEXヒント句を使用することで、特定のインデックスを使用することを強制することができます。ただし、この場合でも、指定したインデックスが最適なインデックスでない場合があるため、インデックスの選択については注意が必要です。

なお、INDEXヒント句を使用する場合は、そのインデックスが適切なものであることを確認するために、実行計画を確認することをお勧めします。
Oracleデータベースでのバインドピーク機能の問題点について教えてください

Oracleデータベースには、SQLの実行計画の最適化を支援するためのバインドピーク機能があります。バインドピーク機能は、SQL文の実行時にバインド変数の値をサンプリングし、そのサンプリングされた値に基づいて最適な実行計画を作成します。バインドピーク機能は、SQLのパフォーマンスの最適化に役立つ一方で、以下のような問題点も存在します。

１．キャッシュの効果が低下する
バインドピーク機能を使用すると、サンプリングされたバインド変数の値に基づいてキャッシュされた実行計画が変更されます。そのため、同じSQLが異なるバインド変数の値で頻繁に実行される場合、キャッシュの効果が低下する可能性があります。

２．サンプリングのコストが高い
バインドピーク機能は、SQL文の実行時にバインド変数の値をサンプリングするため、実行時間に余分なコストがかかることがあります。特に、大量のSQLを処理するシステムでは、バインドピーク機能によるオーバーヘッドが大きくなる可能性があります。

３．サンプリングによる誤った実行計画の作成
バインドピーク機能は、サンプリングされたバインド変数の値に基づいて実行計画を作成します。しかし、サンプリングされた値が実際の値と異なる場合、誤った実行計画が作成される可能性があります。そのため、バインドピーク機能を使用する場合は、サンプリングされた値が実際の値と一致するように、適切なサンプリング間隔を設定する必要があります。

以上が、Oracleデータベースでのバインドピーク機能の主な問題点です。バインドピーク機能を使用する場合は、上記の問題点について注意を払い、適切に設定する必要があります。
OracleのRAC構成データベースでキャッシュフュージョンの問題が発生しているのですが、解決策があれば教えてください。あと、キャッシュフュージョンの説明もお願いします

キャッシュフュージョンとは、Oracle RAC (Real Application Clusters) 構成で複数のノードが同じデータブロックを同時に更新しようとすると、複数のキャッシュがフュージョン（結合）して、矛盾が生じる問題です。

キャッシュフュージョンが発生すると、データの破損やパフォーマンスの低下など、深刻な問題が生じる可能性があります。そのため、キャッシュフュージョンは避ける必要があります。

キャッシュフュージョンを回避するためには、以下の方法があります。
1.ローカル・リソース・マネージャ (LMR) を使用する
LMRを使用することで、同じデータブロックを同時に更新することを制限できます。LMRを使用する場合は、ノードごとにキャッシュされたブロックの範囲を定義する必要があります。

2.リモート・リージョン・サービス (RRS) を使用する
RRSを使用することで、異なるノードで同じデータブロックを同時に更新することができます。RRSを使用する場合は、データブロックの同期に必要なネットワーク・リソースを考慮する必要があります。

3.フラッシュキャッシュを使用する
フラッシュキャッシュを使用することで、同じデータブロックを同時に更新することを回避できます。フラッシュキャッシュは、キャッシュとして使用するメモリー領域にフラッシュメモリを使用することで、ディスクI/Oを削減するために使用されます。

キャッシュフュージョンの問題を回避するためには、具体的なシステム構成や要件に応じた対応が必要です。適切な対応策を選択し、導入することで、キャッシュフュージョンによる問題を回避することができます。

#やっぱりパッチ当てないとだめかな（本人の感想）
Oracleの待機イベントは知っていますか？

はい、Oracleの待機イベントについては知っています。

Oracleデータベースでは、各セッションがデータベースリソースにアクセスする際に、リソースを待機することがあります。待機イベントは、セッションが待機しているリソースが何であるかを示す識別子です。セッションが待機している時間が長くなると、データベースのパフォーマンスが低下する可能性があります。

Oracleデータベースでは、数百もの待機イベントがあります。代表的な待機イベントには、以下のものがあります。

latch: ラッチを取得するために待機していることを示します。ラッチは、共有メモリ構造へのアクセスを調整するために使用されます。
log buffer space: ログバッファがいっぱいで、ログの書き込みができないことを示します。
buffer busy waits: データブロックに対する競合アクセスが発生して、他のセッションがデータブロックを占有しているために待機していることを示します。
CPU time: CPUリソースが不足していることを示します。
enq: TX - row lock contention: 行レベルのロック競合が発生して、他のセッションが行レベルのロックを占有しているために待機していることを示します。
Oracleの待機イベントを監視することで、システムのボトルネックを特定し、パフォーマンスの問題を解決することができます。待機イベントを監視する方法には、SQLの実行計画を調べる、AWRレポートを生成する、オラクルの待機イベント監視ツールを使用するなどがあります。
OracleのRACって知っていますか？

はい、Oracle RAC (Real Application Clusters) については知っています。

Oracle RACは、複数のコンピュータにまたがってOracleデータベースを実行するクラスタリングソリューションです。RACは、複数のノードが単一のデータベースインスタンスにアクセスできるようにすることで、スケーラビリティ、可用性、およびパフォーマンスを向上させます。

Oracle RACでは、複数の物理サーバー（ノード）が単一のデータベースを共有し、共有ストレージにアクセスします。各ノードには、Oracleデータベースのインスタンスがあり、これらのインスタンスはクラスタリング技術を使用して単一のデータベースインスタンスを形成します。これにより、各ノードが異なるトランザクションを処理することができ、データベースの可用性が向上します。

Oracle RACの主な利点は、可用性とスケーラビリティの向上です。システムの障害が発生した場合でも、他のノードが引き継いで処理を続行できます。また、データベースにアクセスするユーザー数が増加しても、ノードを追加してシステムを拡張することができます。

ただし、Oracle RACを設定するためには、高度な設定と管理が必要であり、システムの構成と管理には高度な知識とスキルが必要です。また、複数のノードが単一のデータベースを共有するため、ネットワークのパフォーマンスが重要な役割を果たします。そのため、十分な帯域幅と高速なネットワーク接続が必要です。
特定のキーワードでFacebookの投稿を検索して結果を返してくれるpowershellのプログラムは作れますか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138626/f7f076ea-0baf-4884-b5f8-715c113cc5fe.png)
1.Facebook Developersサイトでアプリケーションを作成します。
2.Facebook Graph APIを呼び出すためのアクセストークンを取得します。
3.PowerShellスクリプトで、Invoke-RestMethodを使用して、Graph APIエンドポイントにHTTPリクエストを送信します。
4.クエリパラメータを使用して、キーワード検索の条件を指定します。
5.結果をパースして、必要な情報を取得します。

以下は、PowerShellスクリプトの例です。この例では、Facebook Graph APIを使用して、キーワード「PowerShell」で投稿を検索して、投稿のメッセージをコンソールに表示します。
```
$accessToken = 'your_access_token_here'
$searchKeyword = 'PowerShell'

$url = "https://graph.facebook.com/v14.0/search?q=$searchKeyword&type=post&access_token=$accessToken"

$searchResult = Invoke-RestMethod -Method Get -Uri $url

foreach($post in $searchResult.data) {
    Write-Host $post.message
}
```
上記の例では、$accessToken変数にアクセストークンを、$searchKeyword変数に検索キーワードを指定しています。次に、Invoke-RestMethodコマンドレットを使用して、Graph APIエンドポイントにHTTP GETリクエストを送信し、$searchResult変数に検索結果を格納しています。最後に、$searchResult.dataプロパティにアクセスして、投稿のメッセージをコンソールに表示しています。

なお、FacebookのAPI利用には、一定の制限がある場合がありますので、注意が必要です。また、APIの利用には事前に適切な権限を持ったFacebookアカウントでログインする必要があります。
[laravel]モデル作成時の便利なオプション

## はじめに
laravelを触っていると結構な頻度で、Modelを作成したりControllerを作成したりすると思う。
僕自身結構作成してきたのだが、毎回1つずつ実行して面倒だなと思っていたのだが、
ModelとController同時に作成できるコマンドがあったので紹介していく。
CRUDも同時に作成してくれたりするので非常に便利!

## Model作成コマンドたち
### 基本形(Modelのみ作成)
```terminal
$ php artisan make:model Test
Model created successfully.
```
Modelファイルのみが作成される。
- app/Models/Test.php

### Controllerも同時に作成する
```terminal
$ php artisan make:model Test -c
Model created successfully.
Controller created successfully.
```

2つのファイルが作成される
- app/Models/Test.php
- app/Http/Controllers/TestController.php

個人的にModelを作成する場合は単数形にする必要があり、Controllerを作成する場合は複数形にする必要があったりとこんがらがってしまっていたのでこのコマンドは非常に便利!!

### CRUDを兼ね備えたControllerを作成する
```terminal
$ php artisan make:model Test -r
Model created successfully.
Controller created successfully.
```

`-r`をつけてあげることで、Controllerを同時に作成するのに加えて、
resourse指定をしたときに出てくるControllerの中身も作られます。

```
<?php

namespace App\Http\Controllers;

use App\Models\Test;
use Illuminate\Http\Request;

class TestController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Models\Test  $test
     * @return \Illuminate\Http\Response
     */
    public function show(Test $test)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Models\Test  $test
     * @return \Illuminate\Http\Response
     */
    public function edit(Test $test)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\Test  $test
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Test $test)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Models\Test  $test
     * @return \Illuminate\Http\Response
     */
    public function destroy(Item $item)
    {
        //
    }
}
```

こんな感じで!!
他にも、migrationファイルを同時に作ったり、Factoryを同時に作ったり、Seederを同時に作ったりもできますが、
一番使用頻度の高そうなControllerファイルを同時に作成するやり方のみ紹介しましたー。

以上。
Oracleのデータベースについての基礎的な知識


Oracle Databaseは、世界中で多くの企業や組織で使用されているリレーショナルデータベース管理システムです。以下に、Oracle Databaseに関する一般的な情報をいくつか挙げてみます。

Oracle Databaseは、多数のトランザクションやクエリを処理できる高性能なデータベース管理システムです。
Oracle Databaseは、データの整合性とセキュリティを確保するための多数の機能を備えています。
Oracle Databaseは、高可用性と耐久性を確保するために、クラスタリングとリアルアプリケーションクラスタリングという機能を提供しています。
Oracle Databaseは、標準SQLに加えて、独自のプログラミング言語であるPL/SQLを使用してデータベースの処理を実行できます。
Oracle Databaseには、バックアップと復元、データベースのモニタリング、チューニングなどの機能が含まれています。
これらはOracle Databaseの一般的な機能についての例であり、より詳細な情報を必要とする場合は、Oracleの公式ドキュメントやトレーニングリソースを参照することをお勧めします。
slackにメッセージを送るプログラム(Invoke-RestMethodコマンドレット)

Invoke-RestMethodコマンドレットを使用することもできます。以下はその例です。
```
# Slack APIのURLとトークンを設定
$url = "https://slack.com/api/chat.postMessage"
$token = "YOUR_SLACK_API_TOKEN"

# 送信するメッセージを設定
$message = @{
    channel = "#general" # 送信するチャンネル名
    text = "Hello from PowerShell!" # 送信するテキストメッセージ
}

# Slack APIにPOSTリクエストを送信
Invoke-RestMethod -Uri $url -Method Post -ContentType "application/json" -Headers @{Authorization = "Bearer $token"} -Body ($message | ConvertTo-Json)
```
（備忘録）WebARENA Indigoでインスタンスをスペックダウンさせてみたよレポート

ゴミみたいな記事です。

# WebARENA値上げ！！！！！
2023/3/30、今まで格安VPSと名高かったWebARENAがついに同年7月からの値上げを公表しました。

https://web.arena.ne.jp/news/2023/0330.html

今まで自分が使用していたIndigoでは、Linuxインスタンスの1vCPU、1GB RAMのプランは月額上限が税込349円から449円に！！！
<font color='red'> **それでも安いわホセ！！！** </span>

というわけでこれからも変わらずWebARENA Indigoを使っていこうと思います。


ししまい

　
　
　
　
　
　
　
　
　
　
　
　
　
　


# ぶ、ぶわっかも～～～～ん！！！

これで終わったら正真正銘のクソ記事です。 ~~アニメこち亀早よサブスクで視聴させてくれ~~

正直なところ、自分のVPSの使い方だと1GBメモリですらオーバースペック感があったので、今回を機にインスタンスをダウングレードしようと考えました。
1GBの下は768MBメモリ。 ~~なんだその中途半端さは~~
これだと値上げ後でも月額上限は税込319円。値上げ前の現在のプランより安いです。

ちなみに、インスタンスは一度作成するとメモリなどのスペックは変更することができないので、新たにスペックを指定したインスタンスを作り、現在のインスタンスは削除する必要があるようです。

https://help.arena.ne.jp/hc/ja/articles/7881483541015

なので、今回は新たなインスタンスを作るところから。
まぁガイドもあるのでそれに沿って行うだけです。

https://help.arena.ne.jp/hc/ja/sections/360009023513

:::note warn
インスタンスは「停止」しただけでは課金が止まりません。古いインスタンスは必ず最後に「**削除**」しましょう
:::

今回は、このインスタンス作成にあたり、初めからVPSを構築したわけですが、やらかした部分をいくつか備忘録として残します。

# やらかし集
## ipv6のDNS設定
DNSではお決まり、正引きのためのAレコードですが、あれipv4しか対応していないらしいですね。
Indigoの最下グレードの768MBでは、サーバのIPはv6でしか振られません。
DNSレコードはAではなくAAAAレコードというものを使うとのこと。はぇー知らなんだ。

https://e-words.jp/w/AAAA%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89.html


## SSHでのユーザ名
今回、開発終了になったCentOS LinuxではなくUbuntuを利用しました。~~CentOS Stream？　知らない子ですね……~~
最初のSSH接続でのユーザ名は ``ubuntu`` です。``root`` ではない

https://help.arena.ne.jp/hc/ja/articles/360049807634



## Webサーバ
なんとWebサービスは未インストールだった（残当）。
Apacheなりnginxなり好きなものを。

Ubuntuの場合、Apacheは ``sudo apt-get install -y apache2`` でインストール。
nginxはOS標準のだと古いらしいので注意。


## SSL接続のために
ここが一番苦労したし、一番驚いた。

まず、以下を参考に証明書をとりましょう。

https://weblabo.oscasierra.net/letsencrypt-2/

https://www.server-world.info/query?os=Ubuntu_20.04&p=ssl&f=2

取得したあと、以下の3つのパラメータを記録しておきましょう。
```
SSLCertificateFile       /etc/letsencrypt/live/[サーバーのドメイン]/cert.pem
SSLCertificateKeyFile    /etc/letsencrypt/live/[サーバーのドメイン]/privkey.pem
SSLCertificateChainFile  /etc/letsencrypt/live/[サーバーのドメイン]/chain.pem
```

ちなみに、certbotを用いた証明書の自動更新ですが、いつからかパッケージの中で既に自動更新できる機能が組み込まれたらしく、何もしなくても毎日2回、更新処理を行ってくれます（実際に更新されるのはexpireまでひと月を切った証明書だけ）
昔はcronとかで更新用のコマンドを回さなきゃいけなかった気がしたのですが……昔からあったっけこんなの？

あとはSSL設定をしましょう。

https://www.server-world.info/query?os=Ubuntu_20.04&p=httpd&f=3


# おしまい
あんまり細々書く気力がなかったので、大部分はURL引いてそっちに解説を任せました。
クソ記事でした。


　
　
　
　
　
　
　

# おまけ：ChatGPTに聞いてみた
無料版のやつです。
![FireShot Capture 054 - SSL VPS Webサーバ - chat.openai.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68786/f1f97030-777f-6550-ca71-d8d4cf968a6e.png)
Ubuntuをもう一つ立てる

# Ubuntu環境をもう一つ立てる

## 背景
* PHPの5系を立てる必要があったため、環境自体複製しようと思ったから。

## 環境
Windows11

## 手順
* 新しく空のUbuntuをインストールする方法
* 既存のUbuntuを複製する方法

## 新しく空のUbuntuをインストールする方法
* 下記よりUbuntu20.04(```focal-server-cloudimg-amd64-wsl.rootfs.tar.gz```)を取得
https://cloud-images.ubuntu.com/focal/current/

* ダウンロードしたファイルをデスクトップに移動

* インストール先のフォルダを作成
```
C:\WSL\Ubuntu
```
※今回は上記を作成

* インポートする
```sh:PowerShell
wsl --import <DistributionName> <InstallLocation> <FileName> --version 2
```
具体的には
```sh:PowerShell
wsl --import five_system_environment C:\WSL\Ubuntu C:\Users\<ユーザー名>\Desktop\focal-server-cloudimg-amd64-wsl.rootfs.tar.gz --version 2
```
:::note info
DistributionNameは任意の名前で大丈夫です。
:::

### ディストリビューションの一覧
```shell:PouwerShell
wsl -l -v
```
* five_system_environmentが作成されていれば成功

## 既存のUbuntuを複製

### 既にWSLにインストールされているディストリビューション一覧を確認
```shell:PouwerShell
wsl -l -v
```

#### デスクトップにUbuntuをエクスポート（コピー）
```shell:PouwerShell
wsl --export Ubuntu C:\Users\<ユーザー名>\Desktop\exported_Ubuntu.tar
```
:::note info
```wsl -l -v```で確認したときにディストリビューション名がUbuntu20.04だった場合は```wsl --export Ubuntu20.04 C:\Users\<ユーザー名>\Desktop\exported_Ubuntu.tar```となります。
:::

### インポート先のディレクトリを作成
```shell:PouwerShell
mkdir C:\wslDistroStrage\myUbuntu
```
### 作成したフォルダにエクスポート
```shell:PouwerShell
wsl --import five_system_environment C:\wslDistroStrage\myUbuntu C:\Users\<ユーザー名>\Desktop\exported_Ubuntu.tar
```
### 結果の確認
```shell:PouwerShell
wsl --list --verbose
```
:::note info
five_system_environmentという名前のディストリビューションが作成されていれば成功です。
:::

### ユーザーを指定して起動（未指定だとrootで起動）
```shell:PouwerShell
wsl --distribution five_system_environment --user <ユーザー名>
```
:::note info
ここでのユーザー名は既存のUbuntuにログインしているユーザー名でよい。
:::

### ディストリビューション情報の確認
```shell:Ubuntu
cat /etc/lsb-release
```

## ディストリビューションの削除
```shell:PowerShell
wsl --unregister ディストリビューション名
```
slackにメッセージを送るプログラム

```
# Slack APIのURLとトークンを設定
$url = "https://slack.com/api/chat.postMessage"
$token = "YOUR_SLACK_API_TOKEN"

# 送信するメッセージを設定
$message = @{
    channel = "#general" # 送信するチャンネル名
    text = "Hello from PowerShell!" # 送信するテキストメッセージ
}

# Slack APIにPOSTリクエストを送信
Invoke-WebRequest -Uri $url -Method Post -ContentType "application/json" -Headers @{Authorization = "Bearer $token"} -Body ($message | ConvertTo-Json)
```
ChatGPTでMySQLサーバをエミュレートしてみた

## この記事は何
記事投稿キャンペーン「ChatGPTなどの活用方法を発信しよう！」の参加記事です。

https://qiita.com/official-events/b80ebe828fa453edf260

以下の記事を見て、MySQLサーバもエミュレートできるのでは？と思って試した時の備忘録です。

https://www.engraved.blog/building-a-virtual-machine-inside/

## 実際にやってみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/346f4120-9758-7931-f68e-df62902f9209.png)

おお。返ってきましたね。気になるDataBaseもありますが、いったん chatgpt というDBを作ってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/75362b31-d44a-8443-cc3f-b248da97e9ef.png)

OK と返ってきましたが、どうやら本当にOKのようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/6c7c481e-f980-214d-a150-325ab1c92325.png)

今度はテーブルを作って、データを入れてみたいと思います。
わざと存在しないDBを明示的に書いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/241177c7-7277-0716-fd10-db636afa8f38.png)

おお。エラーになりました。
今度は成功するように書き直します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/0e8875fb-c325-cda9-23e5-909f19118c95.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/1605401a-24e4-1dcb-eed6-76768c33a4b2.png)

できてますね！

最後にこのMySQLのversionを指定してませんでしたが、いくつなのか見て終わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/042aa89b-3261-b9f9-db8f-959f1816e8d4.png)

## 最後に

今回は色々投げていたらメッセージ制限がかかってしまいましたが、手元に環境がない時のちょっとした確認にも使えそうですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/7392afef-e258-c3c9-5c7c-660fba7ea56d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/14a5c579-4453-217f-df0b-f4c12c3f2c31.png)
ローカルの開発用証明書を更新する

# はじめに

WebAPIプロジェクトのデバッグ実行時に、突然ブラウザがhttpsにならずに立ち上がりました。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275170/3ef7f377-cba6-d592-deeb-bc669ed4cc8e.png)
httpsで実行しないと困ることがあるため調べたところ、ローカル開発証明書が有効期限切れであることが原因そうなので更新手順を備忘録として残します。

# やること

powershellを管理者として実行し、現在の証明書を削除(クリーン)を行います。

```powershell
dotnet dev-certs https --clean
```

実行すると、証明書がある場合には以下のダイアログが表示されます。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275170/760209cc-b2e1-9db6-ae60-73bef2965fe6.png)
「はい」を押すことで削除します。

次に再度証明書の作成を行います。

```powershell
dotnet dev-certs https --trust
```

実行すると、以下のダイアログが表示されます。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275170/d91228c2-188f-f4b8-e519-d027db497fb2.png)
確認した上で、「はい」を押して証明書を作成します。

### 実行

再度デバッグ実行するとhttpsで立ち上がりました。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275170/b4f41e43-5fae-dcdf-a557-0fac132438a4.png)

# おわりに

上記手順にてローカル開発証明書の更新が行えました。
有効期限を見ると更新日より1年となっているので、一年後には再発するのかもしれません。
viteでのプロジェクトで、環境変数を含む部分のテストをjestで行う

viteのプロジェクトでjestを使ってテストを実行したところ、環境変数を読み込んでいる部分でエラーが出たため、それを修正した備忘録です。

### 環境
- vite: 4.0.0
- jest: 29.3.1
- ts-jest: 29.0.5
- @types/jest: 29.2.5
- typescript: 4.9.3

### 前提
本プロジェクトでは、2通りの方法で環境変数を使用しています。
1. `.env`ファイルに環境変数を記載して、`import.meta.env`で読み込んで使用する
1. `yarn dev`の実行時に、コマンドラインから環境変数を渡す。
    (`"dev": "VITE_NODE_ENV=local vite --mode default"`)

### 発生したエラーと対処法

まずjestを実行したところ、次のエラーが発生しました。
```
error TS1343: The 'import.meta' meta-property is only allowed when the '--module' option is 'es2020', 'es2022', 'esnext', 'system', 'node16', or 'nodenext'.
```

https://qiita.com/diskszk/items/ed6362e35e15f2fd790e

こちらの記事の手順で、`import.meta.env`を`process.env`に変更しました。詳細はこちらの記事に書いてあるため、ここでは省略します。

この変更を行ったところ、上記のエラーは解消されましたが、コマンドラインから渡している環境変数が読み込めないというエラーが新たに出現しました。コンソールに値を表示して確認したところ、値が`undefined`になっていました。

```
  ● Test suite failed to run

    nodeEnvの値が不適切です

      13 |
      14 |   if (nodeEnv !== 'local' && nodeEnv !== 'test' && nodeEnv !== 'staging' && nodeEnv !== 'production') {
    > 15 |     throw new Error('nodeEnvの値が不適切です');
         |           ^
      16 |   }
      17 |
```

コマンドラインで指定した環境変数はjestの実行時に読み込んでくれないのかな？と思い調べていると、テストの実行前に関数を実行し、その中で環境変数を設定できる`globalSetup`というjestの設定に辿り着きました。


https://zenn.dev/ncdc/articles/jest-environment

こちらの記事を参考にし、以下のように`setupEnvironment.ts`ファイルを作成して`jest.config.js`ファイルで呼び出すことで、環境変数を設定することができました。

```
const setEnvironment = (): void => {
  process.env.VITE_NODE_ENV = 'local';
  return;
};

export default setEnvironment;
```

### おわりに
他にもやり方があるような気もしますが、とりあえずこの方法でテストを実行できるようになりました。