OmniAICreator/Qiita-1.07M huggingface dataset:
Everyday Railsを読んで

### まえがき

自身のRailsの理解度としては、X（旧Twitter）の大まかな機能についてクローンアプリを作成したことはあるが、RSpecなどのテストフレームワークは導入程度の知識しかない状態です。  
まさに、本書が定める対象である`Railsの開発経験は多少あるものの、テストにはまだ馴染めていない開発者`にあたるかと思います。

### 良い点

* 複数種のSpecが存在するが、スムーズに導入していける順序で解説されている
  * ざっくりと
    * モデルスペック＝単体テスト
    * コントローラスペック、リクエストスペック＝機能テスト
    * システムスペック＝統合テスト
    
    のように自分は解釈し、実際にシステムを作っていく際の流れに乗っているように思いました
* ただし、上記については既存アプリへの導入のケースを指しており、TDDにおいては逆順となることも触れられている
* サンプルアプリが用意されており、自身のアプリケーションが無くとも手を動かしながら学べる
  * 作成したアプリケーションもありましたが、まずはサンプルで手を動かし、その後自身のアプリでもテストケースを作成するという流れで学習を行いました
* おおよそ、学習のためなどに作成するアプリケーションで行うテストを網羅している
  * メール送信やファイルアップロード、外部のWebサービス呼び出しなど

### 悪い点

といっても特に思い当たらないので、自身のアプリに導入する際、躓いた点を記述しておこうと思います。

* Capybaraを使ったテストケースを作成する際、docker + chromeの環境をm2 Macへ作成する
* hotwireを使用し、`turbo_stream`を使っている場合には`js: true`かつ、リクエストの際にヘッダーへ明示的に`turbo_stream`リクエストであることを記述する必要がある

### 重要な考え方だと学んだ点

* テストは、自身の書いたプログラムに自信、裏付けを得るために書くべき
* 可読性を犠牲にしてまで、DRYにする必要はない
* バリデーションは書き忘れやすいが、テストを書きながらであれば抜けにくい
* テストがないよりは、遅いテストでもない状態よりはずっと良い（0 → 1がまず大切で、テストを書くことへのハードルを下げている）
* コントローラのテストは退屈であるべき
* 不要だと明確になった時点で、そのテストは削除するべき
* テストが遅い時、並列実行に頼るだけでなく、その他の要因も検討すること
* マッチャが持つオプションなどを調べることで簡潔に解決し、テストコードの短縮が可能であるケースも多々ありそうなので、使用するマッチャのドキュメントを読むことも大切であること

### まとめ

記事を書く時点で、本書の提供するサンプルアプリへの導入、自身のツイッタークローンアプリへの導入を行って記述しています。
既存アプリへの導入なので、中から外（モデルスペックからシステムスペックの向き）で書いていくのが効率的なようですが、あえてシステムスペックから着手してみました。
大きく困ることはありませんでしたが、既にモデルの持つべき挙動や制約が決まっている状況からテストケースを書くのであれば、モデルスペックから記述していった方が、より外のテストで異常系を記述する際に機械的に作成していけるのかと感じました。

ここまで読んでいただき、ありがとうございました！
[小ネタ] MySQL (InnoDB) でユニットテスト最中のDBを外部から見たい場合は READ UNCOMMITTED  を使うといいかも

## はじめに

:::note info
この記事は MySQL 8.0.26 をベースに記述しています
:::

みなさんDBを使ったユニットテストをしていますか？

最近では少なくない「状況が許すならユニットテストでもモック・スタブじゃなくてリアルDB使えばいいじゃん」派の方は、DBを使ったユニットテストについて、以下のようなコードを書いていると思うのですが、**たまにユニットテスト最中のDBを見たくなると思います。**

```typescript
try {
  db.begin();

  // テスト用データの準備
  db.exec(`DELETE FROM test`);
  db.exec(`INSERT INTO test VALUES (....)`)
  
  testedMethod(); // ← ここをデバッグ実行とかで止めながらDBのデータをじっくり見たい!!

  // データの検証
  ...
} finally {
  // ユニットテスト中にいじったデータのロールバック
  db.rollback();
}
```

もちろんユニットテストによるDB変更は最後にロールバックされるので、ユニットテスト中のDBの内容を見ようがありません。ロールバックのコードを一時的に取り除いたりで見ることはできますが、面倒な上にユニットテストで既存データが破壊されるので困りものです。

（まあそもそも品のいいエンジニアリングをしている人達はあまりこういうことをしたいとはならないのでしょうが……）

## (MySQLの場合) そこで `READ UNCOMMITTED` !

そういう時は `READ UNCOMMITTED` 分離レベルで繋ぎましょう。他のトランザクション（ユニットテスト）による変更をある程度見ることができます。

例えば以下はDBeaverによる分離レベルの設定画面です。 [^1] 

[^1]: DBeaver の分離レベルのオプションは一度テスト接続しないと表示されないことに注意しましょう（空欄しか出なくてびっくりすると思うので）


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1577592/8604fa1f-f8de-d57c-9ac3-591034df0385.png)

ユニットテスト接続の変更を見る際は、次のような流れになります。 `ダーティーリード` の部分が今回の狙いです。

```mermaid
sequenceDiagram
    participant UT as ユニットテストのDB接続<br/>(REPEATABLE READ)
    participant NRM as 通常のDB接続<br/>(REPEATABLE READ)
    participant OT as DBビュアーツールのDB接続<br/>(READ UNCOMMITTED)
    participant D as テストデータ

    opt ユニットテスト中のトランザクション
      UT->>UT: ユニットテストの冒頭でbegin

      UT->>D: テストデータ更新

      UT->>D: 更新されたデータを観測
      NRM->>D: 更新前のデータを観測
      OT->>D: 更新されたデータを観測<br>（ダーティーリード）

      UT->>UT: ユニットテストの最後でrollback
    end
    
    UT->>D: 更新前のデータを観測
    NRM->>D: 更新前のデータを観測
    OT->>D: 更新前のデータを観測

```

MySQL 8.0.26 で上記の動きを確認済みですが、将来のバージョンでダーティーリードが排除されたとしても不思議ではないし、トランザクション内容によってはダーティーリードが予想可能な形で発生するとは言えないので、あくまで現時点で通じるデバッグツールの一種ぐらいと捉えたほうが良さそうです。

### (おまけ) MySQL (InnoDB) のトランザクション分離レベルについて

- `REPEATABLE READ`: デフォルト。トランザクション中に見える内容が基本的に他者起因で変わらない
- `READ COMMITTED`: トランザクション中に他でコミットされた内容が見える
- `READ UNCOMMITTED`: トランザクション中に他でコミットされていない内容も見える（ダーティーリード）。本記事で使っている分離レベル
- `SERIALIZABLE`: 見た行全部ロック

詳しくは以下を参照してください。

https://dev.mysql.com/doc/refman/8.0/ja/innodb-transaction-isolation-levels.html

## PostgreSQLの場合はどうなのか？

PostgreSQLでは `READ UNCOMMITTED` は `READ COMMITTED` のように振る舞います。**よってこの手法は使えません。残念！**

> PostgreSQL's **Read Uncommitted mode behaves like Read Committed**. This is because it is the only sensible way to map the standard isolation levels to PostgreSQL's multiversion concurrency control architecture.

https://www.postgresql.org/docs/current/transaction-iso.html

## まとめ

MySQLで `READ UNCOMMITTED` 分離レベルを使うと別トランザクションの変更を見ることができます。ユニットテスト中の最終的にロールバックされるデータベース変更を眺めるには便利なこともあるでしょう。

ちなみにPostgreSQLでも通用するようなユニットテスト中のトランザクションを覗く方法となると、ユニットテストのためだけのDBを専用で立てておき、データがユニットテストでいかに壊されようと問題がない状況とし、細かくユニットテスト中にコミットのコードを入れるぐらいしか方法が無いと思います。コード中で獲得しているデータベースコネクションを他ツールに分配するようなことができればいいのですがそのような方法は見つかりませんでした……
【ChatGPT】課題に対して、学びが進む3ステップをPromptにしました。


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

　今回は、課題に対して、学びが進む3ステップをPromptにしました。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　ではさっそく、【本題】です。

　今回は、
　　課題に対して、
　　　学びが進む3ステップを
　　　　Promptにしました。

