OmniAICreator/Qiita-1.07M huggingface dataset:
Neovimもいいぞ

# はじめに
株式会社OMJテクノソリューションズ Advent Calendar 2023　10日目の記事です。

こんにちは、かわしまです。
エンジニア一年目で、日頃はSESとして働いております。

今回は閉じ方が分からないことで有名（？）なVimの派生であるNeovimについて書いていきたいと思います！

# なぜNeovim？
みなさんエディタは何を使っていらっしゃいますか？私はVS Codeも使いますが、基本的にはNeovimを使用しています。
ITの勉強を始めた頃はVimを使っており、今年に入ってNeovimに乗り換えました。
まだエンジニアとしては未熟な私ですが、Neovimの良さを少しでもお話できたらと思います。
布教はしていきたいですが、強要するものではないのでご安心ください。

# Vim vs Neovim
本題に入る前に、そもそもVimとNeovimは何が違うのかをご紹介します。
VimはViというエディタの派生として開発され、1991年に公開されました。現在ではLinux系の標準エディタとして普及しています。
Neovimは、そんなVimから派生して生まれたエディタです。Vimの開発コミュニティの中で、先進的な技術を取り入れていくかどうかで意見が別れた結果、先進的な考えを持っていた人たちがVimをフォークして開発したのがNeovimだそうです。そんな背景が有り、現在もNeovimの機能拡張のための開発は現在も進んでおり、プラグインの開発も活発です。また、操作方法も基本的にVimやNeovimも変わらないので、これから触ってみたいという方はNeovimから始めるのが良いかと思います。

# 操作方法
これがNeovim（以降特に言及がなければNeovimをVimと表記します）一番の特徴かと思います。h, j, k, lでのカーソル操作が可能です。一応矢印キーで操作することも可能です。しかし、Vimを使うのであればhjklでの操作になれることをおすすめします。何と言ってもホームポジションを崩すことなくカーソルを移動すことが可能なのです。これだけではなく、基本的にVimの操作はホームポジションを崩さず操作することを考えてキーが配置されています。
また、Vimにはモーション、オペレータ、テキストオブジェクトといった概念があり、これらを組み合わせると効率的に編集を行うことができます。

### モーション
カーソルの移動キーのことです。hjklもモーションに含まれます。次のようなモーションがあります。


### オペレータ
編集機能（削除やコピー）のキーのことです。よく聞くのはx（カーソル下の文字削除）やy（ヤンク：コピーのこと）でしょうか。

### テキストオブジェクト
ルールに基づいたテキストのまとまりのことです。カッコの中の文字全体やクウォートを含めて全体といったテキストを選択することができます。

オペレータのdとテキストオブジェクトのi)を組み合わせると、()の中の文字を一度に消すことが可能になります。
また、VS Codeの拡張機能にVimライクなキーバインドにするものがあるので、この操作方法で快適に操作したいと思った方はそちらを導入してみてはいかがでしょうか。

# カスタマイズ性
何と言ってもここがVimの売りかなと思います。プラグインが充実していて、自分の好きなようにカスタマイズすることが可能です。最初は質素な画面ですが、少しずつプラグインを設定していくことでリッチな画面になっていきます。ファイルツリーを表示させるプラグインも有り、IDEのようにカスタマイズすることもできます。

![スクリーンショット 2023-11-23 14.24.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1677208/df0bc9fd-3976-997b-cce8-dc0be6cf35cf.png)


だったらVS Codeでいいじゃないかという声もあると思いますが、おっしゃるとおりです。一から設定するとかなり時間がかかるので、正直めんどくさいと思います。私はちまちま設定してでも、自分好みのエディタにするのが向いていたので現在も使っています。今はIDE化するために様々なプラグインをまとめたようなプラグインがあるので興味がある方はそちらの導入から初めていただくのが良いかと思います。

# 最後に
最後まで読んでいただき、ありがとうございました。
今回はNeovimの良さを語るだけになってしまいましたが、今後導入しているプラグインなども共有していければと思います。
それではよいVimライフを！！
AlmaLinux OS 9にRedis 7をインストール（AppStream）

# はじめに

Application Stream(AppStream)を利用してAlmaLinux OS 9にRedis 7をインストール

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux Application Streams Life Cycle \- Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhel-app-streams-life-cycle)より、2026-11がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
AlmaLinux release 9.3 (Shamrock Pampas Cat)

# yum module list redis
Last metadata expiration check: 0:00:26 ago on Thu Nov 23 05:36:27 2023.
AlmaLinux 9 - AppStream
Name                  Stream                Profiles                  Summary
redis                 7                     common [d]                Redis persistent key-value database

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

# yum module install -y redis:7
... 略
```

### 各種確認

```shell-session
# which redis-server
/usr/bin/redis-server

# /usr/bin/redis-server -v
Redis server v=7.0.12 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=fc0dd1598e160a57

# yum info redis
Last metadata expiration check: 0:01:25 ago on Thu Nov 23 05:36:27 2023.
Installed Packages
Name         : redis
Version      : 7.0.12
Release      : 1.module_el9.3.0+38+47d78df1
Architecture : x86_64
Size         : 5.7 M
Source       : redis-7.0.12-1.module_el9.3.0+38+47d78df1.src.rpm
Repository   : @System
From repo    : appstream
Summary      : A persistent key-value database
URL          : https://redis.io
License      : BSD-3-Clause AND BSD-2-Clause AND MIT
Description  : Redis is an advanced key-value store. It is often referred to as a data
             : structure server since keys can contain strings, hashes, lists, sets and
             : sorted sets.
             :
             : You can run atomic operations on these types, like appending to a string;
             : incrementing the value in a hash; pushing to a list; computing set
             : intersection, union and difference; or getting the member with highest
             : ranking in a sorted set.
             :
             : In order to achieve its outstanding performance, Redis works with an
             : in-memory dataset. Depending on your use case, you can persist it either
             : by dumping the dataset to disk every once in a while, or by appending
             : each command to a log.
             :
             : Redis also supports trivial-to-setup master-slave replication, with very
             : fast non-blocking first synchronization, auto-reconnection on net split
             : and so forth.
             :
             : Other features include Transactions, Pub/Sub, Lua scripting, Keys with a
             : limited time-to-live, and configuration settings to make Redis behave like
             : a cache.
             :
             : You can use Redis from most programming languages also.
```
RockyLinux OS 9にRedis 7をインストール（AppStream）

# はじめに

Application Stream(AppStream)を利用してRockyLinux OS 9にRedis 7をインストール

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux Application Streams Life Cycle \- Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhel-app-streams-life-cycle)より、2026-11がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
Rocky Linux release 9.3 (Blue Onyx)

# yum module list redis
Last metadata expiration check: 0:04:45 ago on Thu Nov 23 05:27:33 2023.
Rocky Linux 9 - AppStream
Name                  Stream                Profiles                  Summary
redis                 7                     common [d]                Redis persistent key-value database

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

# yum module install -y redis:7
... 略
```

### 各種確認

```shell-session
# which redis-server
/usr/bin/redis-server

# /usr/bin/redis-server -v
Redis server v=7.0.12 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=fc0dd1598e160a57

# yum info redis
Last metadata expiration check: 0:07:04 ago on Thu Nov 23 05:27:33 2023.
Installed Packages
Name         : redis
Version      : 7.0.12
Release      : 1.module+el9.3.0+15782+e7b53f1b
Architecture : x86_64
Size         : 5.7 M
Source       : redis-7.0.12-1.module+el9.3.0+15782+e7b53f1b.src.rpm
Repository   : @System
From repo    : appstream
Summary      : A persistent key-value database
URL          : https://redis.io
License      : BSD-3-Clause AND BSD-2-Clause AND MIT
Description  : Redis is an advanced key-value store. It is often referred to as a data
             : structure server since keys can contain strings, hashes, lists, sets and
             : sorted sets.
             :
             : You can run atomic operations on these types, like appending to a string;
             : incrementing the value in a hash; pushing to a list; computing set
             : intersection, union and difference; or getting the member with highest
             : ranking in a sorted set.
             :
             : In order to achieve its outstanding performance, Redis works with an
             : in-memory dataset. Depending on your use case, you can persist it either
             : by dumping the dataset to disk every once in a while, or by appending
             : each command to a log.
             :
             : Redis also supports trivial-to-setup master-slave replication, with very
             : fast non-blocking first synchronization, auto-reconnection on net split
             : and so forth.
             :
             : Other features include Transactions, Pub/Sub, Lua scripting, Keys with a
             : limited time-to-live, and configuration settings to make Redis behave like
             : a cache.
             :
```
RockyLinux OS 9にNodejs 20をインストール（AppStream）

# はじめに

Application Stream(AppStream)を利用してRockyLinux OS 9にNodejs 20をインストール

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux Application Streams Life Cycle \- Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhel-app-streams-life-cycle)より、2026-04がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
Rocky Linux release 9.3 (Blue Onyx)

