OmniAICreator/Qiita-1.07M huggingface dataset:
ChatGPTをフル活用！プロンプトチートシート

# はじめに
ChatGPTを最大限に活用するためには、適切なプロンプトを作成することが重要です。本記事では、ChatGPTの効果的なプロンプトの作り方や具体例を紹介します。

## 1. プロンプトの基本

プロンプトとは、ChatGPTに与える指示のことです。プロンプトが明確で具体的であるほど、より望ましい回答を得ることができます。

### 良いプロンプトのポイント
- **具体的に書く**（例：「Pythonでリストの要素をソートするコードを書いて」）
- **文脈を明示する**（例：「初心者向けに説明して」）
- **出力形式を指定する**（例：「表形式でまとめて」）
- **不要な曖昧さを避ける**（例：「短めの説明が欲しい」ではなく「50文字以内で説明して」）
- **例示を加える**（例：「関数の例を含めて説明してください」）

## 2. プロンプトの種類と例

### 2.1 情報収集
```
Pythonのデータ型について簡単に説明してください。
```
```
最新のWeb開発トレンドを教えてください。
```
```
クラウドコンピューティングのメリットとデメリットを比較してください。
```

### 2.2 コード生成
```
PythonでFizzBuzzを実装するコードを書いてください。
```
```
JavaScriptで現在の日付を取得する関数を作成してください。
```
```
SQLでデータをグループ化し、平均値を求めるクエリを書いてください。
```

### 2.3 コードの説明
```
以下のPythonコードの動作を解説してください：
def factorial(n):
    return 1 if n == 0 else n * factorial(n - 1)
```
```
このJavaScriptのコードが何をしているのか説明してください。
const sum = (a, b) => a + b;
```

### 2.4 文章作成
```
ChatGPTの活用方法についてブログ記事を書いてください。
```
```
商品紹介のキャッチコピーを3つ提案してください。
```
```
5G技術の未来についてのレポートを書いてください。
```

### 2.5 学習・要約
```
ニューラルネットワークの基本について初心者向けに説明してください。
```
```
この文章を100文字以内で要約してください。
```
```
この研究論文の要点を箇条書きでまとめてください。
```

## 3. 高度なプロンプトのテクニック

### 3.1 役割を指定する
```
あなたは経験豊富なデータサイエンティストです。データ分析の基本を初心者向けに説明してください。
```
```
あなたはプロのマーケティング担当者です。新商品の販促戦略を提案してください。
```

### 3.2 ステップバイステップで指示する
```
Reactアプリを作成する手順をステップバイステップで説明してください。
```
```
PythonでAPIを作成する手順を順番に説明してください。
```

### 3.3 出力のフォーマットを指定する
```
Pythonの基本構文を表形式でまとめてください。
```
```
このデータをCSV形式で出力してください。
```
```
この文章をMarkdown形式に変換してください。
```

### 3.4 ChatGPT的に嬉しいプロンプト
```
論理的に矛盾がないように回答を作成してください。
```
```
前提条件を明示した上で、専門的な知識に基づく詳細な回答をお願いします。
```
```
簡潔かつ明瞭な文章で、初心者にもわかりやすく説明してください。
```
```
ユーモアを交えつつ、分かりやすく要点を説明してください。
```

## 4. より効果的なプロンプトの工夫

ChatGPTの出力の精度を上げるためには、以下の工夫をするとよいでしょう。

- **文脈を提供する**：どのような背景や前提があるのかを伝える。
- **出力の長さを指定する**：短め、詳細に、箇条書きで、など。
- **スタイルを指定する**：カジュアル、フォーマル、簡潔、詳細など。
- **複数の視点を求める**：メリットとデメリット、異なる立場の意見など。

## 5. まとめ
ChatGPTを活用するには、適切なプロンプトの作成が鍵となります。目的に応じてプロンプトを工夫し、明確で具体的な指示を出すことで、より質の高い回答を得られます。本記事で紹介したプロンプトを参考に、ぜひ実践してみてください！
【合格体験記】AWS Certified AI Practitioner(AIF)

## はじめに
先日、AWS Certified AI Practitioner試験に合格しました！AIやクラウドに興味はあるものの、技術的なバックグラウンドに自信がない方々へ、私の学習journey（道のり）をお伝えできればと思います。

この資格は、AWSのAIサービスの基礎知識を証明する比較的新しい認定資格で、AI・機械学習の概念から実践的なAWSのサービス活用まで、幅広い知識を問われます。

技術者だけでなく、ビジネス側でAIプロジェクトに関わる方々にも推奨される資格となっています。

この記事では、私が取り組んだ学習方法、使用した教材、つまずいたポイントなど、リアルな体験をベースに、これから挑戦される方々のお役に立つ情報をお伝えしていきたいと思います。

## AWS Certified AI Practitionerとは
AWS Certified AI Practitioner（AIF）は、AWSが提供する新しい認定資格で、人工知能（AI）、機械学習（ML）、および生成AIに関する基礎知識を証明するものです。
この資格は、AI/ML技術を使用するが、必ずしもそれを構築するわけではない個人を対象としています。具体的には、ビジネスアナリスト、ITサポート、マーケティングプロフェッショナル、製品マネージャーなどが含まれます。

|  |  |
|:-:|:-:|
|カテゴリ|Foundational|
|  試験時間 | 90分  |
|  問題数 |  65問 |
|  合格スコア |  700点以上 |
|  受験費用 |  100USD |

## 学習期間
2週間準備期間を設けました。
Foundationalレベルでしたが、AIやMLの基礎知識も問われるので
既に他の認定資格を保有していても、AI/MLに知見がなければ2週間程度が適切かと感じました。

## 学習方法
### Skill Builderの模擬問題を解く

[Exam Prep Official Practice Question Set: AWS Certified AI Practitioner (AIF-C01 - 日本語)](https://explore.skillbuilder.aws/learn/courses/19791/exam-prep-official-practice-question-set-aws-certified-ai-practitioner-aif-c01-ri-ben-yu/lessons)

無料で提供されている模擬問題を解いて感覚を掴みます。
Foundationalレベルの場合、模擬問題に近しい内容が実試験でも出題されていたので
何回も繰り返し学習して理解する事が得点アップに繋がると思います。

### AWS試験ガイドの機械学習に関連するサービスを把握する

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-ai-practitioner/AWS-Certified-AI-Practitioner_Exam-Guide.pdf

試験範囲となるサービスの中で機械学習に関するものを把握しておきます。
知らないサービスは概要と具体的なユースケースをおさえておきましょう。
他にも試験範囲のサービスは多くありますが、既に別の認定資格を持っていれば難なく解けるレベルです。
その場合は、機械学習の分野を重点的に学習して加点に繋げましょう。

### AIとMLの基礎を学習
こちらの記事に基礎的な部分が分かりやすく纏められていましたので、活用させていただきました。

https://qiita.com/Neville/items/a9a5c0df95b5be1307b1

## 試験当日
問題文や回答の選択肢の文章量も少なく、30分程度で解き終わりました。
手ごたえはあったので、見直し含め早めに試験終了し試験場を退出しました。

## 受験結果
点数：783点/1000点
結果：合格

難なく合格できました。
個人的にはもっと点数高い感覚でしたが、「責任ある AI に関するガイドライン」の分野が点数低かったようで
その分野に対する学習が不足していたんだと痛感しました。

## 最後に
最後までお読みいただき、ありがとうございました。

この資格取得の過程で、AIやクラウドテクノロジーの可能性の広さを改めて実感しました。特に、AWSのAIサービスが、専門的な知識がなくても実務で活用できるよう設計されていることに驚きを覚えました。

私の経験が、これから AWS Certified AI Practitioner に挑戦される方の参考になれば幸いです。この資格は確かに学ぶべき範囲は広いですが、計画的に取り組めば、技術背景の有無に関わらず十分に達成可能な目標だと確信しています。

皆さんも、AI時代の新しいキャリアステップとして、ぜひチャレンジしてみてはいかがでしょうか。
Office scriptのsetHyperlinkでドキュメント内のリンクが貼れない

# はじめに
タイトルの通りなのですが、setHyperlinkでドキュメント内のリンクが貼れないケースがあり、原因と解決方法がわかったので記事にします。

リンクが貼れなかったのは、`一覧 (3)`というシート名でした。

# 原因

シート名にスペースや特殊文字が含まれている場合、正しく認識されないみたいです。

# 解決策

シングルクオーテーションで囲みます。
```typescript
const targetSheetName = "一覧 (3)";
sheet.getRange("A1").setHyperlink({
    documentReference: `'${targetSheetName}'!A1`,
    textToDisplay: targetSheetName,
    screenTip: targetSheetName,
});
```
ふたたび)M5NanoC6、SG-90(RCサーボ)で旗を振って遊ぶ。(3.1.2)


注意、いろいろ
----

- 前回との違いは、ESP32のバージョンが3.1.2になったから

- 自己責任の意味がわかる人

- 過去ログを見よ!!!
- ESP32 Arduino 3.1.2
- あまり正確では、ない
- 10ビット(1024)の固定小数点の処理をしている
- おどしでも、冗談でもなく、サーボ系は、一発で終わるので、ちょとめんどい。(悪い意味)
- サーボをパソコンに繋いだままやるとパソコンが破壊されます。
- モーター、コイル等、逆起電力で高電圧が発生する時の安全対策は、各自実行してください。
- 最低でも、試す時は、モバイルバッテリを使用してください。
- モータ系の力学装置系をなぜ、あまりやらないのかは、まず、物理的にお金がかかる、いろいろ、危険であるから

目的
----

無線でラジコンサーボ SG90を制御する(予定)


結果
----

![image_original (47).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/15a0b52f-024c-4743-acc5-182eea00d2fe.jpeg)

