OmniAICreator/Qiita-1.07M huggingface dataset:
未経験エンジニア必見：初めての会社の選び方

# 未経験エンジニアとのQA
先日、未経験エンジニアの方に”初めての会社の選び方について”、インスタで質問もらいました。

:::note info
はじめまして♪
私は現在、エンジニア職に転職を考えています。しかし、全くの未経験なのでその辺のお話を聞かせてもらえればありがたいです🤲
:::

:::note warn
はい、どんな事が気になってますか？
:::

:::note info
主には仕事の中身が気になります
:::

:::note warn
基本的には、事業側の担当者がいて、その方の要望を聞きながらシステムを作成します
ただ最初は先輩エンジニアの指示に従ってプロ作る感じです
:::

:::note info
先輩エンジニアからご指導受けながら進める感じですね。ありがとうございます。
:::

:::note warn
はい、ちゃんとした会社なら大丈夫ですよ
:::

:::note info
そこが選択に難しい所です
:::

:::note warn
エンジニアが10人以上いれば大丈夫だと思います、面接の時に聞きましょう
:::

:::note info
10人は何か意味があるのですか？
:::

:::note warn
10人超えるとマネージメントで階層にする必要があります
なので、10人以上にするには、マネージメント力が必要になるので教育とかも考えてると思います
:::

# 何故１０人以上エンジニアいる会社が良いか
## 立ち上げ時
会社は立ち上げ時は、CTOの力によってアーキテクチャ、インフラ、CI、CD等すべて決められます。
その後、採用に関してもCTOが一人で面接して、採用決定をする事が多いです
（時にCEOが入る場合もありますが、人間性を見てもらう感じですね。）
開発、技術、組織構築に関してCTOが全ての権限と責任をもって行動します。

# 優秀なエンジニアを集める時期
しかし、これは徐々に限界が来ます。開発速度を上げていくためには、一人ではなく、優秀なエンジニアの力が必要となります。
この優秀なエンジニアを頑張って採用して開発を協力してもらいます。

# 個人の動きだけでは限度の時期
優秀なエンジニアを知り合いベースやスカウトで集めていくのも５，６人くらいまでは結構な速度で進められるでしょう。
しかし、そこから先は、中々進まない時期に入ります。

# 若手エンジニアを採用して育てる時期
この時から若手エンジニアを採用して育てる事を始めます。
そのため、１０人以上エンジニアがいる会社は、エンジニアを育てる土台が出来ているという事が判断できます。

# 右肩を決める時期
立ち上げ当初は、全てを決めていたCTOを更なる開発速度をあげるには、右肩となるエンジニアを決めて、その人にある程度任せる時期に入ります。この時からCTOはマネージメントを考え始めます。
そのため、１０人以上エンジニアがいる会社のCTOはマネージメントをやってる会社になります。

# まとめ
未経験エンジニアとして初めての会社選び方としては、１０人以上エンジニアがいる会社を選ぶことをおすすめします。
もちろん経験値のあるCTOの場合は、１０人以下でも大丈夫かもしれませんが、育てる環境が出来てない場合が多いです。


# 最後に
エンジニアの皆さん、エンジニア未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
Google DriveをMacのFinderからローカル同様に使う方法

Google Driveは、私たちがファイルをオンラインで保存、共有、編集できる便利なツールです。

しかし、MacのFinderからローカルドライブと同様にアクセスできるとさらに便利ですよね。この記事では、その方法を初心者でもわかりやすく解説します。

## ステップ1：Google Driveアプリケーションのダウンロードとインストール

まずは、Google Driveのデスクトップアプリケーション「Google Drive for desktop」をダウンロードしてインストールしましょう。

1. [Google Drive for desktop](https://www.google.com/drive/download/)のダウンロードページにアクセスします。
2. 「Download」ボタンをクリックし、表示される指示に従ってインストールします。

## ステップ2：Google Driveアプリケーションの設定

インストールが完了したら、Google Driveの設定を行います。

1. Macのメニューバーから「Google Drive」アイコンをクリックします。
2. 「Sign in」ボタンをクリックし、Googleアカウントにログインします。
3. 「Preferences」（設定）メニューに移動し、「Google Drive」タブをクリックします。
4. 「Stream files with Google Drive」（Google Driveでファイルをストリーム）オプションを選択します。

これで、Google DriveのファイルがMacのFinderから直接アクセス可能になります。

## ステップ3：FinderからGoogle Driveを使用する

設定が完了したら、FinderからGoogle Driveを使用できるようになります。

1. Finderを開きます。
2. 左側のサイドバーで「Google Drive」を見つけます。
3. 「Google Drive」をクリックすると、すべてのGoogle Driveファイルが表示されます。

![スクリーンショット 2023-05-24 9.16.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/0a562eb6-9c58-9f55-d567-57fe76701730.png)


これで完了です！これにより、ローカルファイルと同じようにGoogle Driveのファイルにアクセスし、編集し、保存することができます。一方、ファイルはオンラインに保存されているため、デバイスのストレージスペースを圧迫することはありません。

この記事がGoogle DriveをMacのFinderからローカル同様に使う方法の理解に役立つと嬉しいです。
ユーザー入力を自動生成させて新規レコードをモデルに当てはめる(SPSS Modeler データ加工逆引き9-17)

# ユーザー入力を自動生成させて新規レコードをモデルに当てはめる（スコアリング）

![スクリーンショット 2023-05-17 10.04.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b96b51d5-34ce-70cb-10a6-bd300c5d5bc5.png)

## 1.想定される利用目的

・作成した予測モデルに新しいレコードを１件だけ適用してテストする
・新規１レコードをスコアリングする展開用ブランチを作成する
・シミュレーション用テーブルをモデルで評価する

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/scoring_one.str

## 3.サンプルストリームの説明

![スクリーンショット 2023-05-01 15.16.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/54b5fa61-1911-8de7-23aa-f79cd897e8e2.png)

### 予測モデルを作成する（逆引き9-16と共通）

a.モデル学習用データは以下の通りです。自動車のスペックデータです。

![スクリーンショット 2023-05-01 15.32.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1107a9d8-1861-b18e-d79f-c076c7cceee4.png)

b.[データ型]ノードを編集します。馬力を[対象]にして予測します。
![スクリーンショット 2023-05-01 15.14.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f3f07ea5-10e0-da74-cd52-702fa5cbcfc3.png)

c.[ニューラルネット]ノードを実行します。

d.[ニューラルネット]モデルナゲットが作成されました。
![スクリーンショット 2023-05-01 15.36.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/70e05581-1b23-5f67-04f4-b502ac8be798.png)

e.[テーブル]ノードを表示します。学習データに馬力を予測するフィールドが追加されました。

![スクリーンショット 2023-05-01 15.13.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d942c0db-9924-fbc2-132f-b444bf0ca003.png)

### 予測モデルを新規データに適用する

f.モデルナゲットdを右クリックして[ユーザー入力]ノードを自動生成させます。

![スクリーンショット 2023-05-17 10.15.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9b60bf8f-4808-8772-41ff-16d694206ef7.png)

ストリーム領域に出来上がったユーザー入力ノードは以下の通りです。
![スクリーンショット 2023-05-17 10.16.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/418c54c6-aff1-3ea2-31c9-c6cfbb5f3598.png)

出来上がったノードをfの位置に配置します。
![スクリーンショット 2023-05-17 10.31.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/23ce1a8b-c7eb-56cd-aea2-a768a142603a.png)

手入力で４つのフィールドに値を埋めます。
![スクリーンショット 2023-05-17 10.30.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/12ca8e92-2eb5-842f-9ca4-ae8b51fac4e7.png)

[プレビュー]します。
![スクリーンショット 2023-05-17 10.44.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/020cab8f-9acd-11b3-740c-1003db4de93d.png)

[テーブル]を実行します。スコアリングされています。
![スクリーンショット 2023-05-17 10.44.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8aefcbfe-68a6-d4a9-3178-b95ddde9324c.png)

#### 注意事項

展開用ではなくシミュレーションの場合には逆引き9-18を参考に組み合わせデータを生成させます。

## 4.参考情報

#### CADSを用いたスコアリングについて説明する記事

https://qiita.com/kawada2017/items/22373a49cbf7c3da9f38

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
There was an error. Please reload the page

+ [There was an error.Please reload the page or contact your system administrator if the problem persists.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000MibFpSAJ)
+ [【未解決】Connect to Org fails](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NFRrW)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c8a833d9-77ef-239d-e055-12915c50db6f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4eb473a9-9d80-cd89-48b1-7e8106397d75.png)

