OmniAICreator/Qiita-1.07M huggingface dataset:
ACSの同時セッション数に限界はあるのか？

## はじめに
ACS（IBM Access Client Solutions）の最大セッション数が気になったので調べてみました。
※IBM社の公式の情報ではありませんのでご注意ください。
## 理論値
デフォルトの仕様ではACSのセッションにはAから順にアルファベットが振られていきます。

そして、さまざまな情報から整理すると、Zに達して終わりではなく、
A、B、C、 、 、 、 、 Z、a、b、c、 、 、 、 、 z、AA、AB、AC、 、 、 、 、 AZ、BA、BB、BC、 、 、 、 、BZ、CA、CB、CC、 、 、 、 、
と続いていき、最後はZZで終わるのが仕様のようです。

この理論でいくと、セッション数としては
A-Z：26セッション
a-z：26セッション
AA-AZ：26セッション
BA-BZ：26セッション
・・・
ZAーZZ：26セッション
となり、合計で**728セッション**になる計算です。
（A-Zとa-zが26セッションx2、AA-ZZで26セッションx26）


ただし、ACSはJavaで動いており、この728というセッション数に達する前にハードウェアのリソースやJavaのリソースの側限界が先に来るのではないかと推測されます。
## 検証
728セッションも実運用することはないと思いますが、実際にどの程度までセッションが同時に利用できるのか、簡単に検証してみました。

### 検証方法

検証にはIBM CloudのVPCのVSIを利用しました。スペックは以下です。
- CPU: 2 vCPU
- Memory: 8 GiB
- Storage: 100 GB
- OS: Windows Server 2022 Standard Edition
- 
1. セッションを作成（1つ目のセッションなので**A**が振られてます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/4ca6ec46-0194-74f5-7875-f0be1fad20ad.png)


2. セッションを複製していきます。5つ作成して、**E**に。
![image (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/1c1830eb-9bff-1e7e-79ef-37aa18c2c33a.png)

3.　あとはひたすら繰り返します。

**Z**の次は**a**に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/179bdded-e8c0-c295-936f-76b07bfba0bb.png)

**z**の次は**AA**に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/895bed9d-863c-de0f-0c7e-ff5227c7d897.png)


### 検証結果1

**AA**あたりまではサクサクとセッションが起動していきました。

しかし、、、

**AO**くらいからはセッションの起動にもっさり感が出ててきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/9386b01f-60a1-da7c-f34a-b52b972f17f1.png)

**AR**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/be21e259-949b-4992-0543-bc761576f155.png)

**AS**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/ee11a9bd-08b6-5248-739a-69e7c7ced5b6.png)

**AT**までくるとセッション起動まで時間がかかるようになり。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/b6bcdf24-b4e6-9707-cf14-e2d18acd09e0.png)

**AU**ではセッション番号は振られたものの、5250画面は表示されず、10秒ほど経つとACS自体がハングして落ちました。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524161/4641c476-5005-c36b-6f05-2dddffb8bb9c.png)


### 検証結果2

再度、同じ方法で試しましたが、**AU**の起動タイミングで同様にACS落ちました。（再現性がありました）

作成できたセッションは**AT**までだったので、**76セッション**ということになります。

## 追加検証

スペックに依存する可能性を確かめるために、VSI（クライアント）のスペックを2倍にして再度検証しました。

- CPU: **4 vCPU**
- Memory: **16 GiB**
- Storage: 100 GB
- OS: Windows Server 2022 Standard Edition

さて結果は？？



### 追加検証結果

結果は同じでした。。。

**AU**セッションの作成でACSがダウンしました。



### 結論

今回の検証においては、ACSでの同時セッション数の最大値は**76**でした。
クライアントのスペックには依存してないようです。
76に達する前から、徐々にACSのセッション起動が重くなっていったので、Java関連のチューニングで結果が変わる可能性はありかもです。


### 補足

同じIBM iに対して**AA**までの53セッションを2つのクライアントから接続したところ、同時に106セッションは確立できたのでIBM i側の限界ではなく、クラアント側の限界に先に到達したものことは確認済みです。


### まとめ

これほどのセッションを一つのクライアントから同時に実行するのは稀だと思いますが、何かのお役に立てれば幸いです。
理論的にはもっと接続できそうなので、またの機会にチューニング方法等も検討してみたいと思います。
チューニングポイントとか、ご存知の方いたら、コメントいただけると嬉しいです。
Elixirでraylibを使ってグラフィック描画してみる その3 〜 raylibの定義から円を描く 〜

# 前回

無理やり円を描きました

https://qiita.com/t-yamanashi/items/54f81eb83fe5e217cdf2

# 今回
raylib本来の円を描く命令を使います
rayexには円を描く命令が定義してないので追加したいと思います

# rayexを改造して円を描く命令を定義する
draw_lineを真似してdraw_circleを追加します

```diff_c:c_src/rayex/rayex.c
//　省略

 UNIFEX_TERM draw_line(UnifexEnv *env, int start_x, int start_y, int end_x,
                       int end_y, color c) {
   DrawLine(start_x, start_y, end_x, end_y, COLOR(c));
   return draw_pixel_result_ok(env);
 }

+ UNIFEX_TERM draw_circle(UnifexEnv *env, int center_x, int center_y, double radius,
+                        color c) {
+  DrawCircle(center_x, center_y, radius, COLOR(c));
+  return draw_pixel_result_ok(env);
+ }

// 省略
```

```diff_elixir:c_src/rayex/rayex.spec.exs
spec draw_line(start_x :: int, start_y :: int, end_x :: int, end_y :: int, color :: color) ::
       :ok :: label

+ spec draw_circle(center_x :: int, center_y :: int, radius :: float, color :: color) ::
+       :ok :: label

```

```diff_elixir:lib/rayex/shapes.ex
 # 省略
   @spec draw_line(integer(), integer(), integer(), integer(), S.Color.t()) :: :ok
   defdelegate draw_line(start_x, start_y, end_x, end_y, color), to: Raylib

+  @doc "Draw a circle"
+  @spec draw_circle(integer(), integer(), float(), S.Color.t()) :: :ok
+  defdelegate draw_circle(center_x, center_y, radius, color), to: Raylib
# 省略
```

# 実行側のプログラムを作る

ローカルにあるrayexに変更します

```diff_elixir:mix.exs
defmodule RayexExperiment.MixProject do
  use Mix.Project

  def project do
    [
      app: :rayex_experiment,
      version: "0.1.0",
      elixir: "~> 1.17",
      start_permanent: Mix.env() == :prod,
      deps: deps()
    ]
  end

  # Run "mix help compile.app" to learn about applications.
  def application do
    [
      extra_applications: [:logger]
    ]
  end

  # Run "mix help deps" to learn about dependencies.
  defp deps do
    [
-      {:rayex, "~> 0.0.3"}
+      {:rayex, path: "../rayex", override: true}
      # {:dep_from_hexpm, "~> 0.3.0"},
      # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
    ]
  end
end
```

円を描くプログラム
draw_circleを呼び出します

```elixir:lib/rayex_circle.ex
defmodule RayexCircle do
  use Rayex

  def main() do
    init_window(800, 800, "window name")
    main_loop(true)
  end

  defp main_loop(true) do
    begin_drawing()
    draw_circle(400, 400, 100.0, %{r: 255, g: 161, b: 0, a: 255})

    end_drawing()

    Process.sleep(1000)
    main_loop(!window_should_close())
  end

  defp main_loop(_), do: nil
end

```

mix exeコマンド追加
```elixir:lib/mix/tasks/exe.ex
defmodule Mix.Tasks.Exe do
  use Mix.Task

  def run(_arg) do
    RayexCircle.main()
  end
end
```

