OmniAICreator/Qiita-1.07M huggingface dataset:
Node.js の fs の代わりに Bun.file でファイル読み書きをやってみる

## はじめに
Bun で始めたプロジェクトで、これまではテキストファイルの読み書きに [fs](https://nodejs.org/api/fs.html) (File system) を使っていたのですが、せっかくなので Bun が用意している方法でファイルの読み書きをやってみます。

## 方法
`Bun.file(path)` でファイルを読み込み、 `file.text()` でファイルをテキストとして読み出します。
`Bun.write(path, text)` でファイルに文字列を書き込みます。

## 環境
Bun v1.1.3

### ファイル構成 (抜粋)
```
|--ango_sakura.txt
|--index.ts
|--node_modules
|--package.json
|--tsconfig.json
```

```text:ango_sakura.txt
　彼は女の顔の上の花びらをとってやろうとしました。彼の手が女の顔にとどこうとした時に、何か変ったことが起ったように思われました。すると、彼の手の下には降りつもった花びらばかりで、女の姿は掻き消えてただ幾つかの花びらになっていました。そして、その花びらを掻き分けようとした彼の手も彼の身体も延した時にはもはや消えていました。あとに花びらと、冷めたい虚空がはりつめているばかりでした。
```

## コード例
### 例0: `fs` でテキストファイルを読み書きする
```ts:index.ts
import fs from 'fs';

// ファイル読み込み
const text = fs.readFileSync('ango_sakura.txt', 'utf8');

// はじめの1文を出力
console.log(text.substring(0, text.indexOf('。') + 1));

// 句点(。)のあとに改行を挿入
const split_text = text.replace(/。([^\n])/g, `。\n$1`)

// ファイル書き込み
fs.writeFileSync('ango_sakura_inserted_line_feeds.txt', split_text);
```

**実行結果**
```
　彼は女の顔の上の花びらをとってやろうとしました。
```
```text:ango_sakura_inserted_line_feeds.txt
　彼は女の顔の上の花びらをとってやろうとしました。
彼の手が女の顔にとどこうとした時に、何か変ったことが起ったように思われました。
すると、彼の手の下には降りつもった花びらばかりで、女の姿は掻き消えてただ幾つかの花びらになっていました。
そして、その花びらを掻き分けようとした彼の手も彼の身体も延した時にはもはや消えていました。
あとに花びらと、冷めたい虚空がはりつめているばかりでした。
```

---
### 例1: `Bun.file()`, `file.text()` でテキストファイルを読み込む
```ts:index.ts
// Bun.file(path) でファイル読み込み
const file = Bun.file('ango_sakura.txt');

// text() メソッドでファイルをStringにする
const text = await file.text();

console.log(text.substring(0, text.indexOf('。') + 1));
```

**実行結果**
```
　彼は女の顔の上の花びらをとってやろうとしました。
```

---
### 例2: `Bun.write()` でテキストをファイルに書き込む
```ts:index.ts
const file = Bun.file('ango_sakura.txt');

const text = await file.text();

console.log(text.substring(0, text.indexOf('。') + 1));

const split_text = text.replace(/。([^\n])/g, `。\n$1`)

// Bun.write(path, text) でテキストをファイルに書き込む
Bun.write('ango_sakura_inserted_line_feeds.txt', split_text);
```
```text:ango_sakura_inserted_line_feeds.txt
　彼は女の顔の上の花びらをとってやろうとしました。
彼の手が女の顔にとどこうとした時に、何か変ったことが起ったように思われました。
すると、彼の手の下には降りつもった花びらばかりで、女の姿は掻き消えてただ幾つかの花びらになっていました。
そして、その花びらを掻き分けようとした彼の手も彼の身体も延した時にはもはや消えていました。
あとに花びらと、冷めたい虚空がはりつめているばかりでした。
```

## 雑感
特段使い勝手がいい！などということはありませんが、デフォルトで使えるし使いたければ使ってもいいのかなという感じです。

Bun にはファイル読み書きだけでなく、アプリケーションを構築する上でよく使う様々なユーティリティが用意されているので、積極的に使っていきたいと思いました。
今回はストリームでの読み書きはやっていませんが、今やっているプロジェクトでTSVファイルをストリームで読み込んでJSONにする、ということをやっているので、次はBunのストリームも触ってみたいです。
viによる文字列の検索

# 概要
viコマンドで該当する箇所を割り出して編集する方法がわからず教えてもらったので記事にする。

# 教わったこと
viでファイルを指定する(指定されたファイルはあくまでも例です)。

```
vi /var/log/dmesg
```
その後以下のように「/kernel」を入力することで、「kernel」の箇所を指定できる。
また「Enter」を押して「n」を押すことで、一つ次の文字列を検索する。

```
(省略)
--------------------------

[    0.648822] kernel: pinctrl core: initialized pinctrl subsystem

[    0.649940] kernel: PM: RTC time: 05:36:23, date: 2024-05-19

[    0.650971] kernel: NET: Registered PF_NETLINK/PF_ROUTE protocol family

[    0.651181] kernel: DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations

[    0.653884] kernel: DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations

/kernel
```

# まとめ
viで編集する際に、対象の文字列に移動する必要が業務条あるので、その際は「/文字列」で該当する文字列に移動できると知れた。
また、一つ次に移動するためには「n」を使うことで、移動ができる。
→最初は「Enter」で移動できるものだと思ってた。

# 参考文献
以下を参考にして学習しました。
ありがとうございます。
[Linux標準教科書](https://linuc.org/textbooks/linux/)
AWS Elastic IPをアカウント間で転送する方法のメモ

## 概要

下記記事を参考に自分もElastic IPをAWSアカウントをまたいで転送してみたので体験記をメモ的に残す。

https://dev.classmethod.jp/articles/amazon-virtual-private-cloud-vpc-transfer-elastic-ip-addresses-between-aws-accounts/

## 必要な情報

転送する前に下記の情報を先に確認、メモしておく必要がある。

- 転送先のアカウントID（4桁-4桁-4桁）
- 転送対象のElastic IPのIPアドレス

## 方法

1. 転送元のAWSアカウントにログインし、Elastic IPの画面にアクセス
1. 転送対象のElastic IPを選択
1. 「アクション」をクリック
1. 「転送を有効化」をクリック
1. 「転送アカウント ID」に転送先のアカウントIDをハイフンなしで入力
1. 転送先のアカウントでAWSにログインし、Elastic IPの画面にアクセス
1. 何も選択せず「アクション」をクリック
1. 「転送を承諾」をクリック
1. 「アドレス」に転送を行ったElastic IPのIPアドレスを入力して「送信」をクリック

以上

ちなみに、転送が行われると転送元からはIPが消え、転送先に本当に移動する。（当たり前っちゃ当たり前）

## Elastic IPの取得数上限を上げたい方

上記の方法を行って転送先でIPアドレスを受け取ろうとしたときに、上限にあたって受け取れない場合がある。
Elastic IPはデフォルトで5個までしかIPアドレスを保有できない。
下記の方法でこの上限を上げることができる。

https://qiita.com/miriwo/items/ad23293c359b8d8afc82
【OCI Autonomous DB】ピアリージョンへのバックアップデータ転送と各種可用性ソリューション比較

## 1.	はじめに

　2024年2月より、クロス・リージョンDR（AuDG/バックアップ・ベース）のオプションとして、自動バックアップのピア・リージョン（スタンバイ）へのレプリケーションが選択できるようになりました。この機能により、スイッチ・オーバー/フェイル・オーバーを実行した後も直近最大7日間の範囲でバックアップの利用が可能になります。
　また、上記の可用性オプションを加えたAutonomous Databaseで構成可能な各種可用性ソリューションについて整理しています。


## 2. クロス・リージョンDRのピア・リージョンへの自動バックアップのレプリケーション

　クロス・リージョンDRのピア・リージョンへの自動バックアップのレプリケーションの概要と留意点については以下になります。

　•	クロス・リージョンDR（AuDG/バックアップ・ベース）のオプションとして選択可能
　•	最大7日間の自動バックアップがレプリケートされる
　•	レプリケートされたバックアップ・サイズの2倍のバックアップ・ストレージの追加コストが発生する
　•	ピア・リージョン（スタンバイ）でレプリケートされた自動バックアップからのクローン作成は可
　•	レプリケーションの有効化/無効化の切り替えは可

レプリケートされたバックアップ・サイズの2倍のバックアップ・ストレージの追加コストが発生しますので留意が必要ですが、一方で有事の際にリモートリージョン側で過去データの復旧が必要となるケースには有用なソリューションになるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2592805/3a0bd7d2-f93c-4c36-1d83-c3fa14e13192.png)



## 3. 可用性構成の基本的な考え方

　まず、可用性構成を検討する際の基本的な考え方として、システムに求められる可用性要件(RPO/RTO, コストなど)によって採用するソリューションの選択が変わってくると思います。
 　障害発生時にどの時点までデータを戻したいのか(RPO)、障害発生からシステムが稼働までの時間をどの程度に設定するか(RTO)によって必要となる対策コストも変わってきます。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2592805/85be002b-308c-0985-0c10-352e9f502262.png)
　
 また、システムをどのような障害から保護したいかによっても必要となる可用性ソリューションが変わってきます。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2592805/fe223c75-ef9f-6202-16d9-c2473cf86417.png)

## 3. Autonomous Database 可用性構成の整理

　上述の可用性の取り方についての考慮点を踏まえてAutonomous Databaseにおける可用性ソリューションについて整理しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2592805/c9ee81d3-6008-f479-1667-97981fc13bf7.png)

## 4. まとめ

　Autonomous DatabaseにクロスリージョンDRのオプションとして新たに自動バックアップのピア・リージョン（スタンバイ）へのレプリケーションがオプションとして選択できるようになっています。
　また、可用性・データ保護対策として、RPO/RTO、コスト、想定される障害等を考慮して可用性ソリューションを準備することが重要になるかと思いますが、その際の対策検討時に上記各種可用性ソリューションの比較情報が参考になれば幸いです。
Railsのメソッド間で情報を受け渡ししたい

## やりたいこと
メソッド間で認証情報を受け渡ししたい。

`pass_authentication`メソッドで作った認証情報を`convert`メソッドに渡したい。

![スクリーンショット 2024-05-20 午後7.42.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547640/8391dc37-5226-5828-676a-6fd64ed972fe.png)


## 問題
![スクリーンショット 2024-05-20 午後7.41.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547640/3bcc6e92-da75-b726-2548-e193710425a3.png)
受け渡しができておらず中身がない(nil)と言われる。

![スクリーンショット 2024-05-20 午後8.21.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547640/5d679eac-935f-e4f1-faf7-a8c6950c4b55.png)
`pass_authentication`メソッドの中で`redirect to`で遷移させているのに遷移されない。
ページを移動せずにそのまま次の`convert`メソッドが実行され、そこでエラーになっている。
認証ページに遷移して認証情報が取得できていないのでエラーになっている。

```ruby
def index
  pass_authentication
  convert(@drive)
end

def pass_authentication
  if request.params['code'] == nil # 認証コードを持っていなかった場合
    auth_uri = auth_client.authorization_uri.to_s
    redirect_to auth_uri, allow_other_host: true
  else
    # 省略
  end
end
```

## 解決法

```ruby
def index
  pass_authentication
  return if performed?
  convert(@drive)
end
```
`performed?`メソッドは、すでに`redirect to`や`render`が呼び出されたかどうかを返す。

> perfomed?メソッドは、すでにそのアクション内でrenderかredirectがされたかを確認するメソッドです
[現場から学ぶ、RailsのControllerアンチパターン](https://qiita.com/yuyasat/items/49e3296f3c64fccc7811#fn6)

今回は`pass_authentication`メソッドの中で`redirect to`を呼び出しているので、`true`を返し、そこで処理が終了し、`convert`メソッドは実行されない。

`convert`メソッドを実行しないので、`pass_authentication`メソッドにとどまったままになり、時間をかけてでも`redirect to`が実行されるまで待つことになる。

### なぜperformed?を使うのか？
`performed?`メソッドを使わなくても以下のように実行されるのではないかと思った。

1. `pass_authentication`メソッドが呼び出される
2. `redirect to`が実行される
3. ページが遷移する
4. 認証が行われて元のページに戻る
5. `convert`メソッドが実行される 

ChatGPTに聞いたところ、2のところで`redirect to`と書いたから(メソッドを呼び出したから)と言ってすぐに実行されるわけではなく、続けてその次の処理が行われることもあるという。

なぜかというと、`redirect to`メソッドは処理を中断するものではないから。明示的に中断する処理を書かないと続く。

また、`redirect to`が実行されたあとでまた別の`redirect to`を実行しようとすると、`AbstractController::DoubleRenderError`というエラーになるらしい。

今回の場合でいうと、2で認証ページに遷移させたあと、認証ページから戻ってくることになっているから、2回リダイレクトしていることになるのかも。

というわけで、まとめると以下2つが理由だ。
- 確実に次の処理が行われないようにするため
- 二重リダイレクトエラーを防ぐため

## ドキュメント
https://apidock.com/rails/ActionController/Metal/performed%3f
macOS blueray

https://paso-digi.com/mac-blu-ray/

ダウンロードして起動した。
AACSのエラーが出た

https://vlc-bluray.whoknowsmy.name

ダウンロードして

```macOS:bash
mv libaacs.dylib /usr/local/lib
```

VLCを再起動してドライブをドラッグアンドドロップした。

![スクリーンショット 2024-05-20 21.08.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/39fe0332-d100-c947-1b2d-8affa860c0c9.png)

今ここ。
Google Colabでstreamlitを動かす方法

## 本日のお悩み
Google Colabでstreamlitアプリを動かしたい

## 本日の処方箋
`ngrok`を使用してurlを取得して動かす

### 以下手順を記載

* ngrokのアカウントを作成し設定する

  * ngrokへアクセスしgithub経由でアカウントを作成しAuthtokenを取得
  * ngrokのHPは[こちら](https://ngrok.com/)
    ngrokで、接続するために必要な「Authtoken」を設定。
以下のコードの、
!ngrok authtoken YourAuthtoken
における
YourAuthtokenの箇所を、自分のAuthtokenに置き換える。

  * ```sh
    !ngrok authtoken YourAuthtoken
    ```
<br>

* アプリの起動

  + streamlitのrunコマンドでアプリを起動
  + ```sh
    # (&>dev/null&)で出力を表示させず、バックグラウンドで実行する
    !streamlit run app.py &>/dev/null&
    ```
<br>

* URLの取得

  * ```py
    from pyngrok import ngrok

    # プロセスの終了
    ngrok.kill()
    # 接続
    url = ngrok.connect("8501").public_url
    ```
  * ngrokのプロセスを終了した上で、新たにポートを指定して接続。接続するとurlを取得。(httpが帰ってくるため後ほどの下記の関数でhttpsに変換)
ngrokの無料プランだと同時に１つのプロセスしか動かせないため、接続によるエラーが発生した場合は`ランタイム`→`セッションの管理`で不要なColabのプロセスを終了させる。
<br>

* 動作確認

  * urlのhttpの部分をhttpsに変換する関数
  * ```py
    def convert_http_to_https(url):
        # urlの先頭がhttpだったらhttpsに変更
        if url.startswith("http://"):
            # 1は置換する回数(1を指定することで、元のURL内で最初に見つかった "http://" の部分だけを "https://" に置き換え、他の "http://" は変更されない。)
            url = url.replace("http://", "https://", 1) 
        return url
    ```
<br>

* 最後に変換したurlを確認し、動作を確認する

  * ```py
    print(convert_http_to_https(url))
    ```
Ubuntuの入ったディスクをimgでバックアップする方法

Ubuntu入りのディスクをimgファイルとして他ドライブにバックアップする方法を説明していきます

## 用意するもの
・バックアップするディスク
・UbuntuのLiveUSB

## 1. UbuntuのLive環境を起動
まず、UbuntuのLiveUSBをPCに挿して、USBからブートしましょう
そして、「Ubuntuを試す」をクリックしましょう

## 2. Ubuntuディスクのimgファイルを作成
UbuntuのLive環境が起動できたら、
「ディスク」を開いてください
そしたら、左のディスク一覧から、バックアップするディスクを見つけて選択してください
右上にある「ドライブのオプション」を押して「ディスクイメージを作成」を選択します
すると、下記の画像のようになるので、名前や保存先フォルダーを決めて、
「作成開始(S)」をクリックして、作成を開始します。

:::note warn
保存先ディスクには転送元ディスクの容量以上の空き領域があることを確認してください
:::


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691296/53a8c8ae-4e40-3670-c21c-90bada9168ce.png)

数十分〜1時間ほど時間がかかるので,気長に待ちます

#### バックアップは終わりました お疲れ様でした
PythonでGithubのリポジトリの特定のディレクトリ直下にあるファイルを全て取得してローカルに保存する

ファイルを取ってくる時は `https://github.com/~`じゃなくて`https://raw.githubusercontent.com/~`なんですね。

URLが分かれば直打ちで取ってくることはできたけど、`ディレクトリ内のファイルをリストで取得する`という点に苦戦してネット調べてみたら [`PyGithub`](https://github.com/PyGithub/PyGithub) という便利なOSSがすでにありました。

# お試し一式
コードや試し方はこちらをご参照ください。

https://github.com/yagrush/python-get-filelist-from-github
UiPathで表抽出、繰り返しの出力を理解する


# UiPathのインストールについて
https://qiita.com/tantanshio/items/533371b905f3d74d33ca




# やろうとしていること


オルフェーヴルの競走成績（https://db.netkeiba.com/horse/2008102636/）
を取得し、必要な項目の内容を出力させる。

今回、書き込み先は用意せず
メッセージボックスに表示させる形で代用する。

![002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/2540ac17-f866-fcea-0ad7-730d761ad702.jpeg)




# ロボット作成


#### ①WEBサイト用意する
![002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/2540ac17-f866-fcea-0ad7-730d761ad702.jpeg)


#### ②取得対象を設定する

・表抽出を選択
![追加説明001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/627ef6d7-79cf-39b8-82b2-e06c91e21eb0.jpeg)

・抽出するデータを選択　を選択
![追加説明002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/47a27562-c21b-6ecd-5020-f522a56e2110.jpeg)

・取得したい表のタイトル部分を選択
![追加説明003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/5df9b462-2027-f766-822e-2aa5381e60bb.jpeg)

・はい　を選択

![追加説明004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/9c818d8c-b439-ffe6-e9ef-6457eb6eb433.jpeg)




・表データが生成されるので
「保存して閉じる」を選択

![追加説明005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/747bd6a3-6360-f782-4f7a-a0ddafac2f9a.jpeg)


![追加説明006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/8c20db76-ac94-1895-976d-fe2bfa3d22a2.jpeg)

#### ③データテーブルから繰り返しデータを出力

・データテーブルの各行を用意
![追加説明007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/a48d3fa5-6402-56c1-41d6-ca7828f16bd6.jpeg)

・使用する変数　データテーブルを設定

![追加説明008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/8e0b8357-c420-0a88-e3b9-c08be369ea82.jpeg)

・メッセージボックスを用意

![追加説明009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/a6f6c3f5-9071-6e75-64b6-238149742204.jpeg)

・出力させる情報を設定
（ここではレース名を出力するよう設定）

![追加説明010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/cf45e786-8739-1b4b-1540-be7af59facd3.jpeg)

・デバッグ実行
→1行目の「有馬記念」が出力される
メッセージOK選択し、デバッグ実行を続け2行目以降のレース名が表示されれば完了。
![追加説明011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/49cce98c-cb7c-37df-59d3-55d552ee4222.jpeg)

# 追記コメント

表抽出で対象を選択する際に
表を全選択するような設定にすると
取得内容が表形式データにならないため注意が必要

![追加説明012.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523511/1cfdf512-f094-783c-d12b-48f4d4b74dc7.jpeg)
雑魚のための爆速フォーム開発：Postn+ChatGPT+GitHub Pages

# はじめに

アンケートフォームやユーザーからの入稿物が欲しいな，と思って，GoogleFormやMicrosoftFormsを使ったことはありませんか？
そしてGoogleFormを使っていて，<b>デザインが思うように作れなくてもやっとした経験がある</b>のは僕だけではないはず．．．

とはいえ！
とはいえですね，バックエンドの仕組みをすぐさま構築できるかというとそうではなく！
そのあたりをカバーしているのがこれらのサービスなんですよねー

GoogleForm使っているとGoogleDriveにデータもファイルもアップロードされるから便利なんですよね．．．
~~まさに雑魚のためのサービス~~

ですが！どうやら[Postn](https://postn.me/)というサービスでそこをカバーしてくれるらしい，のでそれを使って爆速でフォームを作ってみました．
（フォームのマークアップからバックエンドの準備までしてくれるようです）

作成したフォームは[こちら](https://akh1r0ck.github.io/bakusoku_form/
)！
![スクリーンショット 2024-05-20 19.49.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165289/0c93b2b9-f445-1601-0af0-fa69031f120c.png)

じゃっかんスタイルが崩れていますが，トータル10分くらいなので気にしない．
あとでChatGPTに直してもらったらいいので．

## 手順

1. Postnでフォームのバックエンドの準備＆フォーム部分のソースコードの作成する
1. ChatGPTでスタイリングする
1. GitHubPagesでホスティング・フォームを公開する

## やってみる

### Postn

まずは登録から

Googleアカウントで登録できます．Googleさまさまです．
![スクリーンショット 2024-05-20 18.53.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165289/a392afdf-d049-f663-4e7b-d9acaa159426.png)

そしたら，ワークスペースの作成→フォームの作成という順番で進めていきます．
ワークスペースの作成は名前入れるだけです！
よしなに進めましょう！

続いて，フォームの作成です．
色々と入れるところがあるのですが~~わからないので~~爆速狙っているのでフォーム名は爆速フォーム，IDはbakusokuにしてみました．

![スクリーンショット 2024-05-20 18.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165289/bd63eb5a-340f-38dc-58d6-94de3933f950.png)


そしたらフォーム編集画面に移動して，コピーしてきます．
動画にまとめました．（あとでアップします）．

### ChatGPT

プロンプトも適当です．爆速目指しています．
フォームのマークアップの部分にPostnで生成されたマークアップをコピペします．

```
モダンなフォームの画面を作って欲しい
メインカラー：#090E3F
サブカラー：#F6F6FA
フォームのマークアップだけはある

[フォームのマークアップ]
```

爆速で書いてくれます．ありがとうGPT-4o

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165289/bf6e980e-43c7-c76f-09c6-a3e65d06c353.gif)

### GitHub Pages


適当にリポジトリを作成します．
~~ローカルに環境構築するのが面倒なので~~爆速目指しているのでwebから編集しちゃいます．
`Add file` → `Create new file`で適当に`index.html`を作り，ChatGPTからコピペして貼ります．

続いて，`Settings`→`General/Code and automation/Pages`で`Branch`から`main`を選択して`Save`します．

こんな感じです．
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165289/d5a00706-e49d-84c4-1eef-9e5bf537d88b.gif)

そしたらあとは公開されるのを待つだけです．

## 使ってみた

この内容で送ってみました．
![スクリーンショット 2024-05-20 19.32.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165289/94097111-0624-2b12-9f63-1dd2ce8db669.png)


受信した内容は受信箱から確認できます．

![スクリーンショット 2024-05-20 19.06.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165289/dcf549eb-4354-e821-4943-fb973ed9e3e7.png)

画像もバッチリですね．クリックするとダウンロードされます．


# おわりに

爆速でできました．
CSSの調整はChatGPTと対話するとして，自由にフォームが作れるのはありがたいですね．

GitHubのコミットみてみたのですが，開始時にリポジトリ作ったので，差分をみてやると9分で完了したことになりますね．
操作動画やスクショを撮っていたので，RTAしたらもっと速くなりそうですw

しれっとAPIが公開されていますが，APIも私も叩かずに生暖かい目で見守ってくださいませ．．．
【超個人用忘備録】ac_libraryのModInt

## つまりは
rustだとこんな感じで9982...とか以外でもModIntを超簡単に導入できるよ

```
use ac_library::ModInt as Mint;

fn main() {
    Mint::set_modulus(101);
    let mut hoge = Mint::new(99);
}

```

## 最後に
ac_library最高！
Qiitaで「編集履歴から前のバージョンへ戻す」手動でやってみた。

**手動を使わずに、おすすめのdffツールがあれば教えて下さい。**
データを省略。編集履歴でお願いします。

Qiita様に「編集履歴」機能があるだけでも、助かりました。
ありがとうございました。

# 私の障害
**間違って、全選択で書き換え保存てしまった。みたいです。**

# 参考
https://help.qiita.com/ja/articles/qiita-edit#part-d10d07bab9311260
A Formula that Brings Success in Engineering Studies.

Beginning your education in engineering colleges takes more than just academic ability. It also requires a strategic approach and a dedication to excellence. With the proper formula, you can navigate the complexity of engineering education. Let's look at the essential components of this formula and how you can utilize it effectively to see better results.

Solid Foundation: Much like a building needs a solid foundation, doing well in tamilnadu engineering colleges starts with understanding the basics. Take time to understand the essential concepts in maths, physics, and other core topics. These ideas serve as the foundation for more advanced topics and applications.

Hands-On Learning: Engineering is about doing things, not just studying ideas. Make sure to combine what you learn in class with hands-on experience, such as lab work and project work.

Time Management: Managing Academics, Lab Work, Project work, and extracurricular activities may be difficult. Effective Time Management strategies are essential for being organized and productive. Make a schedule for all your tasks, and to enhance efficiency, prioritize activities based on importance.

Use Resources: Use all of the resources available to best college in villupuram students. That includes textbooks, e-resources, research papers, guides, and learning with your classmates. Remember, if you are stuck, don't hesitate to ask for help from teachers, mentors or tutoring programs. It's smart to ask for help when you need it—it shows you are strong, not weak.

Get Feedback: Feedback is vital for growth and improvement. Actively seek feedback from teachers, classmates, and professors. Use it to determine what you are good at and what needs improvement. Learn from mistakes and keep going to be the best.

Now we have covered tips for achieving success in villupuram engineering college studies, The next step is to choose the right college.

Choosing the ideal college is key to success in engineering studies. E.S. Engineering and Technology is a leading engineering college in Villupuram, dedicated to offering the best engineering courses in Tamilnadu.  Our college is committed to excellence and provides a complete learning environment that promotes academic advancement and practical skill development.
TypeScriptで関数のオーバーロードを理解する

## 関数のオーバーロードとは？

関数のオーバーロード（Function Overloading）とは、同じ名前の関数を異なる引数の型や数で複数定義し、呼び出し時の引数に応じて適切な関数が実行されるようにすることを指します。TypeScriptでは、オーバーロードシグネチャを使ってこれを実現します。

## 基本構文

TypeScriptでの関数のオーバーロードは、以下のように定義します：

1. **オーバーロードシグネチャ**：関数の異なるバージョンを定義します。
2. **実装シグネチャ**：実際の関数実装です。これは関数の実際のロジックを含み、オーバーロードシグネチャの条件をすべて満たす必要があります。

### 例1: 数値の合計と文字列の結合

以下の例では、引数の数や型に応じて異なる操作を行う関数を定義しています。

```typescript
// オーバーロードシグネチャ
function combine(a: number, b: number): number;
function combine(a: string, b: string): string;

// 実装シグネチャ
function combine(a: number | string, b: number | string): number | string {
    if (typeof a === "number" && typeof b === "number") {
        return a + b;
    } else if (typeof a === "string" && typeof b === "string") {
        return a + b;
    } else {
        throw new Error("Invalid arguments");
    }
}

// 使用例
console.log(combine(1, 2));            // 出力: 3
console.log(combine("hello", "world")); // 出力: "helloworld"
// console.log(combine(1, "hello"));    // エラー: Invalid arguments
```

### 例2: 配列要素の結合

次に、配列要素を結合する関数の例です。

```typescript
// オーバーロードシグネチャ
function merge(a: number[], b: number[]): number[];
function merge(a: string[], b: string[]): string[];

// 実装シグネチャ
function merge(a: number[] | string[], b: number[] | string[]): number[] | string[] {
    return a.concat(b);
}

// 使用例
console.log(merge([1, 2], [3, 4]));           // 出力: [1, 2, 3, 4]
console.log(merge(["hello"], ["world"]));     // 出力: ["hello", "world"]
```

## オーバーロードの仕組み

### 1. **オーバーロードシグネチャ**：
   - 最初に、異なる引数の型や数に応じた関数シグネチャを定義します。
   - これらのシグネチャは実装の上部に書き、関数がどのような引数で呼び出されるかを定義します。

### 2. **実装シグネチャ**：
   - 実際の関数定義はすべての可能な引数型をカバーする必要があります。
   - 実装内で引数の型チェックを行い、適切な処理を実行します。

## 注意点

### 1. **実装シグネチャはオーバーロードシグネチャと一致しないこと**：
  - 実装シグネチャは、オーバーロードシグネチャで定義されたすべての引数型を包含する必要があります。
  - 実装シグネチャの引数はユニオン型として定義することが一般的です。

###  2. **TypeScriptの型推論を利用すること**：
  - TypeScriptの型推論により、オーバーロードシグネチャを適切に定義することで、IDEやエディタでの型補完や型チェックが効果的に行われます。

## まとめ

関数のオーバーロードは、同じ名前の関数を引数の型や数に応じて異なるバージョンを提供するための機能です。これにより、コードの柔軟性と可読性が向上し、さまざまな入力に対して適切な処理を行う関数を効率的に定義できます。
featureブランチに最新のdevelopが取り込まれているかチェックする方法


# はじめに

こちらの記事では、Git コマンドを使って feature ブランチに最新の develop ブランチの変更が取り込まれているかチェックする方法を図解入りで書きます。

# 背景

関わっていたプロジェクトで CloudBuild を使った CICD を構成していました。開発フローは develop ブランチ から feature ブランチを切って開発を進めています。

そこで、staging 環境上で QA をするために、feature ブランチを指定してデプロイすることがありました。
しかし、最新の develop ブランチの内容を feature ブランチに取り込んでいないと、予期せぬ不具合が起きることがあります。
つまり、feature ブランチはデプロイする際には、最新の develop ブランチを取り込んでいる(=Update branch)必要がありました。

GitHub 上では、develop ブランチに保護ルールを設定することで、feature ブランチが最新の develop ブランチの変更を取り込んでいないと develop ブランチにマージできないように設定することはできます。しかし、ブランチ指定デプロイをする場合は、CloudBuild 内の処理でそれと同様の内容を実現する必要があります。

# 処理

以下の cloudbuild.yaml のステップを使用して、feature ブランチが最新の develop ブランチの変更を取り込んでいるかを確認します。

```yaml:cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/git'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    git remote set-url origin https://$$GITHUB_PERSONAL_ACCESS_TOKEN@github.com/organization/project.git
    git fetch --unshallow
    if [ $(git rev-parse origin/develop) != $(git merge-base origin/$BRANCH_NAME origin/develop) ]; then
      echo "最新のdevelopがブランチに取り込まれていません。Update branchしてください。"
      exit 1
    fi
  secretEnv: ['GITHUB_PERSONAL_ACCESS_TOKEN']
  dir: '$_REPO_NAME'
```

それぞれのコードの説明です。
まずは、リモートリポジトリの URL を設定します。認証には個人アクセストークンを使用しています。
`git remote set-url origin https://$$GITHUB_PERSONAL_ACCESS_TOKEN@github.com/organization/project.git`

次に、リポジトリの履歴を全て取得します。
`git fetch --unshallow`

時間がかかる場合は、以下のように履歴の長さを指定することもできます。
`git fetch --depth=100`
筆者が関わったプロジェクトでは、`--unshallow`では 30s、`--depth=100`で 10s くらいの処理時間がかかっていました。

リモートリポジトリの develop ブランチの最新コミットハッシュを取得します。
`git rev-parse origin/develop`

CloudBuild 実行時に指定したリモートリポジトリの $BRANCH_NAME ブランチと develop ブランチの共通の祖先のコミットハッシュを取得します。
`git merge-base origin/$BRANCH_NAME origin/develop`

この両者が一致していなければ最新の develop が feature ブランチに取り込まれていないと判断されるわけですが、図解すると以下のようになります。

一つ目は一致していないパターンです。
![不一致パターン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614347/fd22ea30-52b6-6408-16e6-72931c04b2e1.png)

develop ブランチから feature ブランチが切られ、開発が進んでいます。feature ブランチは develop の古いコミットから分岐していますね。
最新の develop ブランチのコミットが feature ブランチには取り込まれていないのでビルドを中止します。

二つ目は一致しているパターンです。
![一致パターン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614347/9dc44558-0929-31ea-9891-8a39c218b064.png)

develop ブランチから feature ブランチへのマージコミット(=Update branch)が追加されています。develop ブランチの最新コミットが feature ブランチとの分岐点となっています。
つまり、最新の develop ブランチが feature ブランチに取り込まれていることを表すのでビルドを続けます。

このような処理を追加することで、最新の develop ブランチが feature ブランチに取り込まれているかどうかを判定することができます。

# まとめ

この記事では、Git コマンドを使って最新の develop ブランチが feature ブランチに取り込まれているかどうかを判定する方法を書きました。

皆さんのお役に立てれば幸いです。
要件が細かいパスワードの生成

パスワードを生成するにあたり、以下のルールで作ってみました。

・重複したパスワードは生成禁止
・英大文字、英子文字、数字を必ず１文字使う。
・使いたくない文字は指定可能　※下記例では数字の0を使わない
・生成件数、パスワード長は指定可能

基本的には★印のところを修正していただければOKです。

```C#:Program.cs
// ・数字、小文字、大文字をランダムな位置に挿入
// ・使える文字種類は変数に指定（★印参照）
// ・生成する件数、パスワード長さ、ファイルは定数で指定（★印参照）

using System.Text;

// 使える文字種類を指定
var numbers = "123456789";  // 数字★
var lowerCaseLetters = "abcdefghijklmnopqrstuvwxyz";    // 小文字★
var upperCaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";    // 大文字★


//生成する件数★
const int CountToGeneratePassword = 400000; 

//パスワードを生成する長さを定数で表現★
const int PasswordLength = 10;

//書き込み先★
const string WriteFileFullPath = @"c:\output\passwords.txt";

//----------------ここからロジック------------------------

var random = new Random();

//ファイルストリームの生成
using var fs = new FileStream(WriteFileFullPath, FileMode.Create, FileAccess.Write);

//重複確認用に、HashSetを生成
var hashSet = new HashSet<string>();



// 指定件数の文字列を生成する
for (int i = 0; i < CountToGeneratePassword; i++)
{
    var result = new StringBuilder();
    // 長さPasswordLengthのランダムな文字列を生成

    for (int j = 0; j < PasswordLength; j++)
    {
        var allChars = numbers + lowerCaseLetters + upperCaseLetters;
        result.Append(allChars[random.Next(allChars.Length)]);
    }


    // 数字、小文字、大文字をランダムな位置に挿入
    var randomNumbers = new List<int>();
    while (randomNumbers.Count < 3)
    {
        var number = random.Next(10);
        if (!randomNumbers.Contains(number))
        {
            randomNumbers.Add(number);
        }
    }
    result[randomNumbers[0]] = numbers[random.Next(numbers.Length)];
    result[randomNumbers[1]] = lowerCaseLetters[random.Next(lowerCaseLetters.Length)];
    result[randomNumbers[2]] = upperCaseLetters[random.Next(upperCaseLetters.Length)];

    // 生成した文字列が重複していないか確認
    if (hashSet.Contains(result.ToString()))
    {
        i--;
        continue;
    }

    // 重複していない場合は、HashSetに追加
    hashSet.Add(result.ToString());

    // ファイルに書き込み
    fs.Write(Encoding.UTF8.GetBytes(result.ToString() + "\n"));
}




```
Oracle Analytics Cloud：OACインスタンスのサインインページのカスタマイズ ロゴをかえてみる

はじめに
---
Oracle Analytics Cloud (OAC) インスタンスにアクセスするとOCI Identity Domainのサインイン画面が表示されます。ロゴを変更してみます
OACは、認証にOCI Identity Domainユーザーによる認証を行いますが、そのサインインページをカスタマイズする手順についてみてみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/c945fca9-0f62-8e78-7f2b-0ec6e4361b2d.png)

元々のサインインページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/fb4223f8-5907-ee6a-8c5f-8d04d76af131.png)

記載時のOACバージョン：OAC 2024 March版

サインインページの変更
---
OACのサインイン時にはOCIのIdentity Domainに登録しているユーザーを利用します。サインページはOACインスタンスを作成したユーザー(OCIのユーザー)が属するIdentity Domainの管理画面で設定します。

OCI管理コンソールにOACインスタンスを作成したユーザー(OCIのユーザー)でログインします
メニューの"アイデンティティとセキュリティ"をクリックし、"ドメイン"をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/6184b2a8-c88f-ccce-e725-cf68861f4b91.png)

OACを作成したユーザーが属するアイデンティティドメインをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/c740733b-ad74-3eb9-7f1d-d2fa9647523c.png)

"ブランディング"をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/6199efc8-9bb0-577e-718a-3ef00ff852fd.png)

"カスタムブランディング"をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/a2bb65ea-7d63-bb06-2a05-d815f16354dd.png)

翻訳で、"英語"のところをクリックし、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/abfe4422-6b1e-dbcb-1417-127d7e41346e.png)

"日本語"に変更します
会社名、ログイン・テキストはロゴの下に表示されます。適宜変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/5a3fd478-6720-05fd-7e58-cbfa8c3997ec.png)

スクロールダウンし、会社ロゴののところの左部がロゴイメージです
右上部ある"ｘ"をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/b62afb35-2561-0e35-3497-5f9286d2e43e.png)

イメージファイルをドロップするか、選択をクリックし、PCに保存しているイメージファイル(gif、jpg,jpeg,pngのファイルで300KB以下)を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/29f082ec-25d5-3317-f14e-32360ab99a9b.png)

"変更の保存"をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/87e3256d-338f-2def-1db9-4bd6c2f2b269.png)

更新してもよいか？との確認のダイアログが表示されたら、"変更の保存"をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/d34f178d-6617-1698-9e8a-13101a78e972.png)

別のブラウザを起動して、OACの分析ページにアクセスすると、
サインインページが変更されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/8c2bf163-e2bf-c130-4eb7-fe9bc1387dd4.png)

OACは、認証にOCI Identity Domainユーザーによる認証を行いますが、そのサインインページをカスタマイズするにはIdentity Domainのブランディングで設定変更します

以上
PlantUML書き方備忘録

# はじめに
UMLを書き始めて、何が継承だとかインターフェイスだとかわからなくなったので、まとめました。

## 1. 継承
~~~ plantuml
@startuml
class A<<abstract>>{}

class B{}

B --|> A

@end uml
~~~

## 2. interface
~~~plantuml
@startuml
class A{}

interface Interface{}

A ..|> Interface
@enduml
~~~

## 3. Composition
「B is a part of A」とよく言われるものである(下図ではEngine is a part of Car)。
下図で例えると、EngineはCarを作った際に切り離すことができずに、必ずついてくるものである。
よく強い依存と言われる。
~~~plantuml
@startuml
class Car{}

class Engine{}

Car --* Engine
@enduml
~~~

## 4. Assosiation(関連)
何かしらの関係がある場合に使われる。
もう一方のクラスを呼び出す、もう一方のクラスのデータを保持する際などに使われる。
~~~plantuml
@startuml
class A{}
class B{}
class C{}
class D{}

A-- B
C --> D
@enduml
~~~

# 最後に
UML書くのが初心者なので、間違っていたら指摘していただけると幸いです。
バリデーションに引っかかった後のrender画面でJSが発火しない不具合の解消

## 問題点

Railsアプリケーションにて、Turboリンクを利用してページの一部を動的に更新する際、バリデーションに引っかかった後の画面ではJavaScriptのイベントが発火しなくなる問題が発生しました。具体的には、チェックボックスの状態変更によって発火するはずのイベントが動作しないという事象です。

## 原因

Turboリンクはページの完全な再読み込みを避け、高速なページ遷移を実現しますが、これによりページ全体が新しく読み込まれるわけではないため、従来の`DOMContentLoaded` イベントを使用したJavaScriptの初期化が適切に行われません。このため、新しく追加されたDOM要素へのイベントバインドが失われることが原因です。

## 解決方法

この問題を解決するためには、Turboリンクが提供する特定のイベントに対してリスナーを設定し、これらのイベントが発生するたびにイベントリスナーを再設定する必要があります。これにより、ページの部分的な更新後もイベントリスナーが保持され、機能が維持されます。

### 具体的な実装

以下は、`turbo:load`, `turbo:frame-load`, および `turbo:render` イベントにリスナーを設定し、それぞれのイベント発生時に必要なJavaScript機能を再初期化する方法です。

```javascript
document.addEventListener('turbo:load', setupEventListeners);
document.addEventListener('turbo:frame-load', setupEventListeners);
document.addEventListener('turbo:render', setupEventListeners);

function setupEventListeners() {
  const businessHoursTable = document.getElementById('business-hours-table');
  document.querySelectorAll('input[name="company[business_day_ids][]"][type="checkbox"]').forEach(checkbox => {
    checkbox.removeEventListener('change', updateBusinessHours);
    checkbox.addEventListener('change', updateBusinessHours);
  });

  updateBusinessHours(); // 初回読み込み時にも実行
}

function updateBusinessHours() {
  const selectedDays = Array.from(document.querySelectorAll('input[name="company[business_day_ids][]"][type="checkbox"]:checked')).map(checkbox => checkbox.value);

  fetch('/companies/update_business_hours', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').getAttribute('content')
    },
    body: JSON.stringify({ selected_days: selectedDays })
  })
  .then(response => response.text())
  .then(data => {
    businessHoursTable.innerHTML = data;
  })
  .catch(error => console.error('Error:', error));
}
```

### 注意点

- `removeEventListener` を使って既存のイベントリスナーを除去することで、イベントが重複して登録されるのを防ぎます。
- `turbo:frame-load` や `turbo:render` など、ページ更新のコンテキストに合わせたイベントを選択してください。

この方法を用いることで、Turboリンクを使用してもJavaScriptのイベントが正しく機能するようになります。
【AWS】ヘルスチェックUnhealthyの原因は、Routeの「明示的なサブネットの関連付け 」がされていないことだった...

# 概要
AWS Cloudformationでネットワーク周りからEc2サーバ、デプロイ関連まで実装しました。
しかし、TargetgroupのヘルスチェックがUnhealthyのためデプロイが失敗してしまいました。
今回はネットワーク周りのエラーだったので解説します。

# 原因と解決策
ヘルスチェックがunhealthyを返す、というのは、ターゲット（EC2）へ定期的に行うHTTP GETリクエストに対してレスポンスが帰ってこない場合やそもそもターゲットに到達しない場合に発生するエラーです。

色々な原因が考えられますが、そもそもネットワーク接続に問題がある場合にunhealthyになることがあります。
そして、UnhealthyだとCodedeployでタイムアウトエラーになったりするので後続処理に影響が出ます。

今回の原因はRouteの「明示的なサブネットの関連付け」で、サブネットを関連づけていなかったためでした。
ヘルスチェックは、ルートテーブルがサブネットと正しく関連付けられていることが大前提です。
（もっと言えばインターネットゲートウェイと繋がっているかどうかも）

詳細にいうと、「明示的なサブネットの関連付け」が行われていないと、そのサブネットはメインルートテーブル（デフォルトのルートテーブル）に関連付けられます。ただ、メインルートテーブルのルートが適切に設定されていない場合、そのサブネットからのトラフィックは適切にルーティングされない、ということです。今回はこれが原因でした。

サブネットとルートテーブルを関連付けるためには、Cloudformationで言えば`AWS::EC2::SubnetRouteTableAssociation`リソースを以下のように追加してあげればOK。

```yaml
PublicSubnet1RouteTableAssociation:
  Type: AWS::EC2::SubnetRouteTableAssociation
  Properties:
    SubnetId: !Ref PublicSubnet1
    RouteTableId: !Ref RouteTablePublic

PublicSubnet2RouteTableAssociation:
  Type: AWS::EC2::SubnetRouteTableAssociation
  Properties:
    SubnetId: !Ref PublicSubnet2
    RouteTableId: !Ref RouteTablePublic

# 他のサブネットとルートテーブルの関連付けも同様に追加
```


ということで、サブネットとルートテーブルの関連付けを自動化でき、ヘルスチェックエラーが解決できました。
pdfをページ毎に一枚ずつpng画像に変換して出力したい


小ネタだが最近よく使うのでメモ
大量のpdfファイルをホワイトボードツール（miro、Mural、FigJam）を使って全員で眺めるために画像にして貼り付けて並べたかった。
pdftoppmを使うと実現できる。

Macの場合以下のコマンドでインストールできる


```
brew install poppler
```

sugoi.pdfを一枚ずつバラして画像化する。

```
pdftoppm -png -r 300 sugoi.pdf gazou
```

-r 300 は解像度300ppmにする意味
指定しないと文字がぼやけがちなので300ppmくらいだと安心して使える
上記の例だと1枚目がgazou-001.png、2枚目がgazou-002.pngとして出力される
入れ子のモーダルはするべきではないのか？

次の課題の準備、ということでモーダルをどうしようかなといろいろ物色しているのだが、定番のBootstrap Modalってありますよね。

https://getbootstrap.jp/docs/5.0/components/modal/


そちらを調べていて驚いた。なんと、入れ子のモーダルはサポートしないというのだ。


<blockquote class="wp-block-quote"><p>Bootstrapは、一度に1つのモーダルウィンドウしかサポートしていません。ネスト(入れ子)になったモーダルはユーザーエクスペリエンスが低いと考えられるためサポートされていません。</p></blockquote>

ユーザーエクスペリエンスかー。まあそう言われればそういう気もするが。
うーん、ということはそういうインターフェース以外で同じ機能を実現することを考えろということか。
これまた難しい課題だが。

試しにreact-modalでやってみたところ、

https://www.npmjs.com/package/react-modal

なんとなんと、別々のモーダルであればいくつでも作れるがモーダルの中からモーダルを呼ぶと見事に消えてしまう。うーむ。

そもそもモーダルとは一体何なのか？<br>ちょっとした注意書きとか、アクセント的に使うものであり、これがインターフェースのメインになるのはおかしい気もする。

ということで街に出て本屋さんでHTML+CSSの本を片っ端から立ち読みしてみた。
・
・
・
・
・
なんと！モーダルについて解説している本は一冊もないのだ！

えー、そうなのか。そういう存在なのか、モーダルよ。
あんだけ世の中に使われているというのに。
phpでJSONを生成してjsに渡す時の注意点

jsonを生成する時に単純に

```php
$json = json_encode($str);
```

としていないだろうか。単なる数値だけならこれでよいが、例えば、

```php
$str[1] = "G'men '75";
$str[2] = '\2,800';
$str[3] = 'my name is "john"';
```

というような文字列をエンコードしてjavascriptに渡すとエラーになる。

```php
$json = json_encode($str, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS );
$json = str_replace('\\', '\\\\', $json);
```

とするのがよい。
今日の学び #1 2024-05-20

## Laravel

### `TrimgStrings`ミドルウェア
リクエストの内容(主にPOSTのbody)は、標準のMiddleware(`TrimgStrings`)内のtrim関数によってトリミングされている。
(知らなかったのが恥ずかしい…)

https://github.com/laravel/framework/blob/9.x/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php

### `TransformsRequest`

リクエスト内容を書き換えるためのクラスで、これを継承すれば多階層になっているjsonの中身も再帰的に走査できる。
`transform`メソッドだけ弄れば最小の実装で済む。
`TrimgStrings`もこれを継承している。

https://github.com/laravel/framework/blob/11.x/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php

## その他読んだ記事
https://speakerdeck.com/pictiny/is-strategic-ddd-heavy

自分がドメインエキスパートになろう
最新のAIアーキテクチャ「Mamba」は画像認識に必要なのか？初心者にもわかりやすく解説！

# はじめに
近年、人工知能（AI）の分野では、Transformerと呼ばれるアーキテクチャが自然言語処理や画像認識のタスクで大活躍しています。そんな中、新たな注目株として登場したのが、RNNライクなシーケンスモデリングを可能にする「**Mamba**」です。

# Mambaアーキテクチャとは？
Mambaの特徴は、**SSM（State Space Model）を用いた効率的な長いシーケンス処理と自己回帰的な生成**です。SSMは、時系列データをモデル化するための数学的な手法で、**状態変数と観測変数の関係性を表現**することができます。これにより、Mambaは**長いシーケンスのデータを効率的に処理することが可能**になります。
また、自己回帰的な生成とは、**過去の情報を使って未来の情報を予測する手法**のことです。つまり、Mambaは過去の入力データを使って、次の出力を生成することができるのです。この特性は、自然言語処理や音声認識など、時系列データを扱うタスクで威力を発揮します。
ただし、SSMのメモリは**情報の損失が避けられない**という弱点も存在します。これは、長いシーケンスを処理する際に、**途中の情報が欠落してしまう可能性がある**ことを意味しています。

# 画像認識タスクとMambaの相性は？
画像認識のタスクには、大きく分けて画像分類、物体検出、セグメンテーションの3つがあります。画像分類は、与えられた画像がどのクラスに属するかを判定するタスクです。一方、物体検出は画像内の物体の位置を特定し、セグメンテーションは画像内の各ピクセルがどの物体に属するかを判定します。
画像分類は、**比較的短いシーケンス（画像の部分的な情報）の理解で成り立っている**ため、長いシーケンスの処理を得意とするMambaにはあまり適していないと考えられています。しかし、物体検出やセグメンテーションは、画像全体の情報を処理する必要があるため、Mambaの**長いシーケンス処理の能力が活かせる可能性**があります。
ただし、これらのタスクは自己回帰的ではありません。つまり、画像の一部分から次の部分を予測するようなことはしないのです。そのため、Mambaの**自己回帰的な生成の特性は、これらのタスクではあまり活かせない**かもしれません。

# MambaOutモデル　〜Mambaは本当に必要？〜
この疑問に答えるために、研究者たちはMambaのコア部分であるSSMを取り除き、シンプルなGated CNNブロックのみで構築した**MambaOutモデル**を提案しました。Gated CNNは、RNNの一種で、**ゲート機構を用いて情報の流れを制御するアーキテクチャ**です。
MambaOutモデルは、Occam's razor（オッカムの剃刀）に基づくベースラインモデルです。Occam's razorとは、「**複数の説明が可能な場合、最もシンプルな説明を選ぶべき**」という考え方のことです。つまり、MambaOutは、Mambaの複雑な機構を取り除いた、よりシンプルなモデルということになります。
実験の結果、画像分類では**MambaOutがMambaモデルを上回る性能**を示しました。これは、**画像分類においては、Mambaの複雑な機構が必ずしも必要ではないことを示唆**しています。一方、**物体検出とセグメンテーションでは、MambaOutはMambaモデルには及ばない**結果となりました。このことから、これらのタスクにおいては、Mambaの長いシーケンス処理の能力が活かせる可能性が示唆されます。

# まとめ　〜Mambaは画像認識の未来を変えるか？〜
以上の研究結果から、**画像分類にはMambaは必ずしも必要ではありませんが、物体検出とセグメンテーションでは可能性を秘めている**と言えそうです。また、MambaOutのようなシンプルなモデルが、画像分類においてはMambaを上回る性能を示したことは、**Occam's razorの考え方の重要性を再確認させる結果**となりました。
今後は、MambaOutをベースラインとして、さらに高度なMambaモデルが開発されていくことが期待されます。そして、この研究で得られた知見は、Mambaアーキテクチャと画像認識分野全体の発展に大きく寄与するでしょう。AIの世界は日進月歩で進化していますが、こうした**基礎研究の積み重ねが、より高度で実用的なAI技術の実現につながっていく**のです。画像認識における次世代アーキテクチャとしてのMambaの可能性に、今後も注目が集まるかもしれません。

# ※ 備考（用語の説明）
**Transformer**：自然言語処理や画像認識で大活躍中のAIアーキテクチャ。単語や画像の部分同士の関係性を捉えるのが得意。
**RNN（Recurrent Neural Network）**：時系列データを扱うのに長けたAIアーキテクチャ。過去の情報を記憶しながら処理を進める。
**SSM（State Space Model）**：時系列データをモデル化するための数学的な手法。状態変数と観測変数の関係性を表現する。
**Gated CNN**：RNNの一種で、ゲート機構を用いて情報の流れを制御するアーキテクチャ。
**Occam's razor（オッカムの剃刀）**：複数の説明が可能な場合、最もシンプルな説明を選ぶべきという考え方。

# 参考
https://arxiv.org/abs/2405.07992v2
Lookerのダッシュボードを日次メールで配信した際の実機の挙動

## はじめに
こんにちは。2024年5月時点の挙動です。
共有フォルダに作成したダッシュボードのスケジュール配信を設定します。<br>
## 設定場所
ダッシュボードの右側にある3点リーダーを押下すると「配信をスケジュール」を選択できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/389d7f1e-192e-40c9-773e-28aad6be5dc7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/db96a432-b350-4744-b29d-430e6363116f.png)<br>

## 
## 設定項目
スケジュール名
繰り返し
時間
宛先
フォーマット
フィルタ
詳細オプション<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/c9b6cb09-66ea-104a-c776-d4444783acd7.png)
## 

**スケジュール名**　：　メール配信時のタイトルになる。デフォルトはオブジェクト名。
**繰り返し**　：　隔月1日にレポート配信なども可能。今回は毎日で設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/41ba2b5a-f302-0356-97d7-2f01dd933d00.png)
**時間**　：10分刻みで選択肢が用意されているが、無理やり入力すれば1分単位で指定出来た。（動確した結果、その時間に挙動した。）今回は14:30で設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/25e447e6-2312-5826-9c59-4a8fa7b44d66.png)
**宛先**　：　今回はメールアドレスを指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/e7ed0e08-3816-dc90-6600-04cc436612de.png)
**フォーマット**　：　今回はPDFを指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/ea38c130-a0c1-81ae-de6a-7daca5d40225.png)
**フィルタ**　：　今回は指定しない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/809ccda5-0edf-6ed4-fcff-69d330f7f318.png)

**詳細オプション**　：今回はカスタムメッセージあり、リンクを含めるで設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/0d697bc4-0837-c08f-6e85-6f54ed589405.png)

保存

## 配信結果
デフォルトのメーラーのメール送信元のメールアドレスから配信が届く。
noreply@lookermail.com

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/fbe970f9-4206-8e63-c315-2fa18c2100e8.png)
金・土・日で試した結果、大体ジャストか1分ほどずれてメールが配信。
ここら辺はLooker Studioと挙動が似ている感じがする。（Looker Studioと似ている場合、データの更新に時間がかかったりした日は15分ほど遅延して届く可能性もある。）<br>
英語、日本語、改行なども指定通り配信された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632589/8f3619f1-ce67-c67e-9061-e395d01ebc08.png)


## 参考
https://cloud.google.com/looker/docs/outbound-port-requirements?hl=ja
https://cloud.google.com/looker/docs/startup-options?hl=ja
AWS Specialty Security合格まで

# はじめに
私はAWSを使い始めて今年で約2年半になります。
文系出身の元新卒エンジニアです（笑）
新卒からの2年間で、Cloud Practitioner, SysOps,DVA,SAAを取得してきました。
今回は初めてspecialtyに挑戦し合格したので、その記録を残そうと思います。

# SCSとは
AWS Certified Security - Specialty(SCS)とは
>AWS クラウドにおけるセキュリティソリューションの作成と実装に関する知識を認定します。この認定では、専門的なデータ分類と AWS のデータ保護メカニズム、データ暗号化方法とそれらを実装するための AWS メカニズム、および安全なインターネットプロトコルとそれらを実装するための AWS メカニズムについての理解も検証されます。

セキュリティに関しての専門知識が問われます。
受験料は300 USDです。（最近値上げしましたね。。。）
時間は170 分で、65問出題されます。
テストセンターや、自宅で受験することができます。

# 勉強方法
私は毎回とにかく問題を解きまくるスタイルです（笑）
最初に参考本であらかたサービスの概要を理解し、後はひたすら問題を解きます。
今回は、全部で440問くらい解き、その中の間違った問題をもう1週しました！
問題には傾向があるので、解けば解くほど、このサービスとこのサービスはセットだ。
この問題が出たら答えはこれだというのがわかってくると思います。
私はずっと[Cloud Licence](https://techstock.jp/)にお世話になっていますが、怪しいという方もいるので、使う教材についてはご自身で精査されるのが良いと思います。

# 問題傾向
セキュリティはとにかく、出題されるサービスの範囲が狭いです。
なので、勉強はしやすいと思います。
特に、ポリシーの書き方（JSON）が多く出題されたイメージでした。
ここをしっかり押さえてポリシーを読めるようになっておくのがポイントだと思います。
後は、SSL証明書の話しや、KMSでの暗号化について多く問われたイメージでした。

## 合格
今回は正直GWを挟んでいったこともあり、満足に勉強できた実感がなかったですが、807点で合格することができました。
問題を解いているときも、アソシエイトのなによりもよく解けたと思いながら退出しました。
やはり日々の業務でのAWS使用が身についてきたのでしょうか、それともアソシエイトを勉強した知識が蓄積されていたのでしょうか。
どちらにせよ結構嬉しかったです（笑）

# 最後に
初めて今回スペシャリティを受けましたが、問題数がかなり多くなっていて、集中力が切れそうでした（笑）
スペシャリティの中では1番取りやすいと聞くので、是非Specialty Securityを受ける際は参考にしていただけると嬉しいです！
[ReviewAI 使用例] TEJI TOKYO [新大久保 韓国料理店]


# はじめに

レビュー分析AIサービスの ReviewAI (レビューアイ) を開発しています。
本記事ではレビュー分析の例として、新大久保の韓国料理の人気店を取り上げていきます！
[人気店の記事をまとめているページはこちらです。](https://qiita.com/RetegyLink/items/3d94852bf25a724a82cc)

今回は、TEJI TOKYO の食べログに集まっているレビューを分析します。

## TEJI TOKYO

TEJI TOKYO
> 日本のエリート豚が集結!!話題の韓国料理

[食べログ](https://tabelog.com/tokyo/A1304/A130401/13019553/)

## ReviewAI (レビューアイ)

弊社 RetegyLink が開発中のレビュー分析 AI です。
https://reviewai.next-seed.work/
試作版を公開中で、現在は
- [食べログ](https://tabelog.com/)
- [じゃらん](https://www.jalan.net/)
のレビューを分析できます。

# レビュー分析

さっそくですが、こちらが分析結果です！
チヂミ・肉・キムチ・サムギョプサル・豚・ブランド と
美味しそうな単語が勢ぞろいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/d91dddd1-d617-e543-b7d8-b03aaa4ebb40.png)



## チヂミ

<font color=steelblue>**良い評価**</font>

- ちなみに、個人的に、サムギョプサルよりも感動したのが、明太チーズチヂミ！
- おススメの海鮮チヂミにしました。
- にんにくサムギョプサル、明太子クリームチヂミ、ともに凄く美味しく頂きました。

## 肉

<font color=steelblue>**良い評価**</font>

- なかなか手間が掛かりますが、お肉は全てお店の方が焼き上げてくれるので、良いお肉が最高の形で提供されます。
- お肉を焼いてくれるのも嬉しいですね。
- ◎お肉はお店の方がどんどん焼いてくれるのも嬉しいところ。

## キムチ

<font color=steelblue>**良い評価**</font>

- また、お肉頼めば焼きキムチはよく補充してくれるので、キムチが大好きな方にとても嬉しいかも。
- 最後のデザートはお肉とキムチを堪能した口と胃袋をさらに包み込み幸せをくれます！
- トマトのキムチが美味しくて最高！

## サムギョプサル

<font color=steelblue>**良い評価**</font>

- おしゃれでキレイなお店なので、デートでも良いですが、ざわざわしているので大人数でサムギョプサルを食べまくるのも楽しいですね！
- また、サムギョプサルはちゃんとスタッフの方が焼きに来てくれるのでとても助かりました！
- 店員さんがサムギョプサルの肉を焼きながら、ベストな火加減でサーブしてくれますし、焼きながらの会話も楽しめます。


## 豚

<font color=steelblue>**良い評価**</font>

- 豚についての解説もしっかりしてくれて楽しい。
- 色々食べましたがここのイベリコ豚のサムギョプサルがすごく好きです。
- 個人的にこの豚の脂は最強だと思ってます。


## ブランド

<font color=steelblue>**良い評価**</font>

- 国産のブランド豚のサムギョプサルは最高です。
- 東新宿にありますは世界のブランド豚をサムギョプサルで堪能することのできる韓国料理屋さん。
- 国産にこだわっているので安心ですし、何よりこだわりのブランド豚たちが本当に美味しいので、おススメです！


## ReviewAI の改善点

1つの文で両面の評価をしていると、感情分析の評価が難しいという問題が発覚しました。
今後の改善点ですね。

<font color=steelblue>**良い評価**</font>

- 結構なんでもうまい特にチヂミはマジうまただ、店内の下水臭が。。。
- お肉は、最高ですが、店員の動きに難有り。


<font color=chocolate>**黄色・橙色の評価**</font>

- サムギョプサルは、安定の美味しさでしたが、サイドメニューの味のレベルが、一部、落ちていました。
- タッカンマリがなかったのが残念だったがサムギョプサルは絶品。


# おわりに

ブランド豚のサムギョプサルを楽しめるお店のようですね！

観点ごとの詳細を確認されたい方は、ぜひサイトにアクセスして確認してください！
レビュー分析AI の [ReviewAI](https://reviewai.next-seed.work/) は試作版を公開中です。
今回分析した TEJI TOKYO の URL はこちらです。
```
https://tabelog.com/tokyo/A1304/A130401/13019553/
```

今後どんどん使いやすくしていく予定ですので、
ぜひ皆様の ReviewAI に関するご意見を[アンケート](https://docs.google.com/forms/d/e/1FAIpQLSc-yVTDeqqMc9GqM93BvzaYWCB6wyToesYj_wl8bhwKgw8LqQ/viewform?usp=sf_link)で教えてくださると幸いです。
Microsoft Build 2024 シアトル現地参加 レポート ～イベント概要編～

# はじめに
今回5/21-23で開催されるMicrosoft Buildに現地参加させていただく機会をいただきましたので、その恩義に報いるべくQiitaを始めて体験した内容をアウトプットしてみます。
情報発信が得意なタイプではないので拙い文章ですがご参考になれば幸いです。

# この記事のサマリ
・Microsoft BuildはMicrosoftによる技術発表会・展示会のようなもの
・今回の目玉はAIとCopilotおよびそれを支えるクラウド技術と予想される

# Microsoft Buildとは
Microsoft BuildはMicrosoft主催の年次開発者会議という名目で開催される大規模なイベントです。
オンラインと現地のハイブリッドで開催され主要な内容は両方で配信されつつ、Labと呼ばれるハンズオンデモや小規模なセッションは現地のみで実施されます。20224年は3日間トータルで300以上のセッションが予定されています。
イベントホームページ
https://build.microsoft.com/en-US/home


# キーノート
今回のMicrosoft Buildのメインテーマとして最も注力している内容がキーノートに記載されます。今回のキーノートは2つ、以下に紹介します。(※内容は機械翻訳で一部修正しています)

### Microsoft Build 開会基調講演

Satya Nadella氏（会長兼CEO）、Kevin Scott氏（最高技術責任者兼 AI 担当副社長）、Rajesh Jha氏（エクスペリエンス + デバイス担当エグゼクティブ バイス プレジデント）が登壇します。AI・開発者の働き方・生産性向上というキーワードが出現していますが、概要については特に記載がありません。
せっかくなので最新のGPT-4oに予想してもらいました。具体的にはAzure AI Service、GitHub Copilot等のプロダクトがそれにあたるように思われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795074/da107ce1-2e0c-5979-9d84-a17a24521feb.png)
(公式HP：[Microsoft Build opening keynote](https://build.microsoft.com/en-US/sessions/b49feb31-afcd-4217-a538-d3ca1d171198?source=sessions))

### Microsoft Cloud による開発者向けの次世代 AI
登壇者は、Scott Guthrie氏（クラウド+AI担当エグゼクティブバイスプレジデント）を筆頭としたAI・Business Application・Cloud Platformに関する開発者・マネージャーが登壇します。
同じくGPT-4oの予想は以下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795074/6e1d90c1-8dab-d45f-6de8-a5eb69e84bc4.png)

(公式HP：[Next Generation AI for Developers with the Microsoft Cloud](https://build.microsoft.com/en-US/sessions/226c764e-ab30-4ec3-b8ce-53eb230dcfe0?source=sessions))

# 有志による日本語セッション
シアトル現地時間のためリアルタイム参加は難しい方も、後日に有志による日本語での解説セッションがありますので最低限気になる分野をチェックするのが良いかと思います。
https://connpass.com/search/?q=Microsoft+Build+2024&start_from=2024%2F05%2F18&start_to=2024%2F11%2F18

# 最後に
Microsoft Build は日本時間で5/22(水)午前1時より開始となります。
Build内容をはじめとした最新技術と世界の開発者の雰囲気をリアルに感じて、随時発信していきたいと思います。
CPUの性能

# コンテキストスイッチ
```論理CPU上で動作するプロセスが切り替わる```こと
...
コンテキストスイッチは、プロセスがいかなるコードを実行中であろうとも、```タイムスライスが切れると容赦なく発生```します。

### 出典資料要約
ソースコードを書いて先にfoo()、直後にbar()という関数があるとする。foo()の後にタイムスライスが切れるとbar()は後回しになる。
つまりbar（）の処理完了に時間がかかった場合、bar()自身の問題だけでなくタイムスライスが切れて他のプロセスの処理をしているから時間がかかるという可能性がある。

# ターンアラウンドタイムとスループットを見てみよう
システムを運用するにあたっては、システムに定められた```性能要件を守る必要```があります。
...
* ターンアラウンドタイム: システムに処理を依頼してから```個々の処理が終わるまでの時間```
* スループット: ```単位時間当たりに処理を終えらえる数```

### ターンアラウンドタイム（timeコマンドのrealの平均値
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968738/33069653-310d-684c-5583-441b242f8dc3.png)

#### 気づき
プロセス数が多くなると平均ターンアラウンドタイムが増加している
### スループット（プロセス数/realの値）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968738/49709151-5ed7-f5d5-89fe-d89e97c4b200.png)

#### 気づき
プロセス数が多くなってもスループットが変わらない

### 結論
その後さらにプロセス数を増やしていくと、スケジューラが発生させる```コンテキストスイッチが平均ターンアラウンドタイムを次第に長くするとともに、スループットを下げていきます```。性能の観点で言えばCPUリソースを使って切っている状態でプロセスを増やせばいいというものではないのです。

### ターンアラウンドタイム（webシステムについて）
論理CPUの負荷が高い状況でこのような処理を新たに到着すると、平均ターンアラウンドタイムがどんどん長くなっていきます。それはユーザから見ると、Webアプリケーションのレスポンス時間に直結するため、ユーザ体験が損なわれてしまします。```応答性能重視のシステムは、スループット重視のシステムよりも、システムを構成する各マシンのCPU使用率を低めに抑える```必要があります。

#### 気づき
osとアプリケーションでCPUの使用率は大きく関係しているだなと改めて感じる

# 論理CPUの数を調べる
```
root@*********:************# grep -c processor /proc/cpuinfo 
1
```
### 気づき
一個だけ
なんで今CPUの数を知るのか？

### 複数のCPU、複数のプロセスのターンアラウンドタイム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968738/5f414f95-0362-61a3-42b3-c1daff8e9cf6.png)

#### 気づき
ターンアラウンドが少し変わった
### 複数のCPU、複数のプロセスのスループット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968738/ef3bf0b3-26d2-7b4a-b229-eedfce43267c.png)
#### 気づき
スループットが少し変わった
論理CPUが一個しかないからかな
参考書では4コアなので多分大きな変化があるのだと思う。

### 結論
論理CPUをたくさん積んでいるマシンがあったとしても、そこに十分な数のプロセスを実行させてはじめてスループットは向上する。
無闇にプロセス数を増やしてもスループットは向上しない

# 出典
https://gihyo.jp/book/2022/978-4-297-13148-7

# 感想
CPU数が多くてもスループットには限界がある。
プロセス数とCPU数が釣り合っているとスループットも良い
ターンアラウンドタイムは短くする工夫が必要だ
コンテキストスイッチで変わるんだな
JAVA アクセス修飾子

## JAVA アクセス修飾子テーブル



| アクセス修飾子 | クラス内 | 同一パッケージ内 | サブクラス | その他のパッケージ |
| -------------- | -------- | ---------------- | ---------- | ------------------ |
| public         | 〇       | 〇               | 〇         | 〇                 |
| protected      | 〇       | 〇               | 〇         | ×                 |
| (なし)         | 〇       | 〇               | ×          | ×                 |
| private        | 〇       | ×               | ×          | ×                 |


## アクセス修飾子補足

- public:
どこからでもアクセス可能です。
- protected:
クラス内、同一パッケージ内、およびサブクラスからアクセス可能です。他のパッケージからはアクセスできません。
 - (なし)（デフォルトアクセス）:
クラス内および同一パッケージ内からのみアクセス可能です。
 - private:
同じクラス内からのみアクセス可能です。他のクラスやパッケージからはアクセスできません。


## 参考

https://www.baeldung.com/java-access-modifiers
VSCでAmazonQやCodeWhispererを利用する方法

## はじめに
従来、VSC(Visual Studio Code)で、AmazonQやAWS CodeWhispererを使用するためにはAWS Toolkitを導入する必要がありました。最近では、これらの機能はAWS Toolkitから分離した形で提供されるように変わっていますので、備忘録的に変更内容を纏めてみました。

## VSCでの拡張機能セットアップ
### 従来の導入方法
従来は、AWS Toolkitという名前の拡張機能に含まれていたので、こちらをVSCにインストールする必要がありました。当時の導入手順等は下記の記事に書いています。

https://qiita.com/duelist2020jp/items/090a98e5fa17fa96e319

:::note info
あくまでも導入方法が変わっているだけで、AmazonQやCodeWhispererそのものは変わっていません。
:::

### 現在の導入方法
最近では、下記画面に見られるように「AmazonQ」という名前の拡張機能をインストールしてあげる必要があります。

![q2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/51c528f3-f4dc-82bf-286c-ab6d064f7113.jpeg)

AWS Toolkitには、AmazonQやCodeWhispererは含まれなくなっていますで、ご注意ください。(下記図の赤枠参照)
![q1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/121b07c2-41b5-6e89-035a-fa00c1a238dd.jpeg)

機能の設定等を行う場合には、下記画面右下の「AmazonQ」(赤枠箇所)をクリックすれば、画面真ん中にメニューが表示されますので、そこから対応可能です。(緑枠箇所)

![q3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/3e793896-c037-9286-c4bc-6187cc85c308.jpeg)

## さいごに
本記事では、VSCでAmazonQやCodeWhispererを利用するための最新のセットアップ手順をご紹介しました。「AmazonQ」という独立した拡張機能という形で提供されるように変わったということで、今後ますます利用頻度の高いAWSサービスとなっていくものと思われます。