OmniAICreator/Qiita-1.07M huggingface dataset:
[Oracle Cloud] Oracle Database Service へ OCI コマンド・ライン・インタフェース(CLI) をインストールしてみてみた


OracleCloud Infrastructure(OCI) の Oracle Database Service、Exadata Database Service には、コマンド・ライン・インタフェース(CLI)がデフォルトでインストールされています。
ということで確認してみてみます。

# ■ OCI CLI確認
Oracle Database Service作成すると OCI CLI がインストールされていることを確認できます

```
[opc@db19c ~]# oci -v
	3.4.4
```


# ■ CLI 構成ファイルの設定
初回の設定プロセスの手順をCLIによって示すには、setup configコマンドを使用します
次を参考に CLI 設定ダイアログを使用して構成ファイルを設定します

https://qiita.com/shirok/items/e63be9a22158fef10ba9



# ■ OCI CLI 実行確認
動作テストで、Object Storageへアクセスできることを確認

```
[opc@db19c ~]# oci os bucket get -bn test-bucket01 --output table
	/root/lib/oracle-cli/lib64/python3.6/site-packages/oci/_vendor/httpsig_cffi/sign.py:10: CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography and will be removed in a future release.
	from cryptography.hazmat.backends import default_backend  # noqa: F401
	+-----------------------------------------+---------------------------------------------------+--------------+--------------------+---------------+-----------------+------------+----------------------------------+
	| compartment-id                          | created-by                                        | defined-tags | etag               | freeform-tags | name            | namespace  | time-created                     |
	+-----------------------------------------+---------------------------------------------------+--------------+--------------------+---------------+-----------------+------------+----------------------------------+
	| ocid1.compartment.oc1..aaaaaaaa2dmjokxv | ocid1.user.oc1..aaaaaaaatkb2a32gjm4yyq6hrx4geayb7 | None         | aefebeae-1b94-4260 | None          | test-bucket01   | shirok     | 2021-11-19T11:36:04.417000+00:00 |
	+-----------------------------------------+---------------------------------------------------+--------------+--------------------+---------------+-----------------+------------+----------------------------------+
```

