OmniAICreator/Qiita-1.07M huggingface dataset:
【リフレッシュトークンの存在意義】

## トークン認証において、リフレッシュトークンの存在意義について

認証の学習やらを進めてると、
アクセストークンやらリフレッシュトークンという単語がよく出てきます。

アクセストークンの有効期限が1時間くらいと短いので、
切れた際にリフレッシュトークンを送信して
両トークンの再発行に使用されます。

じゃあ最初からアクセストークンの有効期限長く設定すれば？？？
どゆこと？意味あるか？
とこんなところから気になり学習しました。

**結論から言うと意味あります**


## アクセストークン認証の流れ
- ユーザーがログインした際に、アプリケーションがアクセストークンを発行
- アクセストークンを保持
- 都度、エンドポイントにアクセスする際にはリクエストヘッダにアクセストークンをつけて送信
- アプリケーションはアクセストークンを認証して、成功すればレスポンス
- アクセストークンの有効期限が切れれば、再びログイン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895655/0f51b0f5-5527-fa7e-42bc-f8a349e9c292.png)


## リフレッシュトークンを使用した場合
- ユーザーがログインした際に、アプリケーションがアクセストークンを発行
- アクセストークンを保持
- 都度、エンドポイントにアクセスする際にはリクエストヘッダにアクセストークンをつけて送信
- アプリケーションはアクセストークンを認証して、成功すればレスポンス
- アクセストークンの有効期限が切れれば、再びログイン（ID,パスワード）ではなく
- トークン再取得のエンドポイントにリフレッシュトークンを送信
- アプリケーションはリフレッシュトークンを受け取り、ユーザーに紐付いたリフレッシュトークンと一致しているか確認し、認証に成功したらトークンを再発行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895655/fa4a9f99-abfa-c44b-3c32-cc79f015cc0e.png)

## まとめ
存在意義は、セキュリティを向上することにあります。

**アクセストークンの特徴**
- 有効期限が短いため、盗難された場合でも限定された期間しか使用不可
- アクセスする都度、サーバーに送信されるため盗難の可能性が比較的高い

**リフレッシュトークンの特徴**
- 有効期限が切れて両トークンの再発行をする際にのみサーバーに送信される
- 認可サーバーのみが保持するのでアクセストークンより盗難の可能性は低い

まとめると、何度も送信されるため盗聴される可能性の高いアクセストークンを、
その可能性の低いリフレッシュトークンを使用して定期的に更新します。
VMware Fusionのダウンロード方法まとめ

# VMware Fusion ダウンロード方法まとめ

VMware Fusionのダウンロード方法について、最新の手順をまとめました。
以前とはやり方が変わったようです。

## 1. 公式ウェブサイトにアクセス

まず、VMwareの公式ウェブサイトにアクセスします。
[VMware Fusion ダウンロードページ](https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion)

## 2. ダウンロードボタンをクリック

ページ内の「VMware Fusion Pro for Mac」のセクションを探し、「DOWNLOAD NOW」をクリックします。

## 3. Broadcomのログイン画面にリダイレクトされる

ダウンロードリンクをクリックすると、Broadcomのログイン画面にリダイレクトされます。（アカウントを持っていなければ）以下の手順に従ってアカウントを作成してください。

### アカウント作成手順

1. 右上の[LOGIN]をクリックし、続けて[REGISTER]をクリックします。
2. **Gmailでははじかれてしまいました**ので、他のメールアドレス（プロバイダーや企業ドメインのメールなど）を用意してください。
3. 必要な情報を入力して登録を完了します。

## 4. ダウンロードページへ移動

登録後、以下のリンクからダウンロードページにアクセスします。

