OmniAICreator/Qiita-1.07M huggingface dataset:
maxReceiveCountとは

# maxReceiveCountとは
- Amazon SQSでメッセージを受信（Receive）しても削除されない場合に、そのメッセージを「処理失敗」と見なすための受信回数の閾値
- メッセージが指定回数以上受信されても正常に処理されなかった場合、SQSはそのメッセージをデッドレターキュー（DLQ）に移動
## 例
- maxReceiveCountが「2」の場合
    - メッセージが2回受信されても削除されない
    - そのメッセージはデッドレターキューに送信される
    - 「受信回数2回までは通常キューにとどまる」という動作となる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746730/c4dd6eb7-af77-2b10-19b2-59c26791d57c.png)

## 解説
(1)メッセージの投入
- 例えば、メッセージAがSQSキューに送信される
- メッセージAは通常キューに保持され、処理待ちの状態

(2)1回目の受信
- 消費者がメッセージAを受信
- 消費者が処理を試みるが、エラーやタイムアウトで削除しなかった場合：
  メッセージAはVisibility Timeout後、再びキューに現れる

(3)2回目の受信
- メッセージAが再び消費者に提供される
- 再び処理を試みるが失敗（削除されない）
- 受信回数が2に達するが、まだデッドレターキューに移動しない

(4)3回目の受信をトリガー
- 3回目にメッセージAが消費者に提供されるタイミングで、maxReceiveCountの設定（2）を超えるため：
メッセージAはデッドレターキューに移動する

# その他補足
- Amazon SQSにデッドレターキューを設定しない場合、maxReceiveCountは適用されない
- 推奨値はアプリケーションの性質や処理のリトライ要件によるが、一般的には2～5回程度が設定される
- 「0」は設定できない（エラーになる）

# まとめ
- 処理に失敗したメッセージの無限ループを防ぐ
- エラー原因を分離・調査できる仕組みを提供
- システム全体の負荷を軽減し、効率的なリトライ制御を実現
- AWSの分散型システムにおける信頼性を強化
生物物理屋がNishikaの初心者向け課題に挑戦してみた話

## はじめに
この記事は「[ただただアウトプットを癖付けるための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/newbie2024)」に投稿した記事です。

