OmniAICreator/Qiita-1.07M huggingface dataset:
sqlmock + gormでDB周りのテストを書く

## sqlmockとは

Goのテスト用のDBを用意しなくてもSQLドライバのような振る舞いをしてくれるモックのライブラリ

## パッケージのバージョン

```:go.mod
gorm.io/driver/postgres v1.3.4 // indirect
gorm.io/gorm v1.23.1 // indirect
```

## 困ったこと

gorm.io/driver/mysqlのv1.3.2では正しく動作しない。v1.0.3では正しく動作する。
**Where("id=?", 1)** ではなく **Where("id = ?", 1)** と記述する。

https://github.com/Watson-Sei/go-sqlmock-gorm

## 解決フロー

このような困った仕様に気づくために記事を見るだけでなく実際に動くコードをGitHubからcloneしてきてコードを色々変えて試してみることがとても大切だと感じた。Versionも確認すること。

## 実際のコード

```go
package database_test

import (
	"fmt"
	"regexp"
	"testing"
	"time"
	"github.com/DATA-DOG/go-sqlmock"
	"github.com/ymktmk/golang-clean-architecture/domain"
	"github.com/ymktmk/golang-clean-architecture/infrastructure"
	"github.com/ymktmk/golang-clean-architecture/interfaces/database"
	"gorm.io/driver/postgres"
	"gorm.io/gorm"
)

func NewDbMock() (*gorm.DB, sqlmock.Sqlmock, error) {
	sqlDB, mock, err := sqlmock.New()
	mockDB, err := gorm.Open(postgres.New(postgres.Config{
		Conn: sqlDB,
	}), &gorm.Config{})
	return mockDB, mock, err
}

func DummyHandler(conn *gorm.DB) database.SqlHandler {
	sqlHandler := new(infrastructure.SqlHandler)
	sqlHandler.Conn = conn
	return sqlHandler
}

func TestStore(t *testing.T) {
	mockDB, mock, err := NewDbMock()
	if err != nil {
		t.Errorf("Failed to initialize mock DB: %v", err)
	}
	
	u := &domain.User{
		Name: "sheep",
		Email: "example@gmail.com",
	}
	
	// mock設定
	rows := sqlmock.NewRows([]string{"id"}).AddRow(1)

	mock.ExpectBegin()
	mock.ExpectQuery(regexp.QuoteMeta(
		`INSERT INTO "users" ("created_at","updated_at","deleted_at","name","email") VALUES ($1,$2,$3,$4,$5)`)).
		WillReturnRows(rows)
	mock.ExpectCommit()

	// repository 初期化
	repo := &database.UserRepository{SqlHandler: DummyHandler(mockDB)}
	user, err := repo.Store(u)
	fmt.Println(user)
	if err != nil {
		t.Fatal(err)
	}
	
	if err := mock.ExpectationsWereMet(); err != nil {
		t.Errorf("Test Create User: %v", err)
	}
}


func TestFindById(t *testing.T) {
	mockDB, mock, err := NewDbMock()
	if err != nil {
		t.Errorf("Failed to initialize mock DB: %v", err)
	}

	// mock設定
	rows := sqlmock.NewRows([]string{"id", "name", "email", "created_at", "updated_at", "deleted_at"}).
	AddRow(1, "tomoki", "example@gmail.com", time.Now(), time.Now(), nil)
	
	mock.ExpectQuery(regexp.QuoteMeta(
		`SELECT * FROM "users" WHERE id = $1`)).
		WithArgs(1).
		WillReturnRows(rows)

      // repository 初期化
	repo := &database.UserRepository{SqlHandler: DummyHandler(mockDB)}
	user, err := repo.FindById(1)
	fmt.Println(user)
	if err != nil {
		t.Fatal(err)
	}

	if err := mock.ExpectationsWereMet(); err != nil {
		t.Errorf("Test Find User: %v", err)
	}
}
```

## マイリポジトリ

動くものをサンプルとして公開しています。よかったら試してみてください。

https://github.com/ymktmk/gorm-sqlmock.git

## 参考文献

https://qiita.com/seya/items/582c2bdcca4ad50b03b7

https://qiita.com/gold-kou/items/cb174690397f651e2d7f

https://qiita.com/otanu/items/761de2bfc38468e9d353

https://tech.fusic.co.jp/posts/2020-12-02-mock-gormdb-using-go-sqlmock/
さくらのオブジェクトストレージにローカルファイルをアップロードする

# はじめに
最近になって、さくらのクラウドを触り始めた初心者（筆者）が
四苦八苦しながらオブジェクトストレージにファイルをアップロードしてみる。。。
そんな内容です。

もの凄く初歩的な内容ですが、さくらのクラウド（特にオブジェクトストレージ）に関する
情報が少なすぎるので、いつかの自分のために記事に残そうというモチベーションで今書いてます。
~~（忘れた時、また調べるのめんどくさいし）~~

# 予想される検索ワード
以下、この記事を求めているであろう方が入力しそうな
（というか実際に私が必死で検索した）検索ワードです。

さくらのクラウド, オブジェクトストレージ, アップロード方法, AWS CLI

# 実行環境
- ubuntu 18.04（Dockerで構築）

# 手順
## オブジェクトストレージにてバケットを作成する
**サイトの作成**、および**バケットの作成**を実施します。
手順は公式マニュアル通りなので、特にハマることなくできると思います。

ただし、

**サイトの作成時に表示されるアクセスキーIDとシークレットアクセスキーは
必ずメモしておいてください。**
(AWS CLIの操作時に必要です)

https://manual.sakura.ad.jp/cloud/objectstorage/about.html#id8

## ubuntuにAWS CLIを入れる
今回は、AWS CLIを使ってオブジェクトストレージにファイルをアップロードしてみます。
（正直、このやり方しか分からなかった）

ここではubuntuにAWS CLIをインストールします。

1. ubuntuのコンソールにて、AWS CLIのインストールファイルをダウンロードします。
（実行場所は多分どこでも大丈夫だけど、私は/tmpフォルダ直下でやりました）

    ```console
    $ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
    ```

1. インストーラーを解凍します。

    ```console
    $ unzip awscliv2.zip
    ```

1. インストールプログラムを実行します。

    ```console
    $ sudo ./aws/install
    ```

1. 以下のコマンド（ver確認）を使って、正常にインストールできているか確認します。

    ```console
    $ aws --version
    ```

まあ、AWS公式のユーザーガイドにも書いてあるし、こっちの方が詳しいです。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

## AWS CLIの初期設定を行う
さくらのオブジェクトストレージにアクセスするために、
AWS CLIの初期設定を行います。

```console
$ aws configure
```

上記コマンド入力後に以下について聞かれるので、入力していく。

```
AWS Access Key ID [None]: サイト作成時のアクセスキー
AWS Secret Access Key [None]: サイト作成時のシークレットアクセスキー
Default region name [None]: jp-north-1
Default output format [None]: json
```

## オブジェクトストレージにファイルをアップする
ubuntu上にあるtest_file.txtをオブジェクトストレージにアップしてみます。

1. /tmpフォルダ直下にtest_file.txtを用意しておきます。

    ```console
    $ vi /tmp/test_file.txt
    （中身は適当に記述して保存しておきます）
    ```

1. 現在作成しているオブジェクトストレージ一覧を確認します。
⇒お試しで作ったバケットが表示されればOKです。

    ```console
    $ aws --endpoint-url=https://s3.isk01.sakurastorage.jp s3 ls
    ```

1. 任意のバケットにtest_file.txtをアップします。

    ```console
    $ aws --endpoint-url=https://s3.isk01.sakurastorage.jp s3 cp /tmp/test_file.txt s3://test-bucketxxxx/
    （test-bucketxxxxは自分が作ったバケット名を入れればOK）
    ```

1. Webブラウザでオブジェクトストレージにファイルがアップされているか確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1147458/a8acc2bc-0456-dc1d-d6e1-97fba198721a.png)

# おわりに
基本的には各マニュアル（オブジェクトストレージ、AWS CLI）を組み合わせるだけで
できるのですが、一連の流れで説明されているページが特に無いので、
「これで合っているんだろうか...？」と不安になりながらの作業でした。

特に私の場合は、「できればPythonから操作したい」という下心があったせいで
調べる対象が膨れ上がって、結構苦戦したので。。。

ちなみにPythonからさくらのオブジェクトストレージを操作する方法について
公式サポートに聞いてみたのですが、教えて貰えませんでした。
（boto3とかあるけど、サポート対象外だと思われ）

