OmniAICreator/Qiita-1.07M huggingface dataset:
letとlet!

`let`と`let!`
># let and let!

メモ化されたヘルパーメソッドを定義するために`let`を使う。値は同じexample内で複数回渡って呼ばれもキャッシュされるしかしexampleを跨ぐことはできない。
>Use `let` to define a memoized helper method. The value will be cached across multiple calls in the same example but not across examples.

`let`は遅延評価であることをご了承ください。最初それが定義するメソッドが呼び出されるまで査定されない。それぞれのexmapleの前でメソッドの発動を強制するために`let!`を使うことができる

>Note that `let` is `lazy-evaluated`: it is not evaluated until the first time the method it defines is invoked. You can use let! to force the method’s invocation before each example.

デフォルトによって`let`はスレッドセーフです。しかし`config.threadsafe`を無効によってスレッドセーフにならない。それにより`let`を少し早く処理させる。
>By default, let is threadsafe, but you can configure it not to be by disabling config.threadsafe, which makes `let` perform a bit faster.

#### メモ化　計算結果を覚えておく
https://qiita.com/masatom86650860/items/0a7d67dcd3cd219ff3f1

#### メモライズされたヘルパーメソッドを定義するために`let`を使う
>### Use `let` to define memoized helper method
```rb
$count = 0
RSpec.describe "let" do
  let(:count) { $count += 1 } # ヘルパーメソッドを定義している。exampleごとにキャッシュされない。内ではキャッシュされる。

  it "memoizes the value" do
    expect(count).to eq(1) # 同じ計算なのでメモ化されて同じ結果
    expect(count).to eq(1) 
  end

  it "is not cached across examples" do
    expect(count).to eq(2) # キャッシュされないのでcountの処理が実行されてしまう
  end
end
```
```
Run options: include {:full_description=>/let/}
2 examples, 0 failures, 2 passed
```
#### 確認してみた
```rb
$count = 0
RSpec.describe "let" do
  let(:count) { $count += 1 }

  it "memoizes the value" do
    p $count
    expect(count).to eq(1)
    expect(count).to eq(1)
    p $count
  end

  it "is not cached across examples" do
    p $count
    expect(count).to eq(2)
    p $count
  end
end
```
```
0
1
1
2
2 examples, 0 failures, 2 passed
```
#### `before`フック内で呼ばれたメモ化されたヘルパーメソッドを定義するために`let!`を使う
>### Use let! to define a memoized helper method that is called in a before hook
```rb
$count = 0
RSpec.describe "let!" do
  invocation_order = []

  let!(:count) do # let!でexmapleの前でメソッドの発動を強制
    invocation_order << :let!
    $count += 1
  end

  it "calls the helper method in a before hook" do
    invocation_order << :example
    expect(invocation_order).to eq([:let!, :example]) # exampleの前に入れられ、ここでも入れられている
    expect(count).to eq(1) #exampleの前に一回実行されている
  end
end
```
```
Run options: include {:full_description=>/let!/}
1 example, 0 failures, 1 passed
```

https://rspec.info/features/3-13/rspec-core/helper-methods/let/L
ハンディ型3Dスキャナーの主な用途について

近年、ハンディ型3Dスキャナーはその軽量で柔軟な特性により、多くの分野で活用されるようになりました。このデバイスは物体の表面の3次元データを迅速に取得し、デジタルモデルに変換することができます。その応用範囲は、工業デザイン、医療、文化財の保護など、多岐にわたります。以下では、ハンディ型3Dスキャナーの具体的な用途について詳しく解説します。

---

#### 1. 工業デザインと製造

**1. 逆設計（リバースエンジニアリング）**  
工業製造分野では、逆設計が重要な応用分野の一つです。ハンディ型3Dスキャナーを使用すると、既存の製品の3次元データを簡単に取得し、分析や最適化、製品の再現に役立てることができます。たとえば、部品の設計図が紛失した場合でも、スキャナーを使ってモデルを生成し、再製造することが可能です。この方法は、時間を節約するだけでなく、手動計測の誤差も削減します。

![24d176a07c6ba3f9f7849131835064a1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/a638b319-0ee2-50cb-c8f4-c77a061308ed.png)

**2. 製品開発**  
新製品の開発段階では、ハンディ型3Dスキャナーが手作りのモデルや試作品を迅速にデジタル化し、設計者がソフトウェア上で直接データを修正・最適化することができます。特に複雑な構造を持つ製品の設計には、このツールが欠かせません。

---

#### 2. 医療とヘルスケア

**1. 医療器具のカスタマイズ**  
医療分野では、個別対応が非常に重要であり、ハンディ型3Dスキャナーがそのニーズを満たしています。たとえば、義肢や矯正器具、歯科治療器具の設計において、スキャナーは患者の体型データを正確に取得し、オーダーメイドの製造をサポートします。従来の型取り方法と比較して、3Dスキャニングは効率的で、患者への負担も少なく、精度も高いです。

![a501e25e34a24c93d88c2986fb29417b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/120796ff-8296-88ac-fd20-73214e2ab81b.png)

**2. 人体データの収集**  
リハビリ治療や美容整形手術の際には、患者の体型変化をスキャナーで記録し、適切な治療計画の設計に役立てることができます。この非侵襲的な方法は効率を高めるだけでなく、患者の快適性も向上させます。

---

#### 3. 文化財の保護

**1. 文化財のデジタル化記録**  
ハンディ型3Dスキャナーは、文化財の保護においても大きな利点があります。スキャナーを使用することで、文化財を非破壊でスキャンし、高精度のデジタルモデルを生成できます。これにより、記録や研究、さらには文化財の保存や修復に役立ちます。特に壊れやすい文化財や移動が困難な場合、この技術は非常に有効です。

![13b4a225d7c4bbc8b8a11237eb37f841.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/1372a5e0-cbf5-1d75-3cd2-6d6e95cbccaf.png)


**2. バーチャル展示とインタラクション**  
多くの博物館や文化機関では、貴重な文化財を3Dスキャナーでデジタル化し、オンライン展示を行っています。観覧者は多角的に鑑賞できるだけでなく、VR技術を通じて歴史や文化をより深く体感することができます。

---

#### 4. エンターテインメントとアート制作

**1. ゲームと映像制作**  
映像やゲーム産業では、ハンディ型3Dスキャナーが俳優や物体、さらにはシーン全体の3次元データを取得するために利用されています。スキャンされた高精度なモデルを使用することで、リアルなデジタルキャラクターや特殊効果のあるシーンを迅速に制作でき、手動モデリングの時間とコストを大幅に削減します。

![5ae12fa1067e07b97e05f94f02f7cbe0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/18d3ddb6-aa2e-5ecb-f85a-06ce6094b08d.png)

**2. 芸術作品の制作と複製**  
ハンディ型3Dスキャナーは、アーティストに新たな可能性を提供します。既存の作品をスキャンし、それをデジタルファイルに変換して修正・再創作することが可能です。また、3Dプリント技術を活用してデジタルモデルを実体化し、展示用やコレクション用に複製することもできます。

---

#### 5. 教育と研究

**1. 実践的な教育ツール**  
教育分野では、ハンディ型3Dスキャナーが非常に実用的な教育補助ツールとして活躍しています。学生は日常的な物体をスキャンして、3Dモデリングの原理を学ぶことができ、さらに3Dプリント技術と組み合わせることで、スキャンから実体製作までのプロセスを体験できます。このような実践的な教育は、理論をよりわかりやすく、楽しいものにします。

**2. 研究の補助**  
科学者が複雑な構造物を研究する際、3Dスキャン技術は大きな支援を提供します。たとえば、古生物学では化石をスキャンしてデジタルモデルを生成し、遠隔での分析や復元に役立てています。また、地質学や材料科学などの分野でも幅広く利用されています。

---

#### 6. 個人向けカスタマイズサービス

**1. オーダーメイド商品**  
ハンディ型3Dスキャナーは、日常生活にも進出しつつあります。たとえば、顧客の顔や体のデータをスキャンして、個性あふれるジュエリーや眼鏡、衣類を製作することができます。また、フィギュアや模型をスキャンしてカスタマイズしたデザインに仕上げることも可能です。

![f91320e89da7289406cf16a043db5733.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/178bcff7-0b6b-7c09-09ac-fd9984eeca70.png)

**2. DIYや3Dプリント**  
3Dプリント愛好家にとって、ハンディ型3Dスキャナーは非常に魅力的なツールです。好きな物体をスキャンしてデジタルモデルに変換し、それを個性的にアレンジしてプリントアウトすることができます。この自由な創作体験は、DIY愛好家に無限の可能性をもたらします。

---

強力な 3D デジタル化ツールをお探しの場合は、ハンドヘルド 3D スキャナーを試してみるとよいでしょう。これは、あなたの仕事や生活に新しい経験と驚きをもたらすかもしれません。

https://www.revopoint3d.jp/

https://www.revopoint3d.com/
【備忘録】開発中に使うGitコマンド

# 前提

以下の記事内の用語を
理解していることを前提としています。

https://and-ha.com/coding/beginners-guide-basics-git/

具体的な使用場面をイメージしたい場合は、
以下の記事を参照してください！

https://www.r-staffing.co.jp/engineer/entry/20190621_1

# 開発

## ブランチの作成
- `git switch`  
  指定したブランチに切り替える。

- `git switch -c`  
  新しいブランチを作成してそのブランチに切り替える。

- `git branch ブランチ名`  
  新しいブランチを作成するが、切り替えはしない。

## ブランチ内での作業

### 現状確認のコマンド
- `git status`  
  変更されたファイルの状況やステージングの状態を確認する。

- `git diff`  
  作業しているブランチとステージングエリアの差分を確認する。

- `git log`  
  コミット履歴を確認する。