# yum module list nodejs
Last metadata expiration check: 0:00:38 ago on Thu Nov 23 05:27:33 2023.
Rocky Linux 9 - AppStream
Name                Stream              Profiles                                          Summary
nodejs              18                  common [d], development, minimal, s2i             Javascript runtime
nodejs              20                  common [d], development, minimal, s2i             Javascript runtime

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

# yum module install -y nodejs:20
... 略
```

### 各種確認

```shell-session
# which node
/usr/bin/node

# /usr/bin/node -v
v20.9.0

# yum info nodejs
Last metadata expiration check: 0:01:14 ago on Thu Nov 23 05:27:33 2023.
Installed Packages
Name         : nodejs
Epoch        : 1
Version      : 20.9.0
Release      : 1.module+el9.3.0+15899+0a70ceb7
Architecture : x86_64
Size         : 50 M
Source       : nodejs-20.9.0-1.module+el9.3.0+15899+0a70ceb7.src.rpm
Repository   : @System
From repo    : appstream
Summary      : JavaScript runtime
URL          : http://nodejs.org/
License      : MIT and ASL 2.0 and ISC and BSD
Description  : Node.js is a platform built on Chrome's JavaScript runtime
             : for easily building fast, scalable network applications.
             : Node.js uses an event-driven, non-blocking I/O model that
             : makes it lightweight and efficient, perfect for data-intensive
             : real-time applications that run across distributed devices.
```
ループ処理：while文基本

# 初学者の備忘録
初学者の備忘録です。今回はJavaScriptのループ処理：while文基本編です。


## while文
指定した条件が満たされている間だけ指定された範囲のコードを繰り返し実行する、ループ処理の制御構文の一つ。


## whileの基本形
まずはwhile文の基本コード
```ruby:while

// 条件式に使う変数の初期化処理
let 変数名 = 0；

while (条件式) {
    // 繰り返し処理
    console.log(変数名);
    // 条件式に使う変数の値の更新
    変数名 = 変数名 + 1;
}
```

基本コードはこうなります。少し文章で補足を入れると
変数名はなんでもいいです。変数名はデータを入れる入れ物のようなイメージなので好きに決めてください。
最初の１行目は条件式に使用する変数の初期化で、プログラミングは０から考えるので初期化に０を使いました。０でなくても構いません。
１行目で大切なのは条件式がこれから始まる上での`初期値を変数`に入れるということです。

次はwhile文を使用して条件式を設定してあげます。条件式に入るのは条件の範囲決めです。どこからどこまでの範囲を繰り返し処理するのか決めています。
変数に入っているデータが条件に合格したら下の行へ行き、console.logで変数を出力します。またデータが下の行へ行き、＋１足して１行目へ戻り、変数名に＋１されたデータが格納されまた条件式を通るを繰り返し、最終的に条件が合わなくなるまで処理を続ける。
これがwhile文の基礎でありループ処理です。

次は実際に具体例を出していきたいと思います。

```ruby:具体例
// 条件式に使う変数の初期化処理
var count = 0;

while (count < 6) {
    // 繰り返し処理
    console.log(count);
    // 条件式に使う変数の値の更新
    count = count + 1;
}

// 最後の数を表示する
console.log("last:" + count);
```

上記のコードは変数名countに０が入っています。条件式は６より小さい数（０〜６）を出力するという処理です。
そして最後の行は実際に処理が終わった時の数はいくつなのか分かりやすく表示するためにつけました。

上記のコードを実行すると、0〜５数字が順番に出力されます。つまり条件に合わなくなる６までは処理をされたということになるのでループ処理されているということです。


## 最後に
今回はwhile文の基礎なのでとても簡単にまとめましたが、ここで初期値を変えたり、＋１づつ増やさないで＋２づつや＋１０づつなど様々な方法がありますが、基礎を覚えていてば応用もできそうなのでしっかりと覚えておきたいところですね。
それでは以上で終わりたいと思います。お疲れ様でした。
エンジニアが質問するときに気をつけること

エンジニア初心者から新しい場所で働くエンジニアの全員が共通して経験するのが、わからなかった時や詰まった時の質問。
人によっては対面で質問した方が聞きやすかったり、slackで全体に投げて誰かに教えてもらったり、色々な聞き方があると思います。
正しいタイミングで正しい質問の仕方について記事にしていきます。

## 質問のタイミング
おそらくタイミングを伺っていたら、かなり熟考してしまい、気づいたら夕方になっていたことなどはありませんか？（自分は腐るほどあります）
そんな時に以下の記事を参考にしてみてください。

https://rookie-programmer.jp/?p=132#:~:text=15%E5%88%86%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%A8%E3%81%AF,%E3%81%9D%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%AF%E7%B5%B6%E5%A4%A7%E3%81%A7%E3%81%99%E3%80%82

15分ルールを設定すれば、一旦は誰かに質問を投げてみて、思考は進める方が、進捗を把握したい上司やチーム、タスクを一人で抱え込んでしまう自分にとっても遥かに気持ちが楽になります。

１５分間エラーが改善されない、仕様が理解できない、環境構築がうまくいかない場合は、とりあえず質問してしまいましょう。それで怒られたとしても、あなたのせいではなく、怒った人なので、気にせず質問しましょう。
※記載されている15分はあくまでも目安なので、自分なりの時間設定で構いません。

## 質問の場所
質問の場所は基本的にオンライン上でやり取りしましょう。理由としては履歴が遡れるので、他の人も後追いができるのと、課題を解決するために色々な記事を共有するので、必ずオンラインでやり取りしましょう。仮にオフィスの真隣に相手が座っていてもオンラインでしましょう。（少々気まずいですが…）

もしslackなどのツールを使っている場合は、特定の個人にDMするかグループに質問するか迷うと思いますが、必ずグループに質問を投げましょう。人によってはミーティングで対応できなかったりするので、空いている人が対応できるようにしましょう。


## 補足
僕はいきなり人に質問するのは気まずいので、社内twitterなどに困り事や悩み事を逐一記載するようにしています。たまにそれを見て、誰かが助言してくれて解決するケースもあるので、おすすめです。

https://blog.studysapuri.jp/entry/2018/11/14/working-out-loud
AlmaLinux OS 9にNodejs 20をインストール（AppStream）

# はじめに

Application Stream(AppStream)を利用してAlmaLinux OS 9にNodejs 20をインストール

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux Application Streams Life Cycle \- Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhel-app-streams-life-cycle)より、2026-04がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
AlmaLinux release 9.3 (Shamrock Pampas Cat)

# yum module list nodejs
Last metadata expiration check: 0:00:25 ago on Thu Nov 23 05:24:14 2023.
AlmaLinux 9 - AppStream
Name                Stream              Profiles                                          Summary
nodejs              18                  common [d], development, minimal, s2i             Javascript runtime
nodejs              20                  common [d], development, minimal, s2i             Javascript runtime

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

# yum module install -y nodejs:20
... 略
```

### 各種確認

```shell-session
# which node
/usr/bin/node

# /usr/bin/node -v
v20.9.0

# yum info nodejs
Last metadata expiration check: 0:01:30 ago on Thu Nov 23 05:24:14 2023.
Installed Packages
Name         : nodejs
Epoch        : 1
Version      : 20.9.0
Release      : 1.module_el9.3.0+48+1cf146a1
Architecture : x86_64
Size         : 50 M
Source       : nodejs-20.9.0-1.module_el9.3.0+48+1cf146a1.src.rpm
Repository   : @System
From repo    : appstream
Summary      : JavaScript runtime
URL          : http://nodejs.org/
License      : MIT and ASL 2.0 and ISC and BSD
Description  : Node.js is a platform built on Chrome's JavaScript runtime
             : for easily building fast, scalable network applications.
             : Node.js uses an event-driven, non-blocking I/O model that
             : makes it lightweight and efficient, perfect for data-intensive
             : real-time applications that run across distributed devices.
```
features構成で整理してみた。（Next.js ）

# なぜfeatures構成にしたのか（初めに）
・アトミックデザインからの脱却
・プロダクトごとに管理できるようにしたい
・ドメインを意識した開発ができるようにしたい
## アトミックデザインからの脱却
前にNuxt.jsを触っていた時にこれ辛いなぁ..と思ったのが、organimsの肥大化です。
どのコンポーネントをどのプロダクトで扱っているのかが分からず、コードを追う時間がかなり長かったという経験があり、アトミックデザインからの脱却を図っています。
その点、featuresのディレクトリ構成はプロダクトごとにコンポーネントを管理できるのでかなり管理しやすいのではないかと思います。
## プロダクトごとに管理できるようにしたい
上記に書いたことと被りますが、プロダクトごとに管理ができるのでコンポーネントを扱いやすいのと、命名規則にあまり悩まずに済むのかと思います。
例えば、認証機能であるのなら Auth - register,login みたいにかなりシンプルにできますね。
## ドメインを意識した開発ができるようにしたい
features構成はプロダクトごとにUI,型、ロジックと隠蔽できるので、そのプロダクトに対しての開発に集中できるため開発がしやすいですね。