:::note
It seems to be a storage limit.

we ran into this same issue this summer, when testing the beta, and decided to wait until GA to carry on our tests.
This issue is a known issue of the beta. I have understood that once GA, DevOps Center should not consume any storage, but have asked confirmation.

To clarify, we unfortunately will not have addressed the storage limit situation with the GA.  We're planning to look at this post-GA and hope to have a solution some time next year. As we get better understanding of the solution we'll be able to update with more precision on expected timeframe.  

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000HEFMySAP
:::

+ [【解決】Devops Center - Create Review Button Error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JfltX)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/727c7752-e330-bddf-e40e-24a5a88c97e8.png)

:::note
I managed to do a workaround. The issue turned out to be related to me upgrading Devops Center to the GA version while I had a connected project active. I had to create a new project to be able to start pull changes to UAT. I hit a different snag when trying to push some changes to UAT. The worst one was related to a validation rule on a managed package that I turned off because the package is no longer used. I kept getting an error message telling me that I'm not allowed to update validation rules on managed packages. I ended up using change sets and referenced the Devops Center to ensure I got them all. 

Salesforce needs to address this issue. The package is no longer used, but I cannot immediately delete since the package needs a lot of prep work before deleting it.

私は回避策を実行することができました。この問題は、接続されたプロジェクトがアクティブなときに Devops Center を GA バージョンにアップグレードしたことに関連していることが判明しました。UAT へのプル変更を開始するには、新しいプロジェクトを作成する必要がありました。いくつかの変更を UAT にプッシュしようとしたときに、別の問題が発生しました。パッケージが使用されなくなったためにオフにした管理パッケージの検証ルールに関連していました。管理パッケージの検証ルールを更新できないというエラー メッセージが何度も表示されました。私は変更セットを使用することになり、Devops Center を参照してそれらをすべて取得したことを確認しました。 

Salesforce はこの問題に対処する必要があります。パッケージはもう使用されていませんが、パッケージを削除する前に多くの準備作業が必要なため、すぐに削除することはできません。
:::

+ [未解決 There was an error. Please reload the page...](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PewPu)
Gaugeでenv/default/default.propertiesを読み込まない

# はじめに

Gaugeを実行するときに毎回成功しても`.txt`を出力するのでそれを1つのディレクトリ`reports`にまとめて出力しようと試みました

そこでわかったことをまとめていきます

# 問題

以下のドキュメントを参考に設定を行いました

https://docs.gauge.org/configuration.html

しかし、なぜかテストを実行するとプロジェクト直下に`.txt`が出力されてしまいました

どうやら設定が読み込まれていないようです

# 解決方法

私用のPCで作成したGaugeプロジェクトを会社で利用するPCでクローンして実行したところなぜか`.txt`は出力されず思っていた挙動になっていました

そこで`gauge java`を最新版にしたところうまくいくようになりました

```
$ gauge install java 0.9.1
```

# おわりに

これで解決はしましたが、会社用のPCでクローンしたところ`gauge java 0.7.1`でも動いていたので少し謎は残っています。`.iml`ファイルができることがポイントな気がしています
VotingClassifierを使ったアンサンブル学習と、Soft Votingについて

アンサンブル学習は、複数の学習モデルを組み合わせて、予測精度を向上させる手法の一つです。sklearn.ensembleモジュールのVotingClassifierは、それぞれ異なる学習アルゴリズムを持つ複数のモデルの予測を組み合わせることで、より確度の高い予測を目指します。

VotingClassifierではvotingパラメータを'soft'に設定することで、各クラスの確率を平均して最終的な予測を行うことができます。これをSoft Votingと呼びます。対照的に、各分類器の多数決でクラスを決定する方法をHard Votingと呼びます。

次に、VotingClassifierを使ったアンサンブル学習と、voting='soft'による予測のPythonでの実装を見てみましょう。

```
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import VotingClassifier
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression

# データの読み込みと準備
iris = load_iris()
X, y = iris.data[:, [1, 2]], iris.target

# データの標準化
scaler = StandardScaler()
X = scaler.fit_transform(X)

# データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 各種モデルの準備
clf1 = LogisticRegression(random_state=1)
clf2 = DecisionTreeClassifier(random_state=1)
clf3 = SVC(probability=True, random_state=1)

# VotingClassifierの作成
eclf = VotingClassifier(
    estimators=[('lr', clf1), ('dt', clf2), ('svc', clf3)],
    voting='soft')

# モデルの訓練
eclf.fit(X_train, y_train)

# テストデータでの予測
y_pred = eclf.predict(X_test)

```

上記のコードでは、まずirisデータセットをロードし、必要な特徴量を選択し、標準化しました。次に、データを訓練データとテストデータに分割しました。

その後、Logistic Regression、Decision Tree、SVCの3つの分類モデルを作成し、それらをVotingClassifierに渡しています。voting='soft'により、各分類器が出力する確率を平均化して最終的な予測を行います。

最後に、作成したVoting Classifierモデルを訓練データで訓練し、テストデータで予測を行いました。

VotingClassifierは複数の学習モデルの予測を組み合わせることで、各モデルが持っている弱点を補い、より高精度な予測を可能にします。
SQLからLLMを呼び出すDatabricksのai_generate_text関数

[ai\_generate\_text function \| Databricks on AWS](https://docs.databricks.com/sql/language-manual/functions/ai_generate_text.html) [2023/4/18時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

:::note
**プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

プロンプトを指定することで、選択した大規模言語モデル(LLM)によって生成されたテキストを返却します。

# 要件

- この関数はDatabricks SQL Proとサーバレスでのみ利用可能です。
- この機能はパブリックプレビューです。パブリックプレビューに参加するには、[AI Functions Public Preview enrollment form](https://docs.google.com/forms/d/1f5txJXRzGG4nhLTvdYaMr11G6lAJ1C-FrJgXaqmHeUU/viewform?edit_requested=true)を提出してください。

# 構文

```
ai_generate_text(prompt, modelName[, param1, value1] [...])
```

# 引数

- `prompt`: 文字列、選択したLLMに渡すテキストプロンプトです。
- `modelName`: 文字列リテラル、`openai/gpt-3.5-turbo`と`azure_openai/gpt-35-turbo`のみがサポートされています。
- `paramN`と`valueN`: 選択したLLMを認証、設定するためのキーバリューペア。キーは文字列リテラルで大文字小文字を区別します。バリューのタイプは以下のキーに依存します:
    - モデル`openai/gpt-3.5-turbo`は、Open AIのチャットコンプリーションAPIを使用します。以下のパラメーターをサポートします:
        - `apiKey`: 必須。モデルエンドポイントにアクセスするためのOpenAI APIキーです。値を指定するにはシークレット機能を使用しなくてはなりません。
        - `temperature`: 使用するサンプリングテンプルチュア。`0`から`2`の間の数値リテラルです。デフォルトは`1.0`です。
        - `stop`: ストップ文字列。値は`STRING`リテラル、あるいは最大4つの文字列リテラルの`ARRAY<STRING>`となります。デフォルトはnullです。
    - モデル`azure_openai/gpt-35-turbo`はAzure OpenAIサービスのチャットコンプリーションAPIを使用します。上述の`openai/gpt-3.5-turbo`モデルの全てのパラメーターと、エンドポイントURLを構成する任意の追加パラメーターを受け付けます。DatabricksではAPIキー認証のみをサポートしています。
        - `resourceName`: 必須。リソース名を指定する文字列リテラルです。
        - `deploymentName`: 必須。デプロイメント名を指定する文字列リテラルです。
        - `apiVersion`: 必須。使用するAPIバージョンを指定する文字列リテラルです。

# 戻り値

選択したLLMから生成されたテキストを表現する文字列表現です。

# サンプル

```sql:SQL
> SELECT ai_generate_text('Hello', 'openai/gpt-3.5-turbo',
    'apiKey', secret('ml', 'key'),
    'temperature', 0.1);

  Hello! How can I assist you today?

> SELECT ai_generate_text('Hello',
    'azure_openai/gpt-35-turbo',
    'apiKey', secret('ml', 'key'),
    'resouceName', 'resource',
    'deploymentName', 'deploy',
    'apiVersion', '2023-03-15-preview',
    'temperature', 0.1);

  Hello! How can I assist you today?


> SELECT ai_generate_text('Hello',
    'openai/gpt-3.5-turbo',
    'apiKey', 'sg-xxxxxxxxxxxxxxxxxxxxxx',
    'temperature', 0.1);

 Error: DATATYPE_MISMATCH.INVALID_SECRET
 The value expression of API_TOKEN can only be a `secret(<scope>, <key>)` function; however, got StringLiteral sg-xxxxxxxxxxxxxxxxxxxxxx.
```

# 関連機能

- [secret function](https://docs.databricks.com/sql/language-manual/functions/secret.html)

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
MySQL でデータベースとテーブルを作成する

# はじめに
この記事では、MySQLでデータベースとテーブルを作成する手順について記載していきます。

# 前提
開発環境は以下の通りです。
- Windows11
- MySQL 8.0.3

また、事前にWindows11にMySQLをインストールしておきます。

https://qiita.com/Yasushi-Mo/items/fe67cae83a71840460ea

# データベースの作成

```
mysql -u root -p
```
```blog_app``` データベースを作成します。

```
create database blog_app;
```

以下のコマンドでデータベース一覧を表示し、問題なくデータベースが作成できたか確認します。

```
show databases;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/192a6df9-767c-6bad-1d02-85069facacc7.png)

```blog_app``` データベースが作成できたことを確認できました。

# テーブルの作成
次は ```blogs``` テーブルを作成します。
テーブルのデータ構造は以下の通りです。

| Field | Type | Null | Key | Extra |
|:-:|:-:|:-:|:-:|:-:|
| id | int unsigned | × | 〇 | auto increment |
| title | varchar(30) | × |   | |
| body | varchar(1000) | 〇  |   | |

以下のSQLを実行します。

```
create table blog_app.blogs (id int unsigned auto_increment not null, title varchar(30) not null, body varchar(1000),
 PRIMARY KEY (id));
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/252655f8-17a8-c2a9-9bc7-42bd3a3217f1.png)

問題なくテーブルが作成できたか確認します。
まず、以下のSQLでデータベース内に移動します。
```
use blog_app;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/c2ab8393-0297-eeef-9769-c8f648512c3e.png)

次に以下のSQLでデータベース内に作成されたテーブルを表示します。
```
show tables;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/507d2e7c-4971-125e-3b11-d37c9345896b.png)

以下のSQLでテーブルのカラムを表示します。
```
show columns from blogs;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/c01632de-4757-ca54-e805-e5e37d3c4994.png)

```blogs``` テーブルが作成できたことを確認できました。

最後に作成したテーブルにデータを追加してみます。
以下のSQLでデータを追加します。
```
insert into blogs (title, body) values ("sample title", "sample body");
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/654361b8-18ea-eb5f-6228-0dd72a387cf8.png)