# 実行
```bash
$ mix exe
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/41ed9733-3acf-b443-4403-31825b4d0167.png)
[YOLOv5]物体認識AIでポケモン図鑑作ってみた

# はじめに
はじめまして、きい　と申します！
この度、Qiita初投稿をさせていただきます　。
私自身は情報系の大学に通っている学生です。

初学者のため、ご容赦ください。。。
（間違えてたら、コメントで指摘してくださると幸いです）

よろしくお願いします！

# きっかけ
就活のために何かポートフォリオ的なものを作りたいなーていう軽い考えから始めました。
そこで注目したのがポケモン図鑑です。

（説明はいらないかもしれませんが）
ポケモン図鑑とはアニメ「ポケットモンスター」で主人公たちが使用する
発見したポケモンの名前とその他のステータス等を確認できるツールです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703275/9abeba89-0b75-7caf-738e-f0ea43e1f11b.png)

↓Youtubeに動画ありました　14:17~
https://m.youtube.com/watch?v=soM4HD71b6k

小学生当時、
「カメラに写しただけでポケモン判別できるのすごいなー」
と子供ながらに思ってみていました笑

ちょうど大學の講義でyoloという物体認識のアルゴリズムを習ったので、
このアルゴリズムで作れそうだなと思い、計画したのが作成のきっかけです。

# この記事で作成するもの
・YOLOを使って、ポケモンを分類できるモデル

今回はモデルを作るまでを行います。



# yoloとは？
深層学習のアルゴリズムです。

>YOLOは予め画像全体をグリッド分割しておき、各領域ごとに物体のクラスとbounding boxを求める、という方法を採用しています。
CNNのアーキテクチャがシンプルになったため、Faster R-CNNに識別精度は少し劣りますが45-155FPSの検出速度を達成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703275/bafc8693-5416-df45-b100-cc43da237f57.png)

検出速度が持ち味みたいですね。
今回はあんまり関係ないですが、実際にカメラを使って写したポケモンを検索するとなればかなり役に立ちそうな特徴ですね。

>YOLOの欠点
分割されたグリッドサイズは固定かつ、グリッド内で識別できるクラスは1つ
検出できる物体の数は2つ
という制約があるため、 グリッド内に大量の物体がある場合に弱くなります。


参考文献:https://qiita.com/mshinoda88/items/9770ee671ea27f2c81a9

# 実行環境
・Windows11 home
・YOLOv5
・python 3.11.9


# 使用データ
自作したスクレイピングプログラムでGoogleから拾いました。
今回はフシギバナ系統の三体に限定して実験していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703275/c804bbb4-735d-860f-26a9-da91b3f8ab6d.png)
（左からフシギダネ、フシギソウ、フシギバナ）
出典：ポケモンユナイトWiki　
https://wikiwiki.jp/poke-unite/%E3%83%95%E3%82%B7%E3%82%AE%E3%83%90%E3%83%8A
ポケモン好きからすると、容易に判別できますが、
興味ない人から見るとフシギダネ、フシギソウは間違いそうな感じしますね。

それぞれ１００枚をlabelimgでアノテーションしました。
# 訓練
batchは５
epochsは100
で行いました。（パラメータは適当です）

# 訓練結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703275/978b07fb-f662-fa17-6ac6-d3841fbfeedf.png)
こんな感じの結果になりました。
順調に訓練できてそう。


# 作成したモデルを使ってみよう
先ほどの説明の画像を使ってdetect.pyを実行し検出させてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703275/c37a44cb-898d-b87f-a39d-d6ae17d33469.png)
できてる！

他も何枚か試してみました。
面白いと思ったのが、この間違い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703275/769c4cb6-27ad-8dc6-1922-0b3c61a13e8c.png)

いや、あってるけど笑
そっちじゃないのよ、
手前のでかいやつにフシギバナって出してほしいの！！

素人ながらの考えですが、背景が緑であることが検出できていない原因なのかなと思っています。
背景を抜けば分類できるのかな？
# 最後に
実際に記事を書いてみて改めて知ることも多いことに気がつきました。(yoloの説明など)
課題で忙しいですが、時間を見つけてまた続きを行いたいです。


ここまでお読みくださり、ありがとうございました！！
医療系退職したニート女子webエンジニアを目指す話👩‍💻

# 医療系退職→半年でwebエンジニアを目指す

はじめまして！プログラミング歴4ヶ月、現在ReactとNext.js、TypeScriptを勉強中のゆらと申します👩‍💻

あまり筆まめな方ではないですが、勉強の励みになればとキータを投稿することにいたしました。
今はまだ技術記事を書けるレベルではないので自己紹介のみさせていただきます💭

# プログラミング学習を始めた経緯

前職は医療系でした🩺
新卒で入った職場でしたがお局さんからのいじめに耐えられず2年で退職しました💦
職場の人間関係に悩み、1人でできる仕事がないか考えた結果思いついたのがエンジニアだったのですが、それ以上にものを作ることが好きで、こんなアプリ欲しい！と思ったものを自分でつくることに対する憧れがあります。

# 今後の目標

現在、HTML CSS JavaScriptの学習が終わり、実在するコーポレートサイトをお手本にオリジナルのサイトをreactとnext.jsでつくる勉強をしています。
サーバーやセキュリティといった周辺知識にまだまだ弱い自覚がありますが、今年中に克服して2025年からはお仕事としてやっていきたいと思っています！

また、seoや個人開発にも興味があるのでポートフォリオとしてウェブサービスを作ろうと思っています。（どんなサービスかはまだ秘密です㊙️）

まだまだ未熟なわたしですが、強い好奇心をレバレッジにして頑張っていきます💪
あやふやにしていたスキーマの使い方をちゃんと考えた

# はじめに

postgresqlを使い始めてからDB設計をし始めたのですが、これまで意識していなかったスキーマってなんだ？という状態に。
調べてみると他のDBでもある模様でしたがpostgresqlなりの使い方もあるものだということがわかりましたので記事にしました。

# スキーマとは

言葉で言い表すほどの知識がないのでAIさんに尋ねました。


PostgreSQL のスキーマとは、データベース内のオブジェクト（テーブルやビュー、インデックスなど）を格納する名前空間です。フォルダのようなもので、データを一括処理したり、別のスキーマに格納したりする際に使用します。﻿

だそうです。

# 権限で分ける

おそらくスタンダードな使い方はこれではないでしょうか？
・外から触られる(データを入れられる)領域
・内側で閉じたい(業務データを入れる)領域
・共通領域
こんな感じで3つの構成にすることが多いです。
それぞれ利用可能なロールないしユーザーの権限を付与できますし、スキーマに対してusageをFalseにして特定のユーザに使うことすら不可ともできますので、設計した権限の指針を構成するには非常に楽です。

# システム間連携

postgresqlはDBを跨いだコネクションが作れませんので、結合する時などは同一のDBに存在している必要があります。
もちろんpostgresql fdwなどを使う手はありますが、小さなシステム群であればスキーマで分けてしまうのも手でしょう。

# 名前空間を分離する

スキーマを分けると同じテーブル名を付与できます。
例えば受注と発注というスキーマであった場合、partnerテーブルの意味合いが変わりますが、どちらも同じ名前で定義でき、スキーマを分けたことで異なる意味あいであることを表現できます。

# 終わりに

こんなところでしょうか。
スキーマごとバッサリ落とすというのも考えられそうですね。
個人的には権限関係が一番活用しやすそうな印象です。
テーブルごとに権限ふっていくの数が多いとけっこう大変ですしね。
いつ使えばいいんだろうと思っていましたが、ある程度実務で行っている使い方とマッチしていて一安心です。
Soraで架空の生き物の動画を生成してみた！【2024年12月10日】

# はじめに

https://x.com/AInebosuke/status/1866222134873505810

本日の早朝、Soraが一般公開されました。時間を置いて再アクセスすると、奇跡的にログインできたので使ってみました！
Soraとは、テキストや画像、さらには既存の動画をもとに新たな映像を自動生成する**動画生成AI**モデルです。
Soraについての詳しい解説は下記に譲ります。この記事では**使ってみた感想**をご紹介できればと思います。

https://openai.com/index/sora/

https://note.com/schroneko/n/n21b2aa329b24

https://chatgpt-lab.com/n/n701e75e796d9?gs=0af2ecaa8e91

https://www.nikkei.com/article/DGXZQOGN0958G0Z01C24A2000000/

# 生成結果

それでは早速、実際の生成結果をご紹介します！結果は、音声なしのYouTubeショート動画としてアップロードしました。

## Text2Video（入力：テキスト、出力：動画）
一番オーソドックスな使い方です。画像生成AIと同様に、テキストでプロンプトを入力することで、動画を生成できます。
私はピクミンシリーズが好きなので、架空の生き物を中心に生成してみました！
プロンプトは自分で考えています。タイトルは自動で付与されたものを参考に、一部修正しています。

### ハロクリお正月モンスター

**入力プロンプト**:
>A creature with Halloween, Christmas, and New Year-themed designs.

**出力結果**:

https://youtube.com/shorts/8xP8bnf_8Jw?si=nWV7j6Dz2k20nF81


### 日本庭園サメ

**入力プロンプト**:
>A large, shark-like creature living in a pond within a Japanese garden.


**出力結果**:

https://youtube.com/shorts/S0UnJrukAjI?si=v3KY4Myu0fcX_gvP


## Image2Video（入力：テキスト＋画像、出力：動画）

画像を動画に変換することもできます。20秒にすると、少し不自然なシーン遷移が見受けられました。プロンプトにもよりますが、10秒ほどであればある程度自然になりました。

### 眠れる魔法の宝石ウサギ

**入力画像**:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/35fcdf4a-04c3-ad41-feef-afe806e1c77a.png)

**入力プロンプト**:
>Acting sleepy

**出力結果**:

https://youtube.com/shorts/gnJVhUtXPhc?si=hqVEW7c3r-qf_w_E

## Video2Video（入力：テキスト＋ビデオ、出力：動画）

動画をRemixという形で別の動画に変換することもできます。こちらも同様に、20秒にすると、少し不自然なシーン遷移になることがありました。
先ほどの「日本庭園サメ」を二匹にしてみます。

### 二匹の日本庭園サメ

**入力動画**:
- 先ほどの「日本庭園サメ」

**入力プロンプト**:
>二匹にする

**出力結果**:

https://youtube.com/shorts/ePjkfsVWMD0?si=llGW4QpQucDKOE6f

# 使ってみた感想

Soraの使用感としては、以下のような点が印象的でした。
- **UI**: 操作性は直感的で、初見でも迷わず使えるレベルです。アスペクト比や動画解像度、生成時間、同時生成数などを細かく設定できるため、目的に応じた柔軟なカスタマイズが可能でした。
- **パフォーマンス**: 最大20秒の映像生成を行う場合、1080pではなく720pの解像度に落とす必要があるなど、全設定を最大化することはできません。また、Proプランで月500件、Plusプランで月50件の生成数に上限があります。最大20秒は「短い」という感想ですが、複数の動画を結合することである程度は対応できそうです。
- **速度**: 動画生成には一定の待ち時間がかかるものの、プロンプトをキューに投入しておけば、まとめて生成を待つことも可能です。
- **言語対応**: 日本語のプロンプトにも対応していますが、英語で指示することでより望ましい出力が得られる印象でした。
- **コスト感**: Proプランで月500件生成するとして、1件あたり単純計算（もちろん動画生成だけに使うわけではないですが）60円。高いと感じるか、安いと感じるかは人によりそうです。


なお、この記事内で掲載できなかった生成結果は、下記のYouTubeチャンネルにて公開しています。興味があれば、ぜひご覧ください。

https://www.youtube.com/@%E5%B9%BB%E6%83%B3%E7%94%9F%E7%89%A9


よろしければチャンネル登録と高評価をよろしくお願いします！
（一度言ってみたかったフレーズです）
cssでの中央揃え

# cssでの中央揃え方法を学ぶ
cssでの中央揃えがいつも迷ってしまうのでまとめました！
> margin: 0 auto;

親要素の幅が指定されている場合、親要素の中央に配置される。

> text-align: center;

テキストや画像を中央揃えにする

ブロック要素、またはブロック要素で囲まれたテキストやインライン要素に適用
`<div><p>`などに囲まれたものでないとNG

> justify-content: center;

親要素がdisplay: flex;で指定されている場合
水平方向で中央寄せ

> align-items: center;

親要素がdisplay: flex;で指定されている場合
垂直方向で中央寄せ

>  position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);

`position: absolute;top: 50%;left: 50%;`で画面の中央に移動
要素の左上が中央に来てしまっているため、要素の中心が中央にくるように、
`transform: translate(-50%, -50%);`で縦・横の半分の大きさだけを移動させる。

> position: absolute;
inset: 0;
margin: 0;

positionプロパティと共に使用
insetで上下左右の四方向の位置を一度に指定

> place-content: center;

Flexboxやgridレイアウトを作成する際に利用
コンテンツの配置を要素の中心にする

> place-items: center;

Flexboxやgridレイアウトを作成する際に利用
アイテムの配置を要素の中心にする
フロント関連の用語まとめ

フロントエンド開発を始めた時に、よく耳にした用語をとっても簡単にまとめています。
Next.jsやReactは今後もっと詳しくまとめたいなと思っています。

## **Node.js**

- **Node.js**は、JavaScriptをブラウザ以外の環境でも動かせるようにするためのツール
- 元々、JavaScriptはブラウザ内でWebページに動きをつけるための言語だったが、Node.jsによってサーバーやローカル環境でも利用できるようになった

### **主な使用例**

1. **フロントエンド開発**:
    - ローカルサーバーを起動し、ブラウザでHTML、CSS、JavaScriptを動かす際に利用
    - 開発環境を整えるためのツールの実行にも使われる
2. **サーバーサイド開発**:
    - サーバーサイドの処理にもNode.jsを使用することで、フロントエンドとバックエンドの両方をJavaScriptで統一できる


## **npm (Node Package Manager)**

- **npm**は、Node.jsに付属している「パッケージ管理ツール」
- パッケージとは、再利用可能なコードのまとまりで、npmを使うことでこれらを簡単に管理できる

### **主な特徴**

- 必要なライブラリをインストールし、その依存関係も自動で管理してくれる
- コマンド一つでプロジェクトに必要な外部ツールやライブラリを導入できる


## **yarn**

- **yarn**は、Facebookが開発したnpmの代替ツール
- npmよりも高速で信頼性が高いとされている

### **主な特徴**

- パッケージの管理を効率化
- npmと同様にライブラリの依存関係を管理
- 使用するには別途インストールが必要

---

## **React**

- **React**は、JavaScriptの「UIを作るためのライブラリ」（※フレームワークではない）
- **コンポーネントベース**（画面の要素みたいなもの）で作成するのが特徴

https://reactjs.org/


## **Next.js**

- **Next.js**は、Reactをベースにしたフレームワーク
- ReactでWebアプリケーションを開発する際の作業を効率化してくれるツール一式が揃っている

https://nextjs.org/
1つのdocker-compose内で別コンテナを参照したいだけならコンテナ名の指定は不要なんですよって話

非常に小さいことなんですが、タイトルのようなケースで別サービスから参照されるためだけ（たとえばアプリ用のコンテナからDBのコンテナを参照したい場合）にいちいちコンテナ名が指定されているケースが多く「いらないのだが……？」と、いつももやっとしているんですよね。

# docker-compose.ymlでいえば

つまりこういう話です。

```yaml
services:
  db:
    image: postgres:latest
    # container_name: mydb # <-これがいらない
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydatabase
    # ports:
    #   - "5432:5432" # <-実はこれもいらない（あくまでホストマシンに対する設定なので。多分）

  app:
    image: node:latest
    environment:
      DB_HOST: db # <- docker-composeのサービス名指定でOK。
      DB_USER: user
      DB_PASSWORD: password
      DB_NAME: mydatabase
    depends_on:
      - db
    volumes:
      - .:/app
    working_dir: /app