- [Broadcom サポートページ](https://support.broadcom.com/group/ecx/all-products)
- [Broadcom ナレッジベース記事](https://knowledge.broadcom.com/external/article?articleNumber=315638)
- [製品ダウンロードページ](https://support.broadcom.com/group/ecx/productdownloads?subfamily=VMware%20Fusion)

## 5. 利用規約に同意してダウンロード

ダウンロードページで、

- **"I agree to the Terms and Conditions"** にチェックを入れます。
- 再度「ダウンロード」ボタンを押下します。

その後、住所や連絡先情報の入力が必要になる場合がありますので、指示に従ってください。

## 6. インストール

1. ダウンロードが完了したら、取得したインストールファイルをダブルクリックします。
2. 画面の指示に従い、インストールを進めます。
GCP：Cloud IAP + App Engineで実現する高度なアクセス制御

# GCP：Cloud IAP + App Engineで実現する高度なアクセス制御

## はじめに
本記事では、Google Cloud PlatformのCloud Identity-Aware Proxy (IAP)とApp Engineを使用して、これらをApp Engineへの認証と接続元IPアドレスの両方による制御方法を検証します。

## 実装のメリット

1. **2段階のセキュリティ**：認証とIPアドレスによる二重の防御
2. **柔軟な制御**：組織の要件に応じて細かな設定が可能
3. **集中管理**：GCPの統合管理コンソールで一元的に制御

App Engineファイアウォールとの違い

https://qiita.com/___knm___/items/b69f3158652119c87d95

## 環境構築と検証ステップ
### 前提
- App Engineのサービスが作成されていること
- Identity-Aware Proxyを有効化していること
- 組織レベルでAccess Context Managerの権限が付与されていること

### 1. Cloud IAPの基本設定
まず、App EngineアプリケーションにCloud IAPを有効化し、特定のGoogleアカウントにアクセス権限を付与します。この時点で、許可されたユーザーのみがアプリケーションにアクセスできる状態となります。

### 2. Access Context Managerの設定
組織レベルでのアクセス制御を実現するため、Access Context Managerでアクセスレベルを設定します。

- アクセスレベルの作成
Access Context Managerでアクセスレベルを作成します。
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/9c7bbc17-96e3-f56f-a13d-ff80e1928290.png)

許可するIPアドレスを追加して保存します。
![image7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/b199ce7b-0108-47ad-b70e-7c70a03b2f8f.png)


### 3. IAPとアクセスレベルの連携
作成したアクセスレベルをCloud IAPに適用します。これにより以下が有効になります。
- Googleアカウントによる認証
- 指定したIPアドレスからのアクセス制限の2段階の制御が有効

Identity-Aware Proxyの画面に移動し、「App Engineアプリ」をクリックします。
![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/3bdf6a73-0b06-2282-79a3-b7be1ae0b2c7.png)

アクセスを許可するユーザーを選び、「ロール」に「lAP-secured Web App User」、「アクセスレベル」に作成したアクセスレベルを選択します。
![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/4374747f-626b-7186-9cbe-747c7ae9f0f3.png)


### 接続テスト
App Engineのサービス画面でサービスに接続します。
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/93dcac9b-a3b1-21ff-c5a8-724af161e2ea.png)

許可されたGoogleアカウント + 許可されたIPの場合、アクセス成功します。
![image9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/03d755f1-6ed1-7f85-b322-d720c408e53a.png)

権限を削除したGoogleアカウント + 許可されたIPの場合、アクセス失敗しました。
![image8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/b792fd83-41a0-4710-6bc2-3614e1f84a2b.png)

許可されたGoogleアカウント + 未許可のIPの場合はアクセス失敗しました。
![image8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/b792fd83-41a0-4710-6bc2-3614e1f84a2b.png)

権限を削除したGoogleアカウント + 未許可のIPの場合はアクセス失敗しました。
![image8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/b792fd83-41a0-4710-6bc2-3614e1f84a2b.png)


## まとめ
Cloud IAPとApp Engineの組み合わせにより、強固なアクセス制御を実現できることが確認できました。参考になれば幸いです！
Stripe初心者が知っておきたいStripe用語集（図あり）

# 概要
実装を経て理解が深まったので、Stripeの用語をまとめおきます。

# 対象者
- StripeAPIで開発を始めようとしている
- Stripeの用語をさらっと知りたい

# 紹介する用語
- Customers（[Stripe Customers API](https://docs.stripe.com/api/customers)）
- Coupon（[Stripe Coupon API](https://docs.stripe.com/api/coupons)）
- Products（[Stripe Products API](https://docs.stripe.com/api/products)）
- Prices（[Stripe Prices API](https://docs.stripe.com/api/prices)）
- Subscriptions（[Stripe Subscriptions API](https://docs.stripe.com/api/subscriptions)）
- SubscriptionItems（[Stripe SubscriptionItems API](https://docs.stripe.com/api/subscription_items)）

# Customers
- 顧客は、Userを作る時に同時作成しておいて良いぐらい必要性が高いです。
- 価格を管理するIDプレフィックス「**cus_xxxxxxxx**」で管理されます。

# Coupon
- クーポンは、発行時に「どの商品にどんな割引をするか。」を決めます。
- クーポンは、顧客に紐づけて顧客に適用します。
- クーポンを管理するIDは、自動採番もしくは自分で付けることが出来ます。

## CustomersとCouponの関係
- 現在の認識では、クーポンはカスタマーに1つしか紐づけ出来ません。
### 1対1
![stripe.customer.coupon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158349/d08550e8-3ec3-e3cc-4caf-0b4427027575.png)

# Products
- 商品カタログは、商品です。
- 商品カタログは、Pricesを配下に持つため商品カタログの下に複数のPricesがあることがあり得ます。
- 商品カタログを管理するIDプレフィックス「**prod_xxxxxxxx**」で管理されます。

## Prices
- 価格は、商品カタログの配下です。商品カタログがなくて、価格があるは起きません。
- 価格を管理するIDプレフィックス「**price_xxxxxxxx**」で管理されます。
- 実装時は「prod_xxxxxxxx」よりも「**price_xxxxxxxx**」を指定してサブスクリプションを作成しました。

## ProductsとPricesの関係
- 1対1、1対多 どちらも有り得ます。
### 1対1
![stripe.products.price.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158349/5abf27f0-058c-8df2-6c34-f5ad3d0353cb.png)

### 1対多
![stripe.prodcuts_prices.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158349/3c02c3e1-e168-f6dc-347c-fa0af768588d.png)

# Subscriptions
- サブスクリプションは、主に**課金周期**を管理します。
- サブスクリプションを管理するIDプレフィックス「**sub_xxxxxxxx**」で管理され、
    サブスクリプションの開始・終了に合わせて作成・削除されます。
- 「サブスクリプション = 課金周期」のイメージで頭に置いてます。

## SubscriptionItems
- サブスクリプションアイテムは、Products配下のPricesを基に生成されます。
- サブスクリプションを作成する時にPricesを紐づける時、名前が変わるイメージです。
- サブスクリプションアイテムを管理するIDプレフィックス「**si_xxxxxxxx**」で管理され、サブスクリプションアイテムの「数量を変える・削除する」などをすることで課金周期を変更せずに定期的な課金を続けることが出来ます。
- 「サブスクリプションアイテム = 契約内容」のイメージで頭に置いてます。

## SubscriptionsとSubscriptionItemsの関係
- サブスクリプションの中に、サブスクリプションアイテムが配置されます。逆はありません。
- サブスクリプションを解約すると、中のサブスクリプションアイテムを指定せずとも紐づいているすべてのサブスクリプションアイテムが解約となります。

### 1対1
![subscription_subitem.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158349/87151e12-394c-d981-ba75-cd882cd2f0bb.png)

### 1対多
![subscription.subscriptionitems.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158349/c68ba96f-e4cc-85c8-5e6d-322e08a71f16.png)

# 例
- 顧客にクーポンとサブスクリプション2つ。
- サブスクリプションの中身は、1対1と1対多

![stripe.example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158349/94c614b1-33c4-0200-22b2-2da32099c3f2.png)

# 一言
- StripeのTaxIDには気をつけなはれや。
仮想マシンを作ろう！　MariDBインストール編②

## ■MariDB基本
>yum install -y mariadb-server mariadb mariadb-devel
systemctl start mariadb
systemctl status mariadb
ps -aux | grep mysqld
systemctl enable mariadb
systemctl is-enabled mariadb

>mysql
create database [databasename];
create user '[username]'@'localhost' identified by '[password]';
grant all on [databasename].* to [username]@localhost;
quit

### 入力するもの

>DB_NAME
WordPressが接続しているデータベースの名前（DB名）

>DB_USER
データベースユーザー名（DBユーザー名）

>DB_PASSWORD
データベースユーザーが、データベースに接続するためのパスワード

>https://api.wordpress.org/secret-key/1.1/salt/
で
自動生成しそれをコピー＆ペーストして利用した
仮想マシンを作ろう！　PHPインストール編②

## ■php
>１epel-relese インストール
２remi レポジトリを追加
３PHP をインストール

１
>yum repolist
rpm -qa epel-release
yum list epel-release
yum list epel-release
yum install epel-release
rpm -qa epel-release
yum list installed epel-release
yum repolist

２
>rpm -qa | grep remi-release
rpm -qa | grep epel-release
yum install http://rpms.famillecollet.com/enterprise/remi-release-8.rpm
rpm -qa | grep remi-release
yum list remi-release
yum repolist | grep remi

３
>php -v
rpm -qa | grep php
rpm -qa | grep remi-release
yum --enablerepo=remi-php83 install php
rpm -qa | grep php
php -v

#### その他
>yum list epel-releaseの代わりに
EPELリポジトリ追加でもよい
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

>EPELリポジトリを追加したのでRemiリポジトリ追加できるようになるので、このコマンドでもよい
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-8.rpm
仮想マシンを作ろう！　※ミラーサイトサポート切れエラー

# ■基本
>cat /etc/redhat-release
バージョン確認

>以下のファイルを①と②を修正
vi /etc/yum.repos.d/CentOS-Base.repo

>①参照先のリポジトリをミラーサイトがサポート切れのためミラーサイトはコメントアウトして、別のサイトを指定した
　①[base]mirrorlistをコメントアウト
　②baseurl=https://ftp.jaist.ac.jp/pub/Linux/CentOS-vault/7.8.2003/os/$basearch/

>http://ftp.jaist.ac.jp/pub/Linux/CentOS/　にアクセス
親ディレクトリ>CentOS-Vault>バージョン

>②[updates]enabled=0を追加
　[extras]enabled=0を追加
　この二つの所は参照しないようにするためenable=0を追加した

 ### 完了
仮想マシンを作ろう！　MariaDBインストール編

## MariaDBインストール
```
dnf install -y mariadb-server mariadb mariadb-devel
systemctl start mariadb
systemctl status mariadb
ps -aux | grep mysqld
systemctl enable mariadb
systemctl is-enabled mariadb
```
```
mysql
# mysql
MariaDB [(none)]> create database wordpress default character set utf8;
wordpressというデータベース
show databases;
MariaDB [(none)]> grant all on wordpress.* to wordpress@localhost identified by 'password';
wordpressというユーザー
passwordというパスワード
MariaDB [(none)]> flush privileges;
```
```C:Wp-config.phpの設定
cd /var/www/html/wordpress
cp wp-config-sample.php wp-config.php
このコマンドでconfigファイルのsampleをコピーして、コピーした方をエディタで編集していきます。
vim wp-config.php
```
```
DB_NAME
WordPressが接続しているデータベースの名前（DB名）

DB_USER
データベースユーザー名（DBユーザー名）

DB_PASSWORD
データベースユーザーが、データベースに接続するためのパスワード

https://api.wordpress.org/secret-key/1.1/salt/
で
自動生成しそれをコピー＆ペーストして利用した
```

#### エラーたち
#### データベース接続確立エラー
>ホストOSのブラウザでゲストOSを表示させたいが、エラーが出た
　以下のサイトで、自動生成しそれをコピー＆ペーストして利用し解決
https://api.wordpress.org/secret-key/1.1/salt/

#### Requires: pvエラー
>以下のコマンドで解決(EPELリポジトリを有効にしたらインストールできた)
>yum install epel-release
yum update
yum install MariaDB-server MariaDB-client

#### MariDBをインストールできないエラー
>https://downloads.mariadb.org/mariadb/repositories/
にて
Choose a Distro→Choose a Release→Choose a Version
CentOS7
11.4
選択

>vi /etc/yum.repos.d/mariadb.repo
エディタにて先ほどのコピーしたものを貼り付けて保存します。

>最下行にenable=1を追加します。
ここではレポジトリを有効にするために指定しています。

>yum update

>vi /etc/yum.repos.d/CentOS-Base.repo　編集

>yum install https://dl.fedoraproject.org/pub/archive/epel/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm -y
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum -y install wget
yum -y install MariaDB-server
yum -y install MariaDB-devel MariaDB-client MariaDB-server
systemctl start mariadb

#### centos8へyum/dnfエラー
>/etc/yum.repos.d/CentOS*repoファイルの
CentOS-Stream-AppStream.repo
CentOS-Stream-BaseOS.repo
CentOS-Stream-Extras.repo
を以下2点編集すること
・mirrorlist~~　をコメントアウト
・baseurl=http://vault.centos.org/$contentdir/$releasever/BaseOS/$basearch/os/
　と書き換え
->サポート切れでミラーサイトが停止したため
Mac:ドックに入れたアイコンをクリックして Julia を起動する方法

Dock から Julia を起動する .app ファイルの作成

1. Automator を使って新しいアプリを作成する
    1. Finder で アプリケーション フォルダを開き、Automator を起動する
    1. 新規書類 を選択し、「アプリケーション」を選ぶ
    1. 左側の「ユーティリティ」から「シェルスクリプトを実行」をドラッグして右側に配置する
    1. スクリプト内容を以下に変更する
　　　`#!/bin/bash`
　　　`open -a Terminal /Users/foo/.juliaup/bin/julia`
　　　　　重要: foo を実際のユーザー名に置き換えてください。
　　　　　（例: ユーザー名が myuser の場合、/Users/myuser/.juliaup/bin/julia）
    1. 上部の「シェル」で zsh または bash を選ぶ（普段使っているシェルに合わせると良い）
    1. 保存:
        - 「ファイル」→「保存」を選択し、アプリケーションの名前を「Julia」などに設定する
        - 保存先は「アプリケーション」フォルダを選ぶ

1. 動作確認
	1.	Finder で「アプリケーション」フォルダを開き、作成した「Julia」アプリをダブルクリックする
	2.	ターミナルが開いて Julia が起動するか確認する

1. Dock に追加
	1.	Finder で作成した「Julia」アプリを探す
	2.	そのアイコンをドラッグして Dock に追加する

1. おまけ -- カスタムアイコンを追加する方法

Dock に表示されるアイコンをカスタマイズしたい場合は、次の手順で行える
    1. Julia の公式ロゴ画像を用意する（PNG 推奨）
    2. Finder で「情報を見る（Command + I）」を選択し、上部のアイコンに画像をドラッグして設定する
テスト環境を作ろう！　wordpressインストール編

## WordPressのインストール
```
dnf -y install wget
cd /var/www/html
wget https://ja.wordpress.org/latest-ja.tar.gz
tar xvf latest-ja.tar.gz
chown -R apache:apache .
```

それか
```
yum -y install wget
cd /var/www/html
wget https://ja.wordpress.org/latest-ja.tar.gz
tar xvf latest-ja.tar.gz
chown -R apache:apache .
```

備考
>
```C:wordpressの初期設定
webブラウザで localhost/wordpress/ にアクセスしてwordpressの初期設定を行います。
ユーザ名
wordpress
パスワード
******
メールアドレス
*******
インストール
```

次はデータベースのMariaDBをインストール！
超簡易版Facemashを作ってみた

## はじめに

- 作ったもの
    - Linkedinの顔写真データを用いて、その顔写真が好ましいかどうかを判定するアプリケーション
- 動機
    - gcpを自由に使える環境があったので、サクッと何かを作ってみたかった
    - 顔写真の評価データを保持しておけば、将来的に何かに使えるのでは？

インフラ構成の判断軸などをメモしておくための備忘録


## 構成
### 全体構成図
まずはざっくり全体の構成図を。
```
Cloud Storage ➔ CloudSQL(画像URLの保存およびCSVデータの読み込み)
ユーザ ⇄ Firebase Hosting（フロントエンド）
Firebase Authenticationで認証し、トークン管理
フロントエンドから比較APIサーバ(Cloud Run)へリクエスト
Cloud Run（APIサーバー） ⇄ CloudSQL（データ管理）
```

処理の流れ
- Cloud StorageでCSVファイルをアップロードし、画像のid, group_id, URLデータをcloud sqlにインポート
- Firestoreにユーザ情報を保存し、各ユーザが行った評価結果をcloud sqlに保持
- Firebase Hostingでフロントエンドアプリをホスティングし、Firebase Authenticationを用いた認証と連携
- Cloud RunにバックエンドAPIをデプロイし、画像の評価結果保存

### ログイン方法
Firebase Authentication

### データ保持方法
ユーザ情報や顔写真評価結果のデータを保存するため、以下のデータベースを使用。

- Google Cloud SQL
    - ユーザのログイン情報や、ユーザがその画像をgood/badどちらを選んだか、を保持しておく
- Cloud Storage
    - CSVファイルを管理するために使用。linkedinから取得したcsvを設置し、cloud sqlにインポート
- BigQuery
    - 将来的にsqlに保存された評価データをもとに画像の評価を学習させる際に用いる

### アプリケーションの配信方法
- フロントエンド
    - ユーザインターフェースはWebベースのシングルページアプリケーション（SPA）として開発し、Firebase Hostingでホスティング
- バックエンド
    - 評価ロジックやデータ管理のためにバックエンドAPIを構築し、Cloud Runでコンテナ化してデプロイ

#### その他の選択肢
- フロントエンド
    - Cloud Storage + Cloud CDN
        - 静的ファイルの配信には適しているが、アプリケーションには向かなそう
    - App Engine
        - SSRが必要な場合に適しているが、今回はそこまで複雑なアプリケーションではない
- バックエンド -> どれも重すぎる
    - App Engine
        - コンテナを使わずに動的アプリケーションをデプロイできるPaaS
    - Compute Engine
        - VMインスタンス上でアプリを実行するIaaS
    - Google Kubernetes Engine (GKE)
        - Kubernetesクラスターを用いて複数のコンテナをオーケストレーションするためのプラットフォーム
JMeterでWebSocket通信

# 概要
負荷テストのためのツール検証を実施していた際、JMeterでWebSocket通信ができるか検証した結果をまとめました。

# 環境
検証では、JMeterのバージョン5.6.3を利用しました。  
通信先はMattermostコンテナを利用しています。環境構築手順は以下の記事を参照してください。  

https://qiita.com/myama0827/items/957039d65604cc15946b


# 検証手順
## WebSocket通信用プラグインの追加
以下のサイトから最新版のWebSocket通信用プラグインをダウンロードします。  

https://jmeter-plugins.org

上記サイトで検索すると、WebSocket通信に対応したプラグインは以下の2種類がありますが、   
今回の検証では後者の「WebSocket Samplers by Peter Doornbosch」を利用しています。  
- [WebSocket Sampler by Maciej Zaleski](https://github.com/maciejzaleski/JMeter-WebSocketSampler/wiki)
- [WebSocket Samplers by Peter Doornbosch](https://bitbucket.org/pjtr/jmeter-websocket-samplers/overview)

ダウンロードしたプラグインファイル(jmeter-websocket-samplers-X.X.XX.jar)をJMeterのlib/extフォルダ配下に配置し、  
ファイル読込のためJMeterを再起動すると、以下のようにWebSocket用のサンプラーが追加されます。  
![jmeter_websocket_001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/e150f2d8-6a39-fc78-19dc-4ebcac91bbe3.jpeg)

## WebSocket接続の開始
WebSocket通信を開始するには、```WebSocket Open Connection```サンプラーを使用します。  
```Server URL```にプロトコル、通信先ドメイン名/IPアドレス、ポート番号、Pathを設定します。  
![jmeter_websocket_002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/beab5507-8b6a-5f16-378d-b63134eed067.jpeg)

本サンプラーを実行すると、HTTPからWebSocketへのスイッチが行われます。  
![jmeter_websocket_004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/cd1edad6-887e-6b78-4f5f-ffa633edaf89.jpeg)

## WebSocket通信
WebSocketでデータのやりとりを行う場合、以下のサンプラーを利用します。  
- WebSocket Ping/Pong  
    WebSocketセッション維持のためのハートビート通信を行います。  
    ![jmeter_websocket_005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/3dfe0567-542e-fca7-b231-9ec718e10230.jpeg)
- WebSocket Single Read Sampler  
    新規/既存WebSocketセッションを指定して、データの受信を行います。  
    ![jmeter_websocket_006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/54433ddd-0d07-8d80-8eee-e6d7dd800509.jpeg)
- WebSocket Single Write Sampler  
    新規/既存WebSocketセッションを指定して、データの送信を行います。  
    ![jmeter_websocket_007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/b5a316e4-e1a6-e45c-cb87-16aa130092a2.jpeg)
- WebSocket request-response Sampler  
    新規/既存WebSocketセッションを指定して、データの送受信を行います。  
    ![jmeter_websocket_008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/455d7b0f-b991-6153-c8f9-3a73ed6e8e35.jpeg)


## WebSocket接続の終了
WebSocket接続を終了する場合は、```WebSocket Close```サンプラーを使用します。  
クローズ時のステータスコードを設定します。デフォルト値は1000（通常のクローズ）です。
![jmeter_websocket_009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/371d0536-fce9-ce66-2714-074f77ef5030.jpeg)

Mattermostの通信内容を分析して、以下のようなJMeterシナリオを作成・実行してみましたが、WebSocket接続の開始～終了までエラーなく再現できました。  
![jmeter_websocket_010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871769/1513288f-7110-c02f-fd75-1d96b3f79eb5.jpeg)

# 参考
https://qiita.com/nkns165/items/8cd82bf8b93826dfdca2  
https://www.alibabacloud.com/help/ja/pts/performance-test-pts-3-0/use-cases/how-to-perform-pressure-measurement-of-websocket-protocol
テスト環境を作ろう！　PHPインストール編①

## CentOS8へPHP8.3のインストール
>EPELリポジトリ追加
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

>PHP8.0以上が存在することを確認する
dnf module list php

>Remi リポジトリ追加
dnf module enable php:remi-8.3

>PHP8.3インストール
dnf install php

>Apacheを再起動して適用
systemctl restart httpd

>PHP8.3になっているか確認する
php -v

# エラー
> ①phpを確認しようとしたら以下の文字が表示された
「お使いのサーバーのPHPではWordPressに必要なMySQL拡張を利用できないようです。」
->以下のコマンドでインストールをして解決
```
dnf install -y php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-mysqlnd php-json
```
##　完了
次は簡単にホームページを作成できるwordpressをインストール！
[IaCを学ぼう第2回] Terraformでリソースを作成するために必要な最小限のコードを書いてみる

## これは何？

IaCを学ぼうの第2回、Terraformを使ってAWSのVPCリソースを作成するために必要なコードを書いてみる記事です。

## Terraformのコードの書き方

まず言語としては HCL(Hashicorp Configuration Language) を利用します。
Terraformを利用する場合は当然HCLの書き方やお作法を覚える必要があります。
複雑に書こうと思えばいくらでも書けますが、今回は基本ということで必要最低限のコードのみ書いてAWSのVPCを構築してみたいと思います。

## 書かないといけないもの

### provider

Terraformは[第1回](https://qiita.com/yktr_sre/items/3ac772d5303193565d80)でtenvを使ってインストールした本体の他に、Providerと呼ばれるAWS等のインフラ上のリソース(VPCとか)を制御するものがあります。

Providerは本体には含まれておらず、プラグイン形式で後からダウンロードして機能拡張できるように提供されています。

Terraformでコードを書いていく場合は、まずは利用するProviderに必要な設定値を記述しておく必要があり
AWSを利用したいのであればそれ用のProviderをインストールする必要があると覚えておくと良いと思います。

### resource

AWSにはVPC以外にも様々なサービスがありますし、サービスごとに設定値が無数に存在しますよね。
どのサービスをどの設定で構築したいか？を記述するのがresourceと呼ばれるものです。
どうやって書くの？はこの記事でこれからまとめていきます。

## コードの書き方

### provider

今回はVPCを作成したいので、AWS用のProviderの設定を記述しておきます。
リソースを作成したいリージョンの指定ですね。
他にもアクセスキーやシークレットキー等のAWSのAPIを実行するための認証情報も書けますが
書いてしまうと外部に出せなくなってしまうので、認証情報は基本別の方法で渡すようにしましょう。(後述します)

```HCL
provider "aws" {
  region = ap-northeast-1
}
```

### resource

resourceの基本的な書式は以下です。

```HCL
resource "リソース種別" "リソース名" {
  //ここにリソース作成時に必要なパラメータを書いていく
}
```

VPCを作成する場合は、aws_vpc を利用します。
リソース種別はTerraformのお作法としてドキュメントにまとめられているのでデタラメに書いてもダメです。
作りたいサービスごとにTerraformではどのリソース種別を使えばいいかを覚えておくと良いかと思います。

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc

resourceには任意の名前をつけることができます。(今回はvpcという名前をつけています)
Terraformのコード上で他のリソースの値を動的に参照する場合(例えばサブネットを作る場合にVPCのID値が必要等)に利用するので、自由に命名できますが他のresourceと被るのはNGです。

```HCL
resource "aws_vpc" "vpc" {
  //ここにリソース作成時に必要なパラメータを書いていく
}
```

必要なパラメータにはこれがなければリソースが作れないという必須項目と、なくてもいいが必要であれば記述する任意項目の2つがあります。

必須項目としてVPCのIPアドレス帯(cidr_block)と任意項目として名前タグを設定する場合以下のようになります。


```HCL
resource "aws_vpc" "vpc" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name = "test-vpc"
  }
}
```

詳細なパラメータ情報はマニュアルに記載されているのでそちらをご参照ください。
マネジメントコンソールから設定できるこの部分はTerraformではどんなパラメータだっけ？という形で
コンソールとコードを比較して眺めてみると良いかもしれません。

## コマンドを実行してリソース(VPC)を作成する

### コードのフォーマット

書いたHCLのフォーマット(インデントを揃えたり)ができます。

```
$ terraform fmt
```

### プラグインのインストール

冒頭で以下のように記載したと思います。

> Terraformでコードを書いていく場合は、まずは利用するProviderに必要な設定値を記述しておく必要があり
AWSを利用したいのであればそれ用のProviderをインストールする必要があると覚えておくと良いと思います。

これを行うのがinitというサブコマンドです。(厳密には他にもいろいろ処理してますが)
初めてコードを書いたときは必ず実行する必要があります。
※ 実行しないで先に進むとエラーになります。

```
$ terraform init
```

### ドライラン

いきなりコード内容をAWS上に反映するのは怖いですよね。
planというサブコマンドを使うと実行計画を反映前に確認することができます。
（どのリソースが作られるとか設定変更されるとか削除されるとかが分かる）

```
$ terraform plan
```

### 反映

コードで記述した設定を反映します。
applyというサブコマンドを使えばできますがその前に少し事前準備を。
AWS用のProviderは内部処理でAWSのAPIを実行します。
認証情報を環境変数にセットしておきましょう。

```
export AWS_ACCESS_KEY_ID=アクセスキー
export AWS_SECRET_ACCESS_KEY=シークレットキー
```

その後にapplyを実行しましょう。

```
$ terraform apply
```

お分かりの通り、アクセスキーとシークレットキーは秘匿情報ですが
この方法だとAWSでIAMユーザーを作成してキーを発行してローカルに持ってくる必要があります。

個人で勉強目的の場合はこれでもいいんですが、実際の業務ではセキュリティ的に
Terraform実行用のEC2インスタンスや別途CIサービスを使いながらIAMロールを使って認証情報を取得するやり方の方がいいと思います。

## 作成したリソースを削除する

最後のお片付け。Terraformで作成したリソースを削除できます。
放置していると課金されてしまうので勉強目的の場合はdestroyをお忘れなく。

```
$ terraform destroy
```

## まとめ

次回は変数の使い方について記事を書いていきます。
テスト環境を作ろう！　Apacheインストール編

## まずタイムゾーン
>タイムゾーンがAsia/Tokyoに設定されているか確認
timedatectl
>Asia/Tokyoに変更
timedatectl set-timezone Asia/Tokyo

## Apacheのインストール
>dnf -y install httpd
httpd -v
systemctl enable httpd
systemctl start httpd
systemctl status httpd
その後、ブラウザへlocalhostと入力

## 完了
次はphpをインストールします！

### 備考(yumの時はこちら)
>yum -y install httpd httpd-tools httpd-devel httpd-manual
systemctl enable httpd
systemctl start httpd
systemctl start firewalld
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
「仮想マシンをとても簡単シンプルに構築・操作するソフトウェア」Vagrant

# まず 
>「仮想マシンをとても簡単シンプルに構築・操作するソフトウェア」Vagrantです。前回の記事よりもっと簡単に設定し、Vagrantで仮想環境構築します。

#### vagrantのインストール
https://developer.hashicorp.com/vagrant/install
>・Windows I686 Version: 2.4.1

#### centos8
>vagrant init centos/8
出力
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

#### 環境の複製
>Vagrantfileにコマンドを書き、書き終わったら都度以下を実行する
vagrant up
vagrant ssh

#### エラー①
>vagrant initをしたがエラー
-> 解決した : vagrant の作成ディレクトリが異なっていた
https://qiita.com/Ryohei_U/items/8d8ea718b6d265c81bd7

>③vagrantがうまく動かない
->再起動して解決(vagrant reload)
https://qiita.com/nakamurashun0621/items/980890ed14645da5aee6

#### 完了
>簡単にCentOS8の環境が構築できました！
次は環境構築した仮想マシンにいろいろしていきます！
個人開発で生成AI画像だけのストックフォトを始めました


# はじめに
フリーランスエンジニアのtoggyです。
個人開発で生成AI画像だけを扱うストックフォトサイト [pixalia](https://pixalia.me) をリリースしました。個人開発にしては良いサイトができたので、ここでpixaliaの紹介をさせてください。

# 生成AI画像のストックフォトpixalia（ピクサリア）とは？
https://pixalia.me

 [pixalia（ピクサリア）](https://pixalia.me) は **「すぐに見つかる・その場で作れる」** をキャッチフレーズに生成AI画像専門のストックフォトサイトです。pixaliaではカメラで撮られた写真もカメラマンがアップロードした画像もありません。すべてがStable DiffusionまたはFlux.1によって作られた生成AI画像です。
キャッチフレーズの通りストックされている画像を検索して見つけたり、必要な画像を生成することができます。

## すぐに見つかる
![](https://storage.googleapis.com/zenn-user-upload/a87bd461274a-20250122.jpg)

pixaliaではAIが生成した画像が1万枚以上あり、**すべての画像が無料で商用利用できます** [^1]。
従来のストックフォト同様に利用したい画像をカテゴリやキーワードから検索してその場でダウンドーロ可能です。画像のサイズも長辺1,000px程度のSサイズ〜長辺2500px程度のMサイズがあります。

## その場で作れる
![](https://storage.googleapis.com/zenn-user-upload/c9d0b5cd1ae7-20250122.jpg)

画像を生成する機能も作りました。生成エンジンはStable DiffusionまたはFlux.1ですべてのユーザーが画像生成を利用できます。
画像生成には小難しいプロンプト（いわゆる呪文）を書かなければなりませんが、**pixaliaではストックされてる画像のプロンプトを公開しています。** ストックされてる画像を検索して同じような画像が作りたければプロンプトをコピーすることで簡単に類似画像が生成できるようにしました。

# 「探す」から「その場で作る」時代へ
![](https://storage.googleapis.com/zenn-user-upload/d83631ba73a3-20250122.jpg)

生成AIが誕生してから **「探して見つける」よりも「その場で生成する」時代** になると思います。
実際にやってみるとわかるのですが、フリー素材画像もキーワードやカテゴリを指定して何百枚の中から探し出すよりも、その場で欲しいものを作り出す方が探す労力が省けてとても効率的です。が、画像生成機能を無料で提供するのはまだまだ難しい…。
そこでpixaliaは「探す」と「作る」のハイブリッド型のWebサイトとしました。使いたいフリー素材を探し出すのがいいのか、その場で作り出すのがいいのか、どちらも試してみてくださいね。

[^1]: 生成AI画像の権利についての考え方は [こちらを](https://pixalia.me/about-copyright)ご覧ください
【VirtualBox】上にて、【Linux】の仮想マシンを作る

### 最初に
>前回の記事が、まとめられてなかったので記事を整理しました

### まず
>仮想マシンを作るため、まず環境をつくる
①VirtualBOXをインストールする
②CentOSをインストール

### ​VirtualBOXのインストール
https://www.virtualbox.org/wiki/Downloads
>・Windows hostsにした

### centosインストール
https://vault.centos.org/8.5.2111/isos/x86_64/
>・CentOS-8.5.2111-x86_64-dvd1.isoにした





# 仮想マシンの基本設定
### 仮想マシンにNICを追加
>ホストオンリーネットワークを追加 > VirtualBox Host-Only Ethernet Adapter #3

>設定 > ネットワーク > アダプター2 > 
>ネットワークアダプターを有効化 > ホストオンリーアダプター(VirtualBox Host-Only Ethernet Adapter #3)

### nmtuiでGUIか、nmcliでCUIでアドレス設定
>nmcli connection add ifname enp0s8 con-name enp0s8 type ethernet
>nmcli device status
>nmcli connection show
> nmcli connection modify enp0s8 ipv4.method manual ipv4.addresses 192.168.133.2/24
> ip a
>systemctl restart NetworkManager.service

#### ユーザ名とパスワードの作成
>sudo su
useradd ユーザ名
passwd ユーザ名
Changing password for user 
New password:
BAD PASSWORD: 
The password fails the dictionary check - it is based on a dictionary word
Retype new password:
passwd: all authentication tokens updated successfully.


### 完了
>次は設定しなくても簡単に仮想マシンが作れるやり方の記事をUPします
バブル時に効くと噂のrichmanbtc式mlbot動かしてみた

<!-- title: バブル時に効くと噂のrichmanbtc式mlbot動かしてみた -->

# バブル時に効くと噂のrichmanbtc式mlbotを動かしてみた

2020年頃に読んだrichmanbtc氏の本を思い出し、既にエッジは消えたと言われ、そのまま動かすだけでは収益にならないとされていたmlbotのチュートリアルですが、4年ぶりにバブルが来たということで、こういった相場ではまだまだ使えるのではないかと思い、試してみました。

さすがにBTCではうまくいかなかったので、とあるアルトコイン（時価総額50位以内）でバックテストが右肩上がりになるものを発見しました。早速試してみた収益がこちらです。

## 少しの期間回してみたbotの結果

以下は、短期間運用したbotの結果です。

![mlbotimg](https://qiitaimgkoji.s3.ap-northeast-1.amazonaws.com/IMG_9689.jpg)

![mlbotimg](https://qiitaimgkoji.s3.ap-northeast-1.amazonaws.com/IMG_9690.jpg)

ご覧の通り、初めの5日で約18%の利益が出ました。このままいくと1か月で2.6倍くらいになるのでは！？と期待しましたが、その後トランプ相場で相場が急変し、他のアルトコインは大暴落。それに巻き込まれ、それまでの収益はマイナスになってしまいました。やはり突然のショックに弱いような気がするので、このあたりを何とかしたいところです。

また、予測モデルをアンサンブルにしたり、単純なATRでの指値をやめてみるとバックテストが改善したので、このあたりを次の記事で取り上げてみます。
AWS SAA(Solutions Architect - Associate)用語集

## S3
インベントリ：S3に保存されるオブジェクトの詳細な情報をレポートできる。

## フリート
一連のサーバーやリソースのグループのこと。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/create-ec2-fleet.html

## バックアップボールト
AWS Backupで、バックアップを保存および整理するためのコンテナ。バックアップを暗号化できる。

https://dev.classmethod.jp/articles/aws-backup-perfect-understand/

https://docs.aws.amazon.com/ja_jp/aws-backup/latest/devguide/vaults.html

## バックアッププラン
どのリソースをいつどのようにバックアップするかを定義。ユーザ定義のタグを使用もできる。

https://docs.aws.amazon.com/ja_jp/aws-backup/latest/devguide/creating-a-backup-plan.html
違う単価

EINE-NETPR
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/1e4f394d-3dbc-612b-4c5a-0161ef3490c9.png)
含义：采购信息记录中的净价。

表示与某供应商和物料关联的标准采购价格，这是一个主数据字段。
这个价格通常是基于长期协议或供应商协商的固定价格。
特点：

属于主数据，是采购信息记录的一部分，通常在创建采购订单时会被自动引用。
不会因单个采购订单发生变化。
价格的基础单位（PEINH 字段）可以是每件、每百件或其他计量单位。
使用场景：

在创建采购订单（ME21N）时，SAP 会从采购信息记录中自动提取 EINE-NETPR 作为订单的初始价格。
EKPO-NETPR
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/278e50cc-6c17-68f5-ed87-c4c1f558c90d.png)
含义：采购订单中的净价。

表示某个具体采购订单明细中的物料净价格，是交易数据字段。
这个价格可以来源于主数据（如 EINE-NETPR），也可以在订单中手动修改。
特点：

属于交易数据，是针对某次采购交易的具体价格。
在创建采购订单时，系统会默认从采购信息记录或条件记录中带入价格，但用户可以根据实际情况进行调整。
包含所有价格条件的最终计算结果，可能因折扣、附加费用等发生变化。
使用场景：

表示某次具体采购交易中供应商为物料提供的实际价格。
在 GR（收货）或 MIRO（发票校验）时会用到这个价格。

区別
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/1314a641-ccd7-4f0f-096f-7f7046d6e79c.png)
666悪魔の数字(エグいほどのこじつけ&クソコード)

どうもAtsu1209です。
今回は数学の先生に「お前大丈夫か？」って言われたサイトの話をします。

# 何やねんそれ
簡潔に言うと「どんな数字でも666にこじつける」というものです。
アイデア自体は私の友達が作ったのですが、`JS`で作ったろかなと思ったので
作りました。(もうすぐ受験。何やってんねん。)

# コード
簡潔に言うとクソコードです。

```js
function cal(){
    const num = document.getElementById("num").value;
    const res = document.getElementById("result");
                
    if (num == 1){
        res.textContent = "1を6倍すると6になるんですね。それを3個並べると 666悪魔の数字";
    }
    else if (num == 2){
        res.textContent = "2の4乗って16なんですね。さらにそこに2を足すと18になるんですね。 18は 6x3 6が3個。 666悪魔の数字";
    }
   
    else if (num == "777"){
        res.textContent = "パチンコ打ちたいよねって話。 ついでに 666悪魔の数字"
    }
    
    ...この後にめっちゃ続く
    
    else{
        res.textContent = "とりあえず 666悪魔の数字";
    }
}
```
if文を何個も並べてやってます。

# HTML
誰とは言わないけど例の人を出したいのよね
例の**666悪魔の数字**って言ってる方
って事で`jQuery`の`fadeIn`使います。

```html
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
      let bp = 0;
$('#btn').click(function() {
    bp += 1;
    
    if (bp === 1) {
        $("#img").fadeIn(1500);
        $("#result").fadeIn(1500);
        
        setTimeout(() => {
            $("#img").fadeOut(1500);
            $("#result").fadeOut(1500);
            bp = 0; 
        }, 5000);
    }
});

    </script>
```

:::note warn
`bp`でボタンのカウンター
こうするしか... なかったんだ...
:::

# 最後に
もしかしたらGithubPagesで公開する。

**お わ り**
TiDB関連イベント 2025年2月分

アドベントカレンダーご協力ありがとうございました。2025年もよろしくお願いします。
2025年は分散DBに挑戦するのはどうでしょうか？！恒例のイベントカレンダーです。
2月はイベント盛りだくさんです。

> PingCAP主催のもの、コミュニティイベントに参加するものの両方を記載しています。WebinarについてはJSTで6:00-24:00に開催されるイベントを記載しています。
> また、イベント/社内勉強会など、リクエストに応じてTiDBについてお話し可能です。
> リクエストはお気軽に @bohnen ([X/@bohnen](https://twitter.com/bohnen)) までお気軽にご連絡ください。

## Serverless Meetup Osaka 2/8

https://serverless.connpass.com/event/342157/

サーバレス製品の Cloudflare / TiDB / Postman を一気に学べるワークショップです。講師はCloudflare亀田さんで、各企業からもサポート講師が参加します（私も参加します）。
お近くの方はぜひご参加ください！

## ウェビナー: TiDBの紹介 2/12

https://pingcap.co.jp/event/20250212-webinar/

本ウェビナーはTiDBが初めてという方向けに、TiDBのアーキテクチャの概要をご説明します。講師はおなじみPingCAP本田さんです。

## Devlopers Summit 2/14

https://event.shoeisha.jp/devsumi/20250213/session/5589

PingCAPも後援しています。発表は、Mixi様より話題のSNS「Mixi2」でのTiDBの利用についてお話しいただきます！見逃せませんね。

## 次世代DB戦略を支えるNewSQL 〜導入企業が語る導入背景と今後の展望〜 (Findy様イベント) 2/19

https://findy-tools.connpass.com/event/343774/

NewSQLを利用している企業の担当者が発表ということで、TiDB利用企業からはLeverages様とCAPCOM様が登壇されるようです。ぜひごらんください。

## オープンソースカンファレンス Tokyo/Spring 2/22

https://event.ospn.jp/osc2025-spring/session/1977229

オープンソースの祭典 OSC Tokyo/Spring に発表とブース出展を行います。
発表は技術顧問の長谷川さんから、Kubernetes上でのTiDBの動かし方についてです。
TiDBはk8sをネイティブにサポートするデータベースで、相性もバッチリです。ぜひお家k8sで動かしてみてください！

## ㊗️ TiDB User Group 1周年記念 Meetup 🎉 2/28

https://tiug.connpass.com/event/343597/

昨年1月に発足したTiDB User Groupが一周年を迎えました！
この間に東京だけではなく大阪でもMeetupを行ったりと活動の幅を広げています。おなじみの方も、初めての方も、お気軽にご参加ください。

## おわりに

Amazon DSQLも発表になり、今年は分散DBが盛り上がりそうです。
TiDBも引き続きよろしくお願いします
シェルスクリプトまとめ

## 基本トピック
### シェルスクリプトの概要
シェルスクリプトはLinuxのコマンドライン(Bashなどのシェル)から実行するコマンドを並べてまとめて実行できるようにしたスクリプトです。ターミナルで行う作業をスクリプト化しておくことで作業の再現を容易にすることができます。シェルスクリプトは下記のように作成することができます。

```sh:sample1.sh
echo 'Hello world!'
pwd
ls
```

上記の実行にあたっては下記のコマンドを実行すれば良いです。

```
$ sh sample1.sh
```

・実行結果
```
Hello world!
/.../.../...
sample1.sh
```

`echo`は文字出力、`pwd`はカレントディレクトリの出力、`ls`はカレントディレクトリのファイルのリストの出力にそれぞれ対応します。


### シェルスクリプトにおける変数の取り扱い
シェルスクリプトで変数を取り扱うにあたっては、下記のように`$`を用います。

```sh:sample2.sh
var='value'
echo $var
echo ${var}

var='change'
echo $var
```

`$`は変数の参照の際には用いる一方で、定義の際には用いない点に注意しておくと良いと思います。上記の`sample2.sh`は下記のコマンドによって実行できます。

```
$ sh sample2.sh
```

・実行結果
```
value
value
change
```

上記の例では変数の`var`の上書きを行いました。上書きを行いたくない場合は下記のように`readonly`を用いると良いです。

```sh:sample3.sh
readonly var='value'
echo $var
echo ${var}

var='change'
echo $var
```

上記を実行すると下記のような結果が出力されます。

```
$ sh sample3.sh
```

・実行結果
```
value
value
sample3.sh: 5: var: is read only
```

上記より、`readonly`をつけておくことで変数の上書きを防止できることが確認できます。


### 条件分岐・繰り返し
・条件分岐
シェルスクリプトで条件分岐を取り扱うには下記のように`if-else`を用います。

```sh:sample4.sh
num_1=1
num_2=2

# num_1 == num_2
if [ $num_1 -eq $num_2 ]; then
    echo "num_1 is equal to num_2"
else
    echo "num_1 is not equal to num_2"
fi

# num_1 < num_2
if [ $num_1 -lt $num_2 ]; then
    echo "num_1 is less than num_2"
else
    echo "num_1 is not less than num_2"
fi
```

上記を実行すると下記のような結果が出力されます。

```
$ sh sample4.sh
```

・実行結果
```
num_1 is not equal to num_2
num_1 is less than num_2
```

`-eq`は`num_1`と`num_2`が一致するかどうか(equal)、`-lt`は`num_1`が`num_2`より小さいかどうか(less than)をそれぞれ取り扱います。

・繰り返し
シェルスクリプトで繰り返しを取り扱うには下記のように`for`を用います。

```sh:sample5.sh
for i in 1 2 3 4 5
do
    echo ${i}
    echo "file_${i}"
done

for i in `seq 10 +10 100`
do
    if [ $i -le 50 ]; then
        echo "${i} is less than or equal to 50"
    else
        echo "${i} is greater than 50"
    fi
done
```

上記を実行すると下記のような結果が出力されます。

```
$ sh sample5.sh
```

・実行結果
```
1
file_1
2
file_2
3
file_3
4
file_4
5
file_5
10 is less than or equal to 50
20 is less than or equal to 50
30 is less than or equal to 50
40 is less than or equal to 50
50 is less than or equal to 50
60 is greater than 50
70 is greater than 50
80 is greater than 50
90 is greater than 50
100 is greater than 50
```

繰り返しと条件分岐を組み合わせることである程度自由度の高い処理を実行することができます。
数字3つの大小比較「数字3つの大小比較をどのように表現したらいいですか。何パターンですか。同じもあります。」をAI先生に聞きました。

# ChatGPT先生へ
・１行ずつです。
＞(回答抜粋)
上記について、pythonで、変数a,b,cに値を代入して、変数名で大小の表示をお願いします。
記号a,b,cで
a=5,b=5,c=3に対応して下さい。
申し訳ありません。大きい順にお願いします。
(2025-01-25追加)
最後の行に、値の比較行を**追加**して下さい。
最後の行は、5=5>3になるようにお願いします。
申し訳ありません。ユーザー定義関数にして下さい。
```python
def compare_variables(**kwargs):
    # 変数名と値をペアにしてリスト化
    variables = list(kwargs.items())

    # 値を基準に降順でソート (同じ値でも順番を保つ)
    sorted_vars = sorted(variables, key=lambda x: x[1], reverse=True)

    # 結果を組み立て (等しい値は "=" で表現)
    result = []
    values = []
    for i in range(len(sorted_vars)):
        if i > 0 and sorted_vars[i][1] == sorted_vars[i-1][1]:
            result[-1] += f" = {sorted_vars[i][0]}"
            values[-1] += f"={sorted_vars[i][1]}"
        else:
            result.append(sorted_vars[i][0])
            values.append(f"{sorted_vars[i][1]}")

    # 結果の出力
    print(" > ".join(result))
    print(" > ".join(values))


# 使用例
a = 5
b = 5
c = 3

compare_variables(a=a, b=b, c=c)
```
実行例
```
a = b > c
5=5>3
```
# Gemini先生へ
未

# copilot先生へ
未

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342) 　開発環境

# いつもと違うおすすめです。
#### Qiita
【ネットワーク】URLとは

# はじめに
こんにちは。アメリカで独学でエンジニアを目指している者です。
現在、ネットワークについて学んでいるのですが、恥ずかしながらURLに関する理解が不十分だったので、これを機に記事としてまとめてみることにしました。

## URLとは
インターネットで情報にアクセスするときには、URLと呼ばれる“住所”のような文字列を使います。よく目にする「http://～」「https://～」といったアドレスが、そのURLです。
ここでは、URLとは何か、そしてどのような仕組みで情報を指定しているのか、基本的な構造を中心に解説します。

### URLの基本的な構造
一般的に、URLは以下のパーツで構成されています。
```html
プロトコル://ドメイン名(ホスト名)/パス名（ディレクトリ/ファイルなど）
```
たとえば下記の例を見てみましょう。
```html
https://example.com/products/item01.html
```
それぞれ3つに分けられます。

1. **プロトコル（https://）**

  * `http`や`https`などが有名です。
  * URL先のサーバーにアクセスするときに、どのような方法で通信を行うかを指定します。
  * `https`は通信を暗号化するセキュア版のプロトコルです。
2. **ドメイン名（example.com）**

  * `example.com`の部分で、目的のWebサーバーがどこにあるのかを指定しています。
  * `DNS（Domain Name System）`が、ドメイン名をIPアドレスに変換し、実際のサーバーの場所を特定します。
3. **パス名（products/item01.html）**
  * サーバー内のどのファイル（またはディレクトリ）にアクセスするかを示します。
  * ディレクトリとファイル名をスラッシュ（/）で区切って階層を表現します。
  * 多くのWebサーバーでは、パス部分が省略されているとデフォルトのファイル（`index.html`など）を返すことがあります。

プロトコルやドメイン名については当然知っていましたが、最後の部分では`index.html`などが省略されるケースが多く、実際にはパス名が省略されていたことを最近知りました。
このようにして、サーバー内のディレクトリ構造を辿って目的のファイルを探せるという仕組みを、改めて理解できました。

## URLでよく見るその他の要素
URLについて扱ったので、ほかの要素についてもみていきましょう。

### ポート番号
```html
https://example.com:443/
```
以前、TCP/IPの概念について触れた際にも述べましたが、IPアドレスが“住所”だとすると、ポート番号は「どのサービス（部屋）にアクセスするか」を指定するイメージです。
たとえば、80番であればHTTP、443番であればHTTPSなどが分かります。
URLの中には、ドメイン名の後ろに「:443」のような形でポート番号が記載される場合がありますが、通常はHTTPなら80番、HTTPSなら443番を使うため省略されることがほとんどです。

### クエリパラメータ
```html
https://example.com/search?q=chatgpt&page=2
```
“?（クエスチョンマーク）”の後ろに続く「q=chatgpt&page=2」のような部分が、検索ワードやページ番号などの“パラメータ”です。
クエリパラメータは主に検索の際のフィルタリングなどにも使われます。
Railsでもたしかparamsが取得できるもののうちの一つだった気がします

### アンカー（フラグメント）
```html
https://example.com/index.html#section2
```
“#section2”のように“#（シャープ）”から始まる部分は、ページ内の特定の場所にジャンプするための目印を示します。
通常はページの内容が読み込まれた後、該当の要素にスクロールする仕組みになっています。

# まとめ
プロトコル：アクセス方法を示す（https など）
ドメイン名：インターネット上のサーバーの場所を示す（example.com など）
パス名：サーバー内のどこにあるデータかを示す（/products/item01.html など）
さらに、必要に応じてポート番号やクエリパラメータ、フラグメント（アンカー）などを組み合わせることで、より細かい指定や、ページ内の特定位置へのアクセスを実現しています。

普段何気なく使っているURLですが、改めて調べてみると意外な発見もあるものですね。
今後も、このように学んだことがあれば忘れないうちに記事にしてまとめていこうと思います。
長柱の座屈，フレームの座屈  基本例題7.02 P222「材料力学演習(20221021)」をsympyでやってみたい。

・未 [細長比の条件]
・済 [オイラー座屈荷重の式の適用性]
・済 [オイラー座屈荷重と座屈応力]
 
 # オリジナル
[基本例題7.02 P222](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=227)＜[「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
？？？タブレット等で、pdfを開く事ができないかも。？？？　
# sympyで
・**[細長比の条件]** の勉強中
```python
# ver0.1
# 基本例題7.02 P222
from sympy import *
var('t,h,E.I,l,A',nonnegative=True)
def print_significant(value, sig_figs=3):
    """
    数値を指定された有効数字で表示する関数

    :param value: 表示したい数値
    :param sig_figs: 有効数字の桁数(デフォルトは3桁)
    """
    formatted_value = f"{value:.{sig_figs}g}"
    return formatted_value  # print ではなく return を使う
# [オイラー座屈荷重の式の適用性]
I_kosiki=t*h**3/12
Pcr     =pi**2*E*I/(4*l**2)
rep     ={E:70*10**9,l:1000}                                  # ;print(rep)
I1 =round(I_kosiki.subs({t:15,h:10}))*10**(-12)                 ;print("#"    ,print_significant(float(I1),4))
I2 =round(I_kosiki.subs({t:10,h:15}))*10**(-12)                 ;print("# ???",print_significant(float(I2),4))
# l_k=round((l*sqrt(A/I )).subs({l:1.0,A:10*15*10**(-6),I:I1})  ;print("#"   ,l_k)
l_k  =round((l*sqrt(A/I1)).subs({l:1.0,A:10*15*10**(-6)}),1)    ;print("#"   ,l_k)
print()
# [オイラー座屈荷重と座屈応力]
# Pcr=round((pi**2*E*I/(4*L**2)).subs({E:70*10**9,I:I1,L:1.0})) ;print("#",Pcr)
Pcr=float((pi**2*E*I/(4*L**2)).subs({E:70*10**9,I:I1,L:1.0}))   ;print("#",round(Pcr))
σ  =float((Pcr/A).subs({A:t*h}).subs({t:15,h:10}))              ;print("#",round(σ,2))
Pcr=Pcr*4;                σ=σ*4                                 ;print("#",round(Pcr),round(σ,2))
Pcr=round(Pcr*4/1000,2);  σ=round(σ  *4,1)                      ;print("#",Pcr,σ)
# 1.25e-09
# ??? 2.812e-09
# 346.4

# 216
# 1.44
# 864 5.76
# 3.45 23.0
```


# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
~~＞単純支持ばり 7)~~
~~＞構造力学公式集 p136~~
localstack S3 に標準入力した内容のオブジェクトを置くワンライナー

# チートシート

```shell
echo '【オブジェクトの中身】' | docker exec --interactive 【コンテナ名】 awslocal s3 cp - s3://【バケット名】/【オブジェクトのパス】
```

# ポイント
## 1. docker exec `--interactive`

> アタッチしていなくても、標準入力を開き続ける

[docker exec — Docker-docs-ja 24.0 ドキュメント](https://docs.docker.jp/engine/reference/commandline/exec.html#docker-exec-options) より引用

## 2. s3 cp `-`

> `s3 cp` コマンドでは、次の構文を使用して、`stdin` から指定先のバケットにファイルストリームをアップロードします。
> ```shell
> $ aws s3 cp - <target> [--options]
> ```

[Using high-level (s3) commands in the AWS CLI - AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/v1/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-copy) より引用
バリアント

在SAP中，バリアントを組む 的意思是为某个程序、报表或事务代码预先设置好输入参数，以便以后可以快速使用这些预设条件，而无需每次都手动输入。

简单例子：
你需要经常查某个报表（比如交货记录）：

每次都需要输入：
日期：2023年1月1日到2023年12月31日。
供应商代码：10001。
这样输入很麻烦。
创建バリアント：

把日期（2023年1月1日~2023年12月31日）和供应商代码（10001）保存为一个模板，命名为“我的模板”。
这个过程就是 バリアントを組む。
下次运行时：

你只需选择“我的模板”，系统会自动填入这些参数，你就不用手动输入了。


操作步骤：
1.入力上信息后，点击保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/673d0f25-6558-4241-ad94-bd76850958b4.png)

2.天上名字和描述后再次保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/1006233d-2a3e-468c-82e8-b0c9b49d351c.png)

3.使用的石黑点击这个键
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/de338ede-9cde-4e3f-9e29-6b3ae1638d11.png)
双击一下，保存的バリアント就自动填入了里面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/a5c72305-9277-426b-9b96-5812c5c25190.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/dbf86808-3f93-4490-8b0e-b853dc66919a.png)
Oracle Analytics Cloud：DataVisualizationに配置したセマンティックモデル/サブジェクト領域の列名の見分け方

はじめに
---
DataVisualizationでは、データセットやセマンティックモデル/サブジェクト領域を使ってワークブックを作成します。
DataVisualizationでセマンティックモデル/サブジェクト領域を使ってワークブックを作成する際に、グラフや表/ピボットに配置している列名の見分け方について見てみます。
![g1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/bb9dded5-d5e2-1cd0-15b4-d9c76a5c97a9.jpeg)

記事記載時のOAC ver：Jan 2025 Update

前提
---
・OAC、ADWサービスをプロビジョニングし、作成している
・異なるプレゼンテーション表で、同じ列名をもつ列がある
・子プレゼンテーション表を利用している

子プレゼンテーション表について
セマンティックモデル/サブジェクト領域で、子プレゼンテーション表を利用することでフォルダ/階層表示されます。

フォルダ/階層表示
セマンティックモデル/サブジェクト領域で子プレゼンテーション表を設定するとフォルダ/階層表示されます
![g2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/9576d1d5-f12e-9080-5009-669f4da79ea5.jpeg)

子プレゼンテーション表の設定
プレゼンテーション層で、空のプレゼンテーション表を新規作成します。プロパティの子プレゼンテーション表タブを開き、階層表示したいプレゼンテーション表を選択します
![g22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/6ddeab8c-877e-a305-ef9a-5c65c01842b4.jpeg)

どのプレゼンテーション表かを確認する
---
DataVisualizationの表やグラフに配置されている列を見てみます
配置されている列にマウスカーソルを移動します
「セマンティックモデル/サブジェクト領域名 > プレゼンテーション表名（子プレゼンテーション表名）> 列名」と表示されます。
![g4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/442dc3a2-1949-d706-a80b-66d6407014f6.jpeg)

フォルダ名、階層では表示されません。

列名が同じ場合で、どのプレゼンテーション表かを確認する
---
列名が同じ場合
![g3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/2f2eb21f-9524-07eb-0788-998489632523.jpeg)

左上部の検索部分で、列名を入力します
列名、サブジェクト領域名.プレゼンテーション表名で一覧が表示されますので一致する列を確認します
![g5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/23c4e890-84fd-9b09-e86a-20c4db8a839b.jpeg)

表名、列名が同じように見えるケース
---
OACインスタンスには、複数のセマンティックモデル/サブジェクト領域を作成することができます。
ただし１つのセマンティックモデル/サブジェクト領域内では、プレゼンテーション表と列名はユニークでない場合エラーとなります
そのため、子プレゼンテーション表機能を利用していて、表名、列名が同じように見える場合でもユニークでなければいけないため、プレゼンテーション表にスペースや.が存在している等が考えられます

下記イメージでは、上部が"マスタ<空白スペース>C1"、下部がマスタC1で、間にスペースが入っています
![g6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/80e65cb8-f1d7-2a75-4712-799f08a494d9.jpeg)

以上
Djangoで開発を行う際にやっておいて良かったこと

# はじめに
案件内でDjangoでの開発環境の構築を行った際にやっておいて良かったことを紹介しようと思います。
開発環境は下記を利用しています。
```
Django==3.2.5
djangorestframework==3.12.4
factory-boy==3.3.0
pytest==7.4.3
```

# models.pyの分割
多くのテーブルを扱うとmodels.pyが肥大化します。
可読性向上を目的とし、テーブルごとにファイルを作成しました。
## やり方
- models.pyは削除し、models.pyがあった場所にmodels ディレクトリを用意する
- modelsディレクトリに各テーブルのファイルを用意する
- 各テーブルのファイルの中身はmodels.pyと同じ書き方で問題ない
```
models/
　├ __init__.py
　├ user.py
　└ book.py
```
- modelsディレクトリに`__init__.py`ファイルを用意する
- `__init__.py` ファイルで各テーブルのファイルをimportする
```
from .user import User
from .book import Book
```

# SQLのログを表示する
- N+1問題が発生していないか簡単に確認できるよう、発行されたSQLをログに出力するよう設定を行いました。

## やり方
- settings.pyに以下を記述
```
# 発行されたSQLをログに出力
LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "handlers": {
        "console": {
            "level": "DEBUG",
            "class": "logging.StreamHandler",
        },
    },
    "loggers": {
        "django.db.backends": {
            "handlers": ["console"],
            "level": "DEBUG",
        },
    },
}
```
ログレベルや出力フォーマットのカスタムなども可能です。詳しい方法は公式ドキュメントを参照ください。

https://docs.djangoproject.com/en/3.2/topics/logging/

# リンター・フォーマッター導入
コードの一貫性を保つために、リンター・フォーマッターを導入しました。
今回はPEP8に準拠したかったため、flake8とblackを採用しています。


## やり方
以下のライブラリをインストールする
```
pip install flake8
pip install black
```

.flake8ファイルに以下記述
```
[flake8]
max-line-length = 88
extend-ignore = E203

// 対象外ファイルの設定。必要に応じて設定
exclude = api/migrations, api/models/__init__.py, api/views/__init__.py
```

- flake8では1行の最大文字数を79文字に規定している一方で、Blackでは88文字まで許容しているため、この競合を回避するためmax-line-lengthを88に設定

- flake8ではコロンの前に空白がある場合に警告を出す(E203)が、black は算術演算子の周りの空白を許可するため、この競合を回避するためE203を無視

pyproject.tomlに以下を記述
```
[tool.black]

// 対象外ファイルの設定。必要に応じて設定
exclude = '''
/(
    api/migrations
  | app/models/__init__.py
  | api/views/__init__.py
)/
'''
```

```
コマンドの実行
flake8 --show-source {対象ディレクトリ}
例）flake8 --show-source app
black {対象ディレクトリ}
例）black app
```

# GithubActions

GitHubのCI/CDでflake8とblackのコマンドを実行し、PR作成じとコミット時にチェックを自動的に行うようにしました。

`.github/workflows/backend-ci.yml`に以下を記述

```
name: backend-ci

on: [push, pull_request]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.10'
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install flake8 black
    - name: Run flake8
      run: flake8 .
    - name: Run black
      run: black --check .
```

# 最後に
Djangoで開発を行う際にやっておいて良かったことを紹介してきました。
どれも簡単に行えるものなので、初期段階でささっと行っておくのが良さそうだと個人的に思いました。
Djangoでの開発の助けになれば幸いです。
【Servicenow】Xanaduリリース「Portalの非アクティブ化」

# はじめに
Xanaduアップデートに関して、Service Portalで新規追加された機能を紹介します。
参考ドキュメントは以下の通りです。
https://www.servicenow.com/docs/bundle/xanadu-platform-user-interface/page/build/service-portal/task/deactivate-portal.html

# 新機能概要
 ServiceNowにおけるService Portal は、エンドユーザーがカスタマイズされたエクスペリエンスを利用できる重要なツールです。ただし、運用状況に応じて、特定のポータルを非アクティブ化する必要がある場合ケースもあるかと思います。本記事では、Service Portal を非アクティブにする具体的な手順について詳しく解説します。

# 前提条件
以下の前提条件を満たしていることを確認してください。
・sp_admin 又は admin roleを持っていること
・非アクティブ化対象の Service Portal が特定されていること
・他のプロジェクトやユーザーに影響を与えないことを確認済みであること

# 設定方法
1.フィルターナビゲーターから Service Portal> Portals を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471813/8677ab4f-0988-3469-d57c-263a3daaef8a.png)

2.非アクティブにするポータルを選択し、inactiveを押下します
　(再度アクティブにする場合はオフにする)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471813/2f0f6820-3c7e-26b9-c871-e5fc8eac4a20.png)

3.Alternate portalフィールドでユーザがリダイレクトするアクティブなポータルを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471813/783748c6-442d-09e4-00bc-3d97fe2af7a1.png)

4.非アクティブなポータルにアクセスすると代替ポータルにリダイレクトされ、ポータルが非アクティブであるというメッセージが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471813/5d98497e-0ad7-5bc6-de9b-00ffd164b73f.png)

# 注意事項
1. **ユーザーへの影響**  
   非アクティブ化したPortalはエンドユーザーがアクセスできなくなります。そのため、事前に影響を受けるユーザーへの通知を行う必要があります。

2. **データの保持**  
   非アクティブ化しても、ポータルの設定や関連データは削除されません。後日再びアクティブ化することも可能です。

3. **カスタマイズの影響**  
   カスタムウィジェットやスクリプトが他のポータルに影響を与える可能性があるため事前に確認が必要です。

4. **リダイレクト制限**  
   モバイル従業員ポータル（/mesp）へのリダイレクトは不可です。

# 終わりに
Portalの非アクティブ化について紹介しました。
本記事が、皆さんの作業の一助となれば幸いです。
回答納期と予定納期

概念：
回答納期：仕入先（サプライヤー）が購買発注に対して「納品可能な日程」を回答した納期のことです。
予定納期：購買側が計画した理想的な納入日付。
区別：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/6dc75480-54e4-5fe7-cdfe-c40d58ef51c1.png)

活用例
1.納期調整：
購買側は仕入先の回答納期と自社の予定納期を比較し、遅延の可能性があれば調整を行う。
例：予定納期が5月10日だが、回答納期が5月15日である場合、優先度を見て仕入先と再交渉する。
2.リマインダーの送信：
回答納期が近づいた際、仕入先にリマインダーを送信して納期を遵守させる。
3.仕入先の評価：
回答納期と実績納期を定期的に比較し、仕入先の信頼性を評価する。

操作結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/377ec5d2-d44d-4643-b18a-8ff2943c646c.png)
操作
①me22nで「PO変更画面」に入ります。
②「明細」のところ、「確認」タブを押して。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/48de2afe-9296-4f4b-ab59-69c31f8a12dd.png)
③仕入先が希望している納入日付を入力し、保存する。
※「納入日付」「引渡日付」は同じです。CCは「AB」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/f046e199-7936-46b9-a0f3-a3bcbee710a9.png)
⑤EKES-EINDTに情報がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/cbe9481a-591f-4368-ac34-fdcca64af903.png)

如果有error的话，黄色的无视它，继续按Enter。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/2913ea00-639f-4aeb-b074-7e23a4c24642.png)

连按两次后，error消失，再点上面的保存，就变更成功了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/7e59a95a-7e61-41fb-9d32-19607ea76c6c.png)