OmniAICreator/Qiita-1.07M huggingface dataset:
アプリを使わずにSlackでいい感じにリマインドをセットするコマンドとサンプル

多くの職場の連絡でSlackがよく使われると思います。

個人的にはSlack用の個人アプリを好きに追加できたり、Jira/GitHubからの通知を受け取ったり、canvas機能があったりしてお気に入りアプリの一つです。

そんなSlackで便利なリマインドを紹介して皆さんにより好きになってもらいたいと思いこの記事を作成しました。


## リマインダーとは

公式の説明は[こちら](https://slack.com/intl/ja-jp/help/articles/208423427-%E3%83%AA%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%80%E3%83%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)

Slackのリマインダーは特定のタスクやイベントを忘れないようにするための超便利な機能です。

リマインダーは `/remind` コマンドを使用して設定できます。これを使いこなすことでサクッと設定できます。

以下にいくつかの例を見てみましょう。Slackアプリで表示されるサンプルを示します。

```
/remind me on June 1st to wish Linda happy birthday

-> 6/1に wish Linda happy birthdayメッセージが現れる

/remind #team-alpha to "Update the project status today" Monday at 9am

-> 月曜日AM9時に #team-alphaチャンネルで Update the project status todayメッセージが現れる
```

基本構文は `/remind {対象} {内容} {いつ}` となっています

これらのコマンドは、リマインダーを設定するための基本的な例です。必要に応じてカスタマイズして使用できます。

## 内容にメンションを含める方法

リマインド内容にメンションを含めるにはダブルクオーテーションで囲みましょう。

メンションもハイパーリンクも自在に入れることができます。

## 定期的なリマインダーにしてみる

いつの部分にevery ~ を入れることで定期的なリマインダーにできます。

例えば

```
/remind me to "毎月のリマインダー" on every 10th
```

とすることで毎月10日にリマインダーを出してくれます。

## 曜日指定

曜日固定はevery {曜日}でできます

```
/remind me to "毎週13時のリマインダー" at 13:00 every Thursday.
```


## 隔週のリマインダーだってお手の物

2週間に一度の予定もあるでしょう。その場合は`every 2 weeks`とすると可能です。

```
/remind me to "毎週13時のリマインダー" at 13:00 every 2 weeks Monday.
```

また次に出してほしい日付を指定する場合は最後に`next occurrence is {日付}`を入れると定期リマインダーのスタート日を決められる。

公開日である12/12からリマインドする場合は`next occurrence is Dec 12th`とする。


便利なSlack Lifeをお楽しみください。
jQueryをやめようと試みた

# はじめに

jQueryは簡単にDOMの操作が可能Javascriptライブラリです。

今現在も現役で使われているWebサイト・アプリケーションは沢山ある中、昨今VueやReactといったフレームワークの登場やQueryUIやjQuery Mobileといったブライ ンが終了を迎えていることを踏まえ、ちらほらと終わったのでは?という声が挙がってきています。 実際には現在もバージョンアップを続けているのは事実であるため、終わったという表現は早計であろうかと思います。

とはいえ、VueやReactといったフレームワークでの開発を主流としたい!という開発者達の意向がビシビシと感じられるのも事実であり、これを無視するのは取り残さ れた技術者になってしまうリスクがあるため、脱jQueryを検討してみました。

# jQueryへの不満

実は・・・個人的にはあまりないです。

自信が扱うアプリケーションの規模感によるものもありますし、これまで指で覚えてきた$ (セレクタ)の馴染みもあります。 他の要素との整合性についてはすべて手でやる必要性がありますので、バグの元となります。

一方でなんでもできてしまう反面、 こういった問題は双方向バインディングを用いることで解消しますし、双方向バインディングを用いることができるフレームワークを利用すればこういったバグは発生 しなくなります。

一般的には重い・・・といった意見でしょうか。 大衆向けのWebサイトのエンジニアにとってはこれは由々しき問題でしょうし、立場によって不満を持つ部分は異なりそうです。

# 選択としてはVueを選択

React と Vueのどちらか迷いましたが、Vue を選択しました。

特に深い思いがあるわけではないのですが小規模(小規模ってなんだろうってところからですが)開発向けである、公式サポートが充実している、独学でも身に着けや すい。といった記事を信じてみることにしました。

# jQueryを使わないことへの不安

これまで、取得したデータをここの要素に挿入!など好き放題できたのが実現できるのか?という点です。 特にSSRであれば描画前に「ここの要素」というのが特定できるの?などといった点について心配しておりました。

また、これまでセレクタを用いてまとめてデータ設定・取得などもできましたが同様のことが実現できるのかについては不安でした。 (よく使うのは列にnameをつけるなどした現在の見た目上でのテーブル集計値です。)

# 結果

上記完全に杞憂でした。

データバインディングへの理解が乏しくこんな心配をしていましたが、v-modelに設定してしまえばセレクタ指定するのと大きく変わりませんね。 また、双方向バインディングにより値変化時にいちいち設定する必要もないため、「メモリは変更したが、表示に反映するのを忘れた」 などというケアレスミスは存在しなくなります。

 もう一点心配していたテーブルデータ集計に関してはそもそも見た目のデータがバインディングされているため、メモリ上で集計= 見た目上の集計ができるためこちらも杞憂でありました。

一方、習得には苦労しました。 これまでUIフレームワークでの開発は行ってこなかったことに加え、せっかくなのでtypescript で書きたいという欲求が生まれたためです。 どちらかというとtypescriptに苦労したと思います笑

# 一つだけできなかったことがある・・・

紙形式のUIです。

業務系アプリケーションを作成する上で、見た目上紙を模したものというのは需要があります。 こういった場合Vueだけではどうしてもできないことがあり断念しました。

この話は別の機会にしたいと思います。

# 終わりに

結果とjQueryはまだ利用していますが、jQuery しか知らないから他の手段が取れないといった将来をつぶすことができました。 jQueryの技術はもっともっと先でレガシーシステムとして需要がありそうな気がしますので大切ですが、新しいことへのチャレンジも大事ですね。
【PostgreSQL】メモリ管理について

## 初めに
PostgreSQLに限らず、メモリ管理についての理解が必要だと感じています。
この記事ではなぜメモリ管理をするのかも含めてメモリについて理解を深めていけるようにまとめていきます。

## なぜメモリ管理が必要なのか？
メモリ管理が必要な理由としては
データベースのパフォーマンス、スケーラビリティ[^1]、信頼性に影響を与えます。

### パフォーマンスの最適化
ディスクアクセスをするよりもメモリの方が高速です。頻繁にアクセスされるデータやインデックスをメモリ内にキャッシュすることが大事です。
適切に管理したメモリを使用することで、データベースはディスクI/Oの回数を減らし、応答時間を短縮できます。

### システムリソースの効率的な利用
メモリの最適化をすることで同時に処理できるクエリの数やユーザーの数が増加し、システムのスループットが向上します。
メモリの不足がパフォーマンスのボトルネックになることを避けるためにもメモリ管理が大事です。

### トランザクション処理の効率化
トランザクション処理中にはWALバッファや共有バッファが利用されます。
適切なメモリ管理によって、トランザクションのコミットやロールバックを迅速に処理でき、全体的なトランザクションスループットが向上します。

## PostgreSQLのメモリ管理
PostgreSQLのメモリ管理は2つに区別されています。
PostgreSQlサーバプロセス全体で共有される共有メモリ域と
バックエンドプロセスで確保されるプロセスメモリ域です。
それぞれについて理解を深めていきます。
![メモリ構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572072/4b013c66-38b9-1695-dcb1-2bea5b646a46.png)

### 共有メモリ域
複数のプロセスから参照や更新される共有領域。
PostgreSQLの起動時には、PostgreSQLの設定パラメータ（shared_buffers）の値と、Linuxのカーネルパラメータ(shmmax)の値を比較して、shmmaxよりshared_buffersの値が大きい場合にはエラーメッセージが出力される。
共有メモリ域はさらに以下の領域に分けられる。
- 共有バッファ（shared_buffers）
テーブルやインデックスのデータをキャッシュする領域
- WALバッファ（wal_buffers）
ディスクに書き込まれていないトランザクションログ（WAL）をキャッシュする領域
- 空き領域マップ（Free Space Map）
テーブル上の利用可能な領域を指し示す情報を扱う領域。テーブルやインデックスの各ページにどの程度の空きスペースがあるかを追跡するためのデータ構造。
- 可視性マップ（Visibility Map）
各テーブルページ内の行が全てのトランザクションから見て可視かどうかを追跡するための領域。バキューム処理の高速化のために、処理が必要なページかどうかを可視性マップで判断します。

### プロセスメモリ域
バックエンドプロセスごとに確保される作業用のメモリ領域
以下のように分類される。
- 作業メモリ（work_mem）
クエリ操作で行われるソートやハッシュテーブル操作に割り当てられるメモリ。
作業メモリを適切に設定することで性能の向上が期待できる。
作業メモリに大きな値を設定すると、システム全体のメモリ圧迫につながる可能性がある。
- メンテナンス用作業メモリ（maintenance_work_mem）
VACUUM、CREATE INDEXなどに使用されるメモリ。
メンテナンス時間の短縮には、work_memより大きめの値を設定することが望ましい。
- 一時バッファ（temp_buffers）
バックエンドプロセスごとに作成される一時テーブル用のメモリ領域。

## まとめ
メモリ管理について理解を深められたでしょうか？
メモリの理解があれば、データベースのパフォーマンス向上のために役立てることができるかも知れないです。
最後まで読んでいただきありがとうございます。

## 参考
https://katsusand.dev/posts/postgresql-memory/

[^1]: データベースにおけるスケーラビリティとは？
データ量の増加、同時アクセス数の増加、より高度なクエリの処理などデータベースの使用拡大に応じて性能を維持または向上させることができるかどうか。
Atcoder ABC331: B - Buy One Carton of Milkを整数計画問題・DP・ループ削減で解く方法

https://atcoder.jp/contests/abc331/tasks/abc331_b

- 解法1: 全探索(打ち切りなし)
- 解法2: 全探索(打ち切りとループ削減)
- 解法3: DP
- 解法4: LP

# 解法1: 全探索(打ち切りなし)
制約を眺めると最大で100個の卵なのでS,M,Lの卵をi,j,k買ったときのケースをすべて探索します。
```Python
n, s, m, l = map(int, input().split())
ans = 10**18
for i in range(20):
    for j in range(20):
        for k in range(10):
            if (6*i + 8*j + 12*k) >= n: ans = min(ans, s*i + m*j + k*l)
print(ans)
```

https://atcoder.jp/contests/abc331/submissions/48161724

# 解法2: 全探索(打ち切りとループ削減)
全探索解から次の点を工夫します。2つ目の工夫は3重ループを2重ループにします。
- N=66だとして Sを10(60個分), Mを1(8個分)買った場合、Mを2以上買うのは明らかに非効率(打ち切る)
- N=70だとしてSを10(60個分), Mを1(8個分)買った場合、Lは1(12個分)以外ありえない。つまり、S,Mが定まるとLは唯一に定まる。

```Python
import math
n, s, m, l = map(int, input().split())
ans = 10**18
for i in range(20):
    for j in range(20):
        k = max(0, math.ceil( (n - 6*i - 8*j) / 12)) # kの確定
        ans = min(ans, s*i + m*j + k*l)
        if (6 * i + 8 * j) >= n: break # 打ち切り
print(ans)
```

https://atcoder.jp/contests/abc331/submissions/48161889

# 解法3: DP
$dp[i]$をi個の卵を買うために必要な最小の価格とします。これをDPで求め、n以上を達成できる価格を調べます。
```Python
import math
INF = 10**18
n, s, m, l = map(int, input().split())
dp = [INF] * 120
dp[0] = 0
ans = 10**18
for i in range(0, 100):
    if dp[i] == INF: continue # その個数は達成不可能
    dp[i + 6] = min(dp[i+6], dp[i] + s)
    dp[i + 8] = min(dp[i + 8], dp[i] + m)
    dp[i + 12] = min(dp[i + 12], dp[i] + l)
for i in range(n, 120):
    if dp[i] == INF: continue # その個数は達成不可能
    ans = min(ans, dp[i])
print(ans)
```

https://atcoder.jp/contests/abc331/submissions/48162004

# 解法4: LP
計画問題であることが自明です。
minimize: 
$$
z = s \cdot i + m \cdot j + l \cdot k
$$

subject to:
$$
6s + 8m + 12l \geq n
$$
scipy.linprogには都合が悪いので符号を反転させます。
subject to:

$$
-6s + -8m + -12l \leq -n
$$

これをscipy.linprogします。
```Python
from scipy import optimize
n, s, m, l = map(int, input().split())
bds = (0, None) # 0 <= i,j,k
c = [s, m, l]
A = [[-6, -8, -12]]
b = [-n]
res = optimize.linprog(c, A_ub=A, b_ub = b, bounds=(bds,bds,bds), integrality=1)
print(int(res["fun"]))
```

https://atcoder.jp/contests/abc331/submissions/48162441

## おまけ
> res = optimize.linprog(c, A_ub=A, b_ub = b, bounds=(bds,bds,bds), integrality=1, options={"disp": True} )
するとdetailが見えます。
[CDI] 図解：よく使うCDI変換部品 - ⑩式

# はじめに

[インフォマティカ](https://www.informatica.com/jp/)が提供する、 [CDI](https://www.informatica.com/jp/products/cloud-integration/cloud-data-integration.html)(Cloud Data Integration)では、トランスフォーメーション(Tx)と呼ばれる変換部品を使って、ノーコードでデータの変換・連携を行うことができます。

この記事では、[「式」](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-129CEAE1-70CF-4F8D-9393-0F9BC33A58DE.html)と呼ばれる、1行内で値を計算するトランスフォーメーションを解説します。

# 変換部品の概要
式
 - 個々のデータ行に対して計算を実行します



# 図解イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/b3ebd704-4698-210d-af65-bd1af68c6dae.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/0b7ebe70-dbda-8d3a-0383-ceafc00a9b10.png)


# 変換部品の詳細
式トランスフォーメーションは1行内で値を計算します。式トランスフォーメーションを使用して、非集計計算を実行します。

例えば、賞与の割合の調整や名と姓の連結などの処理を式トランスフォーメーションを使用して実行できます。

式トランスフォーメーションを設定する際には、データフローで使用する各計算の出力について式フィールドを作成します。トランスフォーメーション内で使用する計算の変数フィールドを作成します。

#### Tips
- ウィンドウ関数
ウィンドウ関数を使用してステートフルな計算を簡潔に表現できます。ウィンドウ関数は、大規模なデータセットから小さいサブセットを取得して、処理と分析を行います。詳細は下記のマニュアルをご覧下さい。

https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-129CEAE1-70CF-4F8D-9393-0F9BC33A58DE/GUID-EA1533F1-3033-44D0-9C2F-41F2F9C5A70F.html

# 参考文献
[トランスフォーメーション マニュアル - 式トランスフォーメーション](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-129CEAE1-70CF-4F8D-9393-0F9BC33A58DE.html)

[トランスフォーメーション マニュアル](
https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-1F3375E8-0571-40E7-888F-C7DFD4F331C0.html)
[CDI] 図解：よく使うCDI変換部品 - ⑨共有体

# はじめに

[インフォマティカ](https://www.informatica.com/jp/)が提供する、 [CDI](https://www.informatica.com/jp/products/cloud-integration/cloud-data-integration.html)(Cloud Data Integration)では、トランスフォーメーション(Tx)と呼ばれる変換部品を使って、ノーコードでデータの変換・連携を行うことができます。

この記事では、[「共有体」](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-9ACE6101-14BE-4554-98DE-28BE8A6D4750.html)と呼ばれる、複数のパイプラインから1つのパイプラインにデータを統合するために使用するトランスフォーメーションを解説します。

# 変換部品の概要
共有体
 - 複数の入力グループのデータを1つの出力グループにマージします

# 図解イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/a0050be6-ce09-5c22-fd5f-7edb473d3d7b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/c60054e9-3c99-7880-1006-95cb9e7eb237.png)



# 変換部品の詳細
データ統合パターンでは、通常、2つ以上のデータソースをすべての行の共有体を含む1つのストリームに組み合わせます。多くの場合、各データソースは同じ構造ではないため、データストリームを自由に結合することはできません。共有体トランスフォーメーションでは、類似するストリームのメタデータを作成し、データソースを1つのターゲットに組み合わせることができます。

共有体トランスフォーメーションはUNION ALL SQL文と同様に、複数のソースのデータを統合します。例えば、共有体トランスフォーメーションを使用して、ADPの従業員情報をWorkday従業員オブジェクトのデータと統合できます。

共有体トランスフォーメーションでデータソースを統合する場合、特定のフィールドを追加、変更、または削除できます。

実行時に、 マッピングタスクは入力グループを並列に処理します。また、共有体トランスフォーメーションに接続されたソースを読み込むと同時に、データブロックをトランスフォーメーションの入力グループにプッシュします。マッピングの実行時に、フィールドマッピングに基づいてデータを1つの出力グループに統合します。

- ジョイナトランスフォーメーションとの比較
共有体トランスフォーメーションでは、複数のソースのデータをマージできますが、ジョイナトランスフォーメーションのように結合条件に基づいたデータの結合や重複行の削除は行われません。
次の表に、複数ソースのデータもマージする共有体トランスフォーメーションとジョイナトランスフォーメーションの重要な相違点を示します。マッピング設計では次の相違点を考慮してください。

|要件|共有体トランスフォーメーション|ジョイナトランスフォーメーション
|:-----------:|:------------:|:------------:|
|重複行を削除する|いいえ。共有体トランスフォーメーションからルータートランスフォーメーションまたはフィルタトランスフォーメーションダウンストリームを使用して、重複を削除できます。|はい|
|結合条件に基づいてレコードを結合する|いいえ。共有体トランスフォーメーションは、複数のソースから垂直にデータを結合するSQLのUNION ALL文と同じです。|はい。ジョイナトランスフォーメーションでは、ノーマル結合、右外部結合、左外部結合、完全外部結合がサポートされています。|
|複数の入力グループを含める|はい。複数の入力グループと1つの出力グループを定義できます。|はい。2つの入力グループ（マスタと詳細）を定義できます。|
|異種ソースを含める|○|×|
|異なるデータ型をマージする|すべてのソースカラムが類似するデータ型である必要があります。各ソースのカラム数は同じである必要があります。|結合するソースの少なくとも1つのカラムのデータ型が同じである必要があります。|
|トランザクションを生成する|×|○|

# 参考文献
[トランスフォーメーション マニュアル - 共有体トランスフォーメーション](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-9ACE6101-14BE-4554-98DE-28BE8A6D4750.html)

[トランスフォーメーション マニュアル](
https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-1F3375E8-0571-40E7-888F-C7DFD4F331C0.html)
[CDI] 図解：よく使うCDI変換部品 - ⑧ルーター

# はじめに

[インフォマティカ](https://www.informatica.com/jp/)が提供する、 [CDI](https://www.informatica.com/jp/products/cloud-integration/cloud-data-integration.html)(Cloud Data Integration)では、トランスフォーメーション(Tx)と呼ばれる変換部品を使って、ノーコードでデータの変換・連携を行うことができます。

この記事では、[「ルーター」](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-27E40FB2-BC8D-42ED-BEB8-7A37B000E3D8.html)と呼ばれる、複数の条件に基づいて行を振り分けるトランスフォーメーションを解説します。

# 変換部品の概要
ルーター
 - 複数の条件に基づいて行を振り分けます


# 図解イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/d7f230df-2a88-80b7-9614-92deb297798c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/e591aa3a-8397-99d1-6c5e-dfea92283811.png)


# 変換部品の詳細
ルータトランスフォーメーションは、受信データに条件を適用するために使用できるアクティブなトランスフォーメーションです。

ルータトランスフォーメーションでは、 データ統合は、フィルタ条件を使用して受信データの各行を評価します。各ユーザー定義グループの条件をテストしてから、デフォルトグループを処理します。行が複数のグループフィルタ条件を満たす場合、 データ統合はこの行を複数回渡します。どの条件も満たさない行は破棄するか、デフォルトの出力グループにルーティングできます。

複数の条件に基づいて同じ入力データをテストする必要がある場合、同じタスクを実行する複数のフィルタトランスフォーメーションを作成する代わりに、マッピング内でルータトランスフォーメーションを使用します。

次の表は、ルータトランスフォーメーションとフィルタトランスフォーメーションの比較です。

|オプション|ルータ|フィルタ
|:-----------:|:------------:|:------------:|
条件|単一のルータトランスフォーメーション内の複数の条件をテストする|フィルタトランスフォーメーションごとに1つの条件をテストする
条件を満たさない行の処理|デフォルト出力グループにルーティングするか、破棄する|破棄する
受信データ|1つのルータトランスフォーメーションで1回処理する|各フィルタトランスフォーメーションで処理する

# 参考文献
[トランスフォーメーション マニュアル - ルータトランスフォーメーション](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-27E40FB2-BC8D-42ED-BEB8-7A37B000E3D8.html)

[トランスフォーメーション マニュアル](
https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-1F3375E8-0571-40E7-888F-C7DFD4F331C0.html)
[CDI] 図解：よく使うCDI変換部品 - ⑦ルックアップ

# はじめに

[インフォマティカ](https://www.informatica.com/jp/)が提供する、 [CDI](https://www.informatica.com/jp/products/cloud-integration/cloud-data-integration.html)(Cloud Data Integration)では、トランスフォーメーション(Tx)と呼ばれる変換部品を使って、ノーコードでデータの変換・連携を行うことができます。

この記事では、[「ルックアップ」](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-9E8E4FE1-9BCD-44A1-9FB2-0AB68EF73B88.html)と呼ばれる、指定されたルックアップ条件に基づいてデータを取得するトランスフォーメーションを解説します。

# 変換部品の概要
指定されたルックアップ条件に基づいてデータを取得します

# 図解イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/6fa928e2-10ff-f859-205b-c751215723cf.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/c85c7b0c-8b5d-b15e-60b9-9296516fa2d3.png)



# 変換部品の詳細
指定されたルックアップ条件に基づいてデータを取得するには、ルックアップトランスフォーメーションを使用します。例えば、ルックアップトランスフォーメーションを使用すると、ソースデータで使用されているコードの値をデータベーステーブルから取得できます。

マッピングタスクにルックアップトランスフォーメーションが含まれる場合、タスクはルックアップフィールドとルックアップ条件に基づいてルックアップソースを照会します。ルックアップトランスフォーメーションは、ルックアップの結果をターゲットまたは別のトランスフォーメーションに返します。単一の行または複数の行を返すように、ルックアップトランスフォーメーションを設定することができます。単一の行を返す用に設定されたルックアップトランスフォーメーションは、パッシブトランスフォーメーションです。複数の行を返す用に設定されたルックアップトランスフォーメーションは、アクティブトランスフォーメーションです。

1つのマッピングで複数のルックアップトランスフォーメーションを使用できます。 詳細モードでは、 詳細クラスタが処理できるソースに対してのみルックアップを実行できます。

ルックアップトランスフォーメーションでは、以下のタスクを実行します。
- 関連する値を取得する。ソースの値に基づいてルックアップテーブルから値を取得します。たとえば、ソースに従業員IDがあるものとします。ルックアップテーブルから従業員名を取得します。
- 複数の値を取得する。ルックアップテーブルから複数の行を取得します。例えば、部門内のすべての従業員を返します。
- 緩やかに変化する次元テーブルを更新する。行がターゲットに存在するかどうかを判断します。

# 参考文献
[トランスフォーメーション マニュアル - ルックアップトランスフォーメーション](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-9E8E4FE1-9BCD-44A1-9FB2-0AB68EF73B88.html)

[トランスフォーメーション マニュアル](
https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-1F3375E8-0571-40E7-888F-C7DFD4F331C0.html)
[CDI] 図解：よく使うCDI変換部品 - ⑥フィルタ

# はじめに

[インフォマティカ](https://www.informatica.com/jp/)が提供する、 [CDI](https://www.informatica.com/jp/products/cloud-integration/cloud-data-integration.html)(Cloud Data Integration)では、トランスフォーメーション(Tx)と呼ばれる変換部品を使って、ノーコードでデータの変換・連携を行うことができます。

この記事では、[「フィルタ」](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-88437968-068A-431A-AD89-E1159D9CD77F.html)と呼ばれる、指定されたフィルタ条件に基づいてデータフローのデータをフィルタリングするトランスフォーメーションを解説します。

# 変換部品の概要
フィルタ
 - 指定されたフィルタ条件に基づいてデータフローのデータをフィルタリングします

# 図解イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/d8fab6bb-2c47-0b96-0c70-b62031e43d1c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/a8f5c1d1-a3d6-25dd-e277-2c915a9ce208.png)


# 変換部品の詳細
フィルタトランスフォーメーションは、指定されたフィルタ条件に基づいてデータフローのデータをフィルタリングします。ジョブのパフォーマンスを向上させるには、フィルタトランスフォーメーションをマッピングソースの近隣に配置して、データフローから不要なデータを削除してください。

フィルタ条件はTRUEまたはFALSEを返す式です。ある行に対してフィルタ条件がTRUEを返すと、フィルタトランスフォーメーションはその行を残りのデータフローに渡します。フィルタ条件がFALSEを返すと、フィルタトランスフォーメーションはその行を破棄します。

データは1つ以上の条件に基づいてフィルタリングできます。例えば、ある日付範囲内のデータを使用する場合は、指定された日付範囲の前および後のデータを削除する条件を作成します。

フィルタトランスフォーメーションには単一のトランスフォーメーションをリンクします。複数のトランスフォーメーションをフィルタトランスフォーメーションにマージすることはできません。

# 参考文献
[トランスフォーメーション マニュアル - フィルタトランスフォーメーション](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-88437968-068A-431A-AD89-E1159D9CD77F.html)

[トランスフォーメーション マニュアル](
https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-1F3375E8-0571-40E7-888F-C7DFD4F331C0.html)
[CDI] 図解：よく使うCDI変換部品 - ⑤トランザクション制御

# はじめに

[インフォマティカ](https://www.informatica.com/jp/)が提供する、 [CDI](https://www.informatica.com/jp/products/cloud-integration/cloud-data-integration.html)(Cloud Data Integration)では、トランスフォーメーション(Tx)と呼ばれる変換部品を使って、ノーコードでデータの変換・連携を行うことができます。

この記事では、[「トランザクション制御」](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-0F4F6C04-9FC3-45E1-875A-2CD034B94639.html)と呼ばれる、行のセットをコミットまたはロールバックを制御するトランスフォーメーションを解説します。

# 変換部品の概要
トランザクション制御
 - マッピング実行時の行セットのコミットまたはロールバックを制御します

# 図解イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/57b96527-e10f-816f-e4f2-e192a526b345.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/2aca8625-26b3-c6eb-5997-db8a482a4753.png)


# 変換部品の詳細
トランザクション制御トランスフォーメーションは、マッピングの実行時に行のセットをコミットまたはロールバックするアクティブなトランスフォーメーションです。トランザクション制御トランスフォーメーションを使用して、リレーショナル、XML、Amazon Redshift、REST V2などのトランザクションターゲットに対してトランザクションをコミットまたはロールバックします。また、マッピングでこのトランスフォーメーションを使用して、 データ統合が新しいトランザクションを開始するたびにデータを異なるフラットファイルに書き込むこともできます。

大量のデータを処理する場合は、トランザクション制御トランスフォーメーションを使用することをお勧めします。トランザクション制御トランスフォーメーションを使用すると、一定の間隔でデータをコミットできるため、データ損失を防ぐことができます。例えば、注文タイプでソートされているテーブル内の何千ものレコードを処理するマッピングを実行するとします。マッピングで異なる注文タイプが処理されるたびにデータをコミットすることができます。

トランザクション制御トランスフォーメーションにおけるトランザクションは、コミット行またはロールバック行によって関連付けられた行または行のセットです。トランザクションは、従業員IDや注文入力日などの共通キーでソートされている行のグループをベースにすることができます。各トランザクションの行数は異なる場合があります。
トランザクションを定義するには、トランスフォーメーションでトランザクション制御条件を指定します。条件が満たされているかどうかに基づいて、行をコミットするか、行をロールバックするか、またはトランザクション境界を変更せずにデータの処理を続行するように選択できます。

マッピングタスクを実行すると、 データ統合により、トランスフォーメーションに入力される行ごとにトランザクション制御条件が評価されます。コミット行が評価されると、トランザクション内のすべての行がターゲットにコミットされます。 データ統合は、ロールバック行を評価すると、トランザクションのすべての行をターゲットからロールバックします。

実行時に作成されるフラットファイルターゲットがマッピングに含まれる場合は、 データ統合が新しいトランザクションを開始するたびに出力ファイルを生成できます。ターゲットフラットファイル名は動的に指定できます。

# 参考文献
[トランスフォーメーション マニュアル - トランザクション制御トランスフォーメーション](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-0F4F6C04-9FC3-45E1-875A-2CD034B94639.html)

[トランスフォーメーション マニュアル](
https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-1F3375E8-0571-40E7-888F-C7DFD4F331C0.html)
対応方法がわからなくて、UiPath社に問い合わせ件

## はじめに
下記の企画で今日から連続で記事を投稿します！！

https://t.co/56WibbNlvz

では今回は、問題の切り分けを行っても解決できなさそうだと思い、UiPath社に問い合わせをしてみました。
初めてだったので、問い合わせ方法などを載せることにしました。
特にこれから一人で常駐先で活躍される方などに一読していただけたら幸いです。

## 問い合わせ先
UiPath Forward Japanに参加時にUiPathのブースで技術質問をしたときに、何かあればここにご連絡をお願いしますと紹介されました。

:::note info
ライセンスがある場合、下記。
https://www.uipath.com/ja/company/contact-us/customer-support
ライセンスがない場合、下記。
https://www.uipath.com/ja/company/contact-us
:::

## 回答のスピード感について
:::note info
スピード感はとても速かったです。
最初の問い合わせに対して、2時間後に対応方法を丁寧に教えてもらいました。
:::

問い合わせ内容については明日から連続で記事をあげるので見てください！

:::note warn
しかし開発者なら理解できる回答だったので、UiPathの開発に不慣れな人は回答を理解するのが難しいかもしれないです。
:::

## スムーズに話を進めるなら
:::note info
(1)簡単なロボットの仕様を説明する。InputとOutputはCSVなのか、Excelなのか？など
(2)何が起こったのか？
(3)起こったことに対して、何を試しその結果はどうだったか？
:::

この3つを伝えることでUiPath社の担当者は、アドバイスをしやすいかと思います！

:::note warn
**問い合わせ時にXamlも送ることができます。**
しかし現場によってはNGの場合があるので、ここは上長に確認を取りましょう。
:::

## おわりに
実物のロボットを見せて、仲のいい人に質問をしたいですが、それができないときにUiPath社に問い合わせてもいいと思います。

:::note info
この記事を見て、「問い合わせしたところで、、、。」という先入観を消すことができたら幸いです！！
:::
明日は「どんなエラーが起こり問い合わせすることになったか？」から説明した記事を載せますので、気になる方は見てください！！
ちなみにUiPath Friendsのもくもく会でもこの話をしたところ、「そういうことがあるんだ！と勉強になりました」という言葉を頂きました。
ではまた明日！！
[CDI] 図解：よく使うCDI変換部品 - ④ソーター

# はじめに

[インフォマティカ](https://www.informatica.com/jp/)が提供する、 [CDI](https://www.informatica.com/jp/products/cloud-integration/cloud-data-integration.html)(Cloud Data Integration)では、トランスフォーメーション(Tx)と呼ばれる変換部品を使って、ノーコードでデータの変換・連携を行うことができます。

この記事では、[「ソーター」](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-00C4F6BF-AB9C-4396-BA95-01378101E745.html)と呼ばれる、データの並び替えをするトランスフォーメーションを解説します。

# 変換部品の概要
ソーター
 - 指定されたソート条件に従って昇順または降順にデータを並び替えます

Tips
- 複数のソート条件を指定する場合、 マッピングタスクは各条件をシーケンシャルにソートします。 マッピングタスクは、連続した各ソート条件を前のソート条件の2番目のソートとして扱います。ソート条件の順序は設定が可能です。


# 図解イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/9a57e2c5-64ba-239b-2d6f-76defaffd116.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/e6a1aa5a-6865-e0c4-6c12-4e4b41c12e03.png)


# 変換部品の詳細
指定されたソート条件に従って昇順または降順にデータをソートするには、ソータートランスフォーメーションを使用します。ソータートランスフォーメーションは、大文字小文字を区別してソートするように設定したり、出力が重複しないように設定したりすることができます。ソータートランスフォーメーションは、パッシブトランスフォーメーションです。

ソータートランスフォーメーションを使用して、他のトランスフォーメーションのパフォーマンスを向上させることができます。例えば、ソート済み受信フィールドを使用するように設定されたルックアップトランスフォーメーションまたはアグリゲータトランスフォーメーションを経由するデータをソートできます。

ソータートランスフォーメーションを作成する場合、フィールドをソート条件として指定し、昇順または降順でソートを行うように各ソートフィールドを設定します。 マッピングタスクを設定する場合、ソート条件のパラメータを使用して、パラメータの値を定義できます。

# 参考文献
[トランスフォーメーション マニュアル - ソータートランスフォーメーション](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-00C4F6BF-AB9C-4396-BA95-01378101E745.html)

[トランスフォーメーション マニュアル](
https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-1F3375E8-0571-40E7-888F-C7DFD4F331C0.html)
[CDI] 図解：よく使うCDI変換部品 - ③ジョイナ

# はじめに

[インフォマティカ](https://www.informatica.com/jp/)が提供する、 [CDI](https://www.informatica.com/jp/products/cloud-integration/cloud-data-integration.html)(Cloud Data Integration)では、トランスフォーメーション(Tx)と呼ばれる変換部品を使って、ノーコードでデータの変換・連携を行うことができます。

この記事では、[「ジョイナ」](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-6B4B3465-3C54-4B36-BDDC-6499A95E4D66.html)と呼ばれる、2つの関連する異種ソースからのデータを結合するトランスフォーメーションを解説します。

# 変換部品の概要
ジョイナ
 - 2つの異なるソースからのデータを結合します

次の結合タイプを使用できます。
- Normalジョイン
結合条件に一致する行が含まれます。結合条件に一致しない行は破棄されます。
- マスタ外部
    明細パイプラインのすべての行およびマスタパイプラインの一致する行が含まれます。一致しないマスタパイプラインの行は破棄されます。
- 明細外部
    マスタパイプラインのすべての行および明細パイプラインの一致する行が含まれます。一致しない明細パイプラインの行は破棄されます。
- 完全外部
    結合条件に一致する行およびマスタパイプラインと明細パイプラインのすべての入力データが含まれます。

# 図解イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/45e3141d-831a-874c-0025-34ed0f9a1300.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/bbbcfda4-5137-f45c-0532-fe892ca4ae5a.png)



# 変換部品の詳細
ジョイナトランスフォーメーションは、2つの関連する異種ソースからのデータを結合できます。例えば、ジョイナトランスフォーメーションを使用して、Salesforceの取引先オブジェクトのデータが含まれるフラットファイルから取引先情報を結合できます。

ジョイナトランスフォーメーションは、結合条件および結合タイプに基づいてデータを結合できます。結合条件では、2つのソース間でフィールドを照合します。複数の結合条件を作成できます。結合タイプでは、結果に含まれるデータセットを定義します。

トランスフォーメーションをジョイナトランスフォーメーションにリンクする場合、トランスフォーメーションをマスタグループまたは明細グループにリンクします。ジョブのパフォーマンスを高めるには、小さいデータセットを表すトランスフォーメーションをマスタグループに接続します。

マッピング内の3つ以上のソースを結合する場合は、複数のジョイナトランスフォーメーションを使用できます。ジョイナトランスフォーメーションからの出力を別のソースパイプラインと結合できます。すべてのソースパイプラインを結合するまで、ジョイナトランスフォーメーションをマッピングに追加できます。

一致するフィールド名があるソースを結合する場合、フィールド名の競合が発生する可能性があります。競合は次のいずれかの方法で解決できます。
- フィールド名の競合の解決を作成する。
- アップストリームトランスフォーメーションの一致するフィールドの名前を変更する。
- 式トランスフォーメーションを介してデータを渡し、フィールドの名前を変更する。

# 参考文献
[トランスフォーメーション マニュアル - ジョイナトランスフォーメーション](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-6B4B3465-3C54-4B36-BDDC-6499A95E4D66.html)

[トランスフォーメーション マニュアル](
https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-1F3375E8-0571-40E7-888F-C7DFD4F331C0.html)
[CDI] 図解：よく使うCDI変換部品 - ②シーケンス

# はじめに

[インフォマティカ](https://www.informatica.com/jp/)が提供する、 [CDI](https://www.informatica.com/jp/products/cloud-integration/cloud-data-integration.html)(Cloud Data Integration)では、トランスフォーメーション(Tx)と呼ばれる変換部品を使って、ノーコードでデータの変換・連携を行うことができます。

この記事では、[「シーケンス」](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-5A00EAA0-3D93-455A-81CB-783A2979946C.html)と呼ばれる、連続する数値を割り当てるトランスフォーメーションを解説します。

# 変換部品の概要
シーケンス
 - 一意なプライマリキーの生成、欠落しているプライマリキーの置換などを行います
<BR>

主な用途
- 一意のシーケンス番号を生成する。
- 循環シーケンス番号を生成する。
- 既存のシーケンス番号を継続する。
- 同じシーケンスジェネレータを使用して、複数のパーティションに対して連続した一意の番号を生成する。

# 図解イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/377d4da3-d413-b7d2-8493-28d1f2b29ac7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/3c177f69-1e5a-2267-693d-fa55b9852b3a.png)


# 変換部品の詳細
シーケンスジェネレータトランスフォーメーションは、数値を生成する、接続されたパッシブトランスフォーメーションです。一意なプライマリキー値の作成、欠落しているプライマリキーの置き換え、連続した数値のでサイクル動作を実行する場合、シーケンスジェネレータを使用します。

シーケンスジェネレータトランスフォーメーションにはパススルーフィールドと2つの出力フィールド（NEXTVALおよびCURRVAL）があります。 詳細モードでは、トランスフォーメーションにはNEXTVALという1つの出力フィールドがあります。出力フィールドは1つ以上のダウンストリームトランスフォーメーションに接続できます。

マッピングタスクにより、マッピングされたフィールドが、接続されたトランスフォーメーションに入力されるたびに値の数値シーケンスが生成されます。Mapping Designerで数値の範囲を設定します。タスクの実行時にシーケンスの最初の数値を変更できます。

タスクの完了後に、 マッピングタスクの詳細にシーケンスジェネレータトランスフォーメーションの現在の値と初期値が表示されます。

# 参考文献
[トランスフォーメーション マニュアル - シーケンストランスフォーメーション](https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-5A00EAA0-3D93-455A-81CB-783A2979946C.html)

[トランスフォーメーション マニュアル](
https://docs.informatica.com/ja_jp/integration-cloud/data-integration/current-version/_transformations_cloud-data-integration_current-version_ditamap/GUID-1F3375E8-0571-40E7-888F-C7DFD4F331C0.html)
Apple Watchのデベロッパーモードが表示されない時の対応方法

# 困ったこと
新しく買った`Apple Watch SE (第2世代)`のディベロッパーモード設定項目が `設定→プライバシーとセキュリティ→下までスクロール`と探しても見つからず困っていました。

<img width="200" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/d8862470-dd3f-bd57-041c-5795ae402aa5.jpeg">

# 環境
Xcode 15.0
watchOS 10.1.1

# 解決方法
ペアリングしたiPhoneをXcodeに接続することでディベロッパーモード設定項目が表示できました。

<img width="200" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/5b6da449-6bb8-5386-a08f-1322c42f1d5b.jpeg"><img width="200" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/a44e2208-e442-fb5d-7871-6590e648a91a.jpeg">




# 参考

https://developer.apple.com/forums/thread/707566
Mac Python 初期設定

# はじめに
goで書きたいプログラムがあったが、うまくいかなかったので参考例が多いpythonを使って書くことにした。
pythonを使うまでに行なったことをまとめる。

# 環境
macOS
VScode

# 作業
以下の動画を見て初期設定を行なった。
vscondeを使ってコードを書いてく。

https://www.youtube.com/watch?v=6b6uM7Fl8ck&t=1010


# 学習方法
以下動画で学習。
他の言語をやっている方なら、関数やクラスの定義方法を見れば十分コードが書けるようになると思います。
環境構築と基礎学習でトータル1時間くらいで動くプログラムが書けるようになりました。

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


# まとめ
簡単にできた。
他の言語に比べて環境構築が楽に感じたので、初心者にはおすすめだと感じました。
Milk-v DuoのLinux sysfs gpio accessを使ってLチカする

## はじめに
秋葉原ロボット部の有志で、Milk-v Duoを購入し、個々人が様々な実験を行って、勉強会内で報告しています。

Milk-v Duoは9ドルのrisc-vコンピュータとして知られています。
ハードウェアは以下の通りです。

1. CPUはCVITEKのCV1800B (C906@1Ghz + C906@700MHz)
1. 最高1 GHzで動作するデュアルRV64コア
1. 64 MBのラム
1. オプションのアドオンボードを接続すると10/100Mbpsの速度でイーサーネットに接続可能

GPIO経由で様々な機器を操作する方法には複数ありますが、今回は、Linux sysfs gpio accessを使って、Lチカを行います。
Swap領域が利用可能なMilk-v DuoをUSBケーブルでWindowsマシンに接続した環境で、実験を行っています。

## sysfsを使うGPIO操作
sysfsを使うとGPIOの操作が簡単らしいという情報が
https://www.nds-osk.co.jp/atc/wp-content/uploads/UserlandIO.pdf
に、掲載されています。
デバイスドライバを用意しなくても、ファイルアクセスとしてGPIOを操作可能になるライブラリのようです。

## Linux sysfs gpio accessのインストール
Raspberry pi用のライブラリが利用可能ですので、こちらをインストールします。
「 https://github.com/vitiral/gpio 」の「Releases」に「Version 1.0.0」のソースコードが公開されているので、「gpio-1.0.0.zip」をWindowsマシンでダウンロードして、Milk-v Duoにファイルを転送します。
Milk-v Duo上で作業を行います。
```
[root@milkv-duo]~# unzip gpio-1.0.0.zip
[root@milkv-duo]~# cd gpio-1.0.0
[root@milkv-duo]~# pip install .
```
SDカード上のSWAPを使うので、不安になるぐらい進捗が遅くなります。
プロンプトが表示されるまで我慢します。
```
WARNING: The directory '/root/.cache/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Processing /root/gpio-1.0.0
Installing collected packages: gpio
    Running setup.py install for gpio ... done
Successfully installed gpio-1.0.0

[root@milkv-duo]~/gpio-1.0.0#
```
「/sys/class/gpio/export」の権限を修正します。
```
[root@milkv-duo]~# chmod +r /sys/class/gpio/export
```

## Lチカプログラム作成
githubのページに掲載されている「RPi.GPIO Drop-in」の例を参考にpythonスクリプトを作成します。
LチカするLEDは、本体上の青色LEDを使います。
このLEDの番号は「440」です。
```blinktest1.py
import time
import gpio as GPIO

GPIO.setup(440, GPIO.OUT)

while True:
    GPIO.output(440, GPIO.HIGH)
    time.sleep(1.0)
    GPIO.output(440, GPIO.LOW)
    time.sleep(1.0)
```
「blinktest1.py」を動作させる前に、起動時に自動点滅する設定を停止して、再起動しておきます。
```
mv /mnt/system/blink.sh /mnt/system/blink.sh_backup && sync
```
上記を実行したのち、再起動します。
青色LEDが消灯していることを確認して、スクリプトを実行します。
```
[root@milkv-duo]~# python blinktest1.py
```
青色LEDの点滅が始まります。

もう一つの例、「Use GPIOPin directly」の例を参考に、以下のスクリプトを作成しました。
```blinktest2.py
import gpio

pin = gpio.GPIOPin(440, gpio.OUT)

while True:
    pin.write(440, GPIO.HIGH)
    time.sleep(1.0)
    pin.write(440, GPIO.LOW)
    time.sleep(1.0)
```
さっそく実行してみます。
```        
[root@milkv-duo]~# python blinktest2.py
Traceback (most recent call last):
  File "/root/blinktest2.py", line 6, in <module>
    pin.write(440, GPIO.HIGH)
NameError: name 'GPIO' is not defined
[root@milkv-duo]~#
```
こちらは、うまく動作しませんでした。
スクリプトの修正が必要なようです。
上手く動作したら、報告いたします。

## おわりに
この記事では、Ｌチカの例を紹介しました。
各種センサにも応用が可能です。
ぜひ試してください。
Apache php.iniでモジュールが読み込めない


古いPHP7.4をEC2(Ubuntu)のApacheにインストールした際の設定。
定期的に同じことを調べそうなのでメモ

環境:
 - 22.04.1-Ubuntu
 - PHP 7.4.33 (cli) (built: Sep  2 2023 08:03:46) ( NTS )
 - Apache/2.4.52 (Ubuntu)

## 遭遇したエラー
EC-CUBE4のインストール時に以下のエラーが発生した。
```
Required PHP module 'curl' is not enabled. Please check server configuration.
Required PHP module 'xml' is not enabled. Please check server configuration.
Required PHP module 'zip' is not enabled. Please check server configuration.
Required PHP module 'mbstring' is not enabled. Please check server configuration.
```

## 解決方法
phpinfo()で設定ファイル(/etc/php/7.4/apache2/php.ini)を探し、モジュールのロード方法を変更する。
``` /etc/php/7.4/apache2/php.ini
;extension=bz2
extension=curl.so ← curlではなく、curl.soで記述する
```

## 以下、エラーが発生した際の備忘録

### Apacheで古いPHPの設定
Apache2でphp7.4の有効化 & PHP7.4以外は使わないので乱暴にphpを設定していく。
```
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install -y  php7.4
sudo mv /usr/bin/php7.4 /usr/bin/php
sudo a2enmod php7.4
```



以下のファイルでApacheで読み込まれているモジュールを確認する。これはinfo.php等の名前をつけて/var/www/html配下に置く。
```info.php
<?php
phpinfo(INFO_MODULES);
?>
```
https://<サーバのIP>/info.phpにアクセスした結果
↓curlは読み込まれていないことがわかる。
![スクリーンショット 2023-12-03 12.00.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235988/e011e53a-7e1e-33f8-dd46-71310ce1f47b.png)

設定ファイルは次の通り、`/etc/php/7.4/apache2/php.ini`
![スクリーンショット 2023-12-03 12.02.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235988/6d0bf8c4-1420-fa9c-a7a3-19b94e6aabe0.png)


php.iniでcurlは有効化している。なぜ読み込まれていないのだろう
``` /etc/php/7.4/apache2/php.ini
;extension=bz2
extension=curl
;extension=ffi
```

CLIのphp.iniを確認すると謎が解けた。
``` /etc/php/7.4/cli/conf.d/20-curl.ini
; configuration for php curl module
; priority=20
extension=curl.so ← .soをつけないといけない
```

Apacheを再起動して無事解決。
```
sudo apache2ctl restart
```


参照
https://minory.org/php-warning-module.html
【ChatGPT＋DALL-E3】で作品作成の手順。


　どうも、カーブミラーです。

　今回は、DALL-E3での、画像生成する手順を書きます。もちろん、ほかにもありますけどね。

:::note info
本記事は、ChatGPTとDALL-E3を
使用しています。あしからず。
:::

　で、最終作品は、こちら。
![DALL·E 2023-12-03 11.11.04 - A stunning winter scene showcasing frost glistening on various leaves. The scene depicts delicate frost crystals sparkling as they catch the early mor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/52129745-d282-a5d0-0b54-332f5a3d43e0.png)

***
　それで、手順ですが、
　　まずは、アイディアが大事です。

　というか、
　　イメージですね。

　今回の作品は、
　　X-Twitterに
　　　上がっていた写真から
　　　　それを画像化しようと
　　　　　思いました。

　そう、元ネタは、本物です。
　　都会に住んでいますと、
　　　こうしたものが、
　　　　存在していることを
　　　　　素通りしてしまって
　　　　　　いることと思います。

　朝露に濡れた葉っぱや
　　クモの巣とか
　　　意外な存在が、
　　　　あなたのまわりに
　　　　　あるのです。
***
　まぁ、それはともかく。

　まずは、イメージを
　　言葉にします。

　「霜を付けた花々。」
　　で最後に「描画して。」を
　　　付けます。

　最初は、
　　花に霜が付いたイメージでした。

　でも、
　　ちょっと花が可哀想なので
　　　葉っぱにしました。

　その葉っぱが
　　カラフルなものを
　　　描画してもらったのですが、
　　　　紅葉ばかり。違う。

　そこで、
　　朝日の輝きを
　　　透過させます。
　　　　いい。
　　　　　でも、イマイチ。

　次は、
　　さまざまな緑色に
　　　してもらいました。
　　　　よくなりました。

　完成です。

　そこで再現性を求めて、
　　英語と日本語のプロンプトを
　　　出力しました。

　NewChatして、
　　そのプロンプトを
　　　ChatGPTさんに与えて、
　　　　出力画像を確認して、
　　　　　納得するまで、
　　　　　　微調整を繰り返して
　　　　　　　さらにNewChatする。

　そうやって、
　　完成したのが、
　　　最初の作品です。

　もう少し追加すると
　　こうなります。
![DALL·E 2023-12-03 12.19.23 - A whimsical scene with a fairy flying amidst the frost glistening on various leaves, as depicted in the previous winter scene. The fairy is delicately.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/65b2736c-89d4-63d8-db92-e020619e895d.png)


　今回は、ここまで。
[新機能] S3 Access Grantsの仕組みと従来のS3アクセス管理との比較

# はじめに
[2023 AWS re:invent](https://aws.amazon.com/jp/events/reinvent-2023/)にてS3のアクセス管理に関する新機能"**S3 Access Grants**"が発表されました！

https://aws.amazon.com/jp/s3/features/access-grants/

これまでS3のアクセス管理方法として、S3バケットやIAMによるポリシー管理やAccess Points管理などがありましたが、新しい管理方法が登場したようです。
本記事ではS3 Access Grantsが従来のアクセス管理方法とどういった点で異なるのかについて解説をしていきたいと思います。

# S3 Access Grants
## 特徴
- IAMプリンシパル(ロールやユーザー)に対してS3 内のデータセットにマッピングすることが可能
- またAWS Identity Centerとも連携が可能で、外部プロバイダのユーザーにも対応が可能
- 一時的なセッションとして認証/認可を行い、きめ細やかなアクセス管理が可能
- アクセスはCloudtrailで監査が可能

## 構成
Access Grantsは大きく分けると以下の概念(コンポーネント)で構成されます。

**インスタンス**
- S3 Grants Accessを管理するインスタンス
- 2023/12/1現在では1リージョンに1つのインスタンスを作成することが可能

**ロケーション**
- 権限の対象とするS3バケットやキーを大枠として指定
- ロケーションにロールを設定し、払い出すことの可能な権限一覧(READ/WRITE)をポリシーとして設定

**権限(Grants)**
- ロケーション内のどこの階層に対して、何の許可（READ or WRITE）をどのプリンシパルに結びつけるのかを定義
- リージョンごとに最大 100,000 件の許可を定義
- ロールに限らず、AWS Identity Centerと連携することが可能であり、一般的なIDプロバイダーをサポート

## アクセスフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/12c3715f-c0b5-85ad-14f2-8e97c7fb6c8c.png)
今回は上記のように、DeveloperロールがS3の``/developer/*``にアクセスが必要なケースで説明をします。

①まずDeveloper Roleを使用して、S3 Grants Accessに対して、``s3:GetDataAccess``リクエストを送ります。このとき権限の範囲READ/WRITEを指定することができます。

②このリクエストに対してS3 Access Grantsは一致する権限(Grants)を探し、権限(Grants)に従って対象となるS3への一時的な認証キーを発行します。ユーザーからのREAS/WRITEに基づいて、ロケーションに紐づけられたロールのうちREAS/WHITE権限をそれぞれ割り当てます。

③一時的な認証情報を受け取ったユーザーは、それらを使用してオブジェクトに対して一時的にアクセスすることが可能になります。

**ユースケース**
- 多数のバケットやプリンシパルが存在していて、それらを一元的に管理したい場合
- S3の階層に対してきめ細かく権限を設定したい場合
- IAMプリンシパルに限らず外部IDプロバイダを使用している場合
- セキュリティ要件等で一時的な認証として権限を払い出す必要がある場合


# 従来のアクセス管理
## S3バケットポリシー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/4b0d1bdc-b0ef-6594-59b5-06ec1fa147ec.png)
S3のバケットポリシーやIAMロールのポリシーでアクセス制御をする方針です。どちらかで許可されていればS3にアクセスすることが可能になります。階層を指定して権限を付与することも可能です。

**メリット**
- シンプルな構成で個人利用や小規模利用向け

**デメリット**
- 階層ごとの制限を付ける要件など、複雑な権限管理を行う場合にバケットポリシーも複雑になる
- バケット単位の設定のため、バケットが増えるにつれて管理が難しくなる
- IAM側で制御した場合、追加で必要となるバケットが増えるたびに各ロールのポリシーを変更する必要がある

## S3 Access Points

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/access-points.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/820fada3-c05c-47c1-652f-af6098be5a62.png)
Access PointsではアクセスポリシーによってS3に対するアクセス権限を管理することが可能になります。ユーザーやロールはアクセスポイントに対して、S3アクセスを実行することでS3のオブジェクトに対するアクセスを可能にします。
※上記ではアクセスポイントポリシーとロールポリシーと分けていますが、アクセスポイントポリシー内で完結することも可能です。

また、バケットポリシーでアクセスポイントからのみアクセスを許可する設定にすることで、よりセキュアなアクセス管理を行うことができるようになります。


**メリット**
- 複数のバケットが存在しており、アクセスを一元的に管理したい場合

**デメリット**
- 各アクセス ポイントは 1 つのバケットにのみ関連付けられており、アクセス ポイントの作成時にバケットを指定する必要がある
- アクセス ポイント ポリシーのサイズは 20 KBが制限のため、複雑なポリシー適用には不向き


# おわりに
S3 Access Grantsは主に大規模なエンタープライズ向けのアクセス管理において効果が発揮されそうです。よりセキュアに管理することができる一方で、一時的な認証になってしまうので、その管理をユーザー側が行う必要はありそうですね。
今後現場での活用ケースが挙がってくることが楽しみです。
Okta - Directory - Groups

# はじめに

今回はグループとルールについて記載していきたいと思います。


# Groups


### グループ作成
- Add Groupから作成できます。
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/13002328-0871-537c-8c95-ca51b59ad727.png)

### グループ削除
- 各グループの画面から Actiosn > Deleteで削除することができます。
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/897a398e-9b10-6cb8-9289-8907e47ca341.png)

### グループ検索
- 検索ボックスに検索文字列を入力して検索することができます。
    - 詳細検索は Advanced Search から実施できますが、2023/12/03時点では部分一致に対応していません。
- 詳細検索ではグループの属性値を指定して検索できます。
    - 指定可能な属性値
        - Created on
        - Last update on
        - description
        - name
        - その他追加した項目
            - Profile Editorからグループのプロファイルにも属性値を追加することができます。
            - 追加した属性値は詳細検索で指定できます。
    - 条件
        - Starts with
        - Equals
        - Greater than
        - Less than
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/086200df-30ed-5fca-b6a1-321e9239b499.png)
        - ちなみにOkta Expression Languageが使えないかなと思ってやってみましたが、ダメでした。
        - Starts withはsw、Greater thanはgtなどExpression Languageとは完全に別になっているようです。

### メンバー追加
- 各グループ画面の Assignp people からメンバー追加の画面を開けます。
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/6dd21ac9-4e28-aa49-36cf-68c82f68a5ab.png)
- 対象のユーザーの右側にある＋ボタンを押すとグループに追加できます。
    - 追加すると＋の部分にRemoveと表示されます。
    - 間違って追加してしまった場合はRemoveを押せばグループから削除することができます。
    - すべてのユーザーを追加し終わったらDoneを押して完了です。
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/66858c87-42ea-d6c4-6e5f-45feee758ee6.png)
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/d1dd54e0-d5a9-f00a-e988-2744815f15ba.png)

### メンバー削除
- メンバーの削除は各グループのPeopleのタブから実施します。
    - 対象ユーザーの右側に表示されている×ボタンを押すことで削除できます。
        - 「本当に削除してよいですか」といった確認は表示されないため注意してください。
    - 削除すると×の部分にAssignと表示されます。
    - 間違って削除してしまった場合はAssignを押せば再度追加することができます。
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/8719ebfe-fe92-9baf-860e-f85fe9962842.png)
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/f1df943c-883f-3e85-08a4-26a46f961634.png)


### エクスポート
- 特定グループのメンバーのエクスポートはReportsからできます。
- Reportsについてもカレンダーで記事作成予定のためそちらをご参照ください。


# さいごに
グループの管理自体は単純ですが、明日記載するルールを活用することでいろいろ便利になります。
グループをネストさせることができれば一番楽なんですけどね。。。
今回はここまで。ありがとうございました。
EC2の休止

###  EC2の操作
- 起動
    - 作成+起動
- 開始
    - 作成済で停止していたインスタンスの起動
- 再起動
    - インスタンスストアのデータは保持される
    - 同じホストコンピュータ上に保持
- 停止
    - 違うホストコンピューターに移動する可能性
- 休止
    - メモリをEBSルートボリュームに保存した後、シャットダウン
    - インスタンスストアのデータは失われる
- 終了
    - インスタンスの削除
Dynatraceのデータモデルはプロパティーグラフ?

こんにちは。Dynatrace井上です。

Dynatrace新世代プラットフォームのデータストアは`Grail`という名前なのですが実は最初の２文字 `GR` はグラフデータベースに由来しているんです。

Graph DBで有名な`Neo4j`のサイトに以下のページで完結に説明されていて、最初の方で `relationships` という単語が出てきます。

https://neo4j.com/docs/getting-started/appendix/graphdb-concepts/

このrelationshipを使ったクエリーはDynatrace旧世代でも可能です。例えば以下の例は2年以上前から使えてました。

https://community.dynatrace.com/t5/Dynatrace-tips/Pro-Tip-Tagging-entities-which-have-no-autotagging-rule-support/m-p/175701

この例で`relationship`で検索すると20個ぐらいヒットするのですがさてDynatraceでは合計何種類の entity 間の `関係性` の種類があるんでしょうか？

https://docs.dynatrace.com/docs/shortlink/grail-querying-monitored-entities#relationship-mapping-table

上の公式ドキュメントページの以下のテーブルの `Relationship name` カラムでかなり網羅してるはずです。
`Kubernetes` , `Azure` 固有のものなど含め 100 種類以上あります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109054/3ad84df5-925e-ca96-908a-51fe9d96942e.png)


参考になれば！
Dockerの役割とメリット

# Dockerの役割とメリット

Dockerは、近年急速に普及しているコンテナ型の仮想化技術です。開発から運用までのプロセスを簡素化し、より効率的なアプリケーション管理を可能にします。本記事では、Dockerの基本的な役割と、それがもたらすメリットについて解説します。

## Dockerの基本的な役割

Dockerは「コンテナ」という軽量な仮想環境を提供します。これにより、アプリケーションを環境から切り離して実行することが可能になります。

### コンテナ技術の基礎

- **独立性**: コンテナは他のコンテナやホストOSとは独立して動作します。
- **軽量性**: コンテナは仮想マシンに比べて起動が速く、リソース消費が少ないです。
- **移植性**: どの環境でも同じようにコンテナを実行できます。

### アプリケーションの分離と管理

Dockerはアプリケーションとその実行環境をコンテナ内に「包んで」管理します。これにより、開発環境と本番環境の差異によるトラブルを減らすことができます。

## Dockerのメリット

Dockerの導入により、開発から運用までの多くの面でメリットがあります。

### 環境構築の簡素化

- **再現性の高い環境**: Dockerfileを用いて、環境をコードで管理できます。
- **環境のセットアップの簡略化**: Docker Hub等を活かして必要な環境を素早く構築できます。

### 開発の効率化

- **統一された開発環境**: チームメンバー間で環境の違いによる問題を減らせます。
- **マイクロサービスアーキテクチャの促進**: 各サービスを独立したコンテナとして開発・運用できます。

### デプロイの迅速化

- **容易なスケーリング**: 負荷に応じてコンテナを追加・削済みできます。
- **CI/CDパイプラインの統合**: 自動化されたビルド、テスト、デプロイが可能です。

## まとめ

Dockerは、アプリケーションの開発から運用に至るまでのプロセスを効率化し、安定した運用を支援する重要なツールです。その独立性、軽量性、移植性により、開発の柔軟性が大幅に向上します。これからのソフトウェア開発において、Dockerの理解と活用は不可欠です。
MergeとRebaseの違い

# MergeとRebaseの違い

Gitはバージョン管理ツールとして広く使われており、その中でも`merge`と`rebase`はコードの統合において重要な役割を果たします。しかし、これら二つのコマンドは機能的には似ていますが、使い方や結果には大きな違いがあります。この記事では、`merge`と`rebase`の基本的な違いと、それぞれの特徴を初心者にも分かりやすく解説します。

## Mergeとは

`merge`コマンドは、二つの異なるブランチを統合するために使用されます。これは「マージコミット」と呼ばれる新しいコミットを作成し、二つのブランチの変更を統合します。

### Mergeの特徴

- **非破壊的操作**: マージは元のコミット履歴を保持し、新しいマージコミットで変更を統合します。
- **明瞭な履歴**: マージコミットにより、ブランチの統合が明確に記録されます。
- **簡単な衝突解決**: マージ時のコンフリクトは、マージコミットで一度に解決できます。

## Rebaseとは

`rebase`コマンドは、あるブランチの変更を別のブランチの上に「再適用」することでブランチを統合します。これにより、直線的なコミット履歴が作成されます。

### Rebaseの特徴

- **履歴の線形化**: `rebase`はコミット履歴を一本の直線上に整理します。
- **履歴の整理**: 不要なマージコミットがなく、履歴がクリーンに保たれます。
- **複雑な衝突解決**: `rebase`中のコンフリクトは、各コミットごとに解決する必要があります。

## MergeとRebaseの比較

`merge`と`rebase`は共にブランチの統合を目的としていますが、そのアプローチは異なります。`merge`は履歴の明瞭さを保つ一方で、履歴が複雑になる可能性があります。`rebase`は履歴を線形化し、よりクリーンに保つことができますが、衝突解決がより複雑になる可能性があります。

### どちらを選ぶべきか

- **チームプロジェクト**: チームで作業する場合は、`merge`を使うと履歴がわかりやすくなります。
- **個人の作業**: 個人で作業を進める場合や、クリーンな履歴を保ちたい場合は`rebase`が適しています。

## まとめ

`merge`と`rebase`は、それぞれ異なる状況や要件に応じて最適な選択肢となります。`merge`は履歴の明瞭さを、`rebase`は履歴の線形化と整理を重視します。どちらのコマンドを選ぶかは、プロジェクトの要件やチームの作業スタイルによって異なります。適切なコマンドを使うことで、効率的なバージョン管理とスムーズな開発プロセスを実現できます。
Git revert でコミットを打ち消す方法

## **はじめに**

開発プロセスでは、時には過去のコミットを打ち消す必要が生じることがあります。この記事では、Gitで最新のコミットを打ち消す方法を簡単に説明します。

## **Gitでのコミット打ち消しとは？**

コミットを打ち消す（revertする）とは、特定のコミットによって加えられた変更を無効にする新しいコミットを作成することを意味します。これは、コミット履歴を維持しつつ、そのコミットの影響を取り消したい場合に非常に便利です。

## **打ち消しを行う手順**

1. **最新のコミットを確認**:
**`git log`** コマンドを使用して最新のコミットを確認します。
2. **打ち消しコミットを作成**:
**`git revert HEAD`** コマンドで最新のコミットを打ち消します。**`HEAD`** は常に最新のコミットを指します。
3. **変更を確認**:
打ち消し後、**`git status`** と **`git log`** で変更を確認します。
4. **変更をリモートリポジトリにプッシュ** (オプション):
変更をリモートリポジトリに反映させるには、**`git push`** を実行します。

## **実践例: コミットの打ち消しとリモートへの同期**

次に、実際のGitリポジトリの例を用いて、コミットを打ち消すプロセスを詳しく見てみましょう。

### ステップ1: 最新のコミットを確認

リポジトリの最新のコミット状態を確認するために、以下のコマンドを実行します。

```bash
git log --oneline
```

```
6f8be3793 (HEAD -> test, origin/test) Revert "[sdk] add request params for x"
be62f70ac [sdk] add request params for x
2c4489c60 [sdk] Removing method from the abstract class as it's premature for enforcement and making minor adjustments to the delivery class
```

ここでは、**`be62f70ac`** というコミットが最初の状態であり、その後 **`6f8be3793`** というコミットによって打ち消されています。

### ステップ2: コミットを打ち消し

先ほどの例では、**`be62f70ac`** というコミット（**`[sdk] add request params for dmm`**）を打ち消すために、次のコマンドが実行されました。

```bash
git revert HEAD
```

### ステップ3: リモートリポジトリへの同期

最後に、ローカルリポジトリの変更をリモートリポジトリに同期するために、**`git push`** コマンドを実行します。

### 同期状態の図

以下は、revertとリモートへのpushを含む同期状態を示すかんたんな図です。

```
ローカルリポジトリ                   リモートリポジトリ
    |                                      |
    | --- be62f70ac [sdk] add params --->  |
    |                                      |
    | <--- 6f8be3793 Revert "[sdk] add --- |
    |                                      |
    | --- git push ----------------------> |
    |                                      |
```

この図は、ローカルリポジトリでのコミット打ち消し操作と、その後のリモートリポジトリへの同期プロセスを表しています。

## **注意点**

- 打ち消し操作は過去のコミットを削除するわけではありません。元のコミットは履歴に残り、打ち消しコミットが新たに追加されます。
- 打ち消しは、そのコミットの変更を逆に適用するため、コードの整合性に注意してください。

## **まとめ**

Gitでコミットを打ち消す方法は、コードの管理を行う上で非常に重要な技術です。
AWS認定 SAA-C03の再認定を受験してきた

2023/12/1に AWS Certified Solutions Architect - Associate (SAA) の更新の試験を受けてきて、何とか無事に更新することができました。
前回受験してから試験範囲などがいろいろ変わっていたので、個人的なメモも兼ねていろいろ書いていこうと思います。

# 試験の内容
前回と同じような感じかなーとなんとなく対策をはじめたのですが、2023/8/30から新試験(SAA-C03)になっていることがすぐに判明。急ぎ、試験範囲などの確認から。
[AWS Certified Solutions Architect - Associate (SAA-C03) 試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sa-assoc/AWS-Certified-Solutions-Architect-Associate_Exam-Guide.pdf?_gl=1*1qy2bn6*_ga*NjM3MTAzMzM0LjE3MDE1NTk2NjU.*_ga_3DYRMQRSBC*MTcwMTU1OTY2NS4xLjEuMTcwMTU1OTc5Ny4wLjAuMA..*_ga_8HHH4Y3BQE*MTcwMTU1OTY2NS4xLjEuMTcwMTU1OTc5NC4wLjAuMA..*_ga_JLVFK4B4F6*MTcwMTU1OTY2NS4xLjEuMTcwMTU1OTc5NC4wLjAuMA..*_ga_4H9BVML80W*MTcwMTU1OTY2NS4xLjEuMTcwMTU1OTc5NC41OC4wLjA.) として公開されていますので、ひととおり読んで確認。
## セキュリティやコストに関する出題比率が増えている
大きく４つの項目で出題比率が示されています。
SAA-C02の時のと比較すると、セキュリティ系のサービスや機能に関するものとコストに関するものの比率が増えているようです。
## 試験対象となるサービスは100を超えている
前回更新して以降は、新たなAWSサービスをほとんどトレースできていないのですが、試験ガイドの内容を見て、私の知らない新しいサービスが結構増えていることがわかりました。サービスの内容を理解していないと回答しようがないので、知っているサービスの機能アップデートと内容を含め、とりあえず記載されたサービスの内容をAWS公式ドキュメントやBlack Belt Online Seminarの資料を確認するなどで大まかにチェックしました。
## 出題サンプル
公式サイトの[サンプル問題](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sa-assoc/AWS-Certified-Solutions-Architect-Associate_Sample-Questions.pdf)や[模擬試験](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sa-assoc/AWS-Certified-Solutions-Architect-Associate_Sample-Questions.pdf) (昔と違って無料で受験できるようになりましたが、AWS Skill Builderに登録が必要です) で確認しました。
単純にサービスの内容を問うような問題はあまりなく、サービスの内容や特性は理解している前提で、ユーザーの要件や要望にあてはまるサービスの組み合わせやサービスの設定方法を問う問題が多い印象でした。お客様から要件を伺ってこれに対していかにベストな提案をするか、といった感じでしょうか。
私は文章読解が昔から苦手で、普段ドキュメントとかの読み解きにすごく時間がかかっています。「あー、今回は１発では更新できないかも・・・」と、不安に駆られながら学習を進めていました。
# 受験本番
自宅でのオンライン試験の選択肢もあったのですが、なんとなく自宅だと集中できなそうだったので、これまでどおりテストセンターに行って受験してきました。
試験時間は全体で2時間20分。いったん65問ひととおり回答を終わったタイミングで残り50分くらいでしたでしょうか。この時点でフラグ立ててた問題が15問くらい。まずはこれを再度見直して少し回答を修正。その後フラグ立ててなかった問題をもう１回さらっと見直して残り10分くらいで完了。
完了後アンケートがあったのでこれを３分くらいで回答して全て終了。
# 試験結果
前回受験した時には試験終了後即時に合否の結果がわかっていたのですが、今回は試験結果がすぐに判明しませんでした。試験結果の手応えがあまりよくなかったので、悶々とした気持ちでテストセンターを後にしました。
試験結果は最大5営業日以内でメールで通知されるとのことでしたが、AWS認定のページを直接確認するほうが早く結果がわかるという情報を得たので、隙間時間でこちらをチェックしていました。
結局、試験結果が判明したのは当日の20時ごろ。レポートのPDFも同時にダウンロードできました。合格の文字をみて本当にホッとしました。
試験結果のメールは翌日の20時ごろに送信されてきました。

# 所感
普段からAWSのサービス使い倒していたり、AWSを使ったさまざまなソリューションを提案しているような人を除き、再認定だからといって前回と同じような感じで試験に臨むのはあまりよくないかな、と思いました。
私の場合は普段AWSサービスはあまり携わっていないので、基本的な復習もしつつ新しいサービスも確認しつつでかなり学習コストかかりました。具体的に時間は記録していなかったのですが、忘れていることもかなり多くて、結局5〜60時間はゆうに勉強していたと思います。
また約３年後に更新試験に臨む必要があるので、その時に困らないように、普段から少しでもAWSサービスのアップデートなどをトレースするようにしたいと思いました。
【Ruby Gold3.1詰まったシリーズ】superでのメソッド呼出し

# はじめに
今回はsuperに関する内容です。superではスーパークラスのメソッドのみ呼び出すと理解していましたがそうではないらしいです。

# irbで確認してみた
環境はruby2.5.3です。
まず、SuperClsを継承したSubClsを作成し実行する。

~~~ruby
class SuperCls
  def hoge
    puts "SuperCls"
  end
end

class SubCls < SuperCls
  def hoge
    puts "SubCls"
    super
  end
end
~~~
hogeメソッドを呼び出すと、
~~~
irb(main):013:0> SubCls.new.hoge
SubCls
SuperCls
~~~
SubClsとSuperClsが表示され、同名メソッドを呼び出せました。

次に、ModモジュールをmixinしたClsを作成し実行する。

~~~ruby
module Mod
  def hoge
    puts "Mod"
  end
end

class Cls
  include Mod
  def hoge
    puts "Cls"
    super
  end
end
~~~
hogeメソッドを呼び出すと、

~~~
irb(main):014:0> Cls.new.hoge
Cls
Mod
~~~
ClsとModが表示され、同名メソッドを呼び出せました。

# おわりに
確認した結果、superではスーパークラスだけではなくmixinしたモジュールの同名メソッドも呼び出せることが分かりました。もし誤っていたらご指摘いただけると助かります！

# 参考
https://www.amazon.co.jp/gp/product/B0756VF9Y3/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1