# ■ 参考
　・[コマンドライン・インタフェース(CLI)](https://docs.oracle.com/ja-jp/iaas/Content/API/Concepts/cliconcepts.htm)
　・[手動およびオフライン・インストール](https://docs.oracle.com/ja-jp/iaas/Content/API/SDKDocs/climanualinst.htm)
　・[CLI コマンドリファレンス](https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.23.3/oci_cli_docs/)
Sass覚書 @useと@forwardの使い方

webコーディング初心者です。
初心者なりに学びがあったのでここに記しておきます。
どのくらい初心者かというと、SassのコンパイルをVScodeのプラグインで行っているくらいです。gulpの実装わからなすぎる

cssをSassに置き換えていく作業をする際にエラーが吐かれまくって困ったので、解決した際の覚書を共有します。
インターネット老人会会員なのでこういうアウトプット大切にしていきたい。。

### Sassのデータ管理
好みはあるかもしれませんが、概ねのデータの階層としては下記を参考にいただければわかりやすいと思います。

    root
        ├ dust - style.css
        |
        ├ foundation ┬ _index.scss
        |            ├ _color.scss
        |            ├ _base.scss
        |            ├ _reset.scss
        |            …
        |
        ├ conponent -┬ _index.scss
        |            ├ _button.scss
        |            ├ _card.scss
        |            ├ _accordion.scss
        |            …
        |
        ├ pages -----┬ _index.scss
        |            ├ _top.scss
        |            ├ _profile.scss
        |            ├ _about.scss
        |            …
        …
        └ style.scss

:::note warn
関数を使用したscssをフォルダにまとめておけたら、より楽かも
:::

ここで注目すべき点は、各フォルダ内に入っている`_index.scss`です。
フォルダ内のscssを、まずは`_index.scss`にまとめて記載し読み込ませます。
これにより、さらなる効率化が期待できるかも。
下記が、_index.scssの中身です。

    @forward "color";
    @forward "base";
    @forward "reset";
    …

    @use "button.scss";
    @use "card";
    @use "accordion";
    …

    @use "top.scss";
    @use "profile";
    @use "about";
    …

:::note warn
ここでの注意点は、colorやbaseなどの関数を含むscssは、@forwardで読み込むこと。
先に注意点として挙げた関数のscss〜というのはこのため。
:::

次に、style.scssに`@use`で各フォルダの_index.scssをまとめて読み込みます。
下記は、style.scssの中身です。

    @use "foundation";
    @use "conponent";
    @use "pages";
    …

### 関数の呼び出し
また、各scssで関数を呼び出す際には下記の記載が必要となります。

    @use "../hoge" as *;

../hogeは、関数を記載したscssのディレクトリを指定。
今まで通りのscssの書き方をしたい人は、'\*'を、そのまま'\*'と記載した方が楽です。
'\*'を任意の文字列に設定することも可能ですが、その際はscssの記載を下記のようにしないといけないので個人的には面倒なので'\*'一強かと。

    @use "../hoge" as huga;

    body {
        background-color: huga.$bgColor;
    }

上記に記載した点に気をつけてscssの作成と読み込みをし、
コンパイルを行えば効率的にSassを使える感じがします（適当）。
gulpを組み込めればいいのですが、私はここでVScodeのLive Sassに頼っております。
Watch Sass!

これからは忘れないよう新規作成の際から注意してディレクトリ作成していこうと思います。
今後の自分の学びのためにも書き留めておきました。
間違っている点があれば指摘いただけると助かります。
gulpが実装できたらまた記事を書きたい。
TypeScript fetch 関数で通信リクエストする

# 概要

fetch は通信リクエストする関数。結果は Promise で扱える。
モダンブラウザはすべて対応している。
Node.js 18 では Experimental（CLIでの無効化フラグが存在する、利用時にメッセージはない）となっている。

## 公式ドキュメント

https://developer.mozilla.org/en-US/docs/Web/API/fetch
https://nodejs.org/dist/latest-v18.x/docs/api/globals.html#fetch

# コード例

```js
interface FetchRequest {
  url: string
  options: object
}

async function fetchAsync (request: FetchRequest): Promise<string> {
  return await fetch(request.url, request.options)
    .then(async (response) => {
      if (!response.ok) {
        throw new Error(`HTTP error! Status: ${response.status}`)
      }

      return await response.blob()
    })
    .then(async (response) => {
      return await response.text()
    })
}

async function main (): Promise<void> {
  const result = await fetchAsync({
    url: 'https://www.google.com',
    options: {}
  })
  console.log(result)
}

main().catch((error) => {
  console.error(error)
})
```
GitHubのベータ版機能「New Code Search and Code View」が便利でコードリーディングが捗る

3月に入ったあたり？からこの機能を任意で有効化できるようになったっぽいです（要出典）。Freeユーザも利用可能です。

海外在住の知り合いはずっと前から有効化できていたようで、常々羨ましく感じていました。（国毎にリリース時期を分けていた？）

そんな私のもとにもついに有効化ボタンが現れたので、早速使ってみました。コードリーディングが捗ります。

本機能のドキュメントは[こちら](https://docs.github.com/en/repositories/working-with-files/managing-files/navigating-files-with-the-new-code-view)です。

# 有効化の方法

自分のアバターをクリックして、「Feature preview」を開きます。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304979/3e84d478-a5c2-deb2-66db-6773329b818e.png)

次に、出てきたポップアップ画面から「New Code Search and Code View」を選択して、「Enable」ボタンを押します（私はすでに有効化しているので、以下のスクリーンショットでは「Disable」ボタンが表示されています）。

![Screenshot from 2023-03-06 00-48-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304979/ed8fa32d-5b1c-a3a9-8664-84d58bda607a.png)

そして適当なリポジトリに行ってフォルダを開くと、

![Screenshot from 2023-03-06 00-36-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304979/e4c997ea-e97f-4c85-cfea-8d2df8dc7064.png)

こんな風に画面左側にフォルダツリーが表示されます！

以前からGitHubでは「.」キーや「>」を押すことでVS Code風のエディタを開くことができていましたが、見たいだけの場合には少し不便だと感じていました。

本機能は多くのGitHubユーザが待ち望んでいたものだと思います😊

ぜひ使って快適にコードリーディングしましょう😺

# 最後に

記事を読んでくださってありがとうございます！

Twitterフォローしていただけると記事を書き続けるモチベーションになります😺
https://twitter.com/_matoruru
【個人開発】エンジニアマッチングサービス

# はじめに
エンジニア同士で交流することができるマッチングサービスをリリースしました。

![全体の流れ (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/434f90f4-e182-3a3b-0184-c4de0fd99e95.gif)

# URL
https://www.paircode.net/

# 目的
私は都内でSEとして働いているのですが、<font color="red">職場以外でエンジニアの方と接する機会がほぼない</font>ことに気づきました。

そのため業務外で個人開発を行うときに相談できる相手がいないことに悩んでいました。

また、`地元の友達`や`前職の転職した同僚`でエンジニアをやっている人の`働き方`や`環境`を聞くと、良し悪しは抜きにして同業種なのに自分の仕事とはずいぶん違いました。

開発者として同業種の人の話を聞いたり、つながりを持っていることは成長につながるとともに知見を広げられると感じ本サービスを開発しました。

# サービス概要
### 1.気になるエンジニアをさがす
`さがす画面`でエンジニアが一覧で表示されます。
アイコンをクリックすると詳細情報を確認することができます。
![トップページ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/d2468c58-4c0e-a9a6-da4b-a79a7ff21dc9.gif)

### 2.いいねを送ります
気になるエンジニアがいれば`いいねボタン`をクリックして
相手にいいねを送ります。
![いいねの流れ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/537fb3c1-e96c-e531-77f0-d8cda59983db.gif)

### 3.マッチング
いいねが送られた方は`もらったいいね画面`で承諾することができます。
マッチを受け付けない場合はスキップボタンを押すことでキャンセルすることができます。
![マッチングの流れ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/05b3f5d7-596c-139a-86d6-cb3fdcc8762d.gif)

### 4.メッセージ
マッチした相手とはメッセージのやり取りをすることができます。
こちらで情報などを共有しましょう。
![マッチング後の流れ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/5db8e933-88a6-0415-5450-e928373760c6.gif)

# スマホ対応
スマホ画面に合わせてレイアウトの調整を行っています。
![スマホ対応.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/4100d50f-791a-206f-8039-9e131fbfeead.gif)
DynamoDBの設計ベスプラ in 公共系

# ０．はじめに
DynamoDB（KVS）のベスプラは、RDBとは異なり正規化をせず、
同一TBLに色んな情報を正規化を極力しない形で、縦に情報をもつこと。

https://qiita.com/_kensh/items/2351096e6c3bf431ff6f

というのを出来なかったので、真剣に考えてみたシリーズのVol.1です。

なお、この記事は、以下の特性でした。

## 案件特性
① アジャイル案件
② 公共案件＆ミッションクリティカルであり、要望はお客様がもっている
　= 事業会社やベンチャーのような自分たちの好き放題できない。
　　また、データミスが許容されるようなシステムではない。
　　ゆえに、トランザクションも必須。
③ 拡張性が要求される。
　・突発的なアクセス急増に耐えるアーキテクチャ。
　・要件拡張として、DB設計の着手前に
　　アクセスパターンをすべて抽出することは不可能。
④ 性能要求を最重視する。
　・ターンアラウンドタイム：0.5秒
⑤ 超大量データになる。
　・年間で最大約7億レコード
⑥ RDBの思想が強いメンバが圧倒的に占めており、KVSのノウハウがない。



# １．特性に対するベスプラ（サマリ）
　さっそく、結論から。

　１）特性③、④のため、オンラインサイドはDynamoDB必須。
　２）特性①、②、⑤、⑥のため、好き勝手なSQL検索を実現するための
　　　DynamoDBのベスプラは、しない方がベター。



# ２．ベスプラしない方がベターな詳細
　それでは、上記特性下では "DynamoDBのベスプラは、しない方がベター" の詳細な説明をします。
　
　まず、公式のベスプラはGSIのオーバーローディングという手法です。
　簡単にいうと、SKやGSI-PKでは、「縦に情報をもつ」方法です。
　　  出典：https://qiita.com/_kensh/items/2351096e6c3bf431ff6f
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384185/12bbbb63-3b06-c955-0162-011b0c676ef7.png)
  
　ただし、これは特性①、②、④、⑤、⑥の条件ではなかなか難しいです。
　特に"② 公共案件＆ミッションクリティカルであり、要望はお客様" 、④ 性能要求、⑤ 超大量データの条件がすべて求められる場合、障壁は一気に膨れ上がります。

　
　① アジャイル案件
　⇒ 後から色々と要件が追加されるため、アクセスパターンが定まらない。
　　 ②と密に影響してますが、要望は我らではない。
　　　　出典：https://qiita.com/_kensh/items/2351096e6c3bf431ff6f
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384185/8895476e-cbc7-d851-00ac-0f6aa903ccb6.png)



　② 公共案件＆ミッションクリティカルであり、要望はお客様
　⇒  データ移行や、データパッチも適宜必要となるが、
　　 人が理解しにくい構造のため、移行ツールが非常に複雑になる、
　　 ミスの温床でしかない。

![1677780573555-H7mprXBvnc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384185/e7c77dfa-1509-8fe7-fa0e-6c428759ff9e.png)


　⑤ 超大量データ
　⇒ ②のトランザクションと関連。
　　 超大量データのため、トランザクションを保持するために、
　　正規化のDBでは1レコード登録すれば良いが、情報を縦にもつため、
　　ベスプラに則ると、10レコード程度に一気に増加する。
　　また、GSI-PKが固定になるため、大量データでは処理が集中する。
　　つまり、データの偏りが生じるため、性能劣化に繋がる。
　　⇔ ④の性能要求に反する。

　⑥ KVSのノウハウがない
　⇒ 事前検証での把握、ないし有スキル者をアサインするのどちらかで
　　 安定した設計が実現できる。
　　また、②と関連して、データパッチでミスりやすい。



# ３．次回予告：どうすりゃいいんだ！
　特定の条件下ではベスプラに則らない方がベターな理由を列挙しました。
　「難しい理由はわかった。うっさい、じゃ？どうすればいいんだ！」
　という内容を次回は記載します。


# Others
 [Note](https://note.com/hamham19 "Home")もやってます。
よければイイね :thumbsup:してください！
VBA　便利コードサンプル

# VBAで保存ショートボタンが押下された時に、全てのシートのカーソルをA1セルに移動させた後、アクティブシートに戻るコード

```
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim currentSheet As Worksheet
    
    '現在のアクティブシートを保存
    Set currentSheet = ActiveSheet
    
    'フォント種別を変更する
    ChangeFont
    
    'カーソルを移動する
    MoveCursor
    
    'アクティブシートに戻す
    currentSheet.Activate
End Sub
'フォント種別を変更する
Sub ChangeFont()
    Dim ws As Worksheet
    Dim cell As Range
    
    For Each ws In ActiveWorkbook.Worksheets
        For Each cell In ws.UsedRange.Cells
            cell.Font.Name = "MS Pゴシック"
        Next cell
    Next ws
End Sub
'カーソルを移動する
Sub MoveCursor()
    Dim ws As Worksheet
    
    For Each ws In ActiveWorkbook.Worksheets
        ws.Activate
        ws.Range("A1").Select
    Next ws
End Sub

```
Docker Compose V2 への移行【Linux】

# 概要
ここではLinux環境でDocker Compose V1からDocker Compose V2へ移行するためのメモを記しています。

# 対象読者
- Linux環境の方
- docker-compose(Docker Compose V1)を使用している方
# 移行する理由
- 2023年4月にCompose V1のサポートが終了してしまうため
- Compose V2を利用する人が増えているため

詳しくは以下の記事を参照してください。

https://qiita.com/zembutsu/items/d82b2ae1a511ebd6a350
# 環境確認
まずは自分の環境を確認してみましょう。  
```docker-compose```コマンドが使用でき、```docker compose```が使用できない方はまだ導入できていないということになります。
# 移行方法
以下のコマンドでCompose V2を導入します。
```bash
sudo apt update
sudo apt install docker-compose-plugin
```
以下のように表示されたら導入成功です。
```bash
docker compose version
# Docker Compose version v2.16.0
```
## E: パッケージ docker-compose-plugin が見つかりません
以下のようなエラーが表示された場合、リポジトリを追加して再度インストールします。
```bash
$ sudo apt install docker-compose-plugin
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
E: パッケージ docker-compose-plugin が見つかりません
```
以下でリポジトリを追加します。
```bash
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
```
再度、インストールを試します。
```bash
sudo apt install docker-compose-plugin
docker compose version
# Docker Compose version v2.16.0
```
## Docker Compose V1 の削除
Docker Compose V1が不要な方は以下のコマンドで削除ができます。
```bash
sudo rm /usr/local/bin/docker-compose
```
## Compose V2を使用したいけどdocker-composeコマンドを使用したい方
導入したのにも関わらず癖で```docker-compose```と打ってしまう人もいるかと思います。そこで以下を実行することで```docker-compose```でCompose V2を使用できるようになります。
```bash
echo 'alias docker-compose="docker compose"' >> ~/.bashrc
source ~/.bashrc
docker-compose version
# Docker Compose version v2.16.0
```
# おわりに
いかがでしたでしょうか。ぜひこの機械にCompose V2に移行してみてください。
次回は、Compose V2による変更点などをまとめたいと思います。
# 参考文献

https://qiita.com/zembutsu/items/d82b2ae1a511ebd6a350

https://www.howtogeek.com/devops/how-to-upgrade-to-docker-compose-v2/

https://docs.docker.com/engine/install/ubuntu/
Azure Database for MySQLの接続でError: self-signed certificate in certificate chainが発生する

## はじめに
Azure Database for MySQLにプログラム上から接続しようとしたら、```Error: self-signed certificate in certificate chain```のエラーが発生したので対処法をメモっておきます。

[クイック スタート:Node.js を使用して Azure Database for MySQL に接続してデータを照会する](https://learn.microsoft.com/ja-jp/azure/mysql/single-server/connect-nodejs)

## 原因：BaltimoreCyberTrustRoot.crt.pemのせい

どうやら```BaltimoreCyberTrustRoot.crt.pem```がいけないようです。
ルートCAの変更云々が別のDocにあったのでこのあたりが原因なのかもです。

[Azure Database for MySQL シングル サーバーのルート CA の変更について](https://learn.microsoft.com/ja-jp/azure/mysql/single-server/concepts-certificate-rotation)

## 対処法
使用するSSL証明書を```BaltimoreCyberTrustRoot.crt.pem```から```DigiCertGlobalRootCA.crt.pem```に変更しましょう。

基本的に後者のSSL証明書を利用するようにドキュメントを読み替えればOKです。

### ファイルのダウンロードURL
https://dl.cacerts.digicert.com/DigiCertGlobalRootCA.crt.pem

### Azure Portalからのダウンロード
Azure PortalからAzure Database for MySQLを開き、ネットワークからSSL証明書をダウンロードできます。

![スクリーンショット 2023-03-06 0.21.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393049/bf29bbf9-3af5-11a4-d2f8-b8f82a70b159.png)

## 最後に
azure-docsにプルリクを投げてみました。
strtotime関数の罠

# strtotime関数はどんな引数でも頑張って変換しようとする

>[strtotime — 英文形式の日付を Unix タイムスタンプに変換する]
https://www.php.net/manual/ja/function.strtotime.php

注文データをCSVファイルで読み込んで、データベースに取り込むといった処理の流れで、注文日時が全く違う日時で取り込まれているといった不具合が報告された。
内容を確認すると以下のプログラムに不具合があることがわかった。
```PHP

// $input_order_date_time = CSVから取り込んだ日時
$order_date_time = date('Y-m-d H:i:s', strtotime($input_order_date_time));

```

strtotime関数はPHPらしい関数でどんな引数が指定されようと頑張って何とか変換しようとする、とてもありがた迷惑な関数である。
せめて変換に失敗したらfalseを返してほしい・・・


以下にstrtotime関数がどんな値を吐き出すかテストをしてみた。
```PHP
// 今日は2023-03-05です
$input_order_date_time = date('Y-m-d H:i:s');
echo date('Y-m-d H:i:s', strtotime($input_order_date_time));
// 2023-03-05 14:54:24

$input_order_date_time = '2023-03-05 11:15:00';
echo date('Y-m-d H:i:s', strtotime($input_order_date_time));
// 2023-03-05 11:15:00

$input_order_date_time = '2023/03/05 11:15:00';
echo date('Y-m-d H:i:s', strtotime($input_order_date_time));
// 2023-03-05 11:15:00

$input_order_date_time = '20230305 111500';
echo date('Y-m-d H:i:s', strtotime($input_order_date_time));
// 2023-03-05 11:15:00

$input_order_date_time = '20230305';
echo date('Y-m-d H:i:s', strtotime($input_order_date_time));
// 2023-03-05 00:00:00

$input_order_date_time = '2023-03';
echo date('Y-m-d H:i:s', strtotime($input_order_date_time));
// 2023-03-01 00:00:00

$input_order_date_time = '202303';
echo date('Y-m-d H:i:s', strtotime($input_order_date_time));
// 2023-03-05 20:23:03

$input_order_date_time = '11:15:00';
echo date('Y-m-d H:i:s', strtotime($input_order_date_time));
// 2023-03-05 11:15:00

$input_order_date_time = '111500';
echo date('Y-m-d H:i:s', strtotime($input_order_date_time));
// 2023-03-05 11:15:00

$input_order_date_time = 'あああああ';
echo date('Y-m-d H:i:s', strtotime($input_order_date_time));
// 1970-01-01 00:00:00
```
おわかりいただけただろうか・・・

ありがた迷惑な変換を一個ずつ見てみる
```php
$input_order_date_time = '2023-03';
echo date('Y-m-d H:i:s', strtotime($input_order_date_time));
// 2023-03-01 00:00:00
```
勝手に3/1になっています。
3月は31日まであるのでどの日付を指定していいかわからずfalseが返ってきてほしいところ

```php
$input_order_date_time = '202303';
echo date('Y-m-d H:i:s', strtotime($input_order_date_time));
// 2023-03-05 20:23:03
```
こちらは勝手に今日の日付の20:23:03に変換されています。
この引数は時間であると勝手に解釈されて、なおかつ自動で今日日付で変換されています。

```php
$input_order_date_time = '111500';
echo date('Y-m-d H:i:s', strtotime($input_order_date_time));
// 2023-03-05 11:15:00
```
時間であると解釈されました。はい。

```php
$input_order_date_time = 'あああああ';
echo date('Y-m-d H:i:s', strtotime($input_order_date_time));
// 1970-01-01 00:00:00
```
プログラマーなら誰でも知っている例の日付に変換されました。
頼む、falseを返してくれ。

以上です。

strtotime関数に値を渡す際は事前にかなり入念なチェックを入れる、またはフォーマットをがっちり固めておくといった事が必要ですね。

今回はフォーマットを定めておらず、自由に値を設定でき、柔軟に日付変換をするといった処理となっていたため不具合を起こしていたようです。
.NET nanoFrameworkでマイコンプログラミング（Co2センサー SCD40）

.NET nanoFrameworkでSCD40センサーを使うためのサンプルプログラムです。

# ハードウェア
　・M5Core2
　・UNIT Co2

# ソフトウェア
　・VisualStudio 2022
　・M5Core2用FW 1.8.1.15

# 追加NuGetパッケージ
　・nanoFramework.M5Core2

# プログラム解説

```
using System.Device.I2c;
using System.Buffers.Binary;
using nanoFramework.M5Stack;
using Console = nanoFramework.M5Stack.Console;
```
追加したusingディレクティブです。

```
//SCD40
device = M5Core2.GetGrove(0x62)
```
M5Core2パッケージを追加しておくと簡単にI2Cが利用できます。

```
//デバイスのスタート
  device.Write(start);
  Thread.Sleep(1000);
            
//データ取得開始
  device.Write(read);
  Thread.Sleep(50);
```
SCD40はスタートコマンド（0x21,0xb1）を送信して、次にリードコマンド（0xec,0x05）を送信することで計測値を取得できるようになります。

```
Timer timer = new Timer(getData, null, 0, 30000);        //30秒タイマー
```
タイマーを使って30秒ごとに測定値を取得します。

```
SpanByte buffer = new byte[9];

device.Read(buffer);
var co2 = BinaryPrimitives.ReadInt16BigEndian(buffer.Slice(0, 3));
var tmp = -45 + 175 * (float)(BinaryPrimitives.ReadUInt16BigEndian(buffer.Slice(3, 3))) / 65536;
var hum = 100 * (float)(BinaryPrimitives.ReadUInt16BigEndian(buffer.Slice(6, 3))) / 65536;
```
測定値は先頭から9バイトに格納されているので、バッファーを9バイトを用意します。
9バイトの内訳は「Co2 Data 2byte + CRC 1byte」、「Tempreture Data 2byte + CRC 1byte」、「Humidity Data 2byte + CRC 1byte」となっています。
後は3バイト毎に切り分けをして先頭2バイトを計算すれば各測定値を得ることができます。


[ソースコード](https://github.com/linyixian/NF_Core2_SCD40)はこちらにあります。
【fastlane】app_store_connect_api_keyでの実行でinvalid curve nameエラーが出る

## 困ったこと

fastlaneで`register_devices`を実行しようとしたところ
`app_store_connect_api_key`の指定で`invalid curve name`のエラーが出た。

```yaml
platform :ios do
  desc "add_device"
  lane :add_device do
    app_store_connect_api_key(
      key_id: ENV["ASC_KEY_ID"],
      issuer_id: ENV["ASC_ISSUER_ID"],
      key_content: ENV["ASC_KEY_CONTENT"],
      in_house: false
    )
    register_devices(devices: {ENV["DEVICE_NAME"] => ENV["DEVICE_UDID"]})
  end
end
```

## 解決した方法
原因は`Bitrise`の`Secrets`に保存した`AppStoreConnectAPI`の`Key_Content`に

```yaml
-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----
```
が含まれていなかったことでした。

修正して実行したら無事デバイス登録できました👏

`invalid curve name`のエラーだけでは原因を特定はできないと思いますが、解決方法の一つとして参考になればと思います。
Windows 11 (22H2) の非対応 PC インストール

:::note warn
推奨されない手順について書いているので、実践する際はその点を十分に理解の上お願いします
:::

Windows 11 非対応 PC に Windows 11 をインストールしたい場合、インストール時にレジストリをいじると最小システム要件チェックを無視できることが Microsoft 公式からもアナウンスされている [^ms] が、これをバージョン 22H2 でやろうとした際にうまくいかなかったのでメモ。

[^ms]: https://support.microsoft.com/ja-jp/windows/e0edbbfb-cfc5-4011-868b-2ce77ac7c70e

## うまくいかなかったこと
それぞれの手順詳細はググるとたくさん出てくるので割愛

1. Windows 11 (22H2) のインストールメディア (USB メモリ) を作成
2. インストールメディア内の `sources\appraiserres.dll` を空ファイルに置き換え
3. インストールメディアを使用して Boot
4. レジストリエディタから `AllowUpgradesWithUnsupportedTPMOrCPU` の設定

→ 最小システム要件チェックに引っかかってしまい、先に進めない

## やったこと
Rufus というアプリで古い Windows 11 (2**1**H2) のインストールメディアを作って進めたところ、うまくいった。

## その他
そういえば昔やって成功したときは `AllowUpgradesWithUnsupportedTPMOrCPU` ではなく `BypassTPMCheck` とか `BypassCPUCheck` とかをいじったような記憶が...。

こちらも試してみたほうがよかったかもしれない。
【Docker】Dockerfileでヒアドキュメントを使用する

## Dockerfileでヒアドキュメントを使用する方法
`Dockerfile`に以下のように記述することでヒアドキュメントを使用することができます。
ただし、Buildkitを使用している必要があります。

```Dockerfile:Dockerfile
# syntax=docker/dockerfile:1
ARG RUBY_IMAGE_TAG
FROM ruby:${RUBY_IMAGE_TAG}

ARG PROJECT_NAME
ARG RUBYGEMS_VERSION
ARG USER_NAME=ruby
ENV TZ=Asia/Tokyo

RUN adduser ${USER_NAME}

COPY --chown=${USER_NAME} Gemfile Gemfile.lock /${PROJECT_NAME}/

WORKDIR /${PROJECT_NAME}
RUN <<-EOF
  gem update --system ${RUBYGEMS_VERSION}
  bundle install
  chown -R ${USER_NAME} ${GEM_HOME}
EOF

COPY --chmod=755 /.docker/api/entrypoint.sh /usr/bin/
ENTRYPOINT ["entrypoint.sh"]

USER ${USER_NAME}
RUN mkdir -p /${PROJECT_NAME}/tmp/sockets/

EXPOSE 3000

CMD ["bundle", "exec", "pumactl", "start"]

```

https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/reference.md#here-documents

`Dockerfile`に`# syntax=docker/dockerfile:1`を記述するのを忘れないようご注意ください。
`# syntax=docker/dockerfile:1`の`1`はバージョンの指定です。

https://hub.docker.com/r/docker/dockerfile

ヒアドキュメントの使用方法は以下をご参照ください。

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04
Cloud9からRenderへデプロイ

# はじめに
初投稿になります。
プログラミングについて学び始めてから約8ヶ月。超初心者。まだまだわからないことが多いので間違っている箇所があったらそっと教えてください💦
ほとんどが引用になっています。

# 環境
- windows11
- cloud9
- rails 6.1.7
- ruby3.1.2
- postgreSQL 9.2.24
- sqlite2 0.5.4
- sqlite3 (1.6.1-x86_64-linux)

# 経緯
PFとしてCloud9のrailsでショッピングサイトのアプリケーションを作成し、AWSを利用したデプロイ完了。
デプロイの自動化を試みたときにIPアドレスで閲覧できていたサイトが見れない状態になっていたため、四苦八苦しながら原因を探るも解決できず。
転職活動が開始できないという問題のため、スピード重視でAWSからRenderでのデプロイを行うことにしました。

# 結果的に
こちらの記事：[Renderによるデプロイ](https://qiita.com/Naaa0/items/8e2ad76e40e3a638ddfc)
この通りにしたらデプロイできました。ただ、いろいろと試行錯誤していたため今度はローカルでサーバーが立ち上がらなくなりました...

## 確認したこと（現状把握）
- ローカルでは正常に動く
- EC2にログインできる
- Nginxにログインできる
この時点でエラー文を見る限りアプリケーションに問題があるわけでは無く、サーバーがアプリケーションに接続できていないのでは？と考えました。
※エラー文は保存し忘れてしまったので載せられないですが...

# やったこと
## 1.本当に開発環境に問題は無いのか？確認してみよう。
参考記事：[Pumaが起動しない。Deployできない。その時に真っ先につぶしておきたい可能性](https://qiita.com/tatsumi_t2/items/509a722a30e67031322f)
```java:config/environments/development.rb
config.cache_classes = false
config.eager_load = false
↓
config.cache_classes = true
config.eager_load = true
```
に変更。
rails sでサーバーを起動させると問題なく操作可能。
これで本番環境、デプロイで問題があったことを確信。

## 2.Renderを利用したデプロイ開始
最初この記事：[Renderによるデプロイ](https://qiita.com/Naaa0/items/8e2ad76e40e3a638ddfc)
にあるbrewコマンドが使えず四苦八苦しました。
調べるとパソコンにhomebrewのインストールが必要。（ざっくり理解）
wikiには
> Mac OS Xオペレーティングシステム上でソフトウェアの導入を単純化するパッケージ管理システムのひとつである

とのこと。
Windowsを使っているためインストールできないのかと思ったものの、調べるとWindowsでも使えるようにする方法はあるよう。
参考記事：[Windowsでもbrewを使いたい！WSLのインストールとホームディレクトリの変更、そしてbrewが使えるようになるまで](https://qiita.com/yukiarrr/items/1e1562fb2a3ba7384d1b)

ただ今回はこのインストールはせずに、Cloud9内でbrewコマンド以外の方法でPostgreSQLをインストール。
参考記事（ブログ）：[AWS Cloud9でPostgresqlをインストールする。](https://orfool.com/programing/install-postgresql-aws-cloud9/)

蛇足：よくわからないままWindowsにpgインストールしようとしてインストーラーでダウンロードした際にエラーが起きてここでも詰まったのですが、Windousのユーザー名が日本語だったのがいけなかったようなので、ローマ字にしておこう...と思いました。
そもそもWindowsではなくCloud9にインストールするべきでしたが😓

pgインストール後は結果に載せた記事通りに行い無事デプロイが完了しました。
ただ、GitHub Desktopを使っていないため、デプロイ前のGitHubへのPushはCloud9上でコマンドを打ち込み行いました。

# 反省
- 記事はよく読む
　一部見落とし・勘違いで詰まった。
- エラー画面やコードはメモ帳などで記録しておく
　忘れたため今回はほとんど引用になってしまった。
- 検索のスキルを身につけること
　最初に AWSからRenderと検索していてなかなかほしい情報が出てこなかった。検索すべきは『Cloud9からrender』だったと終わってから思った。
用語やサービスについての理解が足りていない...
　

# おわりに（感想）
デプロイは今回で2回目。難しくて苦手...とは思うものの毎回学ぶものが多い・無事終わったときの達成感がすごい。（特に今回は！嬉しくて泣きそうになった笑）
もっとスムーズにデプロイできるようになりたい...
先人の知恵が本当に有り難いと感じました🙏
みんな大好き偏差値について解説してみた

# 偏差値とは
一般的な偏差値は50を基準として、平均からどれくらいの差があるかを表した数値です。データを一律に標準偏差10、平均50に変換したときの値です。学力検査の結果を表す学力偏差値とは別に製造業の品質管理にも使われているらしい。Wikiではこのような説明だけど**不良品の発生確率はポアソン分布に従うことが多いので**製品一つ一つの偏差値は計算していることはないと思います😅
>ポアソン分布は二項分布の生起確率Pを極端に小さくしたものと考えたらいいですね 
>
なので、**偏差値=学力偏差値**と考えてもいいです。今回はこの学力偏差値について取り上げます。学力試験においては残念ながら平均50で標準偏差10といった綺麗なデータではないです。
実際に2022年共通テストの平均・標準偏差を見ていきましょう！
| 科目       |       平均点 |    標準偏差    |
|:-----------|-----------:|:------------------:|
| 国語       |       110.26|        31.94      |
| 数学IA     |        37.96|        17.12      |
| 数学IIB    |        43.06|        17.05      |
| 物理       |        60.72|        19.22      |
| 化学       |        47.63|        20.28      |
| 英語R      |        61.80|        20.30      |

全ての科目を入力するのは大変なので、一部を抜粋しました💦
参考資料 [予備校英語教師のメモ帳 よびめも ~[2022大学入試] 共通テストの平均点が確定！~](https://eigo-dosurukosuru.net/daigakunyuushi/kyoutsuutest/average-info-2022/)

# 実際に計算してみよう
偏差値は下のような公式で表せる。
```math
t_i=\frac{10(x_i-u_x)}{σ_x}+50
```
ここで平均と標準偏差は以下のように表せる。
```math
u_x=\frac{1}{N}\sum_{i=1}^{N}x_i
```
```math
σ_x=\sqrt{\frac{1}{N}\sum_{i=1}^{N}(x_i-u_i)^2}
```
次に最近流行りのChatGPTを使ってランダムな得点(0~100)を10個生成しましょう。![Screen Shot 2023-03-05 at 22.12.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153036/55fc5c2f-213c-6b2b-26fc-c452be566614.png)
サンプルコードまで表示されてめちゃくちゃ丁寧ですよね！ ChatGPTはデータベースを作る際のサンプルデータ生成にも使えます。
>ちなみに私は英語学習のため敢えて英語で対話してます。英語の学習にも良いですよ👍
>
手計算だと面倒臭いですけどエクセルで簡単に計算できます。高校生は手計算して計算力を高めてください💪
![Screen Shot 2023-03-05 at 22.32.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153036/c84f4829-49db-bdc7-9600-35dc9977a766.png)
偏差値は平均と標本偏差に大きく左右されます。よく**偏差値80の高校生**とかメディアで取り上げられていますが、
恐らく平均と標本偏差が**極端に低い**ような難しいテストで高得点をとったのと考えられます。
>偏差値の公式を見直せばこれは自明ですね
>
平均が低いのは予想しやすい通り難しい試験と直感でわかります。また、標本偏差は分散の平方根なので、**データの散らばり具合**を示します。
偏差値80は母集団全体でデータの散らばりが少ない所で頭一つ抜けて得点が高いという意味です。

# 偏差値○○は上位何%
最後に正規分布を用いて偏差値60,70,80は上位何%に対応するか計算してみましょう。
簡単に標準偏差10,平均50で考える。
正規分布は以下の式で表せる。
```math
f(x)=\frac{1}{\sqrt{2πσ^2}}\exp\bigr(-\frac{(x-u)^2}{2σ^2}\bigr)
```
標準正規分布(平均0分散1)に適用させるために以下の式を使う。
```math
Z=\frac{X-u}{σ}  
```
```math
t_i=Z \times 10+50
```
つまり、Z=1,2,3の時と標準正規分布の確率I(z)に対応させれば良い。
```math
z\longrightarrow I(z)=\frac{1}{\sqrt{2π}}\int_{0}^{z}\exp(-\frac{x^2}{2})dx
```
この確率は下側確率なので注意
```math
I(1.0)=0.3413
```
よって偏差値60は上位15%
```math
0.5-0.3413=0.1587
```
偏差値70は上位2.3%
```math
I(2.0)=0.4772
```
```math
0.5-0.4772=0.0228
```
偏差値80は上位0.13%
```math
I(3.0)=0.4987
```
```math
0.5-0.4987=0.0013
```
>実際に標準正規分布表を見て計算してみてください。偏差値って意外と奥が深い！
>
「apachectl」、「apache2ctl」コマンド

●「apachectl」、「apache2ctl」コマンド
起動中のWebサーバに設定を反映させるためにはWebサーバを再起動する必要があり。Apacheの制御用コマンドには、RedHat系では「apachectl」、Debian系では「apache2ctl」コマンドがあります。

apachectl(apache2ctl)コマンドの書式およびサブコマンド。

apachectl [サブコマンド]
apache2ctl [サブコマンド]

・start　Apacheの起動
・stop　Apacheの終了
・restart　Apacheの再起動
・graceful　Apacheを安全に再起動
・configtest　設定ファイルの構文チェック



●Apacheを終了するには以下のように起動スクリプトを使用する方法も。
・RedHat系：　/etc/init.d/httpd stop
・Debian系：　/etc/init.d/apache2 stop

systemdの場合は、例えばRedhat系の場合は、systemctl restart httpd.service。

・RedHat系のApacheのデーモンはhttpd、設定ファイルは「/etc/httpd/conf/httpd.conf」。
・Debian系の場合はデーモンはapache2、設定ファイルは「/etc/apache2/apache2.conf」。
それぞれ名称は異なりますが、動作や設定ファイルの書式は基本的に同じ
（Rails）データ型「float型とdouble型」

# float型とdouble型の概要

# 変数と変数の型
変数はプログラミングにおける値を入れておく箱です。
処理の途中で値を入れたり逆に取り出したりできます。
変数の方とはこの箱にはどのような種類を入れてもいいですよといった決まりになります。



# float型

プログラミングの話で出てくる変数の種類の一つであり
その変数用の箱には（有効桁数の大きくない）少数を一ついれていいよという決まりのことになります。
日本語では「単精度浮動小数点型」と表現される場合もあります。


# double型

float型の仲間に「double型（倍精度浮動小数点）」という形があります
float型とdouble型の違いは箱の大きさにあります。


具体的にはfloatの変数には「0.000000002」はゼロが多すぎて（小数点以下が多い）変数の箱に収まりません。
変数の箱が大きいのでdouble型であれば収まります。

これがfloat型とdouble型の違いです。
double型の方が有効桁数の大きい（小数点以下が多い）数字を扱えます。

ですが箱が大きいということはそれだけ場所をとります。
小さいものだけを入れるのに大きい箱だと邪魔になってしまいます。

よってどちらのデータがを使うかは入れるもの次第で
扱う値がfloat型に収まりそうであれば、float型を使います。
float型で扱える範囲より大きい有効桁数の数字を扱いたいときはdouble型を使います。
「難しい」ってなんだろう？

<h2>「難しい」てなんだろう?</h2>
今年の東大物理は史上最高に難しかったと言われている。
解ける人はほとんどいなかっただろうと思われ、予備校の先生が泣きを入れていたという話もある。
解けないから難しい、たしかにそうだけどなぜ解けないか？を考えると「難しい」ってどういうことなのかというのが見えてくる。
<h3>それほど難しくはない要素が数多く絡み合って、全体的に複雑になっている。それを解きほぐすのに苦労する</h3>
おそらく今回の問題はこれだろう。図を見るとわかるけどめちゃ複雑な装置だ。それぞれにどんな力が加わり、どんな電気が流れるのかを一つ一つ見ていかなければならないんだけど、見落としがあったら正解はでない。しかも受験には【制限時間】がある。時間無制限でいいって言われたら、東大を受けるような学生なら解ける子も多いだろう。
<h3>求められる知識が多くて、その一つでも欠けると解けない</h3>
これもあるかもしれない。でも、東大を受けるような学生がこの問題に求められる知識を欠いていることはないだろう。また、欠けている知識が多すぎるともはや「チンプンカンプン」で難しさも実感できないよ(笑)
<h3>必要な条件が少なくて、類推に苦労する</h3>
「間違い探し」「詰将棋」を例にするとわかりやすい。問題文に<br />
『2つの絵に10この間違いがあります』<br />
『9手詰め』<br />
とあるのと<br />
『2つの絵に間違いがいくつあるか？』<br />
『(詰め手数のない問題)』<br />
という問題では圧倒的に後者のほうが難しく感じる。
理系の問題では、大問の中に小問があって、順に解いていけば大問の正解にたどり着けるものがあるが、それが前者。でも東大は大問の正解だけを求められることも多くそれだけでも難しくなることがある。
<h3>出題が下手で読解に苦労する</h3>
これは入試問題ではないけど、実社会では嫌というほどよくある(笑)。もはや日本語になっていない仕様書とかね。
いずれにしても超難問は嫌だよね～
データ型について(rails)

# データ型に関して
データベースのデータ型はいろいろな種類があってわかりにくいです。
どういったときにどのデータ型を使えばいいのかわからなくなるので言語化できるようまとめて行きます。

# データ型の概要

rubyではデータとデータの処理の集まりをオブジェクトと言います。
「プログラミングを行うと気に便利な単位」がデータ型と呼ばれるものです。

プログラミングでは各データがどのようなデータを示しているか区別するためにデータ型というものがあります。
ネコは名前（文字列）なのか数字（数値）なのかです。

# データ型種類一覧

<table>
  <caption>HTMLの要素</caption>
  <thead>
    <tr>
      <th>データ型</th> <th>概要</th>
    </tr>
  </thead>
  <tr>
    <td> integer </td> <td>整数型（４バイト）</td>
  </tr>
  <tr>
    <td> bigit </td> <td>整数型（８バイト）</td>
  </tr>
  <tr>
    <td> decil </td> <td>固定長整数型（精度の高い少数）</td>
  </tr>
  <tr>
    <td> float </td> <td>数値（浮動小数点数）</td>
  </tr>
  <tr>
    <td> string </td> <td>文字列(1~255の文字)</td>
  </tr>
  <tr>
    <td> text </td> <td>長い文字列(1~4,294,967,296文字)</td>
  </tr>
  <tr>
    <td> date </td> <td>日付(1000-01-01 〜 9999-12-31)</td>
  </tr>
  <tr>
    <td> datetime </td> <td>日付と時刻(1000-01-01 00:00:00.000000 〜 9999-12-31 23:59:59.999999)</td>
  </tr>
  <tr>
    <td> time </td> <td>時刻 (-838:59:59 〜 838:59:59)</td>
  </tr>
  <tr>
    <td> timestamops </td> <td>タイムスタンプ ('1970-01-01 00:00:01' UTC ~ '2038-01-19 03:14:07' UTC)</td>
  </tr>
  <tr>
    <td> binary </td> <td>バイナリティ文字列型</td>
  </tr>
  <tr>
    <td> boolean </td> <td>真偽</td>
  </tr>
  <tr>
    <td> primary_key </td> <td>プライマリーキー</td>
  </tr>

</table>

# integerとbigint

integer: 整数型４バイト
bigint: 整数型８バイト

昔は整数型はintegerのみだったようですがのみだったのですが、大規模のSNSサイトなどは会員数だけでも
かなりの数になってしまいintegerだけでは対応できなくなってしまいました。
そこでrails5.1からidカラムがbigintに変更できるようになりました。

# textとstring

string（１〜２５５文字）
・名前
・住所
・パスワード
text(1〜4,294,967,296文字)
・コメント
・投稿文

# timestamとdatetime

timestamp：タイムスタンプ ('1970-01-01 00:00:01' UTC ~ '2038-01-19 03:14:07' UTC)
datetime：日付と時刻(1000-01-01 00:00:00.000000 〜 9999-12-31 23:59:59.999999

timestamは2038年までしか対応しておらず。
日時を記録する場合はdatetimeを使う方向になりました。

# binary

「バイナリ」とはコンピューター用語で、データが「０」と「１」で表現されているデータ式です。
railsでは「テキストのない情報でデータが書かれているファイル」という認識になるかもしれません。

バイナリファイルの主なものとしましては
・音声ファイル
・画像ファイル
・圧縮ファイル

# boolean
一般的には真（true）と偽（false)のような状態を表すデータ型を表します。
【Remix】TsyringeとResourceルートを使用する場合に注意が必要なこと

RemixとTsyringeを使用して、アプリケーションを作成していた。
Auth0を導入する過程で、`/auth/auth0`と`/auth/auth0/callback`というルートを作成するために、`app/routes/auth/auth0.tsx`と`app/routes/auth/auth0/callback.tsx`を作成した。

```md
// 問題が発生したときのファイル構造
- routes
  - auth
    - auth0.tsx
    - auth0.callback.tsx
```

ところが、アプリを起動して上記のルートと関係のない`"/"`や他のルートにアクセスしたところ、今まで発生しなかったエラーがブラウザ側で発生した。

```shell
Uncaught Error: tsyringe requires a reflect polyfill. Please add 'import "reflect-metadata"' to the top of your entry point.
```

これはTsyringeのREADME.mdにも記載されていて、Tsyringeを使用する場合は、`import "reflect-metadata"`をエントリーポイントに追加する必要があるということを意味している。

https://github.com/microsoft/tsyringe#installation

ただ、すでに`app/entry.client.tsx`や`app/entry.server.tsx`に`import "reflect-metadata"`を追加しているので、なぜこのエラーが発生するのか分からなかった。

色々数時間をかけて分かったことは、`auth.ts`というファイル自体を作成する必要があったということだった。

```auth.tsx
import type { LoaderArgs } from "@remix-run/server-runtime";
import { redirect } from "react-router";

export const loader = ({ request }: LoaderArgs) => redirect("/login")
```

これにより、ブラウザ側で上記で発生した`import "reflect-metadata"`に関するエラーが発生しなくなった。

なので、Resourceルートを作成する場合でかつTsyringeをそのResourceルートで使用する場合はディレクトリ名と同じファイルのResourceルートを作成する必要があることに注意が必要。

```md
// 解決したときのファイル構造
- routes
  - auth.tsx
  - auth
    - auth0.tsx
    - auth0.callback.tsx
```
tfenvを使用したTerraformのインストール方法

# 概要
Terraformを自身のPCにインストールしたので、その方法を備忘録も含めて記載します。

# tfenvの概要
`tfenv`は、`Terraform`のバージョン管理を簡単に行う為のツールです。異なるバージョンの`Terraform`を使用したプロジェクトがある場合、問題が発生する場合があります。`tfenv`を使用する事で、簡単に異なるバージョンの`Terraform`を切り替える事ができます。

https://github.com/tfutils/tfenv

# Terraformの導入方法
## 手順1 
`Homebrew`を使用する為、`Homebrew`をインストールしてない場合は、インストールして下さい。公式サイトのリンクを下記に貼っておきます。導入方法が分からない場合は、下記のリンクを参考に、`Homebrew`をインストールして下さい。
- [Homebrew (macOS（またはLinux）用パッケージマネージャー)](https://brew.sh/index_ja)
- [【インストール方法から使い方まで】Homebrew についてわかりやすく解説！](https://blog.kikagaku.co.jp/homebrew-install-howto)

## 手順2
ターミナルにて、下記のコマンド入力する
```sh
brew install tfenv
```
もし、事前に`Terraform`をインストールしている場合、下記のコマンドをターミナルに入力して、`terraform`をアンインストールして下さい。

```sh
brew unlink terraform
```

## 手順3
下記のコマンドを入力して、`tfenv`がインストールされている事を確認する。また、`tfenv`を入力する事で、使えるコマンドリストが表示される

```sh
tfenv

tfenv 3.0.0
Usage: tfenv <command> [<options>]

Commands:
   install       Install a specific version of Terraform
   use           Switch a version to use
   uninstall     Uninstall a specific version of Terraform
   list          List all installed versions
   list-remote   List all installable versions
   version-name  Print current version
   init          Update environment to use tfenv correctly.
   pin           Write the current active version to ./.terraform-version
```

## 手順4
インストールしたいバージョンを確認する
```sh
tfenv list-remote

1.4.0-rc1
1.4.0-beta2
1.4.0-beta1
1.4.0-alpha20221207
1.4.0-alpha20221109
1.3.9
1.3.8
# 以下省略
```
## 手順5
該当のバージョンを指定してインストールする。`rc1`、`beta`、`alpha`はデモタイプだと思われる為、使用しない方が良いかとおもわれます。複数インストールする事も可能です。
```sh 
tfenv install 1.3.9
# v1.3.9 をインストールする
```

使わないバージョンは、下記のコマンドで消去可能です。
```sh
tfenv uninstall 1.3.5

Uninstall Terraform v1.3.5
Terraform v1.3.5 is successfully uninstalled
```

インストールしたバージョンを確認する
```sh
tfenv list
* 1.3.9 (set by /usr/local/Cellar/tfenv/3.0.0/version)
　　　　1.3.7
```

## 手順6
使用したいバージョンを適用する
```sh
tfenv use 1.3.9
# バージョンを切り替える

Switching default version to v1.3.9
Default version (when not overridden by .terraform-version or TFENV_TERRAFORM_VERSION) is now: 1.3.9
```

## 手順7
`terraform`のバージョン確認コマンドを使用して、`terraform`がインストールされている事を確認する。`terraform`のバージョンが表示されれば、`terraform`が使用できるかと思います。
```sh
terraform --version

Terraform v1.3.9
on darwin_amd64
```

# 参考資料
- [Automate Infrastructure on Any Cloud with Terraform](https://www.terraform.io/)
- [Terraform のバージョン管理に tfenv を使う](https://zenn.dev/mihohoi/articles/4e15a098a08c25)
- [M1 MacにTerraform + tfenvをインストールする](https://zenn.dev/yumemi_inc/articles/72d187a3fabcfb)
社内サイト構築勉強③(さくらのレンタルサーバ+Laravel)：Bootstrapテンプレート利用

# 前提・概要

プロジェクトは前回記事にて作成したものを想定。

# 本日の完成形
テンプレート画面が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284198/eff41c80-82bd-78b5-dab1-baf443cc521f.png)


## 1.テンプレート適用
こちらの内容を参考にさせていただきました。

https://biz.addisteria.com/laravel_extends/

ただし手順は結構変えてしまっているので、こちらでも記載します。


### ①LaravelにBootstrapをインストール
前回手順でインストールしてしまいましたが、コマンド下記です。
```bat:cmd
php artisan ui bootstrap --auth
```

### ②Bootstrapのテンプレートをダウンロード
SB Admin 2 を入れてみました。
下記からfree downloadにてダウンロードしました。

https://startbootstrap.com/theme/sb-admin-2

### ③top.blade.phpを作成
DLしたindex.htmlをresources -> views -> top.blade.php としてコピーしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284198/f9ec04ac-80cd-6d06-78ec-ec639b1f4b43.png)

### ④フォルダのコピー
DLしたフォルダの中になるフォルダを全て（css・img・js・scss・vendor）を全て、public の直下へコピーしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284198/891fd0a9-e7b1-3d8c-75e4-d30114934dc4.png)


### ⑤web.phpを編集
```php:routes/web.php
Route::get('/top', function () {
    return view('top');
});
```

### 動作確認
サーバ起動
```bat:cmd
cd C:\Users\ADMIN\source\repos\社内サイト
php -S localhost:8000 -t public
```
http://localhost:8000/top
へアクセス。

テンプレート画面が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284198/eff41c80-82bd-78b5-dab1-baf443cc521f.png)

左下の「<」ボタンも押下してアコーディオンが動作することを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284198/168091c6-4f80-e095-dbd2-37d02098a063.png)

## 2.さくらのレンタルサーバにて動作確認
### ①git push
git にてpush しておく

### ②さくらのレンタルサーバへssh接続
```bat:cmd
ssh FTPアカウント@FTPサーバ名
```

### ③git pull
```bat:cmd
cd 社内サイト
git pull original master
```

### ④ブラウザからアクセス
https://xxx.sakura.ne.jp/社内システム/top
にてSB Admin 2 のテンプレートと同様のものが表示さればOK
Azure インスタンスサイズと変更注意点について

実際Azureポータルで対象VMのサイズを選択すると、
サポートできる他のVMサイズは有効になりますので、実機確認するのは簡単です。
Azure知識がある方は事前にどんな制限があるかたは[Azure仮想マシン変更制限](https://qiita.com/j-dai/items/7a914f37903ca1e57610#azure%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E5%A4%89%E6%9B%B4%E5%88%B6%E9%99%90)にご参考頂いたらと思います。


# Azure仮想マシンのサイズについて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/af8298ab-feed-eab3-384d-771be50ac0f9.png)

[Sizes for virtual machines in Azure](https://learn.microsoft.com/en-us/azure/virtual-machines/sizes)
[VMセットアップ—Azureのワークロードに最適な仮想マシンはどれですか。](https://www.youtube.com/watch?v=zOSvnJFd3ZM)

Tips: 同じTypeに他のインスタンスもサポートされる

# Azure仮想マシンの世代：Gen1、Gen2
※利用できない場面を除く、新世代を使用しましょー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/1993fd65-766f-33f7-c646-1a084075a08d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/fba743f8-e1e7-112f-ceec-0eb6d76a58ff.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/99e8ce01-8ff0-2404-6a98-b58d45dca604.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/b7a91299-908e-0adf-64d8-abaf690fe071.png)

Tips
①Gen2は32bitのOSをサポートしない。
②Gen1は2TBより大きいディスクをサポートしない。

[More...](https://learn.microsoft.com/en-us/azure/virtual-machines/generation-2)

# Azure仮想マシン変更制限
- ローカル一時ディスク有無
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1348505/dfa57c3b-3f79-6d1b-3ae2-6a2725011048.png)

- (スペック縮小する場合)接続ディスクはVMの最大データディスク数に超過すると変更不可

- (スペック縮小する場合)接続NIC数はVMの最大接続数に超過すると変更不可
		
- 世代にサポートしないVMサイズに変更不可
※Gen1のみをサポートしている VM サイズの例：Av2　Dv2　Dv3　Dav4　Ev3　Ev4 
※Gen2のみをサポートしている VM サイズの例：DCsv2　FX  
[More...](https://learn.microsoft.com/en-us/azure/virtual-machines/generation-2)

- 高速Networkが有効な場合、サポートしないVMサイズ(D8ms)に変更不可
Docker上のReactでのHot Reloadがうまくいかない。

# はじめに
初めてQiitaに投稿する＆見習いエンジニアです。

# 開発環境
Windows11
Docker
React 18.2.0
Typescript  4.9.4
react-scripts 5.0.1

Docker上にcreate-react-appを利用してReactの開発環境を作成しています。

バージョンは後日記載します。

# 問題
ソースを修正してもブラウザ上ですぐに反映されませんでした。
いわゆるHot Reloadがうまくいきませんでした。

Ubuntu上でDockerを用いている時には特に問題なく動くのですが、Windows11条のDockerを用いる際にはどうしてもうまくいきませんでした、

# 解決方法

以下の2つを併用して解決しました。

1. create-react-appを利用しているフォルダ直下に.envファイルを作成した。
``` .env
CHOKIDAR_USEPOLLING=true
WATCHPACK_POLLING=true
```

1. docker-compose.ymlファイルに以下を記載した。

``` docker-compose.yml
    environment:
      - CHOKIDAR_USEPOLLING=true
      - WATCHPACK_POLLING=true
```

# 参考文献
https://qiita.com/ape/items/a4268e991211c1e154af
https://github.com/facebook/create-react-app/issues/11879

# なお
Hot Reloadはできるようになったもののソース変更してからブラウザに反映されるまでの時間がかなり長いです。。
後々解決したいとおもいます。
【Blender】私的Blenderメモ

メモです

趣味はBlenderで作ったものをニチャァ~🥴
って表情で見るのが好きです、モチベが、マジのガチのほんまのマジマジのマジで良くなります

![unnamed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843707/05417511-60dd-04b9-7bf4-3b0652ea7d3b.jpeg)


<br>
<br>

## モチベ
https://asobo-design.com/nex/blog-1025-33686.html

<br>
<br>

https://youtu.be/28ne4Y_Buu0

<br>
<br>

https://michikom1996.com/koramu/things-necessary-for-creation/

<br>
<br>

https://chromitz.com/20180903-make-3d-avatar-for-vrchat-but-failed/

<br>
<br>

https://youtu.be/9RVh0FXCqZo

<br>
<br>

https://www.youtube.com/watch?v=58_HoeRnyeE

<br>
<br>
<br>
<br>

## キャラモデリング

全体から作ったほうが簡単そう(?)だし何より楽しそう

https://www.youtube.com/watch?v=pDZQnyy0f8k

https://www.youtube.com/watch?v=EQOoTkafklY

https://www.youtube.com/watch?v=T4hHZhh5K8s&list=PLkryP5_y-sRe4mVibmaw8LMilegyY2JON&index=4

<br>
<br>
<br>
<br>
<br>

随時更新予定です、しらんけど()
ASP.NET CoreでPostgreSQL上にテーブルを作成する手順

# はじめに
この記事は、ASP.NET CoreでPostgreSQL上にテーブルを作成する手順を記載した記事である。

# 環境
* OS：Windows11
* IDE：Microsoft Visual Studio Community 2022 (64 ビット) - Current Version 17.4.4
* プロジェクトテンプレート：ASP.NET Core Webアプリ（Model-View-Controller）
* フレームワーク：.NET7.0(標準用語のサポート)
* PostgreSQL：15.1
# 手順
1. 「ツール」→「NuGetパッケージマネージャー」→「ソリューションのNuGetパッケージの管理」を選択
1.  「参照」タブをクリックし、検索欄に「npgsql」と入力し検索
1.  「Npgsql.EntityFrameworkCore.PostgreSQL」を選択し、画面右側のプロジェクトにチェックを入れ、インストールを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697198/d6c5c09c-3fce-f527-ddc4-d4e3c078280b.png)
1. appsettings.jsonを下記のように修正する
    ```javascript:appsettings.json
    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*",
      "ConnectionStrings": {
        // --------変更_start--------
        "WebApplication4Context": "Host=[PostgreSQLのホスト名];Database=[PostgreSQLのDB名];Username=[PostgreSQLのユーザー名];Password=[PostgreSQLのパスワード]"
        // --------変更_end--------
      }
    }
    ```
4. Program.csを下記のように修正する
    ```c#:Program.cs
    using Microsoft.AspNetCore.Identity;
    using Microsoft.EntityFrameworkCore;
    using WebApplication2.Data;
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    var connectionString = builder.Configuration.GetConnectionString("WebApplication4Context") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
    
    // --------変更_start--------
    builder.Services.AddDbContext<WebApplication4Context>(options =>
        options.UseNpgsql(connectionString));
    // --------変更_end--------
    // 以降、省略

1. SQLServcerと同様、マイグレーションを実施
    ```bash
    Add-Migration InitialCreate
    Update-Database
    ```
1. pgadminで確認すると、テーブルが作成されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697198/b0b0c3f1-b821-b78d-3046-d9af60847041.png)
Salesforce Dataアーキテクトまとめ

<h1>データモデリング</h1>
<p>主従関係</p>
<ul>
<li>子レコードのアクセス権は、親レコードと同じ。</li>
<li>子レコードごとにアクセス権を変更したい場合は、参照関係を使用し、トリガやフローによって定義。</li>
<li>親レコードを削除すると、子レコードも削除される。</li>
<li>制限としては、1オブジェクトに設定できる主オブジェクトは2つまで。中間オブジェクトとして指定することで、多対多の構造を実現することが出来る</li>
Windows/Mac論争

# win/Mac論争

## はじめに

 - Windows/Mac論争は、近現代におけるきのこの山/たけのこの里戦争とも呼ばれて久しい論争であり、完全に優劣をつけることが常に難しい命題です。

 -  どちらかでないとできないことは基本的にありません。やりやすさの差分はありますが、どちらを選んでも大丈夫です。

 - かわいい、という直感的な感情は理論を超え、非常に重要と言えます。経験則からも間違いありません。

<p>上記を前提とし、Windows/Macそれぞれのメリデメを紹介し、
半ばMacに心を持っていかれてる現状においてどういった判断軸でその決断を100%確定すれば良いのか？、というトーンでまとめます。</p>

## Windows/Macそれぞれのメリデメ

表でまとめると下記のとおりになります。
一般的な比較表とは軸が違い、個人向けにまとめた物のため、網羅性はありません。

||Windows|Mac|
| --- | --- | --- |
|価格|◎安価|☓高価|
|美しさ|○物次第|◎圧倒的|
|慣れ|○現在環境とほぼ同様|☓キーボード操作、画面操作、アプリの入れ方などすべて学び直し。日本語切り替えも違うし、デリートキーも無い。|
|操作性|○現在環境とほぼ同様|◎秀逸なiPhone/iPad連携、慣れてしまえば直感的|
|安定度|○トラブルもあるが、再起動したら大体解決する。|◎トラブルは少ない|
|新しい事への挑戦/問題解決|◎大半がwindows向けの記事が書かれており、調べやすい|△Mac向けの記事は少なく調べにくい|
|拡張性|○あとからメモリ増設(??)など改造可能|☓無し|

要するにMacは、頑張って慣れてさえしまえば
- 値段が高いこと
- 新しいことをやりたい時や問題解決調べにくい
- 拡張性（などという、初心者には縁が遠い要素）

以外の点で、Windowsを上回るはずです。
慣れに対して多少寛容になれて、上記を飲めるならMacは良い選択肢です。
※ただし、この「慣れ」は重要で私個人としてはWindowsへの慣れが圧倒的なためどちらをこの世から消すか、と聞かれると迷わずMacを消します。

## 本当にMacがかわいいか？

さて、ここまでMacに対して恣意的に気持ちを傾けてきました。
また、冒頭でかわいいは正義、みたいなことも言いました。

ここで、あえてMacだけではなく、Windowsの中にもかわいい子はいるんじゃないか？という問いを例を挙げながら投げかけたいと思います。

Windowsがかわいく思えたら、二重丸こそ少ないもののやはりWindowsは万能優秀選手なのです。
Windowsがかわいいな、という目で表を見返すと、逆になぜMacを買うんだろう？という気持ちにもなりそうです。

1つだけかわいいっぽいWindowsを紹介します。

## Surface Laptop Go TNU-00020

<img src="https://cdn-dynmedia-1.microsoft.com/is/image/microsoftcorp/MSFT-Surface-Laptop-Go-open-from-side-angle-RE4CNaD:VP5-1920x1080" width = "200px">
<img src="https://cdn-dynmedia-1.microsoft.com/is/image/microsoftcorp/MSFT-Surface-Laptop-Go-in-Platinum-RE4CV3X:VP5-1920x1080" width = "200px">


https://onl.tw/ZJwzGNG
 - 7万円ポッキリ！かわいい！
 - 見た目も薄くてかわいい！かな？
 - 1.11kg Macより軽い！かわいい！
 - バッテリー最大13時間 十分かわいい！

一方Macは・・・
 - 1.29kg 軽いけどちょっと重い
 - 16万円 かわいくない
 - Windowsに戻れない体になる。こわい。

どうでしょうか？
他にもおしゃれな良く出来たWindowsはあります。
Macは確かにスタインウェイかもしれません。でもWindowsにもかわいい銘機は存在します。

## 結論
さて、いろいろ書きましたが結局、Windows/Mac論争は冒頭でも述べたとおり
常に優劣を付けづらい命題であり、現代におけるきのこの山たけのこの里戦争とも呼ばれて久しい[^1]論争です。

冒頭の「どういった判断軸でその決断を100%確定すれば良いか」に対して言えることは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3232699/a1722ce8-8a2c-3f1e-548f-fb0f8611489b.png)

ここまでお読みいただいてMacがかわいいなら間違いありません。
以上です。

 
[^1]:ちなみにこの話は適当に考えたデタラメです。
【Rails】Chart.jsで１週間の投稿数をグラフ表示する

# 完成形
過去１週間で投稿された本をグラフにしてみます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3231090/28629dc9-ced5-b78b-4a8f-85264c115c22.png)

# chart.jsをインストール
### 環境
* Ruby 3.1.2
* Rails 6.1.7
* yarn 1.22.19

### 手順
```
$ yarn add chart.js
```
Yarnでchart.jsをインストールします。

```app/javascript/packs/application.js
import Chart from "chart.js/auto";
global.Chart = Chart;
```
application.jsに記述を追加し、インポートします。

## グラフを表示
ここからは実際にグラフを表示していきます！

### １週間に投稿された本の数を取得
今回はユーザーの詳細画面でグラフを表示するので、showアクションに記述します。
```users_controller.rb
def show
    @user = User.find(params[:id])    # ユーザーを取得
    @books = @user.books              # ユーザーが投稿した本を全て取得
    @this_week_book_counts = []
    6.downto(0) do |n|
       @this_week_book_counts.push(@books.where(created_at: n.day.ago.all_day).count)
    end
end
```
見慣れない記述があるかと思いますので、詳しく見ていきましょう！
<br>
```
@this_week_book_counts = []
```
ここでは空の配列を定義しています。この配列には投稿された本の数を１日ずつ追加します。
<br>
```users_controller.rb
6.downto(0) do |n|
   @this_week_book_counts.push(@books.where(created_at: n.day.ago.all_day).count)
end
```
downtoメソッドは**初期値から１ずつ減らしながら引数の値になるまで処理**をしてくれるメソッドです。
rails cを使って処理を確認してみます！

```
$ rails c
> 5.downto(2) do |n|
>   puts n
> end

# 結果
5
4
3
2
```
6.downto(0) do |n| とすることで、nに6から0までの数字を入れながら順に処理をしてくれます。
<br>
```users_controller.rb
@this_week_book_counts.push(@books.where(created_at: n.day.ago.all_day).count)
```
pushメソッドは配列に要素を追加するメソッドです。
pushの引数にn日前に投稿された本の数を渡し、@this_week_book_counts配列に追加しています！
<br>
この時点で配列の中身はこのようになっています。
```
@this_week_book_counts => [0, 2, 0, 0, 0, 3, 4]     # [6日前, 5日前, 4日前, 3日前, 2日前, 1日前, 今日]
```
あとはこのインスタンス変数を使ってviewでグラフ表示させるだけです🔥

### Viewファイルに記述を追加
公式サイトに元のテンプレートがあります。

https://www.chartjs.org/docs/latest/getting-started/

```users/show.html.erb
<canvas id="bookChart"></canvas>    # グラフを表示させたい場所に追加 

<script>
  const ctx = document.getElementById('bookChart');
  
  new Chart(ctx, {
    type: 'line',
    data: {
      labels: ['6日前', '5日前', '4日前', '3日前', '2日前', '1日前', '今日'],
      datasets: [{
        label: '投稿した本の数',
        data: <%= @this_week_book_counts %>,
        borderColor: 'blue',
      }]
    },
    options: {
      plugins: {
        title: {
          display: true,
          text: '７日間の本の投稿数'
        }
      },
      y: {
        min: 0,
        max: 10,
      },
    },
  });
</script>
```
datasetsのdataに先程の配列を渡すことで、グラフを作成してくれます！
* type: 'line'で折れ線グラフ
* options: yで縦軸の最小値、最大値

を設定しています。
グラフの種類は他にもあるのでぜひ調べてみてください！

# 余談
今回は動きがわかりやすいためdowntoメソッドを使用しましたが、以下の記事のようにmapメソッドを使うと、空配列を用意せずに実装することができます。

https://qiita.com/ki_87/items/d22238d14b298ef22a85

# 参考記事
https://qiita.com/kazama1209/items/5f7e870c6d5cfe38d96e
org.springframework.core.io.buffer.DataBufferのログ出力後、レスポンスボディが出力されない。

# 目的
ログ出ししながら、FluxやMonoを返したい。

# 問題
DataBufferをログ出力すると、レスポンスボディが空になってしまった。

# 原因
DataBufferには読み出し位置が移動するため、

* ログ出力
* レスポンス

の2回出力を必要とする場合、`dataBuffer.readPosition(0);`の実行が必要。

# 対応
ログ出力後、`dataBuffer.readPosition(0);`を行い、後続処理へ渡せば良い。
クリックされた点に重なっている要素をすべて取得する

## やりたいこと

任意の点をクリックしたとき、重なっている要素すべてを取得したい。
( 例えば  **x**  をクリックした場合は A, B, D を取得)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187987/c0e89035-d5cc-0752-294f-949a4d097e22.png)

それぞれの要素は `position: absolute` などで位置が指定されており、親子関係にない。
そのためイベントのバブリングでは実現できない、というケース。

## document.elementsFromPoint

こういう場合は `document.elementsFromPoint` を使うと楽に取得できる。

https://developer.mozilla.org/ja/docs/Web/API/Document/elementsFromPoint

MDNによると「実験的な機能」らしいので、念のためにポリフィルを導入する。

https://github.com/JSmith01/elementsfrompoint-polyfill/blob/master/index.js

## サンプルコード

click イベントを範囲広めに設定して、 `clientX` `clientY` を `elementsFromPoint` に渡すだけ。超らくちん。
ただし、 elements には body や html 要素も含まれるので、不要なら自前で取り除く必要がある。

```js
document.addEventListener('click', e => {
  const elements = document.elementsFromPoint(e.clientX, e.clientY)

  elements
    .filter(element => {
      // 不要な要素は自前で取り除く
      const tagName = element.tagName.toLowerCase()
      return !['html', 'body'].includes(tagName)
    })
    .forEach(element => {
      // 何かの処理
    })

})
```

https://codesandbox.io/embed/autumn-butterfly-9g963j?fontsize=14&hidenavigation=1&theme=dark

--

もしそれぞれの要素の click イベントを発火させたい場合は filter で `e.target` を除いてから `dispatchEvent` を呼ぶと良さげ。
（そうしないとイベントが二重に呼ばれちゃうから）

```js
document.addEventListener('click', e => {
  const elements = document.elementsFromPoint(e.clientX, e.clientY)

  elements
    .filter(element => {
      return element !== e.target
    })
    .forEach(element => {
      element.dispatchEvent(new MouseEvent('click'))
    })
})

document.getElementById('A').addEventListener('click', e => { alert('A') })
document.getElementById('B').addEventListener('click', e => { alert('B') })
document.getElementById('C').addEventListener('click', e => { alert('C') })
document.getElementById('D').addEventListener('click', e => { alert('D') })
```