データが追加されたかどうか確認するために SELECT 文を使ってテーブルに追加されたデータを取得してみます。
```
select * from blogs;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/d15463a6-2a92-9d35-509e-36f994457247.png)
データが追加されたことを確認できました。

# 参考
- [MySQLの使い方](https://www.javadrive.jp/mysql/#section_table)
サクラエディタで文字コードを調べる

# 1. はじめに
* サクラエディタを使った文字コードを調べたい

# 2. 開発環境
* サクラエディタ32bit Ver. 2.4.2.6048 
* Windows 11

# 3. 文字コード確認手順
## 3.1. サクラエディタで調べたい文字を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/5d612716-c145-47d7-0301-ceb505cf0a6a.png)

## 3.2. 画面右下の文字コードをダブルクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/b0bd9ef2-f268-87f0-602f-30a849cde04c.png)

# 4. 参考文献

https://sakura-editor.github.io/help/
サクラエディタでマクロを使う

# 1. はじめに
* サクラエディタで簡単にマクロを記録して実行したい
* 簡易作業をマクロを使ってまとめて実施したい

# 2. 開発環境
* サクラエディタ32bit Ver. 2.4.2.6048 
* Windows 11

# 3. マクロの記録・実行
## 3.1. マクロを記録する
* 記録開始： ```Ctrl + Shift + M```
* 記録終了： ```Ctrl + Shift + M```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/bbfa8f46-f05c-150e-d5bb-60ba995ae17a.png)

## 3.1. マクロを実行する
* マクロ実行： ```Ctrl + Shift + L```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/db8181d6-892b-c33e-bfd2-cdb3e6933e89.png)

# 4. よく使うマクロ
## 4.1. 重複行を削除する
### 4.1.1. ソースコード

```:deleteDuplication.mac
//キーボードマクロのファイル
S_SelectAll(0);
S_SortAsc(0);
S_Merge(0);
```

### 4.1.2. 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/beb0f71f-67db-7dbb-9d64-a0ddc46df7a3.png)

## 4.2. 重複行を抽出する
### 4.2.1. ソースコード

```JavaScript:selectDupulication.js
// CheckRepeat.js
main();

function main(){
    var sLine1;        // 選択範囲ループの１行前を格納
    var sLine2;        // 選択範囲ループの現在行を格納
    var iCnt1 = 0;    // 選択範囲ループの行開始位置
    var iCnt2 = 0;    // 選択範囲ループの行終了位置
    var iRet = 0;    // 重複行数カウント

    // メッセージ表示用
    var WSHShell = new ActiveXObject("WScript.Shell");

    // 全選択する（Ctrl+A)
    SelectAll(0);

    // 選択範囲をバッファに格納
    var sAll = GetSelectedString(0);
    sAll = sAll.replace(/\r\n/g, '\n');
    sAll = sAll.replace(/\r/g, '\n');

    iStartRowLayout = GetSelectLineFrom();
    iEndRowLayout = GetSelectLineTo();
    bBoxSelect = (IsTextSelected() == 2);
    
    CancelMode();

    // 矩形選択時の動作範囲確認
    if (bBoxSelect){
        Jump(iStartRowLayout, 0);
        iStartRowLogical = ExpandParameter('$y');
        Jump(iEndRowLayout, 0);
        iEndRowLogical = ExpandParameter('$y');

        if ((iEndRowLayout-iStartRowLayout) != (iEndRowLogical-iStartRowLogical)){
            WSHShell.Popup("折り返し行を含む矩形選択範囲は，重複確認できません．"
                            , 0, "重複確認", 64);
            return false;
        }
    }
    
    // 選択範囲の先頭に移動
    Jump(iStartRowLayout, 0);
    BookmarkReset();

    // 選択範囲のバッファを改行単位でループ
    TraceOut('■"$F"', 1);
    SearchNext('$', 0x14);
    iCnt2 = sAll.indexOf('\n', iCnt1);
    while (iCnt2 != -1) {
        sLine2 = sAll.substring(iCnt1, iCnt2);
        if (sLine1 == sLine2) {    // 前行と同じだった
            iRet++;
            sRowFm = "      ".substr(0, 6 - ExpandParameter("$y").length)
                                            + ExpandParameter("$y");
            TraceOut("・(" + sRowFm + ",1    ): " + GetLineStr(0), 2);
            BookmarkSet();
        }
        sLine1 = sLine2;
        iCnt1 = iCnt2 + 1;
        iCnt2 = sAll.indexOf('\n', iCnt1);
        SearchNext('$', 0x14);    // 改行単位で移動(指定行Jumpより速いので)
    }

    SearchClearMark();
    CancelMode();
    Jump(iStartRowLayout, 0);

    WSHShell.Popup("重複は " + iRet + " 行でした．", 0, "重複削除", 64);

}
```

## 4.2.2. 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/8e09a0c3-1e3a-0bbb-9c78-1408d69a3a12.png)
* ※単純に連続する行の重複を抽出するため、必要に応じて事前にソート処理を実行しておく必要がある

# 5. 参考文献

https://www.udemy.com/course/cs_coding_rules/learn/lecture/27561452#overview
おーぷんえーぴーあいじぇね

openapi-generator-cliコマンド
バックエンドはJava,フロントはvue.jsを使用しようと考えています。
それぞれのコマンドを教えてください。

（バックエンドのJava）
openapi-generator generate -i {swaggerファイルのURL} -g java

（フロントのvue.js）
openapi-generator generate -i {swaggerファイルのURL} -g javascript -o api/vuejs-openapi-client

openapi-generator generate -i {swaggerファイルのURL} -g だとクライアント側のコードが生成されます。バックエンド側を生成するには
openapi-generator generate -i {swaggerファイルのURL} -g java -o server/instance
となります。

コマンドで自動生成されない場合がありますが、それはyankファイルに問題がありますか？

おそらくは yaml ファイルに問題があることが考えられます。yaml ファイルの形式が正しく構成されているか、必要な情報が含まれているかを確認してください。

（バックエンドのJava）
openapi-generator generate -i {swaggerファイルのURL} -g java

（フロントのvue.js）
openapi-generator generate -i {swaggerファイルのURL} -g javascript -o api/vuejs-openapi-client
これで自動生成されたファイル群で何ができるのですか？

自動生成されたファイル群から、REST API を呼び出して、サーバーとデータをやり取りするためのクライアントコードを作成することができます。生成されるコードは、入力パラメーターを検証したり、クエリ文字列を構築したり、レスポンスを自動的に扱えるよう定義されています。他にも、サーバーサイドアプリケーションを作成したり、WebAPI からクライアントに戻るレスポンスを作成するためのコードを生成できます。

openapi-generator generate -i {swaggerファイルのURL} -g java
で生成したファイル群の構成と、それぞれのファイルで何ができるか教えてください。

openapi-generator を使用して Java 用のコードを生成すると、サーバーサイドアプリケーションのためのモデルや API インターフェース、クライアントを使用した API リクエストを受け入れるための Controller 等々が生成されます。モデルは入力と出力データの検証と定義を行うためのクラスとして定義されており、Controller は、API が呼び出されたり、レスポンスの生成を行うためのインターフェースを提供します。
Set Up Salesforce Knowledge 

+ [Set Up the Service Console](https://qiita.com/Keiji_otsubo/items/ec01e43121bd7077806c)


# Create and Manage Articles

+ [Set Up Salesforce Knowledge >  Create and Manage Articles](https://trailhead.salesforce.com/content/learn/projects/set-up-salesforce-knowledge/create-and-manage-articles)

**There is no "Summary field"**

+ [There is no "Summary field"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Pl6Zf)

:::note
1st: Click on Service Setup icon ~> then Object Manager ~> In quick find type knowledge, click Knowledge ~>then Page Layouts ~> In How To page layout  click the down and select Edit ~> In the Fields Palette find Summary ~>Drag and drop Summary field to the Article Details section ~> Finally Click Save
:::

+ [Challenge error - Set Up Salesforce Knowledge Create and Manage Articles](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBj8zSAD)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fc8cde81-8b7b-ba44-d530-f655dcb5995f.png)

:::note
I was able to delete everything and start fresh! Thank you for the quick response 

すべてを削除して新しく始めることができました。速やかなご返信ありがとうございます
:::




# Configure Page Layouts and Create Record Types

+ [Configure Page Layouts and Create Record Types - Page Layouts Missing](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000077DFsZ)

:::note
Please create a Trailhead Playground or dev org. It won`t exist in your sandbox 