![image_original (48).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/58c99b4b-663d-4970-8a9c-0d71289c8339.jpeg)



プログラム
----

```c++

//servo_sg90_test3_M5NanoC6_1
//ESP32 Arduino 3.1.2


//インクルド
#include <Arduino.h>


//定義
//使い方　SOのマクロに0から180を設定すると
//PWMの間隔の値が返る
// a = SO(i);
// //a = SO(180-i);
//V_0が0度の時の初期値で単位は、nS(ナノ秒)
//V_180が180度の時の初期値で単位は、nS(ナノ秒)
//SO(角度) 正転
//M_SO(角度)　逆転
#define V_0    500
#define V_180 2400
#define Wavelength_1count (((1000000/50)*1024)/4096)
#define T_MIN ((V_0*1024)/Wavelength_1count)
#define T_MAX ((V_180*1024)/Wavelength_1count)
#define HH  ((T_MAX-T_MIN)*1024)/180
#define SO(AA) (T_MIN+(((AA)*(HH))>>10))
#define M_SO(AA) (SO(180-(AA)))

//PWMのポート、周期、分解度のビット数
#define PWM_PIN 2
#define FREQUENCY 50
#define RESOLUTION 12


void setup() {
  // put your setup code here, to run once:

  //出力ピンの初期化
  pinMode(PWM_PIN, OUTPUT);

  // PWM設定（ピン番号, 周波数, 分解能）
  ledcAttach(PWM_PIN, FREQUENCY, RESOLUTION);

}//setup


void loop() {
  // put your main code here, to run repeatedly:

  // DUTY比を指定して、ポートに対して実行 0°
  ledcWrite(PWM_PIN, M_SO(0));
  delay(2000); //2秒待つ

  // DUTY比を指定して、ポートに対して実行 180°
  ledcWrite(PWM_PIN, M_SO(180));
  delay(2000); //2秒待つ

}//loop

```
【デザインパターン】TemplateMethodパターンとFactoryMethodパターン

# はじめに
デザインパターンのTemplateMethodパターンとFactoryMethodパターンはどちらも「スーパークラスで処理の枠組みを定義し、サブクラスで具体的な処理を実装する」のような共通点がありますが、目的は明確に異なります。私は、学習中、共通点と目的がごっちゃになって混乱してしまいました。そのため今回これらのパターンを整理するために記事としてまとめることにしました。
# TemplateMethodパターン
TemplateMethodパターンは、処理の大枠を定義しつつ、具体的な処理の一部をサブクラスにゆだねるデザインパターンです。共通の流れを変更せず、部分的な変更のみを可能とすることでコードの再利用性を高め、一貫性のある処理フローを確立することができます。  
とあるアプリの保存処理に以下のようなプロセスが存在するとします。
1. 保存開始のダイアログを表示する
2. 保存するデータの処理を行う
3. データを保存する
4. 保存完了のダイアログを表示する  

このとき1から4をそれぞれ抽象メソッドとして作成します。そして1から4のプロセスをまとめたものは公開メソッドとして作成しておきます。このようにすることで、保存処理の**共通の流れを変更せず、部分的な変更のみが可能**となります。
# FactoryMethodパターン
FactoryMethodパターンは、オブジェクトの生成をサブクラスに委ねるデザインパターンです。これにより、具象クラスのインスタンス化をカプセル化し、拡張性の高い設計を実現できます。  
以下はゲームの役職ごとにIDを生成し、行動を設定するためにFactoryMethodパターンを用いたクラス図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945018/6e39409c-66d4-47e7-8bcf-f46b03e3be14.png)

このように設計しておくことで、新たに占い師のロールIDを作りたいときにはSeerIdFactoryクラスとSeerIDクラスを作成するだけで既存の設計を変更することなく拡張できます。

# まとめ
## TemplateMethodパターン
- 処理の流れを共通化することが目的
- 抽象クラスで処理の流れを定義し、部分的な実装をサブクラスにゆだねる
- 処理の流れを統一したいとき
- 処理の流れは変更せず、部分的なカスタマイズが可能

## FactoryMethodパターン
- オブジェクトの生成を統一することが目的
- 生成メソッドを抽象メソッドとして定義し、サブクラスが具象クラスを決定
- 具象クラスのインスタンス化をカプセル化したいとき
- 生成するオブジェクトの種類が増減しても全体への影響は少ない
  

# おわりに
今回は、デザインパターンの中からTemplateMethodパターンとFactoryMethodパターンの説明をしました。それぞれのパターンの目的をしっかりと理解して使い分けていきたいと思います。
現在のExcelファイルを基準に相対パスで指定したファイルを開く

まずはプログラムの完成品
```vb
Function OpenRelativeFile(relativePath As String) As Boolean
    Dim currentFolderPath As String
    Dim targetFilePath As String

    ' 現在のファイルのフォルダパスを取得
    currentFolderPath = ThisWorkbook.Path

    ' 現在のディレクトリと相対パスを結合してフルパスを作成
    targetFilePath = currentFolderPath & "\" & relativePath

    ' ファイルの存在を確認し、開く
    If Dir(targetFilePath) <> "" Then
        Workbooks.Open targetFilePath
        MsgBox "ファイルが開かれました！", vbInformation, "成功"
        OpenRelativeFile = True
    Else
        MsgBox "指定したファイルが見つかりません。", vbExclamation, "エラー"
        OpenRelativeFile = False
    End If
End Function

Sub TestOpenFile()
    Call OpenRelativeFile("targetFile.xlsx")
End Sub
```
１行ずつ解説

### 1： Function を使って 戻り値のある関数 を定義。
```vb
Function OpenRelativeFile(relativePath As String) As Boolean
```
relativePath As String は 開きたいファイルの相対パスを受け取る引数。
As Boolean により、処理の成功 (True) / 失敗 (False) を呼び出し元に返す。こうすることで呼び出し元の関数の中で処理を分岐でき、プログラムの可読性を上げることができる。
### 2：relativePath を currentFolderPath に結合し、開くべきファイルのフルパスを作成。
```vb
targetFilePath = currentFolderPath & "\" & relativePath
```
例：
　　relativePath = "..\targetFile.xlsx" ⇒
  　　　　"C:\Users\Username\Documents\..\targetFile.xlsx"
　　Windowsが .. を解釈し、C:\Users\Username\targetFile.xlsx となる。

### 3：Dir(targetFilePath) で 指定したファイルが存在するかを確認し、存在すれば開く。
```vb
If Dir(targetFilePath) <> "" Then
    Workbooks.Open targetFilePath
    MsgBox "ファイルが開かれました！", vbInformation, "成功"
    OpenRelativeFile = True
Else
    MsgBox "指定したファイルが見つかりません。", vbExclamation, "エラー"
    OpenRelativeFile = False
End If
```

ファイルがある場合 → ファイル名 を返す（<> "" なので True）。
ファイルがない場合 → ""（空文字）を返す（<> "" は False になる）。
If 条件で、ファイルの有無によって処理を分岐。

### 4：Sub内で関数を実行してファイルを呼び出す。
```vb
Sub TestOpenFile()
    Call OpenRelativeFile("targetFile.xlsx")
End Sub
```
異なるディレクトリの場合は以下のように引数を入力する
　親ディレクトリにあるファイル　⇒　..\targetFile.xlsx
　親ディレクトリの中のサブフォルダにあるファイル　⇒　..\subfolder\targetFile.xlsx
　サブフォルダ内のファイル　⇒　subfolder\targetFile.xlsx

### 結論
 以上のようにして別のディレクトリのファイルを相対パスとして扱うことができる。
JavaScriptで有効な最初の値を検索する関数

## 概要
JavaScriptで、複数の値から最初の有効値を返す関数です。
ここでは有効値の定義を、「null、undefined、NaN、Infinity、-Infinity」を除いたものとしています。

## 定義
```js
function findFirstValidValue(...values){
    for(let v of values){
        if(typeof v === "number"){
            if(Number.isFinite(v){
               return v; 
            }
            continue;
        }else{
            if(typeof v !== "undefined" && v !== null){
               return v;
            }
            continue;
        }
    }

    return null
}
```

## 使用例
```js
const x = findFirstValidValue(null, 1, 2, NaN);
const y = findFirstValidValue(undefined, Infinity, NaN, -Infinity);
console.log("x is " + x + ", y is " + y + ".");
```
## 表示
```text
x is 1, y is null.
```
3D顔スキャンを活用したパーソナライズド顔分析の方法

3Dスキャン技術の進化により、パーソナライズド顔分析が美容、医療、エンターテインメントなどの分野で注目されています。従来の2D画像分析と比べ、3D顔スキャンはより正確な顔データを提供し、自分の顔の特徴を深く理解することで、より科学的な判断が可能になります。この記事では、3D顔スキャンを活用したパーソナライズド顔分析の方法について、技術の原理、応用分野、操作手順、そしてメリットと課題を詳しく解説します。  

---

## **1. 3D顔スキャンの技術的原理**  

### **1.1 3Dスキャンの基本原理**  
3D顔スキャンは、光学、レーザー、または構造光技術を用いて顔の3Dデータを取得し、奥行き情報を含む3Dモデルを生成する技術です。一般的な3Dスキャンの方法には以下のものがあります。  

![a294bcf6b4aa33c4b6ebb9f639775fee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/668fd736-f511-4e57-aad5-fb6690fa8863.png)

https://www.revopoint3d.jp/products/portable-3d-scanner-pop3

https://www.revopoint3d.com/products/portable-3d-scanner-pop3


- **構造光スキャン**：特定のパターンの光を顔に投影し、その歪みを解析することで3D形状を生成。  
- **レーザースキャン**：顔にレーザーを照射し、反射時間を計算することで距離を測定し、3Dモデルを構築。  
- **深度カメラ（RGB-Dカメラ）**：赤外線センサーとRGBカメラを組み合わせて、奥行き情報を取得し、3D顔データを作成。  