- `git reflog`  
  ブランチの変更履歴や過去の状態を確認する。（resetなども含む）

- `git branch`  
  ローカルのブランチ一覧を表示し、現在のブランチを確認する。

### 途中の作業の退避・適用

- `git stash -u`
  一時的に作業内容を退避させる

- `git stash list`  
  一時的に退避させた作業内容（stash）の一覧を表示する。

- `git stash pop stash@{数字}`  
  指定したstashを元に戻して適用し、stashリストから削除する。


### 機能作成に1段階つく
- `git add ファイル名`  
  指定したファイルをステージングエリアに追加する。

- `git commit -m "コミットメッセージ"`  
  ステージングエリアの変更をコミットに記録する。

【コミットメッセージの書き方】

https://qiita.com/konatsu_p/items/dfe199ebe3a7d2010b3e

### 目的の機能作成を終えた後
- `git push origin ブランチ名`  
  ローカルブランチの変更をリモートリポジトリにプッシュする。


### ブラウザのGitHubに移動した後
1. Pull Requestを作成し、変更内容を確認する。  
2. 内容が問題なければMergeする。

## ブランチ側で `main` を統合する
- `git merge main`  
  現在のブランチに `main` ブランチの変更を統合する。

- `git rebase main`
  以下の記事を参照してください、図解して分かりやすくまとめられています！
  

https://qiita.com/C_HERO/items/06669621a1eb12d8799e


## リモートリポジトリの内容をローカルに反映
- `git pull origin ブランチ名`  
  リモートリポジトリの指定ブランチの変更をローカルに取り込む。

- `git fetch origin ブランチ名`
  他の人が作成したブランチを取り込む。
  
https://zenn.dev/kiko/articles/9689d9bbe032f7
メモ化　メモライズ

# 計算結果を記憶し、同じ計算をしないよう無駄を省く

>メモ化（Memoization）とは、プログラミングにおいて、`関数の計算結果を記憶しておき、同じ計算を繰り返さないようにする`最適化技術の一つです。これにより、特に計算に時間がかかる関数や、何度も同じ入力値で呼び出される関数のパフォーマンスを向上させることができます。

https://cryptobk.jp/?words=%E3%83%A1%E3%83%A2%E5%8C%96%E3%81%A8%E3%81%AF#:~:text=%E3%83%A1%E3%83%A2%E5%8C%96%EF%BC%88Memoization%EF%BC%89%E3%81%A8%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AB%E3%81%8A%E3%81%84%E3%81%A6%E3%80%81%E9%96%A2%E6%95%B0%E3%81%AE%E8%A8%88%E7%AE%97%E7%B5%90%E6%9E%9C%E3%82%92%E8%A8%98%E6%86%B6%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8D%E3%80%81%E5%90%8C%E3%81%98%E8%A8%88%E7%AE%97%E3%82%92%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%95%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E6%9C%80%E9%81%A9%E5%8C%96%E6%8A%80%E8%A1%93%E3%81%AE%E4%B8%80%E3%81%A4%E3%81%A7%E3%81%99%E3%80%82%E3%81%93%E3%82%8C%E3%81%AB%E3%82%88%E3%82%8A%E3%80%81%E7%89%B9%E3%81%AB%E8%A8%88%E7%AE%97%E3%81%AB%E6%99%82%E9%96%93%E3%81%8C%E3%81%8B%E3%81%8B%E3%82%8B%E9%96%A2%E6%95%B0%E3%82%84%E3%80%81%E4%BD%95%E5%BA%A6%E3%82%82%E5%90%8C%E3%81%98%E5%85%A5%E5%8A%9B%E5%80%A4%E3%81%A7%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%95%E3%82%8C%E3%82%8B%E9%96%A2%E6%95%B0%E3%81%AE%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%82%92%E5%90%91%E4%B8%8A%E3%81%95%E3%81%9B%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

>プログラムの高速化のための最適化技法の一種であり、サブルーチン呼び出しの`結果を後で再利用するために保持`し、その`サブルーチン（関数）の呼び出し毎の再計算を防ぐ`手法である。メモ化は構文解析などでも使われる（必ずしも高速化のためだけとは限らない）。キャッシュはより広範な用語であり、メモ化はキャッシュの限定的な形態を指す用語である。


https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E5%8C%96#:~:text=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%9C%80%E9%81%A9%E5%8C%96%E6%8A%80%E6%B3%95%E3%81%AE%E4%B8%80%E7%A8%AE%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81%E3%82%B5%E3%83%96%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%AE%E7%B5%90%E6%9E%9C%E3%82%92%E5%BE%8C%E3%81%A7%E5%86%8D%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E4%BF%9D%E6%8C%81%E3%81%97%E3%80%81%E3%81%9D%E3%81%AE%E3%82%B5%E3%83%96%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3%EF%BC%88%E9%96%A2%E6%95%B0%EF%BC%89%E3%81%AE%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E6%AF%8E%E3%81%AE%E5%86%8D%E8%A8%88%E7%AE%97%E3%82%92%E9%98%B2%E3%81%90%E6%89%8B%E6%B3%95%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E3%83%A1%E3%83%A2%E5%8C%96%E3%81%AF%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90%E3%81%AA%E3%81%A9%E3%81%A7%E3%82%82%E4%BD%BF%E3%82%8F%E3%82%8C%E3%82%8B%EF%BC%88%E5%BF%85%E3%81%9A%E3%81%97%E3%82%82%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%AE%E3%81%9F%E3%82%81%E3%81%A0%E3%81%91%E3%81%A8%E3%81%AF%E9%99%90%E3%82%89%E3%81%AA%E3%81%84%EF%BC%89%E3%80%82%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%AF%E3%82%88%E3%82%8A%E5%BA%83%E7%AF%84%E3%81%AA%E7%94%A8%E8%AA%9E%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81%E3%83%A1%E3%83%A2%E5%8C%96%E3%81%AF%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%AE%E9%99%90%E5%AE%9A%E7%9A%84%E3%81%AA%E5%BD%A2%E6%85%8B%E3%82%92%E6%8C%87%E3%81%99%E7%94%A8%E8%AA%9E%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82
【雑記】リモートワークから出社するようになって感じたこと

# サマリ
https://qiita.com/san_bay3/items/734cb4de41392b22f737

２年前にリモートワークに関する記事を書いたのですが、
ここ１年近くは逆にほぼ出社するという働き方に変わったので、
リモート→出社に切り替わることで感じたことを簡単に記しました。


# 背景
先般某L社の働き方のアップデートに関するニュースがSNSでも賑わいを見せました。

https://www.lycorp.co.jp/ja/news/announcements/016684/

ふと自分の働きかたを見ると、
もともと出社、コロナを契機に２年以上リモートワーク、そして今再度出社（時々リモート）という形で働き方が変わってきているので、振り返りの意味を込めて残しておこうと思いました。
※再度出社に戻ったのは、チームメンバやプロジェクトも入れ替わったりして今は出社の方がたまたま多いというだけで、特に会社の方針として必須になったわけではありません。

# 対象読者
- 働き方・働く場所の違いに関して気になる方

# 前提（自分の働き方について）
- 自身はリモートは２～３年近く実施（リモートワーク時は頻度は月１回も出社しないぐらい、出社しても他の人と会うことはあまりない）
- 現在はほぼ出社（週〜隔週に１度ぐらいでリモートワークは実施中）

:::note warn
留意事項
業務内容・業務形態・環境によっては感じ方は異なるためあくまで個人の感想であることをご了承ください
:::