どうしてもやりたかったら自分で調べるしかなさそうです。。。
余裕があれば調べて更新します。

（2022/04/27追記）
boto3を使ってオブジェクトストレージにファイルを
アップする方法についてまとめてみました

https://qiita.com/nkmr_RL/items/c03841dc05948b134113

# 参考記事など
- [Amazon S3互換クライアントの利用](https://manual.sakura.ad.jp/cloud/objectstorage/about.html#amazon-s3)
11ty(eleventy)を使ってみた感想

ここ最近、複数ページあるWebサイトを構築するときに11tyを使う機会が多いです。
SSGすらほとんど使ったことのなかった私ですが、実際に11tyを使った感想をつらつら書いていきます。

## そもそも11tyとは
11tyとはSSG（静的サイトジェネレーター）のひとつで、同じレイアウトのページを複数作る際などにとっても便利です。
土台となるテンプレートをひとつ用意し、それを各ページで読み込んで生成します。
ヘッダーやフッターなど共通で使う部分はコンポーネント化し、テンプレート側で読み込んでおくと、各ページごとのファイルがとてもすっきりして管理がしやすくなります。

私の場合、HTMLは11tyと相性の良いとされる**Nunjucks**で記述しています。
Pug等も使えるようですが、試したことがないので機会があればやってみます。。

## 感想① jsonでのデータ管理が便利
metaの内容だったり、サイトマップの情報だったりをjson化することで、HTMLにベタ書きせずにページ固有のものを反映することもでき、とても使いやすいなと思いました。
下記の繰り返し処理と繋がってきますが、「記事一覧」などを作る際にも役立ちました。
11ty使い始めのときは、これが便利すぎてなんでもjson化していました。。笑

```lists.json
[
  {
    "title": "記事ページ1",
    "txt": "記事ページ1のテキスト",
    "image": "thumb_01.png"
  },
  {
    "title": "記事ページ2",
    "txt": "記事ページ2のテキスト",
    "image": "thumb_02.png"
  },
]
```

HTMLに直接書いてしまうと、要素が増えたり減ったりする際の修正が少々面倒ですが、jsonにまとめてあると手間も少ないかなと思います。

## 感想② 繰り返し処理が使いやすい
```list.njk
<ul class="list">
{%- for list in lists %}
  <li class="list__item">
    <h2 class="list__item__title">{{ list.title }}</h2>
    <p class="list__item__text">{{ list.txt }}</p>
    <div class="m_present_list__item__image"><img src="images/{{ list.image }}" alt="{{ list.title }}"></div>
  </li>
{%- endfor %}
</ul>

```
これはjsonと組み合わせて使うことがほとんどでしたが、for文を書けるのはすごい楽でした。
「記事一覧」のように、サムネイル画像とタイトル・キーワードを記事ページ分表示するレイアウトなども、上記のjsonに中身の情報をまとめ、それをfor文を使ったテンプレートで処理することでスッキリスッキリです。
一覧のうちいくつかだけ特殊なデザインやマークをつけたい等も、jsonでフラグを立てておけばifを使って分岐ができるので、結構柔軟に制作ができました。

## 感想③ 学習コストが低い
NunjucksがHTMLの書き方に近いので、新しく覚えなきゃいけないことが少なくとっつきやすい印象です。
11ty自体の導入も簡単にできますし、私個人としてはめちゃくちゃ行き詰まることはそんなにありませんでした。

11tyの機能でfilterを作ったりできるので、カスタマイズをしようとすると少々難しいですが、特に処理を作らず使うのであればとても導入しやすいのではないかと思います。

## まとめ
他にたくさんのSSGを使ってきたわけではないので、他との比較はできませんが
個人的にはとても使いやすくて好きなSSGです。
開発環境を作るときも、悩んだら11ty入れがちです。笑

今後カスタマイズも挑戦してみたいので、そのときはまた記事にして投稿したいと思います。
Unityで任意のタイミングでボタンを押せないようにする

2022.4.25 8日目　暑い！！！

## ボタンを押せないようにする
```C#
GetComponent<Button>().interactable = false;
```
この一文を追加するだけでいいようです。


今日は仕事で言われたことをメモしておきます。
・ミッション等を作成するときはIDは1から
・Flag処理は最初にぶち当たる壁だから気を付ける意識する

以上です。今日は短いですがこの辺で。
（コメントありがとうございます！仕事終わりは忙しいので、休日に実際に実装して自分の物にします！）
Reactのプロジェクト作成【備忘録】

## 前提
* npm 6.14.11

## プロジェクト
* npxの場合
```
$ npx create-react-app react-project-npx
```

* npm initの場合
```
$ npm init react-app react-project-npx
```
※npmのバージョンが6以上が必要な模様

## package.jsonの中身の確認
* npxの場合
```
{
  "name": "react-project-npx",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.16.4",
    "@testing-library/react": "^13.1.1",
    "@testing-library/user-event": "^13.5.0",
    "react": "^18.0.0",
    "react-dom": "^18.0.0",
    "react-scripts": "5.0.1",
    "web-vitals": "^2.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}
```

* npm initの場合
```
{
  "name": "react-project-npm",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.16.4",
    "@testing-library/react": "^13.1.1",
    "@testing-library/user-event": "^13.5.0",
    "react": "^18.0.0",
    "react-dom": "^18.0.0",
    "react-scripts": "5.0.1",
    "web-vitals": "^2.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

```

横並びで差分は出せないですが、  
中身は同じなのでどちらのプロジェクト作成でも`変わりない`ということがわかりました！  
(上記だと任意で指定したプロジェクト名のみが差分になる)


## 参考
[Getting Started | Create React App](https://create-react-app.dev/docs/getting-started/)
fluent-bit で log file を tail して elasticsearch に送る

初めて fluent-bit を使ってみた。軽量な fluentd だそうです。pluginの追加あたりで躓いたので、メモっておく


##  install fluent-bit

> Ref  https://docs.fluentbit.io/manual/installation/linux/redhat-centos#configure-yum

repoを登録する

```rb:/etc/yum.repos.d/fluent-bit.repo
[fluent-bit]
name = Fluent Bit
baseurl = https://packages.fluentbit.io/centos/$releasever/$basearch/
gpgcheck=1
gpgkey=https://packages.fluentbit.io/fluentbit.key
repo_gpgcheck=1
enabled=1
```


install 

```rb
$ yum install fluent-bit

systemctl status fluent-bit
```


## config

elasticsearchに出力するpluginを有効にします

```rb:/etc/fluent-bit/plugins.conf
[PLUGINS]
    @INCLUDE output-elasticsearch.conf             <--- 追加
    # Path /path/to/out_gstdout.so
```

defaultのconfigを書き換えます

```rb:/etc/fluent-bit/fluent-bit.conf

[SERVICE]
    daemon       Off
    log_level    debug
    plugins_file plugins.conf

# https://docs.fluentbit.io/manual/pipeline/inputs/tail
[INPUT]
    Name   tail
    Path   /path/to/your/log

# https://docs.fluentbit.io/manual/pipeline/outputs/elasticsearch
[OUTPUT]
    Name  es
    Match *
    Host  <your.elasticsearch.endpoint>
    Port  9200
    HTTP_User <es_user>
    HTTP_Passwd <es_password>
    tls   On
    tls.verify  On
    Index <your-index-name>
    Type  _doc
```


## 動作確認

start

```rb
systemctl restart fluent-bit
systemctl enable fluent-bit

date > /path/to/your/log
```

kibanaのdevtoolsとかで叩いてみる

```rb
GET <your-index-name>/_search
{
  "query": {
    "match_all": {}
  }
}

```


Voilà!
SSMSのデータをAzureVMのバックアップ

<h2>はじめに</h2>

現在使用しているサーバの容量が圧迫され始めました。
バックアップデータがそのほとんどを占めています。
その為、SSMS→Azureへバックアップする方法を検討しています。

バックアップ方法、その復元方法を調査しています。

<h2>SSMS→Azureへバックアップする方法</h2>

[Azure への SQL Server マネージド バックアップを有効にする](https://docs.microsoft.com/ja-jp/sql/relational-databases/backup-restore/sql-server-managed-backup-to-microsoft-azure?view=sql-server-ver15)
[Azure Storage を使用した SQL Server のバックアップと復元](https://docs.microsoft.com/ja-jp/azure/azure-sql/virtual-machines/windows/azure-storage-sql-server-backup-restore-use)
[Azure Blob Storage を使った SQL Server のバックアップと復元](https://docs.microsoft.com/ja-jp/sql/relational-databases/backup-restore/sql-server-backup-and-restore-with-microsoft-azure-blob-storage-service?view=sql-server-ver15)
[クイックスタート: Azure Blob Storage への SQL のバックアップと復元](https://docs.microsoft.com/ja-jp/sql/relational-databases/tutorial-sql-server-backup-and-restore-to-azure-blob-storage-service?view=sql-server-ver15&tabs=SSMS)
[チュートリアル:Azure Data Studio を使用したデータベースのバックアップと復元](https://docs.microsoft.com/ja-jp/sql/azure-data-studio/tutorial-backup-restore-sql-server?view=sql-server-ver15)
[スケジュールを設定して定期的にデータベースを自動でバックアップする](https://www.ipentec.com/document/sql-server-backup-schduled-%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB:Azure%20Data%20Studio%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%A8%E5%BE%A9%E5%85%83)

[]()

<h2>AzureからSSMSへ復元する方法</h2>
[Rails] PG::ConnectionBad: local user with ID 502 does not existが出た時の対処法

# はじめに
データベースで操作で`PG::ConnectionBad: local user with ID 502 does not exist`というエラーが発生した行った対処法を記事に残したいと思います。

# エラーの発生
以下のコマンドを実行した時に
```console:コンソール
bundle exec rails db:migrate:status
```
このようなエラー文が出ました
```
=> Running via Spring preloader in process 74769
rake aborted!
ActiveRecord::ConnectionNotEstablished: local user with ID 502 does not exist
/Users/mouriyuka/runteq/pf/shere-lerning-video/vendor/bundle/ruby/3.0.0/gems/activerecord-
6.1.5/lib/active_record/connection_adapters/postgresql_adapter.rb:83:in `rescue in new_client'
/Users/mouriyuka/runteq/pf/shere-lerning-video/vendor/bundle/ruby/3.0.0/gems/activerecord-
....
```
# 対処法
springが悪さをしているようだったため、stopしました
```console:コンソール
bundle exec spring stop
=> Spring stopped.
```
その後、起動するようになりました！
初めてのReactのテスト


# 内容
Reactのテストコードの作成から実行までの流れを忘却録として記録する。

○ユニットテスト
・JEST
(create-react-appで作成したプロジェクトにはJESTが含まれている)

○レンダリングテスト
・testing-library/react
(プロジェクト作成時にpackage.jsonに記載されている)


# 開発環境

PC:macOS Montery
エディター：Visual Studio Code


nodebrew: v1.0.1
nodejs: v15.14.0

JEST：プロジェクト生成時のバージョン

# ディレクトリ構成
下記コマンドを実行して、作成されるプロジェクトの構成とする。
（Reactのチュートリアルの構成）

```
npx create-react-app my-app
```

``` 
my-app/
　├ public/
　├ src/
　│　├ App.css
　│　├ App.js
　│　├ App.test.js
　│　├ index.css
　│　├ index.js
　│　├ logo.svg
　│　├ reportWebVitals.js
　│　└ setupTests.js
　├ README.md
　├ package-lock.json
　└ package.json
```

# コード

### レンダリングテスト
App.jsとApp.test.jsファイルを下記のように変更する。

```src/App.js
import React from 'react';

export const App = () => {
  return <div>Hello React</div>;
}
```


```src/App.test.js
import React from 'react';
import { render } from '@testing-library/react';

import { App } from './App';

describe('App', () => {
  test('renders App component', () => {
    render(<App />);
  });
});
```

### ユニットテスト

TimesTwo.jsとTimesTwo.test.jsの2ファイルを作成して、以下のようにコードを書く。

```src/TimesTwo.js
//値を2倍にする関数
export const TimesTwo = (value) => {
  return value * 2;
}
```


```src/TimesTwo.test.js
import { TimesTwo } from './TimesTwo';

//引数2を倍の4にされたことを確認する（期待値の確認テスト）
test('TimesTwo test', () => {
  expect(TimesTwo(2)).toBe(4);
});
```

※テストコードのファイルは、「テストしたいファイル名.test.js」にする。
今回の場合はApp.jsをテストするので、App.test.jsになる。

#### テストコマンドの実行

```
npm test
```

#### 実行結果

```App.test.js
 PASS  src/App.test.js
  App
    ✓ renders App component (16 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        2.606 s
Ran all test suites.

Watch Usage: Press w to show more.
```


```TimesTwo.test.js
 PASS src/TimesTwo.test.js
  ✓ first test (1 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.388 s
Ran all test suites.

Watch Usage: Press w to show more.
```

※ターミナル上でキーボードのQをクリックして、テストを終了できる。


#参考記事

https://jestjs.io/ja/
body-scroll-lock.js「すべてのブラウザでスクロールのロックしたるで」←こいつ超有能

## この記事に書いてあること
JavaScriptプラグインのbody-scroll-lock.jsの使い方について

## サイトリンク
- [GitHubリポジトリ](https://github.com/willmcpo/body-scroll-lock)
- [npmサイト](https://www.npmjs.com/package/body-scroll-lock)

## body-scroll-lock.jsとは？
ターゲット要素（モーダル/ライトボックス/フライアウト/ナビメニューなど）のスクロールを中断せずに、ボディスクロールを禁止にするプラグインです

対象ブラウザ
iOS Mobileおよびタブレット、Android、デスクトップSafari/Chrome/Firefox

## どんな時に使うか？
例えばモーダルを表示した時に、背景を固定したいといった場合に使うことができます。
モーダルの中だけスクロールを有効にして、背景固定を実現するなんてことも簡単に実装可能です。

## なぜ使うの？
スクロールのロックは簡単そうに思えて、実は結構面倒くさい処理内容です。
例えば、

**overflow:hidden;iOSで動作しない問題**
**position: fixedは、ボディのスクロールがリセットされちゃう問題**

などなど、WEB製作者の頭を結構悩ませるのです。

## 使い方
### インストール
パッケージインストール
```
yarn add body-scroll-lock

or

npm install body-scroll-lock
```

CDN
https://cdnjs.com/libraries/body-scroll-lock

### Functions

対象要素以外の、ボディのスクロールを無効化

```javascript
//hoge以外のスクロール禁止
bodyScrollLock.disableBodyScroll(‘hoge’)	
```

対象要素の、ボディのスクロールを有効化
```javascript
//hoge以外のスクロール有効化
bodyScrollLock. enableBodyScroll(‘hoge’)	
```

全てのスクロール禁止を解除
```javascript
bodyScrollLock.clearAllBodyScrollLocks(　)
```
ITインフラを構成する要素

## 概要
インフラエンジニアの仕事について、概要や知っておくべきことのまとめです。
インフラについて携わった事が無い方や、ITエンジニアなりたての方向けに出来るだけ簡単に説明しております。

## 1. ファシリティ
ファシリティには建物、施設、設備といった意味があり、
データセンター、ラック、空調、消火設備などが含まれる。

### 1.2. データセンター
![data-center-solutions-hero-2760x828.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/d26e6dd4-9667-0e9f-0860-b9f84a68fc23.jpeg)

各種のコンピュータ（メインフレーム、ミニコンピュータ、サーバ等）やデータ通信などの装置を設置・運用することに特化した施設の総称。
有名どころだとアット東京、IDCフロンティア、Equinixなどがある。
インターネット回線や空調などが管理されており、監視業務を依頼する事も可能。

### 1.3. ラック(サーバラック)

![rack_mini.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/3eb5cc35-f73e-411f-d960-bba96e1809b1.jpeg)
サーバやネットワーク機器などを保管しておく棚
EIA(米国電子工業会)により、サーバーラックの幅と高さの標準を19インチラック(幅482.6mm・高さ44.45mm)と規格化されており、どのサーバもこのラックの幅に合わせて製造されているため基本的には搭載が可能。
ラックの高さは「U(unit)」で表され、42段あれば42Uラックと呼称する。
1Uラックマウントサーバだけではなく、2Uラックマウントサーバや10Uブレードサーバなど、複数段使用する機器があるため、設計段階でラック図を作成して、ラックの何Uにどの機器を入れるかを事前に考慮する必要がある。
![add-rack-shapes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/8dd4a13f-374c-2967-8485-4f915b6dcc5c.png)

### 1.4. 空調
サーバは常に高温となるため、空調が非常に重要となる。
各機器の吸気、排気場所を考慮したラック構成が必要で、データセンターでは排気場所をホットアイル、吸気場所をコールドアイルと呼び場所にラックの場所に応じて空調を管理している。
![aisle-diagram-rev-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/1f149403-7a59-84e2-ed1e-ce8830e104ba.jpeg)
ちなみにデータセンター作業時、ホットアイルで作業するときは汗だくとなり、コールドアイルで作業するときは寒くて手が動かなくなる。そのため、データセンター作業が多い人は真夏でも厚手のコートやダウンジャケットを持参する。


## 2. サーバ
![dl_360.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/cc0f69ac-4756-5cf3-2908-73ca1113d16c.png)


>サーバとは、コンピュータネットワークにおいて、他のコンピュータに対し、自身の持っている機能やサービス、データなどを提供するコンピュータのこと。また、そのような機能を持ったソフトウェア。
参考：https://e-words.jp/w/%E3%82%B5%E3%83%BC%E3%83%90.html

通常のパソコンとは違い、24時間365日稼働することを前提に設計されており各パーツが冗長化されている。
例えばHDD、電源ケーブル、ファン、ネットワークカード等が複数搭載されており、1つが故障しても動作可能な構成が可能となっている。
冗長化されておらず1か所が壊れるとシステム全体が停止する箇所のことをSPOF(Single Point Of Failure/単一障害点）と言い、設計時点でいかにSPOFを無くせるが大事となる。
(なんでもかんでも冗長化すると、費用が膨れ上がるので費用に応じて妥協する事もある)

## 3. ストレージ
![3par.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/96f22b28-b481-5f35-25bf-1e2a7fe1c6a4.png)
データを保存する場所のこと。サーバとFCやiSCSIなどで接続を行う。
小規模なシステムであれば、サーバに搭載されているHDDだけを使用するが、大規模でTBやPT単位のデータがある場合はサーバとは別にストレージ機器を用意する。
NetAPP、HPE 3PAR、DELL EMCなどがある。

## 4. ネットワーク
![switch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/b607f139-afd0-e786-7fe5-384b3fbe2bc9.png)
ネットワークはサーバなど複数の機器を接続した集合体のことで、ネットワーク機器とはそれらを集約して通信を交換する装置のこと。
ネットワーク機器にはルータ、L2スイッチ、L3スイッチ、L4スイッチ(LB)、L7スイッチ(LB)などがある。
Ciscoが有名
[UE4]CharacterMovementをProjectで作成したものに切り替える

カスタムしたCharacterMovementを利用した場合など。
FObjectInitializer、SetDefaultSubobjectClassを利用すると上書きできる

詳しくはhistoriaさんの記事を参照
https://historia.co.jp/archives/6587/

# Characterクラス準備
GENERATED_BODY()→GENERATED_UCLASS_BODY()
ヘッダーのコンストラクタを削除
UMyCharacterMovementComponentをincludeしておく
以下のようにコンストラクタを調整する
```
AAA::AAA(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer.SetDefaultSubobjectClass<UMyCharacterMovementComponent>(ACharacter::CharacterMovementComponentName))
```

# CharacterMovementComponentの準備
UMyCharacterMovementComponentをUCharacterMovementComponentから継承して作成
Lock Input to Game View in order for tracked pose driver to work in editor playmode.の対処方法

# 環境

- Unity 2020.3.33
- com.unity.xr.management@4.2.0

# 経緯

- いつもこのが警告が出ても
- 自動で修正してくれる [FIX] ボタンに頼って修正していた
- 手動でやろうと思ったら、どこを設定していいのかわからなかった


# 手動で解決する方法

- [Window] - [Analysis] - [Input Debbugger]
- [Options] - [Lock Input to Game View]

![1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/a98527a4-a88c-4934-999b-fa762e44966f.png)
![2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/12bc3814-07d3-4fbf-54af-d0e2bcdecbc7.png)


# 警告メッセージ全文と意訳

- 「tracked pose driver を Editorのプレイモードで動かすために、インプットを固定してください」

```
Lock Input to Game View in order for tracked pose driver to work in editor playmode.
UnityEngine.XR.Management.XRGeneralSettings:AttemptInitializeXRSDKOnLoad () (at Library/PackageCache/com.unity.xr.management@4.2.0/Runtime/XRGeneralSettings.cs:148)
```

# TrackedPoseDriver  とは

> The TrackedPoseDriver component applies the current pose value of a tracked device to the of the . TrackedPoseDriver can track multiple types of devices including XR HMDs, controllers, and remotes.

- https://docs.unity3d.com/Packages/com.unity.inputsystem@1.3/api/UnityEngine.InputSystem.XR.TrackedPoseDriver.html

# 参考にしたサイト

https://www.reddit.com/r/Unity3D/comments/p29jl4/my_openxr_vr_project_is_able_to_be_played_when/
セキュリティソフトの購入時の検討事項

【初めに】
セキュリティソフトを導入する必要がありましたので、検討のメモとして記載しました。

【検討事項】
●セキュリティ機能
　・[侵入防御IDS/IPS](https://it-trend.jp/ids-ips/article/explain#:~:text=%E4%B8%8D%E6%AD%A3%E4%BE%B5%E5%85%A5%E6%A4%9C%E7%9F%A5%E3%83%BB%E9%98%B2%E5%BE%A1%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E5%88%9D%E5%BF%83%E8%80%85%E3%81%AB%E3%82%82%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E8%A7%A3%E8%AA%AC,-IT%E8%A3%BD%E5%93%81%E3%81%AE&text=IDS%E3%83%BBIPS%E3%81%A8%E3%81%AF%E3%80%81%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF,%E3%82%92%E6%9C%AA%E7%84%B6%E3%81%AB%E9%98%B2%E3%81%8E%E3%81%BE%E3%81%99%E3%80%82)
　・[不正プログラム対策](https://www.ffri.jp/special/what-endpoint-security-requirements-do-governments-require.htm)
　・[FW](https://thehikaku.net/security/08hikaku9.html)
　・変更監視

●機能の確認
　・クラウド上の管理なのか？
　・レポートは出力可能か？
　・クライアントの一元管理が可能か
　等

●金額
　・初期費用
　・ランニングコスト(月額)
　・ライセンス料
　・クライアントの一元管理料

●要件に対する機能と金額

●検証項目
０）バックアップ採取​
​
１）新たなセキュリティソフトでの運用検討​
​
２）新たなセキュリティソフトの初期インストール手順確認​
​
３）動作検証​
　　 ⇒導入サーバの機能正常確認​

４）旧セキュリティソフトのアンインストール＆新たなセキュリティソフトのインストール手順確認​


<h3>ベンダーと製品</h3>

| No |    ベンダー     |    製品    |
|---:|-------------|------------|
| 1  |Symantec             |Symantec Endpoint Protection14            |
| 2  |NJC             |SSDA安心プラス            |
| 3  |トレンドマイクロ             |Deep Security Agent Enterprise            |
|4|キヤノンITS	|ESET File Security for Linux / Windows Server
|5|mcafee	|Endpoint Protection
|6|Kaspersky	|Hybrid Cloud Security
|7|F-secure	|Server Protection
4.10 (易) 二次元確率変数の変数変換5 正規分布の和，差

## 方針

4.5で確認した正規分布の和が従う分布を，差も含めて確認する．

## 答案

![4.-11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/06f41620-7fdf-cd09-0462-9f3dc0796a29.jpeg)


## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Macでtmuxのターミナルを閉じちゃった時の復活方法

# Overview
ターミナルでtmuxを使って操作してる時、たまにターミナルウィンドウ自体を消しちゃって ***Oh no!*** ってなる時ありませんか？（わたしだけ？

そんな時でも慌てず焦らず元通り復活させましょう！

# How to
ウィンドウを閉じちゃっても、実はセッションは残ってます。

```
tmux ls
```
と打つと、残ってるセッションが表示されるはずです。

セッションがあることが確認できたら、

```
tmux a
```

でセッションを復活させましょう！

※ 複数セッションがある場合は、

```
tmux a -t <対象セッション名>
```

以上。

# Refs
[tmuxチートシート](https://qiita.com/nmrmsys/items/03f97f5eabec18a3a18b)

# Editor's Note
最近Eve Onlineにはまってます。
やりこみ型というよりも、時間をかけて育てながら、戦闘・生産・採掘・探検と自分がやりたい事を選んで進めていく感じ。
英語ベースで理解し難い所もあるけど2003年リリースと歴史も長く流行りものとは一線を画す玄人感がまたツボ。笑

[こちら](https://www.eveonline.com/ja/signup?invc=2c1716f1-5b31-4349-b22c-f30d2080d6d2)から登録すると100万スキルポイント（約1300～1500円相当＝約20日分）がGETできます！←
Kubernetes インストールのチートシート

私がKubernetsをインストールする時に見てるチートシートを備忘録程度に残しておきます。
スクリプトっぽく記述してますが、それぞれ1行ずつ実行してもらう方が確実です。

```bash
######################################################
#             kubernetes install script              #
######################################################
sudo apt update

# docker install
# https://qiita.com/zembutsu/items/bedb18e1061303e217b8
cd ~
wget -O get-docker.sh https://get.docker.com
sudo sh ./get-docker.sh
sudo apt install docker-compose -y

# Docker driver
# https://qiita.com/rottneer/items/5dad5193b1577c4edc29
# この辺りはスクリプトに最適化してないので手動がおすすめ
sudo echo \
'{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}'  >/etc/docker/daemon.json
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker info | grep Cgroup

# kubeadm 
# この辺りはスクリプトに最適化してないので手動がおすすめ
sudo passwd root
su root

cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

logout

# レガシーバイナリがインストールされていることを確認してください
sudo apt-get install -y iptables arptables ebtables

# レガシーバージョンに切り替えてください。
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
sudo update-alternatives --set arptables /usr/sbin/arptables-legacy
sudo update-alternatives --set ebtables /usr/sbin/ebtables-legacy

# この辺りはスクリプトに最適化してないので手動がおすすめ

sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

sudo apt update && sudo apt upgrade -y && sudo apt-get update && sudo apt-get upgrade -y

# Master node の場合はコチラ
<sudo kubeadm init>

# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# export KUBECONFIG=/etc/kubernetes/admin.conf

# Control node の場合はコチラ
<sudo kubeadm join <IP_ADDRESS> --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>>
```
Kali Linux2022.1 でハッキングラボをつくってみる 6　Windows10をハッキングする1 事前準備

# はじめに
『ハッキング・ラボのつくりかた』(IPUSIRON著)を参考にして、ハッキングラボを作成していきます。今回から、しばらくはWindows10のハッキングを行っていきます。
同書には、仮想マシンにWindows10をインストール・構築していくプロセスが記されています。(p.289〜309)
今回の記事では、この方法は使わずに、別の物理マシン（ノートパソコン）を用意して、そのノートパソコンのWindows10にハッキング・ラボ用のローカルアカウントを作成する方法を使います。

:::note alert
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
:::
:::note alert
業務などで使用している物理PCのWindows10では、ハッキングラボを構築することは推奨できません。
また、個人用の物理PCを使ってのハッキングラボの構築も、細心の注意を持って行ってください。一応、別に使い捨てのローカルアカウントを作成する処置を行っていますが、何かしら不具合が起こる可能性は有ります。
Windows10に不具合が起きた、ファイルが流出、破損したと言われても、私は何もできません。
:::
# 仮想マシンのWindows10を使用しない理由
理由としては、

- ホストOS(物理マシン)にウェブカメラがないので、ゲストOS（仮想マシン）でもウェブカメラを使用できない
- Windows10のインストールと環境の構築が手間
- VirtualBoxでWindows10を動作させると、非常に重い（私だけ？）
- 長い間使うと、なぜかフォントがガタガタになる。（目に悪い）

が挙げられます。
ノートパソコンの概要は以下の通り

- 機種：SONY VAIO SVP132A1CN
- OS:Windows10 Home 64bit
- version:21H2
- ビルド:19044.1586

## 物理マシンとVirtualBoxの仮想マシンをネットワーク接続する

物理マシンのノートパソコンとKaliLinuxをネットワークで接続するには、KaliLinuxのネットワーク設定を変更しなければいけません。「Oracle VM VirtualBoxマネージャー」の仮想マシン一覧からKaliLinuxを選択して、「設定」をクリック。「ネットワーク」から新規の「ブリッジアダプター」を追加します。

追加したら、KaliLinuxを起動して、`ip a`コマンドでネットワークを確認。
"/etc/network/interfaces"ファイルに以下を追加することで、KaliLinuxのIPアドレスを指定する。
決め打ちするIPアドレスは、LAN上の他のホストと重複しないようなものにする。
```:/etc/network/interfaces
allow-hotplug eth2
iface eth2 inet static
address 192.168.1.100
netmask 255.255.255.0
```
再起動させて、IPアドレスが代わっていることを確認。
<hr>
改めてのハッキングラボネットワークの構成確認

- KaliLinux(攻撃端末）
    - アダプタ1(任意・Windows7と接続するため)
       割当：ホストオンリアダプタ
IPアドレス：192.168.56.2(当環境において）
    - アダプタ２（任意・インターネットに接続するため）
割当：NAT
IPアドレス：10.0.3.15
    - アダプタ3（必須・Windowws10と接続するため）
割当：ブリッジアダプター
      IPアドレス：192.168.1.100

- Windows10(やられ端末)
    - アダプタ1
    割当：ブリッジアダプター
IPアドレス：192.168.1.17（DHCPで、動的に割り当てられたもの）
## あらかじめ行う措置
### Windows Updateの無効化
Windows10homeでは、Windows Updateの無効化は原則出来ないので、更新の一時停止を行いました。
### 新しくローカルアカウントを作成
Windows10の初期画面から「スタートボタン」>「設定」>「アカウント」>「家族とその他のユーザー」と遷移していく。「他のユーザー」の「その他のユーザーをこのPCに追加」をクリックする。
![2022-04-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/035474cd-336a-597b-c702-df4ba8861652.png)

ウィザードが立ち上がるので、「このユーザーのサインイン情報がありません」をクリック。
![2022-04-25 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/e91c0d83-f089-2cca-1899-a1a0f2137cc0.png)
画面が遷移したら、「Microsoftアカウントを持たないユーザーを追加する」をクリックする。クリックした後は、画面の指示に従ってユーザーアカウントを作成する。作成後は、そのアカウントを管理者権限に昇格しておく。
![2022-04-25 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/a8225532-fb9f-2f48-1a10-b036d3714e00.png)

### pingを返すように設定
Windows10の検索バーに"Windows Firewall"と検索して、「セキュリティが強化されたWindows Defender ファイアウォール」を立ち上げる。「受信の規則」から「ファイルとプリンターの共有（エコー要求 -ICMPv4受信）」を有効化する。
KaliLinux側からWindows10にむけてpingを飛ばして、通信ができることを確認する。
```
ping 192.168.1.17
```
### ネットワークの確認
Windows10で、インターネットの接続を確認
```:C:\Users\hoge
ping 8.8.8.8
ping 192.168.1.1
```

同じく、ゲストOS(KaliLinux)との接続を確認
```:C:\Users\hoge
ping 192.168.1.100
```

#おわりに
以上が、同書のp.312までに相応する内容となります。
Montereyでキーリピートがきかないときの対処法

## 問題
macOSをMontreyにアップグレードしたら、vimを使用中にキーリピートによるカーソル移動ができなくなった。

## 対処法
以下のコマンドを任意のディレクトリで実行。macか対象のアプリケーションの再起動で直るはず

```
defaults write -g ApplePressAndHoldEnabled -bool false
```

## 原因
どうやら、macのデフォルト設定で同じキーを連続して打つと特殊文字のPOPUPが表示される仕様となっているよう。上記コマンドでその設定をOFFにしたため問題が修正されたものと予想した。

## 参考

https://apple.stackexchange.com/a/405684
PostgresSQL 物理バックアップ

## 物理バックアップ
OSコマンドを用いれ行うバックアップのことである
tar,rsyncコマンド等を用いて行う方法で、データベース情報を保存したデータファイルに直接バックアップする方法。データベースクラスタ以外にテーブルスペース等のデータがある場合には、それらもバックアップに含める必要がある。postgresql.conf等の設定ファイルもバックアップの対象となります。
## テーブルスペースとは
データベースオブジェクトを格納するファイルシステム上のディレクトリパスです。デフォルトは、データベースクラスタですが、異なるストレージ内にテーブルデータを作成することができます。
4.9 (易) 二次元確率変数の変数変換4

## 答案

![4.-10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/1103a2a6-0631-71ae-6f60-1d5e4ad3d39f.jpeg)


## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
4.8 (標準) 二変数確率変数の変数変換3　Box-Muller変換

## 方針

正規分布からの乱数発生のためのアルゴリズムに利用されるBox-Muller変換に関する問題．

```math
(U_1,U_2)\rightarrow (r,\theta)\rightarrow (X,Y)
```

の順に変数変換を行う．極座標変換やヤコビアンの計算の練習にもなる良問．

## 答案

![4.-8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/d14a44fe-5762-921a-b208-ac4d823d0146.jpeg)

![4.-9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/6e89b7fe-b9d4-47fd-763b-96d265f8c26b.jpeg)



## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
4.7 (標準) ポアソン分布に従う確率変数の和 (積率母関数)

## 方針

「確率変数の和が従う分布」を求める際は，4.5で見た通り畳み込みか積率母関数から求める．和がよっぽど変な分布にならない限りは積率母関数からいく方が計算が簡単になる場合が多い．

## 答案

![4.-7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/ecca7c7a-cba0-9595-14e3-bae3c0f53371.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
【備忘録】PostgreSQLでidを初期化(auto_increment)

### Postgresのidを１に戻す
PostgreSQLでidを初期化する方法です。idを1に戻したい場合に利用してください。

```sql: 実行コマンドの雛形
ALTER SEQUENCE <table name>_<column name>_seq RESTART WITH <reset id>;
```

```sql: 実行コマンドの実例(usersテーブルのidを１に戻す)
ALTER SEQUENCE users_id_seq RESTART WITH 1;
```
Electron ファイルパスを相対パスでビルドする

# はじめに
Electron とVue でデスクトップアプリを作る際、CSSなどで指定したファイルパスは、Electron-builderでビルド時に、自動的に絶対パス（app://）で出力されてしまいますが、絶対パスではなく、相対パスにしたい、という時の方法です。IDEはJetBrain社のWebStormを使っています。
# 環境
- Vue : 3.2.13
- electron : 13.0.0
- vue/cli : 5.0.4
- vue-cli-plugin-electron-builder : 2.1.1
# 方法
vue/cliで、VueとElectron-builderが入っている状態とします。
`package.json`ファイルと同じ階層に`vue.config.js`ファイルを作成します。
作成したファイルに以下の記述を追加します。
```javascript:vue.config.js
module.exports = {
  pluginOptions : {
    electronBuilder : {
      customFileProtocol : "./"
    }
  }
}
```
僕はこの方法で、ビルド後のパスに`app://`が付かなくなりました。
# 参考URL
- [Incorrect css url in vue-cli electron build](https://stackoverflow.com/questions/67800589/incorrect-css-url-in-vue-cli-electron-build)
- [Changing the File Loading Protocol](https://nklayman.github.io/vue-cli-plugin-electron-builder/guide/configuration.html#typescript-options)
UnityでDropDownの文字がぼやける問題

Unityにて`DropDown`オブジェクトの文字がぼやける問題が発生したので、直す方法の備忘録として記事に残す。

`DropDown`の文字のぼやけに関しては、全然いい感じの記事が無かったという理由もある。

## 文字がぼやける問題

結構前からDropDownの`Label`と言う名前のオブジェクト(選択したアイテムが表示されるところ)がすごくぼやける問題に悩まされていた。
![スクリーンショット 2022-04-25 135113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298601/d568a1d1-0cad-3eb9-53e4-09708fd0f499.png)

よくある文字がぼやける原因として、フォントサイズが小さいというものがあるが、今回私が使用したのは、16pxできれいに表示されるドット系(?)のフォントである。

他がきれいに表示されているから、こんなにぼやけるとさすがに目立つしより読みづらく感じてしまう...

## 解決法

「フォントをめっちゃ大きくしてスケールをめっちゃ小さくする」というのを結構見ることが多いが、今回は簡単な別の解決策が見つかったので紹介する。

`DropDown`の子オブジェクトの`Label`と言う名前のオブジェクトを見てみよう。
おそらく`Rect Transfrom`がこのような感じになっているだろう。

これを...
![スクリーンショット 2022-04-25 155009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298601/d52cc1d8-8036-9220-1632-5b9a39659c2a.png)
こうして見ると...
![スクリーンショット 2022-04-25 155036.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298601/7d488bdb-faaf-6b8a-67ad-3527bd4ed976.png)
`Pos X`と`Pos Y`が小数であることが分かる。これが文字がぼやける原因である。
四捨五入か切り捨てをして整数にすると、ぼやける問題は解決する。
![スクリーンショット 2022-04-25 155503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298601/ed387eeb-82f0-0e05-253b-7145c3d3f383.png)

## ちなみに

`Label`がぼやけすぎているため気づきにくいのだが、実はDropDownの選択肢の方も若干ぼやけていたりもする。
![スクリーンショット 2022-04-25 155600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298601/1b19c46a-3f05-261a-7265-0bbf417677fa.png)
これは
`DropDown`/`Template`/`Vireport`/`Content`/`Item`/`Item Label`の`Rect Transorm`が先ほどと同じように小数になっている可能性がある。
![スクリーンショット 2022-04-25 155721.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298601/3b119aa1-b0f2-04f4-9404-2f918305c4a9.png)
![スクリーンショット 2022-04-25 155745.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298601/fe6f4a39-ea73-c446-857c-39ba1ab31efe.png)
この場合は、`Pos Y`を`0`にすれば問題ない。

![スクリーンショット 2022-04-25 155832.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298601/b9587a1e-cb83-d07f-b648-22e007462248.png)

やったね！
【ServiceNow】スクリプトの入力支援機能

無くても良いけど、あると作業が捗る便利な機能である下記２点をご紹介します。
・[Syntax Editor Macro](#syntax-editor-macro)
・[コード整形](#コード整形)


## Syntax Editor Macro

Syntax Editor Macroとはよく使用する構文を自動で入力してくれる便利機能です。

例をお見せします。
①スクリプト入力欄に「vargr」と入力します。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/ed9a3598-3bba-3545-119d-36238d19159e.png)

➁tabキーを押下するとGlideRecordのquery構文が自動入力されました。
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/facad899-4035-a8d9-f996-20b14d253264.png)

とても便利ですね。
GlideRecordは良く使うAPIなので構文を記憶しているかたも多いと思いますが、この4行が自動入力されると作業効率がほんの少し上がるのではないでしょうか。

「vargr」の他にも標準で定義済のキーワードがあるので、気になる方は[製品ドキュメント](https://docs.servicenow.com/bundle/rome-application-development/page/script/general-scripting/concept/c_SyntaxEditor.html#r_SyntaxEditorMacros)を参照してみてください。



※製品ドキュメントでなくとも、下記手順で環境からも確認したり、新たに定義したりすることができます。
・システム定義 > シンタックスエディタマクロ　をクリック
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/445d285f-2671-66d2-7f5a-e6525c25c833.png)


## コード整形

続いてはコード整形についてご紹介します。

スクリプトを作成している皆さんはインデントを付けていると思いますが、一度ずれてしまうと修正がなかなか手間ですよね。

そういった手間を省くのにぴったりなショートカットキーがあります。
「**shift+tab**」です。

実際に動かしてみます。
①作成済のスクリプトのインデントを崩してみました。
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/b7656ab0-dcb5-34f6-7189-ae288f6d51b1.png)

➁直したい箇所を選択します。
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/583553a8-07a2-be21-8404-df9f373765cc.png)

③「**shift+tab**」を押します。
![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/1a7a8b5f-047f-de53-36d1-83ade0c96e7f.png)

一瞬で綺麗に整形されました！


## 終わりに
忙しい開発業務をほんの少し楽にしてくれる便利機能をご紹介しました。
また便利機能を見つけた際は記事にしたいと思います。

## 参考サイトまとめ
[製品ドキュメント - Syntax Editor Macro](https://docs.servicenow.com/bundle/quebec-application-development/page/script/general-scripting/concept/c_SyntaxEditor.html)
インフラエンジニアとは

## 概要
インフラエンジニアの仕事について、概要や知っておくべきことのまとめです。
インフラについて携わった事が無い方や、ITエンジニアなりたての方向けに出来るだけ簡単に説明しておりま3す。
インフラエンジニアについての他の記事は以下にまとめております。
- [インフラエンジニアの仕事について
](https://qiita.com/mj69/private/5441bf58ad574a1614da)

## 1. インフラとは
インフラはインフラストラクチャー(infrastructure)の略で、生活をするにおいて必要不可欠な基盤で道路、電車、電話、電気、水道などがあげられる。

## 2. インフラエンジニアとは
ITにおけるサーバ、OS、ネットワーク、ミドルウェア、セキュリティといった基盤部分となる領域を担当するのがインフラエンジニアである。
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/008b0dfa-1c29-c814-5a53-2c45d2419f07.png)
一口にインフラエンジニアといっても上記の通り、範囲が広いので全てを出来る人は少なく、サーバエンジニアやネットワークエンジニアなど担当が分かれる事が多い。

## 3. インフラエンジニアの仕事内容
### 3.1. 設計
システムを作る際に、一番大事な項目です。
どれくらいの規模のシステムなのか、どれくらいの費用が必要かを確認し必要なサーバやストレージ等の性能や台数を決めます。
インフラエンジニアではなく、プリセールス、ベンダー、コンサルタントが行う事もあります。

### 3.2.構築
設計が決まって機器が納品されたら、機器の設置から設定までを行います。
機器の設置はデータセンターに設置する場合と、お客様オフィス内に設置する場合があります。
機器のラックへの設置については専用のチーム(カスタマーエンジニア/CE)が行う場合が多いですが、インフラエンジニアが自ら機器を箱から取り出してラックに設置する場合もあります。
ラックへの設置が完了したら、サーバ/ストレージ/ネットワークスイッチ間の配線を行い動作確認を行います。
動作確認が完了したら、各機器への設定を行います。

### 3.3. 運用
構築が完了し稼働が開始したら、正常に稼働し続けられるように運用を行います。
システムの増築や更改によるサーバの入れ替えや設定変更、障害時の対応を行います。

これは構築を行ったエンジニアとは別で運用担当が行うことが多く、大規模なシステムであればインフラは基本的に24時間365日(通称24365)稼働することから、交代制のシフトを組んで監視します。

データセンターへ設置している場合は、データセンターの運用チームにてハードウェアに異常が無いか依頼が可能ですが、自社内にサーバを設置している場合は24時間誰かが待機するという事はせずにZabbix等の監視システムを導入し、サーバやストレージに異常があった際に自動でメールなどの連絡がいくようにすることが多いです。

![server-monitoring.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/f720742c-cc08-413a-d579-eb6f0cba6db5.png)
#### 3.3.1. 障害対応
運用時に障害が発生した場合は原因に応じて対応を行います。
ハードウェアの故障であれば、修理依頼。急激なアクセス増加であれば原因の調査や対応等があります。

#### 3.3.2. インフラ起因でない原因
システムに繋がらないなど、障害が発生してインフラ担当に連絡が来た場合、サーバやハードウェアに問題が無くアプリケーションのバグや設定ミスなどインフラ起因でない場合があります。
その場合は、対応可能な担当部署へ連絡を行い対応を要請します。
移設後EC-CUBE管理画面にログインできない件

FTPでファイルアップロード後、管理画面表示まで成功

![スクリーンショット 2022-04-25 15.50.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/c73144d8-ab3b-15e0-340f-0a245da6857e.png)

ID、パスワード合ってるのに入力して「ログイン」クリックすると、同じ画面にリダイレクトしてしまう
データベース`dtb_member`でログイン情報確認するも合っている

# 原因
EC-CUBE root以下のファイルオーナーが「root:root」だった
「apache:apache」に変更しログインできた
Windows10サポート終了までに長期での準備がお勧め！

![timeover.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633992/f65d4724-7b7b-9f56-3eae-50424cbed6bd.jpeg)

Windows7は、2020年1月14日にサポート終了。
Windows8.1は、2023年1月10日に終了となります。

その次のサポート切れは「Windows10」。
2025年10月14日にサポートが終了し、以降はマイクロソフトよりセキュリティ更新プログラムの提供が行われなくなり、不具合や脆弱性についての修正プログラムが提供されなくなります。

サポートが終了するOSを使い続けると、脆弱性を悪用した攻撃による情報漏えいや意図しないサービス停止等の被害が発生する可能性が高くなります。
また、セキュリティの脅威は日々深刻化しており、攻撃手法も変化を続けています。
そのため、サポートが終了しているOSを利用している場合は、後継とOSへ移行することをお勧めします。


## 新しいWindows・サービスパックほどマルウェア感染率が低い

また、調査結果からより新しいWindows・サービスパックほどマルウェア[^1]感染率は低いこともわかっています。
一例として、Windows8の感染率は、なんとWindows XP SP3と比較して14分の1となっています。

## Windows10のサポート切れに伴うWindows11への移行に注意！
Windows10のサポート切れに伴い、Windows11への移行することになりますが、Windows10までの移行と同じように対応ができると考えていると、後で移行する際に、多大な労力と費用が必要になってきてしまいます。
Windows10へのアップグレードは、Windows7が搭載されているパソコンをそのままOSのアップグレードで利用することができていましたが、Windows11へのアップグレードは同様の対応ではアップグレードできないケースが多く発生することになります。

Windows11は、Windows11に対応しているパソコンのCPUでなければ、動作しない仕様になっています。
つまり、Windows10搭載のパソコンのCPUが、Windows11に対応していなければ、Windows11へのアップグレードができないということになります。

新たなパソコンを導入される際には、ぜひWindows11対応のCPUを搭載したパソコンを選定してから導入することをお勧め致します。
また、現在導入済みのパソコンがWindows11対応のCPUを搭載しているかも事前にWindowsの「システム」→「デバイスの仕様」を見て、「プロセッサ」に書いてあるCPUの型番をチェックしておくことをお勧めします。

- **Windows11でサポートされているCPU**
    - [Windows 11 でサポートされている Intel プロセッサ](https://docs.microsoft.com/ja-jp/windows-hardware/design/minimum/supported/windows-11-supported-intel-processors)
    - [Windows 11 でサポートされている AMD プロセッサ](https://docs.microsoft.com/ja-jp/windows-hardware/design/minimum/supported/windows-11-supported-amd-processors)
    - [Windows 11 でサポートされている Qualcomm プロセッサ](https://docs.microsoft.com/ja-jp/windows-hardware/design/minimum/supported/windows-11-supported-qualcomm-processors)


[^1]: マルウェア(Malware)とは、不正かつ有害な動作を行う意図で作成された悪意のあるソフトウェアや悪質なコードのことです。例）ウイルス、ワーム、トロイの木馬、スパイウェア、キーロガー、バックドア、ボットなど

https://www.esprit-fort.co.jp/

https://www.esprit-fort.co.jp/recruit/
Rubyでスマートに+09:00を出したかった

皆さんはアプリケーション開発中に、タイムゾーンを意識することはどれくらいあるでしょうか？

普段の開発だと、一度設定してしまえば中々意識しにくいものですが、たまたま今回こちらに関して触る機会があったので記事にすることにしました。

## 今回やりたかったこと
UTCからの時差を`+09:00`のような、`±xx:yy`(xxが時間、yyが分)の形式で取得することです。
というのも、Elasticsearchに時差を考慮した日程の絞り込み検索を行いたい、と考えていました。
Elasticsearchでcreated_atが２０２２年4月のドキュメントを探したい、という場合以下のような絞り込みを行います(下記はクエリの一部を抜粋)。


```json
{"filter":{"range":{"created_at":{"gte":"2022-04-01","lt":"2022-05-01"}}}
```

しかし、これではタイムゾーンが何も配慮していないため、時間の絞り込みはUTC基準で行われ、日本時間だと9時間ずれてしまいます。
この場合、そもそもcreated_atを9時間ずらして入れるか、time_zoneを下記のように指定する形を取ります。

```json
{"filter":{"range":{"created_at":{"gte":"2022-04-01","lt":"2022-05-01","time_zone":"+09:00"}}}
```

今回は後者の、time_zoneを指定する方法を取ることにしました。

現在、rubyでパラメーターを作成し、それをFaradayで投げることで検索結果を受け取っているので、rubyでタイムゾーンの取得が必要になったというわけです。

## 方法1. strftimeを使って現在時間からタイムゾーンのみをパースする
パッと思いついたのは、strftimeメソッドを使ったもので、以下のようなものです。

```ruby
Time.zone.now.strftime("%:z") 
# => "+09:00"
```

Time.zoneでアプリケーションのタイムゾーンを取得（今回は`Tokyo`）し、今の時間をタイムゾーンのみパースすることで時差を取得します。
フォーマットも、`%:z`をつかうことで、`±xx:yy`の形式で獲得することができます。

しかし、ここで一つ思いました。思ってしまいました。
**現在時間取得する意味なくない？** と。

Time.zoneまではいいとして、問題はnowメソッド。実行時間としては大してかからないものの、現在時刻は取得する必要はないので、削れるなら削ってしまいたい。

これくらいなら自作してもいいけど、今回は作る以外でいい感じに取得する方法はないか調査してみることにしました。

## 方法2. seconds_to_utc_offsetメソッドを使う
source_locationなどを使って、メソッドを調べていたところ、ちょうど求めていたメソッドを見つけました。
それが、`ActiveSupport::TimeZone.seconds_to_utc_offset`です。

```ruby
# Time.zone.utc_offset => 32400
ActiveSupport::TimeZone.seconds_to_utc_offset(Time.zone.utc_offset)
# => "+09:00"
```

上記では`Time.zone.offset`メソッドで、UTCからの時差を秒数で取得し、それを元にUTCからの時差を整形して出力しています。
[実装](https://github.com/rails/rails/blob/de53ba56cab69fb9707785a397a59ac4aaee9d6f/activesupport/lib/active_support/values/time_zone.rb#L197)を見ればわかるのですが、かなり素朴な実装なので、どう処理をしてるのか理解してしまえば自分で実装してしまうのも良さそうです。

## 探してみて
今回の用途であれば自前で作るのも簡単なので、エイッと作っても良かったのですが、調べてみて良かったことが2つほどあります。

一つはTimeオブジェクトへの理解が深まったこと。普段何気なしに使っているものですが、あえて調べてみることで知らない関数なども知ることができ、今後の実装にも行かせそうです。

もう一つは多くのユーザーが使っている、洗練された実装を見ることで **あっ、ここでこのメソッドを使うのか！** という学びを得られたことです。
今回の`ActiveSupport::TimeZone.seconds_to_utc_offset`でも、abs(実数の絶対値を取るメソッド)を使った実装で記述を短く、そして分かりやすくできており、何も見ずに自前で作った場合はめんどくさい分岐を書いていたような気がします。

普段、中々公式ドキュメントを読むことは多くありますが、実際の実装を見に行くのは不具合でもないと中々ないような気がします。
しかし、たまにはこの実装どうなってるんだろう？と興味を持って見に行くのも良さそうですね。
[記事紹介] なりすましやPhishing対策としてのPlus Addressingのススメ

@qualitia_cdevの中の一人、@hirachanさんが書いた記事をみなさまにご紹介します。

### なりすましやPhishing対策としてのPlus Addressingのススメ
https://qiita.com/hirachan/items/c8dbf0f8b1ad2eac08e6
VRChatのPhysBonesで小物が揺れない対策方法

＝＝＝＝＝2022年04月27日追記＝＝＝＝＝
最新SDKでVRChat公式がサポートしたそうです。嬉しい。最新のAvator3.0をダウンロードして上書きインポートしてください。
＝＝＝＝＝2022年04月27日追記＝＝＝＝＝
Pimaxのサポートとのやりとりで、PiTool（Pimaxの起動用ソフト）のキャッシュフォルダを削除しPiToolを再度インストールすることで動作致しました。
HTC VIVE、VALVE INDEX、Pimax 8K Plusで動作確認済みです。
＝＝＝＝＝2022年04月26日追記＝＝＝＝＝
【注意】状況によって挙動がおかしくなることが確認されたので報告を明記します。

・うちで起きたこと
しゃがむと世界がグルグル回る。USB系、HMD系のハードは問題無し。

・推論
Boneの間に挟んだCubeのコライダ等が一定条件で干渉するのでは？と思われます。
2022年04月26日のVRhatアプリ及びVRCSDK3-AVATAR-2022.04.21.03.29_Public.unitypackageにおいて。

・追記
Pimax 8K Plusを使用していますが、このHMDの場合しゃがみ姿勢で髪を触っても世界がくるくる回ることが分かりました。
HTC VIVEで試したところ発生しません。
したがって、とりあえず下記方法はPimax以外では使えるのではと思われます。Pimaxへ問い合わせていますので、判り次第再度追記致します。
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝



負荷軽減のためかVRChatで新たにリリースされたPhysBonesでは、ある程度小さいものは揺れない仕様になっています。
アバターのピアスやネックレス等は設定が正しくても揺れない場合があります。

これを解決するのに若干悩みました（判るのに実は1日掛かったｗ）。要は大きければ良いので、揺らしたい階層に大きな3Dオブジェクトを挟んで透明にしてやれば解決します。

揺れないピアスに対してXYZそれぞれのスケールを0.1にしたCubeを透明にして挟んでいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201026/76fee41b-2962-36f7-be8a-c73f834d098f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201026/1d1d8410-c415-e947-f5e8-03f793168ace.png)

これでDynamicBone時代と同じように揺れるようになりました。

小物が揺れなくてお悩みの方ぜひどうぞ。
ロジスティック写像の紹介

今回は、非線形の数理モデルであるロジスティック写像について紹介します。
続編：[初期値鋭敏性について(ロジスティック写像)](https://qiita.com/reser_ml_memo/items/9ff1af90c3abaf038a11)

ロジスティック写像は以下の漸化式のような形で表されます。

　　　　　　　　　　　$x_{n+1} = a x_{n}(1-x_{n})$

ロジスティック写像は、「低次元離散力学系」です。
また、実装が簡単かつカオスと呼ばれる現象を確認できるので、個人的に好きな数理モデルです。

実際に実装していきます。ここではlogisticという関数を定義します。
生成したいデータ数(時系列)を$n$, 初期値を$x_0$, ロジスティック写像のパラメータ$a$の3つを引数としています。
戻り値は、ロジスティック写像のデータ(時系列)が入った配列です。
```
import numpy as np
import matplotlib.pyplot as plt

def logistic(n,x_0,a):
    
    # 値を格納する
    x = np.zeros(n)

    # 初期値を設定
    x[0] = x_0

    for i in range(n-1):
        x[i+1] = a*x[i]*(1-x[i])
        
    return x
```
実際に$a=4$の場合のロジスティック写像を確認してみます。
```
# n=30, x_0=0.1, a=4 の時
x = logistic(30, 0.1, 4) #ロジスティック写像のデータを生成
plt.plot(x,marker="o") #プロット
plt.title("Logistic map") #タイトル付け
plt.xlabel("n") #x軸のラベルを指定
plt.ylabel("x") #y軸のラベルを指定
plt.show()
```
結果は以下のようになります。不規則な動きをしているのが確認できます。
![logistic_a4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594605/36d3aea7-c426-2f63-1a0f-ba29b9bad753.png)

ここで、パラメータ$a=3.3$に変更してロジスティック写像の動きを確認したいと思います。
![logistic_a33_n100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594605/9703231b-af5c-46bb-fa13-036c0b759ca1.png)

$a=4$の時は非周期な動きをしていましたが、$a=3.3$は、途中から周期的な動きをしていることがわかります。

今回は$a$の値を変えましたが、初期値の値を変えることでまた違った動きが確認できます。色々試してみてください。
(＊)ちなみに初期値$x_{0}=0$の時は、パラメータ$a$をどんな値にしても$x_{n}=0$になります。

次回は、カオス力学系の特徴の一つである"初期値鋭敏性"について紹介したいと思います。
続編：[初期値鋭敏性について(ロジスティック写像)](https://qiita.com/reser_ml_memo/items/9ff1af90c3abaf038a11)
MediaConvert の API 呼び出しに利用するリージョン固有エンドポイントの仕様

# はじめに

AWS MediaConvert の API を呼び出す場合、一般的に用意されている public なエンドポイントを使うのでなく、MediaConvert が用意しているエンドポイントを利用する必要がある。
その方法としては `describe-endpoints` でアカウント固有のエンドポイントを取得してきて利用する方法が紹介されている。

```python:boto3を利用した例
# MediaConvert の public endpoint を使ってアカウント固有のエンドポイントを取得
endpoints = boto3.client(
    'mediaconvert').describe_endpoints().get('Endpoints')

# 取得した固有のエンドポイントから API 利用を行う client を取得
client = boto3.client('mediaconvert', endpoint_url=endpoints[0]['Url'])
```

しかし、この `DescribeEndpoints` はかなり API Limit の制限が強い。 言い換えると、プログラム実行の都度に呼び出すと簡単に `TooManyRequestsException` などが発生してしまう。 そのため、ハードコーディングをするなどしたい。

しかし、わざわざ API で呼び出してエンドポイントを取得する、ということは、この API で得られた結果が変動する可能性も考えられる。 そのため、ハードコーディングが可能であるか否かを調査した。


# 結論

**ハードコーディング可能。 １度 API エンドポイントが作成された後は、アカウントのリージョン単位で固定される**。

> With most AWS services, you send your service request to a public endpoint. But with MediaConvert, you request an endpoint that is specific to your Region, and then you send your service requests to that. For information about MediaConvert FIPS endpoints, see FIPS Endpoints.
> 
> Note
> **This endpoint is specific to your AWS Region and won't change. Request this endpoint once, and then hardcode or cache it.**

https://docs.aws.amazon.com/mediaconvert/latest/apireference/custom-endpoints.html