### **1.2 3D顔データの処理**  
スキャン後、取得したデータを処理し、精度を向上させる必要があります。  

- **ノイズ除去**：不要な点群データを削除し、精度を高める。  
- **メッシュ再構築**：点群データをメッシュモデルに変換し、視覚的な3D顔モデルを作成。  
- **テクスチャマッピング**：高精度のテクスチャデータを3Dメッシュに適用し、よりリアルな顔モデルを生成。  

---

## **2. 3D顔スキャンの応用分野**  

### **2.1 美容とスキンケア**  
3Dスキャンを活用すると、肌の状態（シワ、シミ、毛穴の大きさなど）を分析し、パーソナライズされたスキンケア対策を提案できます。  

- **肌診断**：肌の健康状態を評価し、適切なケア方法を提案。  
- **顔の対称性分析**：顔のバランスを評価し、メイクアップや美容施術に活用。  
- **整形手術シミュレーション**：施術前後のシミュレーションを行い、事前に仕上がりを確認。  

### **2.2 健康と医療**  
医療分野でも3D顔スキャンは重要な役割を果たします。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/fa29bccb-e266-4d75-a755-1244361348ff.png)


- **顎顔面外科**：歯列矯正や顎骨の調整手術の計画立案。  
- **睡眠時無呼吸症候群の評価**：顔の輪郭を分析し、いびきや睡眠時無呼吸のリスクを予測。  
- **顔面再建**：事故や疾患による顔の損傷を修復するための手術設計。  

### **2.3 バーチャルアバターとカスタム製品**  
エンターテインメントやカスタム製品の分野でも、3D顔スキャンは活用されています。  

- **バーチャルアバターの作成**：メタバース、ゲーム、SNSなどで利用できる3Dアバターを作成。  
- **カスタムメガネやアクセサリー**：顔のサイズに最適なメガネやマスクをオーダーメイド。  
- **3Dプリント製品**：オーダーメイドのマスクや彫刻の作成。  

---

## **3. 3D顔スキャンを活用したパーソナライズド顔分析の手順**  

### **3.1 適切な3Dスキャン機器の選択**  
用途に応じて適切なスキャン機器を選ぶことが重要です。  

- **コンシューマー向けデバイス**：iPhoneのFace IDやMiraco 3Dスキャナーなど、個人使用に最適。  
- **プロフェッショナル向けデバイス**：Artec Eva、EinScan Proなど、高精度な医療・工業用途向け。  

### **3.2 3Dスキャンの実施手順**  
1. **環境を整える**：均一な照明の下でスキャンし、強い光や影を避ける。  
2. **機器を安定させる**：スキャナーやスマホを安定した状態に保つ。  
3. **顔全体をスキャン**：ゆっくり頭を動かし、顔全体のデータを取得。  
4. **複数の角度からスキャン**：より正確なデータを取得するため、異なる角度から撮影。  

### **3.3 3Dデータの処理**  
スキャン後、専用ソフトウェアでデータを処理します。  

- **ノイズ除去**：スキャン時に発生した不要なデータを削除。  
- **自動補正**：AIを活用して欠損部分を補完。  
- **データのエクスポート**：用途に応じてOBJ、STL、PLYなどの形式で保存。  

### **3.4 パーソナライズド顔分析の実施**  
分析ソフトやAIアルゴリズムを用いて、以下のような分析が可能です。  

- **顔の黄金比分析**：顔のバランスを計算し、美容施術やメイクに活用。  
- **肌の健康評価**：肌トラブルを検出し、スキンケアの提案を行う。  
- **バーチャルメイク**：3Dモデル上でメイクをシミュレーションし、最適なスタイルを選択。  

---

## **4. 3D顔スキャンのメリットと課題**  

### **4.1 メリット**  
- **高精度**：2D画像と比べ、より正確な顔データを取得可能。  
- **多機能性**：美容、医療、エンターテインメントなど幅広い用途に活用。  
- **個別最適化**：個人の特徴に基づいた分析と最適なアドバイスが可能。  

### **4.2 課題**  
- **機器のコスト**：高精度な機器は高価で、一般消費者には手が届きにくい。  
- **プライバシー問題**：顔データは個人情報に関わるため、セキュリティ対策が必要。  
- **技術的ハードル**：一部の3Dスキャンソフトは操作が難しく、専門知識が必要な場合がある。  

---

## **まとめ**  

3D顔スキャン技術は、パーソナライズド顔分析の分野で革新をもたらし、美容、医療、バーチャルリアリティなど幅広い分野で活用されています。技術の進歩により、より手軽で高精度なスキャンが可能になり、AIとの組み合わせで分析精度も向上するでしょう。しかし、プライバシー保護とデータの安全性に留意しながら、今後ますます普及していくことが期待されます。
医療および美容外科における3D顔スキャナーの応用

3Dスキャン技術の進歩により、医療および美容業界は革命的な変化を迎えています。3D顔スキャナーは、診断、手術計画、および術後評価において重要な役割を果たしています。これらのスキャナーは高精度の顔面測定データを提供し、整形外科医、皮膚科医、美容専門家が個別の治療計画を作成するのに役立ちます。

美容整形や顔面再建から非侵襲的な美容治療に至るまで、3D顔スキャナーは精度を向上させ、リスクを軽減し、患者の満足度を高めるのに貢献しています。本記事では、医療および美容外科における3D顔スキャナーの主要な応用、利点、および課題について探ります。

1. 医療および美容外科における3D顔スキャナーの主要な応用
1.1 手術前の計画とシミュレーション
整形外科および再建外科の医師は、以下の手術前に3D顔スキャナーを使用して正確な分析を行います。

鼻整形（隆鼻手術）
顔面骨の再建（外傷または先天性欠損の矯正）
顎とフェイスラインの形成
高解像度の3Dモデルにより、医師は手術の結果をシミュレーションし、患者とのコミュニケーションを向上させ、現実的な術後の期待を設定できます。

1.2 術後のモニタリングと回復状況の追跡
手術後、3Dスキャナーは患者の回復状況を追跡するために使用されます。

術前後の顔の変化を比較
腫れの軽減、組織の治癒、顔の対称性の改善をモニター
予期しない合併症の早期発見
客観的なデータを基に、医師は最適な術後治療を調整し、最良の回復結果を保証できます。

1.3 歯科矯正および顎顔面手術
3D顔スキャニングは歯科および顎顔面手術にも広く使用されています。

顎矯正手術
歯科矯正治療（例：インビザライン）
インプラント手術の計画
スキャナーは顔と歯の構造を正確に測定し、補綴物の適合性を向上させ、機能的および審美的な結果を改善します。

1.4 美容および非侵襲的治療
ボトックス、ヒアルロン酸注入、レーザー治療などの非外科的美容施術では、3Dスキャナーを活用して以下のような分析を行います。

顔の対称性を測定
ボリュームの減少や老化の影響を視覚化
最適な注入部位の決定
患者は施術前後の比較をリアルタイムで確認できるため、施術に対する信頼感が向上し、医師の精度も向上します。

https://www.revopoint3d.com/collections/3d-scanners

2. 3D顔スキャニングの主な利点
高精度な測定 – 詳細な3D顔面データを提供し、個別の治療を可能にする。
患者とのコミュニケーション向上 – 手術シミュレーションを視覚的に説明し、患者の理解を深める。
手術リスクの軽減 – 事前に結果を予測し、合併症のリスクを最小限に抑える。
非接触・迅速なスキャン – リアルタイムでの顔面分析を提供し、不快感を与えない。
審美的な結果の向上 – 顔の対称性やバランスの修正をより正確に行える。
3. 課題と今後の展望
3.1 課題
高価な機器コスト – 高精度の3Dスキャナーはクリニックにとって高額な投資となる。
データプライバシーの懸念 – 患者の顔データの管理とセキュリティが求められる。
専門的なトレーニングの必要性 – 医師や美容施術者は、3Dスキャンデータを正確に解釈するスキルが必要。
3.2 今後のトレンド
AIを活用した3D顔分析 – AI技術との融合により、診断や予測精度が向上。
ポータブルかつ低コストのスキャナーの普及 – 小規模クリニックでも導入可能な機器の開発。
AR/VRとの統合 – 患者が手術後の姿をリアルタイムでシミュレーションできる技術の導入。
結論
3D顔スキャニング技術は、医療および美容外科の分野に革命をもたらし、より高い精度と患者満足度を実現しています。美容整形、歯科矯正、スキンケアなどの分野で、この技術はより効果的かつ個別化された治療を可能にします。

今後、AIや3Dイメージング技術の進化により、さらに洗練された、コストパフォーマンスの高いソリューションが登場し、医療・美容分野をさらに発展させることでしょう。
鉄オタがネットワークの説明をしてみた

鉄オタの友達にネットワークを説明してほしいと言われたので説明しました。

# IPアドレス = 切符
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2893008/8a252eb3-19d9-aaf2-d622-be009c0f90f0.png)
これは[wireshark](https://www.wireshark.org/)でキャプチャしたIPパケットのヘッダー部分です。

IPの重要な点はSource AddressとDestination Addressですね。
切符で例えると乗車する駅と行き先の駅に該当します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2893008/7ce3058c-4b32-8202-c2ba-0094ffc44069.png)

上野切符を例に説明すれば、Source Addressが岡山、Destination Addressが横浜市内に該当するわけです。

### 切符との共通点
- SourceとDestinationがある
- 経路を判別する材料になる
- 有効期限がある
### 切符との違い
- Source(乗車する駅)の存在意義が
  - そこから到着地点の距離で値段を決めるのが切符
  - そこに戻るためにあるのがIP

# ルーター = 駅
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2893008/0ae7d31b-f2ee-4564-8271-09bcd66b0187.png)
ここは岡山駅の中央出口。
発車案内板にはたくさんの路線、行き先とホームが書かれています。