# 感じたこと
[前回の記事](https://qiita.com/san_bay3/items/734cb4de41392b22f737)では（リモートワークが直接的な原因であるかはさておき）リモートワークにおける気持ちの憂鬱さを改善するために試したことという観点で書きましたが、
今回はHow toというよりは働き方が変わることにより**感じたこと**を残したいと思います。

（凡例　〇：よかったこと、△：あまりよくなかったこと）

### 〇：やはり、一人で抱え込むことが減る
チャットや電話、Web会議等はあるとはいえ、
相手の状況が見えないと雑談がしにくかったり、気を使ったりすると思うのですが、（少なくとも自分はそうでした）
会社で顔合わせて話をするのではやっぱり気持ちの晴れ具合が違いますね。
ちょっとした雑談も気軽にできますし、ばったり会った人と久々に会話したり、
歳の近いメンバとわちゃわちゃしたり、
上の役職の人と挨拶が出来たり…等々、
家だとないコミュニケーションが出来て気持ちが自分の内側でなく外向きになる感じがしました。
（少しですが徒歩移動により運動量も増えますし⚪︎）

### △：気遣いは増える
一方で、作業に集中したいときに声をかけられたり
チームメンバの様子が目に入る分帰りづらかったり等、
リモートワーク時にはなかった気遣いも出てくるのは正直なところです。
（リモートワーク時も集中したい時に連絡が来ること自体はあると思いますが、
　本当に集中したい時はチャットや電話の通知を切るという手もありますし、
　対面の場合はより声掛けしやすい/声掛けされやすいかと思います。）

だたこちらに関しては自分も声かけてかなり助けてもらっている分お互い様ですが・・・

### 〇：微妙な空気感をつかむことが出来る
打合せやエスカレーション後の本音の話って打合せが終わった後の数分であったりするものだと思います。
（「先方はああはいうけどさぁ…」というようなちょっとした話）
しっかりした作戦会議だともちろんリモートメンバ・出社メンバ合わせて事後にやる必要があるかと思いますが、
Web会議をつなぎっぱなしでするほどでもないほんとに細かい本音の話は出社することでできたり聞けたりして、
場の空気感・温度感を敏感につかむことが出来るというのも意外とメリットかと思いました。

もちろんそういった空気感の共有により関係性も深まったりすると思うので、
その辺りもいいことだと感じます。


### △：コストが増える
お金、時間ともに増えました。
身なりを整えたり、電車に揺られて移動したりとあらゆる時間がかかってきますし
この辺り以前は学習時間にあてたり家事にあてたりできていたので、
正直マイナスかなぁと感じています。

あとお金でいうと、昼食は家で用意した方が圧倒的に安上がりなので、
昼食費も少し上がりました。

### 〇：自分だけではないとわかる
ほぼ完全リモートワークしているときは、しんどさが自分の分しかあまり見えなかったのですが、
出社すると周りで大変な人もたくさんいることが見え、
ある種の安心感がありましたし、
見える分相互にサポートし合いやすいというのはいいことかなと思いました。

### △：他人のストレスが伝染する
上の逆で、イライラを外に出しやすい人がいると、
それがこっちまで伝わってきてストレスになるケースがありました。
個人的には結構他人の気分を感じ取りやすい方だと思うので、
あまり気にしないように席を外すとか心を無にする必要があり、地味にこたえました。

# まとめ

正直、作業のしやすさ・ライフワークバランスのとりやすさから基本リモートワークが働きやすいとは思いつつ、
精神衛生観点、対面ならではの雰囲気、カジュアルなコミュニケーションのしやすさなどから
出社もある程度必要というのが個人的な感覚です。



業務内容にもよりますが、週１，２出社ぐらいがちょうどいいかなぁと思っています。
（まだ自宅〜会社がそこまで遠くないのでそういえますが、遠かったらもう少し出社頻度は下げたいです・・・笑）

この辺り会社としてどう定めるかはいかにチーム、ひいては事業がうまく回るか（コミュニケーションの質・スピードだけでなく社員のモチベーション維持も含めて）
かなと思うので、
方針出す側はすごく頭を抱えるのかなと思いました。（知らんけど

社員側である自分の立場としては、家庭環境や仕事のスタイルなど含めやはりその人にあった働き方を柔軟に選択・そして周りがそれを尊重できる環境であってほしいなとは思いました。（漠然

やはり何事も一長一短なので0,100でなくグラデーションが望ましいですね…！
SymantecEndpointProtectionで[プライバシーとセキュリティ] パネルに [許可] オプションが表示されない場合の対処法

# 前書き
- 年末年始に業務用PC(mac)で重くなっていたウィルスソフトを再インストールしたところ、システム拡張の許可がGUIで表示されずに困ったため共有

# 発生したOSバージョン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118286/e796c0d1-7ba3-2bd2-ecca-d0061639c7f5.png)

# 発生した事象
- SymantecEndpointProtectionのインストール後にシステム拡張機能の許可ボタンが表示されない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118286/dc68043a-99fa-d6aa-54d2-a074254cb96e.png)

- 上記キャプチャの**ここをクリックして再試行してください**を押下してもプライバシーとセキュリティ画面が開くだけで許可するボタンが表示されない。(なんで。。。。どうして。。。)

# 解決策

- 「一般」 => 「ログイン項目と拡張機能」=> 「エンドポイントセキュリティ機能拡張」 => 「i」を押下してトグルを許可の状態にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118286/50d7b3dc-b0f7-b78d-01bd-a2ab0be477b7.png)


# 解決の糸口

- 色々調査を進めるうちにmacOSのVentura以降では、拡張機能の構築方式？が変化したという事が判明
  - macOS Catalina(10.15)以前
      -  kext（カーネル拡張）方式でカーネル上に拡張機能を構築
      - macOS Big Sur（11.0）以降で非推奨
      - macOS Ventura（13.0）以降で完全廃止
  - macOS Catalina(10.15)以降
      - システム拡張（System Extensions）方式でユーザスペース上に拡張機能を構築
- システム拡張方式の状態を調べる方法がないか確認したところ、以下のコマンドで実施できることが判明

```bush:bush
systemextensionsctl list
```

- 管理者権限で実行したところ以下の結果になり試して解決


```
# 実行結果

sh-3.2# systemextensionsctl list
1 extension(s)
--- com.apple.system_extension.endpoint_security (Go to 'System Settings > General > Login Items & Extensions > Endpoint Security Extensions' to modify these system extension(s))
enabled	active	teamID	bundleID (version)	name	[state]
	*	ABCDEFGHIJ	com.broadcom.mes.systemextension (9.6.0/9.6.0)	Symantec System Extension	[activated waiting for user]
```

↑要約すると、ユーザ操作が必要で、確認待ち状態だから解決策のところに記載した操作を実施してねって書いてある

# 最後に

- ググってもネットワーク設定の見直しやポートが遮断されているなどの情報が出てきてかなり解決に苦労した
- 解決のために以下を実施しても解決しないときは正直諦めようかと心が折れかけた。。。笑
    - インターネットのアクセスポイントを変更して再インストール
    - Symantecのサイト等にアクセスできるか確認
    - ポートが開いているか調べる
    - コマンドでシステム拡張を許可しようとしてみてみる
- こちらの記事が誰かの役に立てばとても嬉しいです！

# 関連URL