```

# サンプルコード

ほんとかよ、と思うかたは以下のコードを使ってご確認ください。

https://github.com/robitan/no-container-name-sample

## 余談：ネットワーク設定について

ネットワーク設定（ `networks` ）も**接続に必須**であるかのように言われている場合もやっとするのですが（※）、しかし接続に必須ではないのですが**PJ管理上は絶対あったほうがいい**ので、そこは不要とはいいづらい。必要なんですよ。必要なんですけど、必要な理由は指定がないと接続できないから、ではないのです。

（※）ネットワークの指定がない場合はデフォルトのネットワークに接続されるので、指定しなくても接続できます。

上記のソースコードでネットワーク設定はdockder-compose.override.ymlで定義しておきましたので、ネットワーク設定についてもほんとかよ、と思うかたは、当該ファイルのファイル名・拡張子を変えるなどで無効化しておためしください。

# 謝辞

サンプルコードはほとんどGitHub Copilotが書いてくれました(^^)

Copilotがないともう開発無理無理ぃ。
プロジェクト管理ツールを選定してみた（2024年12月

# why
スマートフォンベースの運転スコアリングサービスyuriCargo（ゆりかご）の開発と運用をしています。プロジェクトマネージャのような立場で参加しているのですが、プロジェクト管理ツールを導入したいと思いました。

![スクリーンショット 2024-12-10 18.30.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924658/d30bc600-c182-74d2-31e8-75e8330b630f.png)

私なりにツールの選定をしてみましたので、2024年12月時点での手がかりにしていただければと思います。

# 前提
- すでに採用しているのはSlack, Github, miro

# 要件
書ける範囲で。

## 最低3層のタスク構造が実現できること
開発スタイルとしてはスクラムを採用しています。S/M/Lというサイズ感で見積もったバックログを一番小さいレベルのタスクとしたときに、最低3層以上の階層構造で管理したいと思いました。例えば下記のようなものです。

- 第一層
    - プロジェクトレベル。例えば「xxの機能をリリースする」というようなもの。
- 第二層
    - プロジェクトを構成する大きな単位。例えば「ユーザがサインインできる」とか。ユーザにリリースできる最小単位（=シナリオ?）。本来的な意味のバックログはこの粒度と思われる。
- 第三層
    - 1週間スプリントで実際に手をつける細分化されたバックログ。例えば、「DBにカラム定義を追加する」「ユーザ定義を修正する」など。本来的な意味でのバックログではない。

Githubにもカンバンボードやプロジェクト管理機能がありますが、この3層以上の階層構造を作れないため、バックログの分割がめんどくさいなと感じていました。加えてビジネスパイプラインもツール上で管理したいとも思っていました。

## オートメーション機能があること
プロジェクトの中でも雑務が増えてきています。例えば、プロジェクトで管理している資産（テストデバイスなど）の管理です。

わざわざ別で作ったエクセルシートを更新しなくても、フォームに入力された内容をもとにリストを更新してくれるようなものがあれば助かります。

## その他細々したこと
- SAML認証に対応していること
    - 可能であればマルチIdPに対応しているのが望ましい
- 監査ログが出力可能であること
- 社内wiki、手順書置き場が作れること

# 選定
## Asana
同僚が前職で使っていたようで、使用感がよかったとの噂を聞きトライアルしました。階層構造のタスクを持てることはもちろん、オートメーションやAPIが大変充実しているようで、大抵のことは出来そうに感じました。使いこなせればね...

またプロジェクト管理機能とは別に、ゴールを取り扱う機能やプロジェクトを横断的に閲覧するポートフォリオ機能もあります。これらの機能は他のツールにはなく、Asanaの特色のように感じられ好感を持てました。

https://app.asana.com/0/home/1208848537036899

## JIRA
いわずとしれたJIRA。社内の他の部署では自社サーバで運用しているケースもあるようでした。しかしながら他の有識者に話を聞いたところ、スクラム開発の中では多少窮屈（スクラム強制ギプスのよう）だと言われるなど評判が芳しくなかったです。といっても高機能なので使い方次第でなんとでもなりそうな気はします。

ただJIRAの場合はややソフトウェア開発に向きすぎているというか、エンジニアではないビジネス担当者に触ってもらうことを考えると、Asanaの方がとっつきやすさは感じました。

https://www.atlassian.com/ja/software/jira

## notion
こちらも有名なツールではありますが、プライベートで使ってみた感触的にプロジェクト管理ツールというよりナレッジマネジメントツールのように見えました。タスクはもちろん作れますし、終了状態の管理もできますが、それ自体がメインというより記事につくタグの一つのように感じられました。

https://www.notion.com/ja

## Clickup
ChatGPTにおすすめのプロジェクト管理ツールはない？と聞いたら出てきました。シンプルな見た目でありながら、各タスクに内臓ホワイトボード（FigJamにとても似ている）を埋め込めたり、タスクリストをタイムラインなど多くのViewで表示できるところがよかったです。SAML認証を有効化するためにメールドメインの認証が要らないなど導入のハードルが低かったのも高ポイントでした。

ただ私が調べた限り、特に欧州サーバでなのかパフォーマンスが著しく悪くなることがあるらしく、評価の低いレビューの要因は大抵それでした。また、[利用規約](https://clickup.com/terms)に「顧客情報は機密情報ではない（意訳）」という文言があり採用を見送りました。これがなければ良い選択肢だったのですが...

> Except as otherwise described in the Service's Privacy Policy, as between you and us, any Content will be non-confidential and nonproprietary and we will not be liable for any use or disclosure of Content. 
> 本サービスのプライバシーポリシー に別途記載されている場合を除き、お客様と当社の間では、いかなるコンテンツも機密情報および専有情報とはみなされず、当社はコンテンツの使用または開示について一切の責任を負いません。

https://clickup.com/

# 結果
最終的にはAsanaを仮決めし、現在トライアルを実施しています。

今回調べて分かったことがいくつかあります。
- マルチIdPはほぼ全てのツールが対応していない
- SAML認証をするにはEnterpriseプランに上がる必要があり、そのためにはメールドメインの認証が求められる。大企業の全社ドメインの認証を一部の部署でできるわけもないので、独自でドメインを取得するなどかなり面倒。
- Clickupは日本語版がないこともあり情報がかなり少ない（故にこの記事を書いてみたところもあります）。

社内の機密的にかけないことも多く、私自身プロジェクトを推進しながらの片手間で選定していたのであまり深掘りは出来ていないのですが、何らかお役に立てば幸いです。
.NET8のアプリ起動に失敗

# .NET8のアプリ起動に失敗

- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951560/81892f8e-e25b-7e9a-de84-eabc2caa4c7e.png)

## 概要

.NET8で実装したアプリのDockerContainerの起動時に下記のエラーが発生し失敗する。

```bash
Failed to create CoreCLR, HRESULT: 0x80070008
```

### 発生環境 (参考)

今回事象を確認した環境は下記の通りだが、この環境に限ったものではないので

同様の事象が発生した場合、当記事の対応で解消される可能性が高い

- OS: CentOS Linux release 7.9.2009 (Core)
- Docker: 20.10.3
- DockerCompose: 1.28.4

## 対応方法

1. `seccomp=unconfined`を指定
    
    docker-compose.ymlの対象サービスのオプションで下記を指定し、再構築
    
    ```yaml
    services:
      :
      serviceName:
        :
        security_opt:
          - seccomp=unconfined
    ```
    
    - 詳細
        - LinuxカーネルのSeccomp機能によってDockerContainer内から利用可能なシステムコールを一部制限している
        - この制限によってエラーが発生している場合、この対応で起動可能となる
            - [Docker 向け Seccomp セキュリティプロファイル](https://matsuand.github.io/docs.docker.jp.onthefly/engine/security/seccomp/)

1.  Dockerのバージョンを上げる
    - Dockerバージョンが20系の場合に同様の事象が報告されている
    - 24系以上にバージョンアップすることで解消される場合があるとのこと (未確認)

1. OSバージョンアップ
    - 古いOSの場合に同様の事象が報告されている
    - OSをバージョンアップすることで解消される場合があるとのこと (未確認)
Premiere Proで、Mixkitの動画素材が赤字になっている時の修正方法

Premiere Proで、Mixkitの動画素材（.mogrtファイル）を使用した際に赤字エラーが表示される場合の修正方法をご紹介します。このエラーは主に日本語版Premiere Proでの言語の違いによって発生します。

## エラーの修正手順

### 1. プロジェクトファイルを開く

まず、After Effectsで、赤字になっている.mogrtファイルを開きます：

1. After Effectsを起動します
2. 「ファイル」>「プロジェクトファイルを開く」を選択
3. 赤字になっている.mogrtファイルを選択
4. 『「.mogrt」をフォルダに抽出』というダイアログが表示されたら「抽出」をクリック

### 2. エラー箇所の確認

エラーメッセージ「このプロジェクトにはエクスプレッションエラーがあります」が表示された場合：

1. 「∧」マークをクリックしてエラー詳細を展開
2. タイムライン上でキーボードの「U」キーを押して、すべてのキーフレームとエクスプレッションを表示
3. ⚠マークが表示されているレイヤーを確認

### 3. エクスプレッションの修正

エラーの主な原因は、英語版で作成されたプロパティ名と日本語版の違いにあります。以下のように修正します：

英語のプロパティ名を日本語に書き換える例：
- ("Color") → ("カラー")
- ("Slider") → ("スライダー")
- ("Position") → ("位置")
- ("Scale") → ("スケール")
- ("Opacity") → ("不透明度")
- ("Rotation") → ("回転")
- ("Fill") → ("塗り")

### 4. 修正後の保存

エラーが解消されたら、以下の手順で保存します：

1. すべてのエラーが解消されていることを確認
2. 「エッセンシャルグラフィックス」パネルを開く
3. 「モーショングラフィックステンプレートを書き出し」を選択して保存

## トラブルシューティングのヒント

- エクスプレッションエラーは複数箇所に存在する可能性があります
- Alt + E（Windows）または Option + E（Mac）で、すべてのエクスプレッションを一度に表示できます
- プレビューで動作確認を行い、すべてのキーフレームやエフェクトが正常に機能しているか確認してください

## 予防策

新規プロジェクトを作成する際は、以下の点に注意することでエラーを防ぐことができます：

- 英語版テンプレートを使用する場合は、プロジェクトの言語設定を英語にする
- ただし、既存プロジェクトの言語設定変更は、他の問題を引き起こす可能性があるので注意が必要

この手順で、ほとんどのケースでエラーを解決することができます。もし特定のエラーが解決できない場合は、エラーメッセージの内容を確認し、必要に応じて専門家に相談することをお勧めします。
LINE WORKS 管理画面で Bot を追加する

# LINE WORKS 管理画面で Bot を追加する手順

LINE WORKS 管理画面を使用して、Bot を追加する方法を解説します。この手順を参考に、簡単に Bot を登録・設定できます。

## 手順概要
1. Bot メニューにアクセスする  
2. Bot を追加する  
3. Bot の設定を編集する  

## 1. Bot メニューにアクセスする
まずは、LINE WORKS 管理画面の **Bot メニュー**にアクセスします。以下のリンクから直接アクセスできます。  
[LINE WORKS 管理画面 - Bot メニュー](https://admin.worksmobile.com/service/bot)

## 2. Bot を追加する
### (1) 「Bot追加」ボタンをクリック
画面右上にある「**Bot追加**」ボタンをクリックします。

### (2) Bot の選択と追加
「**Bot追加**」画面が表示されます。  
追加する Bot の右端に表示される「**追加**」リンクをクリックします。

### (3) Bot の追加完了
Bot が正常に追加されたら、画面上部の「**前に戻る**」ボタンをクリックして、Bot 一覧に戻ります。

## 3. Bot の設定を編集する
### (1) 追加された Bot を選択
一覧に表示されている、追加した Bot をクリックします。

### (2) Bot 詳細の編集
「**Bot 詳細**」画面が表示されます。「**修正**」ボタンをクリックして設定を編集します。

### (3) 使用権限と公開設定を調整
- **使用権限**: すべてのメンバー、または特定のメンバーに権限を付与します。
- **公開設定**: チェックすると権限のあるメンバーの連絡先に表示されます。
設定が完了したら、保存を忘れないようにしてください。

---

この手順を参考に、LINE WORKS 管理画面で Bot を追加してみてください！質問があれば、コメントでお気軽にお知らせください。
Canvas LMS で課題の採点結果を履修者に開示する

# やりたいこと
- Python の [**canvasapi**](https://canvasapi.readthedocs.io/en/stable/index.html) を用いて Canvas LMS 上で課題の採点結果を履修者に開示する（[成績表]で課題の[成績を掲示する]をスクリプトから実行する）。

# 実装方法の検討
- Canvas の [REST API](https://canvas.instructure.com/doc/api/index.html) から実行できれば簡単だが、どうもその機能はなさそう。
- ブラウザで観察したところ、採点結果の公開には [**GraphQL**](https://canvas.instructure.com/doc/api/file.graphql.html) を用いている。
- canvasapi には、GraphQL のクエリを実行する関数 [**`Canvas.graphql`**](https://canvasapi.readthedocs.io/en/stable/canvas-ref.html?highlight=graphql#canvasapi.Canvas.graphql) が用意されている。
- これを用いて実装してみる。

# 実装
### Canvas.graphql
**`graphql(query, variables=`*`None`*`, **kwargs)`**
- Canvas に GraphQL 形式のリクエストを送信する

#### パラメータ
<dl>
  <dt>query (str)</dt>
  <dd>実行する GraphQL クエリの**文字列**</dd>
  <dt>variables (dict)</dt>
  <dd>クエリが要求する変数の**辞書**</dd>
</dl>

#### 戻り値
- GraphQL クエリに対するレスポンスを格納した**辞書**

### クエリの形式
- この記事を書いている時点ではドキュメントは整っていないので、Canvas LMS のソースから抽出する。
``` canvas-lms/ui/shared/post-assignment-grades-tray/react/Api.js
export const POST_ASSIGNMENT_GRADES = gql`
    mutation ($assignmentId: ID!, $gradedOnly: Boolean) {
        postAssignmentGrades(input: {assignmentId: $assignmentId, gradedOnly: $gradedOnly}) {
        progress {
            _id
            state
        }
        }
    }
`
```

### Python による実装
``` py
result = canvas.graphql(f'''
    mutation {{
        postAssignmentGrades(input: {{
            assignmentId: {assignmentId}, 
            gradedOnly: {gradedOnly}
        }}) {{
            progress {{
                _id
                state
            }}
        }}
    }}
''')
```
- `canvas` は `Canvas` オブジェクト
- `assignmentId` は、操作したい課題のID（念のため文字列にキャストしておくとより安全）
- `gradedOnly` は、`"true"` または `"false"` の文字列。`"true"` なら、採点済みの提出物についてのみ採点結果を開示する。`"false"` なら、履修者全員の採点結果を開示する。


- この例では、レスポンスとして `_id` と `state` を要求している。レスポンスを格納する変数 `result` には以下のような辞書が返ってくる。

``` py
{
    'data': {
        'postAssignmentGrades': {
            'progress': {
                '_id': '785446', 
                'state': 'queued'
            }
        }
    }
}
```

# 参考
- [python canvasapi to get assignment group grades, Instructure Community](https://community.canvaslms.com/t5/Canvas-Developers-Group/python-canvasapi-to-get-assignment-group-grades/m-p/482180)
1つのELBでHTTP(S)とTCPに対応する

# 1つのELBでHTTP(S)とTCPに対応する

## 概要

例えば、１つのホスト名でWebを公開しつつSSH接続も行いたい。というようなユースケースを想定した時、これをELBで校正する場合すこし複雑な構成になる。

ざっくりと下図のような構成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951560/fa181224-89a5-d3b8-2942-1ec967c328a9.png)

CLB(ClassicLoadBalancer)であればウィザードに従うことでこのような構成でも直感的に構築できていたもののCLBが非推奨となった今、これをCLBを使わずに構築するのが意外と複雑なのでそれをまとめておく。

## 前提条件

- 80番ポートは443番ポートへ転送
- 443番ポートはACMの証明書を設定したhttpsとして公開
- 22番ポートはTCPでSSH向けに公開

## ポイント

1. 外部向けはNLB(Network Load Balancer)を構築
1. TCPはNLBからそのままインスタンスへ
1. HTTPはALB(Application Load Balancer)のターゲットグループでALBへ転送

## 構築手順

### Step1: HTTP(S)のALB構築

1. ALBの構築
    - いつも通りALBを構築
    - スクショは、80は443へ転送して、ACMの証明書を設定した場合の例
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951560/e1281a27-2948-5ee4-4ea1-0b4267bf2507.png)

### Step2: ALBのターゲットグループ構築

1. ALBのターゲットグループをhttp:80用とhttps:443用の2つ構築
    1. http:80用
        1. ターゲットタイプの選択で「Application Load Balancer」を選択
            - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951560/93e31107-60cc-3bc2-8a8b-5270276dd2c4.png)
        1. Application Load BalancerにStep1で構築したALBを選択
            - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951560/b4722a9c-bc21-b612-661c-066dabbb66bf.png)
    1. https:443用
        1. ターゲットタイプの選択で「Application Load Balancer」を選択
            - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951560/663ca717-772b-8ca3-38e0-97bd8ab1c30a.png)
        1. Application Load BalancerにStep1で構築したALBを選択
            - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951560/5a521b6e-a246-f483-565c-30b655eb1479.png)

### Step3: 外部向けNLB構築

1. 外部向けのNLBを新規で作成
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951560/f34d7fbf-88d4-f06e-283a-9bc49b74de99.png)
1. リスナーとルーティングの設定
    1. 22番ポートはEC2インスタンスを選択
    1. 80番ポートと443番ポートはStep2で構築したALBのターゲットグループを選択
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951560/912f5a10-23a8-b10e-a51e-bd1f1ad0cd40.png)
【TIPS】Enum.frequenciesと同じリスト集計処理を自前で実装する

この記事は、[Elixir Advent Calendar 2024 シリーズ9](https://qiita.com/advent-calendar/2024/elixir) の10日目です

---

【本コラムは、3分で読め、3分で試せます】

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

[Enum.frequencies](https://hexdocs.pm/elixir/1.10.0/Enum.html#frequencies/1) は、Elixir 1.10で追加された、リスト中の値の発生頻度を数えてくれる便利な関数で、利用頻度もそれなりに高いのですが、Elixir 1.9までは存在しておらず、自前で作っていたので、その作り方を解説します

```diff_elixir
Enum.frequencies(["abc", "abc", "xyz", "abc", "def", "xyz"])
%{"abc" => 3, "def" => 1, "xyz" => 2}