:::

+ [[ナレッジ] タブのレコード タイプとして How To がありません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007HLhyE)
+ [Not seeing "How to" as record type option](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007A2dCCSAZ)

単なる作り忘れ。２回も輩にやられた。屈辱。

# assign buttonがない

+ [「記事の作成と管理」チャレンジでは、ユーザーに Ada Balewa に割り当てるように指示しています。ページ上部に割り当て機能がありません。添付を参照してください。「指示」に必要な内容が記載されています。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmH5Y)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/561a54ac-136e-df7e-d46e-c46d9bd82bfd.png)


# summary field がない

+ [Can anyone please assist, I am creating an article but I can't find the summary field I've tried adding it on the layout page but it didnt solve the issue](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KEH5o)

:::note
Are the following settings correct? 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/de273e4c-04bb-42c0-9590-17658b4f856b.png)

https://trailhead.salesforce.com/content/learn/projects/set-up-salesforce-knowledge/configure-page-layouts-create-record-types
:::
パスワードリセットメールがループする



# [パスワードを忘れた場合] を使用して選択したユーザー名を入力すると、[パスワードを忘れた場合] ページをループしてユーザー名を再度尋ねる電子メールが届きます。また別の電子メールが送信されます (永久ループ)。

+ [Scheduler Playgound Verify Account Bug](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PetvE)

:::note
 After combing through search results and articles, I found one indicating that it may be Outlook as this person has the same issue.  So, I used my personal email (gmail) vs. my Slalom, Inc. email address (outlook) and it worked.

It seems like Outlook or the security we have in place is expiring the URLs right away.

検索結果と記事を調べた結果、この人も同じ問題を抱えているため、Outlook である可能性があることを示す記事を見つけました。そこで、私は個人の電子メール (gmail) と Slalom, Inc. の電子メール アドレス (Outlook) を使用しましたが、うまくいきました。
 
Outlook または私たちが導入しているセキュリティにより、URL の有効期限がすぐに切れてしまっているようです。
:::

# プレイグラウンドを起動するたびに、新しいパスワードを作成するように求められ続けます。

+ [I keep being prompted to create a new password every time I launch a playground.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Hl4gk)

:::note
I ended up figuring it out! It was as simple as getting myself back to the sales home page. Somehow while installing an app for practice, a reset my password page was loaded every time I launched Playground.

結局それがわかりました！販売ホームページに戻るだけで簡単でした。どういうわけか、練習用のアプリをインストールしているときに、Playground を起動するたびにパスワードのリセット ページが読み込まれてしまいました。
:::

+ [Trailhead組織のリセットパスワード機能が壊れていますか？](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000GzsV0)
+ [新しい遊び場とそれに関連するユーザー名のパスワードをリセット...](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HDb04)

# アイデア？

There is a bit more to this: be aware that the 'infinite loops' problem can also occur due to 'Safe Links' features of email protection services (i.e. Safe Links in Microsoft Defender for Office 365), which basically seem to use your email links to test them... and by default, the design pattern applied is to allow the 'Reset Pwd' link to be used once..

れにはもう少し説明があります。「無限ループ」問題は、基本的に電子メールを使用しているように見える電子メール保護サービスの「安全なリンク」機能 (つまり、Microsoft Defender for Office 365 の安全なリンク) によっても発生する可能性があることに注意してください。リンクをテストしてください...そして、デフォルトで適用されるデザイン パターンでは、「Reset Pwd」リンクを 1 回使用できるようになります。

[Forgot/reset password can leave client in infinite process loop](https://ideas.salesforce.com/s/idea/a0B8W00000GdnLdUAJ/forgotreset-password-can-leave-client-in-infinite-process-loop)
【解決方法】undefined method add _active _class' for とは？

Ruby on rails を学習中の方の参考にしてもらえたら嬉しいです。
今回はアプリケーションを作成している時に出てくるエラーとその解決方法について掲載します。少しでも参考にしていただけると幸いです。
まず最初に undefined method add _active _class' for〜というエラーの解決方法をお話しします。
今回のようにundefined method 〜というエラーは頻出のエラーなので、このエラーが出たら大まかにどこのコーディングにミスがあったのか察しが付くと解決まで早いです。
今回はメソッドの定義ができていなかったという問題をクリアしていきます。



▼以下のようなエラーが発生しましたので解決策の一つをご紹介します。
![スクリーンショット 2023-05-22 6.49.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/ad1dfd23-0c7d-1e18-6cf9-ea8c8c391cab.png)

## 結論から
ブラウザ上にタブ切り替えボタンを作って、タブを変えることで表示される内容を変えようとしていました。そのタブのメソッドが見つからないよというエラーです。
この解決にはタブのhtmlを書いてあげることで解決されると思いました。
そして、それにはhelpersにメソッドを書いて、タブのhtmlの補助をしてもらい、メソットを定義してあげる必要があると思いました。
その手順について解説します。


## 解決策を見ていきます

▼まずはどんなエラーなのか確認します。
![スクリーンショット 2023-05-22 6.57.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/66954c76-4b03-36f4-5e56-12fa0febe5e7.png)



▼そして、前回アプリを作った時のメモも参照しながらエラーを解決していきます。
![スクリーンショット 2023-05-22 6.58.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/57d38357-2f13-abeb-0200-d1234fa23af4.png)

▼helpersの配下にタブメソッドを定義します
![スクリーンショット 2023-05-22 7.01.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/2016645d-c05b-6ba2-cd0f-52b87c7dae95.png)



▼そしてviewにタブのhtmlを書きます。
今回はcommonsというフォルダを作ってそこに_tabs.html.hamlを作ってその中にhtmlを作成しました。
![スクリーンショット 2023-05-22 7.03.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/09d08633-a1a9-abd8-6bdd-e1794818dfcf.png)

▼完成したものは以下のように緑色と白色でタブが切り替わるようになりました。
![スクリーンショット 2023-05-24 6.44.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/3d8f20cb-76a0-19e4-4d73-f1a96fb52ebf.png)

いかがでしたでしょうか？
他にも記事を発信していきますので、私の QiitaやTwitterをフォローしていただけると嬉しいです。
個別の質問もぜひ歓迎します。
私自身、初学者ではありますが、1歩先を行くものとして回答できたらと思います。
それでは。
USBフロッピードライブで低レベルフォーマットをする方法

## USBフロッピードライブをLinuxでも使いたい

Linuxでフロッピーをフォーマットする方法がわからなくて、相当探しました。

`mformat`や`fdformat`は/dev/fd0として認識されている場合には使えますが、USB接続のフロッピードライブ(`/dev/sdb`等)では使えません。

## こんなのが出て使えません！

フォーマットが読める状態じゃないと、フロッピー差し込んでも使えないのです。（泣）

```
[ 5318.231636] sd 6:0:0:0: [sdb] Sense Key : Medium Error [current] 
[ 5318.231638] sd 6:0:0:0: [sdb] Add. Sense: Cannot read medium - unknown format
[ 5318.999584] sd 6:0:0:0: [sdb] Read Capacity(10) failed: Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
```


でも、探したら、とても（とっても）、良いパッケージが見つかったのでここに記録しておきましょう。

## 必要なパッケージ

```
sudo apt install ufiformat
```

`ufiformat`というそのものズバリ、ドンピシャなソフトウェアがありました。。


## 低レベルフォーマットの実行

```
sudo ufiformat /dev/sdb
```

とすれば、

```
$ sudo ufiformat /dev/sdb
geometry: track=80, head=2, sector=18, block=512
done   
```

こんな感じで低レベルフォーマット出来ます。素晴らしい！

## その後は？

一番面倒なエラーが終われば後は、すんなり使えます。

```
sudo mkfs.vfat /dev/sdb
```

と言った感じでファイルシステムを書けば作業完了です。

後は普通にマウントして使えます。

```
mount -t vfat /dev/sdb /mnt/floppy
```

誰かの役に立ちますように！


もしくはこんな感じで出来るみたいです。
```
sudo mkdosfs -I /dev/sdb
```
分布外検知（異常検知）の動向についての調査

# 分布外検知の動向についてまとめてみた
研究室での活動で、分布外検知モデルについて精度（AUROC)に着目して最近の動向をまとめてみました。