[最初の記事](https://qiita.com/yotabouya/items/e63c53c5e18b3cf6a454#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)にも書いた通り、私は生物物理の実験を専門にしている研究者です。
最近はデータ解析のため機械学習のコード開発も行っており、幸いにもその成果が[NeurIPSに採択されました](https://neurips.cc/virtual/2024/poster/93465)。

[以前の記事](https://qiita.com/yotabouya/private/6ea94fdbaec86649a753)で、SIGNATEの初心者向け課題に挑戦した話をしました。
今回はまた別の競技プログラミングサービス、Nishikaに挑戦してみました。

## 関連記事

#### 前の記事「[NeurIPS著者が今更JAXを使ってみた話](https://qiita.com/yotabouya/private/ceb9cc1489600dc76041)」

#### 次の記事「[【生物物理屋による論文紹介】マルチモーダル言語モデルによるマインクラフト学習 JARVIS-1](https://qiita.com/yotabouya/private/665d04d0f3a1f1723ff4)」

## Nishika

Nishikaは、競技プログラミングのコンペティションを提供しているサービスです。
[こちら](https://nishika.com/)からアクセスできます。
今回は、練習問題のなかから、[日本画の顔分類問題](https://competition.nishika.com/competitions/kaokore_pra/summary)に挑戦してみました。

## 問題概要

日本画の顔分類問題は、日本画の顔画像を分類する問題です。
学習データは、日本画の顔画像とそのラベルが与えられます。このラベルは、画像のファイル名と番号の組み合わせを記したcsvファイルで与えられます。
テストデータは、日本画の顔画像が与えられ、その画像がどのラベルに分類されるかを予測する問題です。
ラベルというのは、性別と階級の組み合わせです。
これらのほかに、提出用のサンプルファイルが与えられます。
このサンプルファイルもまた、画像のファイル名と番号の組み合わせを記したcsvファイルです。
この形式で、提出用のファイルを作成し、提出します。

## 解法

今回は、画像分類問題を解くために、[PyTorch](https://pytorch.org/)を使いました。
なかでも、[torchvision](https://pytorch.org/vision/stable/index.html)を使って、画像分類のためのモデルを構築しました。
今回も練習問題ということでさわりだけですが、やったことは以下の通りです。

- 画像データとラベルを読み込むデータローダーを作成 (torchvision.datasets)
- 128x128にリサイズし、正規化するための前処理を定義 (torchvision.transforms)
- データセットを訓練用と検証用に分割 (torch.utils.data.random_split)
- ラベルの個数を数え、クラス数を取得 (dataset.img_labels)
- ResNet18の最終層の次元だけ変えたモデルを定義 (torchvision.models)
- 損失関数と最適化手法を定義 (torch.nn.CrossEntropyLoss, torch.optim.Adam)
- 学習
- 画像データのみを読み込むデータローダーを作成 (torchvision.datasets)
- 検証用データで評価
- テストデータで予測
- 提出用のcsvファイルを作成

最初に作ったデータローダーがラベルを必要とする構成になってしまっていたため、テストデータ用に別途データローダーを作成する必要が生じてしまいました。ここは改善点ですね。
今回はCPUで学習したので、10エポックでも10分ほどかかりました。
これだけでも、検証用データで0.77程度の精度が出ました。
提出後のスコアでも、0.765という評価値が出ていました。
ランキングを見ると0.9以上のスコアが出ている方もいらっしゃいましたが、パッとやったにしてはまずまずの結果だと思います。
IBM Instana ObservabilityがCRN 2024「Products of the Year」を受賞！

## はじめに  
朗報です！ **IBM Instana Observability** が、CRNの2024年「Products of the Year」において、**Application Performance and Observability部門のOverall Winner** に選ばれました！ 🎉

https://www.crn.com/news/channel-news/2024/crn-s-2024-products-of-the-year?page=2

今回の受賞は、Instanaが単なる監視ツールに留まらず、ビジネス価値や顧客ニーズに応える先進的な可観測性ソリューションとして評価されたことを示しています。

## Instanaが注目される理由

### 1. 複雑な環境でも自動的にサービス検出・可視化  
コンテナ、マイクロサービス、サーバーレス、オンプレミスからクラウド環境まで、Instanaは多様なインフラを自動的に探索し、関連するアプリケーションコンポーネントを可視化します。特定のクラウド（例：AWS、GCP、Azure）に依存せず、幅広いプラットフォームで共通の運用モデルを確立できるのが魅力です。

![instana-map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/940185f3-6986-883f-a105-781b90ccd570.png)



### 2. AIによる根本原因分析でトラブルシューティングを簡略化  
Instanaは、膨大なメトリクスやログ、トレースから得られるデータをAIで分析し、障害発生時に関連情報を自動で集約・提示します。これにより、従来数時間かかっていた問題追跡が大幅に短縮され、異常発生時のMTTR（平均復旧時間）低減に直結します。

![instana-root-cause.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/e3350ad2-2023-33a7-bf61-c294f8e7f717.png)

![instana-recomended-action.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/6f27feb0-44a6-bcc7-dfa6-88ed70e08e29.png)

### 3. リアルタイムの洞察で意思決定を加速  
システムの状態変化を即座に把握できるため、新機能リリース後の影響分析や、リソース最適化の判断がスピーディーに行えます。迅速な決定はビジネス成長にも寄与します。

![instana-metric.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/3baa04ac-d9a6-44f6-6223-2b8d538e4760.png)



## なぜエンジニアにとって価値があるのか？  
Observabilityは、クラウドネイティブ化やマイクロサービス化が進む現場で、**何が起きているのかを「中から」理解するための基盤**です。  

| 役割 | 主なメリット |
|------|------------|
| DevOps/SREエンジニア | ・リリース影響の即時把握<br>・インシデント対応時間の短縮 |
| 開発者 | ・パフォーマンス問題の素早い特定<br>・デバッグ時間の削減 |
| インフラ管理者 | ・リソース使用の最適化<br>・プロアクティブな容量管理 |

## Instana Observability Advent Calendarで実践的なノウハウを共有  
「Instanaを本当に使いこなすには？」「他ツールと組み合わせるベストプラクティスは？」  
そんな疑問に応えるべく、**Instana Observability Advent Calendar 2024** では、現場で使えるTipsや実践事例をみんなで続々と投稿が始まってます。  
- セットアップ手順や環境統合のコツ  
- 分散トレーシングを活用したボトルネック解析  
- 他の可観測性・監視ツールとの連携事例

https://qiita.com/advent-calendar/2024/instana

👉 [Instana Observability Advent Calendar 2024](https://qiita.com/advent-calendar/2024/instana)
👉 [Instana Observability Advent Calendar 2023](https://qiita.com/advent-calendar/2023/instana)

ぜひチェックして、日々の運用や開発の参考にしてみてください！

## まとめ  
CRN受賞は、IBM Instana Observabilityが現代のIT運用・開発のニーズに即した価値を提供している証拠です。  
可観測性を強化することで、システムの安定性向上やリリースサイクル短縮、顧客体験の改善に直結します。この機会にInstana導入や活用を検討し、Instana Observability Advent Calendarで公開される知見とあわせて、あなたの現場でObservabilityをさらなる高みへと導いてみてはいかがでしょうか？
NeurIPS著者が今更JAXを使ってみた話

## はじめに
この記事は「[ただただアウトプットを癖付けるための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/newbie2024)」に投稿した記事です。

[最初の記事](https://qiita.com/yotabouya/items/e63c53c5e18b3cf6a454#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)にも書いた通り、私は生物物理の実験を専門にしている研究者です。
最近はデータ解析のため機械学習のコード開発も行っており、幸いにもその成果が[NeurIPSに採択されました](https://neurips.cc/virtual/2024/poster/93465)。

上記のコード開発では、pytorchをこねくり回すことで、なんとか目的のモデルを作成することができました。
正直動作時間などは考えられておらず、効率化が必須の状況です。
そこで、JAXを使ってみることにしました。
今回は、適当に機械学習モデルを作成してみることにしました。

## 関連記事

#### 前の記事「[生物物理屋がSIGNATEの初心者向け課題に挑戦してみた話](https://qiita.com/yotabouya/private/6ea94fdbaec86649a753)」

#### 次の記事「[生物物理屋がNishikaの初心者向け課題に挑戦してみた話](https://qiita.com/yotabouya/private/b6b3de7b8f9c2c0d229c)」

## JAX

[こちら](https://zenn.dev/turing_motors/articles/4a7e80c4a47b65)を参考にしています。

JAXは、数値計算を高速におこなうためのライブラリです。
Deepmindが開発したものであり、[こちら](https://github.com/jax-ml/jax)からアクセスできます。

JAXは、numpyの代わりに使うことができます。
線形代数の計算を高速におこなうコンパイラが内蔵されているほか、自動微分もサポートされています。

PyTorchからの移行には、[こちら](https://zenn.dev/jellied_unagi/articles/7fac534ea6162b)も参考になりそうです。

## Flax

Flaxは、JAXを使った機械学習ライブラリです。
これを用いることで、簡単に機械学習モデルを作成することができます。

## インストール
  
```bash
pip install -U --pre jax jaxlib -f https://storage.googleapis.com/jax-releases/jax_nightly_releases.html
pip install flax
```

windows11環境です。python3.8では動作しませんでした。今回はpython3.11.7を使っています。


## JAXを使うコード

```python
import jax
import jax.numpy as jnp

def f(x):
    return x**2

grad_f = jax.grad(f)
print(grad_f(3.0))
```

## Flaxを使うコード

### モデルの作成

```python

import jax
import jax.numpy as jnp
from flax import linen as nn

class MLP(nn.Module):
    features: int

    def setup(self):
        self.dense1 = nn.Dense(features=self.features)
        self.dense2 = nn.Dense(features=1)

    def __call__(self, x):
        x = self.dense1(x)
        x = nn.relu(x)
        x = self.dense2(x)
        return x

model = MLP(features=10)
params = model.init(jax.random.PRNGKey(0), jnp.ones((1, 10)))
```

### モデルの学習

上の続きです。

```python
import optax

optimizer_def = optax.adam(learning_rate=0.1, b1=0.9, b2=0.999)
optimizer = optimizer_def.init(params)

@jax.jit
def loss_fn(params, x, y):
    pred = model.apply(params, x)
    return jnp.mean((pred - y)**2)

loss_grad_fn = jax.value_and_grad(loss_fn)

x = jax.random.normal(jax.random.PRNGKey(0), (100, 10))
y = x @ jnp.ones((10, 1)) + 0.1 * jax.random.normal(jax.random.PRNGKey(0), (100, 1))

for i in range(101):
    loss_val, grads = loss_grad_fn(params, x, y)
    updates, optimizer = optimizer_def.update(grads, optimizer)
    params = optax.apply_updates(params, updates)
    if i % 10 == 0:
        print(f'Loss step {i}: ', loss_val)
```

jax.jitは、関数をコンパイルして高速化するデコレータです。
GPUを使う場合は、jax.jitを使うことで高速化が期待できます。

optaxは、最適化アルゴリズムを提供するライブラリです。

このコードで、ちゃんとlossが減少していくことが確認できました。
やる気を出す (2)

### いますぐやれ！！

[前回記事](https://qiita.com/souyakuchan/items/fe216642a1ba79385181) では、仕事のやる気を鼓舞すべく [桜井さん](https://x.com/Sora_Sakurai) の一喝を PC で定期的に強制表示するタスクスケジューラの設定方法を紹介した。

今回は iPhone 版での設定の仕方について。

##### とにかくやれ！！
Apple 公式アプリの [ショートカット](https://apps.apple.com/jp/app/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88/id915249334) を利用する。

##### 実行処理の作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546894/dd7a6421-05ed-8b30-5c53-4b468ecc11e4.png)

アプリ画面の `ショートカット` タブの右上の `+` ボタンから自動実行する処理内容を新規作成し、これ ↓ を作る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546894/add887bf-065d-1038-e5a7-73768bb8bd19.png)

のちほど設定するトリガーが発生した後に、一定の待機時間をおいて一喝のシーンが強制再生されるようにする。

`アクションを検索` 欄から、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546894/cee9b604-9a56-9f22-1842-b4f991693f0a.png)
`待機` と検索すれば待機コマンドを見つけられるので選択。待機時間は秒数で設定できるので、好きな時間を入力する。例えば 3 分間 (= 180 秒)。

次に、待機後に実行される `URL を開く` コマンドを設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546894/3d7160ec-66cc-e188-e38c-ed1e667f1b14.png)
先程と同様に、`アクションを検索` 欄で `urlを` などと検索すればコマンドを見つけられるので選択。再生したい URL を入力する。
```
https://www.youtube.com/watch?v=JV3KOJ_Z4Vs&t=108s
```

##### トリガー設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546894/f9a6575f-28d2-576f-c3c2-0c2fd174df44.png)

`オートメーション` タブに行き、トリガー条件を設定する。右上の `+` ボタンからを新規作成し、これ ↓ を作る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546894/c3fbb484-fe06-4b63-1c57-c3d651444b1c.png)

`いつ` にトリガー条件を、`行う` に処理内容を指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546894/676b7f46-1c1b-b3df-5211-294353e4933f.png)

トリガー条件には、スマホでつい見てしまいがちな SNS などのアプリの起動などを指定するとよいだろう。
処理内容には、先ほど作成した自動処理 (待機時間後に URL を開いて動画を再生する) を指定する。

これにより、`𝕏 を開いてしまったら 3 分後に強制的に桜井さんに一喝される` といった能率向上作戦が実現される。

##### いますぐやれ！！
【ML初心者アドベントカレンダー】基盤モデルを使用する際の考慮事項を学ぼう



# この記事の目的

基盤モデルを使用する際の考慮事項について、ざっくりと学ぶ。

# モデルを選ぶ選択基準

事前にトレーニングされたモデルは一つではないため、使用する前に解決したいタスクと照らし合わせ、最適なものを選ぶ必要がある。

主に以下の観点が存在するようだ。

## コスト

モデルの使用料や、開発にかかる人件費。
大規模な開発環境ではよりコスパのよいモデルが求められるが、小規模な開発ではそもそものAPIの呼び出し基本料金等を気にする方が良い。

## モダリティ

データ形式について考えること。例えば、処理をするデータが画像ならそれに適したモデルを使う必要があるし、マルチモーダルが必要ならそこも考量する必要がある。

## レイテンシー

出力にどれくらいの時間的猶予が許されるか。
チャットボットなら即座に応答が必要だが、一日の決まった時間に決まった処理をするようなモデルならレイテンシーはそこまで気にしなくてよい。


## 多言語

モデルが多言語の処理を必要とするか。必要とする場合、言語間でパフォーマンスにどのような影響があるか等。
何があっても英語しか受け付けません！というような男気タスクなら気にしなくても良いかも。

## モデルサイズ

どれくらい大規模なモデルを使うか。
一般的にモデルが大きいほど精度が高い傾向だがもちろんコストは増す。

## モデルの複雑さ

モデルが実行するタスクの複雑さ。
犬、猫を判別するような単純モデルなのか、画像を読み取りそれがなんという動物なのか全哺乳類の中から識別するような複雑モデルなのか。

## カスタマイズ

カスタマイズ（ファインチューニング）等がどの程度できるか。
特殊なタスクを処理する可能性がある場合は、カスタマイズが可能なモデルを選ぶ。


## 入力/出力の長さ

モデルが入力、出力に対し、どの程度のトークン数対応できるか。
短い応答でも問題がなければ軽量のモデル、等の選び方をする。

# 推論パラメータについて

基盤モデルを使用するにあたり、自分で推論パラメータ（モデルの挙動を調整できる数字のこと）をいじる必要がでてくるかもしれない。
その際はなんとなくこの数字が好きだから…という感じにフィーリングで決めるのではなく、結果に与える影響を考え、ふさわしい数値を設定する。

## 温度

生成される応答のランダム性（創造性）の度合いを制御するパラメータ。最大は1。
温度を下げると一貫性が上昇する。あげると多様性が上昇する。
定められた文書の作成等、厳密な応答が必要な場合は低い方が良いが、面白い話をしてほしいなー！等、創造性が必要な場合は高い方が良い。

## Top K

出力された応答の上からK個目までを選択すること。
Kの数値が低いほど現実的で、高いほど創造性が増す。

## Top P

出力された答えの確率の合計値がPを超えない範囲まで選択すること。
こちらも数値が低いほど現実的。

# 検索拡張生成 (Retrieval-Augmented Generation) について

RAGとは、モデルと外部の検索情報を組み合わせることで、モデルの性能や信頼性を向上させる方法。
ユーザーの質問に対し、モデルが検索をして情報を得て、その情報を盛り込んだうえで答えを生成すること。

## Amazon Bedrock ナレッジベース
S3などに保存した文章や情報を使用してRAGを実装できるサービス。

# Amazon Bedrock の エージェントについて

ユーザーの問いかけに対し、モデルが自ら必要な情報を聞き出して答えを生成する仕組み。
事前にエンジニアが指示を与えて調整する必要があるが、一度作成してしまえば何回も使える。


公式ページ
https://aws.amazon.com/jp/bedrock/agents/

# プロンプトエンジニアリング

モデルを使用する際は、プロンプトにも気を配る必要がある。
https://qiita.com/ei_540/items/a1aa62d1cf28bf22fd74

## Few-Shot Learning

ラベル付きデータを少数与え、答えを導き出してもらうこと。
例：「猫の子供は子猫。犬の子供は子犬。それでは羊の子供は？」

## Zero-Shot Learning

正解のないデータに対して応答できるようにトレーニングをすること。
ElastiCache for Redis と ElastiCache for Memcached がどうしても覚えられない人向け

# Amazon ElastiCache for Redis と Memcached の違いを覚える方法
「**機能 vs. シンプルさ**」という視点で整理すると分かりやすいです。
2つに共通しているのはデータベースのパフォーマンスを向上させるキャッシングサービス。

## 覚え方
- ### Redis = 「リッチ！に使える多機能なキャッシュ」
- ### Memcached = 「メモ帳！シンプルにキャッシュだけ」
---
### 1. **Redis**
- Redisは多くの機能を持ち、データ管理以外のことも可能
- **特徴的なポイント:**
  - **データ構造の豊富さ**: リスト、セット、ソート済みセット、ハッシュなど様々なデータ型に対応
  - **永続性のサポート**: データをディスクに保存する仕組みがあり、再起動後もデータを保持可能
  - **スクリプト実行**: Luaスクリプトをサポートし、複雑な処理をキャッシュ内で実行可能
  - **Pub/Sub機能**: メッセージキューのような使い方も可能

- **用途の例:**
  - セッション管理
  - ランキングの計算
  - 分析データのキャッシュや永続的なデータストア

---

### 2. **Memcached**
- Memcachedはキャッシュとしてシンプルなデザインで、高速性に特化
- **特徴的なポイント:**
  - **シンプルなキー/バリュー型のキャッシュ**: 複雑なデータ型はサポートしない
  - **永続性なし**: 再起動後にデータは消える
  - **スレッド対応**: マルチスレッドに対応しており、高い並列処理が得意

- **用途の例:**
  - Webアプリケーションのページキャッシュ
  - 一時的なデータキャッシュ（DBの負荷軽減）

---

## **簡単な違いの比較表**

| No | 比較項目                 | Redis                               | Memcached                     |
|----|--------------------------|-------------------------------------|--------------------------------|
| 1  | データ型                | 多彩なデータ型をサポート           | キー/バリュー型のみ            |
| 2  | 永続性                  | あり                                | なし                           |
| 3  | メッセージング機能      | Pub/Subやストリームなどが可能       | なし                           |
| 4  | スクリプト実行          | Luaスクリプトで複雑な処理が可能     | なし                           |
| 5  | マルチスレッド対応      | 非対応                              | 対応                           |
| 6  | 主な用途                | セッション管理、ランキング処理など | シンプルなキャッシュ           |

---

## **具体的なイメージ例**
1. **Redisを選ぶ時**:
   - 「分析やランキング計算もしたい、そして一部のデータは永続化したい」という時。
2. **Memcachedを選ぶ時**:
   - 「単純に、よく使うデータを高速にキャッシュしたいだけ」という時。
24日目にLINEミニアプリが完成する初心者 ── Day12. リッチメニューの作成


# はじめに

前回は「24 日目に LINE ミニアプリが完成する初心者 ── Day11. プッシュメッセージの送信」と題して、資料請求完了時に LINE にプッシュメッセージを送信する機能を実装しました。

https://qiita.com/non_watanabe/items/5b939d1c699095ad9f4c

<br/>
今回からは、新機能として問い合わせ機能の実装を行っていきます。

具体的には、 LINE 公式アカウントにリッチメニューとしてお問い合わせを設置し、種別を選択して問い合わせができる機能を実装します。

また最終的にはその内容を Google スプレッドシートに出力することをゴールとして進めていきたいと思います。

# リッチメニューの作成

今回は問い合わせ機能の実装を行う前準備として、リッチメニューの作成を行いたいと思います。

LINE 公式アカウントの左メニューから「リッチメニュー」を選択し、「リッチメニューを作成」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/5983b280-4b40-50df-b932-c2f8db7cf0aa.png)

## 基本設定

基本設定として、タイトルと表示期間を設定します。

今回はテストアカウントでの利用のため今月中で設定しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/3f1fc543-94c1-1416-05fd-91ed73133acc.png)

## コンテンツ設定

テンプレートの選択でリッチメニューの表示形式を選択していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/d2ae7c22-848e-8e06-99b7-3b20c87345b1.png)

<br/>
今回作る予定の機能としては以下の3つです。

- **資料請求**
- **お問い合わせ**
- **来店予約**

そのため、小の３つ区切りのものを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/d0e1cb03-2d8a-5a2a-db1d-30319f26761f.png)

<br/>
次に画像作成のためにテンプレートのダウンロードを行います。

コンテンツ設定右上の「デザインガイド」をクリックしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/09083d7e-be00-19f6-de6f-a0c28da08254.png)

<br/>
ここから「テンプレートのダウンロード」をクリックすることでダウンロードを行うことができます。

ダウンロードしたテンプレートを参考に画像の作成を行いましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/d212438d-158d-d137-1ee3-43195318d0df.png)

### 画像の作成

画像の作成方法は自由で構いませんが、私の作成方法も簡単に紹介しておきます。

私はが使ったテンプレートは`RichMenu_DesignTemplate/Compact/Large/richmenu-template-guide-01.png`です。

![richmenu-template-guide-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/39ced3f0-6496-50eb-4e16-f9ce8a6b9a95.png)

<br/>
これを元に私は Google スライドで画像の作成を行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/462d8fa6-e23a-3c4f-aa1b-182118ac81f2.png)

<br/>
画像の作成が完了したら「背景全体の画像をアップロード」からアップロードを行いましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/537b38cc-4039-bdf1-e9f4-908cc4da7524.png)

## アクションの設定

画像の設定が完了したらそれぞれのアクションを設定していきます。

なお、来店予約についてはまだ実装が完了していないため、一旦「設定しない」を選択しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/95089526-737e-99ee-046d-ec11d521e4cb.png)

「保存」を押したらリッチメニューの設定は完了です。

# 動作確認

LINE で動作確認を行ってみます。

公式アカウントのトーク画面を見てみると、リッチメニューが反映されているのが確認できると思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/ae4db2bc-2e03-8dec-d109-abdc69012148.jpeg" width="50%" />

お問い合わせを押すと、「お問い合わせ」というメッセージが投稿されました！

# まとめ

今回は、LINE 公式アカウントからのリッチメニューを設置を行いました。

次回は、「>お問い合わせ」というメッセージをフックに、種別を選択させるチャットが投稿されるように実装していきます。

残りは 12 日！
気になる方は是非フォローやカレンダー購読をお願いします:star:
アルゴリズムを選ぶときの視点を考える

この記事は東京海洋大学NePPのAdvent Calendar 2024の12日目です🎁
# はじめに
　アルゴリズムやデータ構造を一通り学習して浮かぶ疑問がありますね。
　　「計算量とかって何の役に立つの？🤔」
いきなり学ぶ計算量とかいう概念、これはアルゴリズムやデータ構造を使用しようという場面において選択の軸となることがあります。
いつか来るかもしれないそのような機会のために、この記事では、アルゴリズムやデータ構造を選ぶ際の評価軸となることをまとめています。最初に観点を示したのちに簡単な説明が続きます。

# 選択する際の観点
+ 時間計算量
+ 空間計算量
+ 取り扱うデータのサイズ
+ データのアクセス・挿入・削除・更新の頻度

# 簡単な解説
#### 時間計算量
　問題解決に要する所要時間のこと。よくオーダー記法で表される。
　小さいほうがよい。
　競技プログラミングでは時間計算量に注目することが多い気がする。
#### 空間計算量
　問題解決のプログラムを書くために必要なメモリ容量のこと。
　小さいほうがよい。
#### 取り扱うデータのサイズ
　入力が使うメモリ容量のこと。
　オーダー記法ではNで表される。
　時間計算量に影響を与える場合もあれば、与えないこともある。
#### データへのアクセス・挿入・削除・更新の頻度
　実際の使用状況による。
　データ構造によってそれぞれにかかる時間が異なる。

# ひとりごと
　大学の実験で計測センサーを取り扱った際にこのようなことを言われました。
「センサーに必要な精度は使用用途によって変化します。
例えば、電車でどの線に乗っているかを知りたいときには1~2mの誤差に収めないといけませんが、大学に来ていることを知りたいときには20mの誤差があっても許されるのです。
**技術者は誤差をなくそうと奮闘しがちですが、本当に必要なことはどの程度の精度が必要なのかに関して使う人と技術者が共有しあうこと**なのかもしれないですね。」
これはコードを書く人（技術者）とユーザにも通じることだと思います。
高速化をめざしてコードを書こうとしてしまうことが多々ありますが、実際に使う状況を考えることも忘れないようにしたいと思いました。

# 最後に
　今回が初めての記事となりましたが、脳内の考えを整理することができるという点で記事を書くことのメリットを感じることができました。最後になりますが、このような視点を学ぶきっかけをくださったSTEP関係者のみなさまにこの場で感謝を申し上げます。
【React】サイトを開いた際に特定の要素まで自動スクロールさせてみる

# はじめに
本記事では、useEffectとscrollIntoViewメソッドを組み合わせて画面表示後に指定した要素まで自動でスクロールする処理を実装します。


# 環境
- vite
- tailwindcss
- react

# scrollIntoViewメソッドを使用した例

useRefでスクロール先の要素への参照オブジェクトを作成し、`ref`属性でスクロール先の要素と変数targetRefを紐付けます。
DOM要素が構築された後に`sollIntoView()`メソッドを実行し、対象の要素までゆっくりスクロールを行います。


```jsx
import { useEffect, useRef } from 'react';

const App = () => {
  const targetRef = useRef(null);
  // 初期状態
  console.log("初期状態", targetRef); // { current: null }

  useEffect(() => {
    // レンダリング後
    console.log("レンダリング後",targetRef); // { current: div～～ }

    if (targetRef.current) {
      targetRef.current.scrollIntoView({ 
        behavior: 'smooth', 
        block: 'start' 
      });
    }
  }, []);

  return (
    <>
      {/* スクロール前の上部スペース */}
      <div className="h-screen bg-gray-100 flex items-center justify-center">
        <h1 className="text-2xl">上部スペース</h1>
      </div>

      {/* スクロール先の要素 */}
      <div 
        ref={targetRef}
        className="h-screen bg-blue-100 flex items-center justify-center"
      >
        <h2 className="text-2xl">自動スクロール先</h2>
      </div>

      {/* スクロール後の下部スペース */}
      <div className="h-screen bg-gray-100 flex items-center justify-center">
        <h3 className="text-2xl">下部スペース</h3>
      </div>
    </>
  );
};

export default App;
```

:::note info

- scrollIntoView
    - behavior：即座にスクロール or 滑らかにスクロールするか挙動を制御
        - `'smooth'`: アニメーションのついた滑らかなスクロール
    - block：垂直方向の配置
        - `'start'`: 要素を表示領域の上端に配置

https://developer.mozilla.org/ja/docs/Web/API/Element/scrollIntoView#behavior

:::




## ブラウザで確認

サーバを立ち上げてブラウザで挙動を確認してみると、レンダリングされた際にスクロール先の要素まで自動で移動していることを確認できました。

![auto-scroll-tt.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/cad03648-0a89-624d-74e6-509a652234b1.gif)






# 参考

https://developer.mozilla.org/ja/docs/Web/API/Element/scrollIntoView


https://qiita.com/enumura1/items/3a4b7d4862c024ec8741
【Ubuntu 24.04】Ubuntu 24.04 verでRocket.Chat配布

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958407/cac5f574-cd1a-c90e-c199-1550f6ba971b.png)


## HeadLine2


### Title3


#### Title4



```javascript :page.tsx
if (userData) {
            setUserName(userData.user_name ?? "");
            setNickname(userData.nickname ?? "");
            setProfile_img(
              userData.profile_img ??
                "https://mjhcmaqftsbfevquhyqc.supabase.co/storage/v1/object/sign/user_profile/default_img.png?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cmwiOiJ1c2VyX3Byb2ZpbGUvZGVmYXVsdF9pbWcucG5nIiwiaWF0IjoxNzI4OTMzOTg3LCJleHAiOjE3NjA0Njk5ODd9.zkJMRvGI8vpWKsR1c5nskb88fibWo_uM_lzQJzfZVbk&t=2024-10-14T19%3A26%3A28.430Z"
            );
          } else {
            console.log(userError);
          }
```


*test*

**test**

[Korea Blog](https://kazesama.com/web/#/login.html?serverid=8d07fcb091604f34825240b618c948c5&url=%2Fhome.html)


- list1
- list2
- list3

1. numberList1
1. numberList2
1. numberList3
プレイスメントグループとは

## 1. プレイスメントグループとは
AWSのEC2プレイスメントグループは、インスタンスを特定の方法で配置することで、ネットワーク性能を向上させたり、フォールトトレランスを確保したりする仕組みです。  
これにより、特定のユースケースに最適化されたインフラを構築することが可能です。

プレイスメントグループを利用することで、以下のような効果を得ることができます。
- **ネットワークスループットの向上**  
- **レイテンシ削減**  
- **フォールトトレランスの強化**  

## 2. プレイスメントグループの種類（表）

プレイスメントグループには3つの種類があり、それぞれ特定のユースケースに適しています。

| No | 種類                  | 特徴                                      | 主な用途                     |
|----|-----------------------|-------------------------------------------|-----------------------------|
| 1  | クラスター（集約配置）   | 低レイテンシ・高スループットが必要な環境  | HPC、分散システム           |
| 2  | スプレッド（分散配置）    | 耐障害性が必要な環境      | マルチAZアプリケーション     |
| 3  | パーティション | 大量データ処理でフォールトアイソレーションを提供 | ビッグデータ処理、分析基盤 |

### 表のポイント
- **クラスター**: インスタンスを1つのラックに配置し、レイテンシを最小化
- **スプレッド**: インスタンスを分散配置することで、単一障害点を回避
- **パーティション**: 各パーティションが独立しており、障害が発生しても他に影響を出さない仕組み

## 3. 詳細

### クラスター
- **特長**: 同一ラック内に配置されるため、極めて低いレイテンシと高スループットを実現
- **制約**: 配置可能なインスタンス数が制限される場合あり

### スプレッド
- **特長**: 各インスタンスが異なるラックに配置されるため、単一障害点を回避  
- **制約**: 配置可能なインスタンス数（通常最大7インスタンス）が制限される

### パーティション
- **特長**: 各パーティションが独立しており、大規模なデータ処理に最適
- **制約**: 必要なインスタンス数や分散計画によって設定が複雑になる場合あり

## 4. ユースケース

### ハイパフォーマンスコンピューティング（HPC）
- 大規模な計算を並列処理する際に集約配置が有効です。  
- 例: 科学計算、シミュレーション、機械学習のトレーニングなど

→クラスターが推奨

### 分散システム構築
- 分散配置を活用して、異なるラック間で高可用性を実現します。  
- 例: マルチAZをまたいだWebアプリケーション

→スプレッドが推奨

### データ分析基盤
- ビッグデータの処理を効率化します。  
- 例: データウェアハウス、Hadoopクラスタの構築

→パーティションが推奨

## 問題
最大のパフォーマンスを発揮するために、ネットワーク遅延抑える方法は？

- (1) クラスター
- (2) スプレット
- (3) パーティション

### 正解
- (1) クラスター
OKdo ROCK 3CでRaspberryPi Camera v2を使う

# はじめに
OKdoRock3CでRaspberryPi Camera v2を使う方法を書いていきます。RockにVNCで接続し、そこからカメラの映像を見るところまでやります。
今回はROCK3Cを使用していますがほかのモデルも大体一緒だと思います。

# VNCのセットアップ
まずはVNCで接続できるようにし、ヘッドレスでもGUIを触れるようにしましょう。
やることは公式Wikiに書いてあるとおりです。
https://docs.radxa.com/en/rock3/rock3c/radxa-os/remote-access
```
sudo apt update
sudo apt install tigervnc-standalone-server dbus-x11
```
で必要なパッケージを落とします。
```
vncserver
```
で一度起動させるとパスワードの設定があります。一度入力しその後の質問ではnを選択しましょう。
```
vncserver -kill :1
```
で起動したvncserverを一度終了し、
```
nano ~/.vnc/xstartup
```
``` #!/bin/sh
  unset SESSION_MANAGER
  unset DBUS_SESSION_BUS_ADDRESS
  unset XDG_RUNTIME_DIR
  /etc/X11/xinit/xinitrc
  [ -x /etc/vnc/xstartup  ] && exec /etc/vnc/xstartup
  [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
  xsetroot -solid grey
  #vncconfig -iconic &
  startkde &
  ```
を記述し、権限を付与してあげます。
  ```
  chmod +x ~/.vnc/xstartup
  ```
  再度起動させてあげましょう。
  ```
  vncserver -localhost no
  ```

  クライアント側のPCにVNCクライアントのアプリを入れて起動させます。RealVNCが公式で案内されているのでこれを入れましょう。
  インストール後は"ROCKのIP:5901"にアクセスします。暗号化されていないと怒られますが続行します。ROCKのGUIが見えたら成功です。
  
# カメラのセットアップ
こちらも公式Wikiに情報が乗っています。
https://docs.radxa.com/en/rock3/rock3c/accessories/camera
rsetupからカメラモジュールを有効化させます。
overlays→yes→Manage overlaysを開きます。その中から使いたい機能（今回であればRaspberryPi Camera v2)を探してオンにします。カーソルをあわせてスペースでチェックが付きます。![スクリーンショット 2024-12-08 13.20.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680953/b0476868-abad-e95b-6260-a9d3f36d29ac.png)

TabキーでOkを選択しenter。その後ROCKをシャットダウンしましょう。
シャットダウン後に電源を抜いてカメラを接続します。今回のカメラはROCK中央のソケットに接続します。ちなみにoverlaysの中のView overlays infoからどこに接続すればいいとかの情報を見ることができます。![スクリーンショット 2024-12-08 13.22.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680953/57b302bd-3f15-fa9b-ccd6-9de2c32dea6f.png)

白い部分を爪で少し持ち上げロックを解除し、カメラのフレキを差し込みます。
![IMG_6291.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680953/9252ad10-8d98-57f8-1f32-a1ea74f52150.jpeg)
奥まで差し込めたら白い部分を押し込みロックします。少しフレキの電極が見えますが問題ありません。
![IMG_6292.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680953/f4521a9c-392e-c3c4-5ecc-3cdd81873ed5.jpeg)
挿せたら起動させます。vncで接続し、
```
sudo apt install cheese
sudo cheese
```
を実行しカメラの映像が表示されれば設定成功です。
Storage JAWS 2年目の歩み

# Storage JAWSは2年目になりました！
2023年6月に発足したStorage JAWSですが、ついに2年目に突入しました！
4半期に1回程度の頻度でイベントを開催しており、毎回100人近く募集が集まるような活発的なコミュニティとなりました。

本記事ではそんなStorage JAWSがどのような活動を行っているのか、運営である私が自由気ままに書いていこうと思います。

# 本年度の活動
## Storage-JAWS #3
https://storage-jaws.connpass.com/event/310074/

https://www.youtube.com/watch?v=gsMgePEgz3E

Storage JAWS 初のオフライン開催をしました！
みなさんに身近なポリシー周りの話からS3の歴史やLVMの話などのニッチな話まで、様々なお話をしていただきました！

## Storage-JAWS #4
https://storage-jaws.connpass.com/event/319243/

https://www.youtube.com/watch?v=xgvkuw8fua8

2回連続でのオフライン開催！この会では参加者にはSWAGをお渡ししました！
LT会はこの会も大盛況であり、発表者からの問いに対して会場で考えるといったインタラクティブなチョークトークさながらの会ができました。

改めてオフライン開催の良さを体感したような気がします。

## AWS Summit 2024
![StorageJAWSStecker.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/e65c3e4e-4856-43ea-dfb8-9b42371f51e3.jpeg)


AWS SummitではついにStorage JAWSのステッカーを配布しました！
ステッカーは全2種類。コミュニティブースにステッカーを置き、自由にとるスタイルとしていましたが、皆様入手はできましたでしょうか？

## Storage-JAWS #5
https://storage-jaws.connpass.com/event/328111/

こちらも新企画！Jr.ChampionsオンリーのフレッシュなLT会を開催しました！
実は運営にも3名ほど現・元Jr.Championsが混ざっており、それもあって昨年度からJr.Champions登壇枠を毎回設けておりました。
それが今回は発展して完全にJr.Championsオンリー！

どのコミュニティでも実施してこなかった企画なので、どうなるのかドキドキではありましたが、さすがは社を代表するJr.Champions！技術的にも魅力的であり、そしてなによりフレッシュな勢いがとても刺激的でした

そのような姿勢は常日頃から見習わなければなと自戒...

## Storage-JAWS #6
https://storage-jaws.connpass.com/event/336323/

12月20日にStorage JAWS re:InventのreCap会を実施予定です！
本年度はMatt Garmanのkeynoteでも1番最初のトピックとしてComputing & Storageを挙げていたほどに、注目度の高いアップデートが多くありました！

ご都合の合う方はぜひご参加ください！

# 今後の目標
まだまだ煮詰まってませんが、今後はStorage-JAWSの規模をより一層活動を活発化してくことを目指しています！
- LTにとどまらない学習環境やコンテンツの提供
- 他JAWSとのコラボレーション企画
- 若手からベテランまで居心地の良いコミュニティづくり  etc.

より一層皆が楽しめるコンテンツを提供できるように頑張っていきたいと思います！!
vitestでasync関数で投げる例外をテストする

# たぶん正解

Promiseに対する評価ということで、rejectsを経由して評価する。

```js
await expect(longLongTimeAsyncFunction(AbortSingal.timeout(100)))
  .rejects.toMatchObject({name: 'TimeoutError'})
```
もしくは、messageの方で引っ掛けてこんな感じかな。

```js
await expect(longLongTimeAsyncFunction(AbortSingal.timeout(100)))
  .rejects.toThrowError(/timeout/);
```

# 安直な方法

何も考えずに、こんな風にassert.fail()と組み合わせた方がわかりやすいと思ってしまう。

＃assert.fail()忘れてしまったりするのですが

```js
try {
  await longLongTimeAsyncFunction(AbortSingal.timeout(100)));
  assert.fail();
} catch(e) {
  expect(e.name).toBe('TimeoutError');
}
```

```js
await longLongTimeAsyncFunction(AbortSingal.timeout(100)))
  .then(() => assert.fail())
  .catch((e) => expect(e.name).toBe('TimeoutError'))
```
X, Mastodon, Bluesky に同一内容を投稿する

## 3つの SNS でも一括投稿できる。そう、 Python ならね
現在は行っていないが、かつて X, Mastodon, Bluesky の各 SNS に同一内容をポストするということをやっていた。 Python には各 SNS 投稿用のモジュールが用意されており、それぞれを呼び出すことでスクリプト一つで全部の SNS に投稿する環境が構築できる。


## X
まず API を取得。

https://qiita.com/neru-dev/items/857cc27fd69411496388

tweepy を使うと簡単に投稿できます。

https://note.com/shirotabistudy/n/n0ca51e140f97

https://zenn.dev/currypurin/scraps/e9c50b683a168c

画像の投稿には一工夫必要かも（試してみていない）。

https://zenn.dev/stucci/articles/195815871110c2

## Mastodon
まず、マストドン側の設定から、開発メニュー→新規アプリと開いて、クライアントキー・クライアントシークレット・アクセストークンの3つを取得。
Python 側では、 Mastodon.py をインストールし、以下のサイトの説明のように各項目を設定して実行。

https://zenn.dev/sion_pn/articles/1f672c6d2df165

画像投稿は `media_post` で画像ファイルを指定した後、 `status_post` で投稿する。

https://blog.ch3cooh.jp/entry/2023/04/13/193000

## Bluesky
アプリパスワードを作った後、 atproto を用いて投稿する。

https://www.zenryoku-kun.com/new-post/bluesky-api

https://zenn.dev/sion_pn/articles/afe598bdbfebf9

画像投稿のやり方はいくつかあるが、以下の記事の3に書かれている `send_image` のやり方が一番容易か。

https://skworkspace.net/archives/652/

## あとは連続で実行するだけ
エラー処理を考える必要がなければ、何かの変数（message あたり）に投稿したい内容を入れ、上記3つを続けて実行していくだけでよい。こんな雑なやり方でも投稿はできてしまう。 Python 様々である。
（どれか1つでも投稿に失敗するとその後が実行されない可能性があるので、最後まで確実に実行させるにはエラー処理が必要。）
```python: 3SNS 一括投稿
message = '((投稿したい内容))'

## ツイート
import tweepy

# API情報を記入
BEARER_TOKEN        = '((Bearer Token))'
API_KEY             = '((API Key))'
API_SECRET          = '((API Secret))'
ACCESS_TOKEN        = '((Access Token))'
ACCESS_TOKEN_SECRET = '((Access Token Secret))'

# クライアント関数を作成
def ClientInfo():
    client = tweepy.Client(bearer_token    = BEARER_TOKEN,
                           consumer_key    = API_KEY,
                           consumer_secret = API_SECRET,
                           access_token    = ACCESS_TOKEN,
                           access_token_secret = ACCESS_TOKEN_SECRET,
                          )
    return client

# ツイート関数
def CreateTweet(message):
    tweet = ClientInfo().create_tweet(text=message)
    return tweet

CreateTweet(message)


## トゥート
from mastodon import Mastodon

# API情報
api = Mastodon(
    api_base_url  = '((使用するインスタンスのURL))',
    client_id     = '((クライアントキー))',
    client_secret = '((クライアントシークレット))',
    access_token  = '((アクセストークン))'
)
api.toot(message)


## Bluesky
from atproto import Client
api = Client()
api.login('((ユーザー名))', '((アプリパスワード))')
api.send_post(message)
```

```python: Mastodon, Bluesky 画像投稿
filename_img = '((画像ファイル名))'
title = '((投稿本文))'

## トゥート
from mastodon import Mastodon
api = Mastodon(
    api_base_url  = '((使用するインスタンスのURL))',
    client_id     = '((クライアントキー))',
    client_secret = '((クライアントシークレット))',
    access_token  = '((アクセストークン))'
)
media = api.media_post(filename_img)
api.status_post(status=title, media_ids=media)

## Bluesky
from atproto import Client
api = Client()
api.login('((ユーザー名))', '((アプリパスワード))')
with open(filename_img, 'rb') as f:
    img_data = f.read()
api.send_image(text=title, image=img_data, image_alt='')
```

## 余談
非課金ユーザーにも X の生成 AI、 Grok が開放されたようなので、試しに「pythonでフォロワー数を取得する方法を教えて下さい」と尋ねてみた。

https://x.com/i/grok/share/19zuW6Sg7pK66c7hZh0xgJ0iT

API キーの取得方法がざっくりだが、上記の Tweepy を使ったソースコードを返してきて、問題なさそうな感じ。なかなかやりおる。
Continuous Deliveryに定義された権限

# はじめに
こちらの記事は下記Advent Calendar 2024で紹介しているIBM Cloud権限設定における `Continuous Delivery` になります。

https://qiita.com/katahiro/items/274bec5ad4a9e2604dcf

# 共通権限は割愛
こちらの記事に記載しているように、プラットフォーム・アクセス、サービス・アクセスの権限でそれぞれどのようなものが共通して設定されているかを紹介させて頂きました。

https://qiita.com/katahiro/items/b5e367666fe984944d4b

こちらの記事では共通部分で出現する権限を除いた各サービス毎の権限設定を紹介します。

# Continuous Deliveryで指定可能な権限のアクセス範囲
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/58196146-d87b-63be-f039-866524844712.png)
- リソース・グループ
- serviceInstance
- region

