OmniAICreator/Qiita-1.07M huggingface dataset:
@ConfigurationPropertiesを使用した内部クラスの問題記録

私たちはよく@ConfigurationPropertiesを使ってカスタム設定を注入しますが、設定ルールが複雑な場合、複数のクラスを定義して設定をマッピングする必要があることがあります。このとき、これらのクラスを単独で定義するか、内部クラスとして定義するかという問題に直面します。

私は内部クラスを使用することを選びました。**理由は、管理とメンテナンスが容易だからです。**

内部クラスの方法を使用しているときに、設定が注入できないという問題が発生しました。ネットで色々と調べましたが、うまくいきませんでした。その後、Datasourceの設定が比較的複雑な設定であることを思い出し、どのように実装されているかを確認しました。**すると、このような方法で定義する場合、内部クラスをpublic staticとして定義する必要があることが分かりました。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809422/4bded3de-dcc9-cc11-5f5e-831054986f99.png)
Calculated Insight の考察


**用語集**

+ **Measure**:顧客の合計支出額や平均注文額などの属性の集計値。
+ **Dimensions**:メジャーを分類するために使用される定性的な値。たとえば、すべての顧客の合計支出額を表示する場合、顧客 ID は合計支出額のメジャーに関連付けられたディメンションになります。
+ **Insight Builder**ユーザーが SQL に関する限られた知識で洞察を作成できるツール。

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

+ [計算されたインサイトの編集に関するガイドラインと制限](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Yw2RsSAJ)

管理者は、計算されたインサイトを編集するときにのみ、キー修飾子ディメンションを追加できます。これらのディメンションは、既存の計算されたインサイトのディメンションのキー修飾子フィールドを使用して作成されます。たとえば、SELECT Individual.KQ_Id__c as kqid__c では、Individual.KQ_Id__c がキー修飾子フィールドであり、計算されたインサイトのディメンションです。

+ [CI Unified_Individual_Case_Counts__cio cannot be edited because the newly added dimension case_status__c is not an eligible KQ dimension. Add a key qualifier dimension that uses the key qualifier field of an existing calculated insight’s dimensions and try again.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000ViDr0AK)


# エラー

+ [Please help - Stuck on Step 6 on "Create Insights Using Data Cloud"](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000O78r)

https://trailhead.salesforce.com/content/learn/projects/quick-start-enhance-data-with-insights/create-insights-using-data-cloud?trail_id=get-hands-on-with-data-cloud

:::note
データ マッピング画面では、左側にデータ レイク オブジェクト、右側にデータ モデル オブジェクト (DMO) が表示されます。これらはそれぞれ左側と右側で見つける必要があります。まず、左側のステータスと右側のケース ステータスを見つけます。次に、ステータスをクリックし、次にケース ステータスをクリックすると、2 つを結ぶ線が描画されます。他の 2 つも同様の方法で実行できるはずです。
:::

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

+ [計算されたインサイトに公開ボタンが表示されない](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000OtMy0AK)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/78c46a8d-b71a-4240-87b7-e1bc4655375f.png)

:::note
「計算されたインサイトを表示および編集」権限または適切な Salesforce Einstein 権限が必要です。

-「設定」→「ユーザー管理」→「プロファイル」または「権限セット」に移動します。

- ユーザー プロファイルに割り当てられている権限、特に Salesforce Einstein Analytics (現在は Tableau CRM の一部) および Calculated Insights に関連する権限を確認します。

また、管理パッケージを使用している場合は、計算されたインサイトの公開が許可されていることを確認してください。
:::

+ [ステップのエラー: 計算されたインサイトを作成する (放棄されたカートの数)](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000UdDt0AK)

>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ee325477-6b3a-4fa2-b1da-1ef2c2c6dd7c.png)
Webブラウザでのリアルタイム通信技術

# はじめに

Webブラウザでのリアルタイム通信技術について調査した。
TCPとUDPの長所短所については知っていることを前提とする。
軽い調査なので、「らしい」という言葉遣いが多い。

# 筆者環境の結論
2024年時点ではWebSocket(HTTP/2)を第一候補とする。
2～5年くらいに再検討するとWebTransportが第一候補になるかもしれない。

# HTTPバージョンの歴史

1997年～ HTTP/1.1
2015年～ HTTP/2(≒SPDY対応)
2022年～ HTTP/3(≒TLS1.3とQuic対応)
※1.0以前は省略



# 双方向通信（サーバー　←→　Webブラウザ）

双方向通信ができるのであって双方向通信しなければならないわけではない。
そのため、これらを一方向通信として使用するのもあり。


## WebSocket(HTTP/2)
TCP

筆者環境においては双方向通信を採用する場合、このWebSocketが最有力か。
理由：HTTP/2の安定性、TCPの信頼性が必要であるため。また、歴史が10年以上あるため安定している。


## WebSocket(HTTP/3)

それっぽい情報は見つかるが、実現可能なのかはよくわからなかった。
これを調査して採用するくらいなら、WebTransport採用を目指したほうがよさそう。


## WebTransport

HTTP/3、QUIC、UDP

2024年時点ではブラウザを用いたリアルタイム双方向通信では最新技術。
UDPであるが、QUICで信頼性を担保しているためTCP程度の信頼性はあるらしい。
つまり謳い文句通りであるなら、UDPの速度とTCP相当の信頼性のいいとこどりができるということ。
登場してからあまり時間がたっていないため、採用する場合は自前でちゃんと検証したほうがよさそう。そのコストを払ってでもメリットを享受できるなら有力候補。
筆者環境では様子見としておく。

## WebRTC

P2P通信。P2Pなのでこの記事の対象外かもしれないが記録に残しておく。
実装が複雑で使いまわしにくいらしい。
小規模ならサーバー-クライアントっぽく実装できそうだが、大規模スケールは苦しいらしい。


# 一方向通信（サーバー　→　Webブラウザ）

## Server Sent Event
ChatGPTの回答がリアルタイムでヌルヌル表示されるのはこれを使っているらしい。つまり大手が採用している。
ちゃんとした実装の一方向通信を採用する場合は、最有力候補。

## HTTP/2 Server Push
最新版Chromeではすでに廃止済みであるため新規案件では使うな！

## javascriptでタイマー＋リロード

タイマーでページリロードをして自動で再取得する。
更新間隔が数秒以上でよく、通信の無駄を許容できるならあり。
余計なものを入れなくていいので単純。
この記事の趣旨とは少し違うが、筆者は昔の案件でこれを実装したことがあるので記録に残しておく。

## Polling / Long Polling

javascriptで実装できるらしい。
詳細は未調査。





# 参考

https://zenn.dev/shiguredo/articles/webrtc-webtransport

https://www.publickey1.jp/blog/24/httphttp2http_semantics.html

https://http3-explained.haxx.se/ja/why-quic
【ChatGPT＋Code Interpreter】QRコードを作成と読み込み。


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

　今回は、QRコードを作成と読み込みをします。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::

　まずは、ニュース。

　Luma AIの
　　動画生成AIの
　　　DreamMachineに
　　　　新機能が登場しました。

　“Loop”と
　　“Loop Extend”。

　Loop機能で
　　シームレスな動画を作成可能。

　Loop Extend機能は、
　　Loopの5秒延長。