<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vTnJ2z2UMbdFeQv6fhLJMIvWaVvFX16J3VCJxAaDCVwFDgozzOB1fvru-9hD-wRbfIj6KM4RqxWNugO/embed?start=false&loop=false&delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
今まで『docker-machine』とか使ってdockerコマンド使っていた人が『docker desktop』でdockerコマンド使うようにするまで、、

# はじめに

macでやってます。

この記事の内容が本当に正解かわからないのですが、
自分のPCでいざ使うってなった時、、色々なエラーが出て(すみません記録できてません)、、
正直色々戸惑ったので誰かの参考になればと思い記事にしました。

**あと『docker-machine』とか一回使えているのuninstallとかしたらもう使えないぐらいの認識がいいかもです、、それが大事な気が**


# まず、、、、、

元々は[リンク](https://qiita.com/sachiko-kame/items/35e0cf07d117c3b92613)先のやり方のような感じで入れていてdockerdesktopは機能していなかった人です。

『docker desktop(使っていない前にインストールしたもの)』とかはuninstall(やり方下に記載)しておくがいいかもです、、

macも最新にしてからでないとダメかもです、、(これ結構大きそうです、、) ※mac最新にする前に出来ればデータバックアップオススメします。

あと今後はdockerと言ったらdockerDesktopって思い込まないと無理かもって思いました、、、[共存](https://docs.docker.jp/desktop/mac/docker-toolbox.html)出来るとか書いてありますが出来なさそうです、、**<font color="red">そう思ったら色々進みました</font>**、、

# 覚えている範囲でどこでエラーでた？
『docker desktop』使えないのかな？『docker-machine』もう一回使えるようにすればとか思ってからのerror、error

『docker desktop』使おうと思って『docker-machine』打ってerror、error、(goのエラーとかなんか)

『docker-machine』と『virtualBOX』紐付けでerror、error、

『docker desktop』表示前にerror、error、

そのほかに『docker desktop』あるが『docker-machine』とか色々削除したら`docker ps`がそもそお使えなくなった、、

# やる順序大事そうです、、

macのアップデート、
↓
全部アンインストールして
↓
再度インストールし直す

# 今の環境
どんな時も色々今動いているバージョン記録しといた方がいいかと思い、、

```
これはきっと未来の人向けになったりするかも？？ですかね、、

mac => 12.6.6
docker desktop => 4.19.0

docker -v => Docker version 23.0.5, build bc4487a
```

# ではさっそく

ここからやったことつらつら書いていきます。
もれがあるとは思いますがきっと大丈夫な気がします、、
なんか『これもでない?』とかあったらコメントとかで教えていただけると嬉しいです:bow_tone1:

上手くいかない時は一回PC再起動とかもいいかもです、

# やったこと1 

macのアップデート
(これはやり方はアレなので書きません。)

# やったこと2

不要なものたち一旦アンインストール ※色々あります。

- 『docker Toolbox』のアンインストール
以下リンク先確認お願いします。
https://qiita.com/minamijoyo/items/ec5b35382797ac08e067

- むか〜しにいれて意味のない『docker desktop』のアンインストール
https://docs.docker.com/desktop/uninstall/
```
・ 一回`docker desktop`起動して上にあるクジラアイコンマーク右タップ
・ 『Troubleshoot』タップ
・ 一番下の『Uninstall』タップ
・ 終わったらmacのアプリケーションフォルダのdockerアイコンゴミ箱に
```

- アプリケーションフォルダにdocker系のアイコンあればそれもゴミ箱に

- virtualboxのアンインストール
これ一回virtualboxインストールしてそれ開いたところにuninstalltool的なのあるのでそれクリックで削除出来ます。
https://pc-karuma.net/mac-virtualbox-uninstall/

- コマンド系のもの以下で表示されれば削除しました。

```
$ cd /usr/local/bin
$ ls | grep docker で出てきたもの削除(目視で探すもいいかもです)
$ ls | grep virtualbox で出てきたもの削除(目視で探すもいいかもです)

$ cd $HOME/.docker で行けるような感じなら以下のように削除しました。
$ cd $HOME
$ rm -rf .docker

$ open /Users/<自分のユーザ名>/Library/ の箇所にvirtualboxやdockerがいないか確認してあれば削除しました。
```

# やったこと3

bash_profileの見直し。<= 使っているもの違えばそれ用のものを

ここにdockerなるものあれば`みたいなの => export DOCKER_HOST=tcp://192.168.59.104:2376`削除して保存しました。値設定的なもの
流れは以下の感じ

```
$ sudo vim ~/.bash_profile
aで入力モード、変更して、:wqで保存

//変更反映
$ source ~/.bash_profile
```

# あとは『docker desktop』をインストールするのみ！
使う理由答えて、サブスクもaccept押してぐるぐるしてちゃんと表示されるの待ってからターミナルで今まで打てていたdockerコマンドが打てるようになりました、、


# 最後に
え、これだけ？っと思うかもなのですが、これはいいかとかとかほかツールでも行けるのではみたいな**迷いがエラーを引き起こした**のではと思いここに簡単で雑ではありますが残させていただきました。

ちゃんと動かせましたの証明写真

![スクリーンショット 2023-05-24 3.39.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/2b0a2666-6115-6c9c-f19c-ab31fc8a078f.png)

![スクリーンショット 2023-05-24 2.09.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/ba37df6f-50da-09b4-3715-34b71221e5f6.png)
Windows 環境の Puma(Rails7のデフォルトWebサーバ) でhttps接続する

# OpenSSLのセットアップ

1. PumaのSSL対応を確認する。設定していないので、falseである。
   ```
   ruby -rpuma -e "puts Puma.ssl?"
   ```
 
1. 管理者権限でコマンドプロンプトを起動して、OpenSSLをインストールする。「インストールを行いますか？」に[Y]で答える。
   ```cmd
   ridk exec pacman -S mingw-w64-x86_64-openssl
   ```

1. OpenSSLをインストールしたので、Pumaを再インストールする。今度は true が返る。
   ```cmd
   gem uninstall puma
   bundle install
   ruby -rpuma -e "puts Puma.ssl?"
   ```

# 秘密鍵と自己証明書の作成

- コマンドプロンプトで以下を実行し、自己証明書を作成する。カレントフォルダにキーと証明書が作成される。
  ```cmd
  ridk exec openssl req -x509 -newkey rsa:2048 -nodes -keyout server.key -days 365 > server.crt
  ```

# Pumaの設定と起動

1. Pumaの設定ファイルを修正する。ここではキーと証明書をSSLフォルダに置いた。
   ```rb:config/puma.rb
   ssl_bind '0.0.0.0', '9292', {
     key: 'ssl/server.key',
     cert: 'ssl/server.crt'
   }
   ```
1. `rails s`で起動して、 ブラウザで「https://localhost:9292」にアクセスする。

# 参考
- [github - puma "SSL not available in this build #971"](https://github.com/puma/puma/issues/971)
- [github - RubyInstaller2](https://github.com/oneclick/rubyinstaller2)
- [CentOS7.2 64bit OpenSSLを使用して秘密鍵と自己署名のSSLサーバー証明書を同時に作成](https://www.kakiro-web.com/linux/ssl-2.html)
- [Rails5 + pumaのローカル環境でSSL/HTTPSを有効にする](https://qiita.com/zaru/items/ccf328e87c768168134d)
キーワードを入力すると、論文の一覧を抽出して、翻訳して、エクセルにまとめるコード


概要
===============================

この記事では、ユーザーが入力したキーワードを元にPubMedで医学生物学論文を検索し、その論文に関する情報をエクセルにまとめる方法について解説します。また、抽出したAbstractは日本語に翻訳します。

**手順まとめ**

1. 「胃癌　手術　栄養」などの検索キーワードをユーザーが入力する
1. キーワードを元に医学生物学論文検索サイトPubMedで検索し、関連度の高い論文をピックアップする（最大10個）
1. Abstractを翻訳する
1. リンク、タイトル、年、著者、Abstract、翻訳したAbstractをエクセルにまとめる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/23966a51-5120-dcf6-7abe-0e352fc9099a.png)




手順1: キーワードの入力
-------------

まず、ユーザーが「胃癌　手術　栄養」などの検索キーワードを入力します。このキーワードは、検索したい論文の内容に関連するものを選びます。

:::note info 
入力されたキーワードが日本語の場合は、英語に自動変換します。この変換は、翻訳AI（Pythonのgoogletransライブラリ）を用いて行われます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/1a29c5c5-451a-ed22-9802-6db900ae0e59.png)



手順2: PubMedでの検索
---------------

変換したキーワードを元に、医学生物学論文検索サイトPubMedで検索を行います。このとき、関連度の高い論文を最大10個ピックアップします。

:::note warn
* 検索ワードによってはあまり論文がヒットせず10個に満たないことがあります。
* 上手く著者情報などが取得できない場合があります。
:::


手順3: Abstractを翻訳する
-----------------

次に、Pythonのgoogletransライブラリを用いてAbstractを翻訳します。



手順4: エクセルへのまとめ
--------------

最後に、ピックアップした論文のリンク、タイトル、発行年、著者、Abstract、Abstractの翻訳をエクセルにまとめます。シート名はユーザーが入力した検索ワードとしています。

:::note warn
* エクセルの仕様として、シート名が32文字以上となる場合、31文字で収まるように文字が切り詰められます。
:::

:::note info 
* 複数回実行した場合は、paper.xlsxにシートが追記されていきます。上書きされることはありません。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/3066e79f-dc28-e62c-b056-fd0bb1818618.png)

お知らせ💡
--------------

Streamlitを用いて簡易ウェブアプリにしました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/f5297106-46ea-f54a-0eba-1a4b39cb9a1d.png)




ソースコード一覧
---

ソースコード一覧は下記のGitHubをご覧ください。

https://github.com/Isaka-code/KeywordPaperTranslate

まとめ
---

以上が、キーワードを入力すると、論文の一覧を抽出して、翻訳して、エクセルにまとめるコードです。このコードを用いることで、論文を効率よく探し出してまとめることができれば嬉しいです。ぜひお試しください！

参考文献
---

この記事は以下の情報を参考にして執筆しました。

https://pubmed.ncbi.nlm.nih.gov/

https://qiita.com/iwashi-kun/items/bd0d772c6db0c0023e30

https://qiita.com/gausukyanon/items/0ca0234808d1233989df

https://qiita.com/mochiken__qt/items/7d5ab59d848a3b092c5e

https://streamlit.io/
HTTP Basic: Access deniedでdevcontainerからhttps経由でgitlabに接続できなくなった


dev containerで開発をしている最中に、https経由でのgitlab上のリモートリポジトリに接続できなくなった。間違った認証を持っていたっぽいのだが、解決に結構はまったため、備忘録。

# 環境
- ubuntu20.04 (devcontainer上)

# 問題
devcontainer上で開発している際、httpsでpullやpushをすると以下のようなメッセージが出て、gitlabのリモートリポジトリにアクセスできなくなった。ただしdevcontainerを抜けて、ただのdockerの環境とかでやると何ら問題なくできているので、devcontainerにおける設定の問題と推定。
```bash
HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal
access token instead of a password.
```

# エラーメッセージの意味
上記エラーメッセージが出るのは、以下の場合とのこと。
docker環境でできていることを考慮すると、どちらも違う気がする。。。
- 2ファクタ認証未実施(アクセストークンをそもそも発行していない)
- アクセストークンが間違っている

# 解決策
下記を実行し認証周りをリセット後、再認証を行い、devcontainerをリビルドすることで解決。
おそらくだが、間違った認証情報や参照先を環境変数で持っていたっぽいので、
そこを再設定してあげればよかった模様。
```bash
git config --global credential.helper ''
export GIT_ASKPASS=
```

# 23/11/21追記：認証の再設定　
上記コマンドを実行すると認証周りがリセットされるので、今までPush時に自動で認証を通してアクセスできていたのが、毎回ユーザ名とパスワード(アクセストークン)を入力しないとPushやPullができなくなる。LSFなどもあると何回も入力しないといけなくなるので、非常にストレスフルである。そこで以下を入力することで、認証の内容をキャッシュしたりファイルに格納したりでき、自動で認証される以前の状態に戻すことができる。
```
git config --global credential.helper cache
```
or
```
git config --global credential.helper store
```
前者は、一時的なキャッシュとして情報を持つため時間がたつと再度入力が必要。
後者は、ファイル情報としてストアされるので、永続的？なもよう。
セキュリティ的には前者のほうがよさそうだが、後者のほうが楽といえば楽。
どちらにせよこれで元のdev containerの状態に戻すことができたのでコーディングに集中できる。

# 参考記事
- https://qiita.com/obilixilido/items/046d3224a214d793c0b3
- https://qiita.com/magicant/items/5c8346ce4781f0fe7dce
- https://qiita.com/mtkhs/items/919264a9b04b9ecc5d5a

# 24/12/10
雑多にまとめすぎていたので、改めて以下に整理してまとめた。

https://brbr-tech.com/http-basic-access-denied%e3%81%a7devcontainer%e3%81%8b%e3%82%89https%e7%b5%8c%e7%94%b1%e3%81%a7gitlab%e3%81%ab%e6%8e%a5%e7%b6%9a%e3%81%a7%e3%81%8d%e3%81%aa%e3%81%8f%e3%81%aa%e3%81%a3%e3%81%9f/
ChatGPTはコウメ太夫のクリエイティブさを模倣できるのか？

こんにちは．はじめまして．

いきなりですが，
皆さんはコウメ太夫さんが好きですか？私はものすごく好きです．

「イナゴを食べていたら～、

人々でした～。

チクショー！！」

これはコウメ太夫さんのネタの一つですが，まったく意味が分かりません．しかし，なぜかわらけてくるのです．

2012年に放送された「テベ・コンヒーロ」にて，「コウメ太夫で笑う芸人など存在するのか? 〜コウメ太夫で笑ったら即芸人引退SP～」と題された企画は今でも鮮明に覚えています．
笑ってはいけないと自分自身に暗示すればするほど，コウメ太夫さんのネタが面白くなってくるのです．

そんなコウメ太夫さんのクリエイティブさをChatGPTは模倣できるのでしょうか？
今回は，zero-shot，few-shotでの検証していきます．

まず初めに，ChatGPTにコウメ太夫さんについて知っているか聞いてみます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998598/3a13589d-edb5-1e47-3fb4-794f22668a5a.png)

ChatGPTらしい応答ですね．事実とは異なるがそれっぽい応答をしています．しかし，この内容はコウメ太夫さんのことを落語家だと説明としているので本来の説明とは異なり，ChatGPTはコウメ太夫さんを知らないと思います．

次に，zero-shotで，コウメ太夫さんっぽいネタを作成してもらいます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998598/22a7d945-fdd4-bb01-9a06-f57bc143e2f2.png)