見方は簡単です。書かれている行き先や路線を見て、その**方向**に行ける列車が出発するホームを知れます。

## ルーティングテーブルもそんなもん
シスコルーターなどでルーティングテーブルを表示すると、次のような結果が得られます。

:::note
コマンドは管理者モードで `sh ip route`
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2893008/3143b35c-625c-489e-80b1-2872de9abd6c.png)

下側にあるのは、インターフェイスです。　これはL3swでとったもの。
(スイッチとはたくさんLanポートがある機械です！)

これを、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2893008/c020d38d-2aed-4dd9-8f3a-d24ae76d1fd6.png)

こうすると、どうでしょうか？
IPを行き先、Vlanを路線名に変更してみました。

簡単に見方を説明すると、

駅は八王子駅。
- 八王子駅から東京・長野・川崎に行きたいなら中央線
- 東神奈川、茅ヶ崎に行きたいなら横浜線
- 群馬や埼玉に行きたいなら八高線


# もっと描きます！
ルーターなど説明できそうなので
しばらくしたら更新します！　

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2893008/48c8d016-7e37-4487-bddd-cd8479b5ffd7.png)
(おまけ: トロリーバス乗れてよかった!)
DockerのComposeサブコマンドがNot foundになる（現在進行中）

# 概要
- なぜかDocker ComposeサブコマンドがNot foundになる
- アンインストールしたら治った的な記事があったので試したら治ったけど、また再発した
- よくよく確認したらコマンドは存在していたので、直打ちでなんとかなっているが、なぜだ


# 現象

```bash
$ docker compose
docker: 'compose' is not a docker command.
See 'docker --help'
```

こうなる


# アンインストールしてみた

修正されたが、また復活した（#^ω^）


# 暫定対応

パスを直打ちしたら動作したので、一旦これで

```bash
$ /Applications/Docker.app/Contents/Resources/cli-plugins/docker-compose exec container_name /bin/bash
```


# 参考記事

https://note.com/toshikiw/n/n19c6521063ee
ロールとその詳細を確認したい

ユーザーに付与されているロールを確認するには、`USER_ROLE_PRIVS`または`DBA_ROLE_PRIVS`ビューを利用します。