## 実際のディレクトリ構造の一例 (認証機能)
```
root/
   ┝ components/
       └ elements/   
       　　　　　└ Button/
            └ EButton.tsx
          └ TextField
            └ ETextField.tsx
            └ ENumberTextField.tsx
       └ layouts/
          └ Header/
          └ Footer/
          └ Main/
       
   ┝ features
       └ Auth
          └ api
              └　RegisterApi.tsx
          └ components
              └ Register.tsx
              └ Login.tsx
          └ hooks
              └ useRegister.tsx
              └ useLogin.tsx
          └ styles
              └ AuthStyle.tsx
          └ types
              └ RegisterType.tsx
              └ LoginType.tsx
　　　　　　┝ pages
```

# 参考記事一覧
Next.jsディレクトリ構成・設計再考（featuresが何を解決するか）
https://zenn.dev/yodaka/articles/eca2d4bf552aeb

Reactのディレクトリ構成にfeaturesを導入してみた
https://tech.anotherworks.co.jp/article/react-typescript-architecture
ぼくの考えたさいきょうのUNIXコマンドデッキ

# はじめに

株式会社OMJテクノソリューションズ Advent Calendar 2023　6日目の記事です。

こんにちは、add2です。
みなさんは好きなUNIXコマンドってありますか？
今回は私がつい手癖で入力してしまうUNIXコマンドを使用場面を踏まえて3つご紹介いたします！

かなり初歩的な内容ではありますが、業務でよく使うという点では初学者の方にぜひ読んでいただきたいです１
「サーバなんか持ってないやい！」という方もMacをお使いであればターミナルからコマンドを試すことができます！

# tail
私は業務でバックエンドを主戦場としているため、
サーバーにデプロイされているアプリケーションのログを見ることが染み付いています。
そんな時、リアルタイムでどんなログが出力されているかを確認できるのがtailです

```
$ tail -f /ファイルパス
```
tailコマンドはファイルの最後の数行するコマンドなのですが、
-fオプションをつけてログファイルを参照すると、リアルタイムで出力されるログを監視できちゃいます。

マイクラなどのゲームサーバをプライベートで持っている方は、ゲームをしながらログを垂れ流してみると2倍楽しめるかと思います！

簡単に試す方法としては
 ①2つウィンドウを開く　
 ②片方のウィンドウで適当なファイルを作成してtail -fで画面出力させる
 ③もう片方のウィンドウでファイルの追記を行う

これであなたもtailコマンドの申し子になれます！

# top
なんかサーバが重いな・・・
今裏で何動いてるのかな・・・
どのぐらいリソース使ってるのかな・・・
こんな時に「とりあえず叩いておけ」と個人的に思うのがtopコマンドです。

```
$ top
```
何も難しいことはありません！
とりあえずコンソールにtopと打ち込むのです！
おそらくあなたのPC、あるいはサーバでどんなプロセスが動いていて、メモリやCPUをどれぐらい食っているかがリアルタイムで見れるはずです。

もし特定ワードで絞り込みたい場合は
```
$ top | grep 絞り込みたい特定ワード
```
でいけます。

私は大雑把にサーバリソースを把握するためにtopを叩いたりするのですが、
もし他の観点でサーバリソースを確認したい場合のコマンドは以下の記事がわかりやすいかと思います。

[Linuxリソースの監視・確認に関するコマンド逆引きメモ](https://qiita.com/rsooo/items/42f0902d42bab6ecf175)

# ll
まずは入力から。こちらも超シンプル。
```
$ ll
```
厳密にいうとllはコマンドではないのですが、私はよく手癖で打ってしまいます。
llの正体が何かというと、
```
$ ls -l
```
のエイリアスです。

超わかりやすく言えば「ls -l」を「ll」だけで済ませられるということです。
ただし、これはOS（ディストリビューション）やバージョンによってデフォルトで設定されているかが異なります。
私もよくMacでllと打って怒られます。
（Macはデフォルトでllのエイリアスが設定されていません）
```
$ ll                    
zsh: command not found: ll
```

ちなみにUbuntu 20.04.5 LTSでllのエイリアス内容を確認したところ
```
alias ll='ls -alF'
```
となっておりました。
つまり、Ubuntu 20.04.5 LTSでllと打つと
lsコマンドを
- a →　隠しファイルを表示
- l →　リスト形式で表示
- F →　タイプ識別子を表示
で叩いたのと同じ結果となるわけです。

llの便利さとエイリアスのありがたさをご理解いただけましたでしょうか？

# 最後に

私が業務、プライベートともによく使うコマンド3つをご紹介しました！
ぜひみなさんの思う便利なコマンドや、手癖でよく使ってしまうコマンドを教えてください！
コメントお待ちしております！！！
RockyLinux OS 8にNodejs 20をインストール（AppStream）

# はじめに

Application Stream(AppStream)を利用してRockyLinux OS 8にNodejs 20をインストール

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux Application Streams Life Cycle \- Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhel-app-streams-life-cycle)より、2026-04がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
Rocky Linux release 8.9 (Green Obsidian)

# yum module list nodejs
Last metadata expiration check: 0:00:37 ago on Thu Nov 23 05:19:30 2023.
Rocky Linux 8 - AppStream
Name                Stream              Profiles                                          Summary
nodejs              10 [d]              common [d], development, minimal, s2i             Javascript runtime
nodejs              12                  common [d], development, minimal, s2i             Javascript runtime
nodejs              14                  common [d], development, minimal, s2i             Javascript runtime
nodejs              16                  common [d], development, minimal, s2i             Javascript runtime
nodejs              18                  common [d], development, minimal, s2i             Javascript runtime
nodejs              20                  common [d], development, minimal, s2i             Javascript runtime

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

# yum module install -y nodejs:20
... 略
```

### 各種確認

```shell-session
# which node
/usr/bin/node

# /usr/bin/node -v
v20.9.0

# yum info nodejs
Last metadata expiration check: 0:01:12 ago on Thu Nov 23 05:19:30 2023.
Installed Packages
Name         : nodejs
Epoch        : 1
Version      : 20.9.0
Release      : 1.module+el8.9.0+1584+0f2e6a8b
Architecture : x86_64
Size         : 51 M
Source       : nodejs-20.9.0-1.module+el8.9.0+1584+0f2e6a8b.src.rpm
Repository   : @System
From repo    : appstream
Summary      : JavaScript runtime
URL          : http://nodejs.org/
License      : MIT and ASL 2.0 and ISC and BSD
Description  : Node.js is a platform built on Chrome's JavaScript runtime
             : for easily building fast, scalable network applications.
             : Node.js uses an event-driven, non-blocking I/O model that
             : makes it lightweight and efficient, perfect for data-intensive
             : real-time applications that run across distributed devices.
```
AlmaLinux OS 8にNodejs 20をインストール（AppStream）

# はじめに

Application Stream(AppStream)を利用してAlmaLinux OS 8にNodejs 20をインストール

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux Application Streams Life Cycle \- Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhel-app-streams-life-cycle)より、2026-04がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
AlmaLinux release 8.9 (Midnight Oncilla)

# yum module list nodejs
Last metadata expiration check: 0:00:35 ago on Thu Nov 23 05:16:05 2023.
AlmaLinux 8 - AppStream
Name                Stream              Profiles                                          Summary
nodejs              10 [d]              common [d], development, minimal, s2i             Javascript runtime
nodejs              12                  common [d], development, minimal, s2i             Javascript runtime
nodejs              14                  common [d], development, minimal, s2i             Javascript runtime
nodejs              16                  common [d], development, minimal, s2i             Javascript runtime
nodejs              18                  common [d], development, minimal, s2i             Javascript runtime
nodejs              20                  common [d], development, minimal, s2i             Javascript runtime

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

# yum module install -y nodejs:20
... 略
```

### 各種確認

```shell-session
# which node
/usr/bin/node

# /usr/bin/node -v
v20.9.0

# yum info nodejs
Last metadata expiration check: 0:01:35 ago on Thu Nov 23 05:16:05 2023.
Installed Packages
Name         : nodejs
Epoch        : 1
Version      : 20.9.0
Release      : 1.module_el8.9.0+3684+11b9e959
Architecture : x86_64
Size         : 51 M
Source       : nodejs-20.9.0-1.module_el8.9.0+3684+11b9e959.src.rpm
Repository   : @System
From repo    : appstream
Summary      : JavaScript runtime
URL          : http://nodejs.org/
License      : MIT and ASL 2.0 and ISC and BSD
Description  : Node.js is a platform built on Chrome's JavaScript runtime
             : for easily building fast, scalable network applications.
             : Node.js uses an event-driven, non-blocking I/O model that
             : makes it lightweight and efficient, perfect for data-intensive
             : real-time applications that run across distributed devices.
```
初めてのSalesforce