　元記事はこちら。
　　[たかまささんポスト](https://x.com/takamasa045/status/1815381855744688175?t=pAvLE77bbrgRac0T5Xik7Q&s=03)

　さっそく試してみた結果ですが、
　　体験版でできたのは、
　　　Loop機能だけでした。
　　　　Loop Extendは
　　　　　出てきませんでした。

　また、
　　なぜか、つながらず、
　　　長さも4秒になります。
　　　　（もともとは5秒）

　“Loop Extend”は
　　体験版ではできないみたい。

　課金？
　　とりあえず、
　　　保留してますよ😅

　[私のサンプルポスト](https://x.com/kabumira862571/status/1815410679924523424?t=aWKegqVWA9DlZZp9arOj5w&s=19)
***
　さて、本題です。

　今回は、
　　QRコードを作成すること、
　　　それと読み込みをやってみます。

　まずは、
　　QRコードについて
　　　GPT-4o miniに尋ねました。
***
***user***
QRコードについて教えてください。

***GPT-4o mini***
QRコード（Quick Responseコード）は、情報を短時間で読み取れる2次元のバーコードです。通常は白と黒のパターンで構成され、スマートフォンやQRコードリーダーを使って情報を迅速に取得できます。QRコードは以下のような用途で使われます：

1. **ウェブサイトのURL**: ウェブサイトへのリンクを簡単に共有できます。
2. **連絡先情報**: 名刺やパンフレットに含まれることが多く、連絡先情報を簡単に追加できます。
3. **商品の情報**: 商品の詳細や価格、レビューをすぐにチェックできます。
4. **支払い**: モバイル決済やオンラインストアでの支払いに利用されます。

QRコードは、任意の文字列やデータを含むことができ、エンコードされた情報の量はコードのサイズに依存します。

***user***
任意の文字列は、どのくらいの量を入れられますか？

***GPT-4o mini***
QRコードに含めることができる文字列の量は、コードのバージョンとエンコーディング方式によって異なります。一般的に、QRコードには以下のような情報が含められます：

- **数字のみ**: 最大7,089文字
- **英数字（英字と数字）**: 最大4,296文字
- **バイナリデータ**（8ビットのデータ）：最大2,953バイト
- **漢字を含むデータ**: 最大1,817文字

QRコードのバージョンが大きくなるほど、より多くのデータを含むことができます。また、データ量が増えるとQRコードが複雑になるため、読み取りに必要な時間や精度も変わることがあります。
***

　では次に
　　QRコードを
　　　作成します。
***
***user***
CodeInterpreterで、“こんにちわ”をQRコードにしてください。

***GPT-4o mini***
（ダウンロードリンク）
***

　では、
　　今度は
　　　読み込んでみましょう。

　しかし、
　　“Code Interpreterで”としても
　　　うまくライブラリが
　　　　選択できないらしく、
　　　　　処理できません。

　そこで次のようにします。
***
***user***
（アップロード）
qrtoolsで、QRコードを読んでください。

***GPT-4o mini***
The QR code reads: こんにちわ (Hello).
***

　ただし、
　　276文字で試したところ、
　　　生成はできますが、
　　　　読み込みはできませんでした。

　URLとか
　　メールアドレスとか
　　　そのくらいのものしか
　　　　扱えないのかもしれません。

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

　今回は、ここまで。
Quick Start: Enhance Data with Insightsを実際に行ってみた

+ [Calculated Insight の考察](https://qiita.com/Keiji_otsubo/items/7d03868d663653bded6b)

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

https://trailhead.salesforce.com/content/learn/projects/quick-start-enhance-data-with-insights

# Create Insights Using Data Cloud

何もしないで、検証ボタンをクリックする

:::note alert
We couldn’t find the new Data Stream for Case. Please be sure Category is set to Engagement and, the Event Time Field is set to Created Date, and it is Deployed.

Case の新しいデータ ストリームが見つかりませんでした。 [カテゴリ] が [エンゲージメント] に設定され、[イベント時間] フィールドが [作成日] に設定され、展開されていることを確認してください。
:::

順番があるみたい

このバッジは、Data Cloud の概念を網羅したシリーズの一部です。このプロジェクトでは、計算されたインサイトに焦点を当てて、これらの概念の構築を続けます。そのためには、まず「Data Cloud でのデータ ストリームの作成」および「クイック スタート: ID 解決ルールセットの作成」プロジェクトを完了してください。これらのプロジェクトでは、これから作成する計算されたインサイトに必要なデータとプロセスを確立しました。このプロジェクトを完了するには、これらのプロジェクトと同じ Developer Edition 組織を使用します。これらの Developer Edition は、14 日間の限定期間のみ利用可能です。組織の有効期限が切れる前に、このプロジェクトを完了してください。

This badge is part of a series covering Data Cloud concepts. In this project, you continue building out those concepts by focusing on calculated insights. To do that, first complete the [Create a Data Stream in Data Cloud](https://trailhead.salesforce.com/content/learn/projects/create-a-data-stream-in-data-cloud) and [Quick Start: Create an Identity Resolution Ruleset projects](https://trailhead.salesforce.com/content/learn/projects/quick-start-create-identity-resolution-ruleset). These projects established the data and processes that are needed for the calculated insights you’re going to create. You use the same Developer Edition org from those projects to complete this one. These Developer Editions are only available for a limited 14-day period—be sure to complete this project before your org expires.


**用語集**

+ **Measure**:顧客の合計支出額や平均注文額などの属性の集計値。
+ **Dimensions**:メジャーを分類するために使用される定性的な値。たとえば、すべての顧客の合計支出額を表示する場合、顧客 ID は合計支出額のメジャーに関連付けられたディメンションになります。
+ **Insight Builder**ユーザーが SQL に関する限られた知識で洞察を作成できるツール。
競技プログラミング練習　ビット全探索（Java）


競技プログラミングで必要になったので、ビット全探索のシンプルな演習をしてみた。


```java:ビット全探索練習



class Main {
		
	public static void main(String[] args) {
		
		// 集合{a,b,c}の部分集合を列挙する
		
		String[] s= {"a","b","c"};
		
		//要素数
		int n=3;
		
		//2^nパターンを探索
		for(int i=0 ;i< (1<<n) ; i++) {
			String sub="";
			
			//iパターン目の各要素をチェック
			for(int j=0 ;j<n;j++) {
				//iの2進数、末尾からj番目のbitが1かどうかを判定
				//例）i=4（100）⇒ j=0,1ならfalse、j=2ならtrue
				//trueの場合要素を格納する
				if((1 & i>>j)==1)	sub += s[j];
				
			}
			System.out.println("{"+sub+"}");
		}
	}
}
	
```
本当に牌操作が存在しない麻雀の証明


## 前書き

みんな大っ嫌いな牌操作
主流の山のハッシュを公開する方法は山が固定されていることは証明できるが、山自体が特定のプレイヤーを優遇するよう仕込まれていないことを証明できない。

この記事では山の生成込みで牌操作が行われていないことを証明する方法を示す。

## 結論

### 0. 前提

山を生成するアルゴリズムが公開されていること！

### 1. 対局前に4人のプレイヤーそれぞれに適当な文字列を入力してもらう

この時点では、各々の入力した文字列はお互いに知らない。

（例）
プレイヤー1：a8d4
プレイヤー2：uv78
プレイヤー3：iv9w
プレイヤー4：6wvq

### 2. 各プレイヤーが入力した文字列から山を生成し、山のハッシュ、各プレイヤーの入力した文字列のハッシュを公開する

（例）
山のハッシュ：ivk38vka67
プレイヤー1のハッシュ：bk2ri82div
プレイヤー2のハッシュ：o8e45ae51g
プレイヤー3のハッシュ：hr6nst4b13
プレイヤー4のハッシュ：8b4rslrob6

### 3. 対局後に各プレイヤーの入力した文字列を公開する。

終わり

## 何故これでいいのか？

### ツモが操作されていないことの証明

ハッシュ化された山が公開されているので確かめられる。

### 山が操作されていないことの証明

各プレイヤーの入力した文字列から山が生成されているため。
「山を生成するアルゴリズム」は公開されているため確かめられる。

## どうでもいいが

昔書いたこの記事とほぼ同じ内容。

https://qiita.com/mogamoga1337/items/c2c1469dba3939fe5c58
MySQLコンテナの接続エラーは exec コマンドで解決

# はじめに
環境構築でDockerのコンテナで遭遇したエラーを共有します。

# 問題
環境構築で次のコマンドを実行したところ、MySQLの接続に失敗しました。

```bash
docker-compose up -d
docker-compose run --rm db bash
mysql -u root -p
```

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock
```

# 解決方法
問題の解決に `docker-compose exec` コマンドを使用しました。このコマンドは既に稼働しているコンテナ内でシェルを開きます。

```bash
docker-compose exec db bash 
mysql -u root -p
```

この方法は、既に起動しているMySQLサーバーのコンテナ内でコマンドを実行するので、MySQLクライアントが正しいソケットに接続することができます。正常に接続できた場合、次のような成功メッセージが表示されます。

```
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 5.7.19 MySQL Community Server (GPL)
```

# 原因
`docker-compose run` コマンドは、新しいコンテナを起動し、その中で指定したコマンドを実行します。この新しいコンテナは、既存のMySQLサーバーコンテナとは独立しています。そのため、MySQLサーバーが稼働していないので、ローカルソケットへの接続が失敗します。

# おわりに
以下の記事を参考に、IPアドレスを取得してアクセスすることで解決していたのですが、途中からIPアドレスを指定しても、MySQLに接続することができなくなりました。

そこで、`docker ps`でコンテナが同時に立ち上がっていることに気づき、`docker-compose run` コマンドの挙動について、理解することで根本的に解決することができました。

# 参考

https://qiita.com/KOBA-RYOTA/items/3cf5070b54845e151034
【Twig】テキストを置換

文字列内の、あるキーワードを「削除」・「置換」したい時ってありますよね。

## Replace
Twigには`replace`というフィルターが標準で用意されています。

https://twig.symfony.com/doc/3.x/filters/replace.html

## Sample
**※ 公式より引用**
```twig
{{ "I like %this% and %that%."|replace({'%this%': fruit, '%that%': "oranges"}) }}
{# if the "fruit" variable is set to "apples", #}
{# it outputs "I like apples and oranges" #}

{# using % as a delimiter is purely conventional and optional #}
{{ "I like this and --that--."|replace({'this': fruit, '--that--': "oranges"}) }}
{# outputs "I like apples and oranges" #}
```

ちょっとわかりづらいですかね。
大人気映画シリーズで使用例を紹介します。

## 使用例
このようなスニペットを用意してみました。
```twig
{% set title = movie %}
{% set clean_title = title|replace({'ジュラシック・パーク': ''}) %}
{{ clean_title or 'ジュラシック・パーク' }}
```

### シリーズ1の場合
`movie`は「ジュラシック・パーク」ですね。
出力は以下の通り。

```txt
ジュラシック・パーク
```

### シリーズ2の場合
`movie`は「ロスト・ワールド/ジュラシック・パーク」ですね。
出力は以下の通り。

```txt
ロスト・ワールド/
```

### シリーズ3の場合
`movie`は「ジュラシックパークIII」ですね。
出力は以下の通り。

```txt
III
```

## まとめ
僕のお気に入りはロストワールドです。
HexoとButterflyテーマを使用してNetlifyにデプロイする方法

## はじめに

この記事では、HexoのButterflyテーマを使用して静的サイトを作成し、Netlifyにデプロイする手順を説明します。

### 使用環境
OS：Windows11
VS Code
node: v18.17.0
hexo: 7.3.0
hexo theme: [butterfly](https://github.com/jerryc127/hexo-theme-butterfly)

## 静的サイトジェネレーター（SSG）とは
ウェブサイトのページを事前に生成し、静的なHTMLファイルとして提供するツールです。これにより、サーバー側の処理が不要になり、表示速度が速く、セキュリティも向上します。Hexo以外にも代表的なSSGには、Next.js、Gatsby、Hugoなどがあります。


## 1. 環境の準備

まず、Node.jsと[Git](https://gitforwindows.org/)がインストールされていることを確認してください。これらはHexoの動作に必要です。


## 2. Hexoのインストールと初期設定

Hexo CLIをインストールし、新しいHexoプロジェクトを初期化します。

```bash
npm install -g hexo-cli
hexo init my-blog
cd my-blog
npm install
```

## 3. Butterflyテーマのインストール

Butterflyテーマをインストールし、必要なレンダラーパッケージを追加します。

```bash
git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly
npm install hexo-renderer-pug hexo-renderer-stylus --save
```

`_config.yml`ファイルを編集し、テーマをButterflyに設定します。

```yaml
theme: butterfly
```

## 4. GitHubリポジトリの設定

GitHubで新しいリポジトリを作成し、ローカルリポジトリを初期化してリモートリポジトリを追加します。

```bash
git init
git remote add origin https://github.com/yourusername/your-repo.git
git add .
git commit -m "Initial commit"
git push -u origin master
```

## 5. Netlifyの設定とデプロイ

Netlifyにサインアップし、新しいサイトを作成します。GitHubリポジトリを選択し、ビルドコマンドと公開ディレクトリを設定します。

- **ビルドコマンド**: `hexo generate`
- **公開ディレクトリ**: `public`

デプロイが完了すると、Netlifyが提供するURLでサイトが公開されます。

## 6. カスタマイズ設定

### ロゴとアバターの設定

`_config.yml`ファイルを編集し、ロゴとアバターのパスを指定します。

```yaml
logo:
  enable: true
  path: /images/logo.png

avatar:
  enable: true
  path: /images/avatar.png
```

### ホーム画面のトップ画像の変更

`_config.yml`ファイルでトップ画像を指定します。

```yaml
index:
  top_img: /images/top-image.jpg
  top_img_height: 400px
```

### SNSやGitHubリンクの追加

`_config.yml`ファイルの`social`セクションを編集して、SNSやGitHubのリンクを追加します。

```yaml
social:
  fab fa-github: https://github.com/yourusername || Github || "#24292e"
  fab fa-twitter: https://twitter.com/yourusername || Twitter || "#00acee"
  fab fa-facebook: https://www.facebook.com/yourusername || Facebook || "#3b5998"
  fab fa-instagram: https://www.instagram.com/yourusername || fab fa-instagram || "#E4405F"
  fab fa-youtube: LinkedIn: https://www.youtube.com/channel/yourchannelid || Youtube || '#ff0000'
```

### 固定ページのタブ表示

`_config.yml`ファイルでナビゲーションバー設定を編集し、固定ページのタブを追加します。

```yaml
menu:
  Home: /
  Archives: /archives/
  Categories: /categories/
  Tags: /tags/
  About: /about/
```

固定ページを作成し、内容を編集します。

```bash
hexo new page 'about'
```

`source/about/index.md`を編集し、ページの内容を追加します。

```markdown
---
title: About
date: 2023-07-22
---

ここに自己紹介やサイトの説明を記載します。
```



公開したサイト
https://mwcportfolio.com/



## まとめ

これで、HexoのButterflyテーマを使用して静的サイトを作成し、Netlifyにデプロイする手順が完了しました。各設定をカスタマイズすることで、より魅力的なブログサイトを構築できます。SEO対策として、適切なメタタグやキーワードを追加することも忘れずに行いましょう。


## 参考記事

https://sj-note.com/hexo
https://noitaro.github.io/hexo-github-netlify/
Quick Start: Create an Identity Resolution Rulesetを実際に行ってみた

https://trailhead.salesforce.com/content/learn/projects/quick-start-create-identity-resolution-ruleset

+ [Get Started with an Identity Resolution Ruleset](https://qiita.com/Keiji_otsubo/items/060ffe06e751ffc094ba)

# Get Started with an Identity Resolution Ruleset

何もしないで検証ボタンをクリックする

:::note alert
We can't find the ruleset named 'Individual Match'. Make sure the label is correct and the Primary Data Model object is 'Individual', per the requirements.


「Individual Match」という名前のルールセットが見つかりません。要件に従って、ラベルが正しく、プライマリ データ モデル オブジェクトが「個人」であることを確認してください。
:::

順番がありそうだな

このバッジは、Data Cloud の概念を網羅したシリーズの一部です。このプロジェクトでは、プロファイルの統合に焦点を当てて、これらの概念の構築を続けます。このプロジェクトの手順を実行するには、まず「Data Cloud でデータストリームを作成する」バッジを完了してください。そのプロジェクトでは、ここで作成するルールセットに必要なデータとプロセスを設定します。このプロジェクトを完了するには、そのプロジェクトと同じ Developer Edition 組織を使用します。これらの Developer Edition は、14 日間の限定期間のみ利用可能です。組織の有効期限が切れる前に、このプロジェクトを完了してください。

**用語集**

+ **Source profile**:これらは、一致するプロファイルを識別するために ID 解決プロセス中に Data Cloud が確認するソース データ ストリームからのレコードです。
+ **Unified profile**:これらは、ID 解決によって処理されたプロファイルです。各統合プロファイルは、1 つ以上のソース プロファイルから作成されます。
+ **Unified contact objects**:個人や企業は、複数の有効な住所、電話番号、または電子メール アドレスを持つ場合があります。統合連絡先オブジェクトには、統合プロファイルに関連する情報が保存されます。1 つの統合プロファイル レコードは、複数の統合連絡先ポイントに関連付けることができます。
+ **これらのオブジェクトは、ソース データと統合プロファイル データ間のブリッジを提供し、統合プロファイルの各部分をいつでも元の場所まで追跡できるようにします。
+ **Unified link objects**:これらのオブジェクトは、ソース データと統合プロファイル データ間のブリッジを提供し、統合プロファイルの各部分をいつでも元の場所まで追跡できるようにします。
+ **Ruleset**: これは、ID 解決にソース プロファイルを一致および調整する方法を指示する一致および調整ルールのセットです。
+ **Match rules**:一致ルールは、2 つ以上のソース プロファイルを 1 つの統合プロファイルに統合するためにどのデータが一致する必要があるかを ID 解決に指示します。ルール セットには複数の一致ルールを含めることができます。各一致ルールは、ソース レコードを異なる方法で一致させる機会となります。たとえば、同じ名前とメール アドレスを持つすべてのプロファイルを一致させることができることを ID 解決に指示する一致ルールを 1 つ作成し、同じ名前と電話番号を持つすべてのソース プロファイルを一致させることができることを ID 解決に指示する 2 つ目の一致ルールを作成します。こうすることで、一致する名前を持つレコードが実際に同じ個人またはアカウントであることを確認するために必要なのは、メール アドレスまたは電話番号だけです。
+ **Match criteria**:各一致ルールには、少なくとも 2 つの一致条件が含まれている必要があります。レコードを一致させるには、一致ルール内のすべての条件を満たす必要があります。条件は、フィールドと一致方法で構成されます。たとえば、1 つの条件では、姓が完全に一致する必要があります。別の条件では、あいまい一致方法を使用して名を一致させることができます。
+ **Match method**:一致方法は、一致中にデータが処理および確認される方法です。一致方法が完全正規化の場合、データは正規化後に完全に一致する必要があります。完全正規化マッチングでは、名前 Robert とその一般的なニックネーム Bob は一致しません。一致方法があいまいの場合、名前 Robert とその一般的なニックネーム Bob は一致と見なされます。
+ **Reconciliation rule**:名などの特定のフィールドでは、ID 解決で、複数の一致ソース レコードからどのデータを出力統合プロファイルに保存するかを選択する必要があります。データは、値の頻度、最新性、または元のオブジェクトに基づいて調整できます。

3つのMatch rulesを設定したらIndividual.Individual Id の調整ルールに関する警告が表示されました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/447d1f8a-c25d-0eeb-4261-1dc6c4c38c4b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a9cdbea5-e4df-76a1-3dc9-b743c93b1ffc.png)
Rubyで配列から複数の値を削除する

Rubyで配列から複数の値を削除する方法が分からなかったので調べました。

元となる配列base_listと削除したい文字が入っている配列delete_listは以下です。

```
base_list = [1, 2, 2, 3, 'hoge', 'fuga', 'piyo'] # 元の配列
# => [1, 2, 2, 3, "hoge", "fuga", "piyo"]

delete_list = [2, 'fuga'] # 削除したい文字の配列
# => [2, "fuga"]

```

## -（マイナス） 指定した配列の要素を取り除いた新しい配列を返す

「`-`」を使って、`元の配列 - 削除したい文字`とすることで、指定文字が削除された新しい配列が作成されます。

```
new_list = base_list - delete_list
# => [1, 3, "hoge", "piyo"]

```

元の配列には変化はありません。

```
base_list
# => [1, 2, 3, "hoge", "fuga", "piyo"]

```

## **difference** 指定した配列の要素を取り除いた新しい配列を返す

`difference`メソッドでも同じようなことができます。

```
base_list = [1, 2, 2, 3, 'hoge', 'fuga', 'piyo'] # 元の配列
# => [1, 2, 2, 3, "hoge", "fuga", "piyo"]

delete_list = [2, 'fuga'] # 削除したい文字の配列
# => [2, "fuga"]

new_list = base_list.difference(delete_list)
# => [1, 3, "hoge", "piyo"]

```

## delete 指定した文字を自身から取り除く

指定した1文字だけをすべて削除したい場合はdelete()も使えます。

```
base_list = [1, 2, 2, 3, 'hoge', 'fuga', 'piyo'] # 元の配列
# => [1, 2, 2, 3, "hoge", "fuga", "piyo"]

base_list.delete(2) # 2を削除

base_list # 元の配列
# => [1, 3, "hoge", "fuga", "piyo"]
```

## 参考

instance method Array#-

https://docs.ruby-lang.org/ja/latest/method/Array/i/=2d.html

instance method Array#difference

https://docs.ruby-lang.org/ja/latest/method/Array/i/difference.html

instance method Array#delete

https://docs.ruby-lang.org/ja/latest/method/Array/i/delete.html
Chart.js を使用したグラフの表示確認手順

以下に手順を説明します。

#### 手順

1. **HTMLファイルの作成**
   - まず、上記のサンプルコードをテキストエディタにコピーし、ファイルとして保存します。ファイル名は `test.html` など、任意の名前で構いません。

2. **ファイルを保存**
   - テキストエディタでファイルを保存します。例えば、デスクトップや任意のフォルダに保存します。

3. **ブラウザでファイルを開く**
   - 保存したファイルをブラウザで開きます。以下の手順で行えます。
     1. ファイルが保存されたフォルダを開きます。
     2. `test.html` ファイルを右クリックし、`開く` もしくは `ブラウザで開く` を選択します。
     3. または、ブラウザを開き、アドレスバーに `file:///` を入力してファイルパスを指定する方法もあります。

4. **表示の確認**
   - ブラウザに表示されていることを確認します。

これで、Chart.jsを使ったグラフがブラウザに表示されるか確認できます。
単体テストマニュアル５ - 検証

## パラメータ化検証

パラメータ化検証とは、複数のテストケースで同じテストロジックを再利用する方法を指します。

### パラメータ化検証が解決する問題

たとえば、以下の `emailValidator` 関数をテストする場合：

```ts
export function emailValidator(email: string): boolean {
  const regex = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
  return regex.test(email);
}
```

このようなテストコードを書くことが考えられます：

```ts
describe("emailValidator", () => {
  it("should return true for a valid email", () => {
    const email = "valid-email@example.com";
    expect(emailValidator(email)).toBe(true);
  });

  it("should return false for a invalid email without domain extension", () => {
    const email = "valid-email@example";
    expect(emailValidator(email)).toBe(false);
  });

  it("should return false for a invalid email with extra dot at the end", () => {
    const email = "valid-email@example.";
    expect(emailValidator(email)).toBe(false);
  });

  it("should return false for a invalid email with missing '@'", () => {
    const email = "valid-email.example.com";
    expect(emailValidator(email)).toBe(false);
  });

  // ... ...
});
```

上記のすべてのテストケースは同じロジックを使用しており、入力と出力だけが異なります。

### パラメータ化検証 (Object) を使う

Vitest が提供する `it.each` API を使用して処理することができます。

これにより、複数の入力値と出力値に対して同じテストロジックを繰り返し実行することが容易になります。

テストケースの失敗を迅速に特定するためには、説明情報にプレースホルダーを使用することが重要です。

これにより、どのテストケースが失敗したかを容易に識別できます。

```ts
describe("emailValidator", () => {
  it.each([
    { email: "valid-email@example.com", expected: true },
    { email: "valid-email@example", expected: false },
    { email: "valid-email@example.", expected: false },
    { email: "valid-email.example.com", expected: false },
  ])(
    "should return $email when validating $expected",
    ({ email, excepted }) => {
      expect(emailValidator(email).toBe(excepted));
    }
  );
});
```

オブジェクトを使用して入力と出力を構築する場合、プレースホルダーとして `$parameterName` の形式を使用することができます。

> オブジェクトを使用する方法は可読性が高くなります。

## 重重複する検証をカプセル化する

重複する検証文をなるべく関数にカプセル化して、理解しやすい名前をその関数に付けることが望ましいです。

コード例：

```ts
function assertCognito(
  cognito: CognitoIdentityProvider,
  isListUsersCalled = true
) {
  const callArgs = {
    UserPoolId,
  };

  if (isListUsersCalled) {
    expect(cognito.listUsers).toHaveBeenCalledWith(callArgs);
  } else {
    expect(cognito.listUsers).not.toHaveBeenCalledWith(callArgs);
  }

  expect(cognito.listUsersInGroup).not.toHaveBeenCalledWith({
    UserPoolId,
    GroupName: "admin",
  });
  expect(cognito.listUsersInGroup).not.toHaveBeenCalledWith({
    UserPoolId,
    GroupName: "flt",
  });
}
```
YouTube動画をAIに要約させる方法2選

この前（ほぼ一年前だが）はPDFを要約させるAIツールを紹介いたしましたが、AI技術の発展につれて、今は画像やテキスト形式の書類だけでなく、音声・映像形式のメディアコンテンツも、AIが認識し内容を要約させることができるようになりました。今回はGemini、RecCloudとChatGPTという3つのYoutube動画要約AIツールとその使い方を紹介しますが、これで長いYoutube動画の理解がより効率的になるでしょう。

<h2>Youtube動画要約AIツール</h2>
<ol><strong><li><strong>Gemini</li>
<li>RecCloud</li></strong></ol>

<h3 class="order" id="_1">Gemini</h3>
GeminiはGoogleが開発されたAIモデルで、チャットボットとして利用できます。YouTubeはご存知だと思いますが、同じくGoogleによって運営されています。同じ会社の製品なので、連動されるのも当然で、GeminiはYouTube動画要約AIとして利用できます。使い方は次の通りです。

<b>GeminiにYouTube動画をまとめさせる手順</b>

![gemini-chatbox-prompt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217547/eb4a1761-42bd-8668-ac50-68bb000903e8.jpeg)
<ol><li>「<a href="https://gemini.google.com/">Gemini</a>」のウェブサイトにアクセスし、Googleアカウントでログインします。</li>
<li>チャット画面が表示され、チャット欄に要約したいYoutube動画のURLを貼り付け、「このYouTube動画をステップバイステップで要約してください」などと、プロンプトをURLの後に続いて入力して発送します。</li>
<li>それで、ユーチューブ動画の内容をGeminiのAIが解析し、要約した結果が表示されます。</li></ol>

![gemini-youtube-summarization-result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217547/7fbf2f5a-0ceb-0a38-b16c-3b60580345c4.jpeg)

<b>使用感</b>
<ul><li>使い方が簡単</li>
<li>無料で利用可能</li>
<li>アプリ版のGeminiもある</li></ul>

<h3 class="order" id="_2">RecCloud</h3>
<a href="https://reccloud.com/jp">RecCloud</a>はAI動画・音声処理ツールのオンラインプラットフォームで、ウェブサイトからはブラウザだけで文字起こし、動画字幕、動画翻訳、テキスト読み上げ、文字から動画生成、動画要約などのAIツールを利用できます。RecCloud動画要約AIはYouTubeビデオだけでなく、ローカルPCから動画ファイルをアップロードして解析させることも可能です。

<b>RecCloudでYouTube動画要約する方法</b>
![reccloud-youtube-summarizer-ai.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217547/2531b027-37c7-f1f5-7c17-ca85ed1ef721.jpeg)

<ol><li><a href="https://reccloud.com/jp/chat-video">RecCloud動画・音声要約AIツール</a>のURLを開き、緑の「使ってみる」ボタンをクリックします。</li>
<li>Youtube動画のリンクをブランクにコピーペーストし、右側の「まとめ」をクリックします。</li>

![paste-youtube-url-reccloud.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217547/9732da92-9db8-9d03-832b-c7eba8c3b5ec.jpeg)
<li>しばらくすれば、動画が解析され、要約が自動生成され、字幕の確認や追加で質問もできます。</li>
</ol>

![reccloud-youtube-summarization-online-tool.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217547/5fa25f84-bb7f-47b0-f36e-b01f414ba80a.jpeg)

<b>使用感</b>
<ul><li>洗練されてシンプルな要約内容</li>
<li>インターフェースがわかりやすい</li>
<li>Android/iOS対応のアプリ版RecCloudもある</li>
<li>有料</li></ul>

<h4>比較</h4>
使ってみたところ、YouTubeビデオ要約は無料で簡単な<strong>Gemini</strong>がおすすめです。しかし、<strong>RecCloud</strong>もローカル動画要約の対応、見やすい画面と追加の機能といったメリットがあります。個人の体験では、RecCloudがまとめたYouTubeの内容は、シンプルでChatGPT感があり、おそらくChatGPTのAPIを利用していると思います。GeminiよりChatGPTが好きな方、またはYouTube以外の動画をAI要約したい方は、有料でもよければ、RecCloudも捨てがたいかもしれませんね。
ローカルでMD5つけてからAWSコンソールでアップしてみる

```python
import json
import hashlib

def calculate_md5(file_path):
    """ファイルのMD5ハッシュを計算する"""
    hash_md5 = hashlib.md5()
    with open(file_path, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hash_md5.update(chunk)
    return hash_md5.hexdigest()

def add_md5_to_json(json_file_path, md5_value):
    """JSONファイルにMD5ハッシュ値を追加する"""
    with open(json_file_path, 'r') as f:
        data = json.load(f)
    
    data["x-amz-meta-md5"] = md5_value
    
    with open(json_file_path, 'w') as f:
        json.dump(data, f, indent=4)

# ファイルのパス
file_path = 'path/to/your/file'
json_file_path = 'path/to/your/jsonfile.json'

# MD5ハッシュ値を計算
md5_value = calculate_md5(file_path)

# JSONファイルにMD5ハッシュ値を追加
add_md5_to_json(json_file_path, md5_value)

print(f"MD5 hash {md5_value} added to JSON file.")
```
放棄された静的解析ツールLarastanを削除し推奨されているLarastanを導入

# はじめに

- こちらの[Packagistのサイト(nunomaduro/larastan)](https://packagist.org/packages/nunomaduro/larastan)にも記載しておりますが、
nunomaduro/larastanは放棄され保守されていないということございますので、
作者の提案通り[larastan/larastan](https://packagist.org/packages/larastan/larastan)を代わりに導入いたします。
> This package is abandoned and no longer maintained. The author suggests using the larastan/larastan package instead.

- 私はcomposer.jsonの警告にて気がつくことができました。

## 環境
- sail v8.3
- Laravel 11.14.0
- VSCode

## 前提条件

- 拡張機能[PHPStan](https://marketplace.visualstudio.com/items?itemName=SanderRonde.phpstan-vscode)が導入されていること
- settings.jsonにこちらの設定があること
```
    "phpstan.enabled": true,
    "phpstan.configFile": "phpstan.neon",
    "phpstan.memoryLimit": "1G",
    "phpstan.checkValidity": false,
```


# 手順

### (使用していれば)こちらのコマンドでnunomaduro/larastanを削除
```
sail composer remove nunomaduro/larastan     
```

### こちらのコマンドでlarastan/larastanを導入
```
sail composer require --dev larastan/larastan
```

### プロジェクトルートのphpstan.neonを編集(無ければ新規作成)
```
includes:
    - ./vendor/larastan/larastan/extension.neon

parameters:
    level: 5
    paths:
        - app
        - bootstrap
        - config
        - database
        - packages
        - routes
        - tests
```

- <font color="Red">includesの箇所に注意してください</font>
- levelに関しましてはこちらを参考に調整してください
    - https://phpstan.org/user-guide/rule-levels

### VSCode再起動!

### 除外設定
- 仕方のない箇所の除外設定
(ファイル単位で行うこともできますが私は行単位で実施いたしました。)

- Http/Controllers/Auth/VerifyEmailController.php 
    - 参考： https://jamesclark32.dev/articles/phpstan-and-laravel-breeze
```
        if ($request->user()->markEmailAsVerified()) {
            /** @phpstan-ignore-next-line */
            event(new Verified($request->user()));
        }
```

- routes/console.php
    - 参考: https://y-ni-shi.hatenablog.com/entry/2022/07/03/003358
```
Artisan::command('inspire', function () {
    /* @phpstan-ignore-next-line */
    $this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote')->hourly();
```

## 余談
- 動いているか不安でしたらこちらのコマンドでも実行可能です。
```
./vendor/bin/phpstan analyse --memory-limit=1G  
```

# 参考にさせていただきました:bow:
- [Larastan(PHPStan)のレベルを5から6(以上max未満)に上げたときの話](https://qiita.com/shimabox/items/df03dde8bd6db4733231)
単体テストマニュアル２ - 最初の単体テストを作成する

## 単体テストの最小単位

単体テストでは、関数ではなく、**機能を最小単位として**テストすべきです。

### 関数を単位としてテストする問題点

伝統的な単体テストでは、関数を単位としてテストします。

1. 私的なメソッドとエクスポートされていない関数

   エクスポートされていない場合、テストが困難になります。

   エクスポートすると、モジュールのカプセル化に影響します。

   結果として、これらの私的なメソッドはテストされなくなることが多いです。

2. 関数ごとにテストを行う場合、後にロジックの構造を調整する必要が生じた場合、テストの構造も変更する必要があります。

   これにより、機能のメンテナンスに加えて、テストのメンテナンスも必要になります。

### 機能を単位として

> **単位レベルの機能テスト** は [Test Driven Development: By Example](https://www.oreilly.com/library/view/test-driven-development/0321146530/) に由来します。

正しいアプローチは、機能を単位として単体テストを行うことです。

各関数に対して単体テストを書くのではなく、**一つの機能を単位として**テストを書きます。

システムは様々な機能で構成されており、機能を単位としてテストすることで、具体的な機能実装のロジック構造を調整しても、テストを変更する必要がなくなります。

これにより、私的なメソッドに対するテストも不要になります。

機能を単位とした単体テストはより丈夫です。

## 単体テストを作成する四つのステップ

<!-- prettier-ignore -->
| Steps |  |  |
| --- | --- | --- |
| 1. テスト用データを準備 | given | Arrange（準備） |
| 2. **テスト対象の機能/関数を呼び出す** | when | Act（実行） |
| 3. **機能の出力を検証** | then | Assert（検証） |
| 4. ティアダウン |||

> Arrange-Act-Assert (AAA) パターンに従う：準備（Arrange）、実行（Act）、アサート（Assert）。

第一歩と第四歩は必ずしも必要ではありませんが、第二歩と第三歩は必要です。

例えば、`sayHi` をテストする時に、データの準備は必要ありません。

```ts
function sayHi() {
  console.log("Hi!");
}
```

テスト中にはグローバルなデータやキャッシュを扱うことがありますが、これらは後で元に戻す必要があります。
これがティアダウンの役割です。

しかし、そのようなデータに関わらない場合は、ティアダウンは必要ありません。

## 最初の単体テストを作成する

以下の単体テストを行ごとにコメントで解説します。

```ts
import { test, expect } from "vitest";
import { useTodoStore, reset } from "../todo.ts";

// テストケースは説明的な英語で記述し、テストの目的を明確になるようにします。
test("add todo", () => {
  // 1. テスト用データを準備
  const todoStore = useTodoStore();
  const title = "eat";

  // 2. テスト対象の機能/関数を呼び出す
  useTodoStore.addTodo(title);

  // 3. 機能の出力を検証
  expect(todoStore.todos[0].title).toBe(title);

  // 4. ティアダウン
  reset();
});
```
単体テストマニュアル１ - プロジェクトにテスト環境を構築する

## インストール Vitest

以下のコマンドで、Vitest をインストールします。

```bash
pnpm i vitest -D
# あるいは
yarn add vitest -D
# あるいは
npm i vitest -D
```

> Vitest が Develop 環境に使われるので、`-D` を必ずつけてインストールしてください。

> `pnpm` でインストールするのがおすすめです。

## `vitest.config.ts` 設定

もしプロジェクト内に `vitest.config.ts` と `vite.config.ts` が共存する場合、`vitest.config.ts` の設定が `vite.config.ts` の設定よりも優先され、上書きされます。

以下の `vitest.config.ts` ファイルを行ごとにコメントで解説します。

```ts
// `vitest/config` の `defineConfig` を使用します。
import { defineConfig } from "vitest/config";
import path from "path";

// glob パターンを利用して、
// テストに含む全てのファイルを定義します。
const include = [
  "shared/**/*.spec.{ts,js}",
  "auth/**/*.spec.{ts,js}",
  "public/**/*.spec.{ts,js}",
  "components/**/*.spec.{ts,js}",
  "features/**/*.spec.{ts,js}",
];

// カバレッジに含む全てのファイルを定義します。
const coverageInclude = [
  "shared/**/*.{ts,js}",
  "auth/**/*.{ts,js}",
  "public/**/*.{ts,js}",
  "components/**/*.{ts,js}",
  "features/**/*.{ts,js}",
];

// テスト不要のファイルを定義します。
const defaultExclude = [
  // node_modules に含まれる .ts と .js 拡張子のファイル
  "node_modules/**/*.{ts,js}",
  // パッケージング後の成果物に含まれる .ts と .js 拡張子のファイル
  "out/**/*.{ts,js}",
  // E2Eテストとコンポーネントテストのディレクトリに含まれる .ts と .js 拡張子のファイル
  "tests/**/*.{ts,js}",
  // 設定ファイル
  "**/*.config.{ts,js}",
  // story に関するファイル
  "**/*.stories.{ts,js}",
  ".storybook/*.{ts,js}",
  // .next に含まれる .ts と .js 拡張子のファイル
  ".next/**/*.{ts,js}",
  // 型定義ファイル
  "**/*.d.ts",
  // ダミーデータを定義しているファイル
  "**/*dummy*.{ts,js}",
  "**/*sample*.{ts,js}",
  // スタイルファイル
  "**/*Style*.{ts,js}",
];

// glob パターンマッチングでカバーされていない、テスト不要のファイルは指定されたパスで除外します。
const specificFilesExclude = [
  // 特定のファイルのパス
  "auth/aw-exports.ts",
  "components/input/IconInputValidation.ts",
  // ...
];

// テスト不要の全てのファイルを定義します。
const excludedFiles = [...defaultExclude, ...specificFilesExclude];

export default defineConfig({
  // `vitest` を設定するには、設定ファイルに `test` 属性を追加する必要があります。
  test: {
    // Vitest のデフォルトのテスト環境は Node.js 環境です。
    // Webアプリケーションを構築している場合は、Node.js を jsdom や happy-dom などのブラウザライクな環境に置き換えることができます。
    environment: "happy-dom",
    // テストファイルを含む glob パターンを定義します。
    include,
    // テストファイルを除外する glob パターンを定義します。
    exclude: excludedFiles,
    // テストカバレッジデータを収集するには、coverage 属性を追加する必要があります。
    coverage: {
      // provider でテストカバレッジデータを収集するツールを選択します。
      provider: "v8",
      // テストカバレッジデータの収集を有効にします。
      enabled: true,
      // テストが失敗しても、カバレッジレポートは生成されます。
      reportOnFailure: true,
      // テストカバレッジレポーターの形式を設定します。
      reporter: ["text", "json", "html"],
      // テストカバレッジに含まれるテスト対象の glob パターンを定義します。
      include: coverageInclude,
      // テストカバレッジから除外されるテスト対象の glob パターンを定義します。
      exclude: excludedFiles,
    },
  },
  resolve: {
    alias: {
      "@": path.resolve(__dirname, "./"),
    },
  },
});
```

## ディレクトリ構造

テストファイルはテスト対象モジュールと並列に `__tests__` ディレクトリに配置します。

```bash
store
  ├── __tests__
  │       ├── utils
  │       │     └── index.spec.ts
  │       └── count.spec.ts
  ├── count.ts
  └── utils
        └── index.ts
```

`store` ディレクトリにさらに深いディレクトリ構造が存在する場合は、`__tests__` ディレクトリも同じ構造を維持するべきです。

## テストファイルの命名

各テストファイルは一つのモジュールまたはコンポーネントのみをテストします。

テストファイルの命名は `*.spec.ts` をします。

例えば、`count.ts` のテストファイルは `count.spec.ts` とします。
MySQL と PostgreSQL 地味に違うところ

よく比較記事があるので大きな違いとかはそういうのを参考にするとして、もっと細かい機能の違いをメモしておきます。

違うところ、とタイトルをつけましたが、 **どっちかというと「MySQL出来ないことリスト」** みたいなことになりそう。壁にぶつかる度に増やしていきます。

# チェック制約にストアド関数が着かない

ソースはこちら。

https://dev.mysql.com/doc/refman/9.0/en/create-table-check-constraints.html

> Stored functions and loadable functions are not permitted.

MySQLではチェック制約はあくまでもそのテーブル内の情報で制約をつくるようです。

これがなにが困るかというと、ストアド関数が書けないと言うことはつまり、別のテーブルを参照したチェックが出来ないんですよね。SQLAlchermy の Joined Table Inheritance（結合テーブル継承）を使っていると、「自分のカラムと親テーブルのカラムの複合で一意」とかを表現したくなるんですが、それができないのです。

# トランザクションの制約検査のタイミングが設定できない

ソースはこちら

https://dev.mysql.com/doc/refman/9.0/en/ansi-diff-foreign-keys.html

> InnoDB checks foreign key constraints immediately; the check is not deferred to transaction commit.

これは外部キー制約ですが、PostgreSQLでは外部キー制約の評価をコミット時まで遅延させられられすオプションがあるのですが、MySQLでは即時評価しかないようです。

これも地味にしんどかった。ちょっと条件は忘れてしまいましたが、制約が循環するようなデータ（最終的には整合性が保てているが、途中では片方の制約が違反の状態が生まれる）をどうしてもつくりたくて、結局制約を断念した経緯があり、この制限に悩まされました。


 # DROP CONSTRAINT に IF EXISTS をつけられない
 
PostgreSQLとの違いというか、MySQL ではこの方言を採用していないです。

ソースというか 2006 年に却下されているのがこちら

https://bugs.mysql.com/bug.php?id=5746

> I do not think that addining new (non-standard) IF EXISTS subclauses to ALTER TABLE is needed.

この機能が無いのでマイグレーションがわりとめんどくさいことになります。

なんと MariaDB にはあるらしい。頑なに採用してない is 何故。

# マテリアライズドビューがない

これは有名ですかね。サブクエリをマテリアライズドビューにして速度改善、みたいなことは出来なさそうです。

ソースというかないものはないのですが、こちら。

https://dev.mysql.com/doc/refman/8.0/ja/faqs-views.html#faq-mysql-have-materialized-views

> MySQL 8.0 にはマテリアライズドビューはありますか。 
> いいえ。
プログラミングスクール不要？ChatGPTを使ったプログラミング学習が最強すぎる！

## はじめに
はじめまして
エンジニアを目指して学習中のものです。

以前（4年前くらい）にもプログラミング学習をしていたのですが、ChatGPTの到来によりその様相がかなり変わっていたので、記事を書こうと思いました。

４年前だと、ChatGPTはまだなく、プログラミング学習と言えばプログラミングスクールを使うか、プロゲートを使うかといった感じで、とにかくプログラミング学習サービスを使うしか手がありませんでした。

プログラミングスクールとなるとかなり高額だった印象があります。

それがChatGPTの到来により、プログラミング学習の環境が大きく変わっており感動している今この頃です。
ぜひ、これからプログラミング学習を始める方や、さらにプログラミング能力を上げたい方にはChatGPTを使ってこの感動を体感していただきたいと思います。

## プログラミング学習の進め方
ChatGPTの登録をまずはしておく必要があります。

登録はこちらから
https://chatgpt.com/

### アプリ作成の例
ChatGPTはプロンプト（何を入力指示するか）が重要です。
私の場合は以下のような感じで入力してChatGPTに教えてもらっています。
今回はアプリを一から作成するときの例。

``` ChatGPT:ChatGPT
英語で考えて日本語で答えて

これからメモアプリを作成します。
MEANスタックを使ってアプリを作成してください。
```

結果がこちら
このように、インストールから教えてくれます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835533/6c335893-c786-cf27-2364-c30933606c27.png)

コードもファイルごとにきちんと書いてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835533/8451b7fe-0d1c-5ca7-9695-36698209a0eb.png)

### エラー対処の例

表示されたエラーを貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835533/fa52115e-119e-1818-c06c-f1287906abd8.png)

すると、解決策を教えてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835533/c7bcaa80-afdb-4595-27ce-edbb837925c8.png)

## ほかにも
どんなアプリを作るべきかの相談にも応えてくれますし、プログラミング以外のことも教えてくれます。
ChatGPTはプログラミング学習に特化しておらず、色んな事に応えてくれるのが使えるポイントですね！

## 学習効果を最大化するために！
ChatGPTから出力されたコードをコピペして実際にアプリを動かしてみると、なんとなく全体像が見えてきます。

もちろんこれだけでも何となくは学習できるのですが、ChatGPTが出力したコードの一つひとつの意味を理解することがさらなる学習効果をもたらしてくれます。

ChatGPTも間違えるときがあります。ChatGPTが出力したコードを貼りつけても上手く動かない時そんな時こそ学習のチャンスうまく行かないのはなぜなのか処理を一つひとつ理解しながら追っていくと解決策が見つかります。

## 最後に
ChatGPTのプログラミング学習活用で有益な情報があればどんどん共有いただけるとありがたいです。
私も良さそうな情報があれば都度共有させていただきます。

最後まで読んでいただきありがとうございました。
【応用情報技術者試験】記載した記事のまとめ

# 概要
自分が記載した、応用情報技術者試験に関連した記事を纏めました。
※随時追加予定。

# 勉強方法や採点方法
- [勉強方法や採点方法まとめ](https://qiita.com/MetroOsamu/items/4ec8e49c12ea8a764d09)

# 英単語
- [頻出する覚えておきたい英単語まとめ](https://qiita.com/MetroOsamu/items/2fea10e81d2ed92957dc)
- [数字+アルファベット一文字のワードまとめ](https://qiita.com/MetroOsamu/items/3bb574ca1c7468d56328)
- [同じ略語で異なる意味をもつ単語まとめ](https://qiita.com/MetroOsamu/private/5480e26bcb9d7264c7d3)

# ソート、探索アルゴリズム
- [ソートアルゴリズムを理解するリンク集](https://qiita.com/MetroOsamu/items/5641d59500b1c143d78c)
- [探索アルゴリズムを理解するリンク集](https://qiita.com/MetroOsamu/items/716114bb2b4786ba1f8e)

# 〇〇とつくワードまとめ
- [末尾に「エンジニアリング」とつくワードまとめ](https://qiita.com/MetroOsamu/items/2931000ba1978151f896)
- [末尾に「イノベーション」とつくワードまとめ](https://qiita.com/MetroOsamu/items/91fc5604591246ef1c95)
- [「チャネル」とつくワードまとめ](https://qiita.com/MetroOsamu/items/b353dc6d97138af220b5)
- [末尾に「マネジメント」とつくワードまとめ](https://qiita.com/MetroOsamu/items/3fb8d5dc80afa9a5d0a5)

# イメージで覚える
- [各プリンタの概要と動作イメージのリンク集](https://qiita.com/MetroOsamu/items/0edead7d5e8f3cf6cfaa)

- [出題単語に関連するサイト、Webページのまとめ【イメージ記憶】](https://qiita.com/MetroOsamu/items/30d3c93ec4c113b42409)

- [3Dコンピュータグラフィックスやイラストレーションの技法について、イメージがつきやすくなる動画のリンク集](https://qiita.com/MetroOsamu/items/31beb08083d2bf519b42)

# 事例集
- [セキュリティ攻撃の事例集](https://qiita.com/MetroOsamu/items/f11012a633187d5a9a60)
- [ストラテジ用語に関連する実際の事例集](https://qiita.com/MetroOsamu/items/87ae338ad3642a63cdfd)
# その他の用語関連

- [ISO規格まとめ](https://qiita.com/MetroOsamu/items/8f26ac685af013c6257a)
- [工数見積もり方法のまとめ](https://qiita.com/MetroOsamu/items/1883315861cef82aaf33)
- [企業の利益や決算書に関するワードのまとめ](https://qiita.com/MetroOsamu/items/20e9f8d728d24cab1848)
- [メモリに関する用語まとめ](https://qiita.com/MetroOsamu/items/b0d6a07b543a21c49040)
- [グラフの曲線まとめ](https://qiita.com/MetroOsamu/items/3cbfe9401c69e2e8cc96)
robloxでassistant その140

# 概要
robloxでassistantやってみた。
stringをテストしてみた。

# サンプルコード

```
print("Hello world!")


a = string.len("ok")
print(a)

b = string.format("%s  %d", "jj", 25)
print(b)	
print(string.char(48))
print(string.byte("0"))
print(string.lower("A"))
print(string.sub("ABC", 1, 2))
print(string.find("ABC", "C"))
print(string.gsub("ABCDEFG", '[^A=]', ''))
print(string.match("ABC1234", "%d+"))


for l in string.gmatch("a b c", "[^ ]+") do
	print(l)
end
```

# 実行結果

```
  10:29:56.598  Hello world!  -  クライアント - LocalScript:1
  10:29:56.598  2  -  クライアント - LocalScript:5
  10:29:56.598  jj  25  -  クライアント - LocalScript:8
  10:29:56.598  0  -  クライアント - LocalScript:9
  10:29:56.598  48  -  クライアント - LocalScript:10
  10:29:56.599  a  -  クライアント  - LocalScript:11
  10:29:56.599  AB  -  クライアント - LocalScript:12
  10:29:56.599  3 3  -  クライアント - LocalScript:13
  10:29:56.599  A 6  -  クライアント - LocalScript:14
  10:29:56.599  1234  -  クライアント - LocalScript:15
  10:29:56.600  a  -  クライアント - LocalScript:19
  10:29:56.600  b  -  クライアント - LocalScript:19
  10:29:56.600  c  -  クライアント - LocalScript:19
```

以上。
URLからショート動画をつくるツール


ソーシャルワイヤー株式会社が、ニュースをより直感的かつ効率的に楽しむための革新的なプラットフォーム「8beat」を開発しました。
[![](https://storage.googleapis.com/zenn-user-upload/a1618c560959-20240722.jpg)](https://8beat.ch)

## 世はショート動画時代
わたし個人の話をします。何かを調べるときはもっぱらYouTubeやTikTokで情報を得るようになりました。というよりも、TikTokに関しては用もないのに無駄に開いて時間を溶かしているくいらいです。
TikTokの名前を聞き始めたときは「女子高生のSNS」「女性が踊っているSNS」というイメージがあったのに、今や暇な時間ができたらつい開いて、ついショート動画を流し見しています。
今TikTok利用層は、**20代が47.9%、30代が27.3%のようです**[^1]。わたしのようについついショート動画を流し見してしまう方は多いんじゃないでしょうか。
[^1]: https://www.cross-m.co.jp/column/digital_marketing/dmc20240426/ 参照

## URLを入れるだけでショート動画を作成
今回開発された「8beat（エイトビート）」。**ユーザーはURLを入力するだけで、ショート動画を生成することができます**。生成した動画をダウンロードし他のSNSやウェブサイトにも簡単に共有可能です。

### 動画生成の手順
1. [8beat](https://8beat.ch/jp)にアクセス
2. URL入力
3. 1分程度で生成（サーバー状況による）
4. 15秒～30秒程度のショート動画

※動画生成サーバーが空いていれば1分程度で動画が生成されます。
※生成されるショート動画の長さは15秒～30秒程度です。

### 注意点
利用に際しては、8beatの利用規約とコミュニティーガイドラインの遵守が求められます。
[8beat利用規約](https://docs.8beat.ch/docs/terms)
[コミュニティーガイドライン](https://docs.8beat.ch/docs/community-guidelines)

### 料金
完全無料です。しかもアカウント登録しなくても動画を作成いただけます。（公開は登録必要）


## 何を目的としているか？
世の中のテキスト記事がもっと見られるように、ショート動画を入口にできないかと考えてつくられているツールです。
VisualRegressionTest実行をreg-suitからreg-cliへ移行

## reg-cliへの移行を考えたきっかけ
現在チームではVisualRegressionTestを、CI(Bitrise)上のreg-suitで毎晩定期実行しています。
運用してから1年程度経過し、以下のような課題が出ました。

1. VRT対象画面がよく変更になるため、そこそこの頻度で正解データの変更をする必要があった(頻度的には平均すると10日に1回程度)
1. 実行時間がそこそこ長い(40枚程度をテスト完了するのに25分程度)
1. 稀に `reg-suit run` 実行後エラーが起きる(頻度的には平均すると週1回程度)


## reg-suitからreg-cliへ移行した時のメリット
1. CI環境実行時正解データの変更が割と容易になる
現在正解データ格納場所は所定のクラウドストレージ(GoogleCloudStorage or AWS S3)となっているため、GUIで手順通りにやれば誰でも正解データは入れ替え可能ですが、少々煩雑で操作が直感的ではない等の問題があります。
reg-cliに移行すると、Github管理された場所に正解データを置くため、正解データのディレクトリごと置き換えるだけとなります

1. VRTとしての比較精度は変わらないままCI上の実行時間が短くなる
reg-suit内ではreg-cliを実行しているため、一番大事な精度面の差分はありません。
CIでの実行時は毎回 `npm install reg-suit` が走るためインストールコストもreg-cliに比べるとばかになりません
また、クラウド上から正解データをDLする処理もなくなるため、現在も平均値を出すため中期で計測中ですが2~3割程度の高速化は見込めそうです(別途正解データを置く場所によってはDLは必要です)

1. ローカル環境でテスト実行から正解データ反映までが容易
ローカル環境にreg-cliを入れる必要はありますが、ローカルでテスト実行から正解データ変更までを容易に行えます

## reg-suitからreg-cliへ移行した時のデメリット
1. テスト結果の保存問題
reg-suitではクラウド上に正解データ及びテスト結果が保存されるため、見たい時に結果を見返せるが、reg-cliへ移行と同時にテスト結果の保存については考える必要があります（正解データはGithub管理なので問題なし）
Bitriseではテスト結果データを一時的に保存できるが1週間までのため、もしもそれが要件に合わないようであれば移行は考えたほうがよいです

1. テスト結果のSlack通知
regconfig.jsonに書いておけばあとはCI上でreg-suitを実行するだけてSlackへの結果通知までやってくれていたのを、自前で実装する必要があります。

1. 運用・保守コスト
上に上げた2点で問題が起きると、reg-suitの場合は識者が直してくれるかもしれませんがreg-cliの場合は自身でメンテする必要があります

## 実装比較

```RegSuit_bitrise.yml
npm install -g reg-suit
npm install

# Pluginのインストール
npm i reg-notify-slack-plugin -D
echo N | reg-suit prepare -p notify-slack
npm i reg-publish-gcs-plugin -D
echo N | reg-suit prepare -p publish-gcs

npm i reg-simple-keygen-plugin -D
echo N | reg-suit prepare -p simple-keygen

export BUCKET_NAME=${BUCKET}
export EXPECTED_KEY=${DIRECTORY}/'expected'
export ACTUAL_KEY=${DIRECTORY}/${ACTUAL}
export ACTUAL_DIR=${SAVED_ACTUAL_DIR}
export SLACK_WEBHOOK_URL=${SLACK_WEBHOOK_URL}
export GOOGLE_APPLICATION_CREDENTIALS='/tmp/gcloud-service-account-key.json'

# テスト結果のスクショを所定の場所に移動してリネーム
mv ${VDTESTING_DOWNLOADED_FILES_DIR}/${IMAGE_PREFIX}*.png ./${SAVED_ACTUAL_DIR}/
cd ${SAVED_ACTUAL_DIR}
ls | sed -r "s/($IMAGE_PREFIX)(screenshottest[_a-z0-9]+)\.png/mv & \2.png/g" | bash
cd ..

# 実行
reg-suit run
```

```RegCli_bitrise.yml
npm install -g reg-cli

# テスト結果のスクショを所定の場所に移動してリネーム
mv ${VDTESTING_DOWNLOADED_FILES_DIR}/${IMAGE_PREFIX}*.png ./${SAVED_ACTUAL_DIR}/
cd ${SAVED_ACTUAL_DIR}
ls | sed -r "s/($IMAGE_PREFIX)(screenshottest[_a-z0-9]+)\.png/mv & \2.png/g" | bash
cd ..

# 実行
reg-cli ./actual ./expected ./diff -R ./report.html

# 実行スクショの保存
tar zcvf actual.tar actual

# Slackへの通知(専用ワークフローがあり、それをafer_runで呼び出すだけのため割愛)
```
picoGym Exclusive writeup Picker II

## Picker II (Reverse Engineering)

Can you figure out how this program works to get the flag? Connect to the program with netcat: $ nc saturn.picoctf.net 57878 The program's source code can be downloaded here.

添付ファイル
・picker-II.py

picker-II.pyを見てみる。win関数がある。
```
def win():
  # This line will not work locally unless you create your own 'flag.txt' in
  #   the same directory as this script
  flag = open('flag.txt', 'r').read()
  #flag = flag[:-1]
  flag = flag.strip()
  str_flag = ''
  for c in flag:
    str_flag += str(hex(ord(c))) + ' '
  print(str_flag)
```
が、しかし、
```def filter(user_input):
  if 'win' in user_input:
    return False
  return True
```
winが入っているとはじかれるらしい。
```
if( filter(user_input) ):
    eval(user_input + '()')
```
入力を実行してくれるみたいだ。
`open('flag.txt', 'r').read()`を`print`で出力させる。
```
> nc saturn.picoctf.net 53805
==> print(open('flag.txt', 'r').read())
picoCTF{f1l73r5_f41l_c0d3_r3f4c70r_m1gh7_5ucc33d_95d44590}
'NoneType' object is not callable
```
フラグが得られた。

`picoCTF{f1l73r5_f41l_c0d3_r3f4c70r_m1gh7_5ucc33d_95d44590}`
yukicoder No.21 平均の差　解説

[問題文](https://yukicoder.me/problems/no/21)

# 解説
先に言う。答えは**Aの要素の最大値と最小値の差**である。
では、なぜそうなるかの説明をする。
まず、$K\leq 3$である。そのため、{Aの最小値}{Aの最大値}{その他}...という組み合わせができるはず。
また、平均は大きいものと小さいものがあったら、その真ん中に行くという優柔不断なやつ。そのため、できるだけ平均の差を大きくしたいのなら**Aの最小値単体とAの最大値単体で組めばいいじゃないか**。
そういう理論で解ける。

そしてコードを楽して書きたい。そういう人もいるのではないか。
簡単な解法なら、Aを昇順ソートする。そして、cout<<$A_{N-1}-A_0$<<endl;をする。
必ず最小値は$A_0$,最大値は$A_{N-1}$にくるので、その差を求めればAC。

# C++23での解法例

```C++
#include <bits/stdc++.h>
using namespace std;

int main(){
  int n,k;cin>>n>>k;
  vector<int> a(n);
  for(int i=0;i<n;i++)cin>>a[i];
  sort(a.begin(),a.end());
  cout<<a[n-1]-a[0]<<endl;
}
```
RX210でLチカ

秋月電子の秋葉原店の2Fで、数年前にAE-RX210の基板を店舗限定アウトレットセールで100円(税込)で購入しました。定価は2780円だったようです。

RX210はルネサス社製の32Bitマイコンです。RX210の開発環境はルネサスからオリジナルのコンパイラーを使ったCS+とgccを使ったe2 studioが提供されています。

私が買った時には壁際の棚の箱の中にはAE-RX210は二枚しかなくて、片方は明らかな実装ミスがあり、片方はとくに問題なさそうだったので、問題ないほうを買ってきました。

帰ってきて調べたらAE-RX210はチップが変更されていて、変更前のR5F52108の基板でした。またSW3のタクトスイッチが実装されていません。

RX210にはE1やE2のデバッガーかシリアルでflashが焼けるようです。デバッガーがJTAG相当でシリアルがISP相当なのかもしれません。基板にはシリアルUSB変換のFT232のチップがのっています。100円のジャンクのために高価なデバッガーを買うのは、本末転倒なので、シリアルで焼いてみます。

「実装不良品など、部品取り用。通常使用不可。」で動かないかもしれないので、Lチカのよいページがあったので、試してみます。

http://mibc.blog.fc2.com/blog-entry-174.html

ルネさんの登録ページはロボット対策の機能がうまく動いていなく、かなり登録に苦戦しました。

どうにか登録してCS+をダウンロードしてインストールしたのですが、v8.11はWin7でインストールに失敗するので、v8.10をインストールしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/4c54c414-6ffb-7f04-bee6-c0b417aa5e90.png)

CS+ではシリアルでflashが焼けないので、ビルドして出来上がったモトローラ形式のファイルをRenesas Flash Programmerで焼きます。CS+をインストールするとRenesas Flash Programmerもインストールされるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8cbcff70-b4fb-b869-c7ee-54878e9b8f55.png)


AE-RX210のSW1はUSBから電源をもらうようにしSW2は以下のようにしてUSB接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/5296a23e-2afa-25d6-26c2-a5783af41bc9.png)

ポートを設定してプロジェクトのモトローラ形式のビルドファイルを選択して焼いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/f4eec7c5-06a5-a8f1-3ecd-9fb05e814aca.png)

USBを外して、SW2を変更してUSBにまた付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/10a4fdac-83cb-362a-4d16-500c9c68ac38.png)

無事動いているようです。「実装不良品など、部品取り用。通常使用不可。」なので本当に動かない事もあるので、注意してください。

mruby/c動かしてみたいな。
jQueryのメソッド

jQueryを勉強中（ど素人）なのですが、復習も兼ねて学んだメソッドを下記にメモとして記述していこうと思います。
随時更新していきます。

# jQueryとは
* [ **jQuery** ]とは、効果やアニメーションを簡単に実装できるJavaScriptライブラリ
* jQueryを使うとWEBページにアニメーションや効果を簡単につけることができる
<br>

![スクリーンショット 2024-07-23 9.59.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629483/d8cf5406-ec03-ec2b-4762-3f77dfb377f8.png)

# css
CSSプロパティを変化させる

# on
イベント発生時に実行する関数を割り当てる

# fadeOut
要素を徐々に薄くして消していく (=フェードアウトさせる)

# fadeIn
要素を徐々に表示していく　(=フェードインさせる)

# text
指定した要素の文字列を取得したり、書き換えたりする

# slideToggle
要素をアコーディオンさせる

# hide
セレクタで指定した要素の子孫要素から、引数で指定した要素を全て取得することができる

```javascript:例
$('.class').children('p');
```

# addClass
セレクタで指定した要素に引数で指定したクラスを追加することができる

```javascript:例
$('.class1').addClass('.class2');
```

# removeClass
セレクタで指定した要素から引数で指定したクラスを取り除くことができる。

```javascript:例
$('.class1').removeClass('class2');
```

# hasClass
セレクタで指定した要素が引数で指定したクラスを持っているか判定することができる

```javascript:例
$('.class1').hasClass('class2');
```
if文の条件式として設定することができる

```javascript:例
if($('.class1').hasClass('class2'))
{
    // 処理内容
}
```

# eq
セレクタで指定したオブジェクトから引数で指定した数値と同じインデックス番号をもつ要素を取得することができる

```javascript:例
$('li').eq(2).css('color','red');
```

# index
セレクタで指定したオブジェクトにおいて、引数で指定した要素が存在するインデックス番号を取得することができる

```javascript:例
$('li').index($('active'));
```

# prev
セレクタで指定したオブジェクトの同じ階層の１つ前の要素を取得することができる

```javascript:例
$('#id').prev().css('color','red');
```

# next
セレクタで指定したオブジェクトの同じ階層の１つ次の要素を取得することができる

```javascript:例
$('#id').next().css('color','blue');
```

# attr
セレクタで指定した要素に引数で指定した属性名・属性値を設定することができる
また、第２引数を指定しなかった場合、第１引数で指定した属性名の値を取得することができる

```javascript:例
$('h1').attr('id','title');
var url = $('a').attr('href');
```

# val
セレクタで指定した要素のvalue値を取得することができる

```javascript:例
var text = $('#input').val();
```

# animate
セレクタで指定した要素に対して、引数１で指定したプロパティの値を設定することができる
また、引数２でアニメーションの速度を指定することができる

```javascript:例
$('h1').animate({'font-size':'20px'},1000)
```

# scrollTop
リンク先への移動にアニメーションを付けることができる

```javascript:例
$('html,body').scrollTop(0);  // ⇦　ページのTopに移動
```
```javascript:例
$('html,body').animate({'scrollTop':0},500);  
// animateメソッドでプロパティにscrollTopを設定する方法でも可能
```

# offset
セレクタで指定した要素の表示位置を取得することができる

```javascript:例
$('h1').offset().top; // ページ最上部からの距離
```
yukicoder No.18 うーさー暗号　解説

[問題文](https://yukicoder.me/problems/no/18)

# 解説
一般的にどの言語でも**ASCII Code**というものがある。細かく覚える必要はないが、(char)('A'+$1$)-'B'、(char)('Z'-$25$)='A'という感じで、アルファベット表みたいな感覚で文字変換ができる(ここでchar型変換をしないと、**整数型になってしまうので注意**)。
1文字目は(char)($s_0-1$),2文字目は(char)($s_1-2$)という感じで続けるのだが、ここで注意が必要。
まず$26$文字目以降だ。これ以降は、わざわざ$26$とか$42$とか**大きな数字で引く必要はない**。よって、for文を回すときは、($s_i-(i+1)mod26$)という感覚でやると割といい感じになる。なお、そのわざわざ%mod6する理由は**次にある**。
続いて、入出力例2のパターンだ。この問題の制約下では'A'-1='Z'にしろという命令が暗にあるが、このままただ'A'-1をすると'@'になってしまう。これの対処法は、(i+1)mod26%をした後場合分けをする。$'A'\leqq s_i\leqq 'Z'$がfalseだったら**$s_i+=26$**をする。そうでなければ何もしない。これで大丈夫。

# C++の解答例

```C++
#include <bits/stdc++.h>
using namespace std;

int main(){
  string s;cin>>s;
  for(int i=0;i<s.size();i++){
    s[i]=(char)(s[i]-(i+1)%26);
    if(!('A'<=s[i]&&s[i]<='Z'))s[i]+=26;
  }
  cout<<s<<endl;
}
```