Enum.frequencies([
  %{"a" => "abc"}, 
  %{"b" => "abc"}, 
  %{"a" => "xyz"}, 
  %{"a" => "abc"}, 
  %{"a" => "def"}, 
  %{"a" => "xyz"}
])
%{
  %{"a" => "abc"} => 2,
  %{"a" => "def"} => 1,
  %{"a" => "xyz"} => 2,
  %{"b" => "abc"} => 1
}
```

そんな集計処理を叶えてくれるパーツが、これまた便利な [Map.update](https://hexdocs.pm/elixir/Map.html#update/4) です

単品のMap.updateは、第1引数にあるマップに対し、第2引数のキーで、第3引数の初期値と第4引数の関数で計算した値をマップに追加してくれます

```diff_elixir
Map.update(%{}, "a", 1, fn x -> x + 1 end)
%{"a" => 1}
```

この特性を、パイプで使うと、下記のようなマップの更新処理が実現できます

```diff_elixir
%{}
|> Map.update("a", 1, fn x -> x + 1 end)
|> Map.update("b", 1, fn x -> x + 1 end)
|> Map.update("a", 1, fn x -> x + 1 end)
%{"a" => 2, "b" => 1}
```

同じようなことをEnum.reduceで行うと、リストに対する集計を行い、集計結果をマップとして残すことが可能です

```diff_elixir
datas = ["abc", "abc", "xyz", "abc", "def", "xyz"]