# はじめに

　株式会社OMJテクノソリューションズ Advent Calendar 2023 12日目の記事です。

　こんにちは、hideです。
　日頃の業務としてバックエンド中心の開発業務に携わっています。
　今回、会社に入って初めて知ったSalesforceの紹介をしたいと思います。

## Salesforceって何？
　遅ればせながら私は2023年の春にこの言葉を知りました。
　元々"マーケティング"や"セールス"、"プログラミング言語"といった単語と無縁の生活をしていたものでして。。
　今年知った単語の一つでもある"Salesforce"
　結局Salesforceって何？
　一言で言えば、営業支援（SFA）や顧客管理（CRM）に特化したクラウドサービスです。
　グローバル市場におけるCRMのシェア率は10年連続で世界No.1なんだとか。

## Salesforceはどんな時に使える？
　Salesforceは、以下のような条件を満たしたい時におすすめです。
 自社によって用途が異なり、使用するサービスが変わりますが、情報の一元化はSalesCloudなどを活用することをおすすめします。
 
1. 顧客のアカウント情報や取引先履歴など一元化したい
2. リードから契約までの流れを効率化したい
3. キャンペーン管理や顧客の行動データを分析して、効果的なマーケティング戦略を立案したい
4. カスタマーサポートの問い合わせ管理や解決プロセスを効率化し、顧客満足度を高めたい
5. レポートやダッシュボードで売上や行動などを管理し、PMなどの意思決定を容易にしたい

# Salesoforceにはどんなサービスがあるの？
　Salesforceには以下のようなサービスがあり、自社の目的に応じてサービスを組み合わせ、業務効率の向上や改善などに使用します。

* Sales Cloud（顧客管理）
* Account Engagement（見込み顧客の行動可視化および分析）
* Service Cloud（顧客サポート）
* Marketing Cloud（マーケティング活動支援）
* Commerce Cloud（Eコマース支援）
* Tableau（データ分析）
* Slack（メッセージによるコミュニケーション基盤の構築）
* Salesforce Platform（ビジネスニーズに応じたカスタマイズ）
* MuleSoft Anypoint Platform（システム間の統合）

## 自社でSalesforceを使ってみた
##### ◆導入のきっかけ
　自社としては、SESでフロント・バックエンドの多くの仕事を引き受ける状況の中、これまで個々で案件情報や顧客との繋がりを管理していたため、情報が属人化する状況でした。
　そういった背景を踏まえ、SalesCloudを活用し、情報の一元化。社内での情報シェアや営業フローなどを作成する事が導入のきっかけとなりました。

SalesCloudの導入前、何を勉強すれば良いんでしょうか。。
困った時、Salesforceの公式ページが役に立ちました！
1ヶ月の勉強を経て、無事に認定アドミニストレーターの資格を取りました！
<br>
次の記事で<font color="DarkKhaki">最短1ヶ月1発</font>で資格を取った方法を記載します！
黒い画面生活のQOLを上げるために

# はじめに
株式会社OMJテクノソリューションズ Advent Calendar 2023　6日目の記事です。

こんにちは、かわしまです。
エンジニア一年目で、日頃はSESとして働いております。

今回は黒い画面こと、ターミナルで過ごす際のQOLを上げるために私が使っているプラグインやツールについて書いていきたいと思います！

ただ、今回は詳細な設定ファイル（いわゆるdotfile）はないです、すみません。。。こちらを承知の上読んでいただけると幸いです。

# なぜターミナル？
私は日頃開発はMacでNeovimを使っているため、ターミナルの環境整備も行っています。
時間があるときにいいプラグインないかなと探すと、新しいものが見つかったりします。
ですので、日頃私が使っているツールやプラグイン等を共有するとともに（目新しいものはないかもしれませんが）
読んでいる方のターミナルの設定や知らないプラグインを教えてほしい!という思いで、こちらの記事を書かせていただきました。

# ターミナル
iTerm2を使っています。他にもターミナルアプリがありますが、他はMacデフォルトのものやWarpというものしか触ったことがないので他によさげなものがあれば教えてください。 iTerm2はMacデフォルトのものと基本的な使用感は変わらず、機能をプラスしたものなのでこちらに移行してもあまり違和感なく使えるのかなと思います。

また、カラーテーマはSolarized Darkがお気に入りです。他のツールでも基本的にはSolarized Darkを設定しています。
 
このあとはターミナルのカスタマイズの話になりますが、そんなのめんどくさいという方はWarpを一度触ってみてほしいです。
WarpはAIを導入した次世代ターミナルアプリと銘打っていて、コマンドの補完やワークフローの作成が可能となっています。カスタマイズが反映されないので私とは相性が悪かったですが、カスタマイズせずに快適にターミナルを使いたいという方にはおすすめかと思います。

# シェル
zshを使っています。Macを使っている方だと、最近はzshがデフォルトになっているかと思います。カスタマイズに興味を持った頃は特にシェルを気にしていなかったので、zshをそのまま使っています。
 
zshには様々なプラグインがあり、導入することでコマンドの補完やディレクトリ移動を楽にすることができます。その際にフレームワークを使用すると、プラグインの導入やターミナルのデザインのカスタマイズを比較的簡単にすることができます。
 
因みに、fishというシェルがあるのですが、コマンドの補完やデザインのカスタマイズ機能がデフォルトで入っているので、カスタマイズしてみたいという方はfishを使ってみるのもいいかもしれません。

# フレームワーク
Oh My Zshを使っています。zshフレームワークの中で、主流の一つです。しかし、最近ではzshの起動がより高速なフレームワークが出ているようで、そちらに移行したいと思っているのですが、再度セッティングするのが面倒で移行できていません。これからカスタマイズをする方は最新のフレームワークを使ってみるのが良いかと思います。（Zimとか）

# テーマ
Powerlevel10kを使っています。ここでいうテーマというのはデザインの種類のことです。Powerlevel10kは人気のテーマで、様々な情報（OSの種類やバージョン管理ツール名等）をターミナル上に表示できるとともに、鮮やかなデザインとともにターミナルを彩ることができます。

また指定のフォント(Nerd Font)を導入すると、OSがMacの場合はりんごアイコン、Gitで管理されているディレクトリにいるとGitアイコンが表示されるようになります。
# プラグイン
私が導入しているのは以下の三つです。
- zsh-autosuggestions
- zsh-syntax-highlighting
- web-search

### zsh-autosuggestions
入力履歴に基づいてコマンドを保管してくれます。何度も同じコマンドを打つ際に便利です。

### zsh-syntax-highlighting
入力したコマンドや引数に色をつけてくれます。視覚的に見栄えが良くなるのもそうですが、間違ったコマンドの時は赤色になるのでコマンドが間違っているかどうかが視覚的にわかりやすくなります。

### web-search
コマンドライン上から指定した検索エンジンやサイトで検索できるようになります。Googleはもちろん、BraveやGithub、Youtubeの検索もできます。
エラーなどが出た際にアプリを切り替えずに検索することができるので便利です。


# TMUX
最後にTMUXについて紹介します。ターミナルマルチプレクサ（Terminal Multiprexer）の略で、セッション、ウィンドウ、ペインに分割してターミナルを利用できるようになります。この場では細かい説明は省略しますが、複数のターミナルのウィンドウを開かなくても一つのウィンドウで複数のセッションを立ち上げることができます。ターミナル上で複数の作業をする際に便利です。
 
また、ショートカットコマンドを設定することができて、ウィンドウやペインを簡単に移動することも可能です。以前フロントエンドとバックエンドを同時に作業しなければなかった際はウィンドウ毎にフロントとバックのプロジェクトを展開し、キー一つでプロジェクトを移動することができたので重宝しました。VS Codeだとここまで簡単に移動することができない（私が無知なだけかもしれませんが...）と思うので、これはターミナル上で開発する一つの利点かなと考えています。

# 最後に
ここまで読んでいただき、ありがとうございました！以上が私のターミナル生活QOL上げるためのプラグイン、ツールの紹介でした。今後はdotfileも共有できればなと考えています。
また、もし読んでくださった方でこんなのおすすめだよ！というものがあれば教えていただけると幸いです。