## リソース・グループの指定
これは指定されたリソース・グループに所属するContinuous Deliveryのみに対してアクセス権限を適用します。異なるリソース・グループのContinuous Deliveryに対しては別途権限を設定する必要があります。

## serviceInstanceの指定
これは既に作成されたContinuous Deliveryのインスタンスを指定することで、特定環境のみの権限を与えることが可能になります。

## regionの指定
これは jp-tok といったContinuous Deliveryの存在するRegionを指定することで、その指定されたRegionのみの権限を与えることが可能になります。

# Continuous Deliveryに設定された権限
Continuous Deliveryについては、サービス・アクセス、プラットフォーム・アクセスの権限をまとめて確認するほうがわかりやすい部分があります。
※Admin : Administrator, KM : Key Manager, SCR : Service Configuration Reader
|権限|Writer|Manager|Viewer|Operator|Editor|Admin|KM|SCR|
|:---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|continuous-delivery.consolidated-auth-users.list||〇|〇|〇|〇|〇|||
|continuous-delivery.dashboard.view||||〇|〇|〇|||
|continuous-delivery.instance.add-auth-users|〇|〇||||〇|||
|continuous-delivery.instance.config-auth-users||〇||||〇|||
|continuous-delivery.instance.remove-auth-users|〇|〇||||〇|||
|continuous-delivery.settings.read||〇|〇|〇|〇|〇|||
|continuous-delivery.settings.update||〇||||〇|||