datas
|> Enum.reduce(%{}, & Map.update(&2, &1, 1, fn x -> x + 1 end))
%{"abc" => 3, "def" => 1, "xyz" => 2}
```

こうしたEnum.reduceによる集計処理が自由に書けるようになると、Elixirをはじめとする関数型言語に対する「苦手意識」のようなものが無くなり、関数型言語以外を触りたいとは思えなくなるので、ぜひマスターしてみてください

# p.s.このコラムが、面白かったり、役に立ったら…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/907a8695-4d83-1b5c-8052-d0ce52de5f66.png) にて、どうぞ応援よろしくお願いします :bow:
オシャレで便利なプロンプトといえばstarship

メリークリスマス！[開発環境を紹介します Advent Calendar 2024](https://adventar.org/calendars/10438)です。

今日も今日とて隙間産業。
本日紹介するのは、前回hyperfineの動作を紹介したときにも見えていた、シェルのプロンプトです。

## プロンプトとは

bashやzashやfishなどのシェルで、自分のコマンドの前にでる文字列のことです。
曖昧さ回避のために、シェルプロンプトと言ったほうがいいかもしれません。[^mlprompt]

[^mlprompt]: 最近ではプロンプトというとLLMの入力のほうがメジャーかもしれません。さらにWindowsのcmdの名称はコマンドプロンプトと、検索性が低くなりつつあります。

例えばbashの最小構成でのプロンプトを表示してみます。
バッシュバージョンのみが表示される、`bash-5.2$`というシンプルなプロンプトです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/4c666e39-f22f-c7b0-2720-a76d4af6a390.png)

この見た目は環境変数`PS1`で設定できます。
`GIT_PS1_*`などを設定している人も多いのではないでしょうか。
とはいえ、独特な構文で設定する必要があり、メンテナンスには苦労させられます。

## [Starship](https://starship.rs/ja-JP/)

そこで紹介するのがStarshipです。
Rust製の簡単・高速・オシャレなプロンプトツールです。
bash以外にも多くのシェルに対応しており、表示できるツール情報の種類も多いです。

例えばインストールするだけでカスタマイズ無しに以下のようなプロンプトが使えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/7c3e22bf-f116-7ba4-5675-7e4d051aed0f.png)

ここに表示されているのは、次のような情報です。

- カレントディレクトリ
- カレントディレクトリのレポジトリ情報
- カレントディレクトリのツール情報
- バックグラウンドプロセスの有無
  - 青色の♦マークでわかります

## 私の環境

参考までに、私のプロンプトについてを書いておきます。
かわいいですね。

Ubuntuデフォルトのbashプロンプトに近づけています。
またGit情報も慣れ親しんだ`GIT_PS1_*`表記に近づけています。

### スクリーンショット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/77d613c6-d4a6-b48b-757f-7e994b9d7412.png)

### 設定

```~/.config/starship.toml
[username]
show_always = true
format = '[$user]($style)[@](green)'
style_user = 'bold green'
[hostname]
ssh_only = false
format = '[$ssh_symbol$hostname]($style):'
style = 'bold green'
[directory]
truncation_length = 10
truncate_to_repo = false
before_repo_root_style = 'blue'
repo_root_style = 'bold cyan'
[git_branch]
format = '[$symbol$branch(:$remote_branch)]($style) '
[git_status]
ahead = '>'
behind = '<'
diverged = '<>'
modified = '*'
typechanged = '!'
up_to_date = "="
conflicted = "|CONFLICT"
[character]
success_symbol = '[\$](bold green)'
error_symbol = '[\$](bold red)'
```

## まとめ

Starshipの紹介でした。
シェルをよく使うなら、気分が上がるStarshipを使ってみよう！
GASでGoogle Driveにファイルをあげたことをトリガーにしたかったけど、できなかった話

# はじめに
連日の投稿となります。@keisuke_0503です！
本日もよろしくお願いいたします！

突然ですが、皆さんはクラウド上にデータを保存するときに何を使ってらっしゃいますか？
Google Driveに保存している方も多いのではないかと思います。

今回の記事では、私が個人的に開発しているアプリでGoogle Driveにファイルをアップロードしたことをトリガーにできないか、と悩んだので、その問題の解決策を共有できればと考えています。

# 結論
結論、アップロードそのものをトリガーにはできなかったです。

その代わりに、一定間隔で起動するトリガーを設定し、そのトリガーが最後に処理を完了した後にアップロードされたファイルが存在すれば処理を進める、という形で代用しました。

# 使用環境
Google Apps Script(GAS)
## GASとは
Google Apps Script（GAS）は、ひとことで言えばGoogleが提供する各種サービスの自動化／連携を行うためのローコード開発ツールです。GASを使うと、Gmailやカレンダー、Googleスプレッドシート、Googleドライブなど、Googleが提供する様々なサービス上で処理を自動化したり、複数のサービスを連携させたりできます。
参照 : https://satori.marketing/marketing-blog/gas-introduction/

ローコードツールとありますが、個人的には、ゴリゴリjsでカスタマイズしていくこともできるので、Googleのサービスをかなり自由度高く扱えるようになる便利なツールだと思っています。

# 問題提起
## 作りたい機能
Google Driveと連携して、ファイルをアップロードしたときに、特定の処理を実行したい

## 課題
GASにはさまざまなトリガーが用意されていますが、Google Driveにファイルをアップロードしたとき、というトリガーは存在しませんでした。
現状は、Google FormsやGoogleスプレッドシート、Googleドキュメントに関するトリガーが多く用意されているようです。Google Driveではなく、スプレッドシートを編集したときなら簡単にイベント発火させることができます！

## 解決策
アップロードされた時ではなく、対象のディレクトリ内を一定間隔で監視するトリガーを作成し、前回更新よりも後に作成されたファイルがあったら処理に進む、という流れで実現しました。


```js:GAS
// フォルダIDを指定
// 定期的にcheckForNewFilesを呼び出す時間ベースのトリガーを作成
function createTimeDrivenTrigger() {
    ScriptApp.newTrigger('checkForNewFiles')
        .timeBased()
        .everyMinutes(10) // 10分ごとに実行
        .create();
}