- [[プライバシーとセキュリティ] パネルに [許可] オプションが表示されず SEP for mac のインストールに失敗する](https://knowledge.broadcom.com/external/article/259755/sep-for-mac.html)
S3バケットへのPUT起因でLambdaを並列実行させる

どうも、もう立派な大人なので、会う人会う人に年の瀬という言葉を多用している者です。

今回は、Lambdaの実行上限時間による制限を喰らい、Lambda関数を使ってDBからCognitoへの大量のユーザデータ登録ができなかったので、実行上限時間を回避した方法を紹介します。

# 目次
1. 背景
1. Lambdaの実行上限時間を回避する方法を考える
1. S3パケットへのPUT起因でLambdaを並列実行させるときのポイント
1. おわりに

# 1.背景
DBに格納されている大量の情報をCognitoに登録したく、Lambda関数を作成して実行しましたが、件数が多すぎてLambdaの実行上限時間を超えてしまいました。また、Lambdaの制約だけではなくCognitoのパフォーマンス観点からも膨大な時間をかけないと、目的を達成できないことがわかりました。
そこで、Lambdaを並列実行させることで、この問題を回避したので、その方法を紹介します。

ちなみに、本記事の執筆時点では、Lambdaの実行上限時間は引き上げられないです。

# 2.Lambdaの実行上限時間を回避する方法を考える
#### 実行方法を考える
まず、実行上限時間を回避させる方法は、ざっと4種類くらいありますかね？
1. 分割処理
1-1：長時間実行するタスクを小さな処理に分割し、複数のLambda関数やステートレスなワークフローで実行する
1-2：StepFunctionsを使って複数のLambdaを連続して呼び出すワークフローを構築する
1. 異なるサービスの使用
AWS EC2やAWS Fargateのようなサービスを使う
1. Lambda関数の再トリガー
処理の途中で状態を保存し、再度Lambdaを呼び出す仕組みを構築。SQSやDynamoDBを活用して状態管理する
1. バッチ
バッチ処理で実行する

今回は、DBからデータを抽出して、そのデータをCognitoへ登録するというユースケースなので、DBからデータを抽出してS3バケットにファイルを格納するLambdaと、S3バケットへのPUT起因でCognitoにデータを登録するLambdaの2つのLambdaを作成しました。ファイルがPUTされるたびに、2つめのLambdaが実行(並列実行
)されます。

#### 実行フロー
1. 1つめのLambdaでDBからデータを抽出し、件数ごとにファイルを作成しS3の任意のディレクトリにPUT
1. S3にファイルがPUTされることでLambda関数をトリガー
1. 2つ目のLambdaが1つ目で抽出したファイルからデータを読み取りCognitoに登録

これによって、S3の特定のディレクトリにPUTされたファイル数分、Lambda関数が並列的に実行されます。ファイルを分割することで、1つのLambdaが実行される時間を短縮できるので、実行上限時間にひっかかることなく処理が完了できました。

# 3.S3パケットへのPUT起因でLambdaを並列実行させるときのポイント
本章では、ハマりそうなポイントを紹介します。
#### １：S3の設定方法
S3バケットのディレクトリへのイベント発生時の処理は、該当のS3バケット > プロパティ > イベント通知で設定することができます。
ここでは、targetディレクトリに、あらゆるファイルが、あらゆるイベント形式で実行されたときを発動条件と設定しています。
![スクリーンショット 2024-12-31 16.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/3f7c91ab-9bb8-8cd2-c061-a4355fdeeb34.png)

ここでは、トリガーするLambdaを設定します。
![スクリーンショット 2024-12-31 16.37.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/bd64566f-9bc5-a18a-c05a-e52ed13ac041.png)

これで、targetディレクトリにファイルがputされたときに指定したLambdaへファイル情報を送信することができます。Lambdaではイベントとしてその情報を受け取ります。

#### ２：PUT起因でトリガーされるLambdaに渡すもの
S3からLambdaに渡されるものは、ファイルそのものではなく、ファイルのありかを含むイベント情報が渡されます。Recordsと呼ばれるイベントの中に、ファイルを取得するためのkey情報があるので、そのkey情報を元にファイルとダウンロードすることで、当該Lambdaでファイルを処理することができます。以下に簡易的な例を示します。
```python:Lambda
import boto3

def lambda_handler(event, context):
    s3 = boto3.client('s3')
    for record in event['Records']:
        bucket_name = record['s3']['bucket']['name']
        object_key = record['s3']['object']['key']

        # ファイルをダウンロード
        s3.download_file(bucket_name, object_key, f"/tmp/{object_key.split('/')[-1]}")

        # ファイルを処理
        print(f"File {object_key} from bucket {bucket_name} has been downloaded and processed.")

```


#### ３：Cognitoのパフォーマンス制限(クウォータ制限)のケア
Cognitoでは、一定のリクエスト数を超えるとスロットリングが発生します。
今回、Lambdaを並列実行することで、Lambdaの制限には引っかからないようになりましたが、分割したデータが記述されたファイルの数が多く、Cognitoではスロットリングが発生してしまいました。

これに対処するためには、以下２つの方法があります。
1. リクエスト上限の引き上げをAWSに申請する
1. ファイルを直接targetディレクトリにPUTするのではなく、tmpディレクトリにPUTし、Cognitoへの登録状況に合わせて、手動でファイルをtmpディレクトリからtargetディレクトリにアップロードする

ちなみに現時点で、Lambdaは実行上限時間を引き上げることはできませんが、Cognitoのクウォータは引き上げることができちゃいます。

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/quotas.html


# おわりに
今回は、Lambdaの実行上限時間を回避するために、S3バケットへのPUT起因でLambdaを並列実行させる方法を紹介しました。

対戦ありがとうございました。
【AWS SAA-C03】初心者がAWSの求めることを理解して、SAAに合格した話

# 背景
2024年12月8日、AWS Certified Solutions Architect - Associate(SAA-C03)に合格しました。

私は今年からエンジニアとして働き始め、それまでは大学院の研究でプログラミングは経験していたものの、Web系の技術には一切縁がない状態でした。AWS自体は10月から社内勉強会に参加するなどしていましたが、本格的に勉強したのは3週間くらいです。手応えは微妙だったのですが、得点は742点でなんとか合格でした。（合格点は720点なので結構ギリギリです）

この手の合格体験記は世に溢れていますが、似た境遇の人に役に立てばと思い筆を取ります。

:::note
試験が迫って焦っている人にこそ届けたい、知識は足りないけど試験の本質を理解してなんとか受かった、という話です。
:::

:::note warn
理想的な勉強法は置いておいて、勉強に取り組む上で何を意識すればいいのかあたりをつけるためにこの記事を活用してください。
:::

# 目次
- [実際受けてみて重要だと思ったポイント](#実際受けてみて重要だと思ったポイント)
    1. [AWSは売り込みたい機能の便利さをアピールしたい](#1awsは売り込みたい機能の便利さをアピールしたい)
    2. [フレームワークの柱の理解はすごく大事](#2フレームワークの柱の理解はすごく大事)
    3. [問題をよく読んで必要な情報を抽出しよう](#3問題をよく読んで必要な情報を抽出しよう)
- [試験直前にやったこと](#試験直前にやったこと)
- [まとめ](#まとめ)

# 実際受けてみて重要だと思ったポイント
私が重要だと思ったポイントはズバリ以下の点です。
1. AWSは売り込みたい機能の便利さをアピールしたい
1. [フレームワークの柱](https://docs.aws.amazon.com/ja_jp/wellarchitected/2022-03-31/framework/the-pillars-of-the-framework.html)の理解はすごく大事
1. 問題をよく読んで必要な情報を抽出しよう

## 1.AWSは売り込みたい機能の便利さをアピールしたい
これは私の所管であり勉強会のメンターをしてくださった方の受け売りでもありますが、この試験はAWSが売り込みたい機能の便利さをアピールするために試験問題を作ります。
開発者の視点から見ても、今までも存在した複数の機能を組み合わせて作るよりも、一発でこれさえあればできる！というサービスがあれば満足度も高いですよね。なのでそういう選択肢が問題に出てきたら、頭の中では(この機能アピールしたいんだろうなぁ...)と思っておくと、最後の二択になった時確実に正解に近づきます。

## 2.フレームワークの柱の理解はすごく大事
[フレームワークの柱](https://docs.aws.amazon.com/ja_jp/wellarchitected/2022-03-31/framework/the-pillars-of-the-framework.html)は、システムを構築する土台となる考え方です。
- 運用上の優秀性
- セキュリティ
- 信頼性
- パフォーマンス効率
- コスト最適化
- サステナビリティ

の項目があり、それぞれが問題文に出てくる課題を解決する上で参考になるベストプラクティスです。もちろんこれらの項目の一つひとつを細かく暗記している必要はないのですが、概念について理解しておく必要はあります。問題を解くときに選択肢の中から選んだ理由、選ばなかった理由をこの概念に従って論理的に説明できるようになっておく必要があると思います。

## 3.問題をよく読んで必要な情報を抽出しよう
2.の項目につながる(というかほぼ同じ)のですが、問題文の条件によって選ぶべき選択肢が違います。コストダウンしたいのか、セキュリティを強固にしたいのか、シンプルなアーキテクチャにしたいのか、など。繰り返し問題を解いていると、脊髄反射で選択肢が選べるようになる(問題もあり)ます。

# 私の勉強法
私は、基本的に問題を解きまくるスタイルで勉強しました。メモにNotion、問題集に[Ping-t](https://mondai.ping-t.com/question_subjects/72)、調べたり壁打ちをするのにChat-GPTを使って、勉強中はそれらを画面に表示しながらやっていたイメージです。
Ping-tはとにかく繰り返し不正解の問題が無くなるまで繰り返しました。ほとんどは模試形式というよりもそれぞれの分野の基礎問題で、【試験レベル】の問題を解きました。ただ基礎問題を全て解いた後に試験レベルの問題を解いた時、難易度にギャップを感じたのも事実なので、最初に解いてみてレベル感を把握してからインプットをしていくのもいいかもしれません。
問題を解いて疑問に思った点を聞いたり、自分の理解が曖昧なところを壁打ちするのにChat-GPTを使っていました。しかしそれだけでは正確性に欠けたり、実際の画面を見ることができなかったりするので、公式のドキュメントや記事で情報を補っていくのがいいと思います。
# まとめ
最終的に合格することはできましたが、足りない知識はたくさんあるのでこれからも勉強し続けていきたいと思います。この記事が参考になる方がいたら幸いです。
Pythonでのデータ型、形状（シェイプ）


データの形状（シェイプ）やデータ型に関連してPythonの`pandas`と`numpy`を使って、**データの形状**や**データ型**を確認する方法について説明します。

### 1. データの形状（シェイプ）とは？

データの形状（シェイプ）とは、配列やデータフレームの**次元ごとの要素数**を示します。例えば、2次元のデータであれば、行数と列数が形状として表現するようになります。

### 2. クラスのテストの平均点を使ってデータの形状と型を確認する

クラスのテスト点数のデータを使って、**データ型**や**形状**を確認する方法を紹介します。以下のコードを実行します。

```python
import numpy as np
import pandas as pd

# クラスのテスト点数データを仮定
np.random.seed(0)  # シードを設定
test_scores = np.random.randint(50, 100, size=10)  # 50〜100の範囲でランダムな点数（10人分）

# データフレームの作成
data = pd.DataFrame({'Test Scores': test_scores})

# データ型の確認
print("データ型:", type(data))  # pandas DataFrame の型

# データフレームの形状の確認
print("データの形状:", data.shape)  # (行数, 列数)

# テスト点数の平均を計算
average_score = data['Test Scores'].mean()
print("クラスのテストの平均点:", average_score)

# 各点数が平均点からどれくらい離れているかを計算（偏差）
data['Deviation from Average'] = data['Test Scores'] - average_score
print("\nデータフレームに偏差を追加:\n", data)

# 1次元配列としての操作
test_scores_array = data['Test Scores'].values  # Test Scores列を1次元配列として取得
print("\nTest Scores の1次元配列:\n", test_scores_array)

# 配列の形状の確認
print("Test Scores 配列の形状:", test_scores_array.shape)
```

### 3. コードの解説

#### 1. ランダムなテスト点数の生成

```python
test_scores = np.random.randint(50, 100, size=10)
```
この行では、50〜100の範囲でランダムに10人分のテスト点数を生成しています。`np.random.randint()`を使って整数のランダムな配列を作成します。

#### 2. `pandas`データフレームの作成

```python
data = pd.DataFrame({'Test Scores': test_scores})
```
ここでは、`pandas`ライブラリを使って、ランダムに生成したテスト点数をデータフレームに格納しています。このデータフレームは、テスト点数を持つ1列のデータとして、後で操作することができます。

#### 3. データ型と形状の確認

```python
print("データ型:", type(data))  # pandas DataFrame の型
print("データの形状:", data.shape)  # (行数, 列数)
```
- `type(data)` で、データ型を確認します。ここでは、`data`が`pandas.DataFrame`型であることがわかります。
- `data.shape` でデータの形状を確認します。これにより、データが何行何列から成るかがわかります。

#### 4. テスト点数の平均を計算

```python
average_score = data['Test Scores'].mean()
print("クラスのテストの平均点:", average_score)
```
`pandas`の`mean()`関数を使って、テスト点数の**平均**を計算しています。平均点を求めることで、全体のパフォーマンスを把握することができます。

#### 5. 偏差（平均点との差）の計算

```python
data['Deviation from Average'] = data['Test Scores'] - average_score
```
ここでは、各テスト点数から平均点を引いた**偏差**を計算し、新しい列としてデータフレームに追加しています。これにより、各学生が平均点からどれくらい外れているかを確認できます。

#### 6. 1次元配列としての操作

```python
test_scores_array = data['Test Scores'].values
print("\nTest Scores の1次元配列:\n", test_scores_array)
```
`pandas`のデータフレームから、特定の列（ここでは`Test Scores`）を**1次元配列**として取得しています。このように、データフレームの列はNumPyの配列としても操作できます。

#### 7. 配列の形状の確認

```python
print("Test Scores 配列の形状:", test_scores_array.shape)
```
配列の形状を確認することで、データの次元（行数、列数）を把握することができます。

### 4. 出力例

実行結果は以下のようになります。

```
データ型: <class 'pandas.core.frame.DataFrame'>
データの形状: (10, 1)
クラスのテストの平均点: 72.4

データフレームに偏差を追加:
    Test Scores  Deviation from Average
0            54                  -18.4
1            78                    5.6
2            60                  -12.4
3            87                   14.6
4            71                   -1.4
5            92                   19.6
6            88                   15.6
7            88                   15.6
8            83                   10.6
9            65                   -7.4

Test Scores の1次元配列:
 [54 78 60 87 71 92 88 88 83 65]

Test Scores 配列の形状: (10,)
```
[Moonlight] AI搭載の論文ビューアー

Qiitaエンジニアの皆さま

論文を読む際の生産性を向上させるツールをご紹介させていただきます。

毎日数千本もの論文が発表されている中、論文読解でお困りでしたらAIと共に論文を3倍速くお読みいただけます。

## **1. 説明**
テキストを選択したり、画像をキャプチャすることで、該当部分について詳しい説明を提供いたします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3974762/91dfe272-cddb-0a1f-bc6f-ba5c744fc588.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3974762/b5dd96e8-f698-18c1-e277-3f3bc8483f40.png)

特に数式を扱う場合、以下のようにLaTeX形式でコピーいただくことも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3974762/c2b825e9-83ab-199d-9dc9-0a3c7592b5d4.png)

また、さらにご不明点がございましたら、自由に追加でご質問や会話を続けていただけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3974762/76a0a92b-d8b4-be8d-53c5-ca73d137cb86.png)

## 2. 翻訳

知らない英単語がございましたら、翻訳機能をご活用ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3974762/97d259d9-4899-79ba-c556-4c7a2ab79da7.png)

ページ全体をより速くお読みになりたい場合、このようにページ全体を翻訳することも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3974762/3735223e-ce23-b89d-7be2-523cc5c1c21c.png)

## 3. スマート引用

論文をお読みの際引用論文を迅速に確認されたい場合は、ワンクリックで解決可能です。

引用論文のタイトル、著者、要約などをご覧いただけるほか、BibTeX、引用理由、読む価値に関する情報も一度にご確認いただけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3974762/c02a3f4a-791b-3bff-06c2-77ff8e8bbf39.png)

## 4. 要約

Moonlightを使用して難解な論文を迅速に読み解き、研究の生産性を向上させてみませんか

現在、Chrome拡張機能、iOS、Androidでご利用いただけます。

こちらからインストールいただけます： https://www.themoonlight.io/
picoCTF 2024 writeup Bookmarklet

## Bookmarklet (Web Exploitation)

Why search for the flag when I can make a bookmarklet to print it for me?  
Browse [here](http://titan.picoctf.net:57769/), and find the flag!

とりあえず、記載のリンクを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/387c3c93-b318-c08e-3604-76903499c9d2.png)
何かコードが書いてある。bookmarkletらしい。
謎コードを以下に示す。
```js
        javascript:(function() {
            var encryptedFlag = "àÒÆÞ¦È¬ëÙ£ÖÓÚåÛÑ¢ÕÓ¨ÍÕÄ¦í";
            var key = "picoctf";
            var decryptedFlag = "";
            for (var i = 0; i < encryptedFlag.length; i++) {
                decryptedFlag += String.fromCharCode((encryptedFlag.charCodeAt(i) - key.charCodeAt(i % key.length) + 256) % 256);
            }
            alert(decryptedFlag);
        })();
    
```
このコードを実行するとフラグが得られそうである。
ブラウザで実行できるところの一つにコンソールがある。
コンソールにコードを貼り付ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/80d04656-7cc5-626c-206d-e1df238ad188.png)
実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/0a29d164-7f86-f6ea-8da7-065eb8bf5237.png)

フラグが得られた。

`picoCTF{p@g3_turn3r_18d2fa20}`

## Reference
https://en.wikipedia.org/wiki/Bookmarklet
日本語での国際試験対策を可能にするExampractice.org

http://exampractice.org/

国際認定試験を受ける予定で、日本語で勉強したいと考えている方には選択肢が限られていると感じるかもしれません。しかし、[Exampractice.org](http://exampractice.org/)を利用すれば、言語の壁を心配する必要はありません。この多機能なプラットフォームは、日本語で利用可能なさまざまな国際試験のリソースを提供します。IT資格試験やその他の専門試験を準備している場合でも、ExamPractice.orgは学習をより簡単かつ効果的にします。

![exampractice-org-free-practice-past-questions-dumps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3974806/c1cbe4af-abcc-6848-f2de-901c895ad2e2.png)


### 日本語話者に最適なExampractice.orgの理由

#### 1. **広範な国際試験対応**

ExamPractice.orgは、世界的に認知されているIT試験を含む多くの認定試験の準備資料を提供しています。
- **Cisco**認定（例：CCNA、CCNP）
- **CompTIA**（例：A+、Network+、Security+）
- **AWS**認定
- **Microsoft**（例：Azure Administrator、Microsoft 365）
- **Google Cloud**認定

これらのリソースを日本語で提供できるプラットフォームの能力により、学習者は言語の壁に苦しむことなく、教材の理解に集中できます。

#### 2. **日本語でのローカライズされたコンテンツ**

すべての練習問題、学習ガイド、解説が日本語で利用可能で、ネイティブスピーカーや日本語に慣れた学習者に対応しています。この機能により、理解力が向上し、試験形式や内容に完全に備えることができます。

#### 3. **言語に配慮したパフォーマンス分析**

ExamPractice.orgは準備を支援するだけでなく、日本語で詳細な分析を提供し、進捗状況を追跡します。この個別のフィードバックにより、強みと弱点を把握し、効果的に学習計画を調整することができます。

#### 4. **日本語ユーザーにとって使いやすい設計**

好みの言語でプラットフォームを操作することで、学習体験がよりスムーズになります。ExamPractice.orgのインターフェースは直感的でユーザーフレンドリーであり、すべてのオプションが明確にラベル付けされ、日本語で簡単にアクセス可能です。練習テストから学習計画まで、すべてがユーザーを第一に考えて設計されています。

### 日本語学習者にとってのExampractice.orgの主な利点

- **最新のコンテンツ**：認定試験は頻繁に変更されますが、ExamPractice.orgはその教材が最新基準に沿っていることを保証します。
- **幅広い試験対応**：プラットフォームは数千の国際試験をカバーしており、世界中の学習者にとってワンストップソリューションとなります。
- **サポート体制の整ったコミュニティ**：日本語での支援が必要な場合でも、ヒントや戦略、励ましを共有するグローバルな学習者ネットワークに参加できます。

### 次の認定試験で成功を目指しませんか？

言語が成功の障害にならないようにしましょう。キャリアを後押しするIT資格試験やその他の国際試験を勉強している場合でも、[Exampractice.org](http://exampractice.org/)は必要なリソースを日本語で提供します。今すぐ準備を始めて、試験準備がどれほどアクセスしやすく、効果的であるかを体験してください。

**ExamPractice.orgを使って日本語で試験準備をした経験がありますか？** コメントで体験を共有し、他の人々が目標を達成する手助けをしましょう！
Tableauを使いこなすためのTips集

## はじめに*
業務で操作する際に調べたことの忘備録として記載しています。
増えた時には追記していく予定です。

## 目次*
# Tableauの基礎知識とTipsのご紹介

## 1. 基礎知識編

### 1.1 データ接続方式について

- データベース（DB）との接続方式には「ライブ接続」と「抽出」の2種類がございます。一般的には「抽出」方式を推奨いたします
  - 「ライブ接続」は画面表示の都度DBへアクセスするため、サーバー負荷が比較的大きくなります
  - 「抽出」は特定時点のデータをTableau内に保持するため、サーバー負荷を抑えることができます

- 「抽出」方式を採用する場合、定期的なデータ更新スケジュールの設定が必要となります
  - Tableauの標準機能では15分間隔までの設定が可能です
  - より短い更新間隔をご希望の場合は、バッチ処理をタスクスケジューラーで制御する方法がございます

### 1.2 データソースのパブリッシュについて

- パブリッシュ時のデータソース設定には「ワークブック内に埋め込み」と「個別にパブリッシュ」の2つの選択肢がございます
- データ抽出のスケジュール設定をご予定の場合は、「個別にパブリッシュ」をお選びいただくことを推奨いたします
 - 「ワークブック内に埋め込み」の場合、ワークブック単位でのデータ抽出スケジュールが設定できないためです

- 接続先DBの容量が大きい場合、抽出処理時にサーバーリソース（メモリ・CPU）への負荷が懸念されます。開発時にパブリッシュのみを実施したい場合も「個別にパブリッシュ」が有効です
 - 既にパブリッシュされているデータの状態を参照する形となります

### 1.3 環境管理について

- Tableau Cloudをご利用の場合：
 - 開発環境と本番環境を物理的に分けることができないため、プロジェクト（フォルダ相当）による論理的な区分けをお勧めいたします
 - SSOをご利用の場合は、IdP側の環境設定にご注意ください。開発環境または本番環境のいずれかにのみ接続可能となります

- Tableau Serverをご利用の場合：
 - サーバー自体を開発機と本番機で分離できるため、必要に応じてプロジェクト単位での管理を検討いただけます

### 1.4 共有用URLの仕様について

- 基本的なURL構成：
 - 標準サイト：`http://servername/#/views/workbook/sheet`
 - マルチサイト：`http://servername/#/site/sitename/views/workbook/sheet`

- URLに関する注意点：
 - 日本語のワークブック名・シート名は数値に変換されます。  
   例：`http://servername/#/site/sitename/views/_16867058779340/sheet0`
 - ワークブック名やシート名の変更はURLの変更を伴います。
 - URLを維持したまま内容を更新する場合は、Web上で名称変更後にDesktopから上書きパブリッシュすることをお勧めいたします。

## 2. 実践的なTips集

実装時によくある課題への対処方法をご紹介いたします。

### 2.1 日付フィルターの降順表示方法

- 計算フィールドを活用することで、新しい日付順での表示が可能です。
 - 詳細な手順は[公式ガイド](https://kb.tableau.com/articles/howto/how-to-change-sort-order-of-month-year-date-field-filter-to-descending?lang=ja-jp)をご参照ください。

### 2.2 NULL値の表示制御

- ディメンション（次元）の場合：
 - 別名編集機能で任意の表示値に変更可能です。
 - 参考：[NULL値の置換方法](https://kb.tableau.com/articles/howto/replacing-null-literals?lang=ja-jp)

- メジャー（指標）の場合：
 - 「書式設定」>「ペイン」>「特殊な値」から設定可能です。
 - 詳細は[こちら](https://qiita.com/ys_zdh/items/4ad06995084155fe2eb0)をご参照ください。

### 2.3 テキストの改行制御

- ディメンションの書式設定で「ラップ」機能をご活用いただけます。
 - 詳細は[こちらのガイド](https://kb.tableau.com/articles/howto/text-wrapping-for-long-strings-in-text-tables?lang=ja-jp)をご確認ください。

### 2.4 日付の最小値算出時のNULL値除外

課題：
- MIN関数使用時、NULL値が含まれると結果もNULLとなってしまいます。

対応方法：
1. IF文でNULL値を除外
2. すべてNULLの場合は代替値（例：2999/12/31）を設定

参考：[NULL値を含む日付の最小値計算](https://community.tableau.com/s/question/0D54T00000C6RBQSA3/trouble-calculating-minimum-date-when-there-are-null-values-in-the-row)

※比較対象が多い場合は、より効率的な方法を検討する必要があるかもしれません。
Selenium を触る頻度が低い人向けに、最低限の情報を思い出せるロードマップ

久しぶりに触って、記憶がフレッシュな時に残したメモのです。

一度触ったことあると、これくらいの粒度の方が「何を」「どう」できたかを思い出せて便利かなと思います。詳細はググればいくらでも出てきますので。。

![Screenshot 2024-12-31 at 16.35.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157574/669b24db-33f4-60d6-5bc5-60a936ea221d.png)
ポインターレシーバー【Go】

### ポインターレシーバー

ポインタレシーバを持つメソッドは、レシーバが指す変数を変更できる。
メソッドの呼び出し毎に変数のコピーを避けることができる。

```Go
package main

import (
	"fmt"
	"math"
)

type Vertex struct {
	X, Y float64
}

func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func (v *Vertex) Scale(f float64) {
	v.X = v.X * f
	v.Y = v.Y * f
}

func main() {
	v := Vertex{3, 4}
	v.Scale(10)
	fmt.Println(v.Abs())
}
// 50
```

メソッドがポインタレシーバである場合、呼び出し時に、変数、または、ポインタのいずれかのレシーバとして取ることができる。
以下のコードでは、```v.Scale(2)```のステートメントを ```(&v).Scale(2)```として解釈している。


```Go
package main

import "fmt"

type Vertex struct {
	X, Y float64
}

func (v *Vertex) Scale(f float64) {
	v.X = v.X * f
	v.Y = v.Y * f
}

func ScaleFunc(v *Vertex, f float64) {
	v.X = v.X * f
	v.Y = v.Y * f
}

func main() {
	v := Vertex{3, 4}
	v.Scale(2)
	ScaleFunc(&v, 10)

	p := &Vertex{4, 3}
	p.Scale(3)
	ScaleFunc(p, 8)

	fmt.Println(v, p)
}
// {60 80} &{96 72}
```
最急降下法(Gradient Descent) を解釈してみる

# 最急降下法(Gradient Descent)とは
きちんとした定義は色々な文献で散見されるので、ここでは自分なりの理解を述べます。

最急降下法とは、**①最適な位置（最小値）を探すために**、**②勾配に従って降下する方法** です。

以下、詳しく見ていきます。

## ①最適な位置を探す

最急降下法は「最適化問題」と呼ばれる分野でも、特に関数の最小値を求める場合に使われます。

たとえば、誤差関数や消費エネルギーを表す関数があるとき、その最小値を見つけたい場合に活躍します。

## ②勾配に従って降下する

「勾配に従う」というのは、関数を微分して得られる傾きを利用することを意味します。

傾きが大きい（急）ほど大きく進み、傾きが小さいほどゆっくり進むというのが直感的なイメージです。
最小値付近では、勾配が 0 に近いので、ごく小さなステップで近づいていきます。

アルゴリズムを見ていきます。現在の値 $x^{(k)}$を次の値 $x^{(k+1)}$に更新するとき、以下の式を用います:
```math
\mathbf{x}^{(k+1)} = \mathbf{x}^{(k)} 
- \alpha \frac{d}{d \mathbf{x}} f\!\bigl(\mathbf{x}^{(k)}\bigr)
```
※$\alpha$は学習率などと呼ばれ、更新量を調整するパラメータです

この更新式を繰り返すことで、目的の最小値へ近づいていくのが最急降下法です。

まさに英語名の通りで、 “Gradient（勾配）” に “Descent（降下）” することになります。

# 具体例
具体例として、二次関数$f(x)=\frac{1}{2}x^2$の最小値を考えてみましょう。
いま、
```math
\frac{d}{dx}f(x)=x
```

なので$x_0=4$, $\alpha=0.5$とすると、
```math
x_1= x_0-\alpha\frac{d}{dx}f(x_0)= 4 - \frac{1}{2}\times4=2
```
以上より、$x_0$から$x_1$は2進みます。
|![スクリーンショット 2024-12-31 16.19.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933005/71dee190-968c-a0a4-0a02-9590ba939b4a.png)|
|:--:|
|$f(x)=\frac{1}{2}x^2$ の最急降下法|

計算を繰り返すと、
```rust
2 -> 1 -> 0.5 -> 0.25 -> 0.125 -> ...
```
のように移動し、最終的には 0 に向かって収束していきます。

以下は簡単な MATLAB のコード例です。

```matlab
x_k = 0;
alpha = 0.5;
maxIter = 

for k = 1:maxIter
    x_old = x_k;

    grad_f = x_old;
    
    x_k = x_k - alpha * grad_f;
end
```


終わり
xs-devツール(v0.36.1)の使い方メモ (※解決済)

# はじめに

xs-devツールをv0.33.1からv0.36.1(2024年12月31日時点の最新版)に更新したところ、コマンドの使い方が変更になり、少しハマった点があったのでメモを残しておきます。

# 更新内容

xs-devツールのsetupコマンドの引数が変更になりました。

## v0.34.0

setupコマンドの --target-branch オプションが --release オプションと --branch オプションに分割されました。

Moddable SDKの最新版をインストールする場合、以下のように変更されました。

### v0.33.1

```bash
xs-dev setup --tartget-branch public
```

### v0.34.0

```bash
xs-dev setup --branch public
```

Moddable SDKのリリース版をインストールする場合、以下のように変更されました。

### v0.33.1

```bash
xs-dev setup
```

### v0.34.0

```bash
xs-dev setup --release=リリース番号

(例)
xs-dev setup --release=5.3.0
```

### ハマった点

リリース番号を指定しないと、latestタグが付いたリリース番号が設定されます。
しかし、リリースにpre-built assetsが存在しないと警告が表示され、コマンドが終了しません。
(スピナーが回転しているので動作しているように見えますが、入力待ちの状態で先に進みません)
pre-built assetsが含まれるリリース番号を指定するのが確実です。

```bash
$ xs-dev setup
Setting up the mac tools!
⠼ Getting latest Moddable-OpenSource/moddable release
Moddable release latest does not have any pre-built assets.
⠴ Getting latest Moddable-OpenSource/moddable release
```

![スクリーンショット 2024-12-31 15.13.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/4bf3b663-88d6-6026-0009-1eb2ffa8e17b.png)

### 追記:調査中(2024年12月31日 18:48時点)

xs-dev v0.36.1の更新が関係していそうという情報をキャッチしました。

https://x.com/stc1988/status/1874007446542532837

Linux環境でも再現しました。

```bash
$ nodebrew ls
v16.17.1
v18.20.5
v20.18.1

current: v20.18.1
```

https://x.com/Zakkiea/status/1874029139747131784

Mac環境のNode.jsのバージョンはv20.14.0でした。
READMEのRequirementsは>=16となっていますが、package.jsonのenginesは"node":">=20"が指定されていました。

https://x.com/Zakkiea/status/1874469563892732135

https://github.com/HipsterBrown/xs-dev/issues/202


### 追記:解決(2025年1月1日 23:51時点)

Spinnerがstartして(動いて)いるとpromptが動かず、Spinnerをstopする(止める)とpromptが動くことを確認しました。

https://x.com/Zakkiea/status/1874343293246726211

ソースコードを修正してPR(プルリク)を作成しました。

https://github.com/HipsterBrown/xs-dev/pull/203

https://x.com/Zakkiea/status/1874468481888043021

マージされました。(v0.36.2がリリースされました)

https://github.com/HipsterBrown/xs-dev/releases/tag/v0.36.2


## v0.35.0

ESP32デバイスでインストールされる開発ツール(ESP-IDF)のバージョンが5.3.1になりました。
(Moddable SDK 5.2.0はESP-IDFのバージョンは5.3.0でしたが、Moddable SDK 5.3.0はESP-IDFのバージョンが5.3.1になりました)
AIエージェント入門：　「ゴール設定から実行」までを自動化するデザインパターン

## 1. はじめに
大規模言語モデル（LLM）の普及に伴い、「自律的にタスクをこなすエージェント」への注目が高まっています。本記事では、エージェントシステムの基本構造と、LLMを用いてどのように設計・実装すればよいのかを概説します。

## 2.AIエージェントとは何か？
まずエージェントの定義から整理します。ここでいう`エージェント`とは、自律的に振る舞い、必要に応じて環境と相互作用しながら、タスクを遂行するソフトウェアコンポーネントを指します。
* 自律性(Autonomy)  
環境（ユーザ入力や外部データ、APIなど）からの情報を受け取って、自分自身で意思決定し行動を変化させる能力を持ちます。
* 環境とのやり取り  
必要に応じてAPIを呼び出したり、他のエージェントや人間とのコミュニケーションを行います。
* 内部状態の保持・学習  
継続学習や推論機能を持つ場合は、過去の実行結果を踏まえて、行動方針を更新することもあります。

誤解されがちなのは、「LLMにキャラクターやペルソナを与える=AIエージェント」というわけではないという点です。エージェントとしての振る舞いを定義し、環境に応じた計画や実行を行うロジックが組み込まれていることが重要になります。

## 3.エージェントデザインパターンの概要
エージェントベースのシステムでは、複雑なタスクを`計画(Planning)`と`実行(Execution)`に分解し、複数のエージェントで協調して動かすデザインパターンがよく採用されます。

* `Planning Agent`
  * 役割: 目標(ゴール)の設定、タスクの分解・優先度付け、戦略立案
  * 特徴: タスク全体を俯瞰し、最適なアクションケースを決定する
* `Worker Agent`
  * 役割: Planning Agentが策定した計画をもとに実際の作業(APIの呼び出し、外部リソース操作など)を行う
  * 特徴: 実行とモニタリング、結果のフィードバック

このように、意思決定や計画を担当するエージェントと、実際の処理を担当するエージェントを分けることで、役割分担が明確になり、システムの拡張性が高まります。また、必要に応じて`監視エージェント`や`インターフェースエージェント`を追加することもあります。

## 4. Planning Agent（ゴール生成・計画立案）
Planning Agent は、ユーザーの要求を受け取り、必要に応じて曖昧なクエリを明確化し、どのようなタスクをどの順番で行うかを立案する役割を担います。

* ゴールの明確化（Goal Creation）  
  * ユーザクエリを分析し、具体的かつ測定可能な目標（SMART Goalなど）に変換
  * 例: 「○○のレポートを作りたい」→「30日以内に競合分析を含むレポートを作成し、PDFでまとめる」
* タスク分割・優先度付け  
  * ゴールを達成するためのサブタスクを洗い出し、依存関係や優先度を整理
  * 必要に応じて外部リソースやAPIの使用計画を組み込む
* 実行計画の作成  
  * 時間・コストなどの制約を考慮したスケジュールを作成
  * 実行指示書を Worker Agent に渡せる形式（JSON、箇条書きなど）でまとめる

## 5. Worker Agent（具体的な作業実行）
Worker Agent は、Planning Agent が立案した計画をもとに、実際の処理を行います。

* タスクの実行  
  * データ収集、API呼び出し、ファイル操作など、具体的な作業を遂行
  * 必要に応じて一部のサブタスクをさらに分割し、並列実行・リトライなどを行う
* モニタリングと結果報告
  * 処理結果を監視し、成果物やエラー情報をPlanning Agentに返す
  * 成功時は成果物のURLやログを提示し、失敗時はエラー内容を報告
* フィードバックループ
  * Planning Agent から計画修正指示が来たら対応する
  * ユーザから追加要望があった場合、再度Planningに反映できる

## 6. エージェントの連携フロー
上記の Planning Agent と Worker Agent を連携させた場合、主なフローは以下のようになります。
* 1.ユーザ → Planning Agent  
  * 曖昧な要求を受け取り、ゴール（Goal）を明確にする
* 2.Planning Agent → ゴール定義・計画策定
  * 必要なサブタスクを分割し、優先度や手順を決定
* 3.計画 → Worker Agent
  * Worker Agent が実行可能な形式でタスクを渡す（API呼び出しのリストなど）
* 4.実行 → 結果の報告
  * Worker Agent が実作業をこなし、結果やエラーを Planning Agent に返す
* 5.計画修正（必要に応じて）
  * Planning Agent がフィードバックを受け、再度計画を調整
* 6.ゴール達成 → ユーザに報告
  * 最終成果をまとめ、ユーザに提示する


## 7. プロンプト最適化のポイント

LLMを使ったエージェントを構築する場合、どのようにプロンプトを設計するかが大きな鍵を握ります。
* SMARTゴールの作成
  * SMARTとは`Specific（具体的）`、`Measurable（測定可能）`、`Achievable（達成可能）`、`Relevant（関連性）`、`Time-bound（期限が明確）`のこと
  * 具体的で測定可能なゴールを定義するようなプロンプトを用意
* ステップバイステップ思考
  * 「問題を分解して論理的に考えよ」と指示するChain-of-Thoughtプロンプト
* テンプレート・フォーマットの指定
  * タスクやゴールを JSON など構造化形式で出力させる
* 外部リソース連携
  * LangChainやLangGraphを利用して、文書検索やデータベースからの情報取得を組み込む


## 8. まとめ
本記事では、Planning Agent と Worker Agent に分けて役割を定義し、それぞれが連携してゴールを達成するエージェントデザインパターンを紹介しました。以下にポイントをまとめます。

* Planning Agent（GoalCreatorを含む）
  * ユーザ要求を明確なゴールに落とし込み、計画を立案
*  Worker Agent
   *  指定された手順を実行し、結果をフィードバック
*  エージェント連携フロー
   *  フィードバックループを構築し、必要に応じて計画を修正する
Tableau アカウント情報変更方法（Tableau Cloud Manager）

## はじめに
業務で利用するTableauに関するナレッジやTipsについて忘備録として記載します。
今回の内容として具体的には、Tableau Cloud Manager (TCM) の活用方法について説明します。
## 背景と課題
1. **ライセンス制限による課題**
   - 最小限のライセンス（管理者1名、Viewer1名）の環境
   - 開発フェーズではCCTアカウントがTableau Cloudの管理者権限を保持
   - 納品時に顧客側のアカウントへの権限移行を行った際にTableau Cloudの管理画面では移行できないトラブルがあった
2. **Tableau　Cloudの管理画面での制限**
   - Tableau Cloudの管理画面では以下の操作が実行できなかった
     - メールアドレスの変更
     - 限られたライセンス内での柔軟な権限移行
3. **運用上の具体的な問題**
   - 管理者権限を持つアカウントを新規作成するには、該当の空きライセンスが必要
   - 最小限のライセンスでは既存ユーザー間での権限交換ができず、スムーズな移行が困難
### TCMによる解決
ライセンスに余裕がある（管理者が2名以上等）場合には、同等の権限所有者が代わりに変更を実施すれば問題ないが、今回だとそれを実行することができませんでした。
これらの課題に対応するため、Tableau Cloud Manager (TCM) が提供されています。
TCMを使用することで、以下のような柔軟な運用が可能になります。

- 既存ライセンス内でのユーザーロール変更
- アカウント情報の簡易な更新

### TCMを使用した解決手順:
1. TCMにアクセス
2. 現管理者（CCTアカウント）からTableau Cloudの管理者権限を削除
3. 将来の管理者（顧客担当者）へTableau Cloudの管理者権限を割り当て
4. 現管理者（CCTアカウント）へTableau CloudのViewer権限を割り当て
5. 権限移行を確認
## TCMアクセス方法
- URL: `https://.cloudmanager.tableau.com`
## 参考リンク
- [Tableau Cloud Manager へのサインイン](https://help.tableau.com/current/online/ja-jp/cloud_manager_signin.htm)
- [Tableau Cloud Manager でのユーザーの管理](https://help.tableau.com/current/online/ja-jp/cloud_manager_users.htm)
-  [サイト ロール制限の管理](https://help.tableau.com/current/online/ja-jp/cloud_manager_site_role_limit.htm)
CA Tech Lounge室長としてBotを開発しています

## CA Tech Lounge Advent Calendar開催中！
今年もCA Tech Loungeでは、会員たちが知見やノウハウを共有する場としてAdvent Calendarを開催しました。さまざまな記事が日々投稿されていますので、ぜひご覧ください。
なんとこの記事は25日目、最終日に公開する予定だったものを自分が大遅刻で出している記事となります。
室長による大遅刻というやらかしがありましたが、Advent Calendar自体の内容はいずれもユニークでした！
- [CA Tech Lounge Advent Calendar 2024](https://qiita.com/advent-calendar/2024/catechlounge)
## 室長によるLoungeBotの作成
Advent Calendarには、会員の皆様の様々な挑戦が記載されていましたね！
CA Tech Loungeの室長である自分も、新たな試みとして**LoungeBot**を作成いたしました。

### 人数の集計
CA Tech Loungeにはtechlounge_comingという来館を示すチャンネルがあります。
当初は「話しかけるとき、今いる人とSlack上の人格が一致するように」という思いで作りましたが、
ほぼ全員が使っているため人数の集計として使えるのでは無いかという発想になりました。

毎日22時の来館時刻を過ぎた後に、集計した人数が発言されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468362/e7c9bfac-6692-248a-face-aa7c448bc86a.png)

### コメントの追加
GASを利用して22時台に集計が行われ、人数が同チャンネルに報告されます。

```
  var users = [];
  if (json.messages && json.messages.length > 0) {
    for (var i = 0; i < json.messages.length; i++) {
      if (json.messages[i].user) {
        users.push(json.messages[i].user);
      }
    }
  } else {
    Logger.log('No messages found.');
  }
```

10名を下回ると残念なコメント、20名を超えると褒め称えるコメントが出力されるようにしました。

```
if (uniqueUsers.length < 10){
    var message = '今日の来館者数は' + uniqueUsers.length + '人でした。よりたくさんの来館お待ちしております！'
  }else if(uniqueUsers.length >=10 && uniqueUsers.length < 20){
    var message = '今日の来館者数は' + uniqueUsers.length + '人でした！'
  }else if(uniqueUsers.length >= 20){
    var message = '今日の来館者数は' + uniqueUsers.length + '人でした！すばらしい！'
  }
  var postUrl = 'https://slack.com/api/chat.postMessage'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468362/e4fee6e1-855b-d528-e8e3-73c1e7ce87a4.png)
↑実際に褒め称えられている例

会員の学習に触発されて自分も学習意欲が出、開発に取り掛かることとなりました。
GASを使う事によってコードを毎日定期的に実行することも難なく実現することができました。

### 効果
CA Tech Loungeでは「来て学習をする」ということを推奨しています。
会員が来る人数としては現状そこまでの効果は見られないようですが、「人数の可視化」が行われることで多いときにはリアクションが行われており、来館に対する意欲を多少上げられたのでは・・・という希望を持っています。
今後「ランキング機能」などの開発を行うことにより、来館意欲の促進を行っていきたいと思います。

## デザイナー職の募集開始！
CA Tech Lounge年末のお知らせとして、直近で**デザイナー職**の募集を開始いたしました。クリエイティブな環境で共に成長したい方は、ぜひご確認ください。
- [入会情報はこちら](https://www.cyberagent.co.jp/careers/special/students/tech_lounge/)
## 来年もさらに拡大予定！
2025年もCA Tech Loungeは引き続き拡大を続けてまいります。新たな取り組みやイベントを企画しておりますので、ぜひご期待ください。
2025年もCA Tech Loungeをよろしくお願いいたします！
AWSへのSSOとは

IAMユーザーを作成せずに、企業がすでに利用している外部IDプロバイダー（IdP）を利用してAWS環境へのシングルサインオン（SSO）を実現する方法について解説します。これは「IDフェデレーション」と呼ばれる仕組みを利用します。

# IDフェデレーションとは
IDフェデレーションとは、異なるセキュリティドメイン間でユーザーIDと認証情報を共有する仕組みです。この場合、企業がすでに利用しているActive Directory、Azure AD、Okta、Ping IdentityなどのIdPとAWSの間で信頼関係を確立し、IdPで認証されたユーザーがAWSリソースにアクセスできるようにします。これにより、AWSアカウントごとにIAMユーザーを作成・管理する必要がなくなり、管理オーバーヘッドを大幅に削減できます。

# IDフェデレーションの仕組み
IDフェデレーションは、主にSAML 2.0（Security Assertion Markup Language 2.0）という標準規格を用いて実現されます。以下に大まかな流れを示します。
1.	ユーザーが企業IdPにログイン: 
ユーザーは普段利用している企業内の認証システム（例：Active Directory）にログインします。

2.	IdPがSAMLアサーションを生成: 
認証に成功すると、IdPはユーザー情報や属性情報（例：所属部署、役職）を含むSAMLアサーション（XML形式のデータ）を生成します。

3.	SAMLアサーションをAWSに送信: 
ユーザーはSAMLアサーションとともにAWSにリダイレクトされます。

4.	AWSがSAMLアサーションを検証: 
AWSは事前に設定されたIdPの証明書を使用してSAMLアサーションを検証し、ユーザー情報を確認します。

5.	AWSが一時的な認証情報（STSトークン）を発行: 
検証に成功すると、AWS Security Token Service (STS) が一時的な認証情報（アクセスキーID、シークレットアクセスキー、セッショントークン）を発行します。

6.	ユーザーがAWSリソースにアクセス: 
ユーザーはこの一時的な認証情報を使用して、AWS Management Console、AWS CLI、AWS SDKなどを通じてAWSリソースにアクセスできます。

# AWSにおけるIDフェデレーションの設定方法
AWSでIDフェデレーションを設定するには、主に以下の2つの方法があります。
•	AWS IAM Identity Center (旧 AWS Single Sign-On): 
複数のAWSアカウントやクラウドアプリケーションへのSSOを集中管理するためのサービスです。IdPとの連携設定を簡素化し、ユーザーポータルを提供します。推奨される方法です。

•	IAMロールとIdPの直接連携: 
IAMロールとIdPを直接連携させる方法です。より細かい設定が可能ですが、設定作業はやや複雑になります。

# AWS IAM Identity Center (旧 AWS Single Sign-On) を利用する場合
1.	AWS IAM Identity Center を有効化: 
AWS Management ConsoleでIAM Identity Centerを有効にします。

2.	IdPとの接続を設定: 
企業で利用しているIdP（例：Active Directory、Azure AD、Okta）との接続を設定します。メタデータファイルの交換や設定情報の入力などを行います。

3.	ユーザーまたはグループをAWSアカウントに割り当て: 
IdPのユーザーまたはグループをAWSアカウントに割り当て、アクセス権限を設定します。

4.	ユーザーがAWSにアクセス: 
ユーザーは企業IdPのポータルまたはAWS IAM Identity CenterのユーザーポータルからAWSにアクセスできます。

# IAMロールとIdPの直接連携を利用する場合
1.	IAMでIdPエンティティを作成: 
IAMでIdPの情報を登録します。メタデータドキュメントのアップロードなどを行います。

2.	IAMロールを作成: 
AWSリソースへのアクセス権限を定義したIAMロールを作成します。

3.	ロールに信頼ポリシーを設定: 
作成したIAMロールに信頼ポリシーを設定し、IdPからのアクセスを許可します。

4.	IdP側でAWSへの接続を設定: 
IdP側でAWSへの接続情報を設定します。

# メリット
•	集中管理: 
ユーザーアカウントを一元管理できるため、管理オーバーヘッドを削減できます。

•	セキュリティ強化: 
IAMユーザーのパスワード管理が不要になるため、パスワード漏洩のリスクを低減できます。

•	ユーザーエクスペリエンスの向上: 
ユーザーは普段利用している認証情報でAWSにアクセスできるため、利便性が向上します。

# まとめ
IAMユーザーを作成せずに、企業が既に利用している外部アカウントを利用してAWS環境へのシングルサインオンを実現する方法について解説しました。AWS認定試験においても、IDフェデレーションの概念、仕組み、設定方法などは頻出するため、しっかりと理解しておくことをお勧めします。特に、以下の点を意識して学習すると良いでしょう。
•	IDフェデレーションの概念とメリット
•	SAML 2.0の役割
•	AWS IAM Identity Center (旧 AWS Single Sign-On) の利用
•	IAMロールとIdPの直接連携
これらの情報を参考に、AWS環境へのSSO導入を検討してみてください。

END
JPA(Hibernate)で同一行を複数回取得したらカラム値が得られない

JPA(Hibernate)の失敗談。

同一セッションにおいて同一行はキャッシュされる。よって、何らかの要因で先行のSQLがそのカラム値とは別の値を返す場合、後のSQLでカラムを指定しても使用されない。


```gradle
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.4.1'
	id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	runtimeOnly 'com.oracle.database.jdbc:ojdbc11'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
	useJUnitPlatform()
}
```

```java
@Entity
@Data
public class Sample {

  @Id
  String code;
  @Column(name = "value1")
  String value1;
}
```

```java
Sample result1 = (Sample)em.createNativeQuery("select code, 'hoge' as value1 from SAMPLE where code = 'code001'", Sample.class).getSingleResult();
System.out.println(result1);

Sample result2 = (Sample)em.createNativeQuery("select code, value1 from SAMPLE where code = 'code001'", Sample.class).getSingleResult();
System.out.println(result2);

System.out.println(result1 == result2);
```

実行結果は以下となる。

```
Sample(code=code001, value1=hoge)
Sample(code=code001, value1=hoge)
true
```

先行のSQLはカラム値ではなく`hoge`という固定文字列を取得している。その後のSQLはカラムを指定しているが、実際にはキャッシュから返されるので、結果的にカラム値が無視されたような挙動になる。

キャッシュの存在を確認するため、二つのSQLの間に```clear```を実行する。

```java
Sample result1 = ...
System.out.println(result1);
em.clear();
Sample result2 = ...
System.out.println(result2);
System.out.println(result1 == result2);
```

すると下記のような結果が得られる。

```
Sample(code=code001, value1=hoge)
Sample(code=code001, value1=value1)
false
```
Youtubeのgainを大きくする方法

YouTubeの video 要素の volume プロパティは通常、0（無音）から1（最大音量）までの範囲に制限されています。しかし、この制限を超えて音量をn倍に増大する方法をご紹介します。

## 解決策としてWeb Audio APIを使用

Web Audio APIを使用してYouTubeの音声を増強することが可能です。以下のコードをブラウザのコンソールに貼り付けて実行してください。

```javascript
const video = document.querySelector('video');
const audioContext = new AudioContext();
const source = audioContext.createMediaElementSource(video);
const gainNode = audioContext.createGain();

gainNode.gain.value = 5; // 音量を5倍に設定

source.connect(gainNode);
gainNode.connect(audioContext.destination);

console.log('音量を5倍にしました！');
```

## 使用例
![スクリーンショット 2024-12-31 160312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648231/9d5eb618-7c00-10e5-46c9-c0218809fe0e.png)


## 軽いコードの解説

### audioContext

Web Audio API の AudioContext を使用することで音声を複雑に処理できる環境を構築します。

### gainNode

gainNode は音量を調整するためのノードです。gain.value を変更することで音量を増大したり減少したりできます。

### gainNode.gain.value = 5

音量を5倍に設定しています。この値は自由に変更することができます。ただし、大きすぎる値に設定すると音が崩れることがあるので注意してください。