急に漫談を始めました(笑)．コウメ太夫さんのことを本当に落語家だと勘違いしているのでしょう．
ただこれはこれでユーモア性のあるお話をしていて，興味深いですね．

最後にfew-shotでコウメ太夫さんがTwitterで「#まいにちチクショー」とtweetしているネタの中から2例プロンプトに与えて，コウメ太夫さんっぽいネタを作成してもらいます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998598/30037ac8-5f23-9dd6-9460-c86305e3a616.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998598/389fddec-0df1-3d4b-d3e5-125fb6971a5b.png)

ある程度のコウメ太夫さんのネタの規則性を保持しているのですが，少し異なりますね．また，コウメ太夫さんみたいな前後の意味が繋がっていないネタは作ることができないみたいですね．これはChatGPTは賢すぎるが故に，前後の意味が繋がっていない文章として成立していない発話の生成は難しいからと考えられます．

まとめ
今回はfew-shotでコウメ太夫さんのネタをChatGPTに与えることで，コウメ太夫さんのクリエイティブさを模倣できるのかということを検証しました．やはり，コウメ太夫さんのクリエイティブさの模倣は大規模言語モデルは難しいことがわかりました．
コウメ太夫さんのクリエイティブさを尊敬するとともに，大規模言語モデルに，芸人に匹敵するクリエイティブさを付与させる研究を行っていきたいと思います．
【React】MapオブジェクトをStateで管理する場合の留意点