サービス・アクセスとプラットフォーム・アクセスの権限で利用している権限が重複しています。

## サービス・アクセスの権限について
まず、Readerの役割が無く、Writer、Managerのみとなっています。
また、WriterはContinuous Deliveryのインスタンスに対してアクセス可能なユーザーの追加、削除のみが可能でそれ以外に参照したりも出来ない権限となっています。

Continuous Deliveryを利用して機能をいろいろ利用する場合、Manager権限を設定するのが良さそうです。

## プラットフォーム・アクセスの権限について
参照のみといった権限を与える場合はOperator、Editorといった権限を付与すれば良さそうです。
完全に何でも可能な権限を与える場合はAdministratorになりますね。

# さいごに
Continuous Deliveryはサービス・アクセス、プラットフォーム・アクセスのそれぞれで対象とする権限が同じものに対して権限の有無を決定しているので、全てひっくるめてどの役割に設定するか、を検討する形になりそうです。この辺りはちょっと特殊です。

ただ、Continuous Deliveryの利用仮定でパイプラインやら使って新規サービスインスタンスを立ち上げる権限が必要になりそうなので、Administrator権限を設定するのが無難かもしれません。
VisialStudioCodeで連番入力を行う ~拡張機能[Insert Sequence]とマルチカーソル機能を利用~

