OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptについてもっと知りたい

おはようございます！
今日も昨日知ったことのアウトプットをしていきます！

昨日は非常に面白いYouTubeの動画を発見しました。

https://www.youtube.com/playlist?list=PLwM1-TnN_NN4SV6DEs4OtfA51Up6XzTfB

この動画のシリーズでは、JavaScriptが誕生してからの歴史を振り返ることで、元々どのような課題を持っていて、それらがどのように改善されてきたかを知ることができます。この背景の情報を知ることによって、プログラミング言語そのものだけでなく、開発に必須となる他のツールについての理解も深めることが出来ます。
この動画の配信者のしまぶーさんは動画の中で、Howの知識を入れる前にWhyを学ぶことによってより深い理解ができるとおっしゃっていますが全くその通りだと思いました。

ということで、今日からはこの動画を参考にしながらJavaScriptの歴史シリーズとして記事を書いていきたいと思います。

目的は、この動画の目的と同じようにJavaScriptの開発の中で必要な概念である「モジュール」「パッケージ管理」「ビルド」の３つの意味がわかることを目的とします。あとは、これからReact.jsや、TypeScriptについても学んでいくのですが、それらについてもこのシリーズの記事を書き終わる頃には説明できるようになっていたいと思います！

それでは早速前提の知識となる歴史編から書いていきたいと思います！

---

### JavaScriptの誕生
JavaScriptは、1995年にNetscape Communicationsの技術者ブレンダン・アイクによって開発されました。当初はLiveScriptとして知られ、後にJavaScriptに名前が変更されました。この新しいプログラミング言語は、Webブラウザ上で動的なコンテンツを作成するために設計されました。

JavaScriptの登場により、Webページは単なる静的なテキストから、ユーザーと対話する動的なページへと変貌しました。例えば、フォームの入力チェックや、ユーザーの操作に応じてページの一部を変更するなどの機能が可能になりました。

JavaScriptの誕生は、Web開発の歴史において重要なマイルストーンであり、現代のインタラクティブなWeb体験の礎を築きました。今日では、多くのWebサイトやアプリケーションがJavaScriptを使用しており、その影響力は増しています。

ちなみに、JavaScriptが登場する以前のwebは主にHTMLとCSSの世界でした。
これらのページは、テキスト、画像、リンクなどの基本的な要素を表示することができましたが、動的な機能はほとんど持っていませんでした。
例えば、何かを更新または変更するたびに、ページ全体をリロードする必要があり、ユーザー体験を遅く不便にしていたり、ユーザーの操作に応じてページの内容を変更することができないので、今のようなインタラクティブな体験はできませんでした。

しかし、JavaScriptにも課題があり、一気に広がるということにはまだなりませんでした。


### 初期のブラウザ互換性問題: Web開発の難題

Web開発の初期段階では、ブラウザの互換性問題が大きな課題として存在していました。同じコードでも、異なるブラウザで異なる表示や動作をすることが一般的でした。

**1. 標準の欠如**: それぞれのブラウザがHTMLやCSSの解釈に独自のルールを持っていたため、統一された表示を実現するのは難しかったのです。

**2. JavaScriptの違い**: 特に、Netscape NavigatorとInternet Explorerの間でJavaScriptの動作に大きな違いが見られました。

**3. レンダリングエンジンの差異**: 各ブラウザの背後にあるレンダリングエンジンの違いが、ページのレイアウトやデザインに影響を与えました。

**4. CSSのサポートのばらつき**: 一部のCSSプロパティは、特定のブラウザでしか正しく動作しないことがありました。

**5. ハックの時代**: これらの問題を克服するため、開発者はブラウザごとの「ハック」や特別な対応を行う必要がありました。

これらの互換性問題は、Web開発の初期の大きな難題でした。
しかし、課題はこれ以外にも存在しました。

### セキュリティとコード管理の課題: 初期のWeb開発の悩み

初期のWeb開発では、ブラウザ互換性問題だけでなく、セキュリティとコード管理の課題も大きな悩みでした。

**1. セキュリティの欠如**: 当時のブラウザはセキュリティ面で未熟で、クロスサイトスクリプティング（XSS）やクロスサイトリクエストフォージェリ（CSRF）などの攻撃に対して脆弱でした。

**2. コード管理の困難**: 初期のWeb開発ではバージョン管理システムが一般的ではなく、コードの変更履歴を追跡するのが困難でした。これにより、バグの特定や修正が非常に難しい状況が生じました。

**3. テスト環境の不足**: 自動テストツールが発展していなかったため、コードの品質を保証するのが一層困難でした。

**4. ドキュメントの欠如**: コードのドキュメント化が十分でなく、開発者間での情報共有が不足していました。

**5. 依存関係の管理**: ライブラリやフレームワークの依存関係の管理も手作業で行う必要があり、非効率でエラーが発生しやすい状況でした。

これらの課題は、初期のWeb開発を困難にしましたが、現代ではセキュリティ対策が強化され、バージョン管理システムや自動テストツール、依存関係管理ツールなどが普及しています。
この進化の過程を見ていくことで、JavaScriptを利用した開発の理解を深めていこうというのがこの記事も目的です。

### まとめ

この記事では、JavaScriptの誕生と初期の挑戦、特にブラウザの互換性問題やセキュリティ、コード管理の課題に焦点を当てました。これらの問題は、初期のWeb開発を困難にしましたが、技術の進化により克服されています。次回は、ブラウザ戦争とJavaScriptの進化について書いていきたいと思います。

歴史を知って現代のWeb開発の理解を深めていきましょう！。

それでは今日も学習スタートします！
「アルゴリズムを、はじめよう」を読みました

こんにちは。プログラミング初心者のこんとらりあんと申します。

最初の記事や、質問文を閲覧してくださっている方は再び閲覧いただきありがとうございます。
さて、タイトルにあるように、「アルゴリズムを、はじめよう」を読みました。
以下感想になりますが、私は全くの初心者ですので、的外れなことも言っているかもしれませんが、ご容赦ください。もしくはご指摘ください。


