OmniAICreator/Qiita-1.07M huggingface dataset:
時間を取り戻したい時に使えるGitテクニック

HRBrain Advent Calendar 2022 カレンダー2の15日目の記事です。

https://qiita.com/advent-calendar/2022/hrbrain

## はじめに

こんにちは。株式会社HRBrainでエンジニアリングマネージャーをしている山口です。

健康診断で少し体重が減っていたので、全盛期に戻りたいと思う今日この頃、皆様いかがお過ごしですか？

失った5kgはクリスマスと年末年始のデブ活で取り戻し、本記事では時間を取り戻したい時に使えるGitテクニックを紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106236/e138cba4-8324-f538-9f21-9bb2545e8839.png)

## Gitで使われる日時

普段何気なく使っているGit、そこで使われている日時は何種類あるかご存知ですか？

そう。Gitで使われる日時って2種類あんねん。

### Author Date

![git log -1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106236/369a18a8-feef-5b8f-289e-44896d633a56.png)

まずAuthor Date、これはcommitの著者であるauthorによるcommit日時です。

<!-- `git log`を実行すると表示される日時で、`git commit`時に`GIT_AUTHOR_DATE`の環境変数や`--date=<date>`で任意の日時を指定できます。 -->

- `git log`に表示される日時
- 以下の方法で任意の日時を指定できる
  - `GIT_AUTHOR_DATE=<date>`の環境変数
  - `git commit --date=<date>`オプション

### Committer Date

![git log --pretty=fuller -1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106236/423ae07b-dcc1-714a-42c0-7237927ef43d.png)

次にCommitter Date、これはcommitを取り込んだ人を表すcommitterによるcommit日時です。

<!-- `git log --pretty=fuller`を実行すると表示される日時で、`git commit`時に`GIT_COMMITTER_DATE`の環境変数で任意の日時を指定できたり、`git rebase`や`git commit --amend`でも変更されます。 -->

- `git log --pretty=fuller`に表示される日時
- 以下のコマンド実行時に変更される
  - `git rebase` / `git commit --amend`
- 以下の方法で任意の日時を指定できる
  - `GIT_COMMITTER_DATE=<date>`の環境変数
  - `git rebase --committer-date-is-author-date`
    - Committer DateをAuthor Dateと同期するオプション


## GitHubで使われる日時

![github.com_YuG1224.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106236/a6fee42d-61cf-8943-db7b-0db3ab0b9c81.png)

GitHubのステータス画面に表示されている通称「草」は、Committer Dateが表示されています。

`git rebase`で他者のcommitを取り込んだり、`git commit --amend`でcommitをやり直すとCommitter Dateが変更されるので表示場所が変わります。


## もしかして？

![git_commit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106236/129ab1cb-7a0b-6d6e-a15d-4be5bc64675d.png)

`git commit`時に`GIT_AUTHOR_DATE`と`GIT_COMMITTER_DATE`を指定すれば日時を改竄できます。

もしかして、これを繰り返せば無限に草を生やせるのでは？🤔


## DEMO

いってみよう！やってみよう！

https://github.com/YuG1224/kusa

ひたすらコミットし続けるプログラムをTypeScriptで書いてみました。実行はDenoで。

![terminal.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106236/cf74975f-e6c8-4685-eb80-82ed3c55775c.gif)

イイ感じですね！

![carbon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106236/49339b17-ea06-47ce-cd74-5c77a7fc3531.png)

草ができるだけ自然になるように、指定した期間の30分毎にコミットするかどうかを判定しています。

パラメータで配分を変えることもできます。

## まとめ

- Gitで使われる日時は、`Author Date`と`Committer Date`の2種類
- `GIT_AUTHOR_DATE`と`GIT_COMMITTER_DATE`で改竄できる
- kusaを生やすときは、用法用量を守って、正しくお使いください

HRBrainでは引き続き仲間を募集しております。最新の募集状況などは下記からご確認ください。

https://www.hrbrain.co.jp/recruit
ReactをViteとTailwindCSSでセットアップする


今までcreate-react-appでReactのプロジェクトを使ってきて遅いなと感じた方、是非このコンビネーションを試してください。今日はReactでセットアップしますがVueでも同じことができるので試してください。