# Abstract
　正常な動作ができていないコードがどれかを判断したい時に、連番を振ったログを挿入したい時がある。連番を振るのは、ある程度であれば手入力でも問題ないが、十数行となると手入力するのは手間だ。
　手動入力の手間を改善する為に、自動的に入力する方法を調べた。そして、マルチカーソル機能と拡張機能[Insert Sequence]を利用すると、自動入力が可能である事が分かった。
　この記事は、拡張機能[Insert Sequence]とマルチカーソル機能を利用した、共通文字列に連番を入力する方法の手順書である。

# 使用する拡張機能
- Insert Sequence
  - 拡張機能Id
    - kuone.sequence-number
  - URL
    - https://marketplace.visualstudio.com/items?itemName=kuone.sequence-number

# 連番入力の方法
## マルチカーソルの設定
1. 連番を挿入したい文字列の共通部分を選択する
2. ``[Ctrl]``+``[Shift]``+``[L]``を使用する
3. 文字列が出現する箇所全てにカーソルが置かれる
4. 連番を挿入したい場所にカーソルを移動する
## gif
![通し番号_前半.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119123/61b55248-a107-aa14-fee8-f8206a38775d.gif)

## [Insert Sequence]による連番の入力
1. ``F1``キーを押して、コマンドパレットを表示する
2. ``Insert sequence (number,char,months,etc...)``というコマンドを呼び出す
3. 表示されているコマンドパレットに連番の開始番号を入力する
## gif
![通し番号_後半.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119123/0472a3cc-b054-b9b6-6088-3724eb7e7f61.gif)

# 通し動作
## gif
![abcdsfg_edit.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119123/9c293b2a-7d79-ac8f-c347-e8a36ee13739.gif)

# 参考記事
- Ogata. "Visual Studio Code - マルチカーソルで連番を簡単に入力できる拡張機能". unType. 2023-12-08. https://untype.jp/blog/202312081719 , (参照 2024-12-09) 
- hossie(ほっしー). "Visual Studio Code マルチカーソルが便利". Qiita. 2021-04-16日. https://qiita.com/hossie/items/61f9be405f566d9ed0d1 , (参照 2024-12-09)
EC2インスタンスファミリー比較表

# EC2インスタンスファミリー比較表
| No | インスタンスファミリー | 用途                           | CPUアーキテクチャ         | メモリ(GiB/CPU) | ストレージ       | ネットワーク性能          | 主な特徴                              |
|----|-----------------------|--------------------------------|-------------------------|-----------------|------------------|------------------------|---------------------------------------|
| 1  | C5                   | コンピューティング最適化       | Intel Xeon Scalable    | 2:1            | EBS専用          | 最大25Gbps             | 高いコンピューティング性能が必要なアプリケーション向け |
| 2  | M5                   | 汎用                          | Intel Xeon Scalable    | 4:1            | EBS専用          | 最大25Gbps             | バランスの良い性能を提供する汎用的な用途向け         |
| 3  | R5                   | メモリ最適化                  | Intel Xeon Scalable    | 8:1            | EBS専用          | 最大25Gbps             | メモリ集約型ワークロードに最適                  |
| 4  | T4g                  | バースト可能な汎用インスタンス | Arm-based AWS Graviton2| 可変 (バースト) | EBS専用          | 最大5Gbps              | バースト可能な低コストインスタンス                |
| 5  | G5                   | GPU最適化                     | NVIDIA A10G            | 1:1～32:1       | NVMe/EBS         | 最大100Gbps            | GPUワークロード（機械学習、レンダリング）向け       |

## 詳細
### C5（コンピューティング最適化）
- CPUに依存するアプリケーションや、大量の計算処理を必要とするシナリオ（例: 高性能コンピューティング、Webサーバー）に適しています。
- 1vCPUあたりのメモリ量が少なめで、コスト効率良く計算タスクを処理可能。

### M5（汎用）
- 計算、メモリのバランスが取れた設計。
- 多様なアプリケーションに適応可能で、データベースやアプリケーションサーバーに最適。

### R5（メモリ最適化）
- メモリ集約型のワークロード（例: インメモリデータベース、リアルタイム分析）に適した設計。
- 高いメモリ容量を提供。

### T4g（バースト可能）
- ArmベースのGraviton2プロセッサを使用しており、コスト効率が良い。
- 時間的に負荷が少ないシナリオ（例: Webサイトホスティング、開発環境）向け。

### G5（GPU最適化）
- NVIDIA GPUを活用し、機械学習や3Dレンダリングなどの重いグラフィックス処理が必要な用途に最適。
(調査中)Linux。特定のポートのプロセスを取得して終了

```bash
#!/bin/bash

PORT=$1

if [ -z "$PORT" ]; then
    echo "Usage: $0 <port>"
    exit 1
fi

# ポートを使用しているPIDを取得
PID=$(sudo lsof -t -i :$PORT)

if [ -z "$PID" ]; then
    echo "No process is using port $PORT."
    exit 0
fi

# プロセスをkill
echo "Killing process $PID using port $PORT..."
sudo kill -9 $PID

if [ $? -eq 0 ]; then
    echo "Process $PID killed successfully."
else
    echo "Failed to kill process $PID."
fi
```

使用方法
スクリプトを kill_by_port.sh として保存。
実行権限を付与：
```bash
chmod +x kill_by_port.sh
```
実行：
```bash
./kill_by_port.sh <ポート番号>
```
果てしなきAWSコスト削減