function checkForNewFiles() {
    const FOLDER = DriveApp.getFolderById(SCRIPT_PROPERTIES.getProperty('FOLDER_ID'));
    const files = FOLDER.getFiles();
    const lastCheck = new Date(SCRIPT_PROPERTIES.getProperty('lastCheckTime'));
    const now = new Date();

    while (files.hasNext()) {
        let file = files.next();
        let fileDate = file.getDateCreated();

        // 前回のチェック以降に作成されたファイルを処理
        if (fileDate > lastCheck) {
            // 処理を記載
        }
    }

    // 最後のチェック時間を更新
    SCRIPT_PROPERTIES.setProperty('lastCheckTime', now);
}
```

# まとめ
作成当初は便利なイベントが存在するだろうと思ったのですが、自力では見つけられませんでした。かなり力技ですが、同じようなイベントを求めている方が多いのではないかと思い、共有させていただきました！
react-router-dom でネストしたら表示が変わった（v6）

動画教材でreact-router-domでルーティングをするという課題をやる
環境は教材はv5、自分はv6
v6で相対パスにしたくて、ネストで引っかかったのでメモ
# やりたいこと
* ルーティングをネスト表示したい
* Page1DetailA(Page1の子コンポーネント)を表示した際はPage1コンポーネントは非表示にしたい（ネスト表示する前と合わせたい）

まずはネスト前のコード
この場合、Page1DetailAに移動してもPage1は表示されない
※パスは絶対パス
```react
<BrowserRouter>
<div>
  <Link to='/'>Home</Link>
  <Link to='/page1'>Page1</Link>
  <Link to='/page2'>Page2</Link>
</div>
<Routes>
  <Route exact path='/' element={<Home />} />
  <Route path='/page1' element={<Page1 />} />
  <Route path='/page1/detailA' element={<Page1DetailA />} />
  <Route path='/page1/detailB' element={<Page1DetailB />} />
  <Route path='/page2' element={<Page2 />} />
</Routes>
</BrowserRouter >
```
### Page1DetaiAの表示
![Vite-React-12-10-2024_03_21_PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927903/ecff0194-1b3d-7e4c-a778-3bedda2e0bc9.png)

## ネストしてみる
* Page1内のルート（detailAやdetailB）を親のPage1の下にネスト
* 相対パスに変更
```react
<BrowserRouter>
<div>
  <Link to='/'>Home</Link>
  <Link to='/page1'>Page1</Link>
  <Link to='/page2'>Page2</Link>
</div>
<Routes>
  <Route exact path='/' element={<Home />} />
  <Route path='/page1' element={<Page1 />} >
    <Route path='detailA' element={<Page1DetailA />} />
    <Route path='detailB' element={<Page1DetailB />} />
  </Route>
  <Route path='/page2' element={<Page2 />} />
</Routes>
</BrowserRouter >
```
また、子コンポーネントを表示させるために
* Outletをインポート
* Page1の中に`<Outlet />`を置く
*  パスを相対パスに変更する
```react
import { Link, Outlet} from "react-router-dom"

export const Page1 = () => {
  return (
    <>
      <h1>Page1です</h1>
      <Link to='detailA'>DetailA</Link>
      <Link to='detailB'>DetailB</Link>
      <Outlet />
    </>
  )
} 
```
### Page1DetaiAの表示
![Vite-React-12-10-2024_03_30_PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927903/53252b20-ce78-cb3e-271c-c648394586de.png)
結果、ネストしたことでPage1DetaiAの表示が変わってしまう

親コンポーネントを表示させたくない場合、
ネストせず絶対パスで対応すれば良いが、せっかくなのでネストした状態で表示できないかやってみた
# 解決策：useLocationを使用
`useLocation`の`pathname`で現在のURLが取得できる。
現在のURLが`/page1` ではない場合、`<Outlet />`をレンダリングして子ルートのコンテンツを表示
### 修正コード
* `useLocation`でパスを取得
* パスの条件でレンダリングを行う
`/page1`でないときに`<Outlet />`をレンダリング
```react
import { Link, Outlet, useLocation } from "react-router-dom"

export const Page1 = () => {
  const location = useLocation();
  if (location.pathname !== '/page1') {
    return <Outlet />
  }
  return (
    <>
      <h1>Page1です</h1>
      <Link to='detailA'>DetailA</Link>
      <Link to='detailB'>DetailB</Link>
      <Outlet />
    </>
  )
} 

```
Google Cloud PAMという新機能で一時的な権限付与を運用する


## はじめに

私の担当プロジェクトではこれまで開発者に本番環境の編集権限が常時割り当てられていました。

そこで本番環境のリソースを誤って編集してしまう事象を予防する為に、**PAM**という新サービス※を用いて権限管理の方法を見直しました。

このPAMを用いた権限管理の実例とその感想を、当記事でご紹介しようと思います。

※2024年9月 GA

https://cloud.google.com/iam/docs/release-notes#September_16_2024


## PAMとは

> Privileged Access Manager（PAM）を使用すると、特定のプリンシパルのジャストインタイムの一時的な権限昇格を管理し、監査ログを表示して、誰が何にいつアクセスしたかを確認できます。

> たとえば、Privileged Access Manager を使用すると、次のことができます。
> - デベロッパーに本番環境への一時的なアクセス権を付与して、トラブルシューティングやデプロイを行う。

引用元

https://cloud.google.com/iam/docs/temporary-elevated-access?hl=ja#pam

具体的なPAMの利用方法も上記のガイドに記載されています。


## 実際にやってみた権限管理の方針

- 開発者が所属するGoogleグループに`編集者ロール`を割り当てていたが、`閲覧者ロール`＋αに変更
- 本番環境プロジェクトのPAMでリソース編集用の利用資格を作成しておく
  - リクエスト元　：　開発者グループ
  - 承認者　：　承認なしでアクセスを有効化
  - ロール　：　任意（残念ながら`編集者ロール`などの基本ロールを割り当てることはできません）＋`特権アクセスマネージャー管理者`
  - 通知先　：　Slackチャンネルのメールアドレスを指定
- 利用資格を使った作業が終わった後は権限付与を取り消す
  - 取り消すために`特権アクセスマネージャー管理者`ロールを利用資格に追加している
- 権限を絞ったことで作業に支障が出ないように`ProjectIAM管理者ロール`の利用資格も作成しておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3080737/da795484-e919-978e-1961-3ee5afec9afe.png)


## 感想

本番環境のリソースを参照だけしたいときに、誤ってボタンを押下して更新してしまう怖さが無くなりました。
一時的な権限を得たときはそれがSlackに通知され監査ログにも残るので、透明性を確保できるようになっていると感じます。

管理者でないと権限付与を取り消せなかったり取り消したことがSlackに通知されない※などの若干の使いづらさはあるのですが欲していた機能ではあったので、これからの改善も期待しています。

※権限付与リクエスト時に別途メールアドレスを入力すれば通知されます（が権限付与通知も増えるので元の設定と合わせて2回通知されます。）
[re:Invent 2024] Driving cost optimization at scale (Datadog) から得たコスト削減の取り組みのヒント

## はじめに
re:Invent 2024で Datadogによる AWSワークロードの100%を AWS Gravitonに移行するという取り組みのセッションを聴講しました。

大規模かつ短期間でコスト最適化を進めていく上で紹介されている戦略の中には学びや気づきがあったのでいくつかピックアップします。

セッションの動画は以下のリンクから視聴可能です。

https://youtu.be/l3Vlf_k16pg?si=1F1QgXL-vuQo52bn

## セッションの概要
* Datadog CTOから「AWSワークロードの100%をAWS Gravitonに移行せよ」と課題を出される
* AWS Gravitonとは AWSが独自開発したプロセッサであり、コストパフォーマンスが高い
* そのため既存のプロセッサから AWS Gravitonに移行することでコスト削減が見込める
* 移行を主導するチームが存在し、各サービスを持っているチームに移行してもらうよう推進する

![image_20241210.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222808/5e059b01-8d2a-d794-c542-d101bf37d031.png)

**※上の図はあくまでもイメージです**

## 削減可能なコストの共有
Gravitonへの移行を主導するチームとは別に、実際に移行作業するのはサービスを持っている各チームであり、多くのエンジニアが関わります。全員がこの取り組みに価値を見出せるようにどれだけの効果が得られるのか明確にすることはとても重要です。

### 保守的に低く見積もる
削減可能なコストをあえて低く見積もっています。計算上は`20%`の削減が可能でも`18%`としています。実際に削減できた金額が見積もりを上回っても怒られないからという保守的な考えがあるようです。

### コスト回避
既存のサービスだけでなく、これからリリースされる**新規のサービス**も見積もりに含めています。移行するわけではないためコスト削減にはなりませんが、Gravitonを採用した場合としなかった場合の差分のコストを回避できるため**潜在的なコスト削減**となります。

### DDSQLエディター
本題とはズレてしまいますが、削減可能なコストを見積もる過程で DDSQLエディターを使用しています。この機能はプレビューでリクエストを出すと利用可能なので、実際に試して別記事で紹介したいと思います。

https://docs.datadoghq.com/ja/ddsql_editor/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222808/1ab4ed4d-33ca-a9a9-0d5f-74021f4bad9e.png)

## 移行状況の可視化
### 全体の進捗
全体の進捗が確認できるダッシュボードを用意し、Gravitonの採用率(ARM Adoption)や Gravitonへの移行が可能なコアの割合(ARM Registry Readiness)などを可視化しています。また移行手順書やFAQ、コミュニケーションが取れるSlackチャンネルなど**必要な情報が集約**されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222808/3ab611e0-d007-fecc-8012-82cb1f552585.png)

### コスト削減効果
もう一つコストに焦点を当てたダッシュボードも用意されています。こちらには Gravitonへの移行で**削減できたコスト**(Estimated monthly savings)や移行すれば**削減可能なコスト**(Remaining AMD64 Scope to migrate - Mo Saving Est.)が表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222808/a27f41a6-774c-06fd-2964-e46b4dc3525e.png)

### チームの進捗状況
各チームの Graviton(`Arm64`)とまだ移行されていないプロセッサ(`x86`)を可視化し、チームの進捗状況がリアルタイムで確認できるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222808/462fe3f5-f5c1-45df-2c31-af0110a7e3e3.png)

これらの可視化は Gravitonへの移行を主導するチームが状況を把握することに役立ちますし、実際に移行する各チームにとっても有益なものです。

## 終わりに
Datadogのように会社全体を巻き込んだ取り組みだからこそできている戦略もあると思いますが（特にダッシュボードの作り込み）、たとえ小さな取り組みだとしても参考にできる部分はありそうです。本記事がみなさんのコスト削減の取り組みのヒントになれば幸いです。
並列処理について

# 並列処理入門

社内の勉強会で、「並列処理」についての話があったので、アウトプットのために基礎的な部分をまとめて記事にしました。


## 並列処理とは？

並列処理は、複数のタスクを同時に実行する技術で、主に以下のような場面で役立ちます。

- **処理のスピードアップ**: 複数の作業を同時に行うことで、全体の処理時間を短縮する
- **リアルタイム性の向上**: タスクを分散して実行し、応答性を高める
- **システムリソースの有効活用**: CPUやGPUの性能を最大限に引き出す


## 実装例：Pythonでの簡単な並列処理

Pythonを用いて、以下に簡単な例を示します。

### 実装例: 並列処理で複数のタスクを実行する

以下は、5つのタスクを並列に実行し、それぞれが完了するのを待つプログラムです。

#### コード例
```python
import threading
import time

# タスクの定義
def task(name, duration):
    print(f"Task {name} is starting.")
    time.sleep(duration)  # 処理にかかる時間をシミュレート
    print(f"Task {name} is finished.")

# スレッドのリスト
threads = []

# 複数のタスクをスレッドで実行
for i in range(5):
    t = threading.Thread(target=task, args=(f"Task-{i+1}", 2))
    threads.append(t)
    t.start()

# 全てのタスクが完了するまで待つ
for t in threads:
    t.join()

print("All tasks are completed!")

```

---

### 実装例の解説

#### 1.	threadingモジュール
Python標準ライブラリのthreadingを使ってスレッドを作成しています。このモジュールを使うことで、複数のタスクを同時に実行できます。
#### 2.	task関数
タスクごとに異なる名前と実行時間を受け取り、処理をシミュレートします。
#### 3.	スレッドの生成と開始
threading.Threadクラスを使ってタスクをスレッドに割り当て、start()メソッドで実行を開始します。
#### 4.	タスクの完了待機
join()メソッドを呼び出すことで、すべてのスレッドが終了するのを待ちます。これにより、全タスクが完了してから次の処理に進みます。

---

### 実行結果

上記のコードを実行すると、以下のような結果が得られます。

```python
Task Task-1 is starting.
Task Task-2 is starting.
Task Task-3 is starting.
Task Task-4 is starting.
Task Task-5 is starting.
Task Task-1 is finished.
Task Task-2 is finished.
Task Task-3 is finished.
Task Task-4 is finished.
Task Task-5 is finished.
All tasks are completed!
```

すべてのタスクが2秒間の処理時間を経て終了しますが、タスクが並列に実行されるため、全体の処理時間は約2秒です（5タスクを順次実行した場合、10秒かかります）。

勉強会の中では、スレッドとプロセスについての説明がありましたが、今回はスレッドを用いた並列処理を実装を通して経験しました。

---

### 並列処理を使うときの注意点
#### 1.	データ競合に注意
複数のスレッドが同じデータに同時にアクセスすると、予期しない結果になることがあります。必要に応じて、LockやSemaphoreを使用する。
#### 2.	オーバーヘッド
並列化に伴う管理コストが発生するため、タスクが軽量であればかえって遅くなる場合もある。
#### 3.	適切な設計が必要
並列処理の設計ミスは、バグやパフォーマンス低下につながります。

## まとめ

今回は、初歩的な内容のアウトプットと、簡単な実装で並列処理の概要を掴むことにトライしました。引き続き学習を続けて、より深い内容の理解にもチャレンジします。
AWS MarkteplaceからNetApp BlueXP製品をサブスクライブしてみる

こんばんは、小寺です。
BYOLからAWS MarketplaceでCloud Volume ONTAPを利用するためのAWS Marketplaceのサブスクライブについてお伝えします。

## AWS MarketplaceからCloud Volume ONTAPを選ぶには
(1) NetApp BlueXPを選びます。
![{64DF7AE4-37DF-4A10-9222-4D981CAD8D25}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/a858f2bf-36aa-38de-ad7c-26f5d2422762.png)

(2) NetApp BlueXPにはCloud Volume ONTAP（以下、CVO）以外にもプロダクトがバンドルされています。

![{5A4732E8-DE64-4841-8CB2-1CA7E0D23594}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/33aba8c8-95c9-d0b2-0a75-9c788514c69e.png)

(3) CVOだけを選んでサブスクライブができないので、BlueXPをサブスクライブします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/214a94e1-400e-b64e-99c9-63ac5fb98fb9.png)

(4) 少し待つとサブスクライブ完了が表示されます。
![{DA22F2A8-8742-4F88-9A6C-98B90C2BC484}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/8d4a7335-82aa-886b-d98c-1629b52799bf.png)

(5) Set up your accountをクリックします。
BlueXPのログイン画面が表示されるので、ログインを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/e0e7e61e-d568-5a2d-b1e5-48e572da0b99.png)

Marketplaceからサブスクライブできていることが確認できます。

(6)Saveをクリックすると、サブスクリプションの保存が完了します。
クレデンシャルの保存はすぐ対応する必要がなさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/b3c6c462-5088-a124-1767-c5cb3a747193.png)

(7) Doneをクリックすると、Cloud Volomeのページが表示されます。
![{3CDF66CB-4A87-4B13-BBC8-8B8F905B2804}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/bd4de1b3-3646-f3ff-7b70-ef0530c65f97.png)

ここまででAWS Marketplaceからサブスクライブする手順について、お伝えしました。


## CVOを利用するには
CVOを含む各機能を利用するには、クレデンシャルの登録が必要です。
手順については、[こちら](https://docs.netapp.com/us-en/bluexp-setup-admin/task-adding-aws-accounts.html#set-up-the-iam-role)

AWSクレデンシャルを BlueXP  に追加した後、AWS Marketplaceサブスクリプションを関連付けることができます。 サブスクリプションは、1時間あたりの支払（PAYGO）または年間契約を選ぶことができます。CVO及びその他の BlueXP  サービスを利用できます。

AWS Marketplaceからのサブスクライブ方法についてまとめてみました。
実際のCVOの利用については、また別記事にしたいと思います！
API Gateway・Lambda・AuroraでAPIを作成してみた[VPC・サブネット・セキュリティグループ編]

# はじめに

みなさんこんにちは！この記事では、「API Gateway・Lambda・AuroraでAPIを作成してみた」というテーマのもと各リソースの作成方法を複数回に分けてご紹介しております。今回はネットワーク部分を対象に、VPC・サブネット・セキュリティグループの作成方法についてご紹介します。

# 目次

* [全体編](https://qiita.com/kazuki_horiuchi/private/cb80dbfd51e77255c653)
* VPC・サブネット・セキュリティグループ編 << 今回はこちら
* [Aurora編](https://qiita.com/kazuki_horiuchi/private/a3dc6dec1dc5f1ec9445)
* [CloudShell編](https://qiita.com/kazuki_horiuchi/private/b2804424e44ad4c4790e)
* [Lambda編](https://qiita.com/kazuki_horiuchi/private/1663571a754ca6e36b2f)
* [Secrets Manager編](https://qiita.com/kazuki_horiuchi/private/8711e7be2e9ea20a56b0)
* [API Gateway編](https://qiita.com/kazuki_horiuchi/private/9cb5352c45211b3573f9)

# 本記事の対象

全体の構成図に対して、本記事では赤字に関連するリソース(VPC・サブネット・セキュリティグループ)を作成していきます。

![image.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773682/ce031bc4-6114-aa5a-2be2-3e250a8435a2.png)

# 作成の流れ

以下の流れで作成していきます。

* VPCの作成
* サブネットの作成
* セキュリティグループの作成
* インバウンド/アウトバウンドルールの設定

# 実際に作成してみた

## VPCの作成

以下の設定値で作成します。

|設定項目 |設定値 |
|---|---|
|VPC名|任意のVPC名|
|CIDR|10.0.0.0/16|

## サブネットの作成

先ほど作成したVPCに対して、以下の設定値で作成します。

### Lambda用サブネット

|設定項目 |設定値 |
|---|---|
|サブネット名|任意のサブネット名|
|AZ|ap-northeast-1a|
|CIDR |10.0.1.0/24 |

### Aurora用サブネット①

|設定項目 |設定値 |
|---|---|
|サブネット名|任意のサブネット名|
|AZ|ap-northeast-1a|
|CIDR |10.0.3.0/24 |

### Aurora用サブネット②

|設定項目 |設定値 |
|---|---|
|サブネット名|任意のサブネット名|
|AZ|ap-northeast-1c|
|CIDR |10.0.4.0/24 |

### CloudShell用サブネット

|設定項目 |設定値 |
|---|---|
|サブネット名|任意のサブネット名|
|AZ|ap-northeast-1a|
|CIDR |10.0.5.0/24 |

## セキュリティグループの作成・設定

先ほど作成したVPCに対して、以下用途のセキュリティグループで作成します。

* Lambda用セキュリティグループ
* RDS Proxy用セキュリティグループ
* Aurora用セキュリティグループ
* CloudShell用セキュリティグループ

## インバウンド/アウトバウンドルールの設定

先ほど作成したセキュリティグループにインバウンド/アウトバウンドルールの設定を行います。

### Lambda用セキュリティグループ

インバウンド

* ルールなし

アウトバウンド

|設定項目 |ルール |
|---|---|
|タイプ|MYSQL/Aurora|
|プロトコル|TCP|
|ポート|3306|
|送信先タイプ|カスタム|
|送信先|RDS Proxy用セキュリティグループ|

### RDS Proxy用セキュリティグループ

インバウンド

|設定項目 |ルール1 |ルール2 |
|---|---|---|
|タイプ|MYSQL/Aurora|MYSQL/Aurora|
|プロトコル|TCP|TCP|
|ポート範囲|3306|3306|
|リソースタイプ|カスタム|カスタム|
|ソース|Lambda用セキュリティグループ|CloudShell用セキュリティグループ|

アウトバウンド

|設定項目 |ルール |
|---|---|
|タイプ|MYSQL/Aurora|
|プロトコル|TCP|
|ポート|3306|
|送信先タイプ|カスタム|
|送信先|Aurora用セキュリティグループ|

### Aurora用セキュリティグループ

インバウンド

|設定項目 |ルール |
|---|---|
|タイプ|MYSQL/Aurora|
|プロトコル|TCP|
|ポート範囲|3306|
|リソースタイプ|カスタム|
|ソース|RDS Proxy用セキュリティグループ|

アウトバウンド

* ルールなし

### CloudShell用セキュリティグループ

インバウンド

* ルールなし

アウトバウンド

|設定項目 |ルール |
|---|---|
|タイプ|MYSQL/Aurora|
|プロトコル|TCP|
|ポート|3306|
|送信先タイプ|カスタム|
|送信先|RDS Proxy用セキュリティグループ|

# 終わりに

いかがだったでしょうか。今回はネットワーク部分を対象にVPC・サブネット・セキュリティグループについてご紹介しました。次回は[Aurora編](https://qiita.com/kazuki_horiuchi/private/a3dc6dec1dc5f1ec9445)についてご紹介します。是非、次回以降もご覧いただけますと幸いです。もしこの記事がお役に立ちましたら、「いいね」「記事のストック」をお願いします！

---

- AWS は、米国その他の諸国における Amazon.com, Inc. またはその関連会社の商標です。
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。
API Gateway・Lambda・AuroraでAPIを作成してみた[全体編]

# はじめに

みなさんこんにちは！今回からAPI Gateway・Lambda・Auroraを使用してデータベースを操作するAPIを作成する方法について、複数のパートに分けてご紹介したいと思います。初回である全体編では、全体の構成図と各リソースの概要についての説明をしていきます。各リソースの詳細な設定については、次回以降で紹介していきたいと思います。

# 目次

* 全体編 << 今回はこちら
* [VPC・サブネット・セキュリティグループ編](https://qiita.com/kazuki_horiuchi/private/a9fef24b77a52e0109b1)
* [Aurora編](https://qiita.com/kazuki_horiuchi/private/a3dc6dec1dc5f1ec9445)
* [CloudShell編](https://qiita.com/kazuki_horiuchi/private/b2804424e44ad4c4790e)
* [Lambda編](https://qiita.com/kazuki_horiuchi/private/1663571a754ca6e36b2f)
* [Secrets Manager編](https://qiita.com/kazuki_horiuchi/private/8711e7be2e9ea20a56b0)
* [API Gateway編](https://qiita.com/kazuki_horiuchi/private/9cb5352c45211b3573f9)

# 構成図

全体の構成は以下になります。

![image.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773682/1b9aee1c-e546-fcb2-0762-49b554899d11.png)


API Gatewayから、VPC LambdaとRDS Proxyを経由してAuroraに格納したデータへ操作を行います。Auroraの認証情報は、ハードコーディングによるセキュリティリスクを低減するために、Secrets Managerに格納します。また、Auroraへのテストデータ格納は、EC2インスタンスの準備・メンテナンスの手間を省くためにCloudShellを使用しています。また、Auroraを作成する際に複数のAZを含んだサブネットグループが必要となるため、ap-northeast-1cにサブネットを作成しております。

# 作業の順番

以下の順番で作業を実施していきます。次回以降の記事では、各リソースへの設定方法や設定値について紹介していきます。各記事のリンクは[目次](#目次)をご確認ください。

1. VPC・サブネット・セキュリティグループの作成
2. Auroraの作成
3. CloudShellを使用したテストデータの作成
4. DBのデータを取得するLambda関数の作成
5. Secrets Managerを使用したDBへの接続
6. API Gatewayの作成

# 終わりに

これから複数のパートに分けて、API Gateway・Lambda・Auroraを使用してデータベースを操作するAPIを作成する方法についてご紹介してきます。次回は[VPC・サブネット・セキュリティグループ編](https://qiita.com/kazuki_horiuchi/private/a9fef24b77a52e0109b1)についてご紹介します。是非、次回以降もご覧いただけますと幸いです。もしこの記事がお役に立ちましたら、「いいね」「記事のストック」をお願いします！

---

- AWS は、米国その他の諸国における Amazon.com, Inc. またはその関連会社の商標です。
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。