　参考にしたのは
　　こちらの記事です。
[独学が得意な人の知識習慣。 学びが進む3ステップ](https://news.yahoo.co.jp/articles/7e321816d1bb32570d8eff678dd404967d26c2a8)

　この記事では、
　　難しいことを習得するための
　　　3ステップの学習法が
　　　　紹介されています。

　そのステップがこちら。
　❶難しいことに似ているが
　　　より簡単なタスクを見つけます。
　❷そのタスクの一部を難しくし、
　　　段階的に挑戦します。
　❸そのプロセスを繰り返し、
　　　難しいと感じなくなるまで
　　　　練習します。

　ですが、
　　課題に対するタスクを
　　　どのように準備すれば
　　　　いいのでしょうか？

　その答えのひとつとして
　　今回のPromptを用意しました。

　＊＊＊に課題を入力して
　　送信してください。
```Text:課題に対して学びが進む3ステップPrompt
あなたがやりたいこと「＊＊＊」を実行課題とします。

以下のステップに従って実行課題を効果的に習得する方法を具体的に考えましょう。

1. **類似した簡単なタスクを見つける**
   - 実行課題に似ているが、より簡単で基本的なタスクをリストアップしてください。
   - その中から最も取り組みやすいものを選びます。

2. **段階的に挑戦する**
   - ステップ1で選んだタスクを少し難しくする要素を加えてください。
   - 難易度を段階的に上げていき、少しずつ実行課題に近づけていきます。
   - 具体的にどのような練習や作業が必要かを考え、実行します。

3. **繰り返し練習する**
   - ステップ2で設定したタスクや練習内容を反復して取り組みます。
   - 苦手な部分を分析し、改善する方法を考えましょう。
   - 繰り返しを通じて、スキルを習得していきます。

以上のステップを明確化して、実行課題を達成するための行動計画を立ててください。
```

　例えば、
　　“英会話の学習”とかですね。

　もちろん、
　　これはあくまで
　　　課題解決の糸口にしかなりません｡
　　　　深堀りは必要です。

　それでも
　　何もわからないよりも
　　　糸口があれば、
　　　　そこから広げればいい。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
【Revit】Revit2019、2021、2024でRevitLookupを使用して拡張ストレージの中身を確認する方法

# 概要
Revit2019、2021、2024でアドインツール[RevitLookup](https://github.com/jeremytammik/RevitLookup)を使用して拡張ストレージに格納されているデータを確認する方法を記載しました。
※手元にあるRevitが2019、2021、2024のみなので、手元で確認できるRevitバージョンのものだけ記載しています。

# 目次
- [Revit2019、2021で拡張ストレージのデータを確認する方法](#revit20192021で拡張ストレージのデータを確認する方法)
- [Revit2024で拡張ストレージのデータを確認する方法](#revit2024で拡張ストレージのデータを確認する方法)

# Revit2019、2021で拡張ストレージのデータを確認する方法
Revit2019と2021は確認方法が同じです。

1. Revitの上部から「アドイン」タブをクリック。
1. Revit Lookupから「Snoop DB...」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/edd644ac-16c8-87fe-3073-564bfcc69b37.png)
1. 開いた画面の左部からProjectInfoの<プロジェクト情報 xxxxx>をクリック。
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/7222ec87-5ef0-fde6-238a-e7fa1fee1af1.png)
1. 画面の右部に「--- Extensible storages ---」というタイトルがある。そのタイトルは以下の項目が拡張ストレージに格納されているスキーマとなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/40a96c1d-34a7-42f4-38d9-9be95b648b6b.png)
1. 任意のスキーマ名をクリック。 (新しい画面が開く)
1. 画面の右部に「--- Extensible storages ---」というタイトルがある。そのタイトル以下の項目がスキーマに格納されているフィールドとなる。
1. 任意のフィールド名をクリック
1. 画面の左部の`Dictionary2`配下の`Dictionary2`を右クリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/19640cff-af95-3b29-b0f1-0409023fb2d5.png)
1. 「Browse Using Reflection...」をクリック。 (新しい画面が開く)
1. この画面から拡張ストレージのKey名や値が確認できる。
Key名や値を確認するにはKeysやValues行の右部の「...」ボタンをクリック。(新しい画面が開く)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/4f4f83b8-499a-ae36-b14a-5a46bf192544.png)
Keysの「...」をクリックした場合はKeysの一覧が、Values「...」をクリックした場合はValuesの一覧が確認できる。
:::note
KeysやValuesの「...」をクリックした際に開かれる画面にメンバーとあるが、この左部に振られた番号でKeyとValueの対応が確認できる。
例えば、Keysでメンバー欄が2番となっているKeyの値 (Value) は、Valuesの画面でメンバー欄が2番となっているものとなる。
:::

ここに記載した手順は一例で、他の手順でも確認する方法はあります。

# Revit2024で拡張ストレージのデータを確認する方法
1. Revitの上部から「アドイン」タブをクリック。
1. Revit Lookupから「Snoop Database」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/e96f985f-7b54-6c65-082b-ad77d2d4e4a9.png)
1. 画面の左部からProjectInfoのプロジェクト情報 IDxxxxxをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/6845b5e0-08b2-3578-bb6a-a546b0dba1e7.png)
1. 画面右部に「GetEntity (Schema)」という項目があるのでクリック。 (新しい画面が開く)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/a42d0324-f88e-eb3a-5b57-d759f96de45a.png)
1. 画面左部のEntityの子要素にスキーマ名が表示される。任意のスキーマをクリックすると、画面左部のValue列にKeyとその値 (Value) が表示される。
1. もし表示されていない場合は以下のように「Get (String)」という項目があるのでクリックすると、Keyとその値 (Value) が確認できる。
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/5d191c88-1010-3dc7-dda4-8fde4692da37.png)

# 終わりに
今までRevit2021を使用しており、Revit2024に移行した際にRevitLookupのレイアウトが大きく変わっていたのでストレージの確認方法が少し迷いました。そのため備忘録として記載しました。
個人的な備忘録：ローカルで接続されているリモートリポジトリの確認と変更を試してみた

## はじめに
Gitを使用して開発を進める中で、ローカル環境とリモートリポジトリの接続状況を確認することは非常に重要です。

:::note warn
***リモートリポジトリの設定を正確に把握しておくことで、作業効率を上げ、トラブルを未然に防ぐことができます。***
:::

この記事では、リモートリポジトリの基本情報や詳細情報を確認する方法、リポジトリのURLを変更する方法について解説します。

## 書こうと思ったきっかけ
チーム開発や個人プロジェクトでGitを使っていると、リモートリポジトリの設定を変更したり、確認したりする必要がある場面がよくあります。

:::note alert
**しかし、これらの操作に慣れていないと、トラブルの原因になることも少なくありません。**
:::

そこで、リモートリポジトリに関する基本的な操作方法を整理し、自分自身の備忘録としてまとめることにしました。

## リモートリポジトリを確認する方法
### 1. リモートリポジトリの基本情報を確認
ローカルから接続されているリモートリポジトリの名前とURLを確認するには、以下のコマンドを使用します。

```bash
git remote -v
```

**出力例：**

```bash
origin  git@github.com:your-username/your-repo.git (fetch)
origin  git@github.com:your-username/your-repo.git (push)
```

- **origin**: リモートリポジトリの名前（デフォルトでは `origin`）。
- **URL**: リモートリポジトリの場所を表します。

### 2. リモートリポジトリの詳細情報を確認
さらに詳細な情報を確認する場合は、以下のコマンドを使用します。

```bash
git remote show origin
```

**出力例：**

```bash
* remote origin
  Fetch URL: git@github.com:your-username/your-repo.git
  Push  URL: git@github.com:your-username/your-repo.git
  HEAD branch: main
  Remote branches:
    main tracked
  Local branches configured for 'git pull':
    main merges with remote main
  Local ref configured for 'git push':
    main pushes to main (up to date)
```

- **Fetch URL / Push URL**: リモートリポジトリのURL。
- **HEAD branch**: デフォルトで参照されるブランチ（通常は `main`）。
- **Remote branches**: リモートでトラッキングされているブランチ。

###  3.補足情報

**リモートリポジトリが設定されていない場合**

`git remote -v` を実行しても、何も表示されないことがあります。これは、リモートリポジトリが設定されていない場合です。

```bash
git remote -v
# 出力: （何も表示されない）
```

**新しいリモートリポジトリを追加する**

以下のコマンドを使用して、新しいリモートリポジトリを追加できます。

```bash
git remote add origin <リポジトリのURL>
```

**例：**

```bash
git remote add origin git@github.com:your-username/your-repo.git
```

***これらの方法を使えば、ローカルで接続されているリモートリポジトリを簡単に確認・設定できます。***

## 既存のリモートリポジトリのURLを更新する

リモートリポジトリを変更する場合は、現在のリモートリポジトリを削除して新しいリモートリポジトリを追加するか、既存のリモートリポジトリのURLを更新します。

```bash
git remote set-url origin <新しいリポジトリのURL>
```

変更が反映されたか確認するには、以下のコマンドを実行します。

```bash
git remote -v
```

## まとめ

ここまでお読みいただき、ありがとうございました。**今回は、リモートリポジトリに関する重要な内容をまとめましたが、整理しながら記録することで、自分自身の理解も深まりました。**

:::note info
**こうした基礎的な内容を継続的にアウトプットすることで、自分の知識を深めるだけでなく、必要なときに振り返るための良いきっかけを作りたいと考えています。**
:::

***この記事が少しでも皆さんの参考になれば幸いです！***
crontabで秒レベルの排他実行を登録する



<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/3c4a33ef-328d-4d30-d476-003b74e64dc8.png" alt="linux" width="156">

crontabのスケジューリング最小単位は分指定だが、秒単位で実行させて、並列処理されては困るときの排他実行の組み方。

## 10秒おきに排他実行をスケジュールする例

```sh:crontab
* * * * * flock -xn /path/to/task.lock -c /path/to/task.sh
* * * * * sleep 10; flock -xn /path/to/task.lock -c /path/to/task.sh
* * * * * sleep 20; flock -xn /path/to/task.lock -c /path/to/task.sh
* * * * * sleep 30; flock -xn /path/to/task.lock -c /path/to/task.sh
* * * * * sleep 40; flock -xn /path/to/task.lock -c /path/to/task.sh
* * * * * sleep 50; flock -xn /path/to/task.lock -c /path/to/task.sh
```

## 秒単位の指定

`sleep`コマンドで寝かせて遅延実行させる

```sh:crontab
# 30秒周期で実行
* * * * *  コマンド
* * * * *  sleep 30; コマンド
```