[アルゴリズムを、はじめよう](https://www.amazon.co.jp/アルゴリズムを、はじめよう-伊藤-静香/dp/4844332015/ref=sr_1_1?crid=16J9NALG8QYIQ&keywords=アルゴリズムをはじめよう&qid=1691742674&sprefix=アルゴリズムを%2Caps%2C172&sr=8-1)
こちらの本ですが、読み始めたきっかけは先日質問を投稿したように、アルゴリズムの勉強をしたいなと思ったからです。

皆さんからもコメントをいただき、自分でも本屋で探したところ、一番とっつき易そうだなと感じました。
結果として1日ほどで一通り内容に目を通せるものでした。

## この本の特徴
この本の特徴はなんと言っても**流れ図による説明と擬似言語による説明に絞った**ところでしょう。
言ってしまえばコードをそこまで書けなくても理解できる本であると思います。
また、イラストによる解説がとても多く、流れをこれでもかと丁寧に説明してくれる印象を受けました。


扱う内容としては、
探索（線形探索、二分探索、ハッシュ探索）
整列（選択ソート、挿入ソート、バブルソート、クイックソート）
数値計算（エラトステネスの篩、ユークリッドの互除法）
になります。かなり絞った内容かと思います。
例えばこれを勉強するとAtcoderではどれくらい、というのは分かりません。

## 感想
上述のように、コードがないことで本は読みやすく、同時に後半は読み進めるのが辛くもありました。
結局流れ図も、ループが２重になったりすると、理解に時間がかかります。
そうすると**自然言語での理解＋自分でコードを書いてみるという方が早く済んでしまいます**（特に簡単なものであれば）

たしかに擬似言語は基本情報技術者試験の午後試験でも出てくるようですし、そこが結構苦戦しそうだなと思ったのは間違いありません。
今後資格取得を目標にするなら壁になると思います。
そこは自分の勉強不足ですが、それより自分は本筋であるアルゴリズムやコーディングについての知識を先に深めたいと思います。

## 自分の使い方
この本は、基本的に読み流してから、それを自分で実装していました。
時には難しいものもあったので、後回しにしたり、ChatGPTにヒントをもらったり、Qiitaの記事を読みました。
[エラトステネスの篩の計算量を実験で確認する](https://qiita.com/Mopepe51/items/cce17bce6acbb4c25795)
この記事は私でもそれなりに理解できました。
計算量の理解という側面においても、私含む初心者が読んでおくと参考になると思います。

扱う内容の中で苦戦したものとしては、
挿入ソート、クイックソート、エラトステネスの篩、ハッシュ探索あたりでしょうか。
前二つはそもそもコーディングがおぼつかない感じでした。
後ろ二つに関しては、基礎的なものは書けるが、計算量の工夫や使い方がまだ身についていないという印象です。
今後また勉強しなおします。


## 次にやること
さて、自分の中ではある程度読了したという理解ですので、次に進んでまた戻ってこようと思います。
次に読むものとしては、

[問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本](https://www.amazon.co.jp/問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本-米田-優峻-ebook/dp/B09NXFQRD3/ref=sr_1_1?__mk_ja_JP=カタカナ&crid=2EJT5BXG5KGYH&keywords=数学+アルゴリズム&qid=1691744094&sprefix=数学+アルゴリズム%2Caps%2C171&sr=8-1)
[問題解決力を鍛える！アルゴリズムとデータ構造](https://www.amazon.co.jp/問題解決力を鍛える！アルゴリズムとデータ構造-ＫＳ情報科学専門書-大槻兼資-ebook/dp/B08PV83L3N/ref=sr_1_22?__mk_ja_JP=カタカナ&crid=2EJT5BXG5KGYH&keywords=数学+アルゴリズム&qid=1691744094&sprefix=数学+アルゴリズム%2Caps%2C171&sr=8-22)
の2冊でしょうか。

さらっと見た感じ、前者はPythonによるコードが充実してそうです。また、理解しやすいように感じます。
しかし、数学の要素に重点を置いているため、アルゴリズム等の説明は比較的後半にあるように感じます。

後者は読み応えが非常にありそうで、応用まで手が届いている印象です。また、最初からアルゴリズムの説明が始まっているのでその点は読みやすいかと思います。

レベル的には、アルゴリズム×数学　＜　アルゴリズムとデータ構造と見受けられました。
心が折れないように、上手く学習できたらいいなと思っています。

ちなみに、蟻本についても検討しましたが、難易度上の理由で見送りました。間違いない一冊であるというのは理解しているので、今後触れるほどのレベルに到達できたらなと思っています。

かなり長い文章になってしまいました。
今はAtcoderと並行してこれらの勉強をしていて楽しいです。
また、数学についても高校数学をやり直しています。
これら全てを引き続き頑張っていきます！！

読んでいただきありがとうございました。
Oracle Cloud Infrastructure 2023 Architect Associate 合格体験記

# はじめに
[Oracle Cloud Infrastructure 2023 Architect Associate ](https://education.oracle.com/ja/%E8%A3%BD%E5%93%81%E3%82%AB%E3%82%BF%E3%83%AD%E3%82%B0-ouexam-pexam_1z0-1072-23/pexam_1Z0-1072-23)に合格した記録です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29025/956423cb-8047-8811-a47e-f6981f7abb01.png)
思いの外ギリギリだった……

# 個人的バックグラウンド
- Oracle Cloud
    - 実務経験なし
    - Oracle Cloud Infrastructure Foundations 2021 Associate取得
- Google Cloud
    - 過去に2年ほど実務で使用
    - Digital Leader、ACE、PCA取得
- Azure
    - 直近2年半ほど実務で使用
    - AZ-900取得
- AWS
    - 実務経験なし
    - Cloud Practitioner取得

# 学習方法
Oracle Universityの[Become a OCI Architect Associate (2023)](https://mylearn.oracle.com/ou/learning-path/become-a-oci-architect-associate-2023/122195) を受講。
- 全部で24時間ほどのコースだが、2倍速視聴、10秒飛ばしを活用し、必要な概念のみを高速で叩き込んでいくことで、おそらく正味8時間から10時間ほどで完了。
- 44問の模擬試験を2周して全問正解しておく。

# 試験
上記コースから受験申込み。金曜日夜に申し込みを行ったところ、直近で都合の良いところが翌日朝8時からしかなかったため、10時間を切ったところだったが即決。オンライン監視試験のため、時差の都合上早朝の枠しか基本的には空いていない様子だった。
準備の都合上テストセンターでの受験が望ましかったが、オンライン監視試験しか申し込めなかったため、家から徒歩20分ほどのレンタルスペースを借りることに。

# 結果&所感
55問を30分弱で完了。その場で即結果が出て、合格ライン65%に対し76.4%で合格。
パブリッククラウドに関しての基礎知識を持っていれば、OCIに対しての深い理解がなくても十分合格が可能なレベルだと感じた。
ネットワークやストレージ等に関してはOCI特有の仕様等が問題に出やすいため、重点的に勉強しておくとよい。
一方で、本試験においては、模擬試験には出なかった、文章の読解を要する問題が少々出たので覚悟しておくとよい。ただ、基礎問題だけ押さえておけば合格点を取るには支障がない程度。
【Python】欠落番号

# 作るもの
与えられた整数リスト nums から欠けている整数を見つける関数。

# 実装
```python:missing_numbers.py
def missingNumbers(nums):
    # 正の無限大の値を2つリストに追加しておくことで、ループ処理を簡略化する
    nums += [float("inf"), float("inf")]

    # 数値を変換して欠けている整数の位置を示す
    for index in range(len(nums) - 2):
        visited_index = abs(nums[index]) - 1  # 数値の絶対値から1引いた値が、位置を示す
        nums[visited_index] *= -1  # 指定された位置の数値を負に変換することで、その位置が存在することを示す

    missing = []
    # 正の数が残っている位置が、欠けている整数を示す
    for index, num in enumerate(nums):
        if num > 0:  # 正の数が残っている位置が、欠けている整数を示す
            missing.append(index + 1)  # インデックス+1が欠けている整数として追加される
    return missing


# テスト
if __name__ == "__main__":
    nums = [1, 3]
    print(missingNumbers(nums))
```

```terminal:出力
[2, 4]
```

# 実装
https://www.algoexpert.io
【Flutter】操作をブロックするインジケーターを簡単に実装できるパッケージを作った

こんにちは。広瀬マサルです。

**Futureを待っている間、インジケーターを表示して操作させないようにする**

パッケージを作りました。

使い方をまとめたので興味ある方はぜひ使ってみてください！

# katana_indicator

https://pub.dev/packages/katana_indicator

# はじめに

アプリ開発時、ボタンの`onPressed`にてデータを保存する処理やログインする処理など、多少の時間がかかる処理を記述することが多くあるかと思います。

基本的には処理が完了するまでインジケーターを表示してユーザーに待ってもらい、完了時にダイアログを表示したり画面を戻ったりするのではないかと思います。

そのための処理を簡単に記述できるようなパッケージを作成しました。

前提として`実行される処理はすべてFutureで待つようになっている`とします。

下記のように簡単に書けます。

```dart
final future = repository.save(); // なにかしらの保存処理（Future<dynamic>を返す）
await future.showIndicator(context); // 処理が終了するまでインジケーターを表示してユーザーに操作させない
// ダイアログを表示
```

[katana_model](https://pub.dev/packages/katana_model)はCRUDの操作がすべて`Future`で待てるようになっているため保存処理を簡潔に書くことができます。

```dart
IconButton(
  icon: Icon(Icons.check),
  onPressed: () async {
    final doc = collection.create();
    await doc.save({
      "first": "masaru",
      "last": "hirose",
      "type": "kanimiso",
    }).showIndicator(context);
    context.router.pop();
  }
);
```

# インストール

下記のパッケージをインポートします。

```bash
flutter pub add katana_indicator
```

# 使い方

基本的に`Future`で用意されているエクステンションのメソッドを利用するだけです。

```dart
final doc = collection.create();
await doc.save({
  "first": "masaru",
  "last": "hirose",
  "type": "kanimiso",
}).showIndicator(context);
context.router.pop();
```

インジケーターは`CircularProgressIndicator`がデフォルトで利用されています。

これを変更したい場合はshowIndicatorの`indicator`パラメーターを利用してください。

```dart
await doc.save({
  "first": "masaru",
  "last": "hirose",
  "type": "kanimiso",
}).showIndicator(context, indicator: Center(child: LinearProgressIndicator()));
```

# おわりに

自分で使う用途で作ったものですが実装の思想的に合ってそうならぜひぜひ使ってみてください！

また、[こちら](https://github.com/mathrunet/flutter_masamune)にソースを公開しているのでissueやPullRequestをお待ちしてます！

また仕事の依頼等ございましたら、私の[Twitter](https://twitter.com/mathru)や[Webサイト](https://mathru.net)で直接ご連絡をお願いいたします！

https://mathru.net/ja/contact

# GitHub Sponsors

スポンサーを随時募集してます。ご支援お待ちしております！

https://github.com/sponsors/mathrunet
エレキ素人が何か考える（その25）：tone()およびanalogWrite()のFFT

# tone()およびanalogWrite()の周波数解析(FFT)
[その24](https://qiita.com/infinite1oop/items/230f0832a2d8b177ee74)同様、デジタルオシロスコープの機能を確認するため、Arduino互換機を用いて、tone()関数およびanalogWrite()関数実行時の周波数解析を実施。

## ソースコード
```c++
#define PIN 9
uint32_t freq = 490;
uint8_t duty = 25;

void setup() {
}

// Either tone() or analogWrite() must be selected.
void loop() {
  //tone(PIN, freq);
  analogWrite(PIN, duty);
}
```
loop()中のtone()またはanalogWrite()のいずれかを選択。freqは周波数、dutyはデューティ比である。

## 検証
### tone()とanalogWrite()との比較
tone()はデューティ比50%の矩形波を生成する。そこで、まず、analogWrite()にてデューティ比およそ50%(duty=127)を指定する。その時の波形が下記となる。
![analogWrite127.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/9f22ef01-013d-1657-24ad-bdb5d8b19268.png)
このFFTは下記となる。
![analogWrite127FFT-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/63527952-4e21-356d-462c-c9280f8c44f7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/a93e0756-31fa-e9c9-ec23-60b308b5ef22.png)
おおよそ、490Hzがメイン周波数となる。そこで、tone()にて、490Hzを指定した時の波形およびFFT結果が下記となる。
![tone490.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/e0e98236-6427-b737-616d-1fcadf3e8a08.png)
![tone490FFT-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/d5731b20-e51d-30b5-f0ae-201aaf260d27.png)
両者はほぼ同じ。

また、デューティ比50%の矩形波の矩形波、3、５、７、９、、、の高調波が出るらしい（後述）。

### analogWrite()でデューティ比を変化させる。
理論的には、[こちら（非対称矩形波のフーリエ級数](https://vrlab.meijo-u.ac.jp/edu/fourier-series-square-dutyratio.html)）で説明されている。また、デューティ比によって、高調波の出方もシミュレーションできる。先程のデューティ比50%は次のようになるようだ。
![Duty50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f59ce7a7-2892-cb90-cb76-d4c882e4a958.png)

#### デューティ比75%
理論値は下記。
![Duty75.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/80922d6b-158a-8265-6a9f-2c5c72599ba4.png)
実測値は下記となった。
![analogWrite191FFT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/ba6d6e11-aba9-5d59-14bc-afcd2a7c2887.png)
わかりにくいかもしれないが、ほぼ同じに見える。

#### デューティ比10%
理論値は下記。
![Duty10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/c781f502-d1c5-3f54-0d95-7d5860bdc6b3.png)
実測値は下記となった。
![analogWrite25FFT-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/dc3dc680-d2b5-c880-9b4b-b61affc65868.png)
こちらもほぼ同じであろう。


EOF
ステーブルディフュージョンのcomfyuiの使い方とそもそもの基本的な使い方がわかりません

グーグルコラボでcomfyuiで最近遊んでる人間なんですが、
UltimateSDUpscale
を使いたいんですが、
この以下の構文この記述で合っていますでしょうか？
僕が書いた構文よく見たら拡張子がないんですが、なんて拡張子を入力したらいいか分からないですし、よく考えたらギットハブからダウンロードする時って.gitって拡張子って必要だったでしょうか？

!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://github.com/ssitu/ComfyUI_UltimateSDUpscale.git -d /content/ComfyUI/custom_nodes -o ComfyUI_UltimateSDUpscale



ついでに
コントロールネットが以下で
/content/ComfyUI/models/controlnet
ローラが以下ですか？
/content/ComfyUI/models/loras
UltimateSDUpscaleは拡張機能なので
/content/ComfyUI/custom_nodes
でしょうか？

分かる方どうかよろしくお願いします。
EventBridge SchedulerでAuroraの定期的な再起動

# ■概要
Aurora PostgreSQL（ライターとリーダー）の定期的な再起動をEventBridge Schedulerで設定します。

# ■実際に設定してみる

EventBridgeの画面へ進み、ルール名を記載後、EventBridge Schedulerに進みます。

![Event1_20230811164346.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/1e84dcb7-bd58-07ec-ff02-47dcced22fbe.png)

次にcronを設定しましょう。
今回は毎月1日の18時に再起動したいので以下のような式になりました。

```
0 18 1 1-12 ? *
```

![スケジュール20230811164940.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/ee4c96e1-2bee-43d7-1fc4-d686b93422db.png)

次にターゲットの選択を行います。
「すべての API」を選択し、「RDS」で検索をかけます。

![ターゲットの選択1_20230811174213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/98567501-ed7f-7bc6-aaab-79ad212b4bc9.png)

「Amazon RDS」を選択し、次はrebootで検索をかけます。
今回はDBインスタンスの再起動になるので「RebootDBInstance」を選択しました。
（「RebootDBCluster」もありますが、aurora-postgresqlではサポートしていないとの事… ）
以下のように対象DB名を記載しましょう。

![ターゲット選択2_20230811181818.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/aee8c981-745b-d660-c974-86c3e9129cef.png)

スケジュール完了後のアクションではNONE、再試行ポリシーとデッドレターキュー (DLQ)はなしとしています。

![スケジュール完了後の20230811173327.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/9fa3c6b0-4ad4-238f-d920-259fb91f8e98.png)

最後にこのイベントルールを動作させる為にIAMロールが必要となります。

まずはIAMポリシーを作成しましょう。
今回はクラスターの再起動を行うので以下で設定しました。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "rds:RebootDBInstance",
            "Resource": "*"
        }
    ]
}
```

次にIAMロールを作成します。
EventBridgeで実行できるように信頼されたエンティティで以下のように設定しておきましょう。
エンティティを設定したら、上で作成したポリシー（RDS再起動する権限のやつ）も付与しておきます。

![ロール20230811172138.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/f0cd48f7-f558-95a6-82d3-31245d77561e.png)

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

上記、作成したロールを「アクセス許可」で指定し、設定を最終確認後、スケジュールを作成してください。

![アクセス許可20230811201012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/266063f2-3a92-8f5c-6265-9a3797ebf26a.png)


これで設定は完了です！
実際に動作したかはauroraの「ログとイベント」より確認できます。

# ■Auroraの再起動について
ちなみに、ライターとリーダーで構成されているAuroraの再起動は以下のように動作します。

・ライターを再起動した場合
ライターとリーダーが再起動される

・リーダーを再起動した場合
再起動されるのは選択したリーダーのみ

参考：
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_RebootCluster.html#aurora-reboot-cluster

> ライター DB インスタンスを再起動すると、クラスター内の各リーダー DB インスタンスの再起動も開始されます。
> これにより、クラスター全体のパラメータの変更がすべての DB インスタンスに同時に適用されます。
> ただし、すべての DB インスタンスの再起動により、クラスターのための短時間の停止が発生します。
リーダー DB インスタンスは、ライター DB インスタンスの再起動が完了して利用可能になるまで利用できません。


# ■最後に
EventBridge Schedulerは導入が簡単であり、様々な動作をスケジュールできます。
もちろんRDS再起動以外でもターゲットAPIは豊富にありますので、色んな使い方を模索してみたいと思います。
オープンソースアプリフレームワーク "Skeet" が ChatGPT だけでなく Google AI にも対応。より柔軟なカスタマイズが可能に。

![SkeetMeetsVertexAI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780317/2050e37d-a09e-5a76-d8eb-6e7247ca733f.png)


gm! kishi.solです。

本日、オープンソース の TypeScript フルスタックサーバーレスアプリフレームワーク "Skeet" Version 1.1.0 のリリースを発表しました。

Skeet は GCP (Google Cloud) と Firebase 上にフルスタックアプリを構築できるオープンソースの TypeScript 製サーバーレスフレームワークです。

API サーバーから Web・iOS・Android アプリまでを TypeScript で一貫して超速開発することができます。

今回のアップデートにより、Skeet は OpenAI 社の ChatGPT(GPT-4 等)に加えて、Google 社の Vertex AI にも対応いたしました。

Vertex AI は Google Cloud による、あらゆるユースケースに対応したフルマネージドの機械学習(ML)ツールで、ML モデルの構築、デプロイ、スケーリングを高速化します。

Vertex AI ドキュメント: https://cloud.google.com/vertex-ai?hl=ja


## Google 社製の生成 AI

![BuildWithGoogleAi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780317/b1327026-830f-1bc2-eead-d34483347a02.png)


Vertex AI は最近、同じく Google 社製の PaLM2 と呼ばれる大規模言語モデル(LLM)にも対応し、生成 AI(Generative AI)のサポートを追加しました。

PaLM2 は多言語、多様な事前トレーニングデータセットを使用して効率的に学習しており、少ないトークン数や小さいモデルにおいても性能が向上しています。

特に優れているのはプロンプトの調整やファインチューニングで、自社のビジネス用にモデルをカスタマイズした際におけるアウトプットの質が ChatGPT 等の競合製品と比べて高いので、自社オリジナルの AI チャットアプリを開発するのに向いています。

Skeet を使えばすぐに Vertex AI を活用して、自社専用にカスタマイズしたオリジナル AI のアプリを立ち上げることができます。

詳細は下記リリースノートをお読みください。

Skeet v1.1.0 リリースノート: https://github.com/elsoul/skeet-cli/releases/tag/v1.1.0

Skeet は世界中すべてのアプリケーション開発現場の開発・メンテナンスコストを削減、開発者体験を向上させるためにオープンソースとして開発されています。

詳しくは公式ドキュメントを御覧ください。

Skeet ドキュメント: https://skeet.dev/ja/
rustでstrもstringもとれるようにしたい

ユースケースごとに考えてみます。

@Tundra_Climate さんありがとうございます！

## println!やformat!を使いたい場合
`std::fmt::Display`や`std::fmt::Debug`を使います。
`Vec`などの構造体は`Debug`トレイトを実装しているので自動的に文字列に変換できます。

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=d20a8e484cab30265728f2606413e8a9

```rust
fn format_any(any:impl std::fmt::Debug) -> String {
  format!("{:?}",any)
}

fn print_any(any:impl std::fmt::Display){
  println!("{}",any)
}

fn main() {
  print_any("str");
  print_any("string".to_string());
  print_any('c');
  print_any(format_any([1,2,3]))
}
```


## Stringに統一する場合
`.to_string`を使ってStringに統一する場合は`ToString`を使います。

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=d2dd7fc16d6c922a357dd6031f93f835

```rust
fn stringify(arg:impl ToString) -> String {
  arg.to_string() + " is stringified"
}

fn main() {
  println!("{}",stringify("str"));
  println!("{}",stringify("string".to_string()));
  println!("{}",stringify('c'));
  println!("{}",stringify(42));
}
```


## &strに統一する場合
参照を使って&strに統一できます。その場合は`AsRef<T>`を使います。`Char`などは実装していません。

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=8f5d08c34e5c959a899136fbe588b509

```rust
fn this_is_it(arg:impl AsRef<str>) -> String {
  "this is ".to_owned() + arg.as_ref()
}

fn main() {
  println!("{}",this_is_it("str"));
  println!("{}",this_is_it("string".to_string()));
}
```
FastAPIで環境変数を効率的に使う方法！

FastAPIを使用する際、環境変数は設定情報や秘密鍵を安全に管理する上で非常に便利です。この記事では、FastAPIで環境変数を簡単かつ効果的に使う方法を解説します。具体的なステップやサンプルコードを豊富に提供しますので、ぜひ最後までご覧ください！

## 目次
1. 必要なライブラリのインストール
2. 環境変数を読み込む設定
3. FastAPIアプリケーションでの環境変数の使用

---

## 1. 必要なライブラリのインストール

まずは、環境変数を簡単に扱うためのライブラリ`python-dotenv`をインストールしましょう。

```bash
pip install python-dotenv
```

## 2. 環境変数を読み込む設定

次に、プロジェクトのルートディレクトリに`.env`ファイルを作成します。このファイル内に環境変数を設定します。例：

```plaintext
DATABASE_URL=postgresql://user:password@localhost:5432/mydatabase
SECRET_KEY=mysecretkey
```

そして、FastAPIアプリケーションを起動する前に、この`.env`ファイルから環境変数を読み込む設定を追加します。以下のコードをアプリケーションの初めの部分に追加します。

```python
import os
from dotenv import load_dotenv

load_dotenv()  # .envファイルから環境変数を読み込む
```

## 3. FastAPIアプリケーションでの環境変数の使用

環境変数を読み込んだ後、FastAPIアプリケーション内でそれらの変数を使用できます。以下のように`os.environ.get()`を使用して環境変数の値を取得します。

```python
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    secret_key = os.environ.get("SECRET_KEY")
    return {"Hello": "World", "Key": secret_key}
```

この方法で、アプリケーション内で環境変数を簡単に使用することができます。

---

以上が、FastAPIで環境変数を効果的に使用する方法です。この方法を採用することで、設定情報や秘密鍵を安全に管理しながら、アプリケーションの設定を柔軟に行うことができます。是非お試しください！

もし質問やフィードバックがあれば、コメントやいいねをお願いします！🚀🌟
せんせー、光量子通信ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、光量子通信ってなに？

# 光量子通信とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

光量子通信をとてもシンプルに説明すると、光の粒子を使って、とっても安全にメッセージを送る方法です。

みんな、光を知ってるよね？太陽から来る明るいあの光。
この光には、とても小さな粒子がたくさん入っているんです。
それを「光の粒子」と呼びます。

今、科学者の人たちは、この光の粒子を使って、とても大切な手紙やメッセージを他の人に送る方法を考えているんです。これを「光量子通信」と言うんです。

この方法だと、他の人がこっそりと手紙を読もうとしても、すぐにバレちゃうから、とても安全なんです。
だから、大切な情報を送る時に役立ちます。

つまり、光量子通信は「光の粒子を使って、安全に大切なメッセージを送る魔法のような方法」と言えますね。

# まとめ

光量子通信をとてもシンプルに説明すると、光の粒子を使って、とっても安全にメッセージを送る方法
【超初心者】Laravel開発環境準備手順

<h1>Laravel開発環境準備手順</h1>
<h3>①homebrewの確認</h3>
触るの久しぶりなのでインストールされてるか確認。

![スクリーンショット 2023-08-09 1.20.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/0a65de38-e854-5d80-21e5-4ce7fb6418d4.png)
入ってました。

<h3>②PHP指定のバージョンをインストール</h3>

提供されているバージョンの確認
```
brew search php
```

指定のバージョンをインストール
```
brew install php@8.0
```

インストールされているか確認
```
php -v
```

パスを通す
```
echo 'export PATH="/opt/homebrew/opt/php@8.0/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc 
```

指定したバージョンになっているか確認し、なっていたらOK
![スクリーンショット 2023-08-12 2.28.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/3b8de7a4-0362-463f-a37d-9694f37bb499.png)

<h1>Composerインストール</h1>
<h3>Composerの確認</h3>

提供されているか確認
```
brew search composer
```

Composerのインストール
```
brew install composer
```

インストールされているか確認
```
composer
```

<h1>Laravelのインストール</h1>

Composerを使用してLaravelをインストール
```
composer create-project laravel/laravel --prefer-dist Sample_laravel
```
※Sample_laravelは任意の名前です。

プロジェクトに移動
```
cd Sample_laravel
```

ローカル環境でLaravelを実行する
```
php artisan serve
```

ページが表示される
![スクリーンショット 2023-08-12 3.12.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/91093c22-02f7-12ec-6983-4fc5dd867af5.png)

ローカルでの実行をストップさせるにはCtrl + Cをクリック

これでLaravelの環境構築は終了。
API Gatewayのすべて！入門からメリット、AWSとGCPでの活用方法まで



## 目次

- [はじめに](#はじめに)
- [API Gatewayとは？](#API-Gatewayとは)
- [API Gatewayの主な機能](#API-Gatewayの主な機能)
- [API Gatewayのメリット](#API-Gatewayのメリット)
- [AWSとGCPでのAPI Gatewayの利用](#AWSとGCPでのAPI-Gatewayの利用)
- [まとめ](#まとめ)

---

### はじめに

APIの管理と運用を効率化するためのツール、それがAPI Gatewayです。この記事では、API Gatewayの基本的な概念から、主な機能、メリット、そして大手クラウドプラットフォームであるAWSとGCPでの利用方法について解説します。

---

### API Gatewayとは？

API Gatewayは、ユーザーやクライアントがインターネット経由でアプリケーションやサービスにアクセスする際の入口となるサービスです。具体的には、バックエンドサービスの前に配置され、クライアントからのリクエストを受け取り、適切なサービスやリソースにルーティングします。

---

### API Gatewayの主な機能

1. **リクエスト/レスポンスの変換**  
クライアントからのリクエストをバックエンドサービスが受け取れる形式に変換し、またその逆も行います。
2. **認証/認可**  
誰がAPIを利用しているのか、その人が権限を持っているのかを確認します。
3. **レートリミット**  
一定の時間内に特定のクライアントからのリクエスト数を制限します。
4. **キャッシング**  
高速なレスポンスを提供するために、頻繁にアクセスされるリソースのレスポンスをキャッシュします。
5. **モニタリングとロギング**  
APIの利用状況やエラー情報などを収集し、分析や監視に利用します。

---

### API Gatewayのメリット

1. **セキュリティの強化**  
バックエンドサービスを直接公開するリスクを軽減し、必要なAPIのみを公開します。
2. **開発の迅速化**  
共通の機能をAPI Gatewayで一元的に管理することで、バックエンドの開発が効率的になります。
3. **スケーラビリティ**  
トラフィックの増減に応じて、API Gatewayのリソースをスケーリングすることができます。
4. **統合管理**  
複数のサービスやリソースを一元的に管理し、ルーティングを効率的に行います。

---

### AWSとGCPでのAPI Gatewayの利用

- **AWS API Gateway**  
AWSのAPI Gatewayはフルマネージドサービスとして提供されています。特にLambdaやEC2、RDSなどのAWSサービスとの統合が容易で、大規模なAPIの開発や運用に適しています。

- **Google Cloud Endpoints**  
GCPのAPI Gatewayの一例です。App Engine, Compute Engine, Kubernetes EngineなどのGCPサービスと統合して利用することができます。

---

### まとめ

API Gatewayは、APIの管理と運用を効率的に行うための強力なツールです。その基本的な概念からメリット、AWSとGCPでの利用方法まで、この記事を通じてAPI Gatewayの全体像を掴むことができたと思います。

もし、この記事が役立ったと感じたら、ぜひ「いいね」を押してください。これからも技術情報を発信していきますので、フォローもよろしくお願いします！

---

これでQiita用のテックブログ記事の作成は完了です。必要に応じて調整や編集を行ってください。何か他に質問や要望があればお知らせください。
【Unity】コルーチンとタプルを使って複数のフィールドを監視するメモ

# やりたいこと
int型のフィールド`num1`,`num2`を監視し、値が更新されたときにstring型のフィールド`text`を更新したい。

# 一般的なやり方
前フレームの値を保持するフィールドを用意し、`Update()`で判定・更新を行う
```cs
public class SampleComponent : MonoBehaviour
{
    // 監視対象
    public int num1;
    public int num2;

    // 変更対象
    public string text;

    // 前フレームの値
    private int prevNum1;
    private int prevNum1;

    // 初期化
    void Start() {
        text = $"{num1}-{num2}";
        prevNum1 = num1;
        prevNum2 = num2;
    }

    void Update() {
        if(num1 != prevNum1 || num2 != prevNum2) {
            text = $"{num1}-{num2}";
            prevNum1 = num1;
            prevNum2 = num2;
        }
    }
}
```

## 解説
`Update()`はフレーム毎に実行されるメソッドです。
`prevNum1`, `prevNum2`はそれぞれ`num1`, `num2`の前フレームでの値を保持し、それらの値を比較することで値の変更を検知しています。

## 問題点
- 監視するフィールド1つごとにフィールドが1つ増える
- 監視・更新しないといけないフィールドが多くなると`Update()`が肥大化する

# コルーチンを使用した記述方法
```cs
public class SampleComponent : MonoBehaviour
{
    // 監視対象
    public int num1;
    public int num2;

    // 変更対象
    public string text;

    void OnEnable() {
        StartCoroutine(CoUpdateText());
    }

    IEnumerator CoUpdateText() {
        while(true) {
            text = $"{num1}-{num2}";
            var state = (num1, num2); // 監視するフィールドの値を1タプルに詰め込む
            yield return new WaitWhile(() => state == (num1, num2));
        }
    }
}
```

## 解説
監視・更新処理を全てコルーチン内で完結させるようにしました。
ローカル変数`state`は最終更新時点でのフィールドの値を保持しています。
`WaitWhile`は指定した処理をフレーム毎に実行し、`false`を返すまでコルーチンの進行を待機するためのオブジェクトで、ここでは`state`と現在の値のタプルを比較し、値が変更されるまでコルーチンの進行を待機しています。
`WaitWhile`を通過した後は、無限ループなので上の更新処理に戻り、再度待機が始まります。

## 問題点
- `WaitWhile`のnewとクロージャのため、フィールドが更新されるたびにヒープアロケーションが発生する

# まとめ
肥大化した`Update()`を読み直すのは結構だるい
せんせー、水分採取技術ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、水分採取技術ってなに？

# 水分採取技術とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

水分採取技術って、砂漠や乾燥した場所で、とても少ない水分を上手に取ってくる方法のことを言います。

例えば、空気の中には、見えないけどちょっとだけ水が含まれています。
この少しの水を集めて、飲み水や植物に水やりをするための水に変えることができる技術があります。

砂漠はすごく暑くて、水があまりない場所だけど、この水分採取技術を使うと、
そんな砂漠でも水を手に入れることができるんです。

つまり、水分採取技術は「水が少ない場所でも、ちょっとずつでも水を取ってくる魔法のような方法」だと思ってもらえればわかりやすいかもしれません。

# まとめ

水分採取技術って、砂漠や乾燥した場所で、とても少ない水分を上手に取ってくる方法のこと
せんせー、バイオマイマーシーってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、バイオマイマーシーってなに？

# バイオマイマーシーとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

バイオマイマーシーは、自然や生物のしくみや動きを学んで、
それを人工のものづくりに活かそうとする考え方や技術のことです。

例を出すと、みんながよく知っている「飛行機」の翼は、鳥の翼を参考にして作られていることもあります。
鳥はとても上手に飛ぶことができるので、その秘密を学ぼうと人々は考えました。

あるいは、虫の足がどうやって滑らないで物にくっつくかを学び、
それを元にした新しい粘着テープや靴の底などを考え出すこともできます。

つまり、バイオマイマーシーは「自然や生物のすごいところを学んで、それを人の役に立つものづくりに使う」ことを目指しているんです。

自然は長い時間で色々なものを作り上げてきたので、その知恵を利用することで、
新しい素敵なものを生み出すことができるのです。

# まとめ

バイオマイマーシーは、自然や生物のしくみや動きを学んで、
それを人工のものづくりに活かそうとする考え方や技術のこと
せんせー、 バイオインフォマティクスってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、バイオインフォマティクスってなに？

# バイオインフォマティクスとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

バイオインフォマティクスは、ちょっと長い難しい名前ですね。
これは、生物の情報とコンピュータを使って、その情報を解析したり、新しいことを発見する学問です。

例えば、私たちの体の中には「DNA」というものがあります。

これは、私たちがどんな目や髪の色を持つか、身長がどれくらいになるかなど、
私たちの特徴を決める情報のようなものです。
このDNAの情報は、とってもとっても長い文字列のようなもので、それを全部読むのは大変です。

そこで、コンピュータを使ってこの長〜い文字列を速く読んだり、
何か新しいことを発見したりするのが、バイオインフォマティクスの仕事です。

つまり、生物の情報とコンピュータの技術を組み合わせて、新しい発見をする学問なんです

# まとめ

生物の情報とコンピュータを使って、その情報を解析したり、新しいことを発見する学問
せんせー、培養肉ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、培養肉ってなに？

# 培養肉とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/754ad1db-cf66-be94-8f33-137d3e28f1cc.png)

培養肉とは、実際の動物を育てることなく、実験室の中で作られたお肉のことを言います。

イメージとしては、お肉を作るための「種」みたいなものを取ってきて、
特別な液体の中で大きくしていく感じです。

普通のお肉は、動物を育てて、その後お肉として切り取られるけれど、
培養肉は動物を育てることなく、直接お肉だけを作ることができるのです。

これは、たくさんの動物を育てることなく、
環境にやさしい方法でお肉を作ることができるので、未来の食べ物として注目されています。

# まとめ

培養肉とは、実際の動物を育てることなく、実験室の中で作られたお肉のこと
【 Java 】QRCode生成

## ◾️ JavaでQRCodeを生成する方法
:::note info
・使用ライブラリ
　　ZXing
　　　∟　core-3.5.1.jar
　　　∟　javase-3.5.1.jar
:::

:::note warn
※今回QRCode生成に至る詳しい処理については触れてません。
　お作法だと思って使ってます。
　オプションは複数あるらしいので、必要に応じて付与する。

:::


```java:Mainクラス
	public static void main(String[] args) {
		// QR読み取り時に表示する文字列
		String content = "https://qiita.com/devdia";
		// 画像サイズ(ピクセル)
		int width = 200;
		int height = 200;
		
		try {
			QRCodeWriter qw = new QRCodeWriter();
			BitMatrix bm = qw.encode(content, BarcodeFormat.QR_CODE, width, height);
			BufferedImage img = MatrixToImageWriter.toBufferedImage(bm);
			ImageIO.write(img, "png", new File("src/images/outputQRCode.png"));
		} catch (WriterException | IOException e) {
			System.err.println("QRCode生成時に例外発生" + e);
		}
		System.out.println("QRCodeの生成に成功");
	}

```
***
### ◾️ 日本語対応版
デフォルトのCharasetが「ISO-8859-1」のため、文字列の指定に日本語を使うと文字化けしてしまいます。
EncodeHintTypeを使ってCharasetを指定してあげることで日本語でも文字化けせずQRCodeが生成できるようになります。
```java:Mainクラス
public static void main(String[] args) {
    // QR読み取り時に表示する文字列
    String content = "日本語データ";
    // 画像サイズ(ピクセル)
    int width = 200;
    int height = 200;
    // HashMapより、EnumMapを使うことで実行効率が上がるらしい...
    Map<EncodeHintType, Object> hints = new EnumMap<>(EncodeHintType.class);
    // Charasetを"UTF-8"に指定
    hints.put(EncodeHintType.CHARACTER_SET, StandardCharsets.UTF_8);
    
    try {
        QRCodeWriter qw = new QRCodeWriter();
        // 引数にQRCode生成時のヒントとなる情報を渡す
        BitMatrix bm = qw.encode(content, BarcodeFormat.QR_CODE, width, height,hints);
        BufferedImage img = MatrixToImageWriter.toBufferedImage(bm);
        ImageIO.write(img, "png", new File("src/images/outputQRCode.png"));
    } catch (WriterException | IOException e) {
        System.err.println("QRCode生成時に例外発生" + e);
    }
    System.out.println("QRCodeの生成に成功");
}
```
***

### ◾️ 参考資料
https://develman.net/read-and-write-qrcode-with-zxing-java/

https://qiita.com/yoshi389111/items/0fee2be43e5135b1bb15
DockerでNagiosをインストール

## 目的
Nagiosを構築する際にDockerを用いたいと考えた。今回はインストール、ログインだけを行う。

## 構築
### docker-compose.yml
```yml
version: '3.3'
services:
    nagios:
        container_name: nagios4
        volumes:
            - '/opt/nagios/etc/:/opt/nagios/etc/'
        ports:
            - '7070:80'
        image: 'jasonrivers/nagios:latest'
```

## ログイン
User: nagiosadmin
Pass: nagios
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738475/5a4acc91-0b2a-7ac8-c8a2-1b56f15faa76.png)

## 設定ファイル
/orig/etc配下に存在する
```bash
root@11b67ad600f6:/orig/etc# ls
cgi.cfg  conf.d  monitor  nagios.cfg  nsca.cfg  objects  resource.cfg  send_nsca.cfg
```
ICLR2023の枝刈り論文 (2)

# 概要

この記事では、[ICLR2023](https://iclr.cc/)の枝刈り論文を紹介します。[^1]
[その1](https://qiita.com/kyad/items/d7dd45af7f201c065ff3)

[^1]: 画像や数式は論文から引用しています。

# TVSPrune - Pruning Non-discriminative filters via Total Variation separability of intermediate representations without fine tuning

https://openreview.net/forum?id=sZI1Oj9KBKy

- 概要：TVSPrune. Structured枝刈りで画像やロス修正不要なもの
- 新規性：Discriminative filter hypothesisを提案。良く学習されたネットワークは分類器の分類能力に影響を与えずに刈れる。
- キモ：
  - フィルタの分離能力を、クラス間の出力のTV距離の観点で定義する。
  - 刈るレイヤを決める尺度LDIFFScoreを定義する。
- 評価：VGG, ResNetなどで実験した。


# Pruning Deep Neural Networks from a Sparsity Perspective

https://openreview.net/forum?id=i-DleYh34BM

- 概要：PQI, SAP. 枝刈りの指標
- 新規性：疎なパラメータが見たすべき6条件を見たした、圧縮ができる可能性の指標PQIと、それを用いて枝刈り率を調整しながらう刈ることで枝刈り後の精度を改善したSAPを提案した。
- キモ：PQIの定義とPQIが大きいほど疎であること。
- 評価：ResNet, FasionMNIST, CIFARで実験した。


# Holistic Adversarially Robust Pruning

https://openreview.net/pdf?id=sAJDi9lD06L

- 概要：Pre-trained向け枝刈り
- 新規性：従来の枝刈りの精度劣化や敵対例へのロバスト性が落ちる課題を解決する。
- キモ：敵対例ができる式を間に入れてmin/maxしたロスを最適化する。Global compressionなどの工夫。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/b3e739b9-92f0-8000-81e2-e9dfb47ecfc3.png)
- 評価：VGGやResNet


# A Unified Framework for Soft Threshold Pruning

https://openreview.net/forum?id=cCFqcrq0d8

- 概要：Soft threshold pruning (枝刈りと学習の繰り返しする方法)
- 新規性：Soft threshold pruningはISTA (Iterateve Shrinkage-Thresholding Algorithm) のL1正則化項として特徴づけられることを示した。
- キモ：最適な枝刈り閾値スケジューラLATSを提案した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/ff7a7714-82da-c7fd-e1c6-4f2aec6a6f06.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/e71688d2-5abf-531d-4dcc-7c3bac32540d.png)
- 評価：ResNetやMobileNetV1


# HomoDistil: Homotopic Task-Agnostic Distillation of Pre-trained Transformers

https://openreview.net/forum?id=D7srTrGhAs

- 概要：HomoDistil. 枝刈りの繰り返しでTransformerの学習済みモデルからタスクによらないモデルの蒸留をする方法。
- 研究機関：Amazon
- 新規性：目標に至るまで蒸留学習、枝刈りを繰り返すことで通常の知識を保持したまま小さなモデルを作る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/88f10ff3-e597-2836-92d2-3d6cf88ebbba.png)
- キモ：HomoDistilは従来の蒸留と異なり、軌跡が蒸留の有効な空間の中にいることを保証する。
- 評価：BERT等に適用した。
【C】初めてのC言語（27. 定義済みマクロによるOS判定）

# はじめに

ある時に職場で見かけたCのコードに、 `#ifdef _WIN32` という条件付きコンパイル（コンパイルスイッチ）を見かけました。
以前に条件付きコンパイルを学んだ時には、条件として`#define ～`で定義されたマクロが使われていましたが、今回見たコードを再確認しても `#define _WIN32`というコードが見当たりませんでした。

https://qiita.com/nkojima/items/6831ab77617925f121a0

そこで気になって調べてみたところ、`#ifdef _WIN32`は[**定義済みマクロ**](https://learn.microsoft.com/ja-jp/cpp/preprocessor/predefined-macros?view=msvc-170)というものであることが分かりました。

今回はこの定義済みマクロについて調べた結果をまとめてみました。

# 学習環境

* 今回は[paiza.io](https://paiza.io/ja/projects/new)のC言語のエディタと、Visual Studio Community 2019を使いました。

# 定義済みマクロとは

* 今回の `_WIN32` というマクロは、Microsoft C/C++ コンパイラ (MSVC) で事前定義されているマクロだそうです。
  * 事前定義されていたため、`#define _WIN32`というコードが存在しなかったというわけです。
* 「定義済みマクロは引数を取らず、再定義することはできない」という特徴があるそうです。
  * 事前に定義されているものに上書きできるとマズいので、これは当たり前の仕様だと感じました。

# 定義済みマクロ「_WIN32 」

> コンパイル ターゲットが 32 ビットの ARM、64 ビットの ARM、x86、または x64 の場合、1 として定義されます。 それ以外の場合は、定義されません。

* 上記のMicrosoftの説明だと分かりづらいですが、平たく言うと「OSがWindows(32bit)であるか？」を判定するために使われるマクロだそうです。

# 「_Win32」を使った例

* 裏でgccを利用しているpaiza.io上とVisual Studio上では、実行結果が想定通り異なっていました。
  * gcc上では`_WIN32`というマクロが定義されていないので、実行結果に違いが現れたということだと思います。

```c:Main.c
#include <stdio.h>

int main(void){
    printf("処理開始...\n");
#ifdef _WIN32
    printf("Windows環境に依存する処理\n");
#else
    printf("Windows以外の環境に依存する処理\n");
#endif
    printf("処理終了\n");
}
```

```text:paiza.io上での実行結果
処理開始...
Windows以外の環境に依存する処理
処理終了
```

```text:Visual Studio上での実行結果
処理開始...
Windows環境に依存する処理
処理終了
```

# 補足

* Linuxであるかを識別するには`__linux__`、Mac OSであるかを識別するには`__APPLE__`というマクロがそれぞれ用意されているようです。
* 他にもコンパイラやCPUの種類を識別するマクロも用意されているようですが、こういったものを使いこなせるようになると初心者レベルを脱却できそうですね...


# 参考URL

* [定義済みマクロ - Microsoft Learn](https://learn.microsoft.com/ja-jp/cpp/preprocessor/predefined-macros?view=msvc-170)
* [C言語で定義済みマクロによるコンパイラ及びOS判定 - 新石器Wiki](https://www.yokoweb.net/dokuwiki/programing/c-language/compiler-os-macro-define)
* [事前定義済みマクロ - 通信用語の基礎知識](https://www.wdic.org/w/TECH/%E4%BA%8B%E5%89%8D%E5%AE%9A%E7%BE%A9%E6%B8%88%E3%81%BF%E3%83%9E%E3%82%AF%E3%83%AD)
ChatGPT辞典

サトシです。現在『ChatGPT辞典』というブログを運営しており、最新のAI『ChatGPT』の機能や特徴を解説しています。ブログ記事自体をChatGPTを利用し書いているため、ChatGPTがどれくらい文章力に長けているかわかると思うので、是非読んでくれたら嬉しいです。

🔻ブログURL
https://gcqonmlkjihgfedc.xyz/
@Binding #SwiftUIの修飾子に関して簡単にアウトプットしてみる

## はじめに
今回は@Bindingに関してアウトプットしていく。
まだプロパティラッパーに関して若干曖昧だという人は[前回の記事（@State編）](https://qiita.com/RammaruIshii/items/1faef73952f273090895)を閲覧していただけるれば良い（かも）。

## @Bindingの詳細
- データバインディングができる。 = プロパティを双方向から監視する。（どちらか一方が更新されればもう一方も更新されるみたいなニュアンス）
    - @Stateから@Bindingへデータを紐づけることを`プロパティへ参照を渡す`とも表現される。
        - 変数に@Bindingを付与することで親子関係にあるView内の@Stateプロパティ（状態変数）もデータを共有する。
- @stateを受け取るときは引数に`$`を付ける。

## ソースコード
```swift:Swift
// データバインディングされたBViewの引数の値としてisCheckを渡し、そのBool値によって表示させるImageを変更する
// バインディングによってisCheckはBViewのisCheckと紐づいている
struct ContentAView: View {
    @State private var isCheck: Bool = false

    init(isCheck: Bool) {
        self.isCheck = isCheck
    }

    var body: some View {
        VStack {
            Image(Image(systemName: isCheck ? "bell.fill" : "bell.slash"))

            // AViewの子Viewとして定義
            // @stateを受け取るときは引数に$を付ける
            ContentBView(isCheck: $isCheck)
        }
    }
}

// ボタンを押したらバインディングしているBool値を反転させる
struct ContentBView: View {
    //バインディングによってAViewのisCheckのBool値を共有する
    @Binding var isCheck: Bool

    var body: some View {
        Button("切り替えボタン") {
            // toggleはBool型プロパティの値を反転させる
            isCheck.toggle()
        }
    }
}

```

## おわりに
間違い等ありましたらコメント欄にてご指摘ください！

## 参考記事
- [SwiftUIドキュメント](https://developer.apple.com/documentation/swiftui/)
- [カピ通信](https://capibara1969.com/)
- [iOS-Docs](https://ios-docs.dev/)

## 開発環境
- Xcode-14.3
- Swift version 5.8
画面内に入ったタイミングで処理をする

対象のコンテンツが画面内に入った時にアクションを起こす方法です。
```js
(() => {
  const element = document.getElementById('scroll-action');
  const observer = new IntersectionObserver((entries) => {
    for (const e of entries) {
      if (e.isIntersecting) {
        // 画面内の時の処理
        element.classList.add("-action");
      } else {
        // 画面外の処理
        element.classList.remove("-action");
      }
    }
  });
  observer.observe(element);
})();
```
上のコードは`scroll-action`コンテンツが画面内に入ると`-action`クラスを追加、画面外で削除してアニメーションを起こしています。似たもので`addEventListener()`メソッドの`"scroll"`イベントがありますが、あちらはスクロールするたびに処理が走るので、こっちのほうが、パフォーマンスがいいです。
#### 参考
https://sbfl.net/blog/2017/07/04/javascript-intersection-observer/

https://www.webcreatorbox.com/tech/intersection-observer
ログ出力集（Laravel）

## 初めに
Laravelのログ出力の方法をまとめました。

## 環境
| 開発環境   |バージョン    |
|-----------|------------|
| __Laravel__ | 10 |

## ログ出力
```php:
// 基本的なログ出力
Log::debug('debug log', ['data' => $data]);

Log::info('data' => $data);

Log::error('data' => $data);

Log::debug(json_encode($json_data));

Log::debug(($json_data));

// try catchとの複合
try {
   
} catch (\Exception $e) {
    Log::error($e->getMessage(), ['exception' => $e]);
}

// オブジェクトをログに出力する場合、オブジェクトをシリアライズしてログに記録する
// シリアライズ：オブジェクトやデータ構造を変換すること
Log::info(serialize($object));

// クロージャー（無名関数）を使用したログ出力
// 条件分岐などの処理ができる
Log::debug(function() use ($data) {
    return 'Debug data: ' . json_encode($data);
});
```

## 最後に
最後まで閲覧いただきありがとうございました。
ご意見、ご指摘ありましたら、コメントお願いいたします。
【TailwindCSS】tailwind.config.jsでカスタムスタイルを作成する方法【VSCode】

## はじめに

VSCodeでCSSファイルに以下のようにカスタムスタイルを作成しても補完されません。

```css
@tailwind base;
@tailwind components;
@tailwind utilities;

@layer utilities {
  .pb-safe {
    padding-bottom: env(safe-area-inset-bottom)
  }
}

```

## 補完されるようにする方法

補完されるようにするにはCSSファイルではなく、プラグインシステムを使用してカスタムスタイルをプロジェクトに追加します。

```js:tailwind.config.js
/** @type {import('tailwindcss').Config} */

const plugin = require('tailwindcss/plugin')

module.exports = {
  // ...
  plugins: [
    plugin(function ({ addUtilities }) {
      addUtilities({
        '.pb-safe': {
          'padding-bottom': 'env(safe-area-inset-bottom)',
        },
      })
    }),
  ],
}
```

以下のように入力時に補完されるようになります。

![スクリーンショット 2023-07-01 0.00.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/71168b54-55f1-cf4a-588a-e67e7ed54e41.png)

## 参考
https://github.com/tailwindlabs/tailwindcss-intellisense/issues/227

https://tailwindcss.com/docs/adding-custom-styles#writing-plugins

https://tailwindcss.com/docs/plugins
【数式】Salesforceの選択リストの計算

Salesforceの数式で個人的によく使うもののメモです。

# 選択リスト型のあれこれ

## 選択リストの値を取得する
選択リストの値を取得するにはTEXT関数を使います。
```
TEXT( 選択リスト型 )
```
このとき、取得する値は選択リスト値のAPI参照名になります。

## 選択リストの特定の値であることを確認する
選択リストの値が特定の値であることを確認するにはISPICKVAL関数を使います。
```
ISPICKVAL( 選択リスト型 , "選択リスト値のAPI参照名" )
```
これは、TEXT関数で書き換えることもできます。
```
TEXT( 選択リスト型 ) = "選択リスト値のAPI参照名"
```

## 選択リストの値によって計算を変更する
選択リストの値によって計算が変わる場合、CASE関数を使います。
```
CASE( TEXT( 選択リスト型 ) ,
  "選択リスト値のAPI参照名 - 1" , 処理1 ,
  "選択リスト値のAPI参照名 - 2" , 処理2 ,
  "選択リスト値のAPI参照名 - 3" , 処理3 ,
  ... , ... ,
  "選択リスト値のAPI参照名 - n" , 処理n ,
  処理
)
```
選択リストの値の一部の値が条件となる場合はIF関数の方が簡潔になる場合があります。
```
IF( ISPICKVAL( 選択リスト型 , "選択リスト値のAPI参照名" ) , 真の場合の処理 , 偽の場合の処理 )
```

# 複数選択リスト型のあれこれ

## 複数選択リストの特定の値が選択されていることを確認する
複数選択リストの特定の値が選択されていることを確認するには、INCLUDES関数を使います。
```
INCLUDES( 複数選択リスト型 , "選択リスト値のAPI参照名" )
```

## 複数選択リストの選択されている値の数を計算する
複数選択リストの選択されている値の数はPICKLISTCOUNT関数で計算できます。
```
PICKLISTCOUNT( 複数選択リスト型 )
```
Unityでキーストアを作れなかった件

# Unityのキー生成問題

Unityを使用してアプリを開発し、Google Playに提出する際には署名キーが必要です。
あとは提出するだけだ！！
.......

自分はなぜか詰まっちゃったので皆さんに共有したいと思います！
後述する条件に当てはまっていると上手く動かないみたいですね
すこしでも皆さんの助けになれば！！

:::note warn
初投稿で間違いがあるかもしれません。
間違いなどを見つけた方がいらっしゃればDMまで連絡をお願いします！！
:::

## 環境
- Windows 11 Home 22H2
- Unity 2022.3.1f1
- Unity保存場所 E:\DevelopTool

## 問題の詳細

キーを**作るタイミング**で以下のエラーが出る。読み込もうとしたタイミングで出るものではないです！

CommandInvokationFailure: Unable to create keystore. Please make sure the location of the kystore is valid. 

キーストアの場所が無効と言われているのにファイルの生成されている。なのに **0KB** :cold_sweat:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288957/3df46126-abcc-1004-d933-41c8035fcded.png)

## 解決方法

### ①使用できない文字列が含まれている

**これらの文字列がパスワードに含まれていると動きません！！！**

- `“`
- `‘`
- `$`



### 使用可能な文字列

一方、以下の文字は問題なくキーの生成に使用できます。
抜けている記号があれば申し訳ない！

- `!`
- `\`
- `^`
- `(`
- `#`
- `%`
- `&`
- `)`
- `~`
- `@`
- `|`
- `*`
- `[`
- `]`
- `;`
- `:`
- `+`
- `<`
- `>`
- `{`
- `}`
- `?`

### ②ダメな記号を含んだパスワードを入力した後に新しいパスワードを入力し直した

自分は有効なはずのパスワードを再度入力しても同じエラーが出てしまいました...
無効な記号を入力してしまったら、キーのファイルを削除して新しく作り直しましょう！
なぜキーが生成されないのかは全く分からないです！ごめんなさい！

## その他注意事項

GoogleDocumentに保存したパスワードをコピペしたら動かなかったことがありました。
でもメモ帳に一回貼り付けてコピーすると正しくキーの追加が行えました。
ただし確証が得られないので補足として！
研究を進めてまいります。🙇‍♀

## さいごに

こんな学生が書いたQiitaを見ていただきありがとうございました！
少しでも皆さんの助けになれば嬉しいです！
よければフォローを！

https://twitter.com/Takkesan_Game
EXPLAINを理解する〜type編〜

# 背景
先日、「EXPLAINコマンドのどこを見るか、どう判断するか」といった質問に答えることができず
悔しい思いをしたので調べて記事にしてみようと思いました...

いっぱい項目あったのでまずはtype編。
と言っても全部やるかはわからないです ~~（わからないんかい）~~


# typeで確認できること
|type|意味|
|-|-|
|const|join以外でPKやユニークキーを使う場合。最速|
|eq_ref|joinのときにPKやユニークキーを使う場合。joinのときはこの値になれば最速。constの次に速い|
|ref|インデックスを使った検索。eq_refの次に速い|
|range|インデックスを使った範囲検索。refの次に速い|
|index|フルインデックススキャン。インデックスをALL検索するためこれも重い|
|ALL|フルスキャン。一番重い|

ふむふむ。
インデックスを使っていればそれでいいというわけでもないようです。

かといって全て最速にすべきなのか？となるので、
まずは最低限避けるべきポイントをおさえたいと思います。

# チェックすべきポイント
以上のtypeの中であまり良くないとされているものは２つあり、
あった場合は要改善のようです。

## typeの`ALL`と`index`
`ALL`はインデックスを利用せず、テーブルのフルスキャンが実行されているため一番遅い。

`index`は`ALL`と違いインデックスこそ使われているが、
該当インデックスをフルスキャンする必要があるためこれも遅い処理となる。

この２つが表示されていたら、
改善できないかSQLを見直してみましょう。

# 最後に
気になったのでいくつか適当に実務で使っているSQLのEXPLAINを実行してみると、
見事にindexになっていました。。改善しなきゃ。。

EXPLAINもっとちゃんと使ってパフォーマンスへの意識をしっかりつけようと思いました。

めざせ、パフォーマンスの鬼・・・！

# 参考
https://nishinatoshiharu.com/explain_overview/

https://qiita.com/mtanabe/items/33a80bf2749a872645e6

https://zenn.dev/osshy/articles/62c52692b4bc04
wiresharkを用いたパケットキャプチャ Server Helloの中身

## Server Helloに含まれる情報


## TLSのVersion情報
client Helloから提示されたTLSVerでどれを使うのか回答
TLS 1.2

## ciphersuite
client Helloから提示された暗号化方式でどれを使うのか回答
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 

## ハッシュアルゴリズム
client Helloから提示された暗号化方式でどれを使うのか回答
rsa_pss_rsae_sha256
react-router-domで"Cannot destructure property 'basename' of ~ as it is null."というエラーが出る

# 発生したエラー
react-router-domのLinkを使おうとしたら、
以下のようなエラーが出ました。

```text
Cannot destructure property 'basename' of 'react__WEBPACK_IMPORTED_MODULE_0__.useContext(...)' as it is null.
TypeError: Cannot destructure property 'basename' of 'react__WEBPACK_IMPORTED_MODULE_0__.useContext(...)' as it is null.
```

# 解決策
React Routerによるルーティングの設定が行えるようにするには、
`BrowserRouter`で`App`を囲む必要があったようです。

```tsx
import { BrowserRouter } from 'react-router-dom'

render(
  <BrowserRouter>
    <App />
  </BrowserRouter>
)
```

# 注意
`BrowserRouter`は、Reactプロジェクトの中で一度しか使えません、
また、React Routerは`BrowserRouter`の中でしか使えないため気をつけましょう。

# 参考
https://reactrouter.com/en/main/router-components/browser-router

https://stackoverflow.com/questions/75728532/uncaught-typeerror-cannot-destructure-property-basename-of-react2-usecontext
クラウド認証認可とセキュリティインシデント対応の準備─AWS認定SCS-C02資格試験合格体験記

先日、AWS認定 __[AWS Certified Security - Specialty](https://aws.amazon.com/jp/certification/certified-security-specialty/?ch=sec&sec=rmg&d=1)__（高度なネットワーキング - 専門知識）資格試験に合格しました。その折の学習方法をまとめておきます。後学の方の参考になれば幸いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/b6719055-3b31-48c7-35b8-967e71b738d8.png)

# 前提

* 受験した試験バージョンは __SCS-C02__。2023年7月リリースの新バージョン。バージョンが変わらずとも出題内容は徐々に変わっているようなので、あまり意味がないかなと思いつつも一応。
* 受験時点で __五冠達成済み__（SAA、DVA、SOA、SAP、DOP）。これらの資格試験は参考書やEラーニング教材の揃いが比較的よく、そこで学んだこと（とくにSAP）がANSにも活かせる部分が多々ある。このため __五冠達成ののちに受験することをオススメ__。
* 私自身は実務でAWSの管理コンソールやCLIを利用する機会がほとんどなく、これまでの経験を全部足し合わせてもおそらく8時間に満たない。他のAWS資格同様、出題範囲は広範に及ぶから、 __「実務経験があること」を武器にすることも、「実務経験がないこと」を受験しないことの言い訳にすることもできない__（もちろん、所属する組織やプロジェクトによっても事情が異なると思いますが）。

# 学習方法

受験準備期間は1ヶ月ほど。

1. 参考書 __『[要点整理から攻略する「AWS認定 セキュリティ-専門知識」』](https://amzn.asia/d/8UANcOb)__ を通読。練習問題は端折り。
2. AWS公式のEラーニングサービス、AWS Skill Builderのコース __"Deep Dive with Security: AWS Identity and Access Management (IAM) (Japanese) (VO) "__ コースを修了。
3. Udemyのコースとして提供されている模擬試験問題集 __"AWS Certified Security Specialty Practice Exams SCS-C02 2023"__ を修了。二周。 ※機械翻訳 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/1b1365ae-e64e-c18c-e22a-33a91f14f3f2.png) 
4. 少しだけ時間的余裕があったので、Udemyのコースとして提供されている試験対策講座 __"AWS Certified Security Specialty Course SCS-C02 [NEW 2023]"__ を30％くらいまで進めた。※英語字幕を __Microsoft　Edgeの機能で__ 機械翻訳 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/a3c60905-fcee-b169-b56b-693a3b27a180.png) 

3.で二周目に安定して80％の正答率を得られるようになった状態、かつ、4.の受講途中の状態であったが、ここで予定日を迎えて受験することになり、810数点。
まあなんとか合格。。

# 所感

実際受けてみての所感。

* AWSスキルビルダーのコース「Deep Dive〜」のおかげで今まで理解のあやふやだった部分がだいぶクリアーになり、受験準備への効果が大きかった。IAMを中核とするAWSの認証認可の仕組みや、IAMポリシーとその他のポリシーの関係性を、体系的に押さえられた。
* 一方で NitroシステムやGuardDuty、そしてSecurityHubについての理解はまだまだ不足していた印象。今後改めて学びを深めたいところ。未完了のUdemyのコース（前述の4.）もきちんと修了したい。
* 参考書については「要点整理」とあるほどには要点整理されていない印象で、さりとて他に選択肢がない以上はやはりありがたい存在で・・・といった感じ。
* 試験の難易度は SAPより易しい印象。求められる知識幅広さや設問と選択肢の文章量の問題（いずれもSAPが上）。前述の通り、五冠達成後に受験することをオススメ。
wiresharkを用いたパケットキャプチャ client Helloの中身

## TLS通信を開始する前に
まずは
クライアント側からClientHelloメッセージをサーバに送信する。

その中身を細かく見ていきます。

## Cipher suites
ここにクライアント側が利用できる暗号化方式をサーバ側に送信している
例えば
TLS_AES_256_GCM_SHA384 (0x1302)
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)

## TLSバージョン情報
supported_versions (len=7)
という項目で
TLSの利用可能バージョンを送っている。
クライアント側はTLS1.3を送っている。
Windows11はTLS1.3利用可能ってことね。。

## 利用できるハッシュ情報
signature_algorithms (len=18)
ここでハッシュ値を送っている。
ecdsa_secp256r1_sha256 (0x0403)

## その他　マスターシークレット情報
extended_master_secret (len=0)
Developer Sandbox for Red Hat OpenShiftで簡単にFlask

# 概要

ブラウザさえあれば開発ができる時代です。
Developer Sandbox for Red Hat OpenShiftで簡単にFlaskを動かしてみます。


# 事前準備
- Red Hatのアカウント
- GitHubのアカウント（任意）

# Hello Worldまで

- [developer-sandbox](https://developers.redhat.com/developer-sandbox)から`Start your sandbox for free`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/f56c78b8-eaeb-a317-c5ba-a9da1fac37e5.png)

- `+追加`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/edc6dbb7-146c-cea2-bab1-2eee4d0b00d6.png)

- `すべてのサンプルを表示`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/ec0a6f48-5f4b-4ac5-b7ba-da25b034ee14.png)

- `Basic Python（Python 3.9.x application with Flask）`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/3d26af41-fc24-8180-6c01-8e563c2e54e8.png)

- `作成済み`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/272eab01-f330-0f6f-56ca-495357b91cd0.png)


- ☑のアイコンが表示されたら`URLを開く`のアイコンをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/0a084923-1f0a-c8ff-08af-6bd234af39f6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/67445f9d-8ad0-34ee-2508-7c44fff80e3f.png)

- 専用に払い出されたURLでWebアプリケーションが実行される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/ebd1eb6c-cb77-fd3f-fbb1-ed06a9141305.png)

# ソースを編集

- `ソースコードの編集`アイコンをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/69686ffb-a09f-e889-abc6-c56ef1c95b9f.png)

- GitHubとの認証`Authorize redhat-developer`をクリック

※連携するとGitHubの自分のレポジトリへpush,pullが簡単になります。（しなくてもよいです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/bdec6318-9e24-3ec2-4f71-0cb5e0493238.png)

- オンラインのVSCodeが開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/8ac16ae7-035a-e1e9-cd80-0fad7377e0e3.png)

- Python Extentionsをインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/c1276826-31ee-a9be-cb8c-391ad60553a5.png)

- 編集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/97fe7b55-62b2-1595-44bd-2e377b443f48.png)


- `Terminal - New Terminal`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/1a4dcbcb-e356-5ac3-5e07-70c0d1e21661.png)

- Flaskのインストール＆起動

```bash
devfile-sample-python-basic (main) $ python3.9 -m venv venv
devfile-sample-python-basic (main) $ source venv/bin/activate
(venv) devfile-sample-python-basic (main) $ pip install -r requirements.txt 
(venv) devfile-sample-python-basic (main) $ python3.9 app.py 
```

- `Open in New Tab`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/04e3f0fa-288e-a0bd-0ae2-a9d9826f0165.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/5de82c63-d28b-485c-e3bc-f0fb663b3e89.png)

GitHubの空レポジトリを作って`git remote`すればそのままpushできる。