[ReactとViteだけのセットアップの仕方はこちら](https://asameshicode.com/vite-react-setup/)でも紹介しています。

良かったら自分でホスティングしているサイトとYouTubeがあるので他の記事も見てみてください。
[<img src="https://asameshicode.com/wp-content/uploads/2022/12/asameshiLogo.jpg">](https://asameshicode.com/)

https://www.youtube.com/channel/UCiVt4Mcnog4KBEOALesuu1g


React　+　TailwindCSS　+　Vite　で夢のような最速サイトが実現しましょう。


## **Viteとは**

Viteは[Vueの創生者Evan You](https://github.com/yyx990803)とそのチームが作った最新のビルドツールです。特徴としてはWebpack、Gulp、Parcelのバンドリングで使うパッケージがデベロップメント用のサーバーを起動する際（npm start)でかなり遅くなる原因を起こしていたものをすべて取り除きました。さらにコードの量が多くなるにつれ再度バンドルしなおすのでその分時間がかかっていました。

Viteの強みはその速さになります。もちろん、その引き換えにES6で書いたコードが対応していないブラウザではJavaScriptを変換してくれないので動かない可能性がある等の短所があります。

[ViteでVueのプロジェクトをビルドする方法はこちら](https://asameshicode.com/lets-use-vite/)からどうぞ。

では下記のコマンドでViteを使ってReactのプロジェクトを作成します。

```
npm create vite@latest

cd my-project

npm i
```

---


## **TailwindCSSをインストールする**

では下記のコマンドからTailwindCSSをインストールします。

```
npm install -D tailwindcss postcss autoprefixer

npx tailwindcss init -p
```
このinitでイニシャライゼーションが終わるとコンフィグファイルが作成されたというメッセージが表示されます。


[<img src="https://asameshicode.com/wp-content/uploads/2022/12/image-14.png">](https://asameshicode.com/setup-react-vite-tailwind/)




では、tailwind.config.cjsファイルを見てみましょう。

```
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [],
  theme: {
    extend: {},
  },
  plugins: [],
}
```

では、下記の様にすべてのテンプレートファイルがここに含まれるようにします。

```
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    "./index.html",
    "./src/**/*.{js,ts,jsx,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
```

次にsrcディレクトリのindex.cssファイルに下記の行を追加しましょう。

```
/* ./src/index.css */
@tailwind base;
@tailwind components;
@tailwind utilities;
```

ここで使っているVSCode若しくはお使いのテキストエディタにエラーが出た場合はpostcssのエクステンションを入れてください。



[<img src="https://asameshicode.com/wp-content/uploads/2022/12/image-15.png">](https://asameshicode.com/setup-react-vite-tailwind/)



## **TailwindCLIでCSSをビルドさせる**

postcssを使用しない場合は下記の方法でTailwindCSSをビルドさせましょう。

では下記のコマンドで実際にdistribution（公開）をするためにテンプレートをCSSをスキャンさせます。

```
npx tailwindcss -i ./src/index.css -o ./dist/index.css --watch

```


これで、Tailwindが実際に使用したCSSだけのファイルを作成してくれるので軽量なファイルに仕上がります。素晴らしいですね。

[<img src="https://asameshicode.com/wp-content/uploads/2022/12/image-16.png">](https://asameshicode.com/setup-react-vite-tailwind/)




## **Tailwindが使えるようになった**

ではこれでTailwindのclassをReactのclassNameで使用してCSSがつかるようになったことを確認しましょう。

```
      <p className='p-6'>
        Padding 6px
      </p>
```


ではブラウザの検証モードで対象のHTML要素を見てみます。



[<img src="https://asameshicode.com/wp-content/uploads/2022/12/image-17.png">](https://asameshicode.com/setup-react-vite-tailwind/)


できました！

[実際のコードはGitHubから公開している](https://github.com/TraitOtaku/React-Vite-Tailwind-Boilerplate)ので見てください。


ではお疲れ様でした。
DoctrineとEloquent比較大全6: 条件指定で絞り込み

day6の今日はid以外の項目に条件をつけてレコードを取得する方法を見ていきます。

## Doctrine

```php
<?php

declare(strict_types=1);

use App\Entity\Book;
use Doctrine\ORM\EntityManagerInterface;

require __DIR__.'/../vendor/autoload.php';

/** @var EntityManagerInterface $entityManager */
$entityManager = require __DIR__.'/bootstrap.php';

// priceが1000円の本をすべて取得
$books = $entityManager->getRepository(Book::class)->findBy([
    'price' => 1000,
]);

// priceが5000円の本を1冊取得
$book = $entityManager->getRepository(Book::class)->findOneBy([
    'price' => 5000,
]);
```
<https://github.com/77web/doctrine-vs-eloquent/blob/fe0877e1fe4d9e5f28aabe407146166be89210dd/Doctrine/Usecase/filter_by_simple_condition.php>

- Bookエンティティのレポジトリに対して `findBy()` に `[エンティティのフィールド名 => 絞り込みたい値]` という形式の配列を渡す（複数指定可）ことで条件を満たすすべてのレコードを取得できます。
- 同様の配列指定で条件を満たすレコードを1件だけ取得したいときはレポジトリの `findOneBy()` メソッドを使います。指定条件を満たすレコードが複数件あるときはそのうちの1件目を取得します。

## Eloquent

```php
<?php

declare(strict_types=1);

use App\Models\Book;

require __DIR__.'/../vendor/autoload.php';

// priceが1000円の本をすべて取得
$books = Book::where('price', 1000)->get();

// priceが5000円の本を1冊取得
$book = Book::where('price', 5000)->first();
```
<https://github.com/77web/doctrine-vs-eloquent/blob/fe0877e1fe4d9e5f28aabe407146166be89210dd/Eloquent/Usecase/filter_by_simple_condition.php>

- Bookモデルのstaticメソッド `where()` を使って条件を指定し、 `get()` で条件を満たすBookモデルのCollectionを取得できます。
- 1つ目の引数にフィールド名、2つ目の引数に値を入れます。
- `where()->where()` と重ねることで複数の条件を指定することができます。
- whereで条件指定したあとで `get()` でなく `first()` を使うことで条件を満たす最初の1件のBookモデルのインスタンスを取得することができます。
サービスエンドポイントについて

●サービスエンドポイント
Azureには、「インターネットを経由して利用するシナリオ」と「Azure内部から利用するシナリオ」の２つがある。
既定では、これらのサービスへのアクセスおよびトラフィックでは送信元IPアドレスとしてパブリックIPアドレスが使用されるため、インターネットを経由してそれらのサービスにアクセスすることが可能。

アクセス元の仮想マシンとアクセス先のストレージが同じリージョンやデータセンターに存在しているにも関わらず、インターネット経由でアクセスするのは非効率であり不正アクセスの心配もある。
このようにAZure内部から利用したいシナリオでは、インターネット経由のアクセスを許可しない様に制限んしたい場合がある。

■サービスエンドポイントを使用すると、Azureバックボーンネットワーク上で最適化されたルートを介して、ストレージやSQL DatabaseなどのAzureサービスに安全に直接接続できる。
サービスポイントの有効化により、仮想ネットワークかわAzureサービスにアクセスするときのトラフィックにおいて、発信元IPアドレスとして仮想ネットワークのプライベートアドレスが使用される様に切り替わる。
つまり、仮想マシンなどがパブリックIPアドレスを使用せずに仮想ネットワーク内からストレージやSQL Databaseなどのサービスに直接接続できる。
※インターネット経由のアクセスがブロックされる。

●サービスエンドポイントを有効化した後は、各サービスで具体的な制限の内容について構成する必要がある
サービスエンドポイントは、各サービスが持っているファイアウォール機能と連動して動作するがｍリソースへのネットワークアクセスを制限するために必要な手順はサービスの種類によって異なる。

■サービスエンドポイントはルートテーブルの変更とサービスごとのファイアーウォールによって実現する、その結果、サービス側で許可した特定の仮想ネットワークからのアクセスだけが受け入れられ、仮想ネットワークからAzureサービｓへのアクセスがインターネットを経由せず、直接に行われる様になる。
UnitOfWork

![export 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/4122c8ce-4f6f-3ac4-840b-b1f73c2fd98c.png)

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

ここからは「オブジェクトリレーショナル振る舞いパターン」に属すパターンの紹介です。

Unit Of Work パターンは、Domain Model 内で起こるさまざまな変更を、都度データベースに随時反映させず、一連のビジネスロジックが完了した後に、Domain Model の外で最終的な結果をまとめて反映させる方式を指します。

いくつもの構成要素が連携する Domain Model パターンでは、互いに他のオブジェクトのロジックがどうなっているかの詳細には踏み込みません。責務を満たすなら詳細を問わないのが、オブジェクト指向を活かしたモデリングです。が、もし連携するビジネスロジックが SQL を発行していると、それは思わぬパフォーマンス問題につながるかもしれません。

別のオブジェクトにある「ひとつ処理する」のメソッドが便利だからと、軽い気持ちで 10 回呼び出してしまうと、場合によっては 10 倍のクエリが実行されることになります。そんな下手なプログラミングをする方が悪いのだと、中にどんな SQL が書かれているかを把握しに行こうとすると、それは実質的に、プログラムを Transaction Script として読解しようとしているのと同じです。

データベーストランザクション中に、時間のかかる別の通信を行っているオブジェクトを使う可能性もあります。長時間トランザクションが並行して数多く存在すると、デッドロックが起きる確率が高まります。そうでなくても、トランザクション分離を同時に数多く抱えることは、データベースにとってたいへんな負荷になります。

Unit Of Work を意識した Data Mapper は、データを表すオブジェクトの変更を監視し、ビジネスロジックの終了後に、その監視対象から差分情報を生成します。差分情報をもとに、最小の更新用 SQL を発行して、Domain Model での変化とデータベースを同期します。これにより、Domain Model 内の処理の詳細を知らなくても、ベストなパフォーマンスを得ることができます。また、データ同期のためのデータベーストランザクション時間が、とても短くなります。

トランザクションの [ACID](https://ja.wikipedia.org/wiki/ACID_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E7%A7%91%E5%AD%A6)) 性と、複数の並行処理がデータの矛盾を発生させないようにするロックとは、別の問題です。並行処理のロックについては、別のパターンで述べられています。

Unit Of Work と Active Record は、完全に排他的な関係です。Active Record のデータ更新はどうしても、自身を Row Data Gateway として使った即時 SQL 発行になります。Active Record パターンの手軽さを保留した別の工夫を考えなければ、Unit Of Work はできません。逆に Data Mapper は、ごく自然に Unit Of Work と共存します。Active Record と Data Mapper の違いのうち、メカニズム上の最大の差がこの点です。
ロータリーエンコーダで操作するかわくだりゲーム

[かわくだりゲーム](https://ichigojam.github.io/print/ja/KAWAKUDARI.html) は、[IchigoJam](https://ichigojam.net/) の代表的なサンプルプログラムである。[要出典]
今回は、このかわくだりゲームを矢印キーのかわりにロータリーエンコーダで操作できるようにする。
今回は、ロータリーエンコーダとして [Pmod ENC](https://digilent.com/shop/pmod-enc-rotary-encoder/) モジュールを使用する。

# ロータリーエンコーダ

(今回扱う種類の)ロータリーエンコーダはA,Bの2個の出力信号を持ち、軸を回転させると以下のようにずれたタイミングで信号のオン/オフが切り替わる。

![ロータリーエンコーダの出力信号](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/128f9b60-027e-e7b3-4462-f185a5b433d3.png)

この切り替わりの様子から、軸が回転していることと回転の方向を読み取ることができる。
今回用いる Pmod ENC モジュールでは、カチッとなる1段階回すと信号が4回 (A, Bそれぞれ2回ずつ) 切り替わる。
さらに、ロータリーエンコーダの軸を押し込むことで回転とは別の信号を入力することができる。

# 予備実験1：ロータリーエンコーダの状態の取得

IchigoJam に Pmod ENC モジュールを以下のように接続する。

|Pmod ENC|IchigoJam|
|:-:|:-:|
|A|IN1|
|B|IN2|
|BTN|-|
|SWT|-|
|GND|GND
|VCC|VCC|

以下のプログラムにより、状態が変化したときその状態を出力する。

```
10 P=-1
20 S=IN(1)*2+IN(2)
30 IF S<>P ?S;:P=S
40 GOTO 20
```

ロータリーエンコーダの軸を上から見て時計回りに回すと `2013` が、反時計回りに回すと `1023` が出力された。
時々 `2013232013` のように意図しない戻りが発生するようだった。

![予備実験1 実行結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/d3914826-ba3c-e02a-68c0-afd2df6a7454.png)

# 予備実験2：ロータリーエンコーダの状態の変化の解釈

予備実験1の結果をもとに、変化前と変化後の `S` の値と回す方向の関係を以下に示す。
なお、上から見て時計回りを「→」、反時計回りを「←」と表記している。

|変化前＼変化後|0|1|2|3|
|---|:-:|:-:|:-:|:-:|
|0||→|←||
|1|←|||→|
|2|→|||←|
|3||←|→||

この表をもとに、変化前と変化後の `S` の値と回す方向の関係を配列に格納し、変換に用いる。
上から見て時計回りを `1`、反時計回りを `-1` で表す。

```
10 LET[0],0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0
20 P=3
30 CLT:C=0
40 S=IN(1)*2+IN(2):C=C+[P*4+S]:P=S:IF TICK()<3 GOTO 40
50 IF C<-1 ?CHR$(#E0);
60 IF 1<C ?CHR$(#E1);
70 GOTO 30
```

このプログラムにより、回した方向が左右の矢印で表示される。

![予備実験2 実行結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/251f9575-8c4f-7ad6-f807-d685bc3353f7.png)

# かわくだりゲームに組み込む

予備実験の結果をもとに、かわくだりゲームの入力をロータリーエンコーダに置き換えた。
さらに、ロータリーエンコーダを持っているのに毎回RUNを打ち込むのは面倒だったので、ロータリーエンコーダを押し込むとゲームを再スタートできるようにした。
このため、Pmod ENC モジュールの BTN 端子を IchigoJam の IN4 端子に追加で接続し、以下の接続とする。

|Pmod ENC|IchigoJam|
|:-:|:-:|
|A|IN1|
|B|IN2|
|BTN|IN4|
|SWT|-|
|GND|GND
|VCC|VCC|

以下が今回実装したプログラムである。

```
10 ' ﾛｰﾀﾘｰｴﾝｺｰﾀﾞ ﾃﾞ ｶﾜｸﾀﾞﾘ
20 ' Pmod ENC ｦ ｲｶﾉﾖｳﾆ ｾﾂｿﾞｸ
30 ' A-IN1 B-IN2 BTN-IN4
40 LET[0],0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0
50 P=3:T=1:' T = ｶｲﾃﾝ ｼｷｲﾁ
60 CLS:X=15
70 LC X,5:?"O"
80 LC RND(32),23:?"*"
90 CLT:C=0
100 S=IN(1)*2+IN(2):C=C+[P*4+S]:P=S:IF TICK()<3 GOTO 100
110 X=X-(C<-T)+(C>T)
120 IF SCR(X,5)=0 GOTO 70
130 IF IN(4) END
140 ?"OUCH!"
150 IF !IN(4) GOTO 150
160 IF IN(4) GOTO 160 ELSE GOTO 60
```

ゲームオーバー時、`IN(4)` が `1` の場合は、ボタン入力が接続されていないとみなし、そのままゲームを終了する。
そうでない場合は、「OUCH!」を出力し、ボタンが押されたらゲームを再スタートする。

![かわくだりゲーム 実行結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/9f4506d9-0249-6d60-ca74-6231b3742af5.png)

なお、改造元の [かわくだりゲーム](https://ichigojam.github.io/print/ja/KAWAKUDARI.html) は、以下のライセンスとなっている。

> [CC BY](https://creativecommons.org/licenses/by/4.0/deed.ja) [IchigoJamプリント](http://ichigojam.net/print/) `http://ichigojam.net/print/` [IchigoJam®jig.jp](http://ichigojam.net/)

# おわりに

IchigoJamはjig.jpの登録商標です。
【本格的にJavaScriptを学ぶ】歴史編

# はじめに

Javaの簡単な開発経験はあるもの、今のJavaScriptの現場で悪戦苦闘中。。。
本格的にJavaScriptを学ぶ必要があったので、アウトプットします。
気軽にコメントしていただいたり、間違えていることなどあれば気軽にご指摘ください。
励みになります。

<details>
<summary>
【参考】自分のスペック
</summary>

現時点(2022年12月現在)でのスペックです。
- IT経験3年
  - 大学中退し、1年間求人広告の営業 → 未経験からSESへ
  - 2019年11月からエンジニアとして現場に参画(2019年8月から3ヵ月は研修期間)
  - システム運用(開発なし)：1年
  - テスター：半年
  - 設計：4ヵ月
  - 開発(Java)：半年
  - 開発(JavaScript)：半年
  - 要件定義：2ヵ月
- 資格：JavaGold SE8 (2020年3月)
</details>

# なぜ歴史を学ぶのか

JavaScript自体が現在も発展途上ですし、歴史的経緯のせいで出きた仕様があったりします。

これらは

:::note
**古い既存のソースコードの解読を助ける**
:::
:::note
**用語の理解**
:::
などに役に立つと考えています。

# 【JavaScriptの歴史】ポイント

今回は自分が重要と思ったポイントのみを、備忘録として記載していきます。

## 【1990年代】もともとはブラウザに複雑な動きを加えるために開発された

:::note
**ブラウザ(今でいうChromeやSafariなど)がない = 動かなかった**
:::
- ブラウザはJavaScriptエンジンを搭載している
  - JavaScriptエンジンはJavaScriptを動かせる環境
  - なので、なんの設定もしていないPCのコマンドプロンプトやターミナルでJavaScriptの記述をしても動かない



:::note
**言語が柔軟に解釈する = 開発も楽になるやろ、的な発想でつくられた**
:::
- この柔軟性のせいで、バグが生まれやすくなった。なんてこったい。
  - 変数の巻き上げや、undefinedが存在する意味


:::note
**JavaScriptの担当外の処理→非同期処理の仕様にした**
:::
- 動作はすべてシングルスレッド
  - 処理を一つ一つ順番に対処する
- 重い処理で画面が真っ白になる時間を短くする
  - 画面が真っ白の状態で待たされて、イライラしてしまうのを防ぐ
- 他に任せてる間に自分の仕事を行う = 非同期処理
  - 普通は書いた順に上から実行される = 同期処理 (想像通り)
  - 【イメージ】電子レンジで温めている(非同期処理)最中に、皿洗いをする
- JavaScript担当外の処理：タイマー系/ 画像読み込み/API呼び出し...etc

## 【1990年代後半 ~ 2000年代前半】いろんな思惑で、JavaScriptの仕様がまとまらない

:::note
**ブラウザ毎に好き勝手にJavaScriptの仕様を決めていた**
:::
- ブラウザの互換性がなかった
  - ブラウザ毎にJavaScriptの仕様が異なっていた

:::note
**JavaScript = コアな機能 + 各ブラウザの機能 をまとめたもの**
:::
- ECMAという標準化団体が、JavaScriptの標準化(ECMAScript)を作成していたが、第4版から各企業の意見が分裂した
- 各種ブラウザ専用のコードを書く必要があったとか。。。。

## 【2009年】Node.js 爆誕！ でサーバサイドにも普及
:::note
**サーバでもJavaScriptエンジンが動くようにすればいいんじゃね？的な天才的な発想で誕生**
:::
- シングルスレッド + 非同期処理 = 高速に処理ができる(待ち時間が少なくなる)

:::note
**Node.jsのJavaScript環境 = コアな機能 + CommonJs**
:::
- 当時はJavaScriptで大規模な開発を行う想定ではなかったので、機能毎にファイルを分割する仕組みがなかった
  - CommonJsでは上記の機能 = モジュールが追加された
  - CommonJsではほかにも様々な機能がある

## 【2015年】JavaScriptのコアな機能がようやく標準化

:::note
**ECMAScriptがようやくまとまる**
:::
- JavaScriptのコアな部分が統一され、様々な便利機能がECMAScriptに追加される
  - 俗に言うES6(ES2015)
:::note
**ECMAScriptはNode.jsの影響も受けている**
:::
- Node.jsのCommonJSの機能とECMAScriptの機能が重複している箇所がある
- 以下例
  - CommonJSのモジュール機能(CJS)とECMAScriptのモジュール機能(ESM/ES Module) 



# まとめ
- ブラウザで複雑な動きをつけるために開発されたが、現在はそれに留まらず様々な場面で使用される
- JavaScriptは実行環境(ブラウザとNode.jsなど)によって、使える機能が異なる

## ECMAScriptの仕様

https://github.com/tc39/proposals

## 【そのほか】JavaScriptエンジンの種類

https://typescriptbook.jp/img/overview/ecmascript/browser-rendering-engine-javascript-engine-ecmascript-relations.svg

[該当の記事](https://typescriptbook.jp/overview/ecmascript)に記載がありますが、
これを覚えておくとブラウザのテストケースが省略できることがあるので便利です。

ちなみに、NodeJsのJavaScriptエンジンは
- V8エンジン(Chromeなどと同様)

を採用しています。


# 参考

https://udemy.com/course/modern_javascipt_react_beginner

https://udemy.com/course/javascript-essence

https://udemy.com/course/nodejs-comp-guide

https://udemy.com/course/the-complete-javascript-course

https://developer.mozilla.org/ja/docs/Learn/JavaScript/Client-side_web_APIs/Introduction

https://typescriptbook.jp/overview/ecmascript

https://qiita.com/a_rcsin/items/0a3c8c98c8d703c49a22

https://github.com/tc39/proposals
python で、代入式(walrus演算子、セイウチ演算子)を使おう！②（備忘録）

python で、[代入式(walrus演算子、セイウチ演算子)を使おう！①（備忘録）](https://qiita.com/1023shogo2013/items/2d58893faac32f82cbd0)の続きです。


~~~python
# 野菜ジュース屋台の在庫
vegetables = {
    'tomato': 15,
    'melon': 9,
    'goya': 5
}
~~~
## 事例②（代入式なし）
次にトマトジュースの注文が入りました。
トマトは5個使います。
~~~python
def make_tomato_juice(count):
    pass

def out_of_stock():
    print('out_of_stock')
    
count = vegetables.get('tomato', 0)
if count >= 5:
    make_tomato_juice(count)
else:
    out_of_stock()
~~~
この場合も、if文の1行目だけで使うcountを無駄に強調してしまっています。

## 事例②（代入式あり）
~~~python
def make_tomato_juice(count):
    pass

def out_of_stock():
    print('out_of_stock')

if (count := vegetables.get('tomato', 0)) >= 5:
    make_tomato_juice(count)
else:
    out_of_stock()
~~~
代入式を使うことによって、コードが1文短くなり、countの無駄な強調がなくなりました。
※if文で、countの代入式と5を比較するために、括弧でくくっています。

## おまけ
walrus(ウォルラス）は、「:=」がセイウチの顔を横にして、目と牙に見立てているみたいです。
コメント化、注釈をつけたい（HTML,CSS,JavaScript,Ruby,Rails)

# はじめに
言語ごとの~~コメントアウト~~コメントをその都度、ggることを卒業したいと思いました。
アウトプット兼備忘録として簡素にまとめます。



## HTML
```index.html

<!-- 記述内容 -->

<!--------
 改行記述パターン
 ---------->

```
## CSS
```.css

/* 記述内容 */

/*
改行記述パターン
*/
```

## JavaScript
```main.js

//記述内容

/*
改行
記述パターン
*/
//CSSと同じ

```

## Ruby
```main.rb
#記述内容

=begin

改行記述パターン

=end

#こっちでも
#大丈夫　個人的にこちらの方がすっきりしてよいと感じます。
```
## Rails
```main.html.erb
<%の直後に#を付ける。

<% コード %>であれば<%# コード %>
<%= コード %>であれば<%#= コード %>


私としてはHTMLで親しみのある
<!--記述内容-->
.erbでも、こちらでコメント化するのが好きだ
```

# おわりに
末筆ながら,
ご一読頂きました皆様　今後ともご指導ご鞭撻のほどよろしくお願いいたします。
共に更なる学習に励んで参りたいと思います。
# 参考
http://rails.takayukikoyama.com/erb/erb-comment/

https://qiita.com/daiki_tadokoro/items/ae5e80a62c71225c8211

https://qiita.com/kat_log/items/6bcf94e9ecac631781f4

https://eigobu.jp/magazine/mappitsu-2#heading-426453
Deepface(顔認証・表情推定・年齢推定)を触ってみた

今回は下記のDeepfaceを触ってみたので紹介したいと思います．

https://github.com/serengil/deepface

# 目次
* 作業環境
* 環境構築
* 実際に動かしてみる

# 作業環境
* M1 Mac
* Python 3.9

# 環境構築
M1 MacでMiniforgeを使用している方の環境構築手順となっています
それ以外の方は，GitHubのREADMEを参考に構築を行ってください
```bash
$ conda install -c apple tensorflow-deps
$ python -m pip install tensorflow-macos 
$ python -m pip install tensorflow-metal
$ pip install deepface --no-deps 
$ pip install retina-face --no-deps 
$ pip install pandas Flask gdown mtcnn Pillow
```
<font color="red">M1 MacでGitHubのREADME通りにインストールを行うと下記のようなエラーが出ると思います．</font>
上の手順通りにインストールしてください
```
ERROR: Could not find a version that satisfies the requirement tensorflow>=1.9.0 (from deepface) (from versions: none) ERROR: No matching distribution found for tensorflow>=1.9.0 (from deepface)
```

# 実際に動かしてみる
実際に動かすために下記のようなpythonファイルを作成してください
```python:realtime.py
from deepface import DeepFace
DeepFace.stream(db_path = "./database/", model_name = "ArcFace", detector_backend = 'ssd')
```
**./database**には，顔画像が保存されています．
```
$ tree
├── realtime.py
└── database
    ├── hoge.jpg
    ├── mage.jpg
    └── sen
        ├── sen1.jpg
        ├── sen2.jpg
        └── sen3.jpg
```
```bash
python3 realtime.py
```
動作結果を見やすいようにするために，ソースコードを多少書き換えています．
![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744789/8833775d-ef2a-4950-f9fe-1bdb4586c3c0.gif)

# パラメーターの紹介
顔認証のモデルは，以下の9つの中から選択することが可能です．
```
model_name = 
    'VGG-Face',
    'OpenFace',
    'Facenet',
    'Facenet512',
    'DeepFace',
    'DeepID',
    'Dlib',
    'ArcFace',
    'SFace'
```
また，顔を検出するモデルも変更することが可能です．
defalutでは，opencvが使用されているため検出精度が低いです．
```
detector_backend = 
    ‘opencv’,
    ‘ssd’,
    ‘mtcnn’,
    ‘dlib’,
    ‘retinaface’
```
顔認証では，顔同士の距離計算で類似度を測っています．
そのため，下記のコサイン類似度とユークリッド距離のパラーメータを選択することが可能です．
```
distance_metric =
    ‘cosine’,
    ‘euclidean’,
    ‘euclidean_l2’
```

# 最後に
今回紹介したGitHubのリポジトリは，下記のサイトで見つけたので共有させていただきます．
最後まで読んでくださり，ありがとうございます．

https://paperswithcode.com/sota/face-identification-on-megaface
小中学校でのプログラミング出張授業で実施した工夫に関して

[Ateam Group U-30 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ateam-group-u30)の6日目は株式会社エイチームのグループ会社のQiita株式会社の @kiitan が担当します。

## はじめに

社会貢献活動の一環として小中学生に向けてプログラミングの出張授業を月に1回程度の頻度で実施しています

https://prtimes.jp/main/html/rd/p/000002216.000001348.html

実施していくなかで実施した工夫をまとめて共有する記事です
資料作りや小中学生向けにプログラミングの授業などやったことがなかったので手探り状態で改善を重ねてきました
これからプログラミングを教える機会を持った人の少しでも参考になれば幸いです

今回の記事では細かい授業内容に関しては言及しません
気になる方は別記事にて公開していますので読んでみてください

https://qiita.com/kiitan/items/3b233e2526758862d918


### 授業の目標

シンプルにプログラミングを楽しい続けたいと思ってもらうことを目標としています
2時間で教えてられることには限界があるのでプログラミングをすることに興味を持ってもらうきっかけを作ることを目標に起きました

### 授業概要
条件によって最適な方法が変わってくるのではじめに授業内容が変わっている
Scratch を利用した簡単なゲームの作成を通じてプログラミングの下記の基本的な要素を学習してもらう授業を実施しています
- イベント処置
- 条件分岐
- ループ
- 変数

### 授業の工夫
ここからは本題のやってきた工夫を記載していきます

#### 作って試してまた作る
授業内でプログラムを組む時にはこまめにに動作と確認をしてもらいましょう
都度確認する時間を設けることでコードブロックとキャラクターの動きリンクしてより理解しやすく飽きを防ぐことができるようになりました

#### できる限り授業内容をコンパクトにして自由時間を取る

授業の時間をできるだけコンパクトにすることで自由時間を多く設けました
自分で考えた動きを実現する体験をできるだけ授業内で確保するようにしています
この時間を通してプログラミングをすることを楽しいと感じてもらえるようにサポートに徹しています

またゲームをなどをやらない子は授業内で作ったゲームをどう変更すれば良いのか迷ってしまうことがありました
そこでEX課題としてお題を事前に用意しておくことで困った時にもプログラミングを続けられるようにしました

より自由時間を楽しんでもらうために講師が作った変更例を見せるようにしました
横スクロールゲームやブロック崩しなどより普段触っているゲームに近い例を見せることで制作意欲を掻き立てることができました

#### 中学生向けには考える時間を設ける

日本語でどんな動きを作りたいのか考える時間を設けるようにしています
日本語で動きを定義してプログラムに落としていくことを繰り返しプログラミングの考え方を伝えるようにしています
対照実験をしているわけではないので年齢によるものである可能性もありますが自由時間でより複雑な改造ができるようになったと考えています


### さいごに

これからもプログラミング授業を通じて一人でもプログラミングを楽しいと感じて続けてくれるように工夫を続けていきます

最後になりましたが[Ateam Group U-30 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ateam-group-u30) を購読設定して明日も記事を読んでいただけるとうれしいです
re:Inventで5K走ってきました！

餃子の伝道師Journeymanさんからバトンを頂いて、
この記事は [ AWS Community Builders Advent Calendar 2022](https://adventar.org/calendars/7633)の6日目の記事になります。

# re:Invent 5Kとは
re:Inventで開催される5kmのチャリティランです

## 概要
- 参加費45ドル
（スナック、ドリンク、限定記念Tシャツ含）
- 集合時間：AM6:00
- 集合場所：MANDALAY BAY（一番遠いホテル）
- 参加人数：700人ぐらい

> レース参加費はすべて、がんと感染症の予防と撲滅のために革新的な研究と思いやりのあるケアを一体化したフレッド・ハッチンソンがんセンターへ寄付されます。

## 会場の様子
こんな感じの立派なホールが受付会場です！
真ん中の方にフルーツやパンがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33070/13b76263-6c13-a91a-51fe-1dbd0c0335e7.png)

スタートはウェーブスタート方式
- RABBIT （早く走る人）
- TIGER （ゆっくり走る人）
- TURTLE　（歩くぐらいの人）
ウサギよりトラの方が速いやろ！と心の中でツッコミながらRABBITに並びます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33070/c992abc7-0fea-25d9-cfdc-be51e121bdcb.png)

6時ぐらいから会場でウォーミングアップの体操が始まります。
700人ぐらいいるので圧巻です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33070/c3e1bab9-3c04-47e7-fe11-f4536a8868a8.png)

体操が終わったらスタート地点に移動です。
気温約1度！極寒です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33070/13db7486-8681-7fa2-2d68-eac2a5f73fa6.png)

## 結果
優勝を狙って頑張りましたが、14秒差で2位でした！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33070/2267d4e0-35bd-cfe1-6ced-4799a2b916e1.png)
Advent Calendar 9日目担当の上野さんから良い感じのリプライもいただいたので、晒させていただければと思いますｗ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33070/0497c230-ec33-f4c3-4101-6ee843d64df5.png)


元気そうに見えますが、結構キツかったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33070/a714981a-88a6-7497-93e0-7b7774af9ba2.png)

## 景品
特にありませんでした！チャリティの心を大切にして楽しく走りましょう！

ただ、完走者全員にソックスがもらえます。
最終日にソックスを使い果たしたので重宝しました！

## まとめ
- 早朝からスタッフがとても盛り上げてくれて楽しいです！
- ラスベガスの道を封鎖してど真ん中を走れる貴重な体験を得ることができます！
- 走ると頭もリフレッシュするので、良いインプットに繋がりますね。

ぜひみなさん参加してみてください！


## 最後に
優勝タイムは16分54秒でした。来年こそは。

同じ内容をJAWS-UG横浜の[宇宙一速いre:Cap](https://www.youtube.com/watch?v=z80RVfbJ1no)で話してきたのでこちらもぜひご覧ください！
創造工学について

# これはなに
創造工学で作成したゲームで自分が担当した箇所を反省を交えながら書く記事
ある程度UE4の実装をどうしたかも貼っていく
間違ってる箇所あれば指摘をお願いします


# どんなものをつくったか
VRの体感型対戦ゲームです
![-9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326126/2ab32c30-5b39-9c15-5169-b62ff0fc206a.jpeg)

プレイヤーは人と蜂に分かれて対戦します。
蜂は蜂の巣を人から守り、人は蜂の巣を破壊することが目的となるゲームです。



## 担当箇所
### 回路編
![9100B08B-CE47-41B7-A971-D30F0C06415F.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326126/c1683d76-25b5-9953-b359-b687d0444777.jpeg)

MDへのPWMが不安定だったのでプルダウン抵抗はさみました。
さらにこの回路にリレーを取り付けて、マッサージチェアの回路に直接つなぎ、動作できるようにした。
デバッグ中にMDを燃やしてしまったこともありました。

### ゲームシステム編
BPをあまり考えなくやってしまったおかげでひとつのBPにしては量が少し膨大になったりしたので特筆したいものだけ選んで書きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326126/79b71ed4-1e11-0b8b-da59-f4972819ebf4.png)

#### ログインの処理について
プライベートネットワークのファイアウォールをオフにする
ネットワーク設定をいじってIPアドレスを任意のものにする
できたらUE4でのイベントに合わせてOpenLevelする
![スクリーンショット 2022-12-05 231802.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326126/3e8b8f82-1d53-a849-eed6-07d0cb0616a7.png)
この場合はWidgetのボタンのクリックに合わせてサーバーにログインしている

#### LPC1768との通信について
UE4duinoというUE4のArduino用プラグインがあるのでこれを利用した
LPC1768はArduinoではないがシリアル通信をする場合問題なく使えたのでこれを使用
その中でWriteaByteを利用した。Char型が確実に送れることが確認できたためです。
制御を書いている人間と話し合って通信の要領を以下のように定めました
- 椅子の傾きは0~121の値であること
- 椅子の傾きのデータは8bit目を必ず１にすること
- マッサージチェアを動かすデータは01000000を送ること

これらをBPで実装したのが以下の二枚となる
![スクリーンショット 2022-12-05 233202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326126/f5471899-c0e2-deeb-c2a4-52d324f0ae78.png)

![スクリーンショット 2022-12-05 234154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326126/9f1e36e0-2ef7-d4fe-80ff-45c12506db43.png)

#### 移動方法について
OculusのスティックのX軸Y軸に合わせてプレイヤーの向いている方向に進む実装にしました。
以下がその実装です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326126/ca5bd8e2-7910-ed6a-1d08-d9c62cc1b133.png)
MySQLのGIS機能の機能追加/改善状況について、FOSS4G Tokai 2022で発表しました！

# はじめに
このエントリは [RDBMS-GIS(MySQL,PostgreSQLなど) Advent Calendar 2022](https://qiita.com/advent-calendar/2022/rdbms_gis) の5日目です。

MySQLでは5.7でGIS機能をBoost.GeometryというC++のオープンソースライブラリを採用して再実装し、[MySQL 8.0でも引き続き機能強化](https://www.slideshare.net/yoyamasaki/mysql-80gis)しています。本記事をきっかけにMySQLのGIS機能に興味を持ってもらえると嬉しいです。

# この記事で伝えたいこと
[@miyauchi](https://qiita.com/miyauchi)さんが2020年1月に書かれた[MySQLのGIS機能に望むこと](https://qiita.com/miyauchi/items/5bdab7ea58f1114d6686)という記事があります。この記事では以下の要望が述べられていますが、これらの要望について、現在のMySQLでの改善状況をお伝えします。

　1．ST_Intersectsの速度改善
　2．ST_Union等の集計関数版の実装ダンプファイルの取得
　3．ST_Transformの改善

# 本文
それぞれの要望について、現在のMySQLでの改善状況は以下の通りです。

1．ST_Intersectsの速度改善
MySQL 8.0.20(2020年4月リリース)で不具合が修正され、速度が改善しています！

2．ST_Union等の集計関数版の実装
ST_Union等の集計関数版はまだ実装されていません。
しかし、MySQL 8.0.24でST_Correct関数が実行されたため、ジオメトリの集合を単一のジオメトリコレクションに集約することはできます。

3．ST_Transformの改善
MySQL 8.0.30(2022年7月リリース)でST_Transformの機能が強化され、WGS84/Web Mercator(SRID:3857)をサポートしました！
これにより、例えばGPSで得られた位置情報(※1)をOpenStreetMapやGoogleマップ等のウェブ地図上の位置情報(※2)に変換できるようになりました。

　※1 測地系:WGS84、座標系:地理座標系、SRID:4326
　※2 測地系:WGS84、座標系:投影座標系、SRID:3857


このように、MySQLのGIS機能は機能追加/改善を続けています。


# 最後に
[1日目のエントリ](https://sakaik.hateblo.jp/entry/20221201/mysql_all_gis_2022)で「2022年は、あまり大きな進化のない1年でした。」というコメントも頂いてしまいましたが、引き続きMySQLのGIS機能の機能追加/改善にもご期待頂ければ幸いです！
(機能追加/改善をより活発にするためにも、[bugs.mysql.com](https://bugs.mysql.com/)からの機能追加リクエストも大歓迎です！！)

また、もう少し詳しい説明を確認したい場合は、[当日の発表資料](https://speakerdeck.com/yoshiakiyamasaki/mysql-gis-update-202208)や[発表動画](https://youtu.be/odWxwtV_lyU?t=9216)を確認して頂ければと思います！


明日は[@dupont-kedama](https://qiita.com/dupont-kedama)さんです！
Web3を技術的に勉強して何を作ると面白そうかを考えた

この内容は Web3 Dev Advent Calendar 2022の6日目の記事です。自分はプログラマで技術、特に**新しい技術**が好きです。またモノ作りも好きなので、Web3を技術的に勉強して何を作ると面白そうかを考えています。ただ今年の9月にWeb3に興味を持って勉強を始めた所なので、基本的な知識を学んでそれを考えるだけでこの3カ月は使ってしまいました。自分の振り返りを兼ねてここまで学んだことをアウトプットしてみます。

# Web3は技術ではなく概念
Web3を技術的にみた時に何を作ると面白そうか？と書きましたが、実はWeb3は具体的な技術を指している用語ではなく、もう少し抽象度が高く、こうあって欲しいという目標に近い概念だと思っています。実際に何がどうなっていればWeb3なのか、具体的なモノでいうと定義すら曖昧だと思います。なので、Web3で何か作ろうとするならWeb3を構成する要素についての理解が必須です。というわけでまずは構成要素の説明です。

# ブロックチェーン
Web3でググってみると「Web3を支えるブロックチェーン」という単語が比較的よく出てきます。Web3イコールブロックチェーンではないですが、Web3の根底の考え方である分散化というアイデアを実現する技術としてブロックチェーンは切り離せないものです。

# ビットコイン
ブロックチェーンの技術を具体的なアプリケーションとして実装している代表例がビットコインだと思います。ビットコイン以外の仮想通貨は知らないという人も沢山いると思います。僕もそうでした。ではビットコインはWeb3を実現するための技術でしょうか？現状Web3を実現するための仮想通貨で最初に名前があがるものはビットコインではありません。

# イーサリアム
Web3を実現する技術としてブロックチェーンの具体的なアプリとして最初に名前が上がるのはイーサリアムです。イーサリアムは、ビットコインにはない特徴があります。イーサリアムの特徴とはスマートコントラクトです。現状Web3の世界ではイーサリアムでしかできないことが沢山あります。

# スマートコントラクト
スマートコントラクトとは、契約の自動化です。契約とは例えば「お金を払ったら代わりに商品がもらえる」ことを指します。つまりお金に関わるプログラムが組めて自動化が可能になります。例えば自分が居なくても特定の条件をクリアすれば報酬を払ったり、ある期間が過ぎれば品物が送られてくるようにしたりする仕組みも作れます。この話で、僕は俄然Web3に興味を持ちました。

# NFT
そしてWeb3の中で現状一番ホットな要素がNFTだと思います。NFTはバブル的な意味で有名になったので、知っているけれど胡散臭いと思っている人も多いと思います。しかしNFTは技術的にはブロックチェーン上にデジタルデータのIDを記載することで、そのデジタルデータが世界にただ一つであることを証明できるだけのものです。唯一性を担保することで金銭的な価値を見出す方法が騒がれていますが、本来はそれこそ今までなかった表現が出来そうなところがポイントだと思います。

# DAO
一方でWeb3の文脈でピンとこなかった要素もあり、自分的な代表格がDAOです。DAOは分散型自律組織です。組織を統率する代表者が存在せず、参加者同士で意思決定がされます。正直これを聞いてうまくいくとは思えませんでした。自分の中で一番学習が足りていないのがこのDAOなので、DAOの技術に対する具体的な事は殆ど分かりません。しかしDAOにブロックチェーンの透明性、スマートコントラクトの自動化、イーサリアムの通貨概念を絡めることで面白い発展を遂げそうな予感は少し持ちました。

# メタバース
メタバースはWeb3の文脈でも割と中心的な要素で取り上げられます。Web3に興味がなくてもゲームなどで既に触れている人もいると思います。ただ個人的に今現在あるメタバースの殆どはWeb2のメタバースでWeb3の定義するメタバースではないと感じています。Web3のメタバースは非中央集権で、特定のプラットフォームには依存せず、どのメタバースアプリであってもデータやアバターの行き来が可能になるはずですが、現在は特定のアプリに閉じられた世界の方が多いと思います。ただWeb2のメタバースの延長線上にその世界があるのは間違いないので、そういう意味では今後が楽しみな技術です。

# Web3のどの技術で何を作るのが面白そうか？
さて、色々Web3の構成要素を説明しました。ブロックチェーン、ビットコイン、イーサリアム、スマートコントラクト、NFT、DAO、メタバース。すべてWeb3の文脈でよく語られるキーワードです。ではWeb3で何か作るとしたら何が良いでしょうか？例えば、ブロックチェーンに興味を持てば[論文](https://www.kk-kernel.co.jp/qgis/HALTAK/FEBupload/nakamotosatoshi-paper.pdf)を読んで仮想通貨を作るのが一番だと思います。通貨を作った個人など過去を振り返っても一部の王様などを除きほぼ居ないと思うので、これ以上ないぐらい熱いテーマだと思います。が、自分はそこには興味が持てませんでした。またメタバースやDAOに対しては、それを作ってみたいと思えるほどの知識レベルに達していないと思いました。自分はWeb3の中ではスマートコントラクトに引かれました。イーサリアムは既にスマートコントラクトが実装されています。で、あれば自分で作る必要はなく覚えれば作れることになります。そうなるとまたこれで何が作るかという話になり、結果自分としてはNFTで何か作ってみるのが一番面白そうかなと思いました。

# NFTで何を作るのが面白そうか？
ではNFTで何が作れるか。NFTを作るのであれば最低限具体的なデジタルデータが必要です。現状はアート作品が多く、そのデータ自体に価値があります。しかし、それはNFTの一側面でしかなく、NFTはまだ世の中にない表現が出来る可能性すらあるものだと思っています。自分としては例えば推しや萌えをといった目に見えない価値に対してIDを振るのが面白そうと思っています。さらにプログラマの自分がNFTを作るために最も貢献できるのは、スマートコントラクトのプログラムを書くことで出来る「動的な表現」だと思っています。少なくとも今日現在ではこの部分はプログラム以外での実現は厳しいと思っています。

# 結局思いついていないので、続きはイーサリアムについてまとめてみる
というわけでWeb3を技術的に勉強する場合何を作ると面白そうかを考えた結果として、スマートコントラクトのプログラムを書きたいと思っていますが、3カ月で2冊の本を読んだだけではまだそれで何を作るかすら思いついていない状態です。Web3で覚えることは一杯あって、毎日新しい単語が出てきて溺れそうになります。でも、それが凄く楽しいし、何を作るかを考えることは本当に刺激的です。現状ではスマートコントラクトを書くためにはイーサリアムの理解をさらに深めることが重要だと思っています。そこで、次はイーサリアムのアドベントカレンダーを書く予定です。
sfdx-git-deltaでリリースパッケージを作成しよう

# これは何？
- sfdx-git-deltaという、Salesforce CLIプラグインの紹介です。
- SalesforceDXを活用していてpackage作成に課題を感じている方や、リリースサイクルをCIで速くしたい方におすすめです。
- 自分がよく使うコマンドを記載します。

# sfdx-git-deltaとは

https://developer.salesforce.com/jpblogs/2021/05/optimizing-unpackaged-deployments-using-a-delta-generation-tool-jp/

https://github.com/scolladon/sfdx-git-delta

>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445600/bd6d79e3-68be-8f12-64fb-7fc0a9249646.png)


git のコミット間の差分、ブランチ間の差分、tag間の差分 diff から
`package.xml`と`destructiveChanges.xml`を自動生成します。

例えば、以下のようなコードを追加してコミットします。

```apex: Test.cls
public with sharing class Test {
  public Test() {
  }
}
```

この後リリースをするためには、以下のようなパッケージを作成する必要があります。

```diff_xml: package.xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
+   <types>
+       <members>Test</members>
+       <name>ApexClass</name>
+   </types>
    <version>56.0</version>
</Package>
```

sfdx-git-deltaを利用すると以下のコマンドで同一の結果が得られます。

```bash
# 最新のコミットと一つ前のコミットの差分でpackageを作成
$ sfdx sgd:source:delta --to "HEAD" --from "HEAD~1" --output "."
```

# インストール

前提として Salesforce CLIがセットアップされている必要があります。

https://developer.salesforce.com/docs/atlas.ja-jp.214.0.sfdx_setup.meta/sfdx_setup/sfdx_setup_install_cli.htm

```bash
$ sfdx plugins:install sfdx-git-delta
```

# コマンド

自分が利用するコマンドを記載します。

## 現在のブランチとmainブランチとの差分でパッケージを作成

`git rev-parse --abbrev-ref @`で現在のブランチ名が取得できます。

```bash
$ sfdx sgd:source:delta --to "$(git rev-parse --abbrev-ref @)" --from "main" --output "."
```

## 最新のコミットと一つ前のコミットの差分でパッケージを作成

`git rev-parse --abbrev-ref @`で現在のブランチ名が取得できます。

```bash
$ sfdx sgd:source:delta --to "HEAD" --from "HEAD~1" --output "."
```

## タグ間の差分でパッケージを作成

CI/CDでタグ作成をトリガーで動かす場合に、ひとつ前のタグと最新のタグの差分でリリースパッケージを作成する等で使えるともいます。

最新のタグに関しては、`git describe --tags --abbrev=0`で取得し、
一つ前のタグに関しては`git describe --abbrev=0 --tags --exclude=$(git describe --abbrev=0 --tags)`で取得しています。

```bash
sfdx sgd:source:delta --to "$(git describe --tags --abbrev=0)" --from "$(git describe --abbrev=0 --tags --exclude=$(git describe --abbrev=0 --tags))" --output "."
```

# さいごに

sfdx-git-delta以外でパッケージを作るなら？

https://marketplace.visualstudio.com/items?itemName=VignaeshRamA.sfdx-package-xml-generator

VSCodeの拡張機能でGUIでパッケージ作成できるものがあります。
開発チームの体制によって、拡張機能かsfdx-git-deltaもしくは併用するという選択肢もあると思います。

快適なSalesforceDXライフを〜

他にもこんな感じでpackage作るの楽だよ！等あったら教えてください。

# 参考

https://qiita.com/rana_kualu/items/4d5e27244256e9689304

https://developer.salesforce.com/jpblogs/2021/05/optimizing-unpackaged-deployments-using-a-delta-generation-tool-jp/

https://github.com/scolladon/sfdx-git-delta

https://git-scm.com/docs/git-describe

https://stackoverflow.com/questions/28818419/how-to-get-previous-tag-in-git/28818420#28818420
[小ネタ] ElasticのAPMでコードに手を入れずにメソッド監視する方法

# はじめに
本記事はElasticのAPM Java Agentにおいて使用できる技になります。
執筆時点のJava Agentのバージョン1.34.1で試しています。


# やりたいこと
Elastic APM Java Agentをデフォルトの状態で使用すると、トレースの中のスパンとして可視化されるのは[サポートされているテクノロジー](https://www.elastic.co/guide/en/apm/agent/java/current/supported-technologies-details.html)のポイントとなるメソッドです。

例としてこの簡単なHello Worldコードを使います。

```java
package com.example.springbootdocker;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class SpringBootDockerApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootDockerApplication.class, args);
	}

    @RequestMapping("/")
    public String home() {
        randomSleep();
        return "Hello World!";
    }
    private void randomSleep() {
        try {
            Thread.sleep((long)(Math.random() * 1000));
        } catch (java.lang.InterruptedException e) {
        }
    }
}

```
上記コードはデフォルトでは以下のように可視化されます。Spring BootのWebリクエストのエントリポイントとして定義されているメソッドが可視化されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/98a5ce35-9379-1eb6-2aaf-411280efd9a0.png)


しかし、例えば業務アプリのコードの特定のクラスメソッドを可視化し、性能を見たい場合があると思います。サンプルコードだと、プライベートメソッドrandonSleepを追加で可視化するように。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/54112272-6bc3-7410-0926-4125062f0020.png)

コードの変更が可能なら[Java AgentのAPI](https://www.elastic.co/guide/en/apm/agent/java/current/public-api.html)を使って明示的に可視化可能ですが、今回はコード変更が難しい場合のauto instrumentationの方法について紹介します。

# 手順
手順は簡単で、以下のelasticapm.propertiesファイルを作成し、Java AgentのJARファイルelastic-apm-agent.jarと同じディレクトリに配置するだけです。

```elasticapm.properties
trace_methods=com.example.springbootdocker.SpringBootDockerApplication#randomSleep
```

記述の方法は以下のドキュメントに詳しくあります。
https://www.elastic.co/guide/en/apm/agent/java/current/config-core.html#config-trace-methods

リストとして複数を設定する時の方法が読んだだけではわからなかったのですが、以下のようにカンマ区切りで可能でした。また、改行する際はバックスラッシュで可能でした。
```elasticapm.properties
trace_methods=com.example.springbootdocker.SpringBootDockerApplication#randomSleep1, \
com.example.springbootdocker.SpringBootDockerApplication#randomSleep2, \
com.example.springbootdocker.SpringBootDockerApplication#randomSleep3 \
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/90a76ca5-eb65-901d-4357-2ce96cd80e4e.png)

# まとめ
Elastic APMでの任意のJavaメソッドの性能可視化の方法について紹介しました。
仕事中にワールドカップをばれないように見るCLI ツールを Rust で作ってみた

# 仕事中にワールドカップをばれないように見る CLI ツールを Rust で作ってみた

こんにちは、@ekusiadadus です。
日本が死の組をまさかの一位通過して本選出場を決めましたね。

ワールドカップ見たい......けど、仕事中にばれたら怒られる......

そんなときに仕事中にワールドカップを見るための CLI ツールを作ってみました。
https://github.com/ekusiadadus/samuraicup

(ついさっき PK で負けてしまいました 😢)

## How to use

![image](https://user-images.githubusercontent.com/70436490/205714489-7e4f5874-f6a8-47f9-98d4-011d3930b49c.png)

```
🌸 World Cup 2022 CLI for Japanese football fans 🌸

Usage: samuraicli <COMMAND>

Commands:
  real     ⚽ワールドカップをリアルタイムで確認する
  search   🥅ワールドカップのツイートを取得する
  keisuke  📣本田圭佑の動向を取得する
  help     Print this message or the help of the given subcommand(s)

Options:
  -h, --help  Print help information
```

## 12 月 6 日のクロアチア戦のときに動かした動画

![Ubuntu 22 04 1 LTS 2022-12-06 01-08-36_12](https://user-images.githubusercontent.com/70436490/205720685-f5692fd6-34fa-420a-ae3b-65e4b41c4429.gif)

## 作り方

設計ですが、ツイートを取得する箇所はクリーンアーキテクチャ的に作っています。(結構癖があるかもです)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905557/3b6d343d-b398-c6c2-076c-019afc13f3ff.png)

CLI 部分とかは、単純に `main.rs` に書いています。
CLI ツールを作るときは、[clap](https://crates.io/crates/clap) を使いました。
文字は[owo-colors](https://crates.io/crates/owo-colors)を使ってランダムで色を付けています。

### 1. Twitter API を使う

Twitter API を使って、ワールドカップのツイートを取得しました。
ここら辺は、[Twitter を BigQuery と JupyterLab で分析してみた ~ Twitter API v2 ~](https://zenn.dev/ekusiadadus/articles/twitter_bigquery_jupyterlab1) で書いたので、そちらを参考にしてください。

### 2. Rust で CLI ツールを作る

CLI ツールを作るときは、[clap](https://crates.io/crates/clap) を使いました。

以下のように書くと、オプションをいい感じに渡せます。

```rust

fn cli() -> Command {
    Command::new("samuraicup")
        .about("🌸 World Cup 2022 CLI for Japanese football fans 🌸")
        .subcommand_required(true)
        .arg_required_else_help(true)
        .allow_external_subcommands(true)
        .subcommand(Command::new("real").about("⚽ワールドカップをリアルタイムで確認する"))
        .subcommand(Command::new("search").about("🥅ワールドカップのツイートを取得する"))
        .subcommand(Command::new("keisuke").about("📣本田圭佑の動向を取得する"))
}

```

ここで受け取った値を、`match` で分岐させて、処理を実行します。

ツイートを受け取ったりする処理を書くときには、tokio を使って非同期処理を書きました。
ここら辺は、クリーンアーキテクチャ的に書いています(と思っています)。

```rust
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    std::env::set_var("RUST_LOG", "info");
    std::env::set_var("RUST_BACKTRACE", "1");
    dotenv().ok();

    let db_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set");
    let db_pool_size = std::env::var("DATABASE_POOL_SIZE")
        .ok()
        .and_then(|it| it.parse().ok())
        .unwrap_or(5);
    let bearer_token = std::env::var("BEARER_TOKEN").expect("BEARER_TOKEN not set");

    let app = initializer::new(initializer::Config {
        db_url: db_url,
        db_pool_size: db_pool_size,
        bearer_token: bearer_token,
    })
    .await;

    app.infras
        .ensure_initialized()
        .await
        .expect("Infra initialization error");

    let matches = cli().get_matches();
```

## まとめ

これで仕事中にもばれずにワールドカップを見ることができますね！

...あ、リモートだから関係なかった。
テレビ見よ
イングランド応援します。
話題のChatGPTでAIにゲームを作ってもらいたい(不具合修正編1) [Unity]

# お詫び
この記事は前後編の予定でしたが、文量や時間の都合で3～4編構成に分割させていただきます。ご了承下さい。
この記事ではChatGPTに前回書いてもらったコードの不具合をChatGPT自身に修正してもらいます。

# 前回
https://qiita.com/tanikura/items/c652dcd12b6ee35a027c

# FirstPersonControllerの修正
まず、ファーストパーソンでプレイヤーが動くようにします。
前回作ってもらった`FirstPersonController`をプレイヤーのゲームオブジェクトにアタッチして早速動かしてみます。
<details><summary>動画(視点が回っているため画面酔い注意)</summary><div>

![movie_001_640x360_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178660/ca93da9b-9f31-a12d-0d31-924bd149078a.gif)
</div></details>

カメラが回ってしまいました。
これは`FirstPersonController`内でカメラがx軸周りにも回転するような処理を行っているのに、回転処理とプレイヤーの移動処理を同一オブジェクトに対して行ってしまっているためです。
```CS:FirstPersonController.cs
using UnityEngine;

public class FirstPersonController : MonoBehaviour
{
    // 省略

    void Start()
    {
        // Rigidbody コンポーネントをキャッシュしておく
        // ここで自分のRigidbodyを取得している
        playerRigidbody = GetComponent<Rigidbody>();
    }

    void Update()
    {
        // 省略

        // マウスの移動量を元に、カメラの Transform を更新する
        // 自分のtransformを更新
        transform.Rotate(-mouseMovement.y, mouseMovement.x, 0.0f);
    }

    void FixedUpdate()
    {
        // 省略

        // 自分のRigidbodyを更新
        playerRigidbody.AddForce(movement * speed);
    }
}
```
一旦スクリプトの責務を分けるため、ChatGPTにプレイヤーの移動スクリプトとカメラを動かすスクリプトを分割してもらいましょう。
![スクリーンショット 2022-12-05 230339.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178660/0220388c-58dd-0c07-11ac-f61e59782fe0.png)
答えが返ってきました。
![スクリーンショット 2022-12-05 230536.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178660/598cdf6d-0452-8a76-5c56-cbfac3b47c24.png)
![スクリーンショット 2022-12-05 230559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178660/1645453e-9c9c-3599-0549-058b720a489d.png)
言われたとおりに修正します。
![movie_002_Trim_640x360.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178660/e93986c9-729f-3814-4944-7ee9a38c96dc.gif)
カメラとプレイヤーを別々に動かすことができるようになりました。
ただ、カメラの向きとは関係なくワールドのz軸方向にプレイヤーの前方が向いてしまっているので操作しづらいのと、カメラが斜めに傾くので画面が見づらいですね。
これもChatGPTは直してくれるでしょうか？
![スクリーンショット 2022-12-05 231611.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178660/fc800874-1444-7be9-55d1-289d283ce342.png)
![スクリーンショット 2022-12-05 232133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178660/ea1dcff1-4222-540a-740c-7d9401193362.png)
**簡単に直してくれました。**
動かしてみます。
![movie_003_Trim_640x360_fps20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178660/bc2f6cff-f2bf-e466-e9cf-b79bb9034db3.gif)
ちゃんと動くようになりました。
Kubernatesのコンテクスト/ネームスペース切り換えにKubieをどうぞ

僕がいつもよく使っている、コンテクストやネームスペースの切り換えツールKubieを紹介します。

https://blog.sbstp.ca/introducing-kubie/

https://github.com/sbstp/kubie

READMEに載っているハムスターのアイコンがかわいいですね。

## これは何？

何かしら会社でKubernetesを触る人はdev/stg/prdなど複数のクラスタを扱うことが多いと思います。別のクラスタを扱う際には `kubectl config use-context` して切り換えたり、`kubectl -n foobar ...` のようにコマンドごとにネームスペースを指定するのですが、あまりにたくさんコマンドを打つので毎回これを打つのは面倒になってきます。

それらの切り替えを楽に行うために有名なkubectxやkubens、kubeswitchがあります。

https://github.com/ahmetb/kubectx

https://github.com/danielfoehrKn/kubeswitch

Kubieはこのkubectxやkubensの強力な代替ツールとして作られています。

自分がこのKubieの一番の特徴だと思っているのは、**コンテクストごとに別のシェルプロセスが立ち上がること**で、これによってターミナルエミュレータの別タブで別のコンテクストを扱うということが簡単にできます。

[README](https://github.com/sbstp/kubie)をみると各種インストール方法があります。Macの人は `brew install kubie` でどうぞ。

## 使い方

自分がよく使うのは以下の二つです

* `kubie ctx` コンテクストの 切り換え
* `kubie ns` ネームスペースの切り換え

```
$ kubie ctx
```

```
  prd-cluster
  stg-cluster
> dev-cluster
  3/5                                                                                                       0/0
> c
```

タイプした文字とクラスタ名がファジーにマッチングして、矢印キーで選んでエンターを押すと、コンテクストが切り替わり、以下のようにPS1が書き換わってターミナルに非常にわかりやすく表示されます。Qiitaでは表現できないですがいろも付いていて、今どのコンテクストに自分がいるのかが非常にわかりやすいです。

```
[dev-cluster|default] localhost: ~$ 
```

今は表示されているように、`dev-cluster` contextの `default` namespaceにいます。

ここで `kubie ns` でネームスペースを切り換えます：

```
[dev-zozo-platform|default] localhost: ~$ kubie ns

  foo-ns
  bar-ns
> baz-ns
  3/3                                                                                                       0/0
> 


[dev-cluster|baz-ns] localhost: ~$ 
```

同じようにファジーにマッチされ、ターミナルにわかりやすく今どのネームスペースにいるかを表示してくれます。

他にも `kubie exec <context> <namespace> kubectl get pods` のようにすると、コンテクストもnsもまたいで便利。

他のコマンドはヘルプを参照：

```
$ kubie
kubie 0.19.1

USAGE:
    kubie <SUBCOMMAND>

OPTIONS:
    -h, --help       Print help information
    -V, --version    Print version information

SUBCOMMANDS:
    ctx            Spawn a shell in the given context. The shell is isolated from other shells.
                       Kubie shells can be spawned recursively without any issue
    delete         Delete a context. Automatic garbage collection will be performed. Dangling
                       users and clusters will be removed
    edit           Edit the given context
    edit-config    Edit kubie's config file
    exec           Execute a command inside of the given context and namespace
    help           Print this message or the help of the given subcommand(s)
    info           View info about the current kubie shell, such as the context name and the
                       current namespace
    lint           Check the Kubernetes config files for issues
    ns             Change the namespace in which the current shell operates. The namespace
                       change does not affect other shells
    update         Check for a Kubie update and replace Kubie's binary if needed. This function
                       can ask for sudo-mode
```


## まとめ

かなり便利なのに周りに使っている人が多くなかったので、Kubieの社内/社外布教のためにKubieのよいところを説明しました。よきkubectlライフを :wave:
【WordPress】固定ページを作成する

# 前回の記事

前回の記事では、カテゴリーの設定方法について触れました。

https://qiita.com/raptony110/private/5da9cb68bdc69dc74d40

今回は、固定ページについて説明していきます。

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

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

# 固定ページとは
固定ページとは、投稿と違い静的なページのことです。例えば、プロフィールや、サイト説明、プライバシーポリシーなどですね。
# 固定ページを作成する
固定ページの作成方法は、WordPress管理画面の固定ページ>新規追加から行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/b900bb61-fcfb-4181-1b6b-e0e4f25382b4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/29434a75-0050-cd54-1acd-4efae943f184.png)
どこかで見たことのある画面が出てきましたよね。
そう、投稿記事とほぼ一緒の画面で、操作方法も全く同じです。（ブロックエディタの使い方は、[こちらの記事](https://qiita.com/raptony110/private/2988fab8e83b41f4aec1)を参考にしてください。）
違うのは右側のメニュー項目が違いますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/d481ae72-e07b-2a11-a745-fc432b144fc1.png)
ここを見ると、固定ページでもアイキャッチ画像を設定することができるのだなとわかりますが、カテゴリーやタグを設定することはできません。

# おわりに
いかがでしたでしょうか。今回の記事では、静的なページである固定ページの作成方法について確認しました。

次回は、投稿した記事や作成した固定ページの編集・削除する方法について確認しておきましょう。
python で、代入文(walrus演算子)を使おう！①（備忘録）

### 代入文を使ってコードを短くしよう！

代入文は、walrus演算子:=を使って、変数名への代入と値の評価を1文で行うものです。


## 代入式の発音

~~~python
A := B(A ウォルラス B)
~~~

## 事例①(代入文を使わない場合）
野菜ジュース専門の屋台があります。


野菜の在庫を以下のように定義します
~~~python
vegetables = {
    'tomato': 15,
    'melons': 9,
    'goya': 5
}
~~~
お客さんからメロンジュースの注文を受けて、メロンの在庫を確認してからジュースを作ります。

~~~
def make_melon_juice(count):
    return melon_juice

def out_of_stock():
    print('out_of_stock')

count = vegetables.get('melon', 0)
if count:
    make_melon_juice(count)
else:
    out_of_stock()
~~~
上のコードでは、countをif文の前で定義していて,それ以降の文でも使うかに思えるが、if 文の一行目、countがTrueかFalseかの判定でしか使われていない。

## 事例①　（代入文を使ってみる！）

代入文を使うと、コードが1行短くなっている。
また、countがif と一文になったので、countがif文の第一ブロックにしか関係ないということが明瞭に示された。
※walrus文：代入⇒評価　のプロセス

~~~python
vegetables = {
    'tomato': 15,
    'melon': 9,
    'goya': 5
}

def make_melon_juice(count):
    pass

def out_of_stock():
    print('out_of_stock')


if count := vegetables.get('melon', 0):
    make_melon_juice(count)
else:
    out_of_stock()
~~~
Vue3 の Composition API で親コンポーネントから子コンポーネントのメソッドを呼び出す（逆も）

# 主旨

App.vue から childComponent.vue のメソッドを呼び出す例です。ボタンを押したときに、数字が1ずつ増加すれば成功です。

`<script setup>` を使う場合で、親側を呼び出すサンプルはたくさん見つかるのに、子側を呼び出す例が見つけられなかったので、ここにメモしておきます。

`defineExpose()` を使うところが分からなかった。

## 参考

- [Calling method on Child Component - Composition API](https://stackoverflow.com/questions/64889756/calling-method-on-child-component-composition-api)

# 親から子メソッドを呼び出す

## 親側

```/src/App.vue
<script setup>
import {ref} from 'vue';

// 子のメソッド呼び出しに必要な部分
import ChildComponent from './components/childComponent.vue';
const childComponent = ref();

function increment(){
  childComponent.value.incrementNumber();
}
// 子のメソッド呼び出しに必要な部分(ここまで)
</script>

<template>
  <ChildComponent ref="childComponent"></ChildComponent>
  <button @click="increment">Increment</button>
</template>
```

## 子側

```/src/components/childComponent.vue
<script setup>
import {ref} from 'vue';

// このファイル (childComponent.vue) は
// /src/components/ 以下にあるものとする

// 親からの呼び出しに必要な部分
const number = ref(0);
function incrementNumber()
{
  number.value++;
}

defineExpose({
  incrementNumber,
});
// 親からの呼び出しに必要な部分 (ここまで)

</script>
<template>
  <div>
    Child: {{ number }}
  </div>
</template>
```

# 子から親メソッドを呼び出す

## 親側

```/src/App.vue
<script setup>
import {ref} from 'vue';

// 子からの呼び出しに必要な部分
import ChildComponentSecond from './components/childComponentSecond.vue';

const number = ref(0);

function incrementParent(){
  number.value ++;  
}
// 子からの呼び出しに必要な部分(ここまで)
</script>

<template>
  <div>
    Parent: {{ number }}
    <ChildComponentSecond @click="incrementParent">
    </ChildComponentSecond>
  </div>
</template>
```

## 子側

```/src/components/childComponentSecond.vue
<script setup>

// 親の呼び出しに必要な部分
const emit = defineEmits(['incremetParent']);
// 親の呼び出しに必要な部分 (ここまで)

</script>

<template>
  <div>
    <button @click="emit('incremetParent')">
      Increment
    </button>
  </div>
</template>
```

# おまけ（props）

## 親側

```/src/App.vue
<script setup>
import {ref} from 'vue';
import ChildComponentThird from './components/childComponentThird.vue';
const parentNumber = ref(100);
</script>

<template>
  <div>
    <ChildComponentThird
      :childNumber="parentNumber"
    ></ChildComponentThird>
  </div>
</template>
```

## 子側

```/src/components/ChildComponentThird.vue
<template>
  <div>
    <p>ChildNumber: {{ childNumber }}</p>
  </div>
</template>

<script setup>
const props = withDefaults(defineProps(),{
  childNumber: 0,
});
</script>
```

Typescript 版もそのうち書いときます（100年以内）