```sh:crontab
# 20秒周期で実行
* * * * *  コマンド
* * * * *  sleep 20; コマンド
* * * * *  sleep 40; コマンド
```

## 排他制御

`flock`ファイルロックで排他制御する。

### flock

**-x**オプション

ファイルロックを取得する。

**-n**オプション

取得できない場合は終了させる。

**-c**オプション

実行させるコマンドを渡す。

```sh:crontab
* * * * * flock -xn /path/to/task.lock -c ‘/path/to/task.sh’
```
エラーまとめ

プログラミングや開発の現場でよく耳にするエラーにはさまざまな種類があります。ここでは代表的なエラーや原因・対処法の概要を挙げてみます。

# 1. 文法エラー (Syntax Error)
概要
プログラミング言語の文法ルールに従っていない場合に発生します。記号の付け忘れや誤った構文、対応が取れていないカッコなどが主な原因です。
例
括弧やクォートの閉じ忘れ
セミコロン(;)やコロン(:)の打ち忘れ
対策
エラーメッセージで指摘された行や付近を確認する
文法ハイライトや静的解析ツールを活用し、ミスを早期に検知する
# 2. 参照エラー (Null Pointer Exception / Undefined Reference など)
概要
存在しないオブジェクトや変数を参照したり、null(あるいは None) になっている変数を使おうとしたときに発生します。
例
Java で null のオブジェクトにメソッドを呼び出そうとする
JavaScript で未定義の変数にアクセスする (ReferenceError)
対策
変数やオブジェクトが有効な値を持っているか常にチェックする
必要に応じて null 代入や未定義を避けるための初期化を行う
例外処理やオプショナルな型を活用する (例: Swift の Optional, Kotlin の Null-Safety など)
# 3. 型エラー (Type Error)
概要
データ型が合わないまま代入・演算・メソッド呼び出しなどを行ったときに発生します。
例
文字列型に数値を直接代入しようとしてしまう
整数で割り算するときにゼロ除算(0で割り算)をする
対策
言語ごとの型システムを理解し、正しい型変換 (キャストやパースなど) を行う
使っているライブラリやAPIの返却値の型を確認する
テストなどで型の不一致がないかチェックする
# 4. インデックスエラー (Index Out of Bounds Exception)
概要
配列やリストなどで、存在しないインデックス（範囲外）を指定してアクセスすると発生します。
例
配列の範囲が [0..4] なのに array[5] を参照
空のリストの先頭要素を参照しようとしてエラーが発生
対策
配列・リストを扱うときは常に範囲チェックを行う
言語機能(例えば C++ の at() や Python の範囲チェック)を積極的に活用する
データ取得時に、要素数の確認や空判定を入れる
# 5. ファイルやネットワーク関連のエラー (I/O Error, FileNotFound Error, Timeout など)
概要
ファイル操作やネットワーク通信時に、ファイルが見つからない、権限がない、接続がタイムアウトするなどで発生します。
例
存在しないファイルパスを指定してファイルを開こうとする (FileNotFound)
読み込み専用ファイルに書き込み処理をしようとする (Permission Denied)
サーバーが応答せず通信がタイムアウトする (Timeout Error)
対策
ファイルパスが正しいか、ファイルが存在するか事前にチェックする
ファイルや通信を行う前後で例外処理をしっかり書いておく
ネットワーク通信では再試行 (Retry) の仕組みやタイムアウト設定を行う
# 6. 競合・同期エラー (Concurrent Modification, Deadlock, Race Condition など)
概要
マルチスレッドや複数のプロセス間でリソースを共有するときに、データが同時に書き換えられたり、ロックのタイミングが衝突することで発生します。
例
あるコレクションを走査中に別のスレッドが同時に変更してしまう (ConcurrentModificationException など)
二つのスレッドがお互いのリソースを待ち合って永久に処理が進まなくなる (デッドロック)
対策
排他制御 (Mutex, Lock, Synchronized など) を正しく使用する
スレッドセーフなライブラリやデータ構造を活用する
共有リソースを極力減らし、読み取り中心か書き込み中心かを分離する
# 7. メモリ関連のエラー (Out of Memory, メモリリーク, Segmentation Fault など)
概要
プログラムが必要以上のメモリを使用する、あるいは不正アクセスを行うと発生します。
例
C/C++ でヒープメモリを確保したあと解放を忘れてメモリリークを起こす
ポインタの操作ミスによって OS が割り当てていない領域にアクセスしてセグメンテーション違反
巨大なデータを読み込んで Java のヒープがいっぱいになり OutOfMemoryError
対策
メモリ管理が必要な言語(C/C++)では確保と解放の対応を徹底する
ガーベジコレクション言語でも一度に大きなデータを取り扱う場合は設計を見直す
メモリ使用量を監視・計測するためのツール (profiler) を利用する
# 8. バージョン不整合エラー (Dependency Error, Version Conflict など)
概要
ライブラリやフレームワーク、依存しているパッケージのバージョンが合わないときに発生します。
例
Node.js のライブラリ同士が異なるバージョンでコンフリクトを起こす
Python で Django や NumPy などのバージョンが古く、一部の機能が実行時にエラーになる
対策
パッケージ管理ツール (npm, pip, Maven, Gradle など) を利用して依存関係を正しく管理する
プロジェクトごとに仮想環境やコンテナ(Docker)を使い、バージョンを明確に固定する
CI/CD 環境で依存関係を定期的にチェック・更新する
# 9. マージコンフリクト (Merge Conflict)
概要
Git などのバージョン管理システムで、同じファイルの同じ箇所を別々に変更した場合に発生します。
例
AさんとBさんが同じ行を修正し、プルリクエストやブランチをマージしようとするとコンフリクトが起こる
対策
コードをマージする前に最新のリモートブランチを取得し、自分の作業ブランチをリベースする
どちらの変更を採用すべきかを確認しつつ、手動でコンフリクト箇所を修正する
小まめにプッシュして、大きな変更を同時に行わないようにする
# 10. その他
警告 (Warning)
厳密にはエラーではありませんが、潜在的にバグにつながる可能性がある箇所に対してコンパイラや静的解析ツールが出すものです。無視せず内容を確認する習慣が大切です。
ロジックエラー (Logic Error)
プログラムは動くが、想定した結果や計算結果が得られない状態です。コンパイラエラーやランタイムエラーとは異なり、ロジックの間違い・設計不足・仕様理解不足が原因で起こるため、デバッグやテストでの発見が必要になります。
# まとめ
開発中に遭遇するエラーには、文法エラーや型エラーなどの基本的なものから、マルチスレッドプログラミングで起こる競合エラーやメモリリークなど、さまざまな原因と種類が存在します。エラーが起きた際は、

エラーメッセージをよく読む
該当箇所のコードや設定を確認する
必要に応じてログを出力して原因を追跡する
ドキュメントや公式リファレンスを参照する
といったプロセスで、問題を切り分けて解決していきましょう。
ほとんどTableauを触った事ない私がDATA Saberにチャレンジしてみた

2024年11月からDATA Saber Bridge 3rd（https://bridge.datasaber.world/)）
にて、DATA Saberにチャレンジ中です。
挑戦を決めた背景やこれまでの経験、そして現在進行形で感じている苦労や楽しさについて、書いてみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951242/4f8592fb-e6ce-a147-7841-0c4815d660b1.png)

## なぜDATA Saberに挑戦しようと思ったのか？
今年、デジタル推進人材育成プログラムである「マナビDX Quest」(https://dxq.manabi-dx.ipa.go.jp/))
というプロジェクトを知り、2024年夏から参加しています。マナビDXは、デジタル分野のスキルを磨きたい社会人にとってとても魅力的なプログラムで、そこで多くの素晴らしい方々と出会うことができました。

その中の1つのセッションで「DATA Saber」の存在を知ったのですが、マナビDXで機械学習の学習を進める中でEDA（探索的データ解析）の重要性を痛感し、BIツールを使ったデータの視覚化や分析への興味が高まっていたので「もっと深く理解したい」「これを仕事や日常で活かせる武器にしたい」と思い、DATA Saberに挑戦する事にしました。

## データ分析やプログラミングの経験について
これまで、仕事や趣味でExcelやAccessを使ったVBAや、PHP + データベースを組み合わせたデータ分析、可視化の経験がありました。そのため、「すでに十分では？」と思っている部分も正直ありました。特に、日常業務で使っている技術がそこそこ役立っていたので、新しいツールに挑戦することを少し先延ばしにしていたのかもしれません。

しかし、DATA Saberの学習で触れることになったTableauは、それまでの常識を大きく変えるものでした。短時間で多彩な視覚化表現ができること、そして視覚的なインパクトを持たせることで、データを「伝える」力が格段に向上することを実感しました。今では「もっと早く学んでおけば良かった！」と思いますす。

## DATA Saber挑戦中に苦労したこと（進行形ですが…）
DATA Saberの学びは非常に魅力的ですが、決して楽なものではありません。いくつかのポイントで苦労しながらも乗り越えています。

1. 計画的な学習時間の捻出が必要
　DATA Saberでは、90日間で10個の技術課題をクリアし、さらにコミュニティポイントを獲得した後に最終試験を突破する必要があります。調べてみると約100時間程度の学習時間が必要と言われたりしますが、それを仕事や日常の合間に捻出するのは、社会人にとってはなかなか大変なことです。
　私の場合、マナビDXの受講も並行して行っていたため、時間のやりくりには頭を悩ませました。平日は夜1～2時間、土日はまとまった時間を使うようスケジュールを組むことで、なんとか進めていますが、毎日の習慣化が非常に重要だと感じました。

2. Tableau初心者には難易度が高い
　DATA Saberで課される技術課題は、非常に本格的です。例えば1つの課題では10問以上の問題が出題され、その中には択一式だけでなく、複数選択や記述式の問題も含まれています。このすべてに正解しないと、次の課題に進めないという仕組みです。
　私はTableauの経験がほぼゼロの状態からスタートしたので、1つの課題をクリアするために解説動画を何度も見直す必要がありました。解説動画は2時間前後あるものも多く、それを繰り返し視聴し、試行錯誤を繰り返す作業は、正直かなり大変でした。とはいえ、その過程で得られる知識や気づきは非常に価値のあるものでした。

## 挑戦して良かったことと、これからの目標
苦労はありますが、それ以上にDATA Saberに挑戦して得たものは大きいです。特に、以下のようなスキルや考え方を身につけることができました。
1. 視覚化の重要性と可能性に気づけたこと
Tableauを使うことで、データの本質を直感的に伝えるスキルが身につきました。グラフやダッシュボードの作成を通じて、「どうすれば相手にとって分かりやすいか」を考える視点が大きく変わりました。
2. 根気強さと自己管理力の向上
全問正解しなければ進めない課題や、膨大な学習時間を捻出するという経験を通じて、計画性や忍耐力が磨かれました。
3. 学び続ける姿勢
「わからないことが出てきても、調べれば解決できる」という経験の積み重ねが、自己学習のモチベーションをさらに高めてくれました。

今の目標は、DATA Saberの課題を全てクリアし、最終試験に合格することです。そして、その先には、Kaggleのようなデータ分析のコンペに挑戦することも視野に入れています。

## 最後に
DATA Saberは決して簡単ではありませんが、その分、得られるものは非常に多いと感じています。これを読んでいる方の中で、「データ分析やBIツールに興味があるけど、ちょっと不安…」という方がいれば、ぜひ一歩踏み出してみてください。

私もまだまだ道半ばですが、こうした挑戦を通じて新しいスキルや自分の成長を実感できる毎日は、本当に充実しています。共に学び続ける仲間が増えることを楽しみにしています！
#6 npm installの--onlyオプションは非推奨

# npm install または npm ci の--onlyオプションは非推奨になっている

業務の関係で、既存の開発システムのDockerfileの記載方法を調査していたところ、```npm ci --only=production``` の--onlyオプションが非推奨となっていることに気づいたのでメモ。

```package.json``` または ```package-lock.json``` で管理している依存関係からライブラリをインストールする際に開発時にのみ必要なライブラリを除くためのオプションです。

現状は、```--omit-dev``` オプションを付けると良いようです。
Expo + React NativeでUUIDを生成する方法

# はじめに

web環境のUUIDと同じ以下の生成方法を試したところ

```typescript
import { v4 as uuidv4 } from "uuid";

const id = uuidv4();
```
こんなエラーが出ました。
```
Possible unhandles promise rejection (id: 0):
Error: crypto.getRandomValues() not supported.
```

解決できたので共有します。

# 方法

[こちらの公式](https://github.com/uuidjs/uuid?tab=readme-ov-file#react-native--expo)が参考になります。

具体的にはインポートするときに、以下の文章を追加するだけでした。
```typescript
// これを追加する
import "react-native-get-random-values";
import { v4 as uuidv4 } from "uuid";
```

# 終わりに

さっくりと解決しましたが、参考になるかもしれないので、共有しておきます。
【個人メモ】Dockerのお勉強　まとめ

# Dcoker まとめ
Dockerについて勉強したことをまとめました
## Docker  image  コマンド
### Docker  image  pull イメージ名
tagを指定することで好きなバージョンのImageをpullできる
何も指定しなかった場合、latestが紐づけられる
### Docker  image  rm イメージ名
image IDを指定することで好きなバージョンのImageを削除できる
何も指定しなかった場合、latestが削除される
### Docker  image inspect image名
デフォルトで設定されている詳細情報を確認することができる
デフォルトではbashが実行される
### docker image build -t イメージの名前:タグ dockerfileのディレクトリパス
Dockerfileから名前とタグを指定したイメージを作成
## Docker container コマンド
### Docker container run  image名
containerを実行するコマンド
containerにはup、run、exitedの３つの状態が存在する
末尾に実行したいコマンドを記述するとコンテナ起動後そのコマンドが実行される
### Docker container stop IDまたはimage名
コンテナの停止
### Docker container restart IDまたは image名
コンテナの再起動
### Docker container rm IDまたは image名
停止してるコンテナを破棄
up中のコンテナは破棄することができない
### docker  container  run  -p  ホストのポート:コンテナのポート  image名
ホストとコンテナのポートを紐づける
### docker  container  ls
どのポート番号が紐づいているか確認
## Docker file
### from
取得したいベースイメージ
### run
実行させたいコマンド
### copy
container内に指定のファイルやディレクトリをコピー
### cmd ["実行ファイル",　"パラメータ"]
コンテナ実行時のデフォルトコマンドを設定する
### arg キー=デフォルト値
イメージ作成時に利用する変数を渡す
### env 環境変数
環境変数を設定できる $変数で参照できる
### workdir ディレクトリパス
作業ディレクトリを変更する　指定したディレクトリが存在しない場合、作成して移動する
## .dockerignoreファイル
.がついているファイルは隠しファイル
記載したファイルやディレクトリはビルドコンテキストにいれないように指定できる
## Dockerイメージの永続化
### docker  volume  create  ボリューム名
新しいボリューム領域を作成
### docker  container  run  —mount  type=volume  src=vol名  dst=コンテナ内絶対パス  image名
ボリュームに接続しながらコンテナを起動するコマンド
## docker network
### ブリッジネットワーク
コンテナ通しの通信を橋渡しする機能
何も指定しないとbridgeという名前のブリッジネットワークに接続される
### 名前解決
自分で作成したブリッジネットワークは、IPアドレスを指定せずともコンテナ名を指定するだけで通信することができる
デフォルトのブリッジネットワークでは名前解決機能は使えない
### docker  network  create  ブリッジネットワーク名
ブリッジネットワークの作成
## その他
### -itオプション
-iで標準入力を可能にする
-tで出力される結果の見た目が綺麗になる
### Docker fileのサイズ
dockerファイルのサイズを小さくするには、イメージレイヤーを少なくする必要がある
【Azure】App Service 証明書の購入で注意すべき点

### 0. はじめに
**本記事ではApp Service 証明書の購入時の注意点をご紹介します。**

Azure環境でFront DoorやApplication Gatewayなどでカスタムドメインを利用する場合、自身で証明書を用意する必要があります。

信頼性の高いサーバ証明書が必要など、特別な要件がある場合を除き、App Service 証明書を購入するのがよいかと思います。理由は以下です。
・比較的、簡単な操作で証明書を購入できる
・証明書発行のリードタイムがほとんどかからない
・Azureを利用している場合は、リソースをAzureに集約できる
・他のAzureサービスと連携する場合、親和性が高い。纏めてMS社のサポートを受けることができるなど

:::note warn
App Service証明書をエクスポートして、利用可能ではありますが、証明書の適用先のサービスや製品の仕様などにより、利用不可の場合もあります。事前に製品サポートへ問い合わせるなど、適用先が利用可能かご確認頂くことをお勧めします。
:::

本記事では、App Service 証明書の購入からエクスポートまでの手続きの中で、実際につまづいた点を踏まえて、注意点をご紹介します。なお、詳細な手順について、以下の公式ドキュメントや他の方のブログで解説されてますので、割愛します。

https://learn.microsoft.com/ja-jp/azure/app-service/configure-ssl-app-service-certificate?tabs=portal

:::note info
こんな方にオススメ 
・App Service 証明書の購入を考えている
・App Service 証明書の購入の注意点を把握し、手戻りを防ぎたい
・サブドメインの委任をしている
・ワイルドカード証明書の利用を考えている
:::

### 1. 前提
本記事の前提は以下の通りです。
・ドメインについて、サブドメイン(sub1.example.com、sub2.example.com)とルートドメイン(example.com)を管理するDNSが別々の、Azureのサブスクリプションで構成されている
・サブドメインの委任を行っている
・複数のサブドメインに対応可能なようにワイルドカード証明書を利用する

### 2. App Service 証明書の購入の流れ
App Service 証明書(以下、証明書）購入の大まかな流れは以下の通りです。

①事前準備 (3-1. 事前準備)
②証明書を購入する (3-2. 証明書を購入する)
③証明書を Azure Key Vault に格納する (3-3. 証明書を Azure Key Vault に格納する)
④ドメインの所有権を確認する (3-4. ドメインの所有権を確認する)

上記完了後、証明書が利用可能となります。
詳細は以下のドキュメントを参照下さい。

https://learn.microsoft.com/ja-jp/azure/app-service/configure-ssl-app-service-certificate?tabs=portal#buy-and-configure-an-app-service-certificate


### 3. 各プロセスの留意事項
#### 3-1. 事前準備

証明書格納用のKey Vaultのコンテナを事前に用意する必要があります。

:::note warn
Key Vaultのコンテナの権限について、アクセスポリシーでKey Vaultに対する操作権限をサービスプリンシパル(Azure.CertificateRegistration)へ付与する必要があります。
:::

:::note warn
既存のKey Vaultを利用する場合で、RBACによりアクセス権限を制御している場合は注意が必要です。App Service 証明書はRBACに対応していません。その為、必要に応じて、新規にKey Vaultを作成し、アクセスポリシーによるアクセス制限を構成する必要があります。
:::

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875879/27b74ba3-805b-4ce9-6c67-cc89cd8fef2f.png)


https://learn.microsoft.com/ja-jp/azure/app-service/configure-ssl-app-service-certificate?tabs=portal

#### 3-2. 証明書を購入する
ワイルドカード証明書を購入する場合、購入時に以下を指定する必要があります。
　SKU：ワイルドカード
　ネイキッドドメインのホスト名：*.example.com
　(sub1.example.com、sub2.example.comに対応）

:::note warn
SKUでワイルドカードを指定し忘れないようにご注意下さい。
:::

#### 3-3. 証明書を Azure Key Vault に格納する
Key Vaultの格納でエラーが発生した場合は、事前準備で記載している、Key Vaultのアクセスポリシーの権限を見直すとよいです。

#### 3-4. ドメインの所有権を確認する
:::note warn
TXTレコードの登録について、AzureのDNSでサブドメインを委任している場合、サブドメインではなく、ルートドメインのDNSへTXTレコードを登録する必要があります。
:::

:::note warn
名前に @ を使用し、DNS レコードの値にドメイン検証トークンを使用して、ルート ドメインレベルでTXTレコードを追加する必要があります。
:::

ドメインの検証が上手く行かない場合は、上記の登録箇所や内容がきちんと登録されているか確認するとよいです。

### 4. まとめ
本記事ではApp Service 証明書の購入時の注意点をご紹介しました。
実際につまづいた部分を中心にご紹介しているので、上記を気をつけるだけで、手戻りやトラブルシューティングの時間を抑えることができるかと思います。本記事が皆様のお役に立てれば幸いです。

:::note info
過去のブログで、アプリケーション観点のサーバレス構成におけるアーキテクチャ検討やAzureのサービスプランの選定方法を紹介してます。興味のある方は、目を通して頂けるとありがたいです。　
:::

https://qiita.com/bluesea_nishi/items/921d1eeb2b4e3e836474

https://qiita.com/bluesea_nishi/items/400d94915eda231a7702

https://qiita.com/bluesea_nishi/items/4bcf46239a9d8758f81a

:::note warn
留意事項
・2025年1月時点の情報となります。Azureサービスの仕様等、変更になる可能性がございますので、最新の情報をご確認ください。
・個人の見解であり、会社と一切関係がありません。
:::
blastengineのGo SDKを使ってメール送信を行う

[blastengine（ブラストエンジン）](https://blastengine.jp/)はシンプルに使える開発者向けメールサービスを提供しています。何かと面倒なメール配信をシンプルに、かつ確実に送信先へ届くようになります。

現在、Go言語向けに、blastengine SDKを開発しています。今回は、即時配信メール（トランザクションメール）の送信方法を解説します。

## ユーザ登録する

[blastengine](https://blastengine.jp/)にユーザ登録します。管理画面に入るためのユーザID、パスワードが手に入るので、ログインします（ユーザIDは後で使います）。

## 送信元ドメインのSPFを設定する

送信元として利用するドメイン（自分で持っているもの）の設定をします。これは任意のドメイン管理サービスで設定できますが、TXTレコードに以下のSPFを追加します。

```
txt @ v=spf1 include:spf.besender.jp ~all
```

## APIキーを取得する

ログイン後、管理画面の右上にある設定メニューに移動します。

![getting-started-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/47b2b2ac-2e41-77fe-d84f-0ae0b7541f36.jpeg)

そして設定の中で、APIキーを取得します。

![getting-started-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/2b5ca124-3020-1d39-84e4-911cd4db27e2.png)

## 必要な情報について

SDKを使う上で必要なのは、先ほどのAPIキーとユーザIDになります。

## SDKのインストール

SDKは[blastengineMania/blastengine\-go: Blastengine Golang SDK](https://github.com/blastengineMania/blastengine-go)にて公開しています。インストールは `go get` で行います。

```bash
go get github.com/blastengineMania/blastengine-go
```

## 初期化

先ほどのAPIキーとユーザIDを使って初期化します。

```go
package main

import (
	"fmt"
	"github.com/blastengineMania/blastengine-go"
)

func main() {
	apiKey := "yourApiKey"
	userId := "yourUserId"
	client := blastengine.Initialize(apiKey, userId)
}
```

## トランザクションオブジェクトの作成

メールを即時配信する際にはトランザクションオブジェクトを使います。

```go
transaction := client.NewTransaction()
```

## 必要な情報をセットする

続けて、トランザクションオブジェクトに必要なオブジェクトをセットします。

```go
transaction.SetFrom("from@example.com", "Sender Name")
transaction.SetTo("to@example.com")
transaction.SetSubject("Test Subject")
transaction.SetTextPart("This is a text part")
transaction.SetHtmlPart("<p>This is an HTML part</p>")
```

後は `Send` メソッドで送信できます。

```go
err := transaction.Send()
if err != nil {
  fmt.Println("Failed to send transaction:", err)
} else {
  fmt.Println("Transaction sent successfully")
}
```

送信成功した場合は `transaction.DeliveryId` に送信IDが入ります。失敗した場合には、例外処理になります。

```go
transaction.DeliveryId
```

## コードについて

コードはGitHubにアップしてあります。ライセンスはMIT Licenseになります。

[blastengineMania/blastengine\-go: Blastengine Golang SDK](https://github.com/blastengineMania/blastengine-go)

## まとめ

blastengineには他にも一括メール配信を行ったり、添付ファイル付きのメール配信機能などもあります。これらの機能も随時実装していきますので、ぜひ皆さんのシステム開発に役立ててください。

[エンジニア向けメール配信システム「ブラストエンジン」](https://blastengine.jp/)
正規分布からサンプルを生成する方法

# 実行環境
Google Colaboratory

# パッケージなど
```
!pip install mplcyberpunk
!pip install watermark
```

```
import mplcyberpunk
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
import warnings
warnings.simplefilter('ignore')
```

# コード
```python:sample.py
# 標準正規分布からサンプルを3000個生成
sample = stats.norm.rvs(loc=0, scale=1, size=3000, random_state=0) #平均0、標準偏差1の正規分布から3000個のサンプルを作る
bins = np.arange(-4, 4, 0.05) #階級幅を指定

plt.style.use("cyberpunk")
plt.hist(sample, bins, alpha=0.8) 
plt.xlim(-4, 4)
plt.xlabel('$x$')
```
# 結果例
![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957867/1a5a7323-b7ee-3b07-7a25-add47c3e8d02.png)

# 補足
### 1行目
上の例では、平均（引数loc）・標準偏差（引数scale）を0と1にすることで標準正規分布からサンプルを生成しています。これらを変えることで様々な正規分布に変えることができます。

### 2行目
ここでやっているのは、「-4から4まで0.05刻みで数を配置する」ことです。必要に応じて変えてみてください。

### 最後4行
plt.style.use("cyberpunk")　の部分は書かなくても処理自体に影響はありません。お好みでどうぞ！
hist関数の行の意味は「sampleデータをbinsの階級幅、透明度0.8でヒストグラムを作成する」という感じです。
外資就活の振り返り

新卒就活を頑張って、１年たったので振り返る。個人の感想。
選抜コミュニティに所属し、他大学の就活生と共にwebテの問題集を作成していた。

# ❶お金を稼ぎたいかどうか。　
	外銀（新卒年収1000万）>> 外コン（新卒 700万）>外資IT（新卒 600万）
		
1. ばらつきはあるが、外銀のサマーインターンは遥かに厳しい。優秀な方が多く、新卒の最高到達点を感じられるため他社の選考に役立つ
1. 同期の人数は、外銀は1社あたり5~30人、外コンは30〜50人、外資ITは50人〜100人もちろんファーム次第であり、レイオフがあれば新卒採用人数も減る

# ❷将来的に、専門性を高めたいか
	スペシャリスト→外資IT>>外銀
	ジェネラリスト→外資コンサル
		
外資ITは将来的にも製品を担当する場合が多く、転職的でもスペシャリストとして重宝される。

# ❸今後のキャリア形成を決めているか
転職は本人次第でどこでも可能。

	外銀→CEO , 国際機関, PEファンド
	外コン→COO, 起業, VCファンド
	外資IT→CTO,  joint venture, ヘッジファンド

# ❹組織において、ルールを重要視するなら外銀、モラルを重要視するなら外資ITとなる。
カルチャーな距離を可視化すると以下の通り
```

ゴールドマン・サックス証券
モルガン・スタンレー証券
JPモルガン証券
_________
マッキンゼー・アンド・カンパニー
ベイン・アンド・カンパニー
ボストン コンサルティング グループ
_________________________________________
BofA（ビーオブエー）証券
シティグループ証券
A.T. カーニー
__________　
Microsoft Development
戦略大手 : EY, Deloite, PwC, KPMG, Accenture,IBM
Google
Facebook
__________
日本Microsoft
アマゾンジャパン／AWS
Cisco
Abem,ベイカレント
```
# ❺英語力
1. 外銀は、クライアントと英語でコミュニケーションをとる。社内でも基本的に英語を使う。
1. 未経験が想像する外資のイメージに近い
1. 外コンは、社内コミュニケーションや海外支社との打ち合わせ程度。プロジェクト次第なので選べる.
1. 外資ITは、メール/リファレンスが読めればOK。中途だと、TOEIC700点代もいるらしい。Googleは、チームに外国籍の方がいれば全て英語で進行する
# 感想
-キャリアについて私なりの考え-
結論、社会に深く根付いた慣習を変えるには、極端な「実行力」が必要です。
自分の力で環境を変えたいと願うのであれば、言葉だけでは足りないと思うのです。
それは例えば、時間/お金/立場/経験/技術などかもしれません。
12V 4pin RGB LED をマイコンで制御

# 動機

4年半ほど前に購入した 光るPCファン[`SCYTHE KazeFlex120 RGB PWM`](https://www.scythe.co.jp/product/fan/kazeflex120rgb-pwm)のRGB部は 4pin仕様なのですが、今回使用するマザーボードには、4pin RGB や ARGB のソケットがありませんでした。このため、マイコンで このファンのLEDを光らすことにしました。

<img width="300" alt="4pin.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/76113997-e915-aaff-2bc0-af08fb673a80.jpeg" />

_時代は ARGB のようで、当ファンも 4pin RGBコントローラーも、もはや製造していないようです。_



# 回路図

マイコンの 3.3V や 5V では、このLEDを光らすことは出来ません。また、マイコンで12Vを直接駆動することも出来ないため、MOSFETでスイッチングします。単なるON-OFF制御では 7色しか表現できないので、PWM制御して1677万色で光らせることにします。

<img width="400" alt="4pin-RGB.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/7cff8dd6-be5a-c438-4c92-f861c7736268.png" />



_N-ch MOSFET は、手持ちにあった 2SK4017 を使います。もちろん、12VはPCの電源（SATA電源）を利用します。_


# 使用するマイコン

CH552P か CH32V003 を使いたいところですが、PWMが 2本しか無かったり、複数のPWM制御が面倒だったりするため、今回は RP2040 を使い、お手軽に MicroPython でプログラミングすることにします。



# PWM 制御



|	 GPIO 	|	PWM	|	 RGB 	|
|	:-:	|	:-:	|	:-:	|
|	18	|	PWM-G	|	 Green  	|
|	17	|	PWM-R	|	 Red  	|
|	16	|	PWM-B	|	 Blue  	|

```python
from machine import Pin, PWM

pwm_g = PWM(Pin(18), freq=25000, duty_u16=0)
pwm_r = PWM(Pin(17), freq=25000, duty_u16=0)
pwm_b = PWM(Pin(16), freq=25000, duty_u16=0)
```

データシートによると、2SK4017 のスイッチング性能は、ターンオン時間：20ns、ターンオフ時間：35ns でした。実効性能を 40ns と想定して、周波数を 25KHz に設定します。明るさ（調光）は、普通に PWM のデューティ比で指定します。

```python
pwm_r.duty_u16(0)     # red-0% (off)
pwm_r.duty_u16(25000) # red-100%
pwm_r.duty_u16(12500) # red-50%
```

R, G, B の各色を 256階調で指定することにより、1677万色に対応します。

```python
def rgb(color):
    R, G, B = color
    pwm_r.duty_u16(int(25000 * (R / 255))) # R 256階調 (0-255)
    pwm_g.duty_u16(int(25000 * (G / 255))) # G 256階調 (0-255)
    pwm_b.duty_u16(int(25000 * (B / 255))) # B 256階調 (0-255)

rgb((162, 148, 200)) #ふじいろ(藤色)
```

```python:使用例
import time

def map(val, lo_val, hi_val, to_low, to_high):
    return (val - lo_val) / (hi_val - lo_val) * (to_high - to_low) + to_low

while True:
    r, g, b = 0, 0, 0
    for h in range(360):
        if h <= 120:
            r = map(h, 0, 120, 255, 0)
            g = map(h, 0, 120, 0, 255)
            b = 0
        elif h <= 240:
            g = map(h, 120, 240, 255, 0)
            b = map(h, 120, 240, 0, 255)
            r = 0
        else:
            b = map(h, 240, 360, 255, 0)
            r = map(h, 240, 360, 0, 255)
            g = 0
        rgb((r, g, b))
        time.sleep_ms(50)
```

_徐々に色が変化します。_


<img width="300" alt="rgbled.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/126de013-f6f1-5515-b2b0-d39481dc30b1.gif" />




# 実装

上記は`ブレッドボード`に回路を組んで動かした動画ですが、最終的には、`ユニバーサル基板`に回路を組んで、PCケース内に収める予定です。


**以上**
簡単AWS　IAM（Identity and Access Management）

## 【AWS IAM（Identity and Access Management）】
AWS IAM（Identity and Access Management）は、AWSのリソースに対するアクセス管理を行うサービスです。システムのセキュリティを確保するために非常に重要な役割を果たします。分かりやすく説明すると、IAMは「AWSリソースを誰がどのように利用できるか」を細かく制御する仕組みです。


AWSでは、EC2インスタンスに1回に割り当てられるIAMロールは1つのみです。つまり、同じEC2インスタンスに複数のIAMロールを同時に指定することはできません。

ただし、複数の権限が必要な場合、次の方法で対応できます。

1.IAMロールに複数のポリシーをアタッチ
複数の権限ポリシーを、EC2インスタンスに割り当てたIAMロールに追加できます。これにより、必要なアクセス権限を満たすことができます。

2.カスタムポリシーの作成
特定の権限が必要な場合、カスタムIAMポリシーを作成し、IAMロールにアタッチすることができます。この方法で複雑な権限要件にも対応できます。

3.AWS Lambdaなどのサービスを利用
他のAWSサービス（例えばLambdaなど）を使用して、一部の権限やタスクを分担し、単一ロールに対する依存を減らすことが可能です。
Cloudflare デプロイ時のversion変更方法


# はじめに

Cloudflare のデプロイ時の言語やツールの version を変更する方法をまとめます。

:::note info
2025/01/21 時点の情報で説明します。
本記事の内容は執筆時点の情報をもとにしています。ソフトウェアやツールのバージョンは変更される可能性があるため、最新の公式ドキュメントを確認してください。（各章に、当時参考にした公式ドキュメントの URL を記載しています。）
:::

# デプロイ中に発生したエラー

Cloudflare のデプロイ時に使用されている言語やツールの version と実際に使用されている version が異なるため、以下のようなエラーが発生しました。

yarn.lock の version と Cloudflare のデプロイ時の yarn の version が異なることが起因のエラー

```
00:11:22.079	➤ YN0000: ┌ Post-resolution validation
00:11:22.079	➤ YN0028: │ The lockfile would have been modified by this install, which is explicitly forbidden.
00:11:22.080	➤ YN0000: └ Completed
00:11:22.080	➤ YN0000: Failed with errors in 12s 220ms
00:11:22.138	Error: Exit with error code: 1
00:11:22.138	    at ChildProcess.<anonymous> (/snapshot/dist/run-build.js)
00:11:22.138	    at Object.onceWrapper (node:events:652:26)
00:11:22.138	    at ChildProcess.emit (node:events:537:28)
00:11:22.138	    at ChildProcess._handle.onexit (node:internal/child_process:291:12)
00:11:22.146	Failed: build command exited with code: 1
```

noden の version が異なることが起因のエラー

```
00:30:17.085	warning tailwind-variants@0.1.20: The engine "pnpm" appears to be invalid.
00:30:17.086	error next@15.1.5: The engine "node" is incompatible with this module. Expected version "^18.18.0 || ^19.8.0 || >= 20.0.0". Got "18.17.1"
00:30:17.096	error Found incompatible module.
00:30:17.096	info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
00:30:17.128	Error: Exit with error code: 1
```

# version 変更方法

https://developers.cloudflare.com/pages/configuration/build-configuration/#environment-variables

Settings -> Variables and Secrets から version を指定する。
以下の画像のように、`NODE_VERSION`と`YARN_VERSION`を指定してあげて、ビルドをする。
![cloudflare_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603981/e190d1e2-e28b-e6d8-e8fb-c1b66c0a71d6.png)

Settings の一番上に、デプロイ方法を`Production`か`Preview`のどちらかを指定する箇所があり、それぞれ version を指定してあげる必要があるので注意。
![cloudflare_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603981/7f02fc02-2a44-bf76-d32d-fa3e12d2023e.png)

# 変更可能な言語とツール一覧

https://developers.cloudflare.com/pages/configuration/build-image/#supported-languages-and-tools

こちらのページを確認すると、サポートされている言語とツールが一覧化されてます。各言語とツールの Environment variable を指定してあげれば、version を変更することができます。

![cloudflare_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603981/e3a508ce-ada0-327a-4cdf-8436046774db.png)
すべてのExcelシートをまとめてOACにアップロード

# はじめに
過去に複数のExcelシートをOAC（**Oracle Analytics Cloud**）にアップロードして、それらを結合してデータセットとして使用する方法を紹介しました。

- [Oracle Analytics Cloud：ひとつのデータセット内で複数のファイルを結合](https://qiita.com/tyo38/items/b9bff64a206020d99ead)

今回は、Excelワークブックの複数のシートをまとめてアップロードして、データセットとして定義する方法を紹介します。
※ OAC Jan 2025 Updateを使用しています。

# サンプルデータ
こちらのチュートリアルで提供されているExcelファイルを利用します。

https://docs.oracle.com/en/cloud/paas/analytics-cloud/tutorial-multi-file-dataset/#step_three

チュートリアルでは、
- customers.xlsx
- products.xlsx
- rephierarchy.xlsx
- sales.xlsx
- salesreps.xlsx

の5つのExcelファイルが提供されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/f2e93d68-3f4e-e6b6-e3ea-1e52148f6528.png)

これらのファイルをダウロードして、それぞれのデータ（シート）を1つのExcelワークブックにまとめました。
シート名も、わかりやすいように変更しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/24855e33-8eab-aaf5-11cb-8bdc67ce5638.png)

# サンプルデータのアップロード
OACにログインし、作成したExcelファイルをドラッグ＆ドロップしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/08ac7ebc-b347-eada-426b-0d51fc2b8090.png)

このように、アップロードするシートを選択できます。
今回は、「すべてのシート」を選択して「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/9676ac9f-4b2f-48bc-2519-911adb0b0e12.png)

# 結合を確認しデータセットを保存
データセットの編集画面に自動的に移動しました。
しかも、アップロードされたそれぞれのシートが自動的に結合されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/196d266a-fd72-e709-f749-81e55303b2d9.png)

自動的に結合されたのは、同じ名前・データタイプの列がそれぞれのシートにあったためです。
サンプルデータを借りてきたチュートリアルを見ながら、正しく結合されていることを確認します。
[参考情報](https://docs.oracle.com/en/cloud/paas/analytics-cloud/tutorial-multi-file-dataset/images/salesreps_to_rephierarchy.png)

見比べると、sales -> salesreps -> rephierarchy となるべきところが
SALES -> REPHierarchy -> SALESREPS となっており、結合の順番が違います。

修正したのが、こちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/07c52910-3cb3-0fb5-3f37-9291f307a8f9.png)

データセットに名前をつけて保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/9260e3c2-b70f-0471-cc3f-b181f6e903f5.png)

# 分析
作成したデータセットを使ってワークブックを作成します。
任意の項目を使用してビジュアライゼーションを作成してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/1616dbbf-5893-44ea-c753-e528c219c35e.png)
個人的な備忘録：Go言語用Dockerfileをローカルで動かし、ブラウザから『Hello, World!』を表示してみた

## はじめに
最近、受講中のITスクールでハッカソンに参加したことをきっかけに、Googleが開発したGo言語に積極的に触れていこうと考えています。

前回の記事では、Go言語用のDockerfileなどをシェルスクリプトで一括作成しました。

https://qiita.com/free-honda/items/da3768998fa4f9c6d07b


***今回は、それらを使ってローカル環境で実際に動作確認を行います。***

今回の内容は、自分用の備忘録としてまとめたものです。***その点をあらかじめご了承いただければ幸いです。***

## 書こうと思ったきっかけ
前回の記事で作成したDockerfileを使って、ローカル環境で動作確認をしようと考えました。

:::note warn
***しかし、記事のボリュームが大きくなってしまったため、今回、別の記事としてまとめることにしました。***
:::

補足として、今回は内容が比較的短めです。**ただし、基本的なDockerを立ち上げるコマンドもご紹介していますので、ぜひ参考にしてみてください。**

## 今回のプロジェクト内容について
今回のプロジェクトは、以下のようなGo言語を使ったシンプルな構成です。ブラウザで `Hello, World!` と表示されれば成功です。

```go
hello-world/
├── Dockerfile
├── go.mod
├── go.sum
└── main.go
```

この構成については、前回の記事でシェルスクリプトを使って一括作成しています。

:::note info
***詳しく知りたい方は、ぜひこちらの記事をご参照ください。***
:::

https://qiita.com/free-honda/items/da3768998fa4f9c6d07b

## 実際にローカルで動かしてみた
ここでは、Dockerアプリケーションが正常に起動していることを前提に進めていきます。

### ローカルでのビルドと実行
以下のコマンドを使用して、Dockerイメージのビルドとコンテナの実行を行います。

```bash
docker build -t hello-world .
docker run -p 1323:1323 hello-world
```

***上記のコマンドを実行すると、ターミナルに以下のようなログが表示されます。***

```bash
➜  hello-world git:(main) ✗ docker run -p 1323:1323 hello-world

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.10.0
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:1323
```

### curl で動作確認
まずは以下のコマンドを実行し、`curl` でアプリケーションが正常に動作しているか確認します。

```bash
curl http://localhost:1323
```

実行結果として、問題なく `Hello, World!` が表示されていることが確認できました。

```bash
➜  hello-world git:(main) ✗ curl http://localhost:1323
Hello, World!
```

これにより、プロジェクトが正しく構築されていることが確認できました。

***最後にブラウザから `http://localhost:1323` にアクセスし、表示を確認します。***

![Screenshot 2025-01-21 at 9.22.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/11cd8663-8627-5ccd-35c6-e2dc8fd7afe2.png)

## まとめ
ここまでお読みいただき、ありがとうございました。***ローカル環境でも、実際にブラウザでアプリケーションが動作しているのを確認すると、とても嬉しく感じます。***

:::note info
**こうした基礎的な内容を継続的にアウトプットすることで、自分の知識を深めるだけでなく、必要なときに振り返るための良いきっかけを作りたいと考えています。**
:::

***この記事が少しでも皆さんの参考になれば幸いです！***
[Python] Cosmos DBのデータをJSONにエクスポートする方法

# Cosmos DBのデータをJSONファイルにエクスポートする方法
ローカルで動かす前提のコードです。

```python
import json
import os
import yaml
from azure.cosmos import CosmosClient
from azure.identity import DefaultAzureCredential

# Cosmos DBクライアントの初期化
cosmos_db_endpoint = "https://hogehoge-cosmos.documents.azure.com:443/"  # 実際のエンドポイントに置き換える
cosmos_db_name = "hogehoge_db"  # 実際のDB名に置き換える
cosmos_db_container_name = "hogehoge_container"  # 実際のコンテナ名に置き換える


def export_cosmosdb_data_to_json(database_name: str, container_name: str, file_name: str):
    """
    Cosmos DBからデータをエクスポートしてJSONファイルに保存する。
    """
    # Azureのデフォルトクレデンシャルを使用してCosmosClientを作成
    azure_credential = DefaultAzureCredential()
    client = CosmosClient(cosmos_db_endpoint, credential=azure_credential)

    # データベースクライアントを取得
    database = client.get_database_client(database_name)

    # コンテナクライアントを取得
    container = database.get_container_client(container_name)

    # クエリの実行（全データを取得）
    query = "SELECT * FROM c"
    items = list(container.query_items(query, enable_cross_partition_query=True))

    # データをJSONファイルに書き込み
    with open(file_name, 'w', encoding='utf-8') as f:
        json.dump(items, f, ensure_ascii=False, indent=4)

    print(f"{container_name} のデータのエクスポートが完了しました。ファイル名: {file_name}")


if __name__ == "__main__":
    # エクスポート対象のコンテナと出力ファイル名
    container_name = cosmos_db_container_name
    file_name = f'{container_name}.json'

    # 実行：データをJSONにエクスポート
    export_cosmosdb_data_to_json(cosmos_db_name, container_name, file_name)
```

## 使い方

1. **Azure環境への認証**  
   `DefaultAzureCredential` はローカル開発環境やAzure環境での認証情報を自動的に取得します。必要に応じて、VS Codeの拡張機能や`az login`などのAzure CLIコマンドでログインしておきます。

2. **エンドポイント/DB/コンテナ名の設定**  
   `cosmos_db_endpoint`、`cosmos_db_name`、`cosmos_db_container_name` を実際の値に置き換えます。

3. **スクリプトの実行**  
   ターミナルやコマンドプロンプトで `python <ファイル名>.py` を実行すると、指定されたコンテナの全ドキュメントがJSONファイルとして出力されます。

これにより、Cosmos DBから取り出したデータをローカル環境にバックアップしたり、他のシステムで解析するために活用したりできます。機密情報（接続文字列やエンドポイントなど）が含まれる場合は、`.env` ファイルを使うなどして適切に管理してください。
Javaで「色とりどりの楕円を重ねて表示する」の動作を確認してみた。

# 概要

Javaで「色とりどりの楕円を重ねて表示する」の動作を確認してみました。

# 実装

以下のファイルを作成しました。

```Daen.java
import java.awt.*;
import javax.swing.*;
import java.util.Timer;
import java.util.TimerTask;

public class Daen {
    public static void main(String[] args) {
	JFrame frame = new JFrame();
	//  タイトル名を設定
	frame.setTitle( "タイトル" );
	// フレームの大きさを設定
	frame.setSize( 500, 500 );
	// ”×”ボタンを押した時の処理を設定
	frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
	// フレームにパネルを追加
	MyPanel3 panel = new MyPanel3();
	frame.getContentPane().add( panel );
	// フレームを表示
	frame.setVisible( true );
    }
}


// JPanelを継承したMyPanelを作成
class MyPanel3 extends JPanel {
    public MyPanel3() {
	TimerTask task = new TimerTask(){
		public void run(){
		    repaint();
		}
	    };
	Timer timer = new Timer();
	timer.scheduleAtFixedRate(task, 0, 1000);	
    }
    // 描画
    public void paintComponent( Graphics g ) {
	super.paintComponent( g );
    }

    public void paint(Graphics g){
	setBackground( Color.black );
	g.setColor(Color.white);
	g.fillRect(0,0,500,500);
	for(int i=0; i<100; i++){
	    g.setColor(new Color((int)(Math.random()*256.0),
				 (int)(Math.random()*256.0),
				 (int)(Math.random()*256.0)));
	    double x = Math.random();
	    double y = Math.random();
	    g.fillOval((int)(x*256.0),
		       (int)(y*256.0),
		       (int)(x*256.0)+1,
		       (int)(y*256.0)+1);
	}       	
    }
}
```

以下のコマンドを実行しました。

```
$ javac Daen.java 
$ java Daen
```

実行結果は以下の通りでした。

![Screenshot from 2025-01-21 09-19-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/e118f9c7-b1ec-b691-edfa-42748564e388.png)

# まとめ

何かの役に立てばと。
Yamaha RTX 1200 と Elecom WAB-I1750-PS でタグ VLAN

# はじめに
先日 Twitter を眺めていたところ、エレコムのオンラインストアにて業務用 AP が 1 台 1500 円程度で売られていると話題になっていました。

https://x.com/udp_5060/status/1762444721555972247

このところ少しネットワークの勉強をしてみようとルーターやらあれこれ購入していたところだったので、この AP をそれらに組み合わせてみることにしました。

ちなみにこの製品、 AC 給電のポート自体は存在しますが PoE 環境に導入される想定で作られているらしく AC アダプターが別売りとなっています。


[公式サイト](https://www.elecom.co.jp/products/WAB-I1750-PS.html) の仕様曰く

> 定格入力電圧 IEEE802.3af 37V-57V / IEEE802.3at 42.5V-57V、消費電力 12.5W、発熱量 45.0kJ/h

とのことなので、そこまで大出力が必要というわけでもなさそうです。

今回はとりあえず PoE インジェクターを購入して電源供給を行いました。

https://amzn.asia/d/43LD1Ky

# 環境
ルーター=Yamaha RTX1200
AP=Elecom WAB-I1750-PS

無線で飛ばすネットワークは
- address=192.168.10.0/24 
- vlan id=10

とします。

# ルーター側(RTX1200)
VLAN の設定を行います。
```
vlan lan1/1 802.1q vid=10 name=vlan10
ip lan1/1 address 192.168.10.1/24
```

# AP 側(WAB-I1750-PS)
## 接続
セットアップするために、ネットワークへ **繋いでいない** パソコンを用意してください。

1. WAN 側のポートを構築済みのネットワークへ **繋がずに** 、 LAN 側のポートとセットアップ用パソコンの LAN ポートを接続する
1. セットアップ用パソコンの IP アドレスを `192.168.3.2` に設定する
1. ブラウザで `192.168.3.1` に接続する
1. ユーザー名 `admin`、パスワード `admin` を入力する

とりあえずこれでメニューを開くことができます。

## ファームウェアアップデート
もう 10 年以上前に発売された製品にはなりますが 2024 年 8 月にファームウェアの更新が入っているので適用しましょう。

https://www.elecom.co.jp/support/download/network/wireless_lan/ap/wab-i1750-ps/

ダウンロードした zip ファイルの中に入っている .bin ファイルを、 Web GUI の「ツールキット」にあるファームウェアアップデートから指定してアップデートします。

適用されたのち自動で再起動するので 2 分ほど待ちます。

## VLAN 設定
VLAN の設定へ入る前に、この辺りで管理者パスワードや NTP の設定をしておくと良いと思います。

### 無線設定
まずは無線の設定をします。
2013 年発売の製品ながら IEEE 802.11ac に対応しているので、どうせだったら速いやつを使ってみましょう。

なお、セキュリティ設定に関しては WPA2-PSK までの対応となっています。
2018 年発表の WPA3 には対応していません。
Pre-shared キーに UUID でも突っ込んでおきましょう。

SSID 名欄の後ろに VLAN ID の欄があるので忘れずに入力します。

設定を適用したら無線に関する設定は終了です。

### LAN 側 IP アドレスの変更
現時点では AP の IP アドレスが 192.168.3.1 ですが、 192.168.10.0/24 にくっつけたいので 「LAN 側 IP アドレス」から設定を変更します。

- IP アドレス割り当て = 静的 IP アドレス
- IP アドレス = 192.168.10.2
- サブネットマスク = 255.255.255.0
- デフォルトゲートウェイ = ユーザー定義 / 192.168.10.1

これらの設定を適用するともちろん Web GUI にアクセスするためのアドレスも変わるので、セットアップ用パソコンのアドレスを変えつつ設定したアドレスに再度接続します。

### VLAN の設定
VLAN の設定をします。

メニュー左側の「VLAN」を開き、有線ポート(**PD**)を「**タグ付きモード**」にし、VLAN ID を 10 にします。

また、無線の欄で先ほど設定した SSID の VLAN ID が 10 になっているか確認します。

ここまで適用できたら AP の WAN 側を RTX1200 と繋ぎましょう。

# 感想
すごく良いおもちゃを手に入れられてうれしいです。
【AWS】IAM に関する用語の整理

# はじめに
この記事では、AWS の IAM (Identity and Access Management) に関する用語を整理します。

https://docs.aws.amazon.com/iam/

# IAM
まずは、IAM そのものについてです。

- AWS リソースへのアクセスを安全に関するためのサービス
- ユーザーアクセス管理: IAM ユーザー、IAM グループ
- AWS リソースアクセス管理: IAMロール

# IAM ユーザー
- AWS を利用するアカウント
- IAM ポリシーで IAM ユーザーにアクセス権限を付与する

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html

IAM ユーザーの作成手順はこちらの記事に記載しています。

https://qiita.com/Yasushi-Mo/items/0e5e2b56e1d85c9d05cd

# IAM ポリシー
- 「何に対して」「どのような操作を」「許可 or 拒否するか」を示したもの

https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html

:::note
IAM ポリシーで許可と拒否の両方の権限が付与された場合、拒否が優先される
:::

- IAM ポリシーには3種類ある

https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html

## AWS 管理ポリシー
- AWS によって定義されているポリシーのテンプレート
- ex. 管理者権限、PowerUser

## カスタマー管理ポリシー
- ユーザーが自身で作成・管理するポリシー

## インラインポリシー
- IAM ユーザーや IAM グループに埋め込まれたポリシー

- ポリシー設定を個別に適用


:::note
- 管理ポリシー: 複数のユーザー・グループにまとめて適用
- インラインポリシー: 対象ごとに個別に適用
:::

# IAM グループ
- 複数の IAM ユーザーをまとめて管理

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html

# IAM ロール
- AWS リソースに対して権限を付与
- ex. EC2 で S3 の操作が必要な場合、EC2 に S3 へのアクセス権限を IAM ロールで付与する

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html

# 参照
- [IAM とは](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/introduction.html)
- [IAM roles](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)
- [IAM users](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)
- [IAM user groups](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)
- [Managed policies and inline policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html)
- [Policies and permissions in AWS Identity and Access Management](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)
Windows11 ショートカット

# 目次
[1.Explorer](#1-Explorer)

# 1. Explorer

|キー|内容|
|---|---|
|Alt + ↑|一つ上の階層のフォルダ|
|Alt + ←|前に居たフォルダ（階層に関係なく表示順）|
|Alt + →|次に居たフォルダ（階層に関係なく表示順）|
|Shift + DEL|ファイルをすぐに削除|
|Control + Shift + n|新規フォルダ作成|
|Windows + Shift + s|スクリーンショット|
|Windows + e|新規Explorerウインドウ表示|

# 2. Outlook

※キーの間が「-」の場合、前のキーから指を話して次のキーを押す。

|キー|内容|
|---|---|
|Alt - N - A - S - Enter |署名を入力|
自分用ショートカットまとめ（Windows）

## Windows
|説明|コマンド|
|:----------- |:------------:|
|スタートメニュー表示|windows|
|エクスプローラ起動|windows + e|
|ファイル名を指定して実行|windows + r|
|コンピュータのロック|windows + l|
|モニター表示の切り替え|windows + p|
|デスクトップの表示|windows + d|
|ウィンドウの最大化|windows + ↑|
|ウィンドウの最小化|windows + ↓|
|タスクバーにアクセス|windows + [番号]|
|開いている項目の切り替え 立体的に|windows + tab|
|開いている項目の切り替え|alt + tab|
|ファイル名の変更|ファイルを選択してF2|
|スニッピングツールの起動|windows + shift + s|
|仮想デスクトップの切り替え|ctrl + windows + (← or →)|

## Excel
|説明|コマンド|
|:----------- |:------------:|
|行追加|ctrl + shift + "+" |
|行削除|ctrl + "-" |
|行選択|shift + space ※事前のIME設定が必要 |
|列選択|ctrl + space |

## Chrome
|説明|コマンド|
|:----------- |:------------:|
|新規タブ|ctrl + t|
|新規ウィンドウ|ctrl + n|

## Eclipse
|説明|コマンド|
|:----------- |:------------:|
|importの再編成|ctrl + shift + o|
|ウィンドウサイズの最大化・元のサイズに戻し|ctrl ＋ m|
|タブの移動|Fn ＋ ctrl ＋ PgUp、PgDn|
|選択した単語を上方向に検索|ctrl ＋ k|
|選択した単語を下方向に検索|ctrl ＋ shift ＋ k|
|入力補助|ctrl ＋ space|
|選択したクラス・変数定義にジャンプ|F3|
|ファイル内検索|ctrl ＋ f|
|プロジェクト内検索|ctrl ＋ h|
|指定行に移動|ctrl ＋ l|
|スペースをタブに|ctrl ＋ alt ＋ tab|
|タブをスペースに|ctrl ＋ alt ＋ space|
|ソースのコメント化を切り替え|ctrl ＋ shift ＋ c|
|パースペクティブを切り替え|ctrl ＋ F8|
|ビューを切り替え|ctrl ＋ F7|
|選択行の直前に追加|ctrl + shift + enter|
|選択行の直後に追加|shift + enter|