この記事は[Skillnote Advent Calendar 2024](https://qiita.com/advent-calendar/2024/skillnote)の9日目の記事です。

# はじめに

2024年3月に入社し、SRE業務を担当している @shi-kishi と申します。
AWSのコストを観察していなければ、マリモの如く気付かない間に大きくなっていることがあります:zap:
今回は入社から10ヶ月間で取り組んだAWSコスト削減を振り返りたいと思います！

:::note info
以下に取り組んだ内容の概要を記載しました。
:::
:::note info
 SRE（サイト信頼性エンジニアリング）とは
>SRE は、信頼性の高い本番環境システムを実行するための職務、マインドセット、エンジニアリング手法のセットです

[Googleドキュメントより引用](https://cloud.google.com/sre?hl=ja)
:::

# SREとして取り組んだこと
SREメンバーは上長と私を含めて2名。
他の業務も並行して行っているため、まずは大幅なコスト削減が見込める部分から着手しました。

1.[コストとリソースの把握](#1コストとリソースの把握)
2.[他社のコスト削減事例を調べる](#2他社のコスト削減事例を調べる)
3.[AWS請求代行サービスの利用](#3aws請求代行サービスの利用)
4.[不要なリソースを削除する](#4不要なリソースを削除する)
5.[スケジュールに応じてリソースを起動・停止する](#5スケジュールに応じてリソースを起動停止する)
6.[RI・SPを利用する](#6rispを利用する)

# 1.コストとリソースの把握
まず、AWSコストの現状確認を行いました。
弊社は毎月リリースを行っており、プロダクトは成長過程にあります。
そのため、各リソースが現在も利用されているか、今後も利用する予定があるかなど、プロダクトの成長に合わせてそのコストが適正か慎重に判断する必要がありました。
併せて、AWSの契約内容についても確認を行いました。

* コスト確認とリソースの把握に利用したツール

| 利用したツール | 目的 |
|:-|:-|
| AWS Cost Explorer    | AWSコストの可視化 |
| AWS Trusted Advisor | コスト最適化の確認 |
| Amazon EventBridge | スケジュールに応じたリソースの開始・停止 |
| IaC ジェネレーター    |リソースの検出 |
| Tag Editor          |リソースの把握 |

# 2.他社のコスト削減事例を調べる
前職がCIerであったため、ある程度はコストに関する知識がありましたが、他社がどのようなコスト削減を行っているのか情報収集を行いました。

###### 参考

<iframe width="560" height="315" src="https://www.youtube.com/embed/WOsD-Rk3SVg?si=u9q3hOGy1X_B3-IZ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


# 3.AWS請求代行サービスの利用
弊社はAWS以外にもデータ分析基盤を利用しており、AWSとデータ分析基盤の割引が受けられるリセラーと契約しています。

### :bulb: 請求代行サービスで得られるメリット
- 契約プランによる割引が受けられる  
- ドル建てではなく、円建てでの支払いが可能  
- 無償のAWS技術サポートを受けられる  
- データ分析基盤の割引やサポートが受けられる  

###### 参考：[AWS サポート FAQ](https://aws.amazon.com/jp/premiumsupport/faqs/?nc=sn&loc=6)

# 4.不要なリソースを削除する
ソースを洗い出した後、大幅なコスト削減が期待できる不要なリソースを計画的に削除しました。

# 5.スケジュールに応じてリソースを起動・停止する
開発環境のリソースに関しては、土日祝や夜間帯は停止する設定になっているか確認し、必要に応じてAmazon EventBridgeの設定を行いました。

# 6.RI・SPを利用する
リザーブドインスタンス（RI）とセービングプラン（SP）の割引対象となるAWSリソースの一覧を作成し、協議の上購入しました。

# さいごに
入社から10ヶ月で行ったコスト削減は以上ですが、現在も月次でAWSコストが急激に増加していないか確認しています。
プロダクトが成長していく中で、どのようにAWSコストと向き合っていくか、今後も模索していきたいと思います！
GitHubのpublicリポジトリで.envのみ公開しない方法[python][python-dotenv]

## 前書き
自分のソースコードをGitHubでpublicリポジトリとして公開しようとした際、環境変数などが書かれたままだとよろしくないと思い、そういった情報のみ公開しないように色々調べた結果を記録します。

すでにQiita上で公開されている情報をひとまとめにしました。

## 参考サイト

https://qiita.com/shown_it/items/2b85434e4e2658c484f4

https://qiita.com/wooooo/items/7b57eaf32c22195df843


## この記事でわかること
#### Gitで管理しているリポジトリ内の特定のファイルのみを非公開にする方法
・.envファイルの作成
・config.pyでの.envの内容取得
・.gitignoreの作成
・gitにコミット・プッシュ

## 使用するツール
python-dotenvを使用します。ターミナルを開き、以下のコマンドでインストールします。

~~~ 
pip install python-dotenv
~~~

## 公開したくない情報をまとめた.envファイルを作成
私の場合、.gitフォルダのあるディレクトリ上に.envファイルを新規作成しました。
やり方は以下。
[新規作成]⇒[テキストドキュメント]⇒ファイル名を「.env」に変更

.envファイルに公開したくない情報を記入します。以下はサンプルです。

~~~ .env
DIRECTORY='環境変数などの情報'
API_KEY='公開したくないAPIキーなどの情報'
~~~

私の作成したソースコードでは、もともとconfig.pyというファイルで環境変数やAPIキーを指定していたので、config.pyで.envファイルから取得するように変更しました。以下はサンプルです。

~~~ config.py
from dotenv import load_dotenv
load_dotenv()

import os

directory = os.getenv('DIRECTORY') 
api_key = os.getenv('API_KEY')

#以下の２行のコメントアウトを外し、一度config.pyを実行してみてください。
#.envファイルで指定した内容が表示されていればOKです。
#print(directory)
#print(api_key)
~~~

## Gitにコミット
.gitignoreファイルを作成します。やり方は.envファイルのときと同じです。
.gitignoreファイルに以下を記入します。
※すでに.gitignoreファイルを作成している場合は、追記でOK

~~~ .gitignore
/.env
~~~

調べたところ、「/.env」ではなく「.env」だけでもいけそうなのですが、私は"/"ありにしました！

あとは、コミット＆プッシュするだけです。
~~~
git add .
git commit -m ".gitignore追加"
git push origin master
~~~

.gitignoreで.envをgitの管理から除外したおかげで、今後「git add .」をしても.envファイルはaddされません！

GitHubなどでソースコードを見られるなら、本当にプッシュされていないか確認することをおすすめします。

以上です。初めてこういう記事を書いたので、わかりづらい所があったらすみません。
Container Registryに定義された権限

# はじめに
こちらの記事は下記Advent Calendar 2024で紹介しているIBM Cloud権限設定における `Container Registry` になります。

https://qiita.com/katahiro/items/274bec5ad4a9e2604dcf

# 共通権限は割愛
こちらの記事に記載しているように、プラットフォーム・アクセス、サービス・アクセスの権限でそれぞれどのようなものが共通して設定されているかを紹介させて頂きました。

https://qiita.com/katahiro/items/b5e367666fe984944d4b

こちらの記事では共通部分で出現する権限を除いた各サービス毎の権限設定を紹介します。

# Container Registryで指定可能な権限のアクセス範囲
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/896cf2e0-5483-6bb1-baf4-55d0061d1bc2.png)
- リソース・グループ
- Resource Type
- Resource Name
- Region
- Geography

## リソース・グループの指定
これは指定されたリソース・グループに所属するContainer Registryのみに対してアクセス権限を適用します。異なるリソース・グループのContainer Registryに対しては別途権限を設定する必要があります。

## Resource Type, Resource Nameの指定
これはセットになっており、Resource Typeに `namespace` を指定して、Resource Nameに許可したいNamespace名を指定することで、特定のNamespaceへのアクセス権限だけ許可することが可能です。

## Regionの指定
これは `jp-tok` といったContainer Registryの存在するRegionを指定することで、その指定されたRegionのみの権限を与えることが可能になります。

## Geographyの指定
これは、Container Registryの作成ロケーションを特定のMZRを選択せずに `グローバル` にした場合、そのContainer Registryへのアクセスを権限範囲としたい場合に `global` を指定する必要があります。

# Container Registryに設定された権限
## プラットフォーム・アクセスの権限
※Admin : Administrator, KM : Key Manager, SCR : Service Configuration Reader
|権限|Viewer|Operator|Editor|Admin|KM|SCR|
|:---|:---:|:---:|:---:|:---:|:---:|:---:|
|container-registry.config.read||||||〇|
|container-registry.image.list||||||〇|
|container-registry.image.vulnerabilities||||||〇|

プラットフォーム・アクセスの権限指定では基本的にサービス固有の権限は与えられておらず、Service Configuration Readerの権限がある場合のみイメージ等のリスト表示等が可能になります。
利用可能な機能を制限できるのはサービス・アクセス側の役割になります。

## サービス・アクセスの権限
|権限|Reader|Writer|Manager|
|:---|:---:|:---:|:---:|
|container-registry.auth.get|〇|〇|〇|
|container-registry.auth.set|||〇|
|container-registry.exemption.list|〇||〇|
|container-registry.exemption.manager|||〇|
|container-registry.image.pull|〇|〇|〇|
|container-registry.image.inspect|〇||〇|
|container-registry.image.list|〇||〇|
|container-registry.image.vulnerabilities|〇||〇|
|container-registry.image.push||〇|〇|
|container-registry.image.delete||〇|〇|
|container-registry.namespace.list|〇||〇|
|container-registry.namespace.create|||〇|
|container-registry.namespace.delete|||〇|
|container-registry.plan.get|||〇|
|container-registry.plan.set|||〇|
|container-registry.quota.get|〇|〇|〇|
|container-registry.quota.set|||〇|
|container-registry.retention.analyze|〇||〇|
|container-registry.retention.get|〇||〇|
|container-registry.retention.list|〇||〇|
|container-registry.retention.set||〇|〇|
|container-registry.settings.get|〇|〇|〇|
|container-registry.settings.set|||〇|

Container Registryのサービス・アクセスの権限で注意が必要なのは `Writer` の権限は `Reader`の権限を内包していない、という点です。
`Writer`の権限はImageのPull権限はありますが、List表示する権限はないので、そもそもどんなイメージがあるか確認することが出来ません。従ってManagerといった管理者権限を与えずにImageの読書を限定で権限を与える場合は `Reader`と`Writer`の権限の両方を付与する必要があります。

# さいごに
Container Registryは権限は決して多くないですが、これまでに紹介した権限と比べると、サービス・アクセスの役割でWriterがReaderを包含していない、というのは設定における落とし穴に思います。必要最低限の権限設定を目指す場合はぜひ気を付けて頂きたいポイントになります。
【TypeScript】type-challenges 初級編 898・Includes 解説

## お題
タプル型`T`に`U`が含まれているか判定する型`Includes`を実装します。JavaScriptの`Array.include`関数を型システムに実装します。

## やりたいこと
```typescript
type test1 = Includes<["Kars", "Esidisi", "Wamuu"], "Kars">; // true
type test2 = Includes<["Kars", "Esidisi", "Wamuu"], "Dio">; // fasle
type test3 = Includes<[{}], { a: "A" }>; // false
type test4 = Includes<[boolean, 2, 3, 5, 7], false>; //false
```

## 解答
```typescript
type Includes<T extends readonly any[], U> = {
  [P in T[number]: true;
}[U] extends true
  ? true
  : false;
```

## 解説
### 処理の流れ
- `{
  [P in T[number]: true;
}`
`T[number]`で返されたユニオン型を使って、オブジェクトを作成する。
```example.ts
// Tが["Kars", "Esidisi", "Wamuu"]場合
// ["Kars", "Esidisi", "Wamuu"][number] =>  "Kars" | "Esidisi" | "Wamuu"
{
  "kars": true,
  "Esidisi": true,
  "Wamuu": true,
}
```
- `{ [P in T[number]: true; }[U]`
インデックスアクセス型の利用

- `{ [P in T[number]: true; }[U] extend true ? true : false`
インデックスアクセス型でプロパティの型が`true`かどうかで条件分岐を行う。
```typescript
// Includes<["Kars", "Esidisi", "Wamuu"], "Kars">; の場合

{"kars": true, "Esidisi": true, "Wamuu": true,}["kars"] //  => true
```


### なぜ下記のコードでは期待した結果が得られないのか？
```typescript
type TestInclude<T extends readonly any[], U> = U extends T[number]
  ? true
  : false;
```
こちらのコードでは、`T`にユニオン型やオブジェクトが含まれる場合、期待した結果を得られません。

```typescript
type test5 = Includes<[{}], { a: "A" }>; // => falseのはずがtrue
type test6 = Includes<[true, 2, 3, 5, 6, 7], boolean>; // falseのはずがtrue
type test7 = Includes<[1], 1 | 2>; // falseのはずがtrue
```
**単純な`extends`チェックの場合、ユニオン型では部分一致が、オブジェクトやboolean型ではサブタイプが許容される。そのため、期待した結果が得られない。**

### [number]とは...
https://qiita.com/yuto99999/items/44161921ff23a149cba5#number%E3%81%A8%E3%81%AF

### インデックスアクセス型とは...
https://qiita.com/yuto99999/items/dcc234f3e25a5393a2ab#%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%9E%8B%E3%81%A8%E3%81%AF


## 参考記事
https://github.com/type-challenges/type-challenges/issues/1568

## 今回の問題
https://github.com/type-challenges/type-challenges/blob/main/questions/00898-easy-includes/README.ja.md
【ML初心者アドベントカレンダー】生成AIを開発するためのAWSサービスについて


# この記事の目的

生成AIを開発するために使用されるAWSサービスについて整理する

# 生成AI開発に用いられるAWSサービスについて

## Amazon SageMaker Studio

統合環境でモデルを構築し、トレーニングやデプロイを簡単に行えるサービス。自分でモデルを開発したい人向け。

公式ページ
https://aws.amazon.com/jp/sagemaker/studio/

## Amazon SageMaker Clarify

モデル内に潜むバイアスを予測、検出してくれるサービス。
SageMaker Studioと統合されている。

公式ページ
https://aws.amazon.com/jp/sagemaker/clarify/

## Amazon SageMaker Model Monitor

本番環境で動いているモデルのモニタリングができる。
メトリクスは以下の通り。

>データ品質 - データ品質のドリフトを監視します。
モデル品質 - モデル品質メトリクス (精度など) のドリフトをモニタリングします。
本番環境のモデルのバイアスドリフト - モデルの予測のバイアスをモニタリングします。
本番環境のモデルの特徴量属性ドリフト - 特徴属性のドリフトを監視します。

公式ページ
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/model-monitor.html



## Amazon SageMaker JumpStart

事前にトレーニングされたモデルを簡単に利用、カスタマイズできるサービス。専門知識がなくても簡単に利用できる。
エンドポイントを作成して利用する。もちろん金はかかる。

公式ページ
https://aws.amazon.com/jp/sagemaker/jumpstart/


## Amazon Bedrock

複数の生成AIモデル（画像作成、文章作成など）を簡単に使用できるサービス。AWSコンソール上から簡単に試せる。もちろん金はかかる。

公式ページ
https://aws.amazon.com/jp/bedrock/


## Amazon PartyRock

> PartyRock は生成系 AI の様々なユースケースをアプリケーションとして実現し、共有を可能にする AWS の新しいサービスです。テキストによる指示と画面操作のみで生成系 AI を組み込んだアプリケーションを作り、共有することができます。

公式ページ
https://aws.amazon.com/jp/blogs/news/create-generative-ai-app-with-partyrock-amazon-bedrock/

楽しく愉快に生成AIのアプリを作って共有できるサービス、ということらしい。


## Amazon Bedrock Playground

Amazon Bedrockコンソール上にある入力フォーム。即座にBedrockの生成AIを試すことができる。
生成AIモデルをテストしたりちょっと使ってみたかったり、プロンプトを調整するのに便利。


公式ページ
https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/playgrounds.html


## Amazon Q

生成AIを搭載したアシスタントのこと。

公式ページ
https://aws.amazon.com/jp/q/

以下の二種類がある。

### Amazon Q Business
主に企業やビジネスユーザー向け。
業務上の問題を解決してくれたりする。

### Amazon Q Developer
開発者向け。
コードの提案や書き換え、テストなどをやってくれる。

# AWSを使って構築をするメリットは？

事前にトレーニングしたモデルを使用できるため、参入障壁が低い。
また、自力で開発するのに比べてコストも低く抑えられる。開発から市場へ投入するまでのスピード感も魅力。ほとんどの場合、インフラを自分で構築しなくてよい。（フルマネージドサービスがたくさん）
業務でもGIFアニメを使ってみよう！

# はじめに

https://qiita.com/advent-calendar/2024/first-time

本記事は「はじめてのアドベントカレンダー」向けに投稿します。
前半の枠が埋まっていてアドベントカレンダーへの初投稿では無くなってしまいましたが、このイベントには今年初めて参加しています。

「はじめての...」ということで、軽めにGIFアニメについての記事にしてみました。

# なぜGIFアニメ？

普段業務でチャットを使っていると、質問をしたり、成果物の共有をする際に画面キャプチャを貼ることが多いと思います。
その際にGIFアニメを使うと、短い動きを視覚的に分かりやすく伝えることができます。

特にフロントエンド開発の画面の動きは静止画では分かりづらいケースも少なくありません。
また、マニュアルやドキュメント作成でも必要に応じてGIFアニメを取り入れることで格段に分かりやすくなります。

もちろん動画でも構いませんが、ファイルサイズが大きくなりすぎるため、GIFアニメくらいがチャットでの共有やドキュメントへの埋め込みに適しています。

# ツールの紹介

では、簡単にGIFアニメを作る方法として私が利用している *LICEcap* というツールを紹介します。

## LICEcapとは？

LICEcapは、デスクトップ上の動きをそのままGIFアニメとして保存できるシンプルなツールです。  

特徴としては以下のようなものがあります。
- 直接GIF形式で保存可能で、保存してからGIFに変換する手間がない
- Windows版/Mac版がある
- シンプルで余計な機能がない (編集をしたいなら他のツールの方が良い)

欠点としては、執筆時点で最終更新が `Jun 8 2022` になっており、開発が止まっている可能性があることです。 (元々、更新頻度がかなり低いので、最新OSで動かなくなるようなら更新されるかも？)


## LICEcapのダウンロードとインストール

1. [公式サイト](https://www.cockos.com/licecap/)にアクセス
2. 「Download」から対象OSのインストーラーをダウンロード
![test2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3294382/e5599a9c-679c-adaf-f2bb-3512553244c9.gif)
3. ダウンロードしたファイルを実行し、手順に従いインストール

## Gifアニメの作成手順（Windowsの場合）

1. LICEcapを起動
   起動すると録画用ウィンドウが表示されます。このウィンドウが録画範囲となります

2. 録画範囲の調整
   録画したい範囲に合わせて、ウィンドウのサイズを調整します

3. 保存先とファイル名の設定
   **「Record...」** ボタンを押して、保存先とファイル名を指定します

4. 録画開始
   **「Save」** ボタンをクリックすると録画が始まります。右下に録画時間が表示されます

5. 録画終了
   必要な動きの録画が終わったら、**「Stop」** ボタンをクリックします。指定した保存先にGifファイルが作成されます

また、録画開始後に「[Pause]」で一時停止をすることができます。
基本的な使い方はこれだけです。

https://www.cockos.com/licecap/how_to_licecap.gif

# 終わりに

かなりシンプルになりましたが、ご拝読ありがとうございました。
使うツールはなんでも構いませんので、是非、皆様の業務でもGIFアニメを積極的に使っていきましょう！