| ビュー名            | 詳細                                                  | URL                                                           |
|:-------------------|:-----------------------------------------------------|:-------------------------------------------------------------|
| USER_ROLE_PRIVS   | 現行のユーザーに付与されたロールを示す               | [USER_ROLE_PRIVS](https://docs.oracle.com/cd/F39414_01/refrn/USER_ROLE_PRIVS.html) |
| DBA_ROLE_PRIVS    | すべてのユーザーおよびロールに付与されたロールを示す | [DBA_ROLE_PRIVS](https://docs.oracle.com/cd/F39414_01/refrn/DBA_ROLE_PRIVS.html) |

ロールに付与されている権限を確認するには、目的に応じて以下のビューを参照します。

| ビュー名            | 詳細                                                  | URL                                                           |
|:-------------------|:-----------------------------------------------------|:-------------------------------------------------------------|
| ROLE_ROLE_PRIVS   | 他のロールに付与されたロールの情報を示す             | [ROLE_ROLE_PRIVS](https://docs.oracle.com/cd/F39414_01/refrn/ROLE_ROLE_PRIVS.html) |
| ROLE_SYS_PRIVS    | ロールに付与されたシステム権限を示す                 | [ROLE_SYS_PRIVS](https://docs.oracle.com/cd/F39414_01/refrn/ROLE_SYS_PRIVS.html)  |
| ROLE_TAB_PRIVS    | ロールに付与された表権限を示す                       | [ROLE_TAB_PRIVS](https://docs.oracle.com/cd/F39414_01/refrn/ROLE_TAB_PRIVS.html)  |

**環境情報**

- Oracle Database 23ai EE Extreme Perf Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems
【バグバウンティ】資格マンだった俺が脆弱性を報告するまで

どうもこんにちは、MooseLoveです。

先日、私が **HackerOne** を介して企業に報告した脆弱性（XSS）が無事、**認定** されました。  

認定されるまでかなりスパンがあり、その間 **「バグバウンティの記事って少ねぇな...」** と思っていました。実際、私も情報収集にとても苦労しました。
そこで、今回は **資格マンだった私が脆弱性を報告するまでの過程** を記録していきます。

---

## 自分のスペック

- 高校3年生で **情報処理安全確保支援士試験** に合格（未登録）
- 胸を張って「出来ます！」と言える言語は **Python のみ**
- 現在は情報系の国公立大学に通う **1年生**
- 大学前期は **CTF に参加** したり、**HackTheBox** で脆弱性について学習

---

## バグバウンティってなに？

知らない人はこの記事見てないと思いますが、一応...  

要するに **企業に脆弱性を報告し、対価として報酬を貰う** ことです。  
脆弱性というのは、例えば私が今回報告した **XSS（クロスサイトスクリプティング）** だったり、  SQLインジェクションといった基本情報技術者試験などで耳にするシンプルなものから、  CSRFや認証の不備といった（個人的に）複雑なものまで様々です。

前置きが長いブログは嫌いなので、ちゃっちゃと本題に入っちゃいますね。

---

# さあ、最強のバグハンターになるぞ！

前期でバグバウンティについての机上の学習を終えた私は、  
一番有名なバグバウンティプラットフォームである **HackerOne** に登録し、報酬が発生しない競争率の低いプログラムである **VDP** に手を付け始めました。  

（HackerOne様にはゴミみたいなレポートを多数読ませてしまい、とても迷惑を掛けてしまいました。しかし丁寧な対応をしていただける素晴らしいプラットフォームです。）

---

## 脆弱性、滅びる

うん、ガチで **無い**。  
いっくら探しても見つかりません。  

**「他のバグハンターがどのように脆弱性を見つけているのか」** イメージが湧かず、  
とても脆弱性とは呼べないものをレポートとして送信してしまったり、GitHubでいろんな人が作成したツールを入れたりしてましたが、うまく活かせてませんでしたね。  

この頃私が使っていたツールは以下の通り。

- BurpSuite（通信の傍受）
- Subzy（Subdomain Takeoverの検出ツール　精度は…）
- Dirsearch（ディレクトリ探索）

一度まぐれで **403Bypass** を発見したのですが、  
機密情報とは程遠い下書きページのようなものが表示されただけで、  
もちろん報告しても脆弱性とは認定されませんでした。  

挑戦から一か月が経った頃、このままだと一生発見できないなと思い始め、  
世のバグハンターはどのように脆弱性を見つけているのかが気になり始めました。  

今考えれば、**ここから明らかにバグハントの要領が変わった** と思います。

---

## 情報収集

YouTubeで **「BugBounty PoC」** と検索すると、  
世のバグハンターたちが発見した脆弱性を見つけるまでの過程をキャプチャしている動画が多数見つかります。  

**CTFで言うWriteUpみたいな感じですね。**  

私は **「CodePrefer」** というYouTubeチャンネルがめちゃくちゃ参考になりました。  
このチャンネルのお陰で、私の知らなかった脆弱性を知ることも出来ましたし、  
バグハントのイメージを掴むきっかけにもなりました。  

### 🔗 CodePrefer チャンネル
📺 https://www.youtube.com/@codeprefer9108  

---

# さあ、リベンジだ！

このYouTubeチャンネルを見る前よりも、  
**「ここ、脆弱性あるかも？」** と思う回数が明らかに増えましたね。  

これまではユーザーが入力出来るフォームぐらいしか見てませんでしたが、  
この頃からは ユーザー登録の過程からBurpSuiteで傍受し、OTP Bypassを試したり、アイコンをアップロード出来る機能でRFIを試したり。

とにかく **チャンス** が増えましたね。  

...まあ、全然見つからないんですけど。

---

# そして遂に...

情報収集を終えて2週間ほどが経過したある日、お風呂に入っていると、  
突如天啓のように **「昨日調べたAIチャット機能のあるサイトにRCE脆弱性があるのでは？」** と思い浮かびました。  

しかし肝心の **ドメイン名が思い出せず**、  
HackerOneが公開している色々な企業のサイトを確認していました。  

そのとき、少し気になるサイトが...  

詳しくはお話できませんが、そのサイトはログインフォームでした。パラメータがGET方式で長々とあり、その中に**redirecturl**というものがありました。

この時点で私は「オープンリダイレクト」の脆弱性があると考え、試したが失敗。不貞腐れながら残りのパラメータを眺めていると、もう1つ、リンクを持つパラメータが。

試しにgoogleのURLを入力すると、なんとgoogleに遷移。**オープンリダイレクト**です。この時点で胸がドキドキワクワク状態だったのですが、ここで学んだ知識を思い出します。

`javascript:alert(1);`

そういやこういうXSSがあったな...確かブラウザがjavascript:で始まるURLを「実行可能なスクリプト」として扱うんだ。ひとまず1を適当な文字に変えて試すか...

![Gkdko_6XsAIgT02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4020451/97e0c37e-1c3a-41a6-8558-3c818b36785e.png)

頭がパニック状態です。まさかまだ脆弱性が存在するなんて...

これは完全に**XSS**です。このサイトにログインしているユーザーにこのXSSを利用したURLを踏ませれば、アカウントの乗っ取りや機密情報の漏洩のリスクがあります。

脆弱性報告は早い者勝ちです。他のバグハンターがこの脆弱性を報告する前に、ちゃっちゃとレポート書いておこう。

### レポートを書こう！
ChatGPTとDeepL(翻訳サイト)を用いて私の稚拙な英語や知識を補っています。他のバグハンターが見れば鼻で笑われる程度の仕上がりではありますが、誰が見ても「脆弱性やん！」と分かるように、丁寧に、丁寧に仕上げました。

そして数日後...脆弱性が認定された証である「Triaged(Open)」の文字が！
今まで朝起きたらClosedされるのが当たり前だったので、変な汗が出ました。

# 最後に
オープンリダイレクトの方は脆弱性として認められなかったorz
やっぱりレポートの書き方がヘタクソなんですね、自分。

ということで総まとめなんですが、Youtubeで他のバグハンターのPoCを見るのがオススメ！といった話でした。

ここまで読んでいただきありがとうございました。
データエンジニア初心者日記（２）

## 今日の勉強内容
前回に続き、MacbookにMySqlをインストールしてみました。

#### MySqlのインストール
Homebrewを使い、
brew install mysql
でインストールを実施。

brew services start mysql
でMySqlを実行。

#### Worldデータベースの追加
今進めている「おうちで学べるデータベースのきほん」ではWorldデータベースを使うとのことで、下記を参考に入れてみました。

https://setomoki.hatenablog.com/entry/2017/03/27/222938

私はworld databaseをzip形式でダウンロードしました。
まずは
mysql.server start
でmySQLを起動。
パスワードを設定し、
mysql -u root -p mysql < world.sql
でデータをインポートしました。

次に、
mysql -u root -p
でmySQLへ接続し、
show databases;
を入力したところ、worldが表示され、インポートされたことを確認しました。

これで書籍に書いてあるワークができるようになったようなので、戻ります！
HANADB 実データ量の見方

# はじめに
<!-- 発端や概要を記載 -->
HANAの実データ量を確認する方法が気になる方もいると思います。(例えば、HANAのデータ増加量予測のため)
今回はそちらをテーマに話していきます。
※確認した環境 OS:SUSE15 SP4 DB:HANA2.0 SPS05 メモリ 123GB

# Data Volume Size
HANAの実データ量を確認する際に、Tr-cd: DB02のCurrent Status→OverviewやHANA studioのOpen Administration→Overviewで表示されるData Volume Sizeを確認される方もいるかもしれませんが、下記理由からおすすめしません。
1. Data Volume Sizeは、あくまでも割り当てられた領域であり実際に格納されているデータより大きいサイズで表示される。
2. Data Volume Sizeは、ディレクトリの使用サイズの合計値であるため、もしディレクトリ内に何か関係ないファイルが置かれている場合は、それもData Volumeの値に加算されて表示される。
※nameserver用領域/hana/data/SID/mnt00001/hdb00001を除くディレクトリ/hana/data/SID/mnt00001/hdb0000X.0000Xのサイズの合計です。

(Total)Disk Sizeは、/hana/dataがマウントされているディスクのサイズです。
Tr-cd: DB02のData Volume Size
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552891/7c90a80a-d810-4f89-82a9-9a54f1e6e9bb.png)

HANA studioのData Volume Size
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552891/c83fa779-5947-4bb0-b807-f01e870bc578.png)

# HANAの実データ量を確認する方法
SQL Collection(標準機能ではできないような情報収集が可能なSAP提供のSQL)にあるHANA_Disks_Data_Overviewを使って、HANAの実際のデータ量を確認することが可能です。

確認方法としては、Note1969700 - SQL Statement Collection for SAP HANAから、SQL Collectionのファイルをダウンロードしてきて、対象ファイルのテキストをHANA studioのSQLコンソールに貼り付けて実行するだけです。※テナントDBの内容を確認するのであれば、テナントDBで実行する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552891/de3525ac-eaea-49b3-858f-7d4fcface3ea.png)

HANA_Disks_Data_OverviewのSQLを実行すると、上記のような結果が得られます。
以前SAPに問い合わせたところ、COLTAB_GB＋ROWTAB_GB＋LOB_GBのサイズが実際のDBサイズとしていえるそうです。
※LOB_GBは、FLOB_GBとPLOB_GBの合計

>SAPからの返信内容 
予測のため、ノート0001969700であるスクリプトHANA_Disks_Data_Overview_2.00.030+.txtをご実施いただき、
>COLTAB_GB＋ROWTAB_GB＋LOB_GBのサイズは実際なDBサイズとして、ほぼ予測できると存じます。

Tr-cd:DB02の画面でも、画面を先に進んでいくとMB表示で実際に使用されているサイズ(Used Size)を確認できるようでしたが、SAP回答にもあるようにSQLCollectionからの確認をおすすめします。
※COL,ROW,LOBなど種類別には確認できないようです。
※画面赤枠、青枠にある通り、HANAstudioの画面と、Tr-cd:DB02の画面で同じ値が出力されていることが確認できます。(それぞれMB,GBで単位が異なるため、変換が必要)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552891/7bc601b2-f135-4ad6-b220-ef9aeb67e04d.png)

# おわりに
<!-- 発端や概要を記載 -->

誰かの参考になれば幸いです。
Visual Studio Code が Prettier を見つけてくれなくなった。

VSCode の Prettier 拡張が動かなくなった場合

```shell
rm your/workspace/package.json
```

のようにしてローカルの `package.json` を消してみてください！

あほみたいな話ですが、 治安の悪い Monorepo で作業をしていると、誰かがルートの `package.json` を壊してしまい `npm install` できなくなるという事があります。VSCode Prettier 拡張は `package.json` が存在する場合何がなんでもローカルの prettier 実行ファイルを探そうとするので、YAML や Markdown など Javascript プロジェクトとは関係無いファイルの整形までできなくなります。その場合、ばっさり `package.json` を消す以外対処法が無いという事が分かりました。

以下詳しい説明

* [Prettier](https://prettier.io/) とは? 色々な言語で書いたファイルを整形してくれるツール。Javascript プロジェクトで使われる。
* [VSCode Prettier 拡張](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) を使うと VSCode 無いで JSON や YAML Markdown などを整形してくれて便利。

Prettier 拡張は次の順序で prettier コマンドを探します。

* package.json があればワークスペースににインストールされている prettier を探す。
* もしも `prettier.resolveGlobalModules` が `true` に設定してあれば、グローバルにインストールされた prettier を探す。
    * しかしワークスペースの package.json が壊れていればグローバルの prettier を探せない！
* prettier がどこにも無ければ Prettier 拡張にバンドルされている prettier を使う。
    * しかしこれもワークスペースの package.json が壊れていればダメでした。

という事で治安の悪い Monorepo に壊れた `package.json` がある場合消すしか無いという話でした。
【Linux】crontabについて

# はじめに

こんにちは。アメリカにて独学でエンジニアを目指している者です。
現在Linuxを勉強中ですが、Linux/Unix系OSで定期的にコマンドやスクリプトを実行するための仕組みとして便利な“cron”機能があります。その設定を行うためのコマンドが“crontab”です。ここでは、crontabの概要や書式、具体的な例などを解説します。

---

### crontabとは

`crontab`は、Linux/Unix系OSで定期的に実行するジョブを登録・管理するためのコマンドです。以下の特徴があります。

- **cron**: 常駐プロセスとして動作し、設定された時刻になるとタスクを自動実行する
- **crontab**: cronに登録するジョブを編集するためのコマンド

定期的にバックアップを取ったり、ログをローテーションしたり、メンテナンス作業を自動化するときに利用されます。

---

### crontabの基本書式

crontabに登録する内容は次の形式で記述します。

```
分 時 日 月 曜日 コマンド
```

- **分 (0–59)**
- **時 (0–23)**
- **日 (1–31)**
- **月 (1–12)**
- **曜日 (0–7)** (0/7:日曜、1:月曜〜6:土曜)
- **コマンド**: 実行したいコマンドやスクリプトのパスなど

#### ワイルドカードや特殊記号
- `*` : 全ての値
- `,` : リスト (例: `1,5,10`)
- `-` : 範囲 (例: `1-5`)
- `/` : ステップ(間隔) (例: `*/10` は10分置き)

#### 特殊な書式
- `@reboot` : システム起動時
- `@yearly` (または `@annually`) : 毎年1月1日 0:00
- `@monthly` : 毎月1日 0:00
- `@weekly` : 毎週日曜日 0:00
- `@daily` (または `@midnight`) : 毎日 0:00
- `@hourly` : 毎時 0分

---

### crontabの基本操作

#### crontabファイルを編集

通常、`crontab -e`コマンドでユーザーごとの設定を編集します。エディタが開き、行ごとにジョブを追加します。

例: 毎日深夜2時30分にバックアップスクリプトを実行する

```
30 2 * * * /home/user/scripts/backup.sh
```

#### crontabファイルを確認

```
crontab -l
```

#### crontabファイルを削除

```
crontab -r
```

---

### システム全体のcrontab

#### /etc/crontab

システム全体でのタスクを設定する`/etc/crontab`では以下の形式で書き、ユーザーを指定します。

```
分 時 日 月 曜日 ユーザー コマンド
```

例: 毎日深夜2時30分に `root` ユーザー権限でスクリプトを実行

```
30 2 * * * root /root/scripts/maintenance.sh
```

#### /etc/cron.*ディレクトリ

`/etc/cron.daily/`などのディレクトリにスクリプトを設置すると、対応するタイミングで自動実行されます。

- `/etc/cron.hourly/`
- `/etc/cron.daily/`
- `/etc/cron.weekly/`
- `/etc/cron.monthly/`

---

### 注意点

1. **環境変数**: cron実行時はシェルのログインスクリプトが読み込まれないため、`PATH`など環境変数が異なる場合がある。
2. **ログ出力**: トラブルシューティングや確認のため、出力をログファイルにリダイレクトしておくと便利。
3. **権限設定**: 実行するスクリプトの所有者やパーミッションを確認する。
4. **メール通知**: cronは結果をメールで送信できる。設定しておくとエラー検知などに役立つ。
5. **誤設定に注意**: 特に日や曜日の組み合わせによっては想定外のタイミングで実行されることがあるため、編集後は`crontab -l`で再確認。

---

### 具体的な設定例

1. **毎分実行**
   ```
   * * * * * /home/user/scripts/check_status.sh
   ```
2. **10分おき**
   ```
   */10 * * * * /home/user/scripts/task.sh
   ```
3. **毎日朝9時に実行**
   ```
   0 9 * * * /home/user/scripts/report.sh
   ```
4. **毎週月曜の23時**
   ```
   0 23 * * 1 /home/user/scripts/weekly_job.sh
   ```
5. **土日の深夜3時**
   ```
   0 3 * * 6,0 /home/user/scripts/weekend_job.sh
   ```

---

### まとめ

- `crontab -e`でスケジュールを設定、`crontab -l`で一覧表示
- `/etc/cron.*`ディレクトリを活用するとシステムレベルで簡易的なスケジュール管理が可能
- 環境変数やパーミッション、エラー時のメール通知などに注意を払うと、保守がしやすい

cronという仕組みを知ることで自動化をする一助となります。このコマンドを勉強していた最中にQiitaの記事投稿の自動化も思いついたので近いうちに投稿しようと思います。
【ChatGPT】連休明けで、仕事が思うように進まない方へのアドバイスを求めてみました。


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

　今回は、連休明けで、仕事が思うように進まない方へのアドバイスをChatGPTに求めてみました。

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

　AnthropicのClaudeですが、
　　Claude 3.7 Sonnetが
　　　リリースされました。
　　　　[Anthropic公式ポスト](https://x.com/AnthropicAI/status/1894092430560965029?t=mPQpY8N53gdL__YX84WYXg&s=19)

　Claude 3.7 Sonnetの
　　拡張思考モードは、
　　　数学、物理学、命令追従、
　　　　コーディング、その他
　　　　　多くのタスクにおいて、
　　　　　　さらに強力です。

　さらに、
　　初のコーディングツール
　　　“Claude Code”を
　　　　限定プレビューとして
　　　　　発表しました。

　　自分の端末から直接、
　　　Claudeに実質的な仕事を
　　　　任せることができるそうです。

　なお、
　　無料版でも
　　　使えるようになっています😸

　　拡張思考モードは
　　　無料では使えません。
***
　では、【本題】です。

　今回は、
　　連休明けで、
　　　仕事が思うように進まない方への
　　　　アドバイスを求めてみました。

　午前中はダメでも、
　　午後に挽回すればいいだけです。

　はい、
　　私も午前中はダメダメでした😅
***
　今回は、
　　下記のようなPromptを
　　　使いました。
```Text:連休明けの午後で仕事の遅れを取り戻すためのPrompt
連休明けで、仕事が思うように進みません。午前中はダメでした。
午後はどうしたらいいのか教えてください。
脳科学や生理学の観点からも考えてください。
```

　その結果がこちら。
***（ChatGPT）***
連休明けで仕事が思うように進まないのは、多くの人が経験することです。脳科学や生理学の観点から、午後の仕事を効率的に進めるための方法をいくつか紹介します。

### 1. **午後のパフォーマンスを上げるための準備**
#### ➤ **15～20分の短時間の昼寝（パワーナップ）**
- 連休明けは脳が「仕事モード」に切り替わるのに時間がかかるため、眠気や集中力低下が起こりやすいです。
- NASAの研究によると、**26分の昼寝**が認知機能を向上させる効果があるとされています。
- ただし、30分以上寝ると深い眠りに入ってしまい、逆に眠気が増すので注意。

#### ➤ **カフェインを活用**
- 昼寝と組み合わせる「**コーヒーナップ**」が効果的。
  1. コーヒーや緑茶を飲む（カフェインが吸収されるのに20～30分かかる）。
  2. そのまま15～20分の昼寝。
  3. 目覚める頃にカフェインが効き始め、スッキリする。

### 2. **仕事を効率化するための脳の使い方**
#### ➤ **ポモドーロ・テクニックを活用**
- 25分集中 → 5分休憩 を繰り返すことで、脳の疲労を軽減。
- 連休明けは「長時間頑張る」のではなく、「短時間で区切る」ほうが効果的。

#### ➤ **マルチタスクをやめる**
- 連休明けの脳は「ワーキングメモリ（短期記憶）」が鈍っているため、複数のことを同時にやると負荷が高くなり、余計に疲れやすくなります。
- **1つのタスクに集中**し、終わったら次に進む。

#### ➤ **簡単なタスクから始める**
- 午前中にうまく進まなかった場合、午後は**達成感を感じやすいタスク**からスタートすると、ドーパミンが分泌され、モチベーションが上がる。
  - 例：メールの整理、簡単な資料作成、ルーチンワーク。

### 3. **体を動かして脳をリフレッシュ**
#### ➤ **軽いストレッチや散歩**
- 座りっぱなしだと、脳への血流が低下し、思考力が落ちる。
- **昼食後や15時ごろに5～10分の軽い散歩**をすると、脳の血流が改善し、集中力が上がる。

#### ➤ **深呼吸で脳を活性化**
- 連休明けは無意識に呼吸が浅くなりやすい。
- 5秒かけて鼻から息を吸い、5秒かけて口から吐く「**5-5呼吸法**」を2～3分行うと、自律神経が整い、脳が活性化する。

### 4. **脳にエネルギーを補給**
#### ➤ **血糖値を安定させる食べ物**
- 昼食後に血糖値が急激に上がると、その後の急降下で眠気が襲ってくる。
- **GI値が低めの食事**（玄米、ナッツ、ヨーグルト、チーズなど）を選ぶと、午後のパフォーマンスが安定。

#### ➤ **チョコレートやナッツを間食**
- **ダークチョコレート（カカオ70%以上）**は、集中力を高める効果あり。
- ナッツ類（アーモンドやクルミ）は脳に必要な良質な脂質を含み、記憶力をサポート。


### 【午後の仕事をうまく進めるスケジュール例】
1. **13:00 - 13:15**  パワーナップ（昼寝） or ストレッチ
2. **13:15 - 13:30**  軽いタスクから始める（メール整理など）
3. **13:30 - 14:00**  重要な仕事（ポモドーロ・テクニック活用）
4. **14:00 - 14:05**  深呼吸 or 軽いストレッチ
5. **14:05 - 15:00**  集中作業（優先タスクを処理）
6. **15:00 - 15:10**  コーヒー + 軽い間食（ナッツやチョコ）
7. **15:10 - 16:00**  もう一度集中作業（ポモドーロ活用）
8. **16:00 - 16:10**  立ち上がって体を動かす（散歩やストレッチ）
9. **16:10 - 17:00**  残りのタスクをこなす



### **まとめ**
- **脳のリズムを考慮**し、短い休憩を挟みながら進める。
- **簡単なタスクから取り組み、達成感を積み重ねる**。
- **体を動かし、血流を良くする**ことで脳を活性化。
- **適切な栄養補給**でエネルギーを維持。

午後はこの流れでやってみると、スムーズに仕事が進むはず！
***

　私もこれを参考に
　　やってみます。

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

　今回は、ここまで。
【インクリメント演算子】hoge++ と ++hoge の違いとは

# 目次
この記事は2分ほどで読めます。
[1. 問題](#1-問題)
[2. 解説](#2-解説)
[3. 結局どちらを使えば良いか](#3-結局どちらを使えば良いか)

# 1. 問題
```
// JavaScriptの場合
let hoge = 10;
console.log(++hoge);
console.log(hoge++);
```
```
// Javaの場合
int hoge = 10;
System.out.println(++hoge);
System.out.println(hoge++);
```

Q: 上記コードを実行したときにどのように表示されるでしょうか？(補足:JavaScriptとJavaの実行結果は同じになります)
<br/>
<br/>
<br/>
考え中・・・
<br/>
<br/>
<br/>
A: 正解は以下のとおりとなります
```
11
11
```
# 2. 解説
- hoge++と++hogeの挙動の違いを一言で表すと「変動`前`の変数を返すか変動`後`の違いを表すか」です。
- ++hogeのように++を変数前につけた場合は「変動`後`の変数の中身」を返します
- 今回の場合「hoge = 10」に1を足した11が返ってくるようになります。
- hoge++のように++を後ろにつけた場合は「変動`前`の変数の中身」を返します。
- 今回の場合すでに++hogeで「hoge = 11」になっている中身に対して、さらにhoge++で1を足して12にしようとしています。
が、「console.log(hoge++)」つまり「console.log(変動`前`のhogeの中身)」を返すので11が表示される、という挙動になります。(System.out.println()の場合も同様)
- これはデクリメント(hoge--,--hoge)の場合も同じ挙動となります。ぜひ試してください。

# 3. 結局どちらを使えば良いか

- 結論から言うと「どちらを使うかよりも、ほかの演算子と一緒に使わないようにすること」が大切です。
- 要は混ぜるな危険ということです。
- console.log()やSystem.out.println()のような演算子に入れて使うのではなく、`hoge++;`のように単独で使うようにしましょう。
- これによって、ほかのエンジニアが見てもパッと理解ができるコーデになるでしょう。
- (個人的にはhoge++と++hogeに関してはhoge++の方を利用しています。どちらを利用するにしても、特別な理由がない限り統一しましょう。)
<br/>
いかがでしたでしょうか。
ご好評であれば、他にも詰まりそうな点も記事にしていこうと思います。
「いいね / フォロー」いただけますと大変励みになります！
[T-DASH] 偽証明書を使っているサイトを自動化する

# Outline

テスト環境では、偽証明書を使って開発する場合がある。
その場合、以下のように、ブラウザを起動すると警告が表示され、詳細設定で受け入れを行う必要がある。
テスト自動化では、これはうざい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/0f9fb54a-c93c-464b-aaef-e573b5c191eb.png)

これを回避する

https://service.valtes.co.jp/t-dash/

# 技術的情報

chromeでは起動オプションで証明書エラーを回避する方法などがある。
これらオプションを利用することで、自動化起動毎に警告は表示されなくなる。


参考

https://qiita.com/kawagoe6884/items/cea239681bdcffe31828

# T-DASH 実装

## カスタム動作

robotframework library
以下設定ファイルを browsercustom.yaml で保存する

```@browsercustom.yaml
ACT-CAT-CUSTOM-6cb0946e-0fbc-4fe0-a2a9-ea40de045bf1:
  action_category_name: browser
  icon: ''
  color: '#ee7312'
  custom_data:
    file_name: Custom
    pip_list: []
    library_list:
    - SeleniumLibrary
    - String
  actions:
    ACT-CUSTOM-c4589bee-0905-4dbf-a335-000425dabc42:
      action_name: 警告をスキップしてchrome起動
      action_type: operation
      action_format: 警告を無視してchrome起動し、URL「設定値1」にアクセスする
      action_note: ''
      action_args:
      - value1
      action_def:
      - - ${chrome_options} =
        - Evaluate
        - selenium.webdriver.ChromeOptions()
      - - Call Method
        - ${chrome_options}
        - add_argument
        - --ignore-certificate-errors
      - - Call Method
        - ${chrome_options}
        - add_argument
        - --ignore-ssl-errors
      - - Call Method
        - ${chrome_options}
        - add_argument
        - --start-maximized
      - - 'Open Browser    '
        - ${value1}
        - browser=chrome
        - options=${chrome_options}

```
次に、browsercustom.yamlをT-DASHの動作定義 -> カスタム動作 -> カスタム動作をインポート にてインポートし、実際にインポートされた設定内容を開く

作られたカスタム動作を開くと、以下のような設定になっている。（特に手を加える必要はない）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/f4bceec1-9c03-4aaf-b887-2f3bb79ffe14.png)

## テストケース

ブラウザ起動を、このカスタム動作で起動させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/8159661a-2d06-4f3f-a658-ef227b1db834.png)


## テスト実行


偽証明書のサイトの環境がないため、検証できてませんが、普通のブラウザ起動と同様な動きになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/4f01bdf4-83ec-4738-aeb8-9f6017f93cdf.png)
PostgreSQL - 1つのSQLでマスターに追加してテーブルで利用する

## 前提のおはなし

- テーブルAとテーブルBは両方にidがあります
- テーブルBにはテーブルA_idフィールドで関連付けをしています
- これらはFOREIGN KEYで外部キー制約をかけています

```plantuml
@startuml
skin rose

class table_a <<(M, pink)テーブルA>>
{
    + serial id : PK
    --
    + カラム1 : UQ
    + カラム2
    + カラム3
    + ・・・
}
note bottom of table_a
    カラム1はユニークキー
end note

class table_b <<(T, lightgreen)テーブルB>>
{
    + serial id : PK
    --
    + bigint table_a_id : FK
    --
    + カラムX
    + カラムY
    + カラムZ
    + ・・・
}

table_a "1"-right-"*" table_b : table_a - table_b

@enduml
```

## 問題

- この2つのテーブルに、新しい行を追加したいので、テーブルAに行を追加、その後テーブルBに行を追加する
- これをなるべく1つのSQLで行いたい

### SQLで解決策

```sql
WITH ins AS (
    INSERT INTO table_a (カラム1, カラム2, カラム3)
    VALUES (@カラム1, @カラム2, @カラム3)
    ON CONFLICT (カラム1) DO NOTHING
    RETURNING id
), selected_id AS (
    SELECT id FROM ins
    UNION ALL
    SELECT id FROM table_a WHERE カラム1 = @カラム1
    LIMIT 1
)
INSERT INTO table_b (table_a_id, カラムX, カラムY, カラムZ)
SELECT id, @カラムX, @カラムY, @カラムZ FROM selected_id
RETURNING id;
```

- まず、Insertをかけてみます。CONFLICTで衝突した場合は値が返りません
- 次のSELECTでCONFLICTの原因となった値で検索しています
- その結果の一つを使って、テーブルに値を挿入しています

### C#で実装

これを以下のように実装してみました。
個人的には「複数行の文字列を貼り付けただけ」のSQLはとても
気持ちが悪いのですが、今はわかりやすさ優先で記載しています。

実際のコーディング時には、文字列連結でやるか、StringBuilderでやるかと
思います

```csharp
using System;
using System.Threading.Tasks;
using Npgsql;

class Program
{
    static async Task Main()
    {
        var connString = "Host=localhost;Username=postgres;Password=yourpassword;Database=yourdb";
        await using var conn = new NpgsqlConnection(connString);
        await conn.OpenAsync();

        var column1Value = "example";  // 実際の値に置き換え
        var column2Value = "data";
        var column3Value = "more data";
        var columnXValue = "valX";
        var columnYValue = "valY";
        var columnZValue = "valZ";

        var query = @"
            WITH ins AS (
                INSERT INTO table_a (カラム1, カラム2, カラム3)
                VALUES (@col1, @col2, @col3)
                ON CONFLICT (カラム1) DO NOTHING
                RETURNING id
            ), selected_id AS (
                SELECT id FROM ins
                UNION ALL
                SELECT id FROM table_a WHERE カラム1 = @col1
                LIMIT 1
            )
            INSERT INTO table_b (table_a_id, カラムX, カラムY, カラムZ)
            SELECT id, @colX, @colY, @colZ FROM selected_id
            RETURNING id;
        ";

        await using (var cmd = new NpgsqlCommand(query, conn))
        {
            cmd.Parameters.AddWithValue("col1", column1Value);
            cmd.Parameters.AddWithValue("col2", column2Value);
            cmd.Parameters.AddWithValue("col3", column3Value);
            cmd.Parameters.AddWithValue("colX", columnXValue);
            cmd.Parameters.AddWithValue("colY", columnYValue);
            cmd.Parameters.AddWithValue("colZ", columnZValue);

            var result = await cmd.ExecuteScalarAsync();
            if (result == null)
            {
                throw new Exception("テーブルBの挿入に失敗しました");
            }

            Console.WriteLine($"テーブルBに挿入したID: {result}");
        }
    }
}
```
Windowsでコマンドプロンプトから環境変数の登録・バックアップ・再読み込み

## 環境変数の確認
```powershell:コマンドプロンプトで確認
# ユーザーとシステム環境変数のPathを確認
set path
```
```powershell:PowerShellで確認
# ユーザー環境変数のPathを確認
[System.Environment]::GetEnvironmentVariable("Path", "User") -split ";"
# システム環境変数のPathを確認
[System.Environment]::GetEnvironmentVariable("Path", "Machine") -split ";"
```

## 環境変数のバックアップ
```powershell:コマンドプロンプト or PowerShell
# ユーザー環境変数
reg export "HKEY_CURRENT_USER\Environment" C:\バックアップ先のパス\user_env_backup.reg /y
# システム環境変数
reg export "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" C:\バックアップ先のパス\system_env_backup.reg /y
```

## 環境変数の登録
### セッション内
```powershell:コマンドプロンプト or PowerShell
set Example "c:\Example"
```
### 永続　（新規登録もしくは上書き）
```powershell:コマンドプロンプト or PowerShell
# ユーザー環境変数
setx Example "c:\Example"
# システム環境変数
setx /m Example "c:\Example"
```
### 永続　（追加）
```powershell:コマンドプロンプト or PowerShell
# ユーザー環境変数のPathに追加
setx Path "%PATH%;c:\Example"
# システム環境変数のPathに追加
setx /m Path "%PATH%;c:\Example"
```

## 環境変数設定ウインドウへのアクセス
```powershell:コマンドプロンプト or PowerShell
control sysdm.cpl
```

## ウインドウを再起動せず環境変数を再読み込み
https://chocolatey.org/install#install-step2
```powershell:PowerShell で Chocolatey をインストール（要 管理者権限）
# インストールページのNow run the following command:の値を実行してChocolateyをインストール
# もし管理者権限無しでインストールを行い、失敗した場合は"C:\ProgramData\chocolatey"を削除
```

```powershell:コマンドプロンプトでの再読み込み
refreshenv
```
```powershell:PowerShellでの再読み込み
Import-Module $env:ChocolateyInstall\helpers\chocolateyProfile.psm1
refreshenv
```
sglangでDeepSeek-R1-Distill-Qwen-32Bを動かす方法


## はじめに
大規模言語モデルDeepSeek-R1-Distill-Qwen-32Bをsglangフレームワークで動かす手順を解説します。GPUマシン環境のセットアップからサーバー起動まで、実際のコマンド例を交えて説明します。

---

## 環境構築手順

### 1. Conda環境の作成
```bash
conda create -n sglang python=3.11 -y
conda activate sglang
```

### 2. 依存関係のインストール
```bash
pip install --upgrade pip
pip install sgl-kernel --force-reinstall --no-deps
pip install "sglang[all]>=0.4.3.post2" --find-links https://flashinfer.ai/whl/cu124/torch2.5/flashinfer-python
pip install transformers==4.48.3
```

---

## サーバー起動スクリプト

### 起動コマンド
```bash
eval "$(conda shell.bash hook)"
conda activate sglang

CUDA_VISIBLE_DEVICES=3,1,0,2 \
TRANSFORMERS_OFFLINE=1 \
HF_DATASETS_OFFLINE=1 \
python -m sglang.launch_server \
  --model-path deepseek-ai/DeepSeek-R1-Distill-Qwen-32B \
  --trust-remote-code \
  --served-model-name gpt-4 \
  --tensor-parallel-size 4 \
  --mem-fraction-static 0.9 \
  --api-key sk-xxxxxx \
  --host 0.0.0.0 \
  --port 8000
```

---

## 主要パラメータ解説

| パラメータ | 説明 |
|-----------|------|
| `--tensor-parallel-size 4` | 4つのGPUを使用したテンソル並列処理 |
| `--mem-fraction-static 0.9` | GPUメモリの90%を事前割当 |
| `--trust-remote-code` | カスタムモデルコードの実行許可 |
| `--api-key sk-xxxxxx` | 簡易認証用APIキー（本番環境では変更必須） |

---

## 注意事項

1. **GPU設定**  
   `CUDA_VISIBLE_DEVICES`で指定するGPU番号は環境に応じて変更

2. **セキュリティ**  
   `--host 0.0.0.0`は外部アクセスを許可する設定（ファイアウォール設定要確認）

3. **モデルサイズ**  
   VRAM要件：約94GB（4GPUで分散処理時）

4. **Transformersバージョン**  
   互換性問題を避けるため指定バージョンを厳守

---

## 動作確認方法
サーバー起動後、以下の方法でAPIエンドポイントにアクセス可能です：

```bash
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-xxxxxx" \
  -d '{
    "model": "gpt-4",
    "messages": [{"role": "user", "content": "日本で有名な観光地を3つ教えて"}]
  }'
```


---

## まとめ
sglangを使用することで、大規模言語モデルの効率的なデプロイが可能になります。本記事の手順を参考に、DeepSeek-R1の推論環境構築に挑戦してみてください。

（注）本記事の設定は開発用環境を想定しています。本番環境ではセキュリティ設定の見直しを推奨します。
VSCodeのDevContainerでExpoサーバーを立てると、スマホからアクセスできない問題

# 事象
VSCodeのDevContainerでDocker環境を作り、React Native+Expoでスマホアプリのサーバを立てたが、


スマホのExpo Goから以下のQRコードをスキャンすると、アクセス失敗の画面が出てきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/5012bec0-1af9-41ee-8a10-1c3ec1b95fe9.png)


これは本来使ったdevcontaoner.json
```
{
	"name": "Node.js & TypeScript",
	"image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm",
	"features": {
		"ghcr.io/devcontainers/features/aws-cli:1": {},
		"ghcr.io/devcontainers/features/python:1": {},
		"ghcr.io/devcontainers-extra/features/amplify-cli:2": {}
	},
}
```

# 原因と解決策
以下のサイトが参考になった！

https://dev.to/animusna/dev-container-for-react-native-with-expo-f7j

Expo Go と Expo サーバーは、同じネットワークに接続している必要があります。しかし現在の状態では、Expo サーバーがコンテナの IP アドレスで起動しているため、Expo Go からアクセスできません。

そこで、Expo サーバーをホストマシンのローカル IP アドレスで起動するよう設定し、さらに Expo サーバーが使用する 8081 ポートをホストの 8081 ポートにマッピングすることで、この問題を解決します。

「forwardPorts」で、Visual Studio Code の Dev Containers（開発コンテナ）機能でホストマシンからコンテナ内部のポート 8081 へアクセスできるようにします。

「runArgs」でDockerのポートマッピング（ホスト OS の 8081をコンテナの8081にマッピングする）と、環境変数ファイル（ローカル IP アドレスなどの設定）の指定をします。

修正したdevcontaoner.jsonが以下になります。

```
{
	"name": "Node.js & TypeScript",
	"image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm",
	"features": {
		"ghcr.io/devcontainers/features/aws-cli:1": {},
		"ghcr.io/devcontainers/features/python:1": {},
		"ghcr.io/devcontainers-extra/features/amplify-cli:2": {}
	},
	"forwardPorts": [
		8081
	],
	"runArgs": [
		"-p=8081:8081",
		"--env-file",
		".devcontainer/.env"
	]
}
```

「ipconfig」コマンドで「ローカル IP アドレス」を調べることができます。

.envを追加しローカル IP アドレを設定します。
```
REACT_NATIVE_PACKAGER_HOSTNAME=192.168.xx.xx
```
すると、無事スマホからアクセスできました！
【初心者向け】Bootstrap5を導入してみた

## 背景
Bootstrap5の勉強をするためにローカル環境で使用できるように環境構築を行うために、今回手順をまとめようと思います。手短にセットアップできた方がいいと思うので、できるだけ説明も手短にしようと思います。


## 導入方法

以下のリンクに飛びます。

https://getbootstrap.jp/docs/5.3/getting-started/download/

こちらのダウンロードボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984442/6bf4cf26-248a-4922-89b4-9d8fa8dc9c42.png)