# 参考文献
* [iTerm2](https://iterm2.com/)
* [Warp](https://www.warp.dev/)
* [oh my zsh](https://github.com/ohmyzsh/ohmyzsh)
* [zsh-autosuggestions](https://github.com/zsh-users/zsh-autosuggestions)
* [zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting)
AWS CLIアカウント作成

AWS CLIのアカウント作成をしてアカウント内のリソース(S3)を確認する所までをやってみたいと思います。
現在AWS４冠ですが資格ばかり取れてしまって中々実際に手を動かす機会もないのでやってみようと思います。
(でも次はSAP取りたい)

自分が吸収力悪い方なのでそんな方にも分かりやすく書けたらと思っています。

EC2を建ててもいいですけど自分のPCからやった方がコストかからずにできるのでいいと思います。
私はMacの環境から作成してみますので、ここから自分のAWSアカウントに接続してみたいと思います。

## 前提
・S3権限のついたIAMユーザがアカウントに存在すること
・対象のIAMユーザのアクセスキーを作成しておくこと
・S3バケットの作成(本記事では「cli-test-a」というバケットを作成しました)

## AWS CLIのインストール
素直に公式のドキュメントに沿ってやっていきます。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

1,ターミナルを開いたら、CLIのファイルを公式からダウンロードを実行します。

`% curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"`

2,インストールしたファイルからAWSCLI v2をインストールします。

`% sudo installer -pkg ./AWSCLIV2.pkg -target /`

3,インストールできたか確認しましょう。
`% which aws`

`/usr/local/bin/aws`

`% aws --version`

`aws-cli/2.11.9 Python/3.11.2 Darwin/21.6.0 source/x86_64 prompt/off`

## AWS CLIアカウントの作成

自PCのターミナルで
`$ aws configure --profile CLIアカウント名 `
を実行します。

「CLIアカウント名」の部分はわかりやすい名前にしておきましょう。今回は「test-user」にしました。

`% aws configure --profile test-user`

`AWS Access Key ID [None]: アクセスキー`
`AWS Secret Access Key [None]: シークレットアクセスキー`
`Default region name [None]: リージョン`
`Default output format [None]: json`

作成したIAMのアクセスキーとシークレットアクセスキーを設定しましょう。
CLIはこの情報を使ってAWSアカウントにアクセスしに行くイメージです。

上記を実行後は以下の様になります。

% tree ~/.aws
`/Users/UserName/.aws`
`├── cli`
`│   └── cache`
`├── config`
`└── credentials`

## S3の確認
ここまで来たらもうゴールは近いです。
以下のコマンドを実行しましょう。

`% aws s3 ls --profile test-user`

アカウントのS3バケットの一覧が確認できました。

`% aws s3 ls --profile test-user`

`2023-11-23 13:25:40 cli-test-a`

--profileオプションでCLIアカウントの指定をしています。
指定しなくてもデフォルトで使える様にしたい場合は以下を実行します。

`export AWS_DEFAULT_PROFILE=CLIアカウント名`

--profile無しでも表示される様になりました。

`aws s3 ls`  

`2023-11-23 13:25:40 cli-test-a`

今回は以上になります。
お疲れ様でした。
UltralyticsでSAM-Hを使う方法

# 本文
Ultralyticsで提供されているSAM(Segment Anything Model)には、`sam_b`, `sam_l`, `sam_h`, `mobile_sam`の4モデルがありますが、他のモデルと違って`sam_h`のみは重みを自動でダウンロードしてくれません。ですが、SAM公式が出している重みをそのまま使えるみたいです。
1. https://github.com/facebookresearch/segment-anything からvit_hの重みをダウンロードして`sam_h.pt`にリネームします
2. 適当なオプションで実行します
```Python3
from ultralytics.models.sam import Predictor as SAMPredictor
overrides = dict(conf=0.25, task='segment', mode='predict', imgsz=1024, model='sam_h.pt')
predictor = SAMPredictor(overrides=overrides)
predictor(image)
```
プロジェクト管理はBacklog推しです。

# はじめに
株式会社OMJテクノソリューションズ Advent Calendar 2023　14日目！
ということで早速いきましょう。

皆さん、プロジェクト管理ツールって何使われていますか？
Asana、Redmine、Trello、Wrike、などなど、、、
世の中に数多く存在しますよね。

わたしはまだエンジニア歴3年のひよっこエンジニアなので
使ったことないツールのほうが多いですが
その中でもBacklog推しなんです！！！！

なので今回はBacklogの推しポイントを勝手に語ろうと思います。

:::note warn
前述の通り、使ったことないツールもあり、疎い部分もあるため
このツールでもこの機能ある等の他ツールに関するご指摘はご遠慮願います。
:::

# 推しポイント①UX
単純ですが、UXが良い、好。

![課題追加画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626757/11967bce-7d99-8130-9b5b-e984e713c0cb.png)

課題追加画面もこの通り　、パッと見でなに設定したらいいかわかりやすいし
直感的に課題が追加できるのも素敵ですよね。


![課題一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626757/337a92dc-e286-a977-1695-1ef8581f7abe.png)
[画像引用元][link-1]　

課題の一覧もそのタスクは誰が担当で今どんな状況で、
優先順位も矢印の上中下で表わされていたり、デザインがとにかく好きなんですよね。
（一覧表示の項目もカスタマイズ可能！！）

# 推しポイント②ガントチャート
（ガントチャートはスタンダードプランより使用可能です）

ガントチャートも種別やカテゴリーでの絞り込みはもちろん、
グルーピングで担当者やマイルストーンで　表示の変更も可能です。
![ガントチャート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626757/ecefa46f-989a-dc59-d145-fcea759bd20c.png)
[画像引用元][link-2]　

ちなみに今参画している案件のMTGはこのガントチャートを見ながら進めています。
担当者の変更や期間の変更もクリック、ドラッグアンドドロップで簡単！

# 推しポイント③Wiki
![wikiマークダウン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626757/c72d9d67-b2e1-1ac0-89a8-3e17f82adf11.png)

プロジェクト全体に共有したいことをwikiでまとめるのにマークダウンで書けることはもちろん、

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626757/5a44a9f5-0bf8-0955-9ff9-cebae66e3029.png">

wikiをディレクトリ階層で分けて管理することもできるし
更新者の表示もあるし、
更新したらプロジェクトメンバーにメールを送ることもできるし満足！

# 推しポイント④ファイル共有

![solution__share_files_with_the_team_ja@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626757/6e84697e-ea63-cf97-9afa-e76f090a1a74.png)
[画像引用元][link-1]　

ファイル共有と聞くとGoogleドライブを思い浮かべるわたしですが、
Backlogでプロジェクト立ち上げたのであればこのファイル共有機能一択でしょう。

Googleドライブで外部委託の方にはメールアドレスで共有して、
でも匿名での更新になってしまうから誰が更新したかわからない、、
なんてこともありません:wink:

# 推しポイント⑤Gitと課題の連携
わたしの激推ポイントです:information_desk_person_tone1::heart:

わたしが普段運用している使い方をご紹介します。
### 1. ブランチ名に課題番号を含める
課題に対しての作業ブランチ名に課題番号（〇〇-9999のところです）を含めると
プルリクエスト作成画面でプルリクエストブランチ（マージしてもらうブランチ）を選択した際に
プルリクエストのタイトルと関連課題を自動で入力・選択してくれるのです！！
プルリクエストの作成が楽になって最高です。

更には、課題の閲覧画面にプルリクエストが表示され
この課題に関してプルリクエスト出したっけ？という悩みも一発解決！

### 2. コミットメッセージに課題番号を含める
コミットメッセージに課題番号（〇〇-9999のところです）を含めると
課題閲覧画面のコメントにコミットした履歴がつくのです！！！
逐一課題にコメントを入れなくても進捗状況が終えるのは便利ですよね🤔
進捗報告が苦手！という方の第一歩におすすめです。

# さいごに
他のプロジェクト管理ツールもそれぞれ良さがあって
使ってて面白いですが、やはりわたしはBacklogのことが好きだなと
記事を書いていて愛が膨らみました（？）

他の使ったことないツール作ってまた記事にしたいなぁ。

ご覧いただきありがとうございました！


[link-1]: https://backlog.com/ja/task-management-software/
[link-2]: https://support-ja.backlog.com/hc/ja/articles/23951331461657-%E6%96%B0%E3%81%97%E3%81%84%E3%82%AC%E3%83%B3%E3%83%88%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88-%CE%B2%E7%89%88-%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9
poetryに触れる

株式会社OMJテクノソリューションズ Advent Calendar 2023　11日目の記事です。

pythonでのバージョン管理方法としてpipとrequirement.txtくらいしか触ったことなかったのですが、どうやらpoetryというものがあるとのこと。詳しいことは理解できてませんがざっくり使える程度を目指して以下に備忘録を作成します。誰かしらの参考になれば幸いです。

# 環境
・Apple M1
・macOS Ventura
・Python 3.9.6
・Poetry 1.7.1


# セットアップ
今回は既存のプロジェクトをpoetryで管理する流れだったので、既存プロジェクトディレクトリ配下にて以下を実行します。
```
poetry init
```
そうすると英語で色々聞かれます。
とりあえずエンターを連打して進むと`pyproject.toml`が作成されます。以下が例です。
この`pyproject.toml`が色々いじっていく設定ファイルです。
```pyproject.toml
[tool.poetry]
name = "sample"
version = "0.1.0"
description = ""
authors = ["author_name <sample@example.com>"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.9"


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
```

##### ※新規プロジェクトの場合
```
poetry new <プロジェクト名>
```
を実行すると以下が生成されます。雛形+pyproject.toml みたいな感じ。

```
<プロジェクト名>
├── pyproject.toml
├── README.md
├── poetry_demo
│   └── __init__.py
└── tests
    └── __init__.py
```
# 依存パッケージの追加
`pyproject.toml`作成後、依存パッケージを追加していきます。
追加方法は2パターンあります。
#### 1.`pyproject.toml`に直接記載
pendulumを追加する場合、バージョン範囲と合わせて記載。
```pyproject.toml
[tool.poetry.dependencies]
python = "^3.9"
pendulum = "^1.4"
```
`pyproject.toml`に記載後、
```
poetry lock
```
を実行すると`poetry.lock`が生成されます。
`poetry.lock`はプロジェクトの依存関係を特定のバージョンで固定するための設定ファイルになります。`pyproject.toml`の内容を更新した場合は lock を実行して`poetry.lock`も更新します。
#### 2.addを使う
```
poetry add pendulum
```
addを利用すると`pyproject.toml`, `poetry.lock`共に更新(作成)されます。
バージョン指定する場合は
```
poetry add pendulum@1.4
```
ちなみに削除する場合は
```
poetry remove pendulum
```
# インストール
仮想環境内で`pyproject.toml`, `poetry.lock`に従いインストールするには
```
poetry install
```
これで`pyproject.toml`そろえた依存パッケージをインストールできます。
# その他
#### パッケージの切り分け
dev環境にだけblackを入れたい場合。
```
poetry add --group dev black
```
`pyproject.toml`にdev groupとして追加されます。
開発用パッケージと切り分けできます。
```pyproject.toml
[tool.poetry.dependencies]
python = "^3.9"
pendulum = "1.4"


[tool.poetry.group.dev.dependencies]
black = "^23.11.0"
```
#### 依存パッケージの最新化
```
poetry update
```
事前にdry runで更新内容確認できます。
```
poetry update --dry-run
```
Kindleに本を配信する

# この記事で得られるもの
1. kindle本の作り方
1. 作った本をkindleアプリでみる（スマホ）
1. Macのkindleアプリでも確認する


# 　どんなステップでやるの？
1. epub拡張子でファイルを作成
1. Amazonでkindleメールアドレスを特定
     - 特殊なメールアドレスがしれっと作られている
1. メールを送信
     - 懸命に`変換`と入れて送信すると見やすくなる
     - 送信完了後にメールが来る
1. 確認
    1. 実際にアプリで確認する
    1. スマホでもPCでも


# なぜこんな記事を書いたの？
- オライリーの書籍をkindleで読みたかったから・・・
OpenAPIの分割ファイルの構成を考えてみた

## 概要
APIのドキュメントをOpenAPIを使って管理するために分割できるようにしたが、
フォルダ構成を決めないと運用できない。
今回は、使いやすいと思われる構成を考える。

#### 前提条件
今回実装しようと考えているAPIはREST構成を考えている。
その点を考慮した構成とする。

## 構成
```
.
└── openapi/
    ├── dist/
    │   └── swagger.yaml
    └── src/
        ├── index.yaml
        ├── components/
        │   ├── component.yaml
        │   ├── parameters/
        │   │   └── parameter.yaml
        │   ├── requestBodies/
        │   │   ├── requestBody.yaml
        │   │   └── login_post.yaml
        │   ├── responses/
        │   │   ├── response.yaml
        │   │   ├── 404.yaml
        │   │   └── 500.yaml
        │   └── schemas/
        │       ├── auth.yaml
        │       ├── internalError.yaml
        │       ├── notFoundError.yaml
        │       └── schema.yaml
        └── paths/
            ├── path.yaml
            └── login/
                ├── login.yaml
                └── post/
                    ├── login_post.yaml
                    └── login_post_200.yaml
```

#### ルール
- 同じファイル名は基本的に避ける
  - 現状endpointとrequestBodyの関連付けがわかるように同名ファイルにしている。
- 要素単位で分割するようにする。
- pathsは以下の構成とする
  EP > method
- REST構成想定なので同じEPでもmethodがことなるケースが存在するのでこの方法を採用した。
- methodフォルダ内はリクエストとレスポンスを分ける。
  - レスポンスはステータスコード別にファイルを用意する。
  - 共通エラーに関してはcomponentsに定義する。

#### 各フォルダ説明
##### distファルダ
マージ後のyamlファイル置き場にしているので、人の手で編集することはない想定
VS Codeなどでマージ後の内容を確認したい場合はこのファイルに対して表示を確認すればよい。

##### srcフォルダ
実装フォルダにしている。
OpenAPIのyamlファイルを3分割している。
- index.yaml
  - 一番のベースファイルになる
  - infoの情報などは分割せずに記載しているのでVersion変更時などは編集が必要
- pathsフォルダ
  - paths要素をまとめているフォルダ
- componentsフォルダ
  - components要素をまとめているフォルダ

###### pathsフォルダ
paths要素を記載する。
- path.yaml
  - pathsの管理ファイルになっている。
  - エンドポイント追加時はまずこのファイルに追加する。
- エンドポイントフォルダ
  - メソッドフォルダ
    - 今回はRESTを採用しているためこのようなフォルダ構成を採用している。
    - RESTでないならエンドポイントフォルダでもよいと考えている。
    - メソッドフォルダ内には、リクエストとレスポンスのファイルは分けるようにしている。

###### componentsフォルダ
components要素を記載する
- component.yaml
  - componentsの管理ファイル
  - 追加でcomponentsの要素を追加する場合は編集が必要
- parametersフォルダ
  - parametersの管理フォルダだが、配下にはparameter.yamlのみを置くようにしている。
  - parametersにはheaderなど共通に使用するparameterを記載している。
  - そのため重複宣言の回避のため1ファイル運用としている
- requestBodiesフォルダ
  - Json形式を想定しているのでEP毎のrequestBodyをまとめている。
  - 1ファイルで運用すべきかは悩む問題点ではあるが、requestBodyの種類ごとにファイルを作成する運用としている。
    - 悩んでいる背景としては、例えばユーザーIDに対応するkey値はどこrequestBodyでも「user_id」としたいときに共通にするためにはどの運用が保守しやすいかという点である。
    - このあたりは微妙に手が届かない要素な気がするので命名規則でカバーしていくしかないと考えている。
- responsesフォルダ
  - responsesの管理フォルダだが、共通のresponseのみ管理している。
  - 該当するのはエラー時のレスポンスが主な管理範囲。
  - そのため、ファイル名にステータスコードを採用している。
  - EP固有のエラーに関してはここでは管理しない想定としている。
- schemasフォルダ
  - schemaの管理フォルダ
  - 現在は、schema毎にファイル作成する方針ではあるが、運用してみてルールを変更する可能性がある。
  - EPにはタグをつける予定ではあるので、タグごとにファイル分けをすることで同じ種類のschemaが1ファイルにまとめることで、key値の命名が異なることを避けやすくなるのでは？と考えているため。
  - 考えすぎな気もするのである程度運用してから見直す。
  

## 総括
一旦今考えられる運用を想定してフォルダ分けを実施してみた。
いろいろ作るうえで運用しづらい点などがあったら構成も含めて見直していきたいと考える。
合間みて作っていくものだから半年後とかかな・・・・
Dockerの基礎を学ぶため、書籍を一冊読んだ感想

環境：Windows

ネットの情報でDockerfileを使い、コンテナ作ったりdocker-composeを使い、環境構築してみたりしていたが、理解が追いつかずこのままでは身につかないと判断し、本を購入。

~~VMwareでLinux環境？をつくり、その中にUbuntuサーバをインストールしてリモート開発をしようとしてみたりもした。~~

## 購入した本
[仕組みと使い方がわかるDocker＆Kubernetesのきほんのきほん](https://www.amazon.co.jp/%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B-Docker-Kubernetes%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-%E5%B0%8F%E7%AC%A0%E5%8E%9F%E7%A8%AE%E9%AB%98/dp/4839972745/ref=sr_1_1?adgrpid=122583283890&hvadid=649598557560&hvdev=c&hvlocphy=1028850&hvnetw=g&hvqmt=e&hvrand=14016016206582802959&hvtargid=kwd-1434394768268&hydadcr=1825_13591191&jp-ad-ap=0&keywords=docker%26kubernetes%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93&qid=1679645465&sr=8-1 "仕組みと使い方がわかるDocker＆Kubernetesのきほんのきほん")
*小笠原 種高 著*

### 感想
Dockerを知る前にLinuxとはどんなものなのかとサーバーの知識がある程度頭に入っていないとそもそも理解が出来ないことが分かった。

本書はDockerdesktopをWindowsにインストールしコンテナなり、イメージなりを作っていく内容となっている。
サーバー、アプリ、データベースそれぞれのコンテナ設定方法や応用方法が載っています。

本を読む前の俺はDockerfileとdocker-composeの違いや用途が全く理解できていなかった。
恥ずかしながらDocker-imageは自分でつくるものと勘違いをしていてDocker hubの公式imageって必ず使わないといけないものなのかな？とか考えていた。

さて、本題に入るが、ホストOS(Windowsとか)の上にDockerエンジンが乗っかり、その上にコンテナがある。
そんなイメージでソフトウェアを動かしている。元々コンテナの中にはLinux OSのようなものが入っているらしく、少しであればコンテナ内でLinuxコマンドが使える。Linuxにもいろいろな系統があり、Red Hat、CentOS、Debian、Ubuntuと様々。コンテナを改造したいときはLinuxを使う。どう改造するのかはわからない。

#### docker-composeとDockerfileの違い
Dockerfileとはimageを形にすることで他のPCに環境を共有できる便利なもの。
docker-composeとはDockerコマンドでコンテナの名前、ネットワークの名前、接続、各ソフトウェアの初期設定などを一環して行うものだという認識で今のところいる。

#### Volumeってなんや？
コンテナを消しても残るやつ。いまはこの程度の理解でいいと思った。理解出来たらとても便利なものとは知っているがとりあえず。

それよりもバインドマウントがしっかりできるようになりたい。
Windowsのデスクトップを想像してみてほしい。アプリをインストールするとショートカットをデスクトップに作成するかと聞かれることが多いと思う。アプリはOSごとに保存される場所が決まっており、WindowsであればProgram Filesとかに多分だいたい保存される。

大本はDockerのコンテナ内にあるが、ホストOSの方へショートカットみたいな形で持ってこれるらしい。
なのでフォルダ内でアプリがつくれてしまうという便利な機能。

データの保存先が本体のフォルダかDockerの中かの違いなのかなと。

## 最後に
よし、プログラミングを始めよう！と決心し、環境構築から入る人がほとんどなのかは分かりませんが、パソコン本体にいろいろ高機能言語やフレームワークをグローバルインストール(例えばVue.jsやpython)して環境変数を直接いじっていると謎のエラーが多発し開発どころじゃなくなることがあります。
ぐちゃぐちゃになったものを直すのはとてつもなく時間がかかると思います。もういっそフォーマットしたほうが楽ですが毎回するわけにもいきません。

そんなときにDockerを知りました。「環境構築ミスったらコンテナ消せばいっか」と。
このまま学習を続けて一人で環境構築ができるように頑張ります。*使う側*ではなく*作る側*を目指します。

次の記事は実践編。
build.xml <タグ>

### javacタスクのオプション説明【コンパイル】
★javac：コンパイル

・srcdir：コンパイル対象のソースコードのディレクトリ。
・destdir：コンパイルした結果のクラスファイルの出力先。
・target：クラスファイルをJVMのバージョン用につくるか。例）ソースコードは1.5の文法使用しているが、実行環境は1．４の場合は、このオプションを1．４にしておけば実行可能となる。
・source：ソースコードが準拠しているJDKのバージョン。つまり使用している文法のバージョン。
・debug：クラスファイルにデバッグ情報を埋め込むか否か。trueにしないと、このクラスファイルを実行したときのスタックトレースにソースコードの行番号がなくなる。
・encoding：ソースファイルのエンコード。指定しないと実行環境のデフォルトになってしまう。

### javadocタスクのオプション説明【javadocの生成】

★javadoc：Java言語のソースコードから「プログラムについて説明するドキュメント」を生成する仕組み。apiディレクトリにの下にjavadocが生成される。

・classpath（クラスパス）：Javaプログラムを動かすために必要なファイルの場所。
・failonerror(デフォルトは…failonerror="false"）：リターンコードが0以外の場合にAntがBuildExceptionを出すかどうか。デフォルトはfalse。
・encoding：ソースファイルのエンコード。指定しないと実行環境のデフォルトになってしまう。
・useexternalfile（基本は、useexternalfile="true"）：外部ファイルの使用。
・doclet:JavaDocで読み取ったデータを出力する際のデータ整形のカスタマイズに使用される。
・pathref：パスの参照。（他で指定されたパスを参照することはしない。）
・param：パラメーター。
・value：値。
PC作業効率up　～Windows～

## Windows PC起動時に自動的にアプリを起動する方法

①[スタート]ボタンを選択し、スクロールして、起動時に実行するアプリを見つけます。

②アプリを右クリックし、[ファイルの場所を開く] を選択します。
これにより、アプリのショートカットが保存されている場所が開きます。
※[ファイルの場所を開く] のオプションがない場合は、そのアプリを起動時に実行できないことを意味します。

③ファイルの場所を開いた状態で、Windows + R キーを押し、「shell:startup」と入力して [OK] を選択します。これにより、[スタートアップ] フォルダーが開きます。

④ファイルの場所からアプリのショートカットをコピーして、[スタートアップ] フォルダーに貼り付けます。
zsh の (N-/)

検索で見つかっても、ワードが微妙に異なり、マニュアルの中で見つけられなかったのでメモ

章としては expansion

```
man zshexpn
```

このなかの `FILENAME GENERATION` ファイル名生成 `Glob Qualifiers` 

\- と / は良いとして N は set NULL_GLOB オプションとなっていてさらに調べる必要がある。

NULL_GLOB オプションの説明は別の章 options に記載がある。

```
man zshoptions
```

説明は

```
If a pattern for filename generation has no matches,
delete the pattern from the argument list
instead of reporting an error. Overrides NOMATCH.
```
ファイル生成でパターンマッチしなければ、エラーにする代わりに削除するとなっている。
NimでWASMを試そうとしたら、SharedArrayBuffer が無いと言われたので

こちらの記事 [NimでWebAssemblyをやる【2021年版】](./frodo821/items/7b0849581a2ea4030019) を参考に、MacBook Pro M2 Maxにて試したところ、ビルドはうまくいくもののブラウザで表示するとJavascriptにてエラーが発生。

```error
wasm_sample.js:1 Uncaught ReferenceError: SharedArrayBuffer is not defined
```

いろいろと調べると、httpのレスポンスヘッダーに、
- Cross-Origin-Embedder-Policy
- Cross-Origin-Opener-Policy

を追加すれば良いとのこと。

なので、以下のPythonスクリプトを作成・実行することで、無事に動作しました。

```python:http_server.py
import http.server
import socketserver
import sys

PORT = 8000
if len(sys.argv) == 2:
    PORT = int(sys.argv[1])


class CustomHandler(http.server.SimpleHTTPRequestHandler):
    def end_headers(self):
        self.send_header(
            'Cache-Control', 'no-cache, no-store, must-revalidate')
        self.send_header('Cross-Origin-Resource-Policy','cross-origin')
        self.send_header('Cross-Origin-Embedder-Policy', 'require-corp')
        self.send_header('Cross-Origin-Opener-Policy', 'same-origin')
        super().end_headers()


Handler = CustomHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()
```

```shell
python http_server.py 8001
```

いろいろと使えそうなので、PyInstallerにてモジュール作成して、~/bin/に移動

```shell
pip install pyinstaller

pyinstller -F http_server.py
mv dist/http_server ~/bin/
```

使ってみる

```shell
❯ http_server 8001
serving at port 8001
127.0.0.1 - - [23/Nov/2023 13:15:02] "GET /wasm_sample.html HTTP/1.1" 200 -
127.0.0.1 - - [23/Nov/2023 13:15:02] "GET /wasm_sample.js HTTP/1.1" 200 -
127.0.0.1 - - [23/Nov/2023 13:15:02] "GET /wasm_sample.wasm HTTP/1.1" 200 -
```
デザインパターンの概要

## はじめに
　デザインパターンを理解するための記事。
　まず、関連のあるUMLの説明に入る。

## UMLとは？
　ソフトウェア設計を視覚化するために、
　ソフトウェアの構造や振舞いを記述する時に用いられる言語。

　ソフトウェアプログラムを構成するクラスやオブジェクト、
　アクティビティ(プログラムの動作)などの要素を図で表現し、
　それらの関係や処理の流れを記号で定義している。

 ### ダイアグラム例
　UML図は、システムの静的な構造を描写する構造図と、
　システムの振る舞いを描写する振る舞い図に分けられる。

:::note info
構造図には、クラス図やコンポーネント図などがある。
振る舞い図には、アクティビティ図やシーケンス図などがある。
:::
 
　いくつかあるUML図の内のクラス図を例として挙げる。

#### クラス図
　クラスの構造やクラス間の関係を表す静的な構造図である。

##### ・クラス構造を表す図

　　　　　　　　　　　<img width="表示幅" alt="ファイル名" src="https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/UML_class_diagram_example.svg/320px-UML_class_diagram_example.svg.png?uselang=ja">
 
　　　　　　　　　　　　　　　　　　　　　　© 2007 Trashtoy

　各区画は上からクラス名(Article)、属性(プロパティ)、操作(メソッド)が記述されている。
　下線はクラスに定義されたものを表している。
　各行は先頭からアクセス修飾子(+はpbluc、-はprivate)、名前、引数や戻り値を示す。

#### ・クラス関係を表す図

　　　　　　　　　<img width="500" alt="ファイル名" src="https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/KP-UML-Aggregation-20060325.svg/640px-KP-UML-Aggregation-20060325.svg.png">
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　© 2006 Noodlez84

　集約と呼ばれるクラス図で、ProfessorクラスがClassクラスを所有している、
　あるいはClassクラスはProfessorクラスの一部であるなどの主従関係を示す。

## デザインパターンとは？
　プログラム開発の際に、頻繁に利用する設計アイデアをUMLや文章でまとめ、
　それに名前を付けて再利用できるようにしたもの。

:::note info
アイデアとは？：
　クラスライブラリやフレームワークなどの具体的なコードではなく、
　プログラム設計において発生する問題に対する解決方法のこと。
:::

　有名なデザインパターンは書籍[^book]で紹介された23のパターン

https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)#%E4%B8%BB%E8%A6%81%E3%81%AA%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E4%B8%80%E8%A6%A7


## アイデアをデザインパターンにした例
### シングルトンパターン
　クラスからインスタンスを作成する際のデザインパターン。
　１つのクラスから生成されるインスタンスを１つだけに限定するためのもの。


#### 目的
　メモリリークの防止
　リソースの共有

#### クラス図
　シングルトンパターンの一般的なクラス図。

　　　　　　　　　　　<a title="Trashtoy, Public domain, ウィキメディア・コモンズ経由で" 　href="https://commons.wikimedia.org/wiki/File:Singleton_UML_class_diagram.svg"><img width="256" alt="Singleton UML class diagram" src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Singleton_UML_class_diagram.svg/256px-Singleton_UML_class_diagram.svg.png"></a>
　　　　　　　　　　　　© 2006 Trashtoy

　クラス図の解説は以下である。
>・同じ型のインスタンスが private なクラス変数として定義されている。
>・コンストラクタの可視性が private である。
>・同じ型のインスタンスを返す getInstance() がクラス関数として定義されている。
>クラス図内にあるアンダーラインは、その項目がクラス変数あるいはクラス関数であることを意味している。
　出典：[wikipedia](https://ja.wikipedia.org/wiki/Singleton_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3#%E3%82%AF%E3%83%A9%E3%82%B9%E5%9B%B3 "Singletonパターン クラス図")

#### サンプルコード
```php:php
class Singleton
{
    private static $instance;
    
    private function __construct()
    {
        
    }
    
    public static function getInstance()
    {
        if (!isset(self::$instance)) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}
//クラス外からインスタンス生成できないためエラー
$CreateInstance = new singleton();

/*インスタンスが1つしか存在しないことを確認するため、
  2つの変数にインスタンスを格納する*/
$singleton1 = Singleton::getInstance();
$singleton2 = Singleton::getInstance();

//変数の値を比較して確認する
echo $singleton1 === $singleton2 ? 'true' : 'false';  //-> true
```

[^book]:Design Patterns: Elements of Reusable Object-Oriented Software
ユーザーデータを用いてEC2立ち上げ時のログ

## ユーザーデータでEC2立ち上げ時のログ

ログを見る方法がわからなかったので調べてみました。

### 前提

`EC2`のセキュリティーグループに`ssh(22)`, `http(80)`が`Anywhere`でアクセス許可していることを確認してください。

### Ubuntu, 22.04 LTSにnginxをインストール

`Ubuntu, 22.04 LTS`に`nginx`をインストールするユーザーデータ

```bash:ubuntuにnginxをインストール
#!/bin/bash

sudo apt update
sudo apt install -y nginx
```

### EC2インスタンスにブラウザからアクセス

上記のユーザーデータがエラーなく実行できている場合は次のようなリンクでブラウザからEC2にアクセスし`nginx`のデフォルトページを観測できます。

```
http://EC2のパブリックアドレス
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1262857/39215a12-e83b-176a-fc58-489a7c57d667.png)

## 本題

ユーザーデータに何らかのエラーがあり、`nginx`のインストール等に失敗した場合はどのようにしてログを見るのか。

### 公式HPに書いてあった

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/user-data.html

引用すると、

> ログファイルを表示するには、インスタンスに接続し、`/var/log/cloud-init-output.log` を開きます。

とあります。つまり、`ssh`接続して

```bash
cat /var/log/cloud-init-output.log
```

とすればログが見れそうですね。
Power BI作成の流れ

# フェーズ全体
業務での活用を考慮して、Power BI作成の一連の流れを整理しました。

![Power BI作成の流れ_20231113-01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626635/b3619828-ada4-ad9d-f020-e48c7825754b.jpeg "Power BI作成の流れ(フェーズ全体)")
↓　  2023/12/16:用語表記を最新化しました（データセット→セマンティック モデル）
![Power BI作成の流れ_20231218-01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626635/1f9c6d82-8edb-248e-587c-f782783a691f.jpeg "Power BI作成の流れ(フェーズ全体)")

# フェーズ分解
一纏めで検討するのが良い範囲でフェーズを分解してみます。

![Power BI作成の流れ_20231113-01(フェーズ分解).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626635/b040adee-7670-dbff-a379-5de9f6a26106.jpeg "Power BI作成の流れ(フェーズ分解)")

<dl>
  <dt><font color="Green">緑色の枠</font></dt>
  <dd>データの取得（前処理）〜モデリング</dd>
  <dt><font color="Blue">青色の枠</font></dt>
  <dd>日付テーブルの準備</dd>
  <dt><font color="Red">赤色の枠</font></dt>
  <dd>情報の開示／非開示</dd>
</dl>

# <font color="Green">フェーズ詳細 : 「データの取得」, 「データのモデリング」</font>

https://qiita.com/NoriyukiT/items/e2c4873c6501aac65376

# <font color="Blue">フェーズ詳細 : 「日付テーブルの準備」</font>

https://qiita.com/NoriyukiT/items/ec74654ed5d56cf3f120

# <font color="Red">フェーズ詳細 : 「セキュリティ」</font>

https://qiita.com/NoriyukiT/items/8409c3261426b200a458
ReduxでReducerの中でfetchのレスポンスをjsonにしたい

# はじめに

Reduxを使っている中でReducerの中で処理に困ったのでまとめていきます

# 問題

以下のようなコードがあります

```ts
export function* putTodo(
  action: ReturnType<typeof putTodo>
) {
  const res: Response = yield call(
    fetchする処理
  )

  if (res.ok) {
    const { todos } = await res.json
 {

}
```

ここで、generator関数の中でレスポンスの中身からボディのjsonを取り出そうとしましたが、Reduxでは非同期を`yield`でかかないといけないのでうまくいきませんでした

# 解決方法

```ts
export function* putTodo(
  action: ReturnType<typeof putTodo>
) {
  const res: Response = yield call(
    fetchする処理
  )

  if (res.ok) {
    const body = res.json().then((body) => {
      return body as PutCompanyMyLabelResponse
    })
    const { todos } = yield body
  } 
}
```

このようにしたところうまく`res.json`がうごくようになりました

# おわりに

Reduxはyieldを使うというところでいままであまり利用してなかったので難しいなと感じましたがうまくいってよかったです
VSCodeでRailsのCtrl+Clickで参照元にいけない

# はじめに

仕事でRailsを最近書いているのですが、そこでこまったことをまとめておきます

# 問題

Railsを使っている上でモデルのメソッドなどにとびたいときがあります
そのときに**Ctrl + Click**で以前は参照元に飛んでいたのですが、いま拡張機能をいれてもその機能が使えませんでした

# 解決方法

最新のRubyの拡張はその機能が使えなくなっているそうです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/4f6c2308-89ce-e438-c6bd-2ca324f8e55d.png)

少し前の**非推奨**のバージョンであれば利用できるのでそちらをインストールしました

**Ctrl + p**でコマンド`ext install rebornix.Ruby`を実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/8fca6fc0-0cb2-58b9-6ffc-50be32fa979f.png)

このあと**Migrate**をすると新しいバージョンになってしまうのでしてはいけません

# おわりに

なぜ新しいバージョンでこの機能がないのかが不思議です