OmniAICreator/Qiita-1.07M huggingface dataset:
【TypeScript】enum型からunion型へ書換え

# はじめに
TypeScriptのenum型には問題点があり、enum型の代替案としてunion型を用いて実装する方法があります。
enum型からunion型への書換えは初めてだったので、書換えた時に調べたことを備忘録も兼ねてまとめました。
ちなみに、enumの問題点は下記の方の記事がとても参考になりました。

https://qiita.com/saba_can00/items/696baa5337eb10c37342

# 結論
書換え方法は下記文献を参考にしました。
[サバイバルTypeScript：列挙型(enum)の問題点と代替手段](https://typescriptbook.jp/reference/values-types-variables/enum/enum-problems-and-alternatives-to-enums)

- enum型
```tsx
enum Fruit {
  ORANGE = "みかん",
  APPLE = "りんご",
  PEACH = "もも"
}

console.log(FRUIT.ORANGE); // みかん
```

↓

これを下記のように書換え

↓

- union型
```tsx
const Fruit = {
  ORANGE: "ORANGE",
  APPLE: "APPLE",
  PEACH: "PEACH",
} as const;

type Fruit = typeof Fruit[keyof typeof Fruit]; // type Fruit= "ORANGE" | "APPLE" | "PEACH"

const FruitName = (name: Fruit): string => { 
  switch (name) {
    case Fruit.ORANGE:
      return "みかん";
    case Fruit.APPLE:
      return "りんご";
    case Fruit.PEACH:
      return "もも";
  }
}

console.log(FruitName(Fruit.ORANGE)); // みかん
```

# 参考文献
今回は参考文献が多かったため分類して分けております。
各内容の詳細について下記文献を参考にしてください。

## enum
[TypeScript DeepDive：Enum](https://typescript-jp.gitbook.io/deep-dive/type-system/enums)
[サバイバルTypeScript：列挙型 (enum)](https://typescriptbook.jp/reference/values-types-variables/enum)
[[Typescript] 「なぜ enum の利用が推奨されないのか？」をまとめてみた](https://qiita.com/saba_can00/items/696baa5337eb10c37342)
[サバイバルTypeScript：列挙型(enum)の問題点と代替手段](https://typescriptbook.jp/reference/values-types-variables/enum/enum-problems-and-alternatives-to-enums)

## as const(****constアサーション****)
[TypeScript DeepDive：Type Assertion（型アサーション）](https://typescript-jp.gitbook.io/deep-dive/type-system/type-assertion)
[サバイバルTypeScript：constアサーション「as const」 (const assertion)](https://typescriptbook.jp/reference/values-types-variables/const-assertion)

## リテラル
[TypeScript DeepDive：リテラル型](https://typescript-jp.gitbook.io/deep-dive/type-system/literal-types)
[サバイバルTypeScript：リテラル型 (literal type)](https://typescriptbook.jp/reference/values-types-variables/literal-types)
※パッと見た感じリテラルを使用してなさそうですが`as const`で指定することでプロパティがリテラルタイプになります。詳しくは`as const`をご確認ください。

## **typeof 演算子**
[サバイバルTypeScript：typeof演算子 (typeof operator)](https://typescriptbook.jp/reference/values-types-variables/typeof-operator)

## keyof 演算子
[サバイバルTypeScript：keyof型演算子](https://typescriptbook.jp/reference/type-reuse/keyof-type-operator)
良かった・良くなかった交流会の特徴

## 概要

今までゲーム大会(交流会)主催30回以上、交流会や勉強会やその他集まりの参加100以上の自分が思ったよかったイベントの特徴と(表には出ないけど)あまり良くなかったイベントをずらずら書いていこうと思います。論外なもの(詐欺まがい、マナーが悪い主催など)はここでは除外します

## 良かったイベントの特徴
### 運営者が積極的に初参加の人に話を振る(話をかける)
次回も参加するかどうか？で個人的に一番大事にしている所。
初参加の人が一番緊張しているのでそれを解してあげればほぼ全員で盛り上がることができる

### 名前がわかる場所に置いてある
名前を呼んで会話した方が距離が縮むのは間違いない。
よく名札を配るイベントがあるが、見えないと意味がないので注意

### 明確に交流時間がある(交流会の場合)
作業だけだとどうしても話す機会がない。好きな時間に話てください！と言っても自分から話にくいですよね。それを解決するには皆で話す機会を設けるのが一番だと思います

### イベント終了後に食事会(飲み会)がある
作業中の交流だけだと話す人数も時間も限られるため。
交流したいのであればむしろ食事がメイン

### 交流するかどうかがある程度HPでわかる
例えばゲームトーナメント(敗者復活なし)の場合は交流をメインとしている人が少ないため、負けたら即帰宅という形式で問題ないと思います。
ここまで極端なイベントは少ないものの、交流します！というイベントで作業だけして解散！というのは見かけるので、交流メインするのか否かは何かしらでわかる形でHPに書きたいですね

## よくない具体例
### 交流します！といいつつ運営(身内)だけで盛り上がる
個人的に一番気にしている点。
初回の参加者に多少話を振るにしても常連ばかり話をしているシーンは何度か見かけました

### 一方的な発表が長い
施設案内や注意事項などは必要なので問題ないのですが、企業紹介とかその他宣伝を10分~20分されると「いや、そう言う目的で来てないから」ってなっちゃいますね。
企業紹介とかその他宣伝は長くても3~5分程度にしておいて興味のある人が出てきたら「個別」に案内するのがベターだと思います

### 交流がメインの場合、(シャッフルなどして)話す人数が多すぎる
色んな人と話せた！と言う意味ではいいですが、一人も名前覚えないでイベント終了はよくあります。
多くの人と話したい！と言う目的の場合はこれで問題ないと思いますが、人脈を作りたい！と言う目的であれば話す人数はある程度絞った方がいいでしょう

## とりあえず参加してから考えて良い
ここまで色々行ってきましたが、HPからではわかる情報は少ないのでとりあえず参加してみるスタンスでいいと思います。
参加費は大体3桁ですし、時間も2~3時間程なので何かを失うデメリットはほぼ0だと思います。
良い交流会ライフを！
PG15/PG16：Fix overwrite of successive result sets with psql's <query> \g fname

# はじめに
にゃーん。趣味でポスグレをやっている者だ。

この記事は[PostgreSQL 16 全部ぬこ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/pg16-all-nuko) 16日目の記事です。
今回は``psql``メタコマンドのbug-fixについて書きます。

# 概要

|項目|内容|
|:--|:--|
|タイトル|[Fix overwrite of successive result sets with psql's <query> \g fname](https://commitfest.postgresql.org/40/3923/)|
|Topic|Bug Fixes|
|ステータス|commited|
|Last Modified|2022-10-03|
|概要|``psql``で複数SQL記述直後の``\g``メタコマンドの挙動改善|

# 変更内容
全部ぬこアドベントカレンダー13日目の記事でも、``psql``の``\g``メタコマンド（直前のコマンドを繰り返し実行する）について書きましたが、PostgreSQL 15/16ではそれとは別に、バグフィックスっぽい改善も入っています。

## どんなバグなのか
簡単に言うと、psql上で複数ステートメントを1ラインで実行した直後、``\g file``を実行したときに、最後に実行されたコマンドの結果しか書き込まれない、という問題のようです。
    
:::note info
なお、この問題は、PostgreSQL 15.0では既に改善されています。
:::

## PostgreSQL 15(たぶんbeta4まで)での挙動

```sql
=# select 1\; select 2;
 ?column?
----------
        1
(1 row)

 ?column?
----------
        2
(1 row)

=# select 1\; select 2 \g file
=# \q
$
```
``psql``を終了して、``file``の内容を確認します。
```bash
$ cat file
 ?column?
----------
        2
(1 row)

$
```
最後に実行された``SELECT 2``の結果しか書き出されていませんね。

## PostgreSQL 15.0/PostgreSQL 16での挙動

```sql
=# select 1\; select 2;
 ?column?
----------
        1
(1 row)

 ?column?
----------
        2
(1 row)

=# select 1\; select 2 \g file
=# \q
$
```
``psql``を終了して、``file``の内容を確認します。
```bash
$ cat file
 ?column?
----------
        1
(1 row)

 ?column?
----------
        2
(1 row)

$
```
全てのコマンドの結果が``file``に書き込まれています。これがあるべき動作ということですね。

# おわりに
今回はPostgreSQL 15開発中にFixされた、PostgreSQL 15/16に反映された、``psql``の新機能について書きました。
``\g file``指定自体、この調べ物をしていて初めて知った・・・psqlなんもわからん。
WSL+cudaでBumblebee(Stable Diffusion)が動きません

# WSL+cudaでBumblebeeを試して見る

livebook起動で簡単に動くかと思ったのですが、そうはいきませんでした。

普通に実行してみたら、エラー発生。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/f67e430a-9aca-98b0-7f29-7a4eb0b26c0b.png)

WSL版のcudaパッケージには、libcudnnが入っていない為、エラーが発生しました。いままでcudnn使ったものをGPUで実行してなかったので気づきませんでした。入ってないのは知ってたんですが。

# インストール方法

Ubuntu 22.04のWSLの場合は、次のURLから.debを取得してインストール

```bash
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/libcudnn8-dev_8.7.0.84-1+cuda11.8_amd64.deb
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/libcudnn8_8.7.0.84-1+cuda11.8_amd64.deb
sudo apt install ./libcudnn8-dev_8.7.0.84-1+cuda11.8_amd64.deb ./libcudnn8_8.7.0.84-1+cuda11.8_amd64.deb
```

Ubuntu 20.04のWSLの場合は、次の記事参照

https://qiita.com/GeekMasahiro/items/5cd8318af8e2f3706d4b




# Text-to-image(Stable Diffusion)を試して見る

GPUのメモリーが12GBなんですが、これでは足りないようです。
OOM Debuggingが表示されました。
Tensorflowの環境では、動作してたので、動いてほしいなぁ。
[issue](https://github.com/elixir-nx/bumblebee/issues/101)に上げました。動くようになるといいなぁ。

```
04:48:00.452 [error] Execution of replica 0 failed: RESOURCE_EXHAUSTED: Out of memory while trying to allocate 3546709984 bytes.
BufferAssignment OOM Debugging.
BufferAssignment stats:
             parameter allocation:    3.84GiB
              constant allocation:       144B
        maybe_live_out allocation:   768.0KiB
     preallocated temp allocation:    3.30GiB
  preallocated temp fragmentation:       304B (0.00%)
                 total allocation:    7.15GiB
              total fragmentation:   821.0KiB (0.01%)
```

CPUで動作させれば、動いたので、まずはCPUで遊んでみよう！
【WordPress】バックアップを取得する

# 前回の記事
Happy Holidays♪
前回の記事では、テーマのコードを直接編集する方法について確認しました。

https://qiita.com/raptony110/private/9b4a3a812bd5c12c65ef

今回は、ついに最終回です。バックアップ方法について確認しましょう！

僕のAdvent Calendarを読み終わって、
「へぇ簡単なんだなぁ〜　自分もWordPress使ってサイト作ってみようかな〜」って思うあなたがそこにいたのなら、、、、
読むだけで、頭の中WordPress化しちゃったんだよッ！！！！

https://qiita.com/advent-calendar/2022/wordpress-output

# UpdraftPlus WordPress Backup Pluginをインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/1236265a-b0f2-dcce-469f-3a4e17065af4.png)

## インストールして、有効化すると、すぐにツアーが始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/e96ae120-b47c-75cd-3a80-97c7e2b15e71.png)

## 定期実行を設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/752aea02-b856-fb32-d54d-be7e7b106e32.png)

## 保存先を指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/35b56c26-d41c-ac7f-4b02-5ca8555c39f8.png)

## バックアップ対象を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/865171e0-4f3a-328a-1b57-a5e29ebc9d07.png)
設定を保存する

# バックアップを取得する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/3c4101ae-ba00-48d7-041d-14d8537c8b33.png)
今すぐバックアップボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/cf16a294-2ede-8536-1b14-d829fcfb2208.png)

# バックアップから復元する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/e36827dc-61fd-5540-fd5d-6864d921b09b.png)
復元をする際は、復元したいバックアップファイルを選択した状態で、復元ボタンを押すだけです。

# おわりに
いかがでしたでしょうか。今回の記事では、バックアップ方法について確認しました。

と、いうわけで、最後までお付き合いいただきまして、ありがとうございました！！
唐突に始めたひとり完走チャレンジも、なんとか最終日を迎えました。
仕事もありながらで夜な夜な作業したり、休日にストックを作ったり結構大変だったなぁという記憶です笑

これにて、Qiita Advent Calendar2022 ひとり完走を終わります。
みなさん、素敵なクリスマスをお過ごしください✨
垂直タブ について知らなかったこと

2020 年からアドベントカレンダー期に毎日何かを投稿するという奇祭に参加する習わしがあり今年もゆるゆる参加してみようと思い書くもの。

Edge の話です。別に強制されるわけでもないのだが Edge を真面目に使うようにし始めた。し始めてからのこと、やたらタブを開いてしまいがちの人 (私) に良いものを早々に見つけた。それは垂直タブ... 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/b1944dbe-b3bb-3dca-69e9-661cb9ff93b3.png)

左側縦一列のこいつである。Chrome でも拡張を入れれば楽しめるが。

[GoogleChrome™の垂直タブ - Chrome ウェブストア](https://chrome.google.com/webstore/detail/vertical-tabs-for-google/acnamgmgmbamffefgplhkplaanebgkac?hl=ja)

[Edge の３つの機能が便利すぎてChromeから乗り換えた。後悔はしていない（ステマでもない） - シアトル生活はじめました](https://watanabe-tsuyoshi.hatenablog.com/entry/2022/03/16/111912)

> グループ化を「垂直タブ機能」と合わせて使った時に、管理のし易さがマックスになります。
> 具体的には以下のような点で便利です。

> - 垂直タブの場合ページタイトルが読める。
> - グループ化するとメンバーのタブがみなインデントされて、視覚的に分かりやすい。
> - 垂直タブだと「タブの移動」が楽。開いているタブ群って生き物のように変化しますよね。タスクAにひつようなタブがあって、そのために「タスクA」と名付けたグループがあったとしても、タスクAが終わるとその中のタブは要らなくなるから閉じますが、そのうちいくつかのタブが、別のタスク「タスクＢ」にも必要だたとする。そんな時、タブをグループを跨いで移動するのに、垂直タブの方が水平タブよりもドラッグする距離が短い（場合が多い）ので楽に感じます。
> - 垂直タブだと「タブを閉じる時のドキドキストレス」が無い。これは私だけかもしれませんが、水平タブでタブの幅がすごい狭くなると、それをクリックするときに誤って閉じてしまうような気がしてストレスでした。実際はタブがアクティブでないと「ｘ」ボタンを押せないのでそんなことはないのですが。一方、垂直タブの場合はタブ幅に余裕があるので、ストレスなく開くことができるし、「ｘ」ボタンはしっかり狙わないと押し間違えることはないです。

> つまり、別の表現でまとめると「何十ものタブの中で迷子になりにくい」、そして「タブの幅の余裕があるのでいろいろストレスが減る」といったものになります

というわけで最近は Edge と Chrome 両方開きながらお仕事している。本業は Edge、いまこれは Chrome で書いてるっていった具合。何でも試してみるってたのしいね。以上今年私が知らなかったことでした :snowflake:
【WordPress】テーマをカスタマイズする方法

# 前回の記事

前回の記事では、2段階認証の設定方法について確認しました。

https://qiita.com/raptony110/private/8bf239e8c0aad58ee621

今回は、テーマのカスタマイズ方法について確認しておきましょう。

僕のAdvent Calendarを読み終わって、
「へぇ簡単なんだなぁ〜　自分もWordPress使ってサイト作ってみようかな〜」って思うあなたがそこにいたのなら、、、、
読むだけで、頭の中WordPress化しちゃったんだよッ！！！！

https://qiita.com/advent-calendar/2022/wordpress-output

# WordPressテーマを編集する
## 必ずバックアップをとりましょう
バックアップを取る方法は、プラグインを使っても、直接PHPファイルを退避させる方法でもどちらでも大丈夫です。
要は、自分が編集してうまく動作しなかった時に、正常動作するファイルの状態に戻すことが要件だからです。
次回で、プラグインを使ったバックアップ方法をご紹介予定です。

## 直接PHPファイルを編集する
WordPressのバージョンによっては、WordPressの管理画面上からPHPやCSSファイルを編集することができますが、私は推奨していません。
結局やりたいことは、コードを書き換えたいだけなので、直接ファイルをテキストエディタ等で編集した方が良いです。
自動でタグ補完などの機能があれば使うメリットもあるかもしれないですが、そのような機能はありません。
ですので、使い慣れたエディタで直接PHPファイルを編集した方が良いと考えています。

## 部分的にPHPや、cssコードを追加する
テーマによっては、部分的にコードを追加することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/da83868b-cf14-5d04-9ec1-9520a6c7548d.png)
また、投稿ページや、固定ページでも、コードコンポーネントを配置することでコードを埋め込むことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/42b7cbf9-252f-f429-cee4-20ad63993ece.png)

# おわりに
いかがでしたでしょうか。今回は、WordPressのコードを直接メンテナンスする方法についてご紹介しました。

次回は、ついに最終回です。WordPressのバックアップ方法について確認して、AdventCalendar2022を締めたいと思います。
それは、お楽しみに！
テストケースを作るときに気を付けていること

# はじめに
[株式会社 RetailAI X Advent Calendar 2022](https://qiita.com/advent-calendar/2022/retail-ai-x) の 10 日目の記事です。
昨日は@uwattotaitaiさんの『[Rust UIライブラリ「Dioxus」をReact+Typescriptと比較してみた](https://qiita.com/uwattotaitai/items/4d262e46c2165e01f477)』でした。

私はQAチームに所属しており、アプリやWEBサービスのテストを行うことが多いので『テストケースを作るときに気を付けていること』を書いてみることにしました。

# テストケースとは？
テストを実行する際の条件や、手順、期待結果などをまとめたものです。
テストケースを作成することでテスト対象の抜け漏れ防止や、誰でもテストの内容が理解できるようになります。

# テストケースを作る時に気を付けていること
#### 1. 具体的に書く
例えばテスト手順に「入力ボックスに8桁を入力する」と書かれている場合、英字？数字？半角？全角？など様々なパターンが想定され、期待したテストが行えない可能性があります。
誰がテストを行っても同じ手順、同じ結果になるように「入力ボックスに[test1234]を入力する]など具体的に書く必要があります。

#### 2. テスト技法を利用する
境界値分析やデシジョンテーブルテストなどのテスト技法を利用することで必要なテストパターンを定めることができます。
> 境界値分析とは、テスト対象の仕様の中で「○○未満」「○○以上」など値に境界が存在する場合にその境界付近を狙う、テストケースを作成するためのテスト技法です。

参考：[「境界値分析」](https://www.veriserve.co.jp/gihoz/boundary.html)
> デシジョンテーブルテストとは、複雑な判定ロジックの整理に有用な決定表（デシジョンテーブル）の考え方に基づき、入力条件の組み合わせと対応する出力結果を整理することでテストケースを作成する技法です。

参考：[「デシジョンテーブルテスト」](https://www.veriserve.co.jp/gihoz/decision-table.html)

#### 3. 準正常系、異常系のパターンを想定する
正常系以外のテストパターンも考えてテストケースに落とし込みます。
以下の記事がわかりやすかったので引用させていただきます。
>画像アップロード機能を例として挙げると
>正常系
>想定内の入力をした時に想定通りの出力ができることの確認
>例) 正常に画像をアップロードできることを確認する
>
>異常系
>想定外の入力をした時の挙動の確認(想定外エラーの確認)
>例) 画像アップロード中にネットワークエラーの時の挙動を確認する
>
>準正常系
>想定外の入力ではあるが、想定通りの出力ができることの確認(想定内エラーの確認)
>例)想定外の拡張子をアップロードした時のエラー挙動を確認する

参考: [正常系と異常系と準異常系
](https://qiita.com/YoheiKanamaru1/items/1818e8ec934f4bbe5e9c)

# 最後に
テストケースの項目を全て実施すればテストが完了とは言えません。
利用者がより使いやすいUIや、わかりやすい表現などを提案することも重要な観点です。
テストケースの消化を目的とせず、利用者の立場を考えてテストを行っていきたいと思います。
次回は@broccolibroccolibroccoliさんの『デザインチームを立ち上げた話』です。
【WordPress】2段階認証を設定してセキュリティを強化する

# 前回の記事

前回の記事では、プライバシーポリシーページの作成方法を見てきました。

https://qiita.com/raptony110/private/045ef07f113d7f10d09c

今回は、WordPress管理画面へのログインについて、2段階認証を設定して、セキュリティを高めましょう。

僕のAdvent Calendarを読み終わって、
「へぇ簡単なんだなぁ〜　自分もWordPress使ってサイト作ってみようかな〜」って思うあなたがそこにいたのなら、、、、
読むだけで、頭の中WordPress化しちゃったんだよッ！！！！

https://qiita.com/advent-calendar/2022/wordpress-output

# Two-Factorプラグインをインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/99ad05c3-4a58-83a7-0fe9-2a3ab6d815b2.png)
プラグイン>新規追加メニューを開き、検索窓に「two-factor」と入力すれば、結果に表示されます。
インストールして、有効化しましょう。

# 2段階認証を設定する
ユーザー>ユーザー一覧メニューを表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/27ac0e59-c16e-0119-0256-50de0100ed05.png)
設定したいユーザーにカーソルを合わせて、編集ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/c236fed6-a2fe-48fd-b6f4-2d015d5656b1.png)
　
プロフィール画面の下部へスクロールすると、「Two-Factor設定」の設定欄が表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/d9bbf4e9-45b1-5702-16e6-29bf5ee3f4b0.png)
セキュリティ上、キャプチャをお見せすることはできませんが、4つの中から二要素を選択することができます。
- メール
- Time Based One-Time Password (TOTP)
- FIDO U2F 秘密鍵
- バックアップ検証コード（使い捨て）

今回は、Time Based One-Time Password (TOTP)を選択しました。スマホアプリに表示されているQRコードを読ませ、認証コードを入力して認証できれば設定完了です。
では、これで認証画面に戻ってみましょう。WordPress管理画面をログアウトします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/64237656-9bef-acac-c213-5361849e96b0.png)
ID/Passを入力すると、二要素を問われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/931158c6-37dc-6dca-6bf4-07d9fdae9ede.png)

:::note alert
二要素認証の設定で、メールは選択しないでください。正しくメールが送られない可能性があります。
正しく機能していないようです。
少なくとも私は、認証コードのメールを受け取ることができずに大変困りました。

:::

## 強制的にTwo-Factorプラグインを無効にする方法を記しておきます
レンタルサーバーへFTPで接続して、Two-Factorのディレクトリ名を変更してください。プラグインが保管されているディレクトリは以下の通りです。
```
(インストールフォルダ)/wp-content/plugins/two-factor/
```


# おわりに
いかがでしたでしょうか。今回の記事では、セキュリティ向上のために、2段階認証を設定しました。
これで安心してWordPress管理画面に入ることができます。が、私が経験したように、うまくせていできないとログインできなくなり大変困ります。
その点はお気をつけください。

次回は、WordPressテーマのカスタマイズ方法について学びます。お楽しみに！
古き良きオススメの技術本

寒くなってきましたねー。
気がつけばもう12月10日です。
何書こうかと悩み途中まで書いたものの収集がつかなくなって急に方向転換してこの記事を書いていますｗ

30代半ば頃の私は、プロジェクトマネージメントの仕事が多くなってきており、周りではまだアジャイルという開発手法を実践的に行っている現場が少なく、色々を書籍を漁っていました。
当時、業務委託で来てもらっていたエンジニアに教えてもらったXPを読んだ時は衝撃を受けたのを覚えています。
そこから、海外筆者中心で色々と読んでおり、未だに影響を受けている本を紹介したいと思います。



# XP(エクストリームプログラミング)
完全に私のバイブルです。

ただ、前職で色々なな人読め読めと勧めた結果、所在がわからなくなってしまった一冊で、今は手元にありません…涙
今でも読みたい本なので、まだ前職にいる人に探してもらおうと思います（なかったら買うかな）。

XPとは Extreme Programmingの事です。
直訳すると「行き過ぎたプログラミング」とか「極端なプログラミング」になりますねｗ
よく、 Extreme Programmingは、「開発手法の一つ」と言われがちなのですが、そうではないです。
これはあくまで、アジャイルに則った形の、極端な手法を書いてあるだけです。
そのため、本質としては、「ある問題に対して、こうやって極端にやれば解決できちゃんじゃないの？」という感じです。

わかりやすいのがペアプロで、これはレビューの時間がもったいないから「You, レビューしながらプログラミングしちゃいなよ」という感じですw
アジャイルの原則である「動く＝価値のあるソフトウェアを早く継続的に提供する」に則っています。

結局、何が言いたいかというと、本書にあるプラクティスはある問題についての解決策の案でしかないこと。
だから、「銀の弾丸はない＝全てに効く薬はない」と何回も言っていて、それをただ実施すればいいということではありません。
起きてる課題に対して、置かれている環境や文化の中で取捨選択を行い、その場にあった解決策を考えるということです。

この本の初版がでた際、「銀の弾丸」と思われることが多く、それぞれが持つ開発文化とミスマッチの中、この本を参考に実践しようとして挫折する人が多くいましたｗ
その為、否定されることも多かったのですが、初版ではこれはあくまで究極論であり、解決したかったのはこういうことだ、というのを第2版で語られています。

細かい言葉までは覚えていませんが、すごく印象的だったのが、「アジャイルが当たり前になってアジャイルという言葉が世の中からなくなればいい」的な事が書かれています。
今、メタップスでやっている事は、アジャイルの原則を元にプロダクトを作っており、それを実践している若いメンバーがアジャイルという言葉知らないということ、、、少し感動的です。
ケント・ベックさん、そういう世の中になってきましたよ。


# Clean Architecture 達人に学ぶソフトウェアの構造と設計
この本は2018年に出ているので、比較的最近ですね。
（若干どうでもいい話だけど、googlebooksでは2017年に出ていることになっているけど、本には初版は2018って書いてある！）

著者であるロバート・C・マーチンさんは、アジャイルの提唱者の一人であり、すごく有名。
多分日本版だけのサブタイトルで「アーキテクチャのルールはどれも同じである！」とありますが、そのとおりかなと思っています。
インプットがあり、データがあり、ビジネスロジックがあり、アウトプットがある流れをよりレイヤーを細分化し役割を明確にすることで、クリーンなアーキテクチャができあがる（そのまま）って話。
結構、ボイラープレートコードができるので、少しコード量（というかファイル量）が増えるので、少しなれが必要な気がするけど、kotlinでClean Architectureに則って実装した時にはめちゃくちゃスッキリ書けたのを覚えてます。
今でも、別言語での別フレームワークを使って、ソフトウェアのアーキテクチャに悩んだ時は、これを思い出して、考えたりしています。

# エリック・エヴァンスのドメイン駆動設計
前述のClean Architectureと親和性の高い設計手法DDDの本。
ソフトウェアの設計は「ビジネス層に対してどうアプローチをするか」という話で様々なアプローチ方法があります。
このDDDはその根幹であるビジネス＝ドメインを軸に設計をブレイクダウンしていく手法等。
複雑になるシステムを、「どう整理して設計していくか」です。
Clean Architectureと親和性の高いというのは、そのブレイクダウンしていく過程で細分化されたものの構造が、Clean Architectureのプログラム構造とよく似ているから。
あまりDDDを知らないときから、無意識にドメインというものを意識して設計していたけど、この本を読んだ時、それを言語化された感じしっくりきたのを覚えてます。
知らないで似たような事を実践している人は多いと思います。

# リーン開発の現場 カンバンによる大規模プロジェクトの運営
これも結構印象的でした。
筆者が実際に経験したプロジェクトを元に、問題とどうやって解決していったかが書かれている。
これも、前職で誰かに貸して戻ってきないやつ…。
内容は覚えていたけど、タイトル忘れたから必死にググりましたｗ
この手の、スクラムとかカンバンとか書かれている本は、プラクティスの説明が多く、実践としての話ではないので面白くないが
この本は、「なるほどねー」と面白く読めた。

# まとめ
これ以外にも本は読んでいますが、結局はあくまで「知識」でしかない。
「開発のやり方」を教えてくれるわけではなく、「開発に対する考え方」を教えてくれていると思って読んだ方がいいと思っています。
本の通りにやったからといって、プロジェクトが成功するわけではなく、その環境によって課題や解決策が違うということ。
だから、こういった本を読むことで知識を増やし、問題に対してその場にあった解決を行うことだと思っています。
今年も、残り僅か！楽しんで開発をしましょう！
【WordPress】プライバシーポリシーページを作成する

# 前回の記事

前回の記事では、ウィジェットにSNSアイコンを設置する方法について見てきました。

https://qiita.com/raptony110/private/c91a78af219d4c7c3f41

今回は、プライバシーポリシーを作成していきます。

僕のAdvent Calendarを読み終わって、
「へぇ簡単なんだなぁ〜　自分もWordPress使ってサイト作ってみようかな〜」って思うあなたがそこにいたのなら、、、、
読むだけで、頭の中WordPress化しちゃったんだよッ！！！！

https://qiita.com/advent-calendar/2022/wordpress-output

# プライバシーポリシーについて
プライバシーポリシーとは、個人情報保護に関する対応方針を明示する文章のことで、Webサイト管理者が明示するべきものです。
個人情報を扱っているつもりがなくても、サイトへの訪問者分析ツールなどが、訪問者の情報を収集しています。つまり、あなたのWebサイトが個人情報を収集している可能性があるのです。
個人情報を集めることは、悪いことではありません。しかし、集めた個人情報の保護と利用目的を明示することは、Webサイト管理者の責務です。
プライバシーポリシーのページは必ず作成しておきましょう。
# プライバシーポリシーページの作り方
と、言われても、どうやって作成すれば良いかわからないですよね。
安心してください。WordPress何には、雛形が用意されていますので、雛形をもとに、ご自身のWebサイトに合わせてカスタマイズすることで、
簡単にプライバシーポリシーページを作成することができます。

設定>プライバシーメニューを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/d4916c7f-268f-1ae7-60bd-0f578b94e0ba.png)
生成ボタンを押すと、雛形をもとにした固定ページが書き起こされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/effc57dd-e27e-017d-d41d-f2a84834d45d.png)

いろいろと聞きなれない単語が記載れていると思いますが、一つ一つ調べて理解しておきましょう。そして、ご自身のWebサイトで収集している個人情報の活用先として、不足があれば追記してから保存しましょう。

# おわりに
いかがでしたでしょうか。今回の記事では、プライバシーポリシーページの作成方法について確認しました。

次回は、WordPressのセキュリティ強化として2段階認証の設定方法を見ていきます。
VSCode使ってるなら自動保存と自動フォーマットを使おう

## はじめに

この記事は[長野高専 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nnct)の10日目の記事です．主催者が一つしか記事を上げないのもどうかと思ったので急遽書き上げました．
ここではVSCodeの基本的な設定である，自動保存と自動フォーマット機能を紹介します．

## 自動保存とは？

**自動保存とは文字通りファイルを編集した後に自動で保存してくれる機能です．** VSCodeはデフォルトでは自動保存は無効になっており，編集した後のファイルには「●」がつくようになっています．
画像の場合だと，`gradation.rs`は編集してまだ保存していないので「●」がつくようになっており，`bmp.rs`は保存済みなので特に何も付いていません．

![編集済みのファイルと未編集のファイル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628629/6cc9f144-6bf2-52f6-9a88-aa1bb5d613c0.png)

普通なら`gradation.rs`を保存する場合は`Ctrl + s`[^1]や上のメニューから「Save」を選択することで保存することができますが，いちいち保存するのは少々面倒です．
そこでVSCodeには自動保存機能があります．これはファイルを編集した後，任意のタイミングで自動的にファイルが保存されるようになります．ファイルを編集した後は大抵の場合は保存しますし，元に戻したい場合もエディタのUndoやGitなどから戻せるので自動保存機能は基本的に有効にしておいたほうがいいでしょう．

[^1]: macOSの場合は`Command + s`で保存できます．

## 自動保存機能を有効にする方法

自動保存機能は設定メニューから有効にすることが可能です．設定メニューは左下の歯車のアイコンから「Settings」を選択したり`Ctrl + ,`[^2]から開くことができます．

[^2]: macOSの場合は`Command + ,`で設定メニューを開くことができます．

![設定メニューの開き方](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628629/5d6c7765-f7b3-ec3a-2d7e-c49b1d623472.png)

設定メニューの検索欄に「autosave」と入力すると，`Files: Auto Save`という項目が出てきます．ここから自動保存機能の有効化無効化の設定やどのタイミングで保存するかを設定することができます．

設定項目は4項目あります．
- `off`: 自動保存機能を無効化します(デフォルト)
- `afterDelay`: 最後に編集してから任意の時間が経つと保存されます
- `onFocusChange`: 編集中のファイル以外にフォーカスが当たる(別のファイルを開いたり，ターミナルにカーソルを向けるなど)と保存されます
- `onWindowChange`: VSCode以外のウィンドウにフォーカスが当たると保存されます

`afterDelay`の秒数設定は`Files: Auto Save Delay`から行うことができ，デフォルトでは`1000`(1秒)になっています．

![Auto Saveのオプション一覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628629/eec5ee8d-b64d-74b6-3ffa-10e09791421e.png)

## 自動フォーマットとは？

多くのプログラミング言語の場合，演算子の間の空白や改行などは自由に挿入することができますが，きちんと揃えないととても読みにくいコードになってしまいます．**これを機械的に揃えてくれるツールがフォーマッタです．**

下記の画像がフォーマット前のコードです．インデントや空白がぐちゃぐちゃでかなり読みづらいです．

![フォーマット前のコード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628629/19d7521e-fa98-bfa5-acec-fe99cbd3fdf7.png)

下記の画像がフォーマット後のコードです．インデントや空白が揃えられ，前よりも読みやすくなっています．

![フォーマット後のコード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628629/e1a3b242-e013-1e04-efaf-bab69bebe0f1.png)

ほとんどの言語でフォーマッタが開発・提供されており，中には言語やフレームワークに組み込まれている場合もあります．[^3]このフォーマッタでコードの体裁を整えることをフォーマットといい，VSCodeでも`Shift + Alt + f`[^4]でファイル全体をフォーマットすることができます．[^5]
ただ，いちいちコードを書いた後にショートカットキーを使ってフォーマットするのは面倒です．ここで使うのが自動フォーマット機能です．この機能を有効にするとファイルを保存したりコードをコピペしたあとに自動的にフォーマッタを動作させてフォーマットすることができます．

[^3]: Go言語やDenoなど．
[^4]: macOSの場合は`Shift + Option + f`でファイル全体をフォーマットすることできます．
[^5]: 一部言語はフォーマッタ統合用の拡張機能が必要です．

## 自動フォーマット機能を有効にする方法

自動フォーマット機能も自動保存機能と同様に設定メニューから有効にする事が可能です．検索欄に「format」と入力すると，`Editor: Format On Paste/Save/Type`という項目が出てきます．これはそれぞれ「コードのコピペ後」，「ファイルの保存後」，「改行後」のフォーマットを有効にするかどうかの設定です．なお，改行後のフォーマットは一部フォーマッタが未対応です．ファイルの保存後のフォーマットは自動保存機能と一緒に使うことで自動保存からの自動フォーマットが可能です！

![自動フォーマット機能の設定欄](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628629/7337c14f-b7e5-8e6b-8ed9-74c38e0b0da0.png)

## 最後に

VSCodeはそのままでもそれなりに便利ですが，きちんと設定することで更に便利にすることできます．ここで紹介したのはVSCodeの便利機能のほんの一部なので自分にあった設定をして，コーディング環境を整えていきましょう！
【NeosVR】なぜアイテムやワールドが18MBと表示されるのか【解決方法あり〼】

こんばんは。きさらぎです。

この記事は[Neos VR (その3) Advent Calendar 2022][adv-3]の2日目の枠にさかのぼり投稿する記事です。
1日目はnonoNoxさんのquestコンでピースしたかった話の予定です。

## 背景

ある日、NeosJapanのDiscordサーバーに次のような質問がありました。

> インベントリ整理していると、適当に保存したワールドもアイテムも大体17MBと少しという容量のものが多いのですが、何か固定で変なデータでも入っているのでしょうか？

kazuさんは「シェーダのデータも表示としては出てくるので多分それです」と答えていましたが、私は気になったので少し調べてみることにしました。

## 検証の手順
### コード
1. まずReSharperを開きます。
1. 左ペインのタブをExplorerにします。
1. 左上のプルダウンをAssembliesにします。
1. プルダウンの下の段の一番左に値札のようなボタンがあるのでそれをクリックします。
1. [以下EULAに抵触する危険性があるので省略]

### ワールド
1. [ExportNeosToJson](https://github.com/zkxs/ExportNeosToJson)を入れます
1. NeosVRに入ります
1. 新しいワールドを作ります。このときSpaceWorldを選択します
1. 新しいワールドに入ります
1. 何もせずセーブします。このとき保存する場所はお好みで構いません
1. インベントリにワールドオーブが追加されます
1. 追加されたオーブを一度クリックしてスポーンさせます
1. オーブをグラブしたままダッシュメニューを開きます
1. File Browserを開きます
1. 右上の緑色になった`[+]`を押します
1. ダッシュメニューを閉じます
1. `Export as`と書かれたダイアログが出てきます
1. `JSON`を選択します
1. `Export`を押します
1. ダイアログが閉じます
1. ターミナルを開きます
1. 以下のコマンドを打ちます。ここで、`$EXPORT_JSON`は適切なファイルパスで置き換えてください。また、PowerShellをお使いの場合は~~書き換えるのが面倒だったので~~適宜読み替えてください。

```sh:script.sh
#!/bin/sh
jq < $EXPORT_JSON | \
  grep '@neosdb:///' | \
  sed -E -e 's! *"Data": !!g' \
    -e 's!@neosdb:///!https://assets.neos.com/assets/!g' \
    -e 's/.webp//' | \
  jq -r | \
  xargs --replace -- curl -sSL --head {} | \
  grep content-length | \
  awk '{ print $2 }' | \
  jq -s add
```

おそらく、あなたは以下の出力を得ることでしょう。
```text:output
18460784
```

## 検証の結果
結局あれこれ調べた結果、空のワールドが18MBとして表示されるのは「予めNeosVRに組み込まれたフォントについて、利用者のストレージ使用量として計上されているように見える実装になっているからである」ということがわかりました。なのでそれを気合で潰します。

そして出来上がったのが[DoNotIncludeDefaultResourceForSize](https://github.com/KisaragiEffective/DoNotIncludeDefaultResourceForSize)です。これを使うと上記の方法で作成したワールドの容量表示は約100KBとなり、より正確な消費量が計上されることが期待できます。

## 終わりに
さすがにそうはならないと思うので、NeosVRのイシュートラッカーであるNeosPublicに[チケットを発行](https://github.com/Neos-Metaverse/NeosPublic/issues/3799)しました。
直るといいなあ…(遠い目)

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

### 3日目の記事
* [その1](https://adventar.org/calendars/7623): [neosでゲームを作るときに困ったことと解決策](https://qiita.com/sweshelo/items/493eaedf4914ae8d2f97) - Swesheloさん
* [その2](https://adventar.org/calendars/7624): [アイテムのサムネイルに好きな画像を設定する方法](https://zenn.dev/fukuro/articles/7451e9785b3e9f) - Fukuroさん
* [その3][adv-3]: [NeosVRで作ったもの・関わったものまとめ(2022年)](https://note.com/akiram_vr/n/n3842d4981d00) - akiRAMさん

[adv-3]: https://adventar.org/calendars/8421
Next.jsのテスト入門

# Next.jsのテスト入門

React.js初心者でもテストの重要さはよく知っています。
テストを書くことは、技術的負債を少しでも減らすことへの第一歩です。

Next.jsでのテストのベストプラクティスを調べてみました。

単体テストについては、Jest & React Testing Frameworkがベストプラクティスになると思います。

E2Eテストについては、Cypress、Playwright、Seleniumなどを組み合わせるみたいです。


### Jestと React Testing Libraryを使うには、

#### 1\.Jtestのインストール
```
npx create-next-app@latest --example with-jest with-jest-app
```

#### 2\.Jestのセットアップ(Rustコンパイラを使用）
jest-environment-jsdom@testing-library/react@testing-library/jest-domをインストールします。
```
npm install --save-dev jest jest-environment-jsdom @testing-library/react @testing-library/jest-dom
```

#### 3\.プロジェクトのルートにjest.config.jsファイルを作成して以下を追記します。
```
// jest.config.js
const nextJest = require('next/jest')

const createJestConfig = nextJest({
  // Provide the path to your Next.js app to load next.config.js and .env files in your test environment
  dir: './',
})

// Add any custom config to be passed to Jest
/** @type {import('jest').Config} */
const customJestConfig = {
  // Add more setup options before each test is run
  // setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
  // if using TypeScript with a baseUrl set to the root directory then you need the below for alias' to work
  moduleDirectories: ['node_modules', '<rootDir>/'],
  testEnvironment: 'jest-environment-jsdom',
}

// createJestConfig is exported this way to ensure that next/jest can load the Next.js config which is async
module.exports = createJestConfig(customJestConfig)
```

#### 4\.テストの作成

テストスクリプトをpackage.jsonに追加する。
```
"scripts": {
  "dev": "next dev",
  "build": "next build",
  "start": "next start",
  "test": "jest --watch"
}
```
jest --watchファイルが変更されたときにテストを再実行します。


最初のテストを作成する

プロジェクトでテストを実行する準備が整いました。__tests__プロジェクトのルート ディレクトリのフォルダーにテストを追加することで、Jest の規則に従います。

たとえば、<Home />コンポーネントが見出しを正常にレンダリングするかどうかを確認するテストを追加できます。
```
// __tests__/index.test.jsx

import { render, screen } from '@testing-library/react'
import Home from '../pages/index'
import '@testing-library/jest-dom'

describe('Home', () => {
  it('renders a heading', () => {
    render(<Home />)

    const heading = screen.getByRole('heading', {
      name: /welcome to next\.js!/i,
    })

    expect(heading).toBeInTheDocument()
  })
})
```

#### テストの実行
以下を実行するとテストが開始されます。
```
npm run test
```
実行すると成功または失敗が表示されます。


以上になります。
ありがとうございます。
【Salesforce Apex】 時間のデータ型項目をHH:mmフォーマットに変換する方法

## 問題
時間のデータ型項目は[Timeクラス](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_time.htm)のインスタンスなので、Timeクラスは時間を`HH:mm`フォーマットのStringに変換する関数持ってないため、工夫しないといけません。
例：
以下のコードで無理やり直接GMTのStringに変換すると
```apex
String str = String.valueOfGmt(p.StartTime__c);
```
以下のエラーが発生されました。
```
Method does not exist or incorrect signature: void valueOfGmt(Time) from the type String
```
ただ、Stringの`valueOf`で変換はできましたが、[正規表現](https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE)でStringを切り取らないといけません。
```apex
String str = String.valueOf(p.StartTime__c);
// 結果
// 10:00:00.000Z
```

## 解決
正規表現を使わず、一番適切な方法のステップは以下のようになります。
- `DateTime.now()`で新規[DateTime](https://developer.salesforce.com/docs/atlas.en-us.apexref.meta/apexref/apex_methods_system_datetime.htm)を作成して
- 更に、`DateTime.newInstanceGmt`で時間を上記の時間の値に置き換える
- `String.formatGMT('HH:mm')`で変換する
例：
```apex
DateTime b = DateTime.now();
b = DateTime.newInstanceGmt(b.year(), b.month(), b.day(), p.StartTime__c.hour(), p.StartTime__c.minute(), 0);
String timeStr = b.formatGMT('HH:mm');
// 結果
// 10:00
```

## ユースケース
- 時間のデータ型をJSON化する時に使えます。
- ローカル時間で表示させる際に使えます。

もし他のやり方があれば、ぜひコメントをお願いします！ :bow_tone3:
[検証]MessageとStateでの情報受け渡し時間の比較

# はじめに
この記事はVRサービス「VirtualCast」で使用できるVCIという仕組みについて扱った記事です。

# 要約
* message式の早押しVCIで押してるのに反応が遅いという報告があった
* 実験的にmessageとstateで差分を測定
* messageの方がstateより反映が遅めか同等。さらにmessageはたまに大きく遅れることがあった

# ことの発端
私の作ったVCIに、早押しクイズ企画などでの使用を想定した早押し機というアイテムがあります。
このVCIを使用している一部の方から「押したのに反応が遅く、他の人に押し負ける」という意見がありました。

はじめは回線ラグのせいかと思いましたが詳しく話を聞いてみたところ、別の早押しVCIではそのような現象は発生しないという話を受けました。
そのため、その2つのVCIの仕組みを比較し、私のVCIでだけなぜ押してから反応するまでの遅延が発生するのかを実験的に調べました。

# ２つの早押しVCIの仕組み
上記2つのVCIは基本的な仕組みは同じで、複数いる回答者が持っているボタンを押すと出題者へボタンを押したという情報を送り、出題者の方で受け取った情報をもとに着順判定をするというものです。
ただ、実際のコードを比較してみたところ、2つのVCIでは早押しの際の情報の送り方に違いがありました。

私のVCIは以下のような**Messageで情報を受け渡す方式**のVCIとなってます。
![Message式早押し機.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/3b1f5906-3f41-367e-b883-2b7dfb8384ae.jpeg)
一方、遅延が発生してなかったVCIでは**Stateの変更と監視により情報を受け渡す方式**となっています。
![State式早押し機.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/424c6c07-f5d6-c6e6-9519-8893e607a423.jpeg)
(Stateがどこにどのように保存されているかはあまり理解してないのでそのへんの図は適当です)

上記より、messageでの情報送信はStateより送信速度が遅い、または送れるときがあるのではないかと仮定し、今回検証用のVCIを作成し試しに測定してみることにしました。

# 検証内容
messageとStateの速度について以下のような方法で時間比較をしました
1. 測定開始の時刻を記憶
1. 各ユーザーに対し測定開始の合図をMessageで送信
1. Messageを受け取ったユーザーは以下の2つを実施する。(もしかしたら実行順でタイムが変わるかもしれなかったので、どちらを先に実行するかはランダムで決めてます)
    1. Message式の方法で情報を送信
    1. State式の方法で情報を送信
1. 各方式でデータを受け取った時刻から測定開始の時刻を引き、かかった時間をそれぞれ記録
1. 時間をVCI上に表示

図に表すと以下のようになります
![実験方法.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/4ec21240-d827-f779-4fe7-673ba3821889.jpeg)

# 検証結果
以下、何回かやってみた結果の抜粋となります。単位は秒で、色が付いてる場所が差があった場所です。
(私のだけやたら早いですが、これは自分に送るときは回線を通してないためだと思います。)
![結果_モザイク.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/af8332a6-ff38-6a51-42c4-3568034595a7.jpeg)

計20回くらいは試しましたが、上記のようにMessageがStateと同じか若干遅れるという結果になりました。
逆にStateが遅れることは一度もありませんでした。


また、エビデンスは残ってないですが、過去に作ったVCI(開始の合図の段階で送り方をMessage式とState式でそれぞれ分ける方式)で検証した際は、特定の人だけたまにmessage方式が秒単位で大幅に遅くなる現象が発生しました。その際もState方式は遅れることはありませんでした。
おそらく私のVCIで遅延が発生していた人もこのケースだったのではないかと思います。
(今回はその人と出会えなかったため未検証となってます。今回のVCIで検証できたら追記します)

# まとめ
* message式の早押しVCIで押してるのにつくのが遅いという報告があった
* 実験的にmessageとstateで差分を測定
* messageの方がstateより反映が遅めか同等。ただしmessageはたまに大きく遅れることがあった
 
上記の結果となる技術的な理由はわかってないですが、もしわかったら追記するか別の記事を書こうと思います。
DependentMapping & EmbeddedValue & SerializedLOB

![10.DependentMapping & EmbeddedValue & SerializedLOB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/37e6890e-8eca-0964-aad1-5799a41653fc.png)

https://bliki-ja.github.io/pofeaa/DependentMapping/

https://bliki-ja.github.io/pofeaa/EmbeddedValue/

https://bliki-ja.github.io/pofeaa/SerializedLOB/

Dependent Mapping と Embedded Value と Serialized LOB は、いずれもオブジェクトの属性が作る構造をどのようにテーブルの構造に対応付けるかに関するパターンです。

中でも Dependent Mapping は少し理解しにくいパターンですが、知ってしまえば有用なパターンです。

リレーショナルデータベースでは、id カラムのようなサロゲートキーが必要そうに見えても、必ずしもそうした全体固有キーが必要でない場合があります。カラム複数で主キーを成す、複合主キーがナチュラルキーになる場合があるからです。

ゲームに登場する武器の属性に、炎や雷といった複数の属性を付与できる仕様があるとしましょう。この関係は、もし炎や雷の属性の詳細として別のテーブルを参照する設計にした場合は、Association Table Mapping で多対多に関連付けたようなかたちになります。weapon_attribute テーブルの weapon_id と attribute_id の組み合わせは、すべての行についてユニークになります。このセットは、もし別のカラムが増えた場合でも、複合主キーとして有効です。

では、炎や雷といった属性に別テーブルに置くほどの詳細が必要なく、文字列か整数のカラムで済む場合はどうでしょうか。伝説の剣 (id=1) には炎の属性が 50%、雷の属性が 50%、職人の斧 (id=2) には水の属性が 100%、とデータ化していくと、このような表になります。

| weapon_id | element | retio |
|-:|:-|-:|
|  1 | fire | 50 |
|  1 | thunder | 50 |
|  2 | water | 100 |

weapon_id と element の組はユニークで、ナチュラルな複合主キーにできます。「この武器へのこの属性割当だけ」という、妙な問い合わせが必要でないなら、この表にサロゲートキーは必要ありません。こんなもの、特定の武器に従属させないと意味がありませんよね。

オブジェクトへのマッピングにおいても、武器を id で特定できればよく、属性はつねに武器から辿らえるのが自然です。クラスは２種類あるけれど、物としてはそれで一体の構造になってきます。このとき、武器には Identity Field が必要ですが、属性には Identity Field が必要ありません。変更をデータベースと同期するときは、属性を個別に管理せず、属性を巻き込んだ武器全体をひとつの管理単位とします。この形になったとき、武器はエンティティとなり、属性のコレクションは Dependent Mapping で武器エンティティの一部となります。

Embedded Value は Value Object (後で出てきます) を属性に持つオブジェクトの扱いにおいて、同様にエンティティ数の節約をする方法です。

リレーショナルデータベースのデータ型には、数値、文字列、日時といった、決まったものしか準備されていません。いっぽう、Value Object はいくらでも種類を増やせるうえ、内部に持つ値も、ひとつの整数や文字列にエンコードできない場合はよくあります。このとき Foreign Key Mapping を使わずに、Value Object の内部構造をテーブルのカラムに横展開してマッピングしようとするのが Embedded Value です。

そもそも Value Object とみなしたのだから、一意性には意味がありません。エンティティと考えるのは不向きです。エンティティはクエリの対象ですが、何かの色コードの RGB 値だけを個別取得したいなんてニーズは、まずありませんね。

Serialized LOB は、より複雑な Value Object をカラムに押し込むアイデアです。

HTML DOM のような、何層あるかわからない再帰的構造を持つ Value Object は、横展開することができません。もし各要素をエンティティとするなら、別テーブルに出して頑張ってツリー構造を表現するべきですが、そうでないなら、明らかに過剰設計です。リレーショナルモデルは再帰的ツリー構造には向いていません。

そこで、JSON や XML、あるいはプログラム言語のオブジェクトシリアライズを使い、巨大なオブジェクトを文字列やバイト列にエンコードたものを、文字数の上限がないテキストカラム、あるいは LOB/BLOB と言われるデータ列用の単一カラムに詰め込むのが、Serialized LOB パターンです。

Serialized LOB を使えば何でもマッピングできると思うかもしれませんが、これはデータベース技術の都合上、アンチパターンとされています。安易にこうしたエンコードによる押し込みをすると、データにインデックスを付けることも、リレーショナルデータベースが得意なテーブルの連結もできなくなるからです。また、必ずデータを復元できる保証もありません。デシリアライズしたとき、マッピング対象のクラス詳細が、保存時とは異なっていることもあります。復元時の完全性などなくてもいいから、ただ保存できさえすればいいのだ、と言い切れる場合にのみ、有効なパターンです。
【WordPress】SNSアイコンを設置しよう

# 前回の記事

前回の記事では、お問い合わせフォームを設置しました。

https://qiita.com/raptony110/private/63bdfc938140e5d70060

今回は、SNSアイコンを設置してみましょう。

僕のAdvent Calendarを読み終わって、
「へぇ簡単なんだなぁ〜　自分もWordPress使ってサイト作ってみようかな〜」って思うあなたがそこにいたのなら、、、、
読むだけで、頭の中WordPress化しちゃったんだよッ！！！！

https://qiita.com/advent-calendar/2022/wordpress-output

# フッターにSNSアイコンを設置する
今回はウィジェットを使って、SNSアイコンを設置してみましょう。
フッターに設置することで、常に訪問者の目に触れるようにします。

外観>ウィジェットメニューを開いて、フッター3列目の＋ボタンを押して、ソーシャルアイコンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/7a9681e3-c26b-74ec-76b9-434049c94ad1.png)

ソーシャルアイコンウィジェット内の＋ボタンを押して、SNSアイコンを追加していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/20643600-0fea-7370-898c-1ed734c8a995.png)

アイコンを追加したら、リンク先のURLをそれぞれ設定しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/0d220dfb-3775-c5b8-e168-2fa3ad0311b7.png)

保存できたら、WebサイトのフッターにSNSアイコンが表示されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/8b86d034-81d7-c46a-14d6-c22106db7deb.png)


# おわりに
いかがでしたでしょうか。今回の記事では、SNSアイコンの追加方法について確認しました。
固定ページの作成方法を読んでくださている方は、全く同じ方法でウィジェットに追加できることがわかるでしょう。

次回は、プライバシーポリシーを明示するページを作成する方法を確認します。お楽しみに！
Stimulus リファレンス: TypeScriptを使う

:::note
この記事は[Google翻訳](https://translate.google.co.jp/)の結果を編集したものです。
:::

https://stimulus.hotwired.dev/reference/using-typescript

Stimulus自体は[TypeScript](https://www.typescriptlang.org/)で記述されており、そのパッケージ上で型を直接提供します。以下のドキュメントはStimulusプロパティの型を定義する方法を示しています。

# コントローラー要素型の定義

デフォルトではコントローラの要素は`Element`型です。コントローラー要素の型を[ジェネリック型](https://www.typescriptlang.org/docs/handbook/2/generics.html)として指定することでオーバーライドできます。たとえば、要素の型が`HTMLFormElement`であると予想される場合:

```typescript
import { Controller } from "@hotwired/stimulus"

export default class MyController extends Controller<HTMLFormElement> {
  submit() {
    new FormData(this.element)
  }
}
```

# 値のプロパティを定義する

TypeScriptの`declare`キーワードを使用して構成された値のプロパティを定義できます。コントローラー内で使用する場合はプロパティを定義するだけです。

```typescript
import { Controller } from "@hotwired/stimulus"

export default class MyController extends Controller {
  static values = {
    code: String
  }

  declare codeValue: string
  declare readonly hasCodeValue: boolean
}
```

:::note
`declare`キーワードは既存のStimulusプロパティのオーバーライドを回避し、TypeScriptの型を定義するだけです。
:::

# ターゲットプロパティの定義

TypeScriptの`declare`キーワードを使用して構成されたターゲットのプロパティを定義できます。コントローラー内で使用する場合はプロパティを定義するだけです。

`[name]Target`および`[name]Targets`プロパティの戻り値の型は`Element`型から継承した任意の型にすることができます。ニーズに合わせて最適なタイプをお選びください。汎用HTML要素として定義する場合は、`Element`または`HTMLElement`のいずれかを選択します。

```typescript
import { Controller } from "@hotwired/stimulus"

export default class MyController extends Controller {
  static targets = [ "input" ]

  declare readonly hasInputTarget: boolean
  declare readonly inputTarget: HTMLInputElement
  declare readonly inputTargets: HTMLInputElement[]
}
```

:::note
`declare`キーワードは既存のStimulusプロパティのオーバーライドを回避し、TypeScriptの型を定義するだけです。
:::

# カスタムプロパティとメソッド

他のカスタムプロパティはコントローラークラスでTypeScriptの方法で定義できます。

```typescript
import { Controller } from "@hotwired/stimulus"

export default class MyController extends Controller {
  container: HTMLElement}
```

詳細については[TypeScript ドキュメント](https://www.typescriptlang.org/docs/handbook/intro.html)を参照してください。
Stimulus リファレンス: CSSクラス

:::note
この記事は[Google翻訳](https://translate.google.co.jp/)の結果を編集したものです。
:::

https://stimulus.hotwired.dev/reference/css-classes

HTMLではCSSクラスは`class`属性を使用して要素に適用できる一連のスタイルを定義します。

CSSクラスはスタイルを変更したりプログラムでアニメーションを再生したりするための便利なツールです。 たとえばStimulusコントローラーはバックグラウンドで操作を実行しているときに"loading"クラスを要素に追加し、CSSでそのクラスをスタイルして進行状況インジケーターを表示する場合があります。

```html
<form data-controller="search" class="search--busy">
```

```css
.search--busy {
  background-image: url(throbber.svg) no-repeat;
}
```

クラスをJavaScript文字列でハードコーディングする代わりにStimulusを使用すると、データ属性とコントローラープロパティの組み合わせを使用して論理名でCSSクラスを参照できます。

# 定義

`static classes`配列を使用してコントローラーでCSSクラスを論理名で定義します。

```javascript
// controllers/search_controller.js
import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  static classes = [ "loading" ]  // …
}
```

# 属性

コントローラーの`static classes`配列で定義された論理名はコントローラーの要素のCSS クラス属性にマップされます。

```html
<form data-controller="search"
      data-search-loading-class="search--busy">
  <input data-action="search#loadResults">
</form>
```

コントローラー識別子と論理名を`data-[identifier]-[logical-name]-class`の形式で結合してCSSクラス属性を作成します。属性の値は単一のCSSクラス名または複数のクラス名のリストにすることができます。

**注：** CSSクラス属性は`data-controller`属性と同じ要素で指定する必要があります。

論理名に複数のCSSクラスを指定する場合はクラスをスペースで区切ります。

```html
<form data-controller="search"
      data-search-loading-class="bg-gray-500 animate-spinner cursor-busy">
  <input data-action="search#loadResults">
</form>
```

# プロパティ

`static classes`配列で定義された論理名ごとにStimulusは次のCSSクラスプロパティをコントローラーに追加します。

| 種類 | 名前 | 値 |
| :-- | :-- | :-- |
| 単数 | `this.[logicalName]Class` | `logicalName`に対応するCSSクラス属性の値 |
| 複数 | `this.[logicalName]Classes` | スペースで区切られた対応するCSSクラス属性のすべてのクラスの配列 |
| 存在 | `this.has[LogicalName]Class` | CSS クラス属性が存在するかどうかを示すブール値 |

これらのプロパティを使用して[DOM classList API](https://developer.mozilla.org/en-US/docs/Web/API/Element/classList)の`add()`および`remove()`メソッドでCSSクラスを要素に適用します。

たとえば結果を取得する前に検索コントローラーの要素に読み込みインジケーターを表示するには、次のように`loadResults`アクションを実装できます。

```javascript
export default class extends Controller {
  static classes = [ "loading" ]

  loadResults() {
    this.element.classList.add(this.loadingClass)

    fetch(/* … */)
  }
}
```

CSSクラス属性にクラス名のリストが含まれている場合、その単一のCSSクラスプロパティはリストの最初のクラスを返します。

CSSクラスプロパティの複数形を使用してすべてのクラス名に配列としてアクセスします。これをスプレッド構文と組み合わせて複数のクラスを一度に適用します。

```javascript
export default class extends Controller {
  static classes = [ "loading" ]

  loadResults() {
    this.element.classList.add(...this.loadingClasses)

    fetch(/* … */)
  }
}
```

**注：** 一致するCSSクラス属性が存在しないときにCSSクラスプロパティにアクセスしようとするとStimulusはエラーをスローします。

# 命名規則

CSSクラス定義で論理名を指定するにはcamelCaseを使用します。論理名はcamelCaseのCSSクラスプロパティにマップされます。

```javascript
export default class extends Controller {
  static classes = [ "loading", "noResults" ]

  loadResults() {
    // …
    if (results.length == 0) {
      this.element.classList.add(this.noResultsClass)
    }
  }
}
```

HTMLではCSSクラス属性をkebab-caseで記述します。

```html
<form data-controller="search"
      data-search-loading-class="search--busy"
      data-search-no-results-class="search--empty">
```

CSSクラス属性を構築するときは、コントローラーの命名規則で説明されている識別子の規則に従います。
【CommonLisp】関数と同名の変数を定義することができる

## ソース

処理系はSBCLです

```common-lisp
(defun hoge (list)
  (format t "~a~%" (append list (list 7 8))))

(defun main ()
  (let ((list (list 1 2)))
    (format t "~a~%" list)
    (format t "~a~%" (list 3 4))
    (hoge '(5 6))))
```

## 出力結果

```
(1 2)
(3 4)
(5 6 7 8)
```

以上

## 独り言

だから関数は'じゃなくて#'なのか
↑ （追記）funarg問題というのが発端らしい
今日のElixirSchoolメモ9「Mix」

Elixir Schoolの勉強メモです。

https://elixirschool.com/ja/lessons/basics/mix

## Mix

mixは、RubyでいうところのBundlerとRubyGems、Rakeが組み合わさったもの。
`mix help`で機能を確認できる。

## 新しいElixirプロジェクト作成

`mix new`コマンドで新しいElixirプロジェクトを立ち上げることができる。
プロジェクトのフォルダ構成と必要なボイラープレート（決まりきったソースコード断片）が生成される。

```elixir
mix new example
* creating README.md
* creating .formatter.exs
* creating .gitignore
* creating mix.exs
* creating lib
* creating lib/example.ex
* creating test
* creating test/test_helper.exs
* creating test/example_test.exs

Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:

    cd example
    mix test
```

## mix.exs

アプリケーションや依存関係、環境、バージョンについて設定をするファイル。

```elixir
defmodule Example.MixProject do
  use Mix.Project

  def project do
    [
      app: :example, # アプリケーションの名前の定義
      version: "0.1.0",
      elixir: "~> 1.13",
      start_permanent: Mix.env() == :prod,
      deps: deps()
    ]
  end

  # Run "mix help compile.app" to learn about applications.
  def application do
    [
      extra_applications: [:logger]
    ]
  end

  # Run "mix help deps" to learn about dependencies.
  # 依存関係
  defp deps do
    [
      # {:dep_from_hexpm, "~> 0.3.0"},
      # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
    ]
  end
end
```

## `iex -S mix`

`-S mix`オプションで、インタラクションモードに入る前にMixを走らせることができる。
コンパイルされたアプリケーションとともに新しい`iex`セッションを開始することができる。

```zsh
iex -S mix
Erlang/OTP 25 [erts-13.0] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]

Compiling 1 file (.ex)
Generated example app
Interactive Elixir (1.13.4) - press Ctrl+C to exit (type h() ENTER for help)
```

## コンパイル

mixは賢く、必要に応じてコードの変更をコンパイルしてくれるが、明示的にコンパイルするときは`mix compile`をプロジェクト直下のディレクトリで実行する。

コンパイルする際、mixは`_build`ディレクトリを生成する。`_build`内部を参照すると、コンパイルされたアプルケーション`_build/dev/lib/example/ebin/example.app`がある。

## 依存関係の管理

新しい依存関係を追加するには、まず`mix.exs`の`deps`内に追加する。
依存関係のリストは、パッケージ名のアトムと、バージョンを表す文字列、1つの任意的な値（オプション）を持つタプルで成り立つ。

```elixir
def deps do
  [
    {:phoenix, "~> 1.1 or ~> 1.2"},
    {:phoenix_html, "~> 2.3"},
    {:cowboy, "~> 1.0", only: [:dev, :test]},
    {:slime, "~> 0.14"}
  ]
end
```

依存関係を定義したら、パッケージを取り込む。

```zsh
mix deps.get
```

## 環境

* `:dev`
  * 初期状態での環境
* `:test`
  * `mix test`で用いられる環境
* `:prod`
  * アプリケーションを製品に出荷するときに用いられる環境

現在の環境は`Mix.env`で取得できる。
この環境は`MIX_ENV`環境変数によって変更できる。

```zsh
MIX_ENV=prod mix compile
```
今日のElixirSchoolメモ8「モジュール」

Elixir Schoolの学習メモです。

https://elixirschool.com/ja/lessons/basics/modules

## モジュールと名前つき関数

```elixir
defmodule Example do # <- モジュール
  def greeting(name) do # <- 名前付き関数 
    "Hello #{name}."
  end
end

Example.greeting "Sean"
"Hello Sean."
```

モジュールは関数群を名前空間へと組織する最良の方法です。
関数をまとめることに加えて、関数のレッスンで取り上げた名前付き関数やプライベート関数を定義できます。

※名前空間（namespace）とは、名前の集合全体を小さな空間に区切り、それぞれに異なる識別名を与えることで、その空間内では他の空間に含まれる名前の競合・衝突を意識しなくて良いようにしたものです。
　プログラミング言語だと頻出する概念で、名前付き関数をモジュールにまとめて構造化できる、と捉えてもらうといいかも。

## モジュールの属性

Elixirモジュールはそれぞれ対応するメタデータを持っている。メタデータの各項目のことをモジュールの属性といい、名前によって識別される。
モジュールの内部では、@記号を名前の前につけて属性につけて、属性にアクセスすることができる。

```elixir
defmodule Example do
  @greeting "Hello"

  def greeting(name) do
    ~s(#{@greeting} #{name}.)
  end
end
```

Elixirで予約されている属性があり、一般的なのは以下の3つ。

`moduledoc` … 現在のモジュールにドキュメントをつける。
`doc` … 関数やマクロについてのドキュメント管理。
`behaiviour` … OTPまたはユーザが定義した振る舞い（ビヘイビア）に用いる。

## 構造体

構造体は、定義済みのキーの一群とデフォルト値を持つ特殊なマップをラップしたモジュール。
構造体を定義するには`defstruct`を用い、フィールドとデフォルト値のキーワードリストを添える。

```elixir
defmodule Subscriber do
  defstruct name: "", paid: false, over_18: true
end

iex(2)> s1 = %Subscriber{}
%Subscriber{name: "", over_18: true, paid: false}
iex(3)> s2 = %Subscriber{ name: "Dave" }
%Subscriber{name: "Dave", over_18: true, paid: false}
```

構造体のフィールドへのアクセス

```elixir
iex(4)> s2.name
"Dave"
```

構造体の更新

```elixir
iex(7)> s2 = %Subscriber{ s2 | name: "Tom" }
%Subscriber{name: "Tom", over_18: true, paid: false}
iex(8)> s2
%Subscriber{name: "Tom", over_18: true, paid: false}
```

構造体はマップに対してマッチすることができる。

```elixir
iex(11)> %{name: "Tom"} = s2
%Subscriber{name: "Tom", over_18: true, paid: false}
```

Elixir 1.8以降、構造体にカスタムイントロスペクション機能が追加された。

```elixir
iex(12)> inspect(s2)
"%Subscriber{name: \"Tom\", over_18: true, paid: false}"
```

@deriveで出力対象を指定できる。

```elixir
defmodule Subscriber do
  @derive {Inspect, only: [:name]}
  # もしくはexceptで定義できる
  # @derive {Inspect, except: [:paid, :over_18]}

  defstruct name: "", paid: false, over_18: true
end

iex(15)> inspect(s2)
"#Subscriber<name: \"Tom\", ...>"
```

## モジュールや構造体の取り扱いを簡単にするディレクティブ

* aliasディレクティブ
* importディレクティブ
* requireディレクティブ
* useマクロ

### alias

モジュール名をエイリアスすることができる。

### import

関数を取り込みたい場合に使う。

### require

モジュールで定義したマクロを使うときは、そのモジュールをrequireする。
コードをコンパイルするときに、マクロ定義が有効になっていることが保証される。

### use

他のモジュールを利用して現在のモジュールの定義を変更することができる。
C++23からできる演算子オーバーロード

#  はじめに
C++にはたくさんの演算子オーバーロードが用意されています。
小ネタになりますが、演算子オーバーロード周りでC++23から新しくできるようになる事を紹介します。

# `operator[]`の複数引数

`operator[]`の引数を複数にすることができるようになります。
```cpp
struct Array3D
{
    // 複数引数 OK
    auto operator[](size_t x, size_t y, size_t z)
    {    
        // something
    }
};
```

多次元配列クラスへのアクセス等で便利です。

:::note warn
C++20以前でも呼び出し側では `ar[1, 2, 3]` のような書き方がコンパイルは通りますが、**コンマ演算子**として解釈されて`ar[3]`と同等になってしまいます。
※C++20からは非推奨になっています。
:::

# `static operator()`, `static operator[]`

C++23から、`operator()`と`operator[]`の演算子オーバーロードを`static`にすることができるようになります。

```cpp
struct FunctionObject
{
    // staticにできるようになった
    static auto operator()()
    {
        // something
    }
    static auto operator[]()
    {    
        // something
    }
};
```
C++20で追加されたCPOなど、標準ライブラリ等でも関数オブジェクトは多く使われてきましたが、そのほとんどがメンバを持たないものでした。
しかし、関数呼び出しにはthisポインタ分のオーバーヘッドが生じていたため
staticにすることで、これを回避できるようになります。

## ラムダ式

ラムダ式でも`static operator()`にすることが可能です。

```cpp
    auto f = []() static {
        // something
    };
```
:::note warn
キャプチャをする場合は`static`にできないことに注意
:::

# 参考
- https://en.cppreference.com/w/cpp/23
    - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1277r0.html
    - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1169r4.html
    - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2589r0.pdf
# まとめ

C++23から以下の演算子オーバーロードが新たに可能になりました
- `operator[]`の複数引数
- `static operator()`, `static operator[]`
    - ラムダ式も`static`にできる
今日のElixirSchoolメモ7「パイプ演算子」

Elixir Schoolの学習メモです。

https://elixirschool.com/ja/lessons/basics/pipe_operator

## |>（パイプ）演算子

```
people = DB.find_customers
orders = Orders.for_customers(people)
tax = sales_tax(orders, 2018)
filing = peaple_filing(tax)
```

|>演算子は、左の項の式の結果をとって、右の関数呼び出しの第一パラメータとして渡す。
パイプ演算子を使うと下記のように書くことができる。

```elixir
filing = DB.find_customers
            |> Orders.for_customers
            |> sales_tax(2018)
            |> prepare_filing
```

パイプラインの中では、関数のパラメータは常にカッコで囲まなければならない。

```elixir
iex(1)> (1..10) |> Enum.map(&(&1*&1)) |> Enum.filter(&(&1 < 40))
[1, 4, 9, 16, 25, 36]
```

関数のアリティが1より多い場合にカッコを使わない場合、warningが出力される。
```elixir
iex(3)> "elixir" |> String.ends_with? "ixir"
warning: parentheses are required when piping into a function call. For example:

    foo 1 |> bar 2 |> baz 3

is ambiguous and should be written as

    foo(1) |> bar(2) |> baz(3)

Ambiguous pipe found at:
  iex:3:10

true
```
1＋1＝2を証明する

# はじめに
こんにちは、こんばんはどうもNOAHです。
今日は小学生の時に一度は思ったであろう「なぜ1+1は2になるのか」という疑問に対して、しっかりと1+1=2を証明していきます。(スッキリしなくても許してね)
# ペアノの公理
一口に証明すると言ってもそう簡単にはいきません。泥臭い話ですが、まずは自然数を厳密に定義する必要があります。自然数を定義するときに使うのが**ペアノの公理**です。その公理の内容は以下の通りです。

自然数は以下を満たす
　①自然数0が存在する
　②任意の自然数aにはその後者、suc(a)が存在する
　③0はいかなる自然数の後者でもない
　④異なる自然数は異なる後者を持つ
　⑤0がある性質を満たし、aがある性質を満たせば、その後者suc(a)もその性質を満たすとき、すべての自然数はその性質を満たす

これだけだと何を言っているのか分からないと思うので一つ一つ説明していきます。
まず①の段階では「自然数という集合は少なくとも空ではない」ということが分かります。つまり、何かしら集合の要素があるということです。
それでは②に行きましょう。「後者」を意味する英語「successor」の頭3文字を取ってsucという関数を考えています。つまり自然数aをこの関数に入れるとaの後者を返してくれます。何を言っているのかというと、0の後者があり、その後者にもまた後者があるという所謂「繋がり」を意味していということです。集合の要素のことを「元」と言うのでこれを使って簡単に言うと②では「**次の元の存在**」を言っています。
次に③に行きましょう。これは書いてある通りで、何かの後者が0ということはないと言ってます。つまり0には後ろに続くものがないと言うことです。簡単に言えば「**最小元の存在**」を言っています。
次に④です。まず④の文を式にしてみましょう。式にしてみると「a≠bならばsuc(a)≠suc(b)」となります。これから、sucという関数の「**単射性**」を意味しています。
最後に⑤です。一見難しそうに見えますが、これはあるスタート地点である性質を満たしていて、あるものの性質を仮定して次も満たしたらすべての自然数について成り立つという「**数学的帰納法の原理**」について触れているだけなので見た目ほど難しくはありません。

　ペアノの公理でこの五つの性質を満たすものを自然数と定義しました。しかし、実際にこれらの性質を満たすものが欲しいというときに、こう言うのを実際に構成できるかどうかとは別問題です。ですが、こう言うのを作れることが知られています。いくつか方法はありますが、ここでは1番有名であろう「フォン・ノイマンの構成法」を紹介しておきます。これの詳しい話は集合論の方になってしまうので割愛させていただいます。

単射性の理解を深める為に下図を用意しました。活用してください。
![F2E4A607-F856-4DE2-8399-91AB27CB3494.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982420/64ceebe5-b9ea-786e-f669-bfeaf0258e7f.jpeg)
# 足し算の定義
さぁ、自然数の定義ができたので次は加法の定義をしていきましょう。
ペアノの公理を満たす集合に対して加法を次のように定義します。
　⑥すべての自然数aに対して、**a + 0 = a**
　⑦すべての自然数a,bに対して、**a + suc(b) = suc(a+b)**
⑥では+という記号の意味を定義と、a "+" 0を行うとaに何も影響を与えないという0の役割を言っています。
⑦はぱっと見「?」という感じですが、具体的に考えると分かりやすいです。試しに、aに1,bに2を入れると1+suc(2)=suc(1+2)=4となって欲しいということです。
# 1+1=2の証明
加法の定義をすると簡単に1+1=2を証明できます。
まずペアノの公理では1や2という記号は出てきていません。0という記号か出てきていませんでした。なので1や2を定義する必要があるので以下のように定義します。
**suc(0)=1**,**suc(suc(0))=2**
これらはペアノの公理より定義できると分かります。
ここで加法の定義よりa=suc(0),b=0とすると⑦より
suc(0)+suc(0)=suc(suc(0)+0)となります。
次に⑥を使うと
suc(suc(0)+0)=suc(suc(0))となり、これは定義より2になります。
よって、1+1=2となります。
# 終わりに
今回は1+1=2の証明をしてみました。小学1年生で習う簡単なものですが、いざ証明してみるとなると大学範囲の数学を使うことになります。このように簡単なものほど何故そうなるのか疑問に思って、解決してみるのも面白いのではないでしょうか。