zipファイルがダウンロードされるので解凍します。

以下のように解凍したフォルダ内のCSSフォルダとJSフォルダを配置します。
（index.htmlははじめから配置しています）
```
MarkUp_Traininig
    ├── css(解凍したフォルダからコピー)
    │   ├── bootstrap-grid.css
    │   ├── bootstrap-grid.css.map
    │   ├── bootstrap-grid.min.css
    │   ├── bootstrap-grid.min.css.map
    │   ├── bootstrap-grid.rtl.css
    │   ├── bootstrap-grid.rtl.css.map
    │   ├── bootstrap-grid.rtl.min.css
    │   ├── bootstrap-grid.rtl.min.css.map
    │   ├── bootstrap-reboot.css
    │   ├── bootstrap-reboot.css.map
    │   ├── bootstrap-reboot.min.css
    │   ├── bootstrap-reboot.min.css.map
    │   ├── bootstrap-reboot.rtl.css
    │   ├── bootstrap-reboot.rtl.css.map
    │   ├── bootstrap-reboot.rtl.min.css
    │   ├── bootstrap-reboot.rtl.min.css.map
    │   ├── bootstrap-utilities.css
    │   ├── bootstrap-utilities.css.map
    │   ├── bootstrap-utilities.min.css
    │   ├── bootstrap-utilities.min.css.map
    │   ├── bootstrap-utilities.rtl.css
    │   ├── bootstrap-utilities.rtl.css.map
    │   ├── bootstrap-utilities.rtl.min.css
    │   ├── bootstrap-utilities.rtl.min.css.map
    │   ├── bootstrap.css
    │   ├── bootstrap.css.map
    │   ├── bootstrap.min.css
    │   ├── bootstrap.min.css.map
    │   ├── bootstrap.rtl.css
    │   ├── bootstrap.rtl.css.map
    │   ├── bootstrap.rtl.min.css
    │   └── bootstrap.rtl.min.css.map
    ├── index.html
    └── js(解凍したフォルダからコピー)
        ├── bootstrap.bundle.js
        ├── bootstrap.bundle.js.map
        ├── bootstrap.bundle.min.js
        ├── bootstrap.bundle.min.js.map
        ├── bootstrap.esm.js
        ├── bootstrap.esm.js.map
        ├── bootstrap.esm.min.js
        ├── bootstrap.esm.min.js.map
        ├── bootstrap.js
        ├── bootstrap.js.map
        ├── bootstrap.min.js
        └── bootstrap.min.js.map
```

以下のコードで実際に適応されているか確認しました。

```.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Bootstrap5が動作するか確認</title>
    <link rel="stylesheet" href="css/bootstrap.min.css">
</head>
<body>
    <button class="btn btn-primary">動作確認</button>
</body>
</html>

```

このようにボタンの色が変わっていれば完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984442/39001810-771c-4481-b388-504ce0bef0a0.png)

## まとめ

こんなに簡単にそれっぽいデザインを作れるのはすごいですね！
次回以降はもっといろんなクラス名をつけてみて確認してみようと思います！
IAMロールの「信頼ポリシー」

IAMロールって何ぞや？ということをロールを作ってみる中で疑問に抱き、そこで「信頼ポリシー」とやらの存在が気になったので見ていこうと思います。


IAMロールの作成画面に遷移すると、まず「信頼されたエンティティタイプを選択」する必要があります。
ここではまず「AWSのサービス」から「EC2」を選択してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/705455fc-04e6-4ac4-ba2c-8a620cb2f15f.png)

「許可を追加」から許可ポリシー＝IAMポリシーを選択します。ここではS3のフルアクセスを与えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/2cf28611-27f3-4c90-a021-9f77326e3f79.png)

ロール名を入力して作成ボタンを押せばロール作成完了、というところまで来ました。
ここで「信頼ポリシー」というところに着目。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/3a20f429-5736-4b9b-85f6-39e4e1f8ea77.png)

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Principal": {
                "Service": [
                    "ec2.amazonaws.com"
                ]
            }
        }
    ]
}
```

Principalのところに、エンティティタイプのところで指定したEC2の記載があります。
そしてActionは「sts:AssumeRole」。この<INS>AssumeRoleが、本IAMロールをあるリソースに付与する、IAMロールのアイコンに沿って表現するなら、"ヘルメットをかぶせる"行為となります。</INS>
ここにResourceの記載がないのは、どのResourceにこのIAMロールをかぶせるかは、IAMロールの設定をEC2構築時や設定時に決まるからです。

このように見ることで、<INS>IAMロールというのは、許可を付与する大枠のサービスと、許可するアクションを決めておき、それを一時的にあるリソースに与える＝かぶせるものである</INS>ということがイメージしやすくなりました。


念のため冒頭の「信頼されたエンティティタイプを選択」で別のものも選んで確認してみます。

「AWSアカウント」を指定し、自分のアカウントを指定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616521/5e295de7-d55d-4378-96f6-e726a9361dc4.png)

先ほど同様S3のフルアクセスを与えたのち、確認画面まで遷移すると、信頼ポリシーは以下のようになっていました。
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Principal": {
                "AWS": "【自分のアカウントID】"
            },
            "Condition": {}
        }
    ]
}
```
想定通り、Principalには選択したアカウントIDが記載されていました。

これを応用して、マネジメントコンソール右上の「ロールの切り替え」機能を使ってロールの切り替えができます。
 
https://qiita.com/Kyubu1999/items/d7a5437174bc00cc984f