## 概要
ユースケースとしてあまり無いかもしれませんが、JavaScriptのMapオブジェクトをReactのStateで管理する場合、どう更新するのかというのがふと気になりました。
Mapオブジェクトの概要については、[Mapオブジェクトに関して](https://zenn.dev/oreo2990/articles/74ad47c58d299f)にまとめられていますが、更新する際には基本的に作成したオブジェクトに対して、破壊的な変更が行われます。つまり、配列の更新時にハマりがちな、[useStateで配列を更新する](https://zenn.dev/gunners6518/articles/4c06488cfa402e)の記事にある`Object.is()`が同じ値になる問題と、同様の考慮がMapオブジェクトでも必要になってきます。

## 対応
挙げられる対応として、[Using ES6 Map with React State hooks](https://medium.com/swlh/using-es6-map-with-react-state-hooks-800b91eedd5f)の記事にある通り、更新操作を行った後に`new Map`で当該オブジェクトのcloneを作成し、stateにセットするというやり方が挙げられます。

## 実装サンプル
上記の対応内容で、stateを更新する実装サンプルは以下のとおりです。

```react
const [sampleMap, setSampleMap] = useState(new Map());

// Mapの更新操作
const updateMap = (key, value) => {
  sampleMap.set(key, value)
  setSampleMap(new Map(sampleMap));
}
```
【備忘録】AWS VPCを削除する場合に依存関係によるエラーが発生

# AWS VPCを削除することができない時の対処法
## 背景
練習でVPCを立ててネットワークをあれこれ設定して、EC２インスタンスを立てた。
練習が終わってEC2インスタンスを終了し、使用したVPCを削除するときに以下のような事象にあった。
- VPCを削除するには、対象VPCに含まれているネットワークインターフェイスが削除する必要がある
- そのネットワークインターフェイスを削除することが「現在使用中です」的な理由で削除をすることができない

## 原因
EC2インスタンスも削除したはずなのに、なんでネットワークインターフェイスが「現在使用中」となっているのかわからず、削除できない原因がわからなかった。
しかし、対象のネットワークインターフェイスの「説明」という欄を見ると "EFS mount target for fs-hogehogehumhum" と書かれており　AWS EFSのサービス画面から fs-hogehogefumhum のIDで検索すると対象のfsが存在した。
これは、実はEC2インスタンスを立てるときにマウントされたEFSのIDであり、EC2インスタンスを終了させて削除したとしても、これが残っているせいでネットワークインターフェイスが削除できない状態になっていたことが原因だった。

## 削除の手順
1. ネットワークインターフェイスの「説明」の欄を確認する
1. ネットワークインターフェイスを使用しているサービスを確認し、そのサービス画面から対象のサービスIDを検索する
1. 対象のサービスを削除する （対象のサービスを削除すれば、ネットワークインターフェイスは削除される
1. VPCの削除を削除する

## 参考
https://repost.aws/ja/knowledge-center/troubleshoot-dependency-error-delete-vpc
Go言語とは？ 特徴や用途について簡単に調べてみた

## Go言語とは？
Googleが開発したオープンソースのプログラミング言語
別名：golang

開発された2009年当時、コンピューターの処理速度や技術進歩に伴って以下が問題視されているようですが、そんな中でも簡単かつ効率的な開発実現を目指して作られたのが言語のようです。
- コードの複雑化
- 生産効率の低下

最初は「既存言語で事足りる」ということもあってあまり普及はしなかったそうですが、バージョンアップの後にAndriodアプリの開発に使えるようになったのがきっかけで技術スタックとして採用する企業が大幅に増えたとのこと...
Goの公式サイトでも「シンプルで信頼性の高い効率的なソフトウェアを構築できる言語」として紹介されており、未経験者にとってとても学びやすいプログラミング言語となっています。

## Go言語のメリット
- ループ処理はfor文のみ、while文やdo/while文はない
- 変数の型宣言を省略できる
- コードに統一感があるため可読性が高い、コーディングミスを減らせる
- JavaやC言語に構文が似ていて初心者にも理解しやすい
- 高速な処理が可能
- 少ないコードで実装できる
- エラーが発生しにくい
- メモリの安全性が高い

機能削減を行うことでシンプルなコード記述を実現し、可読性が高い点がメリットであり、特徴となっています。

## Go言語のデメリット
- 新しい言語のため、他言語と比較して情報量が少ない
- 継承ができない
- 三項演算子が使えない
- Genericsが実装されたばかりで情報がすくない
- 例外処理がない

上記はGo言語が安全性やコードの可読性を考慮・設計用に削ぎ落とされた機能の一部と言えそうです。

## Go言語の用途
- Webサーバ・Webサービスの構築
- Androidアプリ開発
- IoT開発
- CLI(OS/バージョン/プラットフォーム問わず開発可)

## Go言語での開発事例
- AWA（AWA)
AWA（アワ）は１億曲もの音楽が聴き放題になる、音楽配信サービス
https://awa.fm/
- クックパッド
料理レシピの投稿・検索サービス
https://cookpad.com/
- Gunosy
ネット上にある国外の情報を収集して、各ユーザーが求めているものを届けてくれる情報キュレーションサービス
https://gunosy.co.jp/
- YouTube
- ぐるなび
- メルカリ etc..
logstash parser自動生成

logstashの設定ファイルがChatGPTで生成できるという話

```xml
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Service Control Manager" Guid="{GUID}" EventSourceName="Service Control Manager" />
    <EventID Qualifiers="16384">7036</EventID>
    <Version>0</Version>
    <Level>4</Level>
    <Task>0</Task>
    <Opcode>0</Opcode>
    <Keywords>0x8080000000000000</Keywords>
    <TimeCreated SystemTime="2023-05-23T10:15:27.000000Z" />
    <EventRecordID>123456</EventRecordID>
    <Correlation />
    <Execution ProcessID="0" ThreadID="0" />
    <Channel>System</Channel>
    <Computer>ComputerName</Computer>
    <Security />
  </System>
  <EventData>
    <Data Name="param1">Windows Update</Data>
    <Data Name="param2">running</Data>
    <Binary>ABC1234567890</Binary>
  </EventData>
</Event>
```


```json
input {
  # Logstashの入力設定（例：ファイル入力）
  file {
    path => "/path/to/your/event_log.xml"
    start_position => "beginning"
    sincedb_path => "/dev/null"
    codec => multiline {
      pattern => "<Event xmlns"
      negate => true
      what => "previous"
    }
  }
}

filter {
  xml {
    source => "message"
    target => "parsed"
    force_array => false
    store_xml => false
    xpath => [
      "/Event/System/Provider/@Name", "provider_name",
      "/Event/System/Provider/@Guid", "provider_guid",
      "/Event/System/Provider/@EventSourceName", "event_source_name",
      "/Event/System/EventID/text()", "event_id",
      "/Event/System/Version/text()", "version",
      "/Event/System/Level/text()", "level",
      "/Event/System/Task/text()", "task",
      "/Event/System/Opcode/text()", "opcode",
      "/Event/System/Keywords/text()", "keywords",
      "/Event/System/TimeCreated/@SystemTime", "time_created",
      "/Event/System/EventRecordID/text()", "event_record_id",
      "/Event/System/Channel/text()", "channel",
      "/Event/System/Computer/text()", "computer",
      "/Event/EventData/Data[@Name='param1']/text()", "param1",
      "/Event/EventData/Data[@Name='param2']/text()", "param2"
    ]
  }
}

output {
  # Logstashの出力設定（例：標準出力）
  stdout {
    codec => rubydebug
  }
```
【EditorConfig】言語別にインデントサイズを設定したい


## はじめに

VSCodeのデフォルトのフォーマッターとして`Prettier`を使っているのですが、言語別にインデントのサイズ設定ができずに少し詰まってしまいました。そして色々調べてみた結果、最終的に`EditorConfig`を使う方法を知ったので備忘録として残します。


## 最初に試したこと

`Prettier`のデフォルトのインデントサイズはスペース2つ分ですが、`.scss`だけスペース4つ分に変更したいと思います。そこで、`settings.json`に下記の設定を追加してみました。しかし変化なしです。。

```jsonc:settings.json
"[scss]": {
	"editor.tabSize": 4,
}
```

なぜ、`settings.json`に記述した設定内容より`Prettier`の設定の方が優先されているのか、その辺の詳しい仕組みについてまだわかっていないので、詳しい方がいましたら是非ご教授いただきたいです。。


## EditorConfigとは

インデントのスタイルやサイズ、ファイル末尾の改行や空白の扱いといったエディタの設定を、プロジェクトごとに、好きなファイルタイプ別に設定することができ、さらに異なるエディタ間で共有することができる規格です。
チームメンバーが異なるエディタや環境を使用していたり、設定内容がばらばらでも、EditorConfigを使用することでそれらの書式を統一することが出来ます。
公式ドキュメントで確認できますが、主要なエディタはほとんどサポートされています。

https://editorconfig.org/

## 導入手順

1. `EditorConfig`を検索して、プラグインをインストールします。
    エディタによってはプラグインをインストールせずとも使えるそうですが、VSCodeの場合はプラグインのインストールが必要です。
    ![スクリーンショット (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3340928/3556be27-8970-22bd-d2a6-142e919d1d83.png)

2. 設定を適用させたいプロジェクトルートに`.editorconfig`を作成します。

3. `.editorconfig`に設定内容を記述します。
    今回は`.scss`を対象にインデントサイズをスペース4つ分に指定します。
    ワイルドカードも使えますし、柔軟なファイルタイプ指定が可能です。

    ```.editorconfig
    [*.scss]
    indent_size = 4
    ```
これで無事に`.scss`に対して設定が反映されていました。
設定項目は他にもいろいろあるので、是非公式ドキュメントを参照してみてください。


## あとがき
`EditorConfig`はチーム開発でも役立ちそうですし、このタイミングで知れたのは収穫でした。そして`settings.json`がかなり散らかっていたので、設定を見直す良い機会にもなりました。。
もし間違っている箇所があったり、他にお勧めの設定があったりしたら是非教えていただきたいです。
Sambaの設定ファイル「/etc/samba/smb.conf」、[homes]、[printers]、任意の名前のセクションで使用される主な設定項目

●Sambaの設定ファイル「/etc/samba/smb.conf」には3つの特別なセクションである[global]、[homes]、[printers]セクションと、個々の共有の設定を行う任意の名前のセクションがある。

●[homes]、[printers]、任意の名前のセクションで使用される主な設定項目

・comment=コメント　ブラウジングした際に表示される説明を指定
・path=ディレクトリ名　共有ディレクトリのパスを指定
・writable=yes|no　書き込みを許可するかどうかを指定
・read only=yes|no　読み取り専用にするかどうかを指定
・write list=ユーザ名|@グループ名　writableなどで書き込みを拒否されている場合でも、書き込みができるユーザを指定
・valid users=ユーザ名|@グループ名　アクセス可能なユーザを指定
・guest ok=yes|noまたはpublic=yes|no　ゲストログインを許可するかどうか。yesの場合はパスワード入力なしでゲストとしてログインされる
・hide files=/ファイル名/　表示させたくないファイルやディレクトリを指定。アクセスは可能
・veto files=/ファイル名/　表示させたくないファイルやディレクトリを指定。アクセスも不可
・froce user=ユーザ名　共有内に作成するファイルやディレクトリの所有ユーザを特定のユーザになるように強制する
・froce group=ユーザ名　共有内に作成するファイルやディレクトリの所有グループを特定のグループになるように強制する
CentOSにRedisをインストールする手順

# CentOSにRedisをインストールする手順

1. 必要なパッケージのインストール
CentOS 7にはRedisをインストールするためのパッケージがデフォルトのYUMリポジトリに含まれています。インストールを始める前に、システムを最新の状態に更新しておきます。

    ```bash
    sudo yum -y update
    ```
2. Redisのインストール
次に、以下のコマンドでRedisをインストールします。
    ```bash
    sudo yum -y install redis
    ```
3. Redisの起動
Redisを起動するには、以下のコマンドを使用します。
    ```bash
    sudo systemctl start redis
    ```
4. Redisが正しく動作しているかの確認
インストールが成功したかどうかを確認するために、以下のコマンドを使用します。
    ```bash
    redis-cli ping
    ```
もしRedisが正しく動作している場合、このコマンドはPONGというレスポンスを返します。

5. Redisをシステム起動時に自動的に起動させる設定
システム起動時にRedisが自動的に起動するようにするには、以下のコマンドを実行します。
    ```bash
    sudo systemctl enable redis
    ```

6. 設定を反映させるためにRedisのサービスを再起動する必要があります。以下のコマンドで再起動が可能です。

    ```bash
    sudo systemctl restart redis
    ```
以上でRedisのインストールと設定が完了です
【AWS】CloudFormationでネストされたスタックを動かしてみる

リソースの規模が大きくなるほどコードは長くなるので、可読性は悪くなります。そうなると一部リソースは、ファイルを切り分けて書きたくなることがあります。その場合、テンプレート（スタック）を分けるという手法もありますが、この記事では**ネスト**という仕組みをご紹介したいと思います:boy_tone2:

## イメージ図
<img width="400" alt="スクリーンショット 2023-05-23 23.26.59.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/4b6d7093-58d6-ba7e-401e-e5bcdf627d30.jpeg">

root.yamlを基本のテンプレートとし、vpc.yamlとsg.yamlをネストさせています。

## コード
本記事では構成からコードまで下記記事から拝借したので、ここでは割愛します。

https://dev.classmethod.jp/articles/create-own-verification-environment-using-cfn-nested-stacks/

## スタック作成
この記事ではスタックを**CLI**で作成していきます。

**参考**

https://qiita.com/hiyanger/items/245d96312248017701b0

#### ①S3にネストされるファイルをアップロード
まずはネストされるファイルを**S3にアップロード**します。ネストされたファイルはディレクトリに格納しておくとコマンドを短くできるのでおすすめです。**--recursive**オプションでディレクトリ配下のファイルをコピー可能です。
```
aws s3 cp ネストされたファイルが存在するローカルディレクトリ s3://バケット名 --recursive
```

#### ②スタック作成
あとは通常通りスタックを作成します。ネストされる**オブジェクトURL**をパラメータにしているので、パラメータファイルを別で作成し、コマンド内で取得させます。
```
aws cloudformation deploy --stack-name test-stack --template-file root.yaml --parameter-overrides $(cat parameter.yaml)
```

パラメータはこんな感じ。
```yaml:parameter.yaml
TemplateSG=https://バケット名.s3.ap-northeast-1.amazonaws.com/sg.yaml
TemplateVPC=https://バケット名.s3.ap-northeast-1.amazonaws.com/vpc.yaml
```

成功するとスタック上にも**ネストされた**と表示されます。
![スクリーンショット 2023-05-23 23.56.29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/6f674184-fe75-9619-b076-4f9d74ca790a.jpeg)

これでネストされたスタックの作成は完了です。スタック単位での分割とネストの使いわけですが、**大きいレイヤーであればスタック単位、小さい単位であればネスト**という考え方でよいかと思います。

具体的なリソースを出すと**スタック単位でIAM、ネットワーク、CW、EC２あたり**を分割。さらにこれらのリソースを分割する場合はネストさせます。大規模な環境であればIAMやRT、CW、SGあたりはコードが非常に長くなるので、ネストという手法を大いに生かせそうです。

スタックを分割させると**依存関係**がある場合、これを成立させる必要があります。この内容に関してもまた別途記事を書いてみようと思います:sparkles: