OmniAICreator/Qiita-1.07M huggingface dataset:
Differences parameter types in C++


```C++
main:  cptr = getContact();
    Contact* getContact() {
		Contact* cptr = new Contact;
		cout << "Name: ";
		cin >> cptr->m_name;
		cout << "Last name: ";
		cin >> cptr->m_lastname;
		cout << "Phone number: ";
		cin >> cptr->m_phoneNumber;

		return cptr;
    }

   main: display(*cptr);
   void display(const Contact& cptr) {
	   cout << cptr.m_name << " " << cptr.m_lastname << ", +" << cptr.m_phoneNumber << endl;
    }

	main: deallocate(cptr);
    void deallocate(Contact* cptr) {
		delete cptr;
	}

	main: setEmpty(*cptr);
    void setEmpty(Contact& cptr) {
		cptr.m_name[0] = '\0';
		cptr.m_lastname[0] = '\0';
		cptr.m_phoneNumber = 0;
	}

}
```

Set is..
Passed parameter: receive as
            * cptr | Contact& cptr
            cptr   | Contact* cptr
            * cptr | const Contact& cptr
            NULL   | Contact* functionName()

## what is the differences??

Contact& cptr:

Type: Reference to a Contact object.
Usage: This allows you to pass a Contact object to a function without copying it. Any changes made to cptr inside the function **will affect the original Contact object.**
>Example: void setEmpty(Contact& cptr)
***
const Contact& cptr:

Type: Reference to a constant Contact object.
Usage: This allows you to pass a Contact object to a function without copying it, but you **cannot modify the object** through this reference. It's useful for functions that only need to read the object.
>Example: void display(const Contact& cptr)
***
Contact* cptr:

Type: Pointer to a Contact object.
Usage: This allows you to **pass the address** of a Contact object to a function. You can use the pointer to access and modify the original object. You need to use the -> operator to access members of the object.
>Example: void deallocate(Contact* cptr)

### In summary

Reference (Contact&): Passes the object by reference, allowing modifications.
Pointer (Contact*): Passes the address of the object, allowing modifications via the pointer.
Constant Reference (const Contact&): Passes the object by reference, but does not allow modifications.
jQuery.Deffered と async / await

# ■概要
[前回書いた記事](https://qiita.com/saematsu/items/41f5ab53aeaf57a3ed55)のコードを、いただいた以下コメントから改善してみる
> $.Deferred() 使うなら .then() 呼ぶよりも そのまま async / await したらいいのでは……？（ thenable なので await に対応している。

# ■async / awaitについて整理
参照①：https://ja.javascript.info/async-await
参照②：https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function
参照③：https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/await
### 〇 async/await とは
- より快適に promise を利用する特別な構文 (参照①より引用)
### 〇async
#### 私の理解
- `async function XXX { ~~ }`で、「XXX」という非同期関数を作成する（async関数）
- async関数の中で、`await` というキーワードが使える
#### 参照①②で書いたあったこと
- `async function`宣言で`AsyncFunction`オブジェクト(= 非同期関数のメソッドを提供する) を作成する。
- `{ ~~ }`の中身では、`await`が使える。
- async関数は、常にpromiseを返す(以下例の関数は①と②で同じものを返す)

※以下例は、参照①の引用
```javascript:例①：戻り値の1は、自動的にpromiseでラップされて例②と同じになる
async function f() {
  return 1;
}
```
```javascript:例②：例①を明示的に記載
async function f() {
  return Promise.resolve(1);
}
```
### 〇await
#### 私の理解
- `await`は非同期関数の中で、(返ってきた値を後続で使いたい等)結果が返ってくるまで待ちたい処理に使う
- resolveかrejectが返るまで非同期関数の処理を止め、resolveであれば値を受け取って続きの処理が進んでいき、rejectであれば例外を発生させる（try / catch）でキャッチできる
#### 参照①②③で書いたあったこと
- `await` は promise が確定しその結果を返す（履行[resolve]or拒否[reject]）まで、JavaScript を待機させる
待機させることで、promiseを返す関数があたかも同期しているかのように動作させる
- 履行[resolve]されると、履行されたプロミスの値が**await式の値**になる
- 拒否[reject]されると、await式は拒否された値で**例外発生**する
- 非同期関数内の外で `await` を使おうとした場合、構文エラーになる

# 書き換えてみる
### ★resolveとthen
- 1つのthenで3行使っているので、thenの数が増えれば増えるほど行数に影響がありそう
```javascript:書き換え前
$.Deferred().resolve(5)
  .then(function (value) { 
    return value * 2;
  })
  .then(function (value) {
    console.log(value);
  });
```
- 書き換え前に3行使っていたのが1行にできた
- `(async function() { ～ })();`は無名関数
```javascript:書き換え後
(async function() {
    const result1 = await $.Deferred().resolve(5);
    const result2 = await result1 * 2; //書き換え元に合わせて、時間のかかる処理と仮定してawait
    console.log(result2);
})();
```

### ★上記非同期関数(asynchronousMethod)の利用
※`asynchronousMethod`は、書き換え前後とも前回書いた記事と同じ内容
```javascript:書き換え前
asynchronousMethod()
  .then( 
    function (value) {console.log('成功1：' + value)}, 
    function (value) {console.log('失敗1：' + value)}
  });
```
```javascript:書き換え後
(async function() {
    try {
        const value = await asynchronousMethod();
        console.log('成功1：' + value);
    } catch (value) {
        console.log('失敗1:' + value);
    }
})();
```
Java Gold SE11合格体験談

去年7月にOracleのJava Gold SE11を受験し、合格することができたので勉強方法や試験概要について共有いていこうと思います。

受験時期：2024/7月下旬
得点率：86%

### 当時のスペック
・社会人2年目
・2024/4上旬にJava Silver SE11を取得
・現場ではJavaを使う部署にはいないので、Javaの実務経験はない(今も)

Java Goldを受験したきっかけは、単純にJavaを極めた1つの証が欲しかったからです。ただ、これを取得したからと言って全てを理解しているわけではないです。分からないこと・知らないこともまだまだあります。

### 必須アイテム
・徹底攻略Java Gold SE11問題集
・Eclipse(コード書く環境があればいい)
黒本をやり込めば、試験は必ず合格！と言っても過言ではないくらい詳しく丁寧な説明が書かれてます。
実際の試験もこの黒本の類題がかなりの割合で出題されています。
しかし、Silverと違い、出題範囲が広いことに加え知識の深さも問われるので、Silverと比較するとレベルが違う試験です。問題集のやり込みが大切です。

### 勉強方法
Goldの範囲は、新人研修の際も触れていない内容ですし、Javaの実務経験もないので最初問題集を見たときはガチ目に絶望しました。が、心配はいらないです。分からなくてきついのは最初の1か月くらいです。毎日やれば徐々にコツをつかんできます。毎日やることが大切です。

①：1章から解き解説を丁寧に読む。コードを書きながら。(模擬試験は除く)
②：また、1章から解く。(模擬試験は除く)
③：2週目で間違えた問題を解く。解説を読み丁寧に理解する。(模擬試験を除く)
④：模擬試験
⑤：模擬試験解きなおし
これ以降は、模擬試験に限らずすべての章を何回も解きます。
答えを覚えてしまっているかもしれませんが、問題ないです。なぜ正解か説明できればいいです。

### 勉強期間
2024/4～2024/7の約4か月

### 学習スケジュール
【平日】3時間半以上
朝：90分
昼：50分
夜：90分

【休日】6時間くらい
午前：3時間
午後：3時間
休日は遊ぶこともあったので、毎週この量はこなしてません。
平日は残業もなかったので、この量をこなしました。

### 試験について
試験範囲は広いですが、絶対に理解しておくべきなのは次の3つの単元です。
・ラムダ式
・関数型インターフェース
・Stream API
この3つができれば合格といってもいいくらい出題割合が超高いです。体感ですが7～8割くらいです。
その他の単元については、2,3問ずつ出てたような体感です。
とりあえず、上記の3つはしっかりと抑えておいたほうがいいです。
自分の試験ではアサーションは出てこなかったです。

### 最後に
この記事が少しでもJava Goldの受験を考えている方の助けになればいいなと思います。
次は、Javaの知識や実装例に関する記事を書いていこうと思います！
［ServiceNow］UI Action(sys_ui_action)を使用する

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

# UI Actions
- UI Action とは、ServiceNowのインターフェース上でユーザーが実行できるボタンやリンク、コンテキストメニューのアクションを定義する仕組み
- UIアクションはクライアント側で実行される
- 例
    - ボタンを作成して、押下時のアクションを設定

# 使い方
### 「解決」ボタンを追加する
- やりたいこと
    - Incidentフォーム画面で、Resolveボタンを作成し、そのボタンを押下するとStateがReslvedに更新される
- Before
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/fd1ed72f-27ce-d52f-1c79-d4dedd9e89b3.png)

1.UIアクションの作成
- ナビゲーターで「UI Actions」を検索し、新規作成
- 以下の情報を入力：
    - Name: 解決 (Resolve)
    - Table: Incident
    - Action name: resolve_incident
    - Form button: チェックを入れる（ボタンとして表示）
    - Condition: current.state != 'Resolved'
（「解決済み」ではない場合のみボタンを表示する）※下の図に記載
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/532b7e9e-3718-9b52-5d32-1a692d2759d7.png)

2.サーバーサイドスクリプトを記述
以下のスクリプトを記述します：
```
current.state = 'Resolved'; // 状態を「解決済み」に変更
current.update();           // レコードを保存
```
3.保存
- Submitボタンを押下
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/a92dddf1-0a55-9971-00be-a8e2763ed657.png)


4.フォームでの動作を確認
- Resolveボタンが追加されている
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/0236f9e8-c93a-d239-36e0-fb6ca4074bd8.png)

- Resolveボタンを押下すると、StateがResolvedに変更される
- ![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/ed382fcb-9e36-1d95-bf59-dd466a2c3d76.png)


# 参考
https://mekeblog.com/servicenow-csa-scripting/#index_id3
個人的な備忘録：初めて知ったMakefileについて、手を動かしながら記事としてアウトプットしてみた

## はじめに

今回は、`Makefile` について教えていただいた内容を実際に手を動かして試してみた結果を、備忘録としてまとめています。

内容自体はなんとなく理解していたつもりでしたが、実際に試してみることでより深く学ぶことができると考えました。

:::note info
***さらに、「こんなことができるんだ！」と自分でも感動した部分があったため、振り返りを兼ねて記事にしてみました。***
:::

**※ほとんどが自分用の記録ですが、あらかじめご了承ください。**

## 書こうと思ったきっかけ
これは私自身の実体験ではありませんが、チーム開発の際に、GitHub上のリポジトリにREADMEを追加する話を伺ったことがきっかけです。

:::note alert
**その際、「内容が少し複雑で、全員がすぐに理解できるとは限らない」という指摘があったそうです。**
:::

そのような背景から、もっと分かりやすく実行できる仕組みを作るため、`Makefile`を活用して簡単にコマンドを実行できるようにする方法を試してみることにしました。

## Makefile とは？
Makefile は、プログラムのビルドや管理作業を自動化するための設定ファイルです。

:::note warn
***特に、複雑なコマンドや一連の作業を簡略化して実行できるようにする役割を果たします。***
:::

### 主な特徴
- タスク自動化
特定のコマンド（例: コンパイル、テスト、デプロイ）を簡略化し、効率的に実行できます。

- 簡単なコマンド実行
`make <ターゲット名>` で複雑な作業を一行で実行できます。

#### 簡単な例
以下は、Docker コンテナの起動と終了を自動化する Makefile の例です：

```makefile
up:
	docker-compose up

down:
	docker-compose down
```

- `make up` を実行すると、`docker-compose up` が実行されます。
- `make down` を実行すると、`docker-compose down` が実行されます。

## 実際にやってみた
まずは、GitHub上のチームリポジトリをローカルに `git clone` してきます。

今回は2つのリポジトリを対象とし、フロントエンドとバックエンドのリポジトリそれぞれを確認してみます。

### フロントエンドのリポジトリ
フロントエンドリポジトリには、事前にチームメンバーが設定してくれたREADMEがあり、その手順に従って作業を進めました。

#### ローカル開発構築手順

Dockerコンテナを立ち上げる：

```bash
$ make up
```

モジュールのインストール（初回またはモジュール追加時のみ）：

```bash
$ make install
```

開発用サーバーを起動：

```bash
$ make dev
```

ブラウザから確認：

`http://localhost:5173` にアクセスして、正しく表示されていることを確認します。

![Screenshot 2025-01-21 at 7.56.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/7bddf46c-eb1e-3951-93d7-6fee2c7efb1e.png)


Dockerコンテナを削除：

```bash
$ make down
```

上記手順に従い、MacBookのターミナルからMakefileで設定されたコマンドを実行して動作を確認しました。

### バックエンドのリポジトリ
次に、バックエンドのリポジトリを同様にローカルにクローンして実行しました。

#### ローカル環境構築手順

Dockerコンテナを起動：

```bash
$ make up
```

Goの開発用サーバーを起動：

```bash
$ make dev
```

ブラウザから確認：

`http://localhost:1323` にアクセスして、正しく表示されていることを確認します。

![Screenshot 2025-01-21 at 8.01.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ba7e56d9-f981-87f1-dc7c-58cba9263702.png)

Dockerコンテナを削除：

```bash
$ make down
```

フロントエンドと同様に、MacBookのターミナルからコマンドを実行し、ローカル環境で正常に動作することを確認しました。

## まとめ
ここまでお読みいただきありがとうございました。

:::note warn
**今回、Makefile を活用して簡略化された作業手順を試し、「こんな便利な方法があるのか」と感動しました。**
:::

***これをきっかけに、スムーズにMakefileや関連ファイルを記述できるよう、今後も学びを続けていきたいと思います。***
ModelにDBのカラムの内容をコメントとして書いてくれるGem「annotate」の紹介

# はじめに
モデルのカラム情報をパッと確認したいときがあると思います。
私もこのGemを知るまでは毎回クライアントツールでカラム情報を確認するか、railsコンソールなどで確認をしており、手間がかかっていました。
このGemはモデルのカラム情報をModelのmigration時にモデルファイルにコメントとして書き出してくれるGemです。

# 使い方
Gemfileに以下を記述
```ruby
gem 'annotate'
```

下記でインストール
```shell
group :development do

  gem 'annotate'
end
```

以下のコマンドを実行し、annotateの設定ファイルを作成します。
```shell
bundle exec rails g annotate:install
```
lib/tasks/auto_annotate_models.rakeが作成されました。これで設定は完了です。

# 実際に使ってみる
下記のようなモデルを作成します。
```shell
rails g Model Prefecture name:string display_order:integer
```

migrationを実行。
```shell
rails db:migrate
```
確認すると、Prefectureモデルにスキーマ情報が自動で書き出されます。

```ruby
# == Schema Information
#
# Table name: prefectures
#
#  id                    :uuid             not null, primary key
#  display_order(並び順) :integer          not null
#  name(都道府県名)      :string           not null
#  created_at            :datetime         not null
#  updated_at            :datetime         not null
#
# Indexes
#
#  index_prefectures_on_name_unique  (name) UNIQUE
#

# 都道府県を管理するモデル
class Prefecture < ApplicationRecord
end

```

# 注意点
モデルファイルにコメントを書きたい場合はannotateのコメントと自分が書くコメントに一行空行をいれる必要があるようです。入れない場合は、migration時に毎回差分が出てしまうので手間がかかるのでご注意ください。

```ruby
# == Schema Information
#
# Table name: prefectures
#
#  id                    :uuid             not null, primary key
#  display_order(並び順) :integer          not null
#  name(都道府県名)      :string           not null
#  created_at            :datetime         not null
#  updated_at            :datetime         not null
#
# Indexes
#
#  index_prefectures_on_name_unique  (name) UNIQUE
#

# 上記のようにannnotateのコメントと自分のコメントの間に空行を入れる
# 都道府県を管理するモデル
class Prefecture < ApplicationRecord
end

```
Codewars 7 kyu Flatten and sort an array

https://www.codewars.com/kata/57ee99a16c8df7b02d00045f/train/python


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/8008fa49-fccd-b73b-ef52-f7069912eaad.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/d162da07-4b23-f66d-02d9-5314f255373e.png)


Referenced this web site 
#How to flatten a python list/array and which one should you use
https://www.leocon.dev/blog/2021/09/how-to-flatten-a-python-list-array-and-which-one-should-you-use/

:sunny:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817969/0e9564b2-772c-2acb-9cff-057a24ecac6f.png)
RDS ProxyでToo many connectionsを対策する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/cd697fee-7d6b-c714-a921-2a930773f26e.png" alt="aws" width="80">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/6c51e529-ef99-61ed-ad99-75457f2be8fc.png" alt="mysql" width="156">

RDS - MySQLインスタンスの同時接続数`max_connections`パラメタは変更可能ではあるが規定値`{DBInstanceClassMemory/12582880}`はインスタンスのメモリ容量に応じた接続数に最適化されていて、接続数の引き上げはインスタンスサイズのアップグレードが推奨されている。

> これらの値を変更することはお勧めできません。もっと接続が必要な場合は、もっと大きい RDS インスタンスサイズにアップグレードすることをお勧めします。

故にマイクロなRDSインスタンスにがしがしパラレルで接続して検証するとあっという間に接続上限に到達してエラーになってしまう

```plaintext
Error 1040: Too many connections
```

コネクションプーリングでスケーリングしたいところだが、サーバーレス(`lambda`)やランタイム(`php`とか`ruby`)&フレームワークレベルでサクッと準備できない場合に
`RDS Proxy`をRDSインスタンスの前段に入れるとサクッとプーリング機能を提供してくれる優れもので、マネージドのコネクションプーリング付きhaproxy的なイメージ。
使い方は簡単で、ALBのようにターゲットグループにRDSインスタンスを設定するだけ。

RDSインスタンスのID&PWクレデンシャルは`RDS Proxy`の構築時にこれまた`SecretManager`にフルマネージドで管理される。

### Access Denied 

- `RDS Proxy`の構築と同時にIAMロール`rds-proxy-role-{タイムスタンプ}`が作成＆アタッチ状態で、ロールに`SecretManager`の当該クレデンシャルのARNを含むアクセスポリシー`rds-proxy-policy-{タイムスタンプ}`が割当てられていて、クレデンシャルを参照している。
- `RDS Proxy`の構築後に自分で`SecretManager`に追加したクレデンシャルはポリシーにARNを追加してやる必要がある。

ここがうまくいっていないと、アプリケーション側では延々とAccess deniedなエラーログが出るだけでなんで?と首をひねる事となる。

```plaintext
SQLSTATE[HY000] [1045] Access denied for user 'dbuser'@'XXX.XXX.XXX.XXX' (using password: YES)
```

が、`CloudWatchLog`の`rds-proxyのロググループ`にはばっちり権限エラーとして出力されていたので、追加したクレデンシャルのARNを追加して解決。

```plaintext
Credentials couldn't be retrieved. The IAM role "arn:aws:iam::XXXXXXXXXXXX:role/service-role/rds-proxy-role-XXXXXXXXXXXXX" is not authorized to read the AWS Secrets Manager secret with the ARN "arn:aws:secretsmanager:ap-northeast-1:XXXXXXXXXXXX:secret:{secret_name}.{secret_id}"
```
Javaで「テキストフィールドで入力されたテキストのフォントを設定する」の動作を確認してみた。

# 概要

Javaで「テキストフィールドで入力されたテキストのフォントを設定する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/tutorial/jtextfield/index4.html

# 実装

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

```JSample4_1.java
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JPanel;
import java.awt.Container;
import java.awt.BorderLayout;
import java.awt.Font;

class JSample4_1 extends JFrame{
  public static void main(String args[]){
    JSample4_1 frame = new JSample4_1("MyTitle");
    frame.setVisible(true);
  }

  JSample4_1(String title){
    setTitle(title);
    setBounds(100, 100, 600, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JTextField text1 = new JTextField("Tokyo", 10);
    JTextField text2 = new JTextField("Osaka", 10);
    text2.setFont(new Font(Font.DIALOG_INPUT, Font.BOLD, 20));
    JTextField text3 = new JTextField("Kyoto", 10);
    text3.setFont(new Font("Century", Font.ITALIC, 30));

    JPanel p = new JPanel();
    p.add(text1);
    p.add(text2);
    p.add(text3);

    Container contentPane = getContentPane();
    contentPane.add(p, BorderLayout.CENTER);
  }
}
```

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

```
$ javac JSample4_1.java 
$ java JSample4_1
```

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

![Screenshot from 2025-01-21 08-08-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/998788f4-a04c-dbcf-41d7-d78b73d719b9.png)

# まとめ

何かの役に立てばと。
Data Cloud に関係するトレイルヘッドのまとめ

[Data Cloudのまとめに戻る](https://qiita.com/Keiji_otsubo/items/ce366c02186b6bb5b39b)

---------------



+ [【事例】Data Cloud プレイグラウンドを Trailhead アカウントに接続できません。](https://qiita.com/Keiji_otsubo/items/d9e0e80c684060d65e62)
+ [Create and Activate a Segment in Data Cloud](https://qiita.com/Keiji_otsubo/items/6d40f0036e59c886d419)
+ [Create a Data Stream in Data Cloud](https://qiita.com/Keiji_otsubo/items/959d0587a65cf592748f)
+ [Data Cloud in Flows](https://qiita.com/Keiji_otsubo/items/a9cd9b4e7a8c3ceb01ff)
+ [Get Hands-on with Data Cloud](https://qiita.com/Keiji_otsubo/items/ae02aa9685d0feb3692e)

+ [Given file is not present in the given location](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eq6pASAQ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1533cef0-c1a2-1ac8-9cb8-455a71b8cff0.png)

:::note
私も同じエラーに直面していました。そして、親ディレクトリ フィールドの情報が繰り返されていることに気付きました。そこで、次のフィールドを空白のままにしておくことにしました。すると、問題なく先に進むことができました。

 I was facing the same error. And I could notice that it was repeating the information in the Parent Directory field. So I opted to leave the next field blank. And I was able to move forward without any problems!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4c1f3c17-b6e3-992a-52a6-42a500353c80.png)
:::

+ [【未解決】We can't find the prerequisite configuration in this org. Make sure the selected org contains the complete solution for the Enhance Data with Insights quick start project.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erEcA)

+ [【解決】Why "Copilot Action Library" tab is not showing up in Builder?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifkjx)

+ [Get to Know the Coral Cloud Sample App](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifrPLSAY)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a8a77287-4e19-862e-9b12-7aeffd37026c.png)

:::note
If you need to update the Salesforce CLI, either run sf update or npm install --global @salesforce/cli depending on how you installed the CLI.
:::

+ [Salesforce内のファイルの取り込み](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KC4Ls)

:::note
+ [大容量ファイルコンテンツをデータクラウドに取り込む ](https://help.salesforce.com/s/articleView?id=service.knowledge_ingest_files_to_data_cloud.htm&type=5)

Salesforce は Data Cloud にファイルを取り込むことを検討しているようです。しかし、100 MB の制限はかなり不十分です。これは組織全体の制限であり、「ファイルごと」ではないように思えます... 「最大 100 MB の大きなファイルに保存された知識を Data Cloud に取り込むことができます。 」

Salesforce ファイルを Azure、S3、またはその他の外部ストレージにロードし、再度インポートするために接続するという手間をかけずに、Salesforce ファイルを Data Cloud に取り込むことができれば、多くの顧客が大いに満足するはずです...  
:::
paizaラーニングレベルアップ問題集の「累乗」をやってみた。

paizaラーニングレベルアップ問題集の[累乗](https://paiza.jp/works/mondai/d_rank_level_up_problems/d_rank_level_up_problems__arithmetic_substitution_op_3)をやってみました。
- - -
###### 問題
https://paiza.jp/works/mondai/d_rank_level_up_problems/d_rank_level_up_problems__arithmetic_substitution_op_3
- - -
###### C
```c
#include <stdio.h>

int main() {
	int a = 202;
	int b = 134;
	int c = 107;
	int d = (a + b) * c;
	printf("%d\n", d * d);
	return 0;
}
```
- - -
###### C++
```cpp
#include <iostream>
using namespace std;

int main() {
	int a = 202;
	int b = 134;
	int c = 107;
	int d = (a + b) * c;
	cout << d * d << endl;
	return 0;
}
```
- - -
###### C#
```cs
using System;

class Program
{
	public static void Main()
	{
		int a = 202;
		int b = 134;
		int c = 107;
		int d = (a + b) * c;
		Console.WriteLine(d * d);
	}
}
```
- - -
###### Go
```go
package main
import "fmt"

func main() {
	a := 202
	b := 134
	c := 107
	d := (a + b) * c
	fmt.Println(d * d)
}
```
- - -
###### Java
```java
public class Main {
	public static void main(String[] args) {
		int a = 202;
		int b = 134;
		int c = 107;
		int d = (a + b) * c;
		System.out.println(d * d);
	}
}
```
- - -
###### JavaScript
```js
const a = 202;
const b = 134;
const c = 107;
console.log(((a + b) * c) ** 2);
```
- - -
###### Kotlin
```kotlin
fun main() {
	val a = 202
	val b = 134
	val c = 107
	val d = (a + b) * c
	println(d * d)
}
```
- - -
###### PHP
```php
<?php
	$a = 202;
	$b = 134;
	$c = 107;
	echo (($a + $b) * $c) ** 2, PHP_EOL;
?>
```
- - -
###### Perl
```pl
my $a = 202;
my $b = 134;
my $c = 107;
my $d = ($a + $b) * $c;
print $d ** 2, $/;
```
- - -
###### Python3
```py
a = 202
b = 134
c = 107
print(((a + b) * c) ** 2)
```
- - -
###### Ruby
```rb
a = 202
b = 134
c = 107
p ((a + b) * c) ** 2
```
- - -
###### Scala
```scala
object Main extends App{
	val a = 202
	val b = 134
	val c = 107
	val d = (a + b) * c
	println(d * d)
}
```
- - -
###### Swift
```swift
let a = 202
let b = 134
let c = 107
let d = (a + b) * c
print(d * d)
```
- - -
###### 出力結果
```
1292546304
```
PHP DotEnvのスレッドセーフ対応

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/4b609ebb-2a8f-a816-9927-0fa356f78671.png" alt="apache" width="80">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/54d37327-66f1-2933-8975-34dd22349ebd.png" alt="php" width="80">


EC2のマイクロなインスタンスタイプでホストしているWEBサーバーに同時並列リクエストでワークロード負荷を与えると、DBやセッションストアのmemcachedへのTCP接続が稀に失敗する事象に遭遇し、手間取った

- **MySQL** / **No such file or directory**
TCP/IP接続なんだが、UNIXドメインソケットが見つからない系のエラー?
- **memcached** / **can not to connect memcached**

## 切り分け調査

- ワークロード
  - EC2インスタンスのロードアベレージは余裕で1未満
  - EC2のネットワーク帯域は余裕
  - コネクション数、パケットロストなどRDS, Elasticacheのメトリクスに異常が見られない
- どこかで蹴られている
  - 一応Route53のプライベートホストゾーンから、エンドポイント直に変更してみるが状況変わらず
  - VPCのDNSスロットリング制限で蹴られている？いやそこまでいじめてない

> Amazon が提供する DNS サーバーは、Elastic Network Interface ごとに 1 秒あたり 1024 パケットの制限を適用します。Amazon が提供する DNS サーバーは、この制限を超えたトラフィックをすべて拒否します。
[VPC DNS スロットリングが原因で、Amazon が提供する DNS サーバーへの DNS クエリが失敗しているかどうかを確認するにはどうすればよいですか？](https://repost.aws/ja/knowledge-center/vpc-find-cause-of-failed-dns-queries)

ここまで遠回りして、フレームワークのセッションアダプタからphpネイティブに変更するも失敗するが、きれいに{ホスト}：{ポート}が歯抜けのエラーログが出た

```text
PHP Warning:  session_start(): Failed to parse session.save_path (error at offset 0, url was 'tcp://:')
```

## DotEnv

`apache mpm_event_module`×`スレッドセーフmod_php`な環境で接続コンフィグにDotEnvにImmutableで.envファイルをローディングさせて`$_ENV`スーパーグローバルで参照していた

```php:php
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();
```

DotEnvを`createImmutable`で起動するとputenv/getenvがスレッドセーフではないため、次の順序で並列リクエストの環境変数がタイミングによってクリーンアップされたようだ。

> 1 番目のリクエスト: 変数が存在しない -> ロード
> 2 番目のリクエスト: 変数が存在する -> ロードしない
> 1 番目のリクエスト: 終了、変数をクリーンアップする
> 2 番目のリクエスト: 変数を使用する -> 変数はもう存在しない、によってクリーンアップされる1回目のリクエスト
[https://github.com/vlucas/phpdotenv/issues/248](https://github.com/vlucas/phpdotenv/issues/248)
[When you have two or more sites on one server, the sites's .env will affect each other · Issue \#219 · vlucas/phpdotenv](https://github.com/vlucas/phpdotenv/issues/219)

> Using getenv() and putenv() is strongly discouraged due to the fact that these functions are not thread safe, however it is still possible to instruct PHP dotenv to use these functions. Instead of calling Dotenv::createImmutable, one can call Dotenv::createUnsafeImmutable, which will add the PutenvAdapter behind the scenes. Your environment variables will now be available using the getenv method, as well as the super-globals:
[公式](https://github.com/vlucas/phpdotenv#putenv-and-getenv)にもスレッドセーフでない旨ため注意書きがあった

Immutableモードは定義済みの環境変数のローディングは無視され(2)、リクエストの終了とともに破棄される(4)
一方でMutableモードはリクエストごとに独立したストアに確保するとみえて、スレッド競合の問題は起きなくなった
  ※`createUnsafeImmutable`でv5系の実装で、v4系には存在しなかったので`Mutable`で検証

```php
$dotenv = Dotenv::createMutable(__DIR__);
$dotenv->load();
```
Microsoft 365 Defenderで検閲ブロックされたメールを解除する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/7fb59531-556c-f6f2-1595-fbaad511a5a8.png" alt="js" width="80">

Microsoft 365で組織外部からきた添付ファイル付きメールとかビジネスメールが届かない、迷惑メールフォルダにもない。
どうなっとんのやと助けを求められたときに。

Azureコンソールは統廃合が激しくて久しぶりに開くと高確率で迷子になるのでモチベ下がりつつ、
Exchangeコンソールでブロックリスト的なの探しても見つからないと思ったら、Microsoft 365 Defenderコンソールに独立していた

メールとコラボレーションカテゴリ > 確認 > 検疫
に問題メールがあるので選択して**メールを開放する**を実行すると、解除とともにTOにデリバリーしてくれる。一応、誤認報告もしておく。

[Microsoftにメールをブラックリストから解除してもらう方法](https://papamamameyou.com/microsoft%E3%81%AB%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%E3%83%AA%E3%82%B9%E3%83%88%E3%81%8B%E3%82%89%E8%A7%A3%E9%99%A4%E3%81%97%E3%81%A6%E3%82%82%E3%82%89%E3%81%86/)さまに感謝
AWS WAFでマネージドルールの誤検出を除外する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/9362fc28-852c-1965-b839-f63b00223139.png" alt="aws" width="80">

悪意のないリクエストがPOSTしたパラメタがSQLインジェクションルール`AWSManagedRulesSQLiRuleSet`.`SQLi_BODY`に引っかかってBLOCKされるため特定条件で除外する

## ルール単位にアクションをオーバーライドする

`AWSManagedRulesSQLiRuleSet`のルールセット以下のルールにもいろいろある

* SQLi_QUERYARGUMENTS
* SQLi_BODY
* SQLi_COOKIE
* SQLi_URIPATH

デフォルトはルールにマッチしたら`Block`になるが、ルールレベルで`Allow`とか`Count`(カウントのみ)とか上書きできる。
しかしながらルールごと上書きされるので、特定の条件のみ除外とか細かいチューニングはできない。

![unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/d4552443-2188-1aa6-eccb-941a8d89fd5f.png)


## ルールセットに対してスクリーニング条件を定義する

`Scope of inspection`ではルールセットに対して`scope-down`でステートベースでスクリーニング条件を定義できる。
次はいずれの(AND Statement)の否定条件(NOT Statement)にもひっかからないときにフィルターをかけるステートメント

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/fb2431b4-ca4d-5006-e466-e895a5097343.png)

- Match Typeの説明
[文字列一致ルールステートメント - AWS WAF、AWS Firewall Manager、および AWS Shield Advanced](https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/waf-rule-statement-type-string-match.html)

- 否定条件を複数充てる場合
[AWS WAF のルールビルダーで複数の否定条件を設定する方法を教えてください | DevelopersIO](https://dev.classmethod.jp/articles/tsnote-waf-rule-multiple-negative-conditions/)
［ServiceNow］UI Policy(sys_ui_policy)を使用する

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

# UI Policy
- フォームの振る舞いを動的に制御するための設定機能
- ユーザーの視覚的な情報をノーコード制御可能
- UI（ユーザーインターフェイス）ポリシーはクライアント側で実行される
    - 必須制御：Mandatory
    - 表示・非表示制御：Hidden
    - 読取専用制御：ReadOnly
    - 条件付きの振舞：Condition
# 使い方
### Incident画面で必須フィールドを制御する 
- 個人インスタンスを開く
- 変更前の確認
    - Incidentフォーム画面を開く
    - ※Filter navigatorでIncidentと検索
        - list画面
        - ![スクリーンショット 2025-01-20 075832.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/fe230e5e-fd10-467a-4c7c-87b28e68a5bd.png)
        - form画面
        - ![スクリーンショット 2025-01-20 075850.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/59ab9cab-d29e-0bf6-b9f0-9f882846ad54.png)
    - ここで、アスタリスク（*）が記載されているフィールドが必須フィールドである
    ※openedフィールドは必須ではない
- UI policyで必須フィールド制御を設定する
    - Filter navigatorにsys_ui_policy.listと検索
    - ![スクリーンショット 2025-01-20 080521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/2d70a648-a3df-4f0f-278e-f47463dda73d.png)
    - TableでIncident Tableを絞り、一番上のレコードを押下して変更
    - ![スクリーンショット 2025-01-20 080655.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/a1fe4250-e7aa-05ef-aac8-f77d8500f04b.png)
    - UI policyのフォーム画面が表示
    - ![スクリーンショット 2025-01-20 080825.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/58429edf-87b7-8a47-2697-2e0aa1bfd576.png)
    - UIポリシーの動作を指定する「UI Policy Actions」を設定
         - UI policyの関連リストのUI Policy ActionsタグでNewを押下
    - ![スクリーンショット 2025-01-20 080903.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/0b00484e-967d-17a4-8583-98d00090ba9d.png)
    - 制御したいフィールドを選択
        - Feild nameでOpenedを選択
    - 必須フラグをTrueにする
        - MandatoryをTrueにする
    - 提出する
        - Submitボタンを押下
    - ![スクリーンショット 2025-01-20 082700.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/f017eca9-95fd-1a08-a90f-220b11460c5c.png)
- Openedが変更されているのを確認する
![スクリーンショット 2025-01-20 082811.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/474f0dab-e786-75c2-5b47-cf0f879a2fbf.png)

このようにUI policyで必須フィールドの設定を制御する

# 参考
https://mekeblog.com/servicenow-csa-scripting/#index_id3
フォルダ内の写真データのファイル名に作成日を追加する

# フォルダ内にあるファイル名の修正
**フォルダ内に写真ファイルが乱雑に保存されているのは，私だけではないはず！**
**ファイル名を一括変換する一例として，元のファイル名に”_日付”を追加するPythonスクリプトを示します．**

# （例）　ファイル名.jpg　⇒　ファイル名_YYYYMMDD.jpg
```name_add_date.py
import os
import datetime
import shutil

def rename_files_with_creation_date(folder_path):
    # フォルダ内の全ファイルを取得
    for filename in os.listdir(folder_path):
        file_path = os.path.join(folder_path, filename)
        
        # ファイルの場合のみ処理
        if os.path.isfile(file_path):
            # ファイルの作成日時を取得
            creation_time = os.path.getctime(file_path)
            creation_date = datetime.datetime.fromtimestamp(creation_time)
            
            # 新しいファイル名を生成（元のファイル名 + _作成日）
            name, ext = os.path.splitext(filename)
            new_filename = f"{name}_{creation_date.strftime('%Y%m%d')}{ext}"
            new_file_path = os.path.join(folder_path, new_filename)
            
            # ファイル名を変更
            shutil.move(file_path, new_file_path)
            print(f"Renamed: {filename} -> {new_filename}")

# 使用例
folder_path = '/Volumes/SSD_PGU3/Python_data/Basic/mod_name'  # 処理したいフォルダのパスを指定
rename_files_with_creation_date(folder_path)
「MCP9700サポート」Temperature MCP9701 MCP9700 の関数化 (浮動小数点)(H743ZI2)(リッチプログラミング)(マクロ)


x 過去ログを見よ!!!
x 対象は、MCP9700の方


目的
ADCのテスト
(リッチプログラミング)


いろいろ
STM32L010とかSTM32C011とかLPC812,STM8は、「人権ない」て、
言われているが、普通に動くよ!!! 容量ないけどね!
SSD1306(OLED)もダイレクトで普通に動くよ!!!
ライブラリーは、動かないかも?


結果
----


![Screenshot from 2025-01-21 07-33-52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a7675bff-a53f-e613-66ca-7671bfc1b98e.jpeg)

![image_original(2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/256441ff-e533-9ffe-5246-8015e0dc7da7.jpeg)


プログラム
----


```c++



//SER_Temperature_MCP9700_H743ZI2_1


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


//初期化処理
void setup()
{

  //シリアルの初期化
  Serial.begin(9600);

} //setup


//メインループ
void loop()
{

  //センサーの値を読み込む
  analogReadResolution(12);    // センサーの分解度4096
  int Sensor = analogRead(A0); // センサーの読み取り値
  //温度の表示
  float Voltage = Sensor * ( 3.3 / 4096.0 );        // 電圧
  float Temperature = Temperature_MCP9700(Voltage); // 温度
  Serial.println(Temperature); // 表示

  //1秒の待ち
  delay(1000);

} //loop



```



Temperature_MCP9701_MCP9700.h



```c++


// Temperature_MCP9701_MCP9700.h 
//
// ex 3.3V analogReadResolution(12);
//         float Sensor = analogRead(A2);
//         float Voltage = Sensor * ( 3.3 / 4096.0 );
//         float Temperature = Temperature_MCP9701(Voltage);
//
float Temperature_MCP9701(float Voltage){

  return((Voltage - 0.4) * (1.0 / 0.0195));

}//Temperature_MCP9701


float Temperature_MCP9700(float Voltage){

  return((Voltage - 0.5) * (1.0 / 0.01));

}//Temperature_MCP9700


#define Temperature_MCP9701_A0() Temperature_MCP9701(analogRead(A0)*(5.0/1024.0))
#define Temperature_MCP9701_A1() Temperature_MCP9701(analogRead(A1)*(5.0/1024.0))
#define Temperature_MCP9701_A2() Temperature_MCP9701(analogRead(A2)*(5.0/1024.0))
#define Temperature_MCP9701_A3() Temperature_MCP9701(analogRead(A3)*(5.0/1024.0))
#define Temperature_MCP9701_A4() Temperature_MCP9701(analogRead(A4)*(5.0/1024.0))
#define Temperature_MCP9701_A5() Temperature_MCP9701(analogRead(A5)*(5.0/1024.0))

#define Temperature_MCP9700_A0() Temperature_MCP9700(analogRead(A0)*(5.0/1024.0))
#define Temperature_MCP9700_A1() Temperature_MCP9700(analogRead(A1)*(5.0/1024.0))
#define Temperature_MCP9700_A2() Temperature_MCP9700(analogRead(A2)*(5.0/1024.0))
#define Temperature_MCP9700_A3() Temperature_MCP9700(analogRead(A3)*(5.0/1024.0))
#define Temperature_MCP9700_A4() Temperature_MCP9700(analogRead(A4)*(5.0/1024.0))
#define Temperature_MCP9700_A5() Temperature_MCP9700(analogRead(A5)*(5.0/1024.0))



```
.tsと.tsxを間違えてFirebaseへのgithub Actions自動デプロイに失敗した

# 経緯

- 以下`respondentLoader.ts`というロジックファイルを`respondentLoader.tsx`としていた
- ローカル環境ではうまくいくけど、github actionsでfirebaseに自動デプロイした際に、`respondentLoader`を読み込むコンポーネントにて、`respondentLoaderが見つからないエラー`が発生した

```ts:respondentLoader.ts
import { LoaderFunction } from "react-router-dom";
import { fetchFlowByUrl } from "@/db/functions/flow";
import { queryClient } from "@/app/queryClient";
import { type RespondentData } from "@/db/functions/flow";

export type RespondentLoaderData = {
  respondent: Promise<RespondentData>;
};

export const respondentLoader: LoaderFunction = async ({ params: { shopName, flowUrl } }) => {
  const queryKey = ["flows", shopName!, flowUrl!];

  await queryClient.prefetchQuery({
    queryKey,
    queryFn: async () => await fetchFlowByUrl(shopName!, flowUrl!),
  });

  const respondentData = queryClient.getQueryData(queryKey);
  if (!respondentData) {
    throw new Error("指定されたURLのアンケートは存在しません");
  }

  return {
    respondent: respondentData,
  };
};

```

# 原因と解決方法
`respondentLoader`の拡張子を.ts→.tsxに変更すれば解決した。
TypeScriptやビルドプロセスにおける ファイル拡張子の扱いが異なるために発生した


### TypeScriptとファイル拡張子の解釈の違い

##### .ts ファイル
- 純粋なTypeScriptファイル
- 主にロジックや型定義、ユーティリティなどを記述するために使用
- Reactコンポーネントが含まれていないファイルに適している


##### .tsx ファイル
- TypeScriptの拡張で、JSX記法（ReactのUI記述）を含むファイルに使用
- TypeScriptは.tsxファイルに対してJSXの構文解析を行おうとする

#### エラーの原因
TypeScriptがJSX解析を試みようとするのに対して、`respondentLoader`ファイルは純粋なロジックと型定義のみなので、余計な解析が行われた。

Firebase Hostingのビルド環境では、.tsx ファイルが不要な解析の対象となり、正しく解決されない可能性がある。

また、respondentLoader.tsx としてファイル名を記載した場合、モジュール解決が環境によって失敗することがあります。

# なぜローカルでは問題なかったのか
ローカル環境では、TypeScriptの構文解析が正しく行われ、.tsxでも問題なく解決されていた。
Firebase HostingやCI/CD環境では、より厳密な設定や異なるモジュール解決が行われ、.tsx の扱いに関する差異によって発生した可能性がある。
vscodeをv1.86にするとcent7コンテナでdevcontainerサーバーの起動に失敗する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/ad76724b-2c55-d1aa-de03-ac1b813dc99e.png" alt="js" width="80">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/b9ca02b2-4540-d564-37e5-639078f4492e.png" alt="js" width="90">

vscodeを`v1.86`にバージョンアップすると`centos:7`コンテナでdevcontainerサーバーの起動に失敗する

```
Warning: Missing GLIBCXX >= 3.4.25! from /usr/lib64/libstdc++.so.6.0.19
Warning: Missing GLIBC >= 2.28! from /usr/lib64/libc-2.17.so
```
 
次のvscodeの有志リポジトリ掲載のパッチを当てて解決した。とても感謝。
[npurson/vscode-server-toolchain-workaround: Workaround for the raised toolchain requirements of VS Code Server 1.86+](https://github.com/npurson/vscode-server-toolchain-workaround)
 [vscode server can not launch · Issue \#204036 · microsoft/vscode](https://github.com/microsoft/vscode/issues/204036)

```sh:sh
docker exec -it app bash
 
cd && \
wget https://github.com/npurson/vscode-server-toolchain-workaround/archive/refs/heads/main.zip && \
unzip main.zip && \
sh vscode-server-toolchain-workaround-main/run.sh && \
rm -f main.zip && \
rm -rf vscode-server-toolchain-workaround-main
```

補足

直後に気付いたが、vscodeに「Visual Studio CodeでサポートされていないOSバージョンに接続しています。」とのワーニングが出ていた。

vscodeかdevcontainerのバージョンアップによってvscodeserverサーバーの動作要件がアップデートし、一定のOSバージョニングを判定してデプリケートをワーニング通知しているようだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/d2bbc38e-f852-7fe3-7009-70bf853d9003.png)

上記パッチによって動作はするが、要件を満たさないコンテナはこのワーニングがフラグされ続けるようだ。
AWS CDK入門：３分でわかるAWS CDK

## AWS CDKとは？
AWS CDK（Cloud Development Kit）は、インフラストラクチャをコード（IaC）として定義するためのフレームワーク。


+ 開発者はTypeScript、JavaScript、Pythonなどのプログラミング言語を使用して、AWSリソースを定義・デプロイできる
+ 複雑な設定を簡潔なコードで表現できるので、手動設定のミスを減らし、開発速度と運用効率を向上させる

利用可能な言語の中で、Typescriptが最も利用されており、リファレンスやサンプルも多い非常に多い。

## AWS CDKの構成要素
AWS CDKのプロジェクトを構成する要素は大きく「App」「Stack」「Construct」の3つ。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990185/67b2a26a-0cdb-0b39-0a4c-9066bee59eb5.png)
(参考：https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/home.html)

<dl>
  <dt>App</dt>
  <dd>AWS CDKプロジェクトの最上位の概念。アプリ―ケション全体。</dd>
  <dt>Stack</dt>
  <dd>App配下に紐づくリソース。Stack単位でCloudFormationのスタックが生成・デプロイされる。</dd>
  <dt>Construct</dt>
  <dd>Stack配下に紐づくリソース。１つまたは複数のAWSりろーすを表現。これをStack内で組み合わせることで、リソースの設定値などを定義する。</dd>
</dl>

## Construct Libraryについて
Constructには、L1, L2, L3 の3種類がある。数字が大きくなるごとに抽象度が上がる。
抽象度が上がると、定義するパラメータが減りラクだが、その分何が設定されているかわかりづらくなるので、ここではバランスのよいL2Constructを推奨。
ストレージ容量を空ける

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/d7789963-0849-02b3-b1d6-d49127ced0d0.png" alt="js" width="142">



EC2の治験サーバーのストレージがたびたび逼迫していて、定期的にログをお掃除していたがちゃんと調べたら8年分の思いでが詰まっていた。

シークするだけで毎度大変だったんじゃないか

```sh:sh
# ルート /varが圧倒的にでかい
du -sh /*
6.5M    /bin
69M     /boot
4.0K    /cgroup
60K     /dev
8.9M    /etc
6.0G    /home
197M    /lib
21M     /lib64
4.0K    /local
16K     /lost+found
4.0K    /media
4.0K    /mnt
456M    /opt
0       /proc
69M     /root
28K     /run
15M     /sbin
4.0K    /selinux
4.0K    /srv
0       /sys
16K     /tmp
4.5G    /usr
96G     /var

# wwwコンテンツとかライブラリがでかいのはいいとしてspoolがでかい
du -sh /var/*
4.0K    ./account
711M    ./cache
4.0K    ./crash
4.0K    ./cvs
108K    ./db
8.0K    ./empty
8.0K    ./ftp
4.0K    ./games
12K     ./kerberos
28G     ./lib
4.0K    ./local
16K     ./lock
627M    ./log
0       ./mail
4.0K    ./nis
4.0K    ./opt
4.0K    ./preserve
628K    ./run
35G     ./spool
4.0K    ./tmp
33G     ./www
4.0K    ./yp

# mailがばかでかい。あー、、と
du -sh /var/spool/*
16K     ./anacron
8.0K    ./at
72K     ./clientmqueue
12K     ./cron
4.0K    ./lpd
35G     ./mail
4.0K    ./mqueue

# エラーログやら通知やら8年分くらいたまってた
du -sh /var/spool/mail
35G     ./ec2-user
176K    ./root
0       ./hoge
0       ./fuga

echo '俺の名前を言ってみろ' > /var/spool/mail/ec2-user
```
バーストパフォーマンス(T系)インスタンスのCPUクレジット

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/b9e76f09-60bd-b2f5-e4bd-e8ac7c3ae683.png" alt="js" width="80">

t系インスタンスのCPUクレジットの性質と検討ポイントについて

## CPUクレジット

- CPUクレジットはT系インスタンスにおける**CPU利用券だ**。
- カタログ記載のクレジット数は1時間あたりの割り当て数であり、実際はリアルタイムに割り当てられる。
  [バーストパフォーマンスインスタンスに関する主要な概念と定義 - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/burstable-credits-baseline-concepts.html#CPU-credit-accrual-limit)

### クレジットとベース性能

- **1クレジットは1vCPUを100%で1分間稼働できる**
- 1クレジットは1vCPUを100/60m=1.6%で1時間稼働できる
- 2vCPUのインスタンスなら0.8%で1時間稼働できる
- t3.microは12クレジット/h / 2vCPU / 60m = 10%/mで定常稼働できる。これがベース性能。

T系インスタンスにおいてシングルスレッド性能は概ねインスタンスタイプに依存しない
[AWS EC2で使われているCPUの種類と性能をまとめてみた。](https://noname.work/3857.html)
### バースト

- チャージ量 > 消費量なときは**使い切らなかったクレジット**はそのインスタンスタイプのクレジット/hの**24時間分を上限にスタックされる**
- チャージ量 < 消費量なときはスタックから持ち出しされる=これが**バースト**
- スタックを使い果たしたらチャージ量と消費量がイコールになりベース性能しか出せない

### みきわめ

- 定常時にベース性能でスループットが満たせるか
- CPUスパイクをバーストでカバーできるか

アンリミテッドモードでは性能優先で追金で無制限にスケールすることはできるが、メモリ・ネットワーク帯域などCPU以外の因子についても総合的にコスパ最適なインスタンスタイプを選択することが肝要だ。

[バーストパフォーマンス\(T系\)インスタンスの特徴を理解して上手に利用しよう | Amazon Web Services](https://aws.amazon.com/jp/blogs/startup/burstable-performance-instances/)
Vuetifyでスワイプ動作を無効化する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/cb600153-5758-fe0d-be9f-137a5f26bc65.png" alt="vue.js" width="100">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/b0c16377-6303-7020-7f75-94ffeaa188f0.png" alt="vuetify" width="180">

`vuetify`の`v-window`でタブを構成して`v-window-item`内に含まれるスクロール要素がタッチイベントに反応してタブスワイプしてしまうのをガードする実装

オーバーフロースクロールなテーブルコンテナのタッチイベントのバブリングをキャンセルする例 ) 

```javascript:javascript
// タッチイベントのソースがTHかTDの場合、親へのイベントバブリングをキャンセル
const touchCancelBehavior = e => {
	if (e.target.tagName === 'TH' || e.target.tagName === 'TD') {
		e.stopPropagation();
		e.stopImmediatePropagation();
    }
}

// v-windowコンポーネント系にリッスンさせる
let wList = document.querySelectorAll('.v-window, .v-window__container, .v-window-item')
wList.forEach( target => {
	target.addEventListener('touchstart', touchCancelBehavior)
    target.addEventListener('touchmove', touchCancelBehavior)
    target.addEventListener('touchend', touchCancelBehavior)
})
```
【AWS CLI トラブルシューティングTips】STSのGetSessionTokenでエラーとなるときの対処方法

# はじめに

　AWS CLIを使って、MFAの有効化やIAMロールを切り替える際に、AWS STSのGetSessionTokenで以下のようなエラーになる場合の対処方法を紹介する。AWS CLIによるMFAの有効化やIAMロールの切り替えの基本的な方法は、[こちらの記事](https://qiita.com/Regryp/items/288c3aa8aca16580b6b4)を参照。

エラー内容
```bash
An error occurred (ExpiredToken) when calling the GetSessionToken operation: The security token included in the request is expired  
```

# 動作確認環境

* Ubuntu 22.04 x86_64
* AWS CLI 2.22.30

# エラーの原因

　AWS CLIでMFAの有効化やIAMロールを切り替える際に**環境変数**を使っていて、**セッションが切れた後**に以下の環境変数が設定されている場合に発生する。

* AWS_ACCESS_KEY_ID
* AWS_SECRET_ACCESS_KEY
* AWS_SESSION_TOKEN

# エラーの対処方法

　セッションが切れて無効となった場合は、以下のコマンドで環境変数の値を削除する。

Ubuntu（Linux）

```bash
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN
```

Windows
```powershell
set AWS_ACCESS_KEY_ID=
set AWS_SECRET_ACCESS_KEY=
set AWS_SESSION_TOKEN=
```

# まとめ
　AWS CLIを使って、MFAの有効化やIAMロールを切り替える際に、AWS STSのGetSessionTokenで以下のようなエラーになる場合の対処方法を紹介した。AWS CLIを使ってMFAの有効化やIAMロールの切り替えなどをする際に、アクセスキーやシークレットアクセスキーが間違えていない場合でも発生するので、参考にしてほしい。

# 参考

https://qiita.com/Regryp/items/288c3aa8aca16580b6b4

https://repost.aws/ja/knowledge-center/sts-iam-token-expired
Windows/Mac/Linuxのリソース（CPU、メモリー、ディスク）を監視してSNMPのTRAPを送信するプログラムの紹介

# はじめに

Windows/Mac/Linuxのリソース（CPU、メモリー、ディスク）を監視してSNMPのTRAPを送信するプログラムの紹介です。

標準のSNMPエージェントのホストリソースMIBにはTRAPの定義がありません。
そこで、CPU使用率、メモリー使用率、負荷、ディスク使用率が設定した
閾値を超えたらSNMPのTRAPかsyslogを送信するシンプルなセンサープログラムを
作ってみました。

監視するのは

- CPU使用率
- メモリー使用率
- 負荷
- ディスク使用率

です。


# GitHUBのリポジトリ

ソースコードは

https://github.com/twsnmp/twhr2trap

にあります。



# インストール

https://github.com/twsnmp/twhr2trap/releases

からZIPファイルをダウンロードして解凍してください。実行ファイルが１つだけです。

または、TWSNMP FCのインストラーに含まれています。

https://note.com/twsnmp/n/nc6e49c284afb



# 使用方法

```
Usage of twhr2trap:
  -all
    	send trap continuously
  -community string
    	snmp v2c  trap community
  -cpu int
    	cpu usage threshold 0=disable
  -disk int
    	disk usage threshold 0=disable
  -eid string
    	snmp v3 engine ID
  -interval int
    	check interval(sec) (default 10)
  -load int
    	load usage threshold 0=disable
  -mem int
    	memory usage threshold 0=disable
  -mode string
    	snmp trap mode (v2c|v3Auth|v3AuthPriv) (default "v2c")
  -password string
    	snmp v3 password
  -syslog string
    	syslog destnation list
  -trap string
    	trap destnation list
  -user string
    	snmp v3 user


```

trap,syslogの送信先はカンマ区切りで複数指定できます。  
:に続けてポート番号を指定することもできます。ポート番号を省略するとデフォルトのポートに送信します。
(syslog:514,trap:162)

```
-trap 192.168.1.1,192.168.1.2:8162
-syslog 192.168.1.1,192.168.1.2:5514
```

`-all`を指定するとモニター間隔毎にTRAPやsyslogを送信します。


## 起動方法


起動するためには、tarpの送信先(-trap)かsyslogの送信先(-syslog)が必要です。
CPUなどのしきい値を１つも指定しなければ何も送信しません。
（無駄な動作をします。）

Mac OS,Windows,Linuxの環境では以下のコマンドで起動できます。  
（例はLinux場合）

```
#./twhr2trap  -trap 192.168.1.1 -syslog 192.168.1.1 -cpu 90 -mem 90 -load 20 -disk 90 -coummnity trap
```

# TRAPのMIB定義

以下にあります。

https://github.com/twsnmp/twhr2trap/blob/main/TWHR2TRAP-MIB.txt




# ビルド方法

Go言語のビルド環境が必要です。makeも必要です。

ビルドはmakeで行います。
```
$make
```
以下のターゲットが指定できます。
```
  all        全実行ファイルのビルド（省略可能）
  mac        Mac用の実行ファイルのビルド
  clean      ビルドした実行ファイルの削除
  zip        リリース用のZIPファイルを作成
```

```
$make
```
を実行すれば、MacOS,Windows,Linux(amd64),Linux(arm)用の実行ファイルが、  
`dist`のディレクトリに作成されます。


配布用のZIPファイルを作成するためには、
```
$make zip
```
を実行します。ZIPファイルが`dist/`ディレクトリに作成されます。
Pythonとp5.jsで可視化しながら数学を学び直す～その3：指数関数と対数関数

# はじめに

今回は指数関数と対数関数をセットで学び直しすることにしました。

学校で習う時、この２つの関数は別々に順次習いますが、学び直しをする時点では両方合わせて勉強した方が理解もより深まると考えました。

また、これらの関数には「底」という概念があり、私にとってはこれが「とっつきにくい」原因になっていました。ですが「ネイピア数 $e$」とあわせて「底が２」、「底が１０」、「底がe」などの場合を合わせて考える、より理解が深まりました。

# 記事の構成

シリーズのパターンに従い、Pythonのコードとメインのコンテンツは以下のGithubページにあります。


https://github.com/yoshiwatanabe/python-test/blob/main/math/exponential_logrithmic.ipynb

またp5.jsを用いたアニメーションなどへのリンクも記事中に貼っています。全てのアニメーションやインターアクティブ・ツール等のインデックスは以下です。

https://yoshiwatanabe.github.io/python-test/

# 指数関数と対数関数の関係

まずはインターアクティブなアニメーションを使ってこ２つの関数が「逆関数」の関係にあることを体験してみましょう。

（以下はプレビューのスクリーンショットです。スクリーンショットの下のリンクからアニメーションのページを開きます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/be61b027-976a-48e3-847b-82e17e6f18de.png)

[アニメーションのページを開く](https://yoshiwatanabe.github.io/python-test/exponential_logrithmic01.html)

# 底が２の指数関数と対数関数

次に、指数関数と対数関数を、プログラミングやソフトウェア開発で馴染みのある２進数の２を底にして見比べてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/bbaeeefc-5233-470b-bf5f-4aed0f8919df.png)

指数関数（青）は傾きがしだいに急になる様子が分かります。$x=1$の時は$y=2$で、$x=2$の時は$y=4$となり「２の$x$乗」になっているのが分かります。

逆に対数関数（橙）は傾きがしだいに緩やかになっています。$x=1$の時は$y=0$（底２を何乗すれば$1$になるかというと、0乗すればなる）で、$x=4$の時は$y=2$（底２を何乗すれば$4$になるかというと、2乗すればなる）になっているのが分かります。

# 指数関数と対数関数が逆関数である

指数関数と対数関数をセットで理解するのが効果的な理由は、それらが互いに逆関数になっているからです。別の言葉で言うと、$y=x$に関して対称です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/66373c00-6a41-462c-8f13-7410be9dc994.png)


グラフでは座標の$ｘ$と$ｙ$の値をひっくり返した「逆点」が、それぞれの関数のグラフのどの位置にあるかが分かります。

| 色 | 指数関数 $2^x$ | 対数関数 $log_2(x)$ |
|:---:|:----------------:|:----------------------:|
|  紫  | (0, 1)          | (1, 0)                |
|  黄 | (1, 2)          | (2, 1)                |
|  エンジ  | (2, 4)          | (4, 2)                |

この３つ点のペアを頭の中のグラフに書くことが出来れば、指数関数と対数関数の大まかな特徴とその関係を把握できたと言えるでしょう。

# 底が２，１０，e（ネイピア数）の場合を比べる

最後に底が異なる時の、２つの関数の違いを見比べてみます。

３つの異なる底の場合の異なる場合に指数関数と対数関数をJavaScriptのインターアクティブページに調べてみましょう。

（以下はプレビューのスクリーンショットです。スクリーンショットの下のリンクからツールを開きます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/41f9ad26-49b2-4d82-b32c-ce91f3b9e379.png)

[インターアクティブ・ツールを開く](https://yoshiwatanabe.github.io/python-test/exponential_logrithmic02.html)

使い方は、まずはラジオボタンを使って「底」を選択し、スライダで点を移動させます（キーボードの矢印キーで微調整できます）

底が大きい１０は指数関数と対数関数ともに「緑色」で描かれています。底が小さい２のグラフと比べると、どちらの関数も極端な性質を示しているのが分かります。つまり底の値が大きいほどより極端に増える（対数関数の場合、飽和してします）ことが分かります。

赤色は自然指数と自然対数で、$e$が底の場合です。全ての底の指数関数と対数関数は、ネイピア数を用いた自然対数$ln(x)$で表すことが出来るので、この赤色を標準として底の値の違いを可視化することが出来そうです。
[修正版]スクロールするテーブル(bootstrap 5.3)

前回 (https://qiita.com/okadabasso/items/a5d3dbe581307da37988) やったやつの修正版。

flex を使いすぎなのと無駄なスタイルが多かったので整理した。特に "scrollable-table-shim" とか不要になった。

https://codepen.io/okadabasso/pen/MYgBrXL

## 要点

* body 以下、無駄に `d-flex` にしていたのを削除した
* main 直下(たいていのテンプレートエンジンで個別ページのコンテンツを書く部分) に `d-flex flex-column` を指定し、スタイルに `height: calc(100vh - 5rem);` を追加して main の高さを固定する
* `.scrollable-container` に `overflow-y-auto` を指定する
* scrollable-table-shim は不要なので削除する
* `.scrollable-container thead` には `top: -1px` を指定してスクロールしたときに見えてしまう隙間を消す

 他に、 最初の列に `position: sticky; left: 0` を指定して横スクロールが発生したときに最初の列だけはスクロールしないようにした。
.object を使ったシリアライズデータのテスト：OpenStruct からの移行

# はじめに
テストコードを記述していると、シリアライズされたデータの検証に直面することがあります。私のケースでは、あるメソッドの戻り値がシリアライザーによって生成されたデータであり、通常のオブジェクトのように have_attributes を用いて簡単にテストできませんでした。

当初は、OpenStruct を使ってこれを解決しようとしましたが、OpenStruct は非推奨であることを知り、最終的に .object を利用する方法に切り替えました。本記事では、その経緯と理由について共有します。
# 課題：シリアライズされたデータの検証
以下のように、update の戻り値である output を検証したいと考えました。
```
require 'ostruct'

describe UserProfileUpdater do
  describe '.update' do
    let(:params) do
      {
        user_id: 1,
        name: 'hashimoto',
        email: 'duhfaiudfhai.com',
        address: 'Tokyo'
      }
    end

    it 'updates the profile successfully' do
      response = described_class.update(params)
      serialized_response = OpenStruct.new(response)

      expect(serialized_response).to have_attributes(
        name: params[:name],
        email: params[:email],
        address: params[:address]
      )
    end
  end
end
```
## 課題
### 非推奨の使用：
OpenStruct はパフォーマンスや安全性の面から非推奨とされており、長期的な使用が推奨されません。
### 余計な変換：
レスポンスデータをわざわざ OpenStruct に変換する手間が増えます。

以上のような課題があった。

# 解決策: .objectを活用する

上記の課題に対して、.objectを活用することで、シリアライズされたデータを元のRubyオブジェクトとして扱う方法を採用しました。このアプローチは、不要な変換を省き、テストコードをシンプルかつ効率的に記述できます。
```
describe UserProfileUpdater do
  describe '.update' do
    let(:params) do
      {
        user_id: 1,
        name: 'hashimoto',
        email: 'duhfaiudfhai.com',
        address: 'Tokyo'
      }
    end

    it 'updates the profile successfully' do
      response = described_class.update(params)
      serialized_response = response.object  # .objectで元のオブジェクトを取得

      expect(serialized_response).to have_attributes(
        name: params[:name],
        email: params[:email],
        address: params[:address]
      )
    end
  end
end
```

上記の方法を採用することで、以下のようなメリットを得ることができました。

### メンテナンス性の向上:
長期的なプロジェクトでも安心して使用できる方法を採用することで、将来的な変更や対応が容易になる。
### 開発効率の向上:
無駄な変換や非推奨な方法に悩まされることなく、テストコードの記述に集中できる。



# まとめ
シリアライズされたデータのテストで課題に直面した際、.objectを活用することで、簡潔かつ効率的に問題を解決できました。今後、テストコードでシリアライズされたデータを検証する場合は、ぜひ.objectを活用しようと思います。


⚠️あくまで、個人的な解釈ですので参考程度にしていただけると幸いです。