OmniAICreator/Qiita-1.07M huggingface dataset:
How crypto exchange makes money?

In recent days, we are witnessing great growth in the crypto industry. This is because of blockchain and cryptocurrencies. Cryptocurrencies are the highest trending in the crypto era. Which has a huge market value.

Many individuals are showing huge interest in these cryptocurrencies because it helps them to reap an excessive amount of profit within a short span of time. And they trade their virtual currencies in a place of crypto exchange. where the users can easily buy and sell their virtual currencies in a hassle-free way.

The number of active users of crypto exchanges is increasing day by day. It assists the exchange platform to generate multiple revenue-earning modules.  also, it is considered one of the most profitable business ideas in the current market. 

As a business startup, after knowing this you may have a curiosity to ask, does the crypto exchange have worthy revenue-earning factors if yes, then how do they make money

In this post, I'm going to explore the revenue-earning aspects of the crypto exchange. 

Let’s quickly view the best revenue-earning ways:


- Withdrawal fee
- Trading commission
- Listing fee
- Margin trading
- IEO launchpad


If you want to know a clear perspective of the above-mentioned ways, Then refer to this blog  >>>> [Revenue earning ways of crypto exchange](https://www.coinsclone.com/how-do-crypto-exchanges-make-money/?utm_source=mbpost&utm_medium=30112022&utm_campaign=sinu)


After knowing clearly, you can get the answers to your queries. The current crypto world is fulfilled with a lot of competition. In that, if you want to place your feet strongly, then you need to choose the best business model. This helps you to lead your entrepreneurial life in a successful way as well as you can easily generate a hefty amount of profit from it.
ServerlessFrameworkで、デプロイしたユーザー名が自動的にタグ付されるようにしてみた


## はじめに
本記事はMDC Advent Calendar 2022の1日目の記事です。
初日なので軽めのネタで。

## やりたかったこと
AWSのリソースをServerlessFrameworkで管理しながら複数メンバーで開発している時、同一ルートアカウントにデプロイしていたので、誰がデプロイしたのかわからなくなることがありました。
リソースのタグに自動でユーザーを識別できる情報が設定されたら便利だなと思って調べてみました。

## やったこと

1. 固定値でタグを設定
serverless.yamlにstackTagsで設定できます。
```yaml:serverless.yaml
provider:
  name: aws
  runtime: python3.8
  lambdaHashingVersion: 20201221
  stackTags:
    Application: hello
    Owner: watanabe
```

2\. IAMユーザー名をタグに設定
固定値の場合、デプロイする都度ソースを修正してからデプロイすることになってしまうので変数にしてみます。
```yaml:serverless.yaml
provider:
  name: aws
  runtime: python3.8
  lambdaHashingVersion: 20201221
  stackTags:
    Application: hello
    Owner: ${aws:accountId}
```

3\. ローカル環境のユーザー名をタグに設定
開発していた環境ではAWS SSOによってIAMユーザーを作成せずに運用していたため、２の方法ではアカウント情報が取れませんでした。
ローカル環境の環境変数を使うことで上手くいきました。
※$USERはMac/Linux系の環境のみで、Windowsでは（%username%になるため）使えないと思われます。

```yaml:serverless.yaml
provider:
  name: aws
  runtime: python3.8
  lambdaHashingVersion: 20201221
  stackTags:
    Application: hello
    Owner: ${env:USER}
```

## 参考にしたサイト

https://blog.serverworks.co.jp/2021/06/12/083929

https://www.hands-lab.com/tech/t12209/

https://qiita.com/Yuuki46240345/items/0e9cca81be96fb8a040a

## 今後やりたいこと
デプロイ環境としてローカル環境を使うとリポジトリと実行環境に乖離が発生したり環境差異でデプロイ失敗したりすること、自動CIも視野に、クラウドからデプロイするようにしたいです。
自動CIならGitのアカウントが証跡になるのでこのタグは不要ですね。

https://dev.classmethod.jp/articles/cloudshell-iac/
誤用から考える心理的安全性

心理的安全性とは
> このチーム内では、対人関係上のリスクをとったとしても安心できるという共通の思い

対人関係の会話・議論の場に適用可能な概念です
「気軽に〇〇できる」が心理的安全性と考えられがちですが
あらゆる「気軽に〇〇できる」を心理的安全性にすると、誤用につながってしまいます

心理的安全性とはなにか？を簡潔に表現するのは難しいので、
ここでは誤用から心理的安全性を考えていきます

## 匿名性と心理的安全性
「心理的安全性を高めるため、匿名で意見できるようにしました」
匿名性は心理的安全性？

↓

匿名は「対人リスク」を回避している状態なので、心理的安全性が高い状態とは言えないでしょう

---
類似で考えられる正用ケースを考えてみます
- 心理的安全性が低いため、匿名じゃないと意見が言えない
- 心理的安全性が高いため、オープンな場で気軽に意見を言える

## 認知負荷や責任と心理的安全性
「作業の際に覚えることが多く、失敗すると重大な問題になるため、心理的安全性が低いです」
手間や複雑さ、責任があると心理的安全性が低い？
逆に言うと、手軽にできると心理的安全性が高いのだろうか

↓

「対人リスク」への言及ではないので、心理的安全性ではないでしょう

---
類似で考えられる正用ケース
- 作業が分かりづらいし、同僚は忙しそうで質問しづらい。心理的安全性が低い
- 覚えることは多いが、気軽に質問できるし、丁寧に教えてくれるため心理的安全性が高い

## まとめ
（思ったより例を出せませんでした... :pray: 

例に上げた、匿名性や手間の削減は組織としては重要なケースもありますが
「心理的安全性ではない」ということを書いてみました

心理的安全性を重視するのは、組織の生産性やエンゲージメント向上のためですが
心理的安全性とは何か（何でないのか）を考えることで、効果的にそれらにアプローチ出来ると思います
Webストレージに保管する情報

# Webストレージの使用方法
最近のブラウザではCookieより高機能なストレージとして、Webストレージが使われています。
ただし使い方によってはセキュリティインシデント発生の可能性を孕んでいるため注意が必要です。

## Cookie
* **期限の設定**
javascriptのexpiresで設定が可能
```
document.cookie = 'dummy'; 
expires=Mon, 30 Nove 2022 00:00:00 GMT';
```
* **javascriptからのアクセス**
HttpOnly属性で制御可能

## Webストレージ＿localStorage
* **期限の設定**
設定はできず、無期限に保存される

* **javascriptからのアクセス** 
常にアクセスが可能で、制御できない

## Webストレージ＿sessionStorage
* **期限の設定**
設定はできず、タブを閉じるまで継続する

* **javascriptからのアクセス** 
常にアクセスが可能で、制御できない

## 保管に適した情報の種類
以上のように、Webストレージは任意の有効期限も設定できず、javascriptからのアクセスを制御することが出来ません。
XSS（クロスサイトスクリプティング）攻撃を受けた際は、情報を奪取されてしまうため保存する情報には注意を払う必要があります。

* **Webストレージに保存してはならない情報**
    * アクセストークン
    * パスワード
    * 個人情報
    
## まとめ
XSSされる時点でより危険な情報が攻撃者に奪取されるのだから、別に気にする必要はない。といった意見もありますが個人的な意見としては、抑えられるリスクは少ないに越したことはないのでWebストレージには漏洩しても構わない情報しか入れない方が良いのではないかと考えています。
アクセストークン等を保存することでUXを高めるのは間違いないので、そういった情報はjavascriptからのアクセスを禁止できるCookieで保持することをお勧めします。
ローカルスコープ使うのやめませんか？

[Laravel Advent Calendar 2022](https://qiita.com/advent-calendar/2022/laravel)　2日目の投稿です
# ローカルスコープについて
まずローカルスコープとは？
>アプリケーション全体で簡単に再利用できる、共通のクエリ制約を定義できます。たとえば、「人気がある（popular）」と思われるすべてのユーザーを頻繁に取得する必要があるとしましょう。スコープを定義するには、Eloquentモデルメソッドの前にscopeを付けます。

[readouble引用](https://readouble.com/laravel/9.x/ja/eloquent.html)

以前にもローカルスコープについて[記事](https://qiita.com/ryocha12/items/1b75e4d5b8df727937f3)を書いています。
具体的にはこんなやつです
```php:User.php
class User extends Model
{
    public function scopePopular($query)
    {
        return $query->where('votes', '>', 100);
    }
}
```
ローカルスコープを利用する時は**scope**を除いて小文字から始めます。
同じ条件を複数回使うようであれば記述量が少なくなってとても便利です！
```php
$users = User::query()
    ->popular()
    ->where('age', '>', 20)
    ->orderBy('created_at')
    ->get();
```

ただデメリットもあるなと思っています。
- ローカルスコープのメソッドを積み重ねるとModelが肥大化していく
- VSCodeなどで補完が効かない
- メソッドをクリックして定義元に飛べない
- ソースコード内を検索しても完全一致でヒットしない（scopeが先頭についているため）

このほかにも個人的には、そういうメソッドがLaravelには用意されていると思ってググりにいったこともあります。
そこで、カスタムクエリビルダーを作成してこれらのデメリットを解消する方法をご紹介します！

# カスタムクエリビルダーの作成
まずは、EloquentのBuilderクラスを承継してUserBuilderクラスを新たに作成し、ローカルスコープで定義していたメソッドをこちらに移します。
```php
namespace App\Builders;

use Illuminate\Database\Eloquent\Builder;

class UserBuilder extends Builder
{
    public function popular(): static
    {
        return $this->where('votes', '>', 100);
    }
}
```
そしてUserクラスにてModelクラスで定義されている**query()** と **newEloquentBuilder()** をオーバーライドしてあげます。
```php
use App\Builders\UserBuilder;

class User extends Model
{
    public static function query(): UserBuilder
    {
        return parent::query();
    }

    public function newEloquentBuilder($query): UserBuilder
    {
        return new UserBuilder($query);
    }
} 
```
これで準備は完了です！
```php
$users = User::query()
    ->popular()
    ->where('age', '>', 20)
    ->orderBy('created_at')
    ->get();
```
このようにコードを書けばModelの肥大化を防げて、コード補完も効いて、定義元にも飛べるようになりました。
よかったら使ってみてください！

`laravel-ide-helper`のライブラリを入れているとうまく定義元にも飛べなかったのでご注意を！
Next.jsブログの要件と利用サービスの選定について

[Next.jsで０からブログ作成 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nextjs_blog_create) の１日目の記事です。
本記事をご覧いただき、ありがとうございます。
Advent Calendarで、２５回に分けてNext.jsブログを作成する企画の初回になります。
今回は、そもそものきっかけや、要件の整理、サービスの選定について書きます。
# きっかけ
過去にWordPressでブログを運用していた経験がありましたが、
表示の遅さ、セキュリティリスクとイタチごっこになるアップデートの煩わしさに疲れて
静的サイトジェネレーターのHugoに乗り換えて運用を開始しました。

サイトの表示速度も爆速で満足していたのですが、記事が増えてくると別の問題が浮き彫りになりました。
そう、ビルドに時間掛かりすぎる問題です。
差分ビルドはできないか、Headless CMSを使ってはどうか、色々検討しましたが、
有効な解決策は見つかりませんでした。

そんな時、Next.jsのISR(Incremental Static Regeneration)の機能に注目しました。
ざっくり言うと、一定時間ごとにデータの再取得を行い、再生成する仕組みのことです。

ただし、問題もありました。
一定期間ごとに再生成するため、アクセスが無い場合でも、内部的に再生成が走ります。
乗り換え先として考えていたサービスでも、リクエスト数、データ転送量で課金される事が多く、
費用面で二の足を踏んでいました。

しかし、Next.js 12.1でリリースされたOn-demand ISRで状況は変わりました。
任意のタイミングでISRを実行することができるようになったのです。
Next.js 12.2 で安定板に変わり、これを使おうと確信したのでした。

Advent Calendar の勢いで、ブログを作り直したいと思います。

# ユーザー要件（私ですが。。。）

+ On-demand ISRを利用する
+ 費用は最小限
+ なるべく自作したい
+ 商用利用可（広告貼る程度）
+ 記事の更新などは、手間が少ない方が良い
+ （夢）月間５０万PVでも大丈夫

# サービス選定
On-demand ISRを実現するサービスとして Vercel が有力候補になるかと思いますが、商用利用はできません。
色々と検討した結果、ある程度自由に構築できるAWSを選択しました。
AWSのどのサービスを利用するかは、料金で検討することにしました。
見積りは以下の通りです。

https://qiita.com/solsol13_dia/items/0f9ee7820617999c0c05

先日、Next.js 13 に対応した AWS Amplify か Amazon Lightsail のどちらかが
候補に上がりましたが、転送量の無料枠１TB は大きいと思い、Lightsail を選択しました。
## 記事の管理
記事の管理は大きく２点あると考えます。
+ テキストファイル（マークダウンファイル）
+ データベース（Headless CMSなど）

今回は、DynamoDB を選択しました。
DynamoDB StreamをトリガーにしてLambdaを実行する事でOn-demand ISRを
発火させることができるのではと考えたためです。
画像は S3 に格納することにします。

# 機能要件
以下の機能を実装するように考えています。

+ 記事一覧
+ 記事詳細
+ カテゴリー機能
+ タグ機能
+ ページネーション
+ サイトマップ（ISRでどう実装するか悩んでいます）
+ SEO関連設定（OGPなど）
+ Qiitaの投稿記事も記事一覧に表示させたい（できれば）
+ Twitterと連携させたい（公開通知など）
+ On-demand ISR
+ 国際化対応（余裕があれば）
+ and more ...

# 補足事項
+ next/image を利用したいのでAmazon CloudFrontの利用は諦めた
next/image を諦めて自前で画像を最適化しようと考えたが、CloudFront と Lightsail の
最低インスタンスの無料データ通信枠が 1TB で同じだったため
+ DynamoDB に記事を登録する仕組みを実装しなければならない
+ お問合せフォームはSNSアカウントのリンクを貼るので機能から落とした
+ TypeScriptで実装する
+ tailwind css でデザインする
+ 独自ドメイン運用（Route53管理）
+ ソースコードはCodeCommit で管理する

# 最後に
バッファの無い状態で進めますので、生暖かい目で見守って頂ければと思います。
途中で、色々要件が変わったら、ごめんなさい。
スクラムにおけるスプリント期間の考え方

# はじめに

- 概ね、ryuzeeさんが説明されてるので、それ以上いうことはない気はする。
- それ以外のちょっと極端な事例をいくつか紹介するので、みなさんがスプリント期間を考える際のインプットになればいいなと思ってまとめています。

# ベースの考え方
## 最初は1週間スプリントがお勧め
https://www.ryuzee.com/faq/0026/

ryuzeeさんが1週間をお勧めする理由（ただし2018/02の記事なので最新の思いは変わってる可能性あり）

- レトロスペクティブ（ふりかえり）が頻繁にあるので改善が進む
- 計画の精度が高くなる
- 例え失敗しても一週間で済むので実験しやすい
- ベロシティの数字がすぐ出るのでやる気になる
- 中だるみする余裕がない・リズムがよい
- 一週間で収まるサイズのプロダクトバックログアイテムにするので明確な完成を定義しやすい。従ってプロダクトオーナーの受け入れを取りやすい
- スパイクが必要なプロダクトバックログアイテムが明確になる
- プロダクトオーナーが変更を我慢しやすい
- ごまかしが効かない

詳細は以下にも記載されているので、もう少し詳しく理解したい場合は見てみるのが良いかと。

https://www.ryuzee.com/contents/blog/7122

## スプリント期間を短くする/長くするのが良いケース

概ね解説編に書かれているのをサマリしたような形になりますが・・・
個人的に学習した範囲も補足した上で自分の理解をまとめておきます。

### 短くするケース

- 現状の計画の精度が低い
    - 現状のスプリント期間分の作業をばらし切ることができない。（作業の見通しが立っていない）
    - バックログアイテムの受け入れ条件（完了条件）を明確に定義することができない（何を持って終わりとすればいいかわからない）
    - 該当のスプリント期間ちょうどで終わると思えずバッファを多めに積みがちになっている
- 手戻りリスクが許容できないレベルの影響・発生確率・発生頻度
    - 現状のスプリント期間分の手戻りが許容できない（例えば、3ヶ月のプロジェクトで1ヶ月スプリントだった場合、万一手戻りした場合、PJ影響が大きすぎます。
    - スプリント期間中であっても要件の変更をせざるを得ずスプリント期間中の手戻りが発生する
- フィードバックサイクルが上手く回っていない（主に以下のような理由で）
    - 現状のスプリント期間で得られる情報量が多すぎるせいで振り返りに時間がかかりすぎている
    - 振り返りの結果対処すべきアクションが多すぎてどのアクションも散漫になっている
    - 一度に行う改善アクションが多すぎて何が効果を出しているのかわかりづらい
- チームがスクラムに慣れていない
    - 次のイベントまで期間が空きすぎていて、スクラムイベント自体の理解が進まない。
- POがチームの成果物を把握できない
    - チームの成果物の量が多すぎて把握できない
    - 作業期間が長すぎて成果物量が妥当なのか判別できない

### 長くするケース

短くするケースと逆なだけなので割愛。

# 実際の例

自分の例。

- 初期3ヶ月くらいは１週間スプリント。（3ヶ月は目安であって固定ではない）
- 一旦2週間スプリントにして様子を見る。
- 問題なさそうならそのまま2週間を継続。まずそうなら1週間にする。

あんまり3週間とか4週間とかは使わない。1週間か2週間かって感覚。

# ちょっと極端な事例（2日スプリント/15分スプリント）

こういう極端なチャレンジはなかなか受託開発の現場ではやりにくいところはあるんですが、事例としてちゃんと理解しておくことで手札が増えてる感覚はあります。
こういうケースを公開していただけるのは本当にありがたい限り・・・

**2日スプリント**

https://craftsman-software.com/posts/74

**15分スプリント**

https://kyon-mm.hatenablog.com/entry/2020/09/21/115958

# 次回予告

ここ２日ほど受託関係ない話が続いてましたが、次回からは受託絡みに戻ります。
受託アジャイルの体制を考えるときに抑えておくべきこと（今まとめ始めてますがポイントが思ったより多すぎるので、分割して記事にしていきます）
ZennのGitHub共有リポジトリに画像をアップロードする方法

ZennのGitHub共有リポジトリに画像をアップロードする方法を紹介します。

作業はすべてGitHub上で行います。

インターネットに接続しておく必要があります。

## 準備  その1

事前にZennとGitHubを連携させておきます。

やり方はこちら。

**ZennとGitHubを連携させる方法 - Qiita https://qiita.com/akiba_burari/items/2423d284bab666e01f45**

https://qiita.com/akiba_burari/items/2423d284bab666e01f45

## 3 準備 その2 画像を用意

GitHubにアップロードする画像を用意しておいてください。

アップロードする画像ファイルは、

・ファイルサイズ 3MB 以内

・対応する拡張子 .png .jpg .jpeg .gif のみ

の2つの条件を満たしている必要があります。

ここでは「**retoro-arck-top.png**」という画像ファイルを用意しています。

## GitHubにアクセス

GitHubにアクセスし、zennの共有リポジトリを開きます。

例：

**AkibaBurari/zenn_connect**

ここから画像をアップロードします。

zennの共有リポジトリ画面にある「**Add file**」をクリック

「**Create new file**」を選択

ファイル名を入力します。このときに必ず「**imeges**」ディレクトを記述してください。その中にあるファイルは後で削除するので、テキトーな名前をつけておいてください。

例：

**zenn_connect /images/test1.png**

画面下の「**Commit changes**」を選択します。

これで「imege」ディレクト内に「test1.png」というファイルが作成されます。

## 作成ファイルを確認

「**zenn_connect**」ディレクトリの中に

「**images**」ディレクトリが作成されています。

「images」ディレクトリを選択し、

画面右上の「**Add file**」をクリックし、

「**UpLoad files**」

を選択。

用意していた画像を選択し、アップロードします。

**retoro-arck-top.png**

画面下の「**Commit changes**」を選択します。

これで画像がアップロードされます。

## 確認と削除

「**images**」ディレクトリを選択

**retoro-arck-top.png**

があることを確認します。

最後に

**test1.png**

を削除します。

ファイルを選択してごみ箱アイコンをクリック

画面下の「**Commit changes**」を選択します。

これで「test1.png」ファイルだけを削除できました。

test1.pngファイルを削除しても

「images」ディレクトリは残っています。




## Zennブログにアクセス

Zennにアクセスしたら、画面右上の自分のロゴをクリックします。

「**GitHubからのデプロイ**」を選択

## デプロイを修正する

履歴を見るとファイルがうまく更新されていないようです。

そこで、上のタブから「**リポジトリ設定**」を選択

デプロイ対象ブランチを確認すると「**master**」になっていました。

GitHubでファイルの保存場所を確認すると、

正しくは

「**main**」

だったので変更します。

※これはGitHubがこれから新規に作成されるリポジトリのデフォルトブランチ名を「master」から「main」に変更したためです。GitHub上でディレクトリを新規で作成すると、自動的にブランチ名が「main」になります。

次に「**手動デプロイ**」を開始し、再びデプロイ履歴を見てみます。

今度はデプロイがうまくいき、きちんと更新できました。



同じやり方で、GitHub上に

「**articles**」

「**books**」

ディレクトリも作成できます。

まだ作成していない人は作成しておきましょう。




## 参考サイト  一覧

GitHubリポジトリ連携で画像をアップロードする方法 https://zenn.dev/zenn/articles/deploy-github-images

GitHub、これから作成するリポジトリのデフォルトブランチ名が「main」に。「master」から「main」へ変更 － Publickey https://www.publickey1.jp/blog/20/githubmainmastermain.html
Ruby と Go それぞれで依存性の注入を書く

## はじめに
これは [株式会社 RetailAI X Advent Calendar 2022](https://qiita.com/advent-calendar/2022/retail-ai-x) の 2 日目の記事です。

昨日は @kametaro さんの記事でした。 [RaftのErlang実装ことはじめ - Qiita](https://qiita.com/kametaro/private/a680d74da572f43ae493)

本日は、「 Ruby と Go それぞれで依存性の注入を書く」です。
Ruby の DI の是非は問いません。

## 環境
Ruby 2.6.1
Go 1.18.2
macOS Monterey ver. 12.3.1 Apple M1

## Ruby
😥
```ruby
class SubmachineA
  def sub_process
    # ...
  end
end

class Machine
  def main_process
    SubmachineA.new().sub_process
  end
end

Machine.new().main_process
```
😉
```ruby
class SubmachineA
  def sub_process
    # ...
  end
end

class SubmachineB
  def sub_process
    # ...
  end
end

class Machine
  attr_reader :sub_process_getter
  def initialize(args)
    @sub_process_getter = args[:sub_process_getter]
  end
  
  def main_process
    sub_process_getter.sub_process
  end
end

Machine.new(sub_process_getter: SubmachineA.new()).main_process
Machine.new(sub_process_getter: SubmachineB.new()).main_process
```

## Go
🥱
```go
package main

func main() {
    NewMachine().MainProcess()
}

type SubMachineA struct{}

func NewSubMachineA() *SubMachineA {
    return &SubMachineA{}
}

func (s *SubMachineA) SubProcess(){ /* ... */ }

type Machine struct {}

func NewMachine() *Machine {
    return &Machine{}
}

func (machine *Machine) MainProcess() {
    NewSubMachineA().SubProcess()
}
```
😌
```golang
package main

func main() {
	NewMachine(&SubMachineA{}).MainProcess()
	NewMachine(&SubMachineB{}).MainProcess()	
}

type SubMachineA struct{}

func (s *SubMachineA) SubProcess(){ /* ... */ }

type SubMachineB struct{}

func (s *SubMachineB) SubProcess(){ /* ... */ }

type SubProcessGetter interface {
	SubProcess()
}

type Machine struct {
	subProcessGetter SubProcessGetter
}

func NewMachine(subProcessGetter SubProcessGetter) *Machine {
	return &Machine{subProcessGetter: subProcessGetter}
}

func (machine *Machine) MainProcess() {
	machine.subProcessGetter.SubProcess()
}
```

## 感想
書いている途中で、Ruby  はそもそも DI を必要としない、という観点があることがわかり面白かったです。

明日は、@daisuke-yamamoto さんの、[Terraform、後から来る辛みと処方箋🌶](https://qiita.com/daisuke-yamamoto/items/d13bbf9ddf8be9f55940) という記事になります。


## 参考
この記事は以下の情報を参考にして執筆しました。

[詳解Go言語Webアプリケーション開発](https://budougumi0617.github.io/2022/07/22/release_go_web_application_book/)
若手エンジニア向け：クリティカルパスを朝のルーチンで説明してみた！

# クリティカルパス分析
プロジェクト管理手法の中で「クリティカルパス分析」というのが、あります。
これは、スケジュールを算出する上で、クリティカル（危機的、致命的）となるパス、ボトルネック部分を洗い出す手法です。

手順としては、
１．プロジェクトの工程を分析・洗い出す。
２．工程を順番に並べる
３．平行進行で制約条件が無い工程は、平行に置く
４．前後関係が条件となる工程は、順番に並べる

これにより。空きの無駄の無い工程スケジュールを作成する事ができる。同時に、どこの工程が遅れると次の工程が遅れるのかという事が分析できる。又、どの工程を短くすると、全体を短くできるのかが分析できる。

# 朝のタスクで考えてみよう
- ベッドから起きる
ここは、一番最初の作業となる
- 電気を点けた
ベッドからの次にタスクとして電気を点けた。ここからが色々なタスクがありそうです
- 歯を磨く
- 顔を洗う
- トイレに行く
これは、タスクとして色々と効率化が図れそうな予感がします。
## もう少しタスクを分解してみましょう
- 歯を磨く
    - 歯磨き粉を歯ブラシに付ける
    - 歯を磨く
    - 口をゆすぐ
    - タオルで拭く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/1989b542-73db-b427-b655-4e3003be1214.png)
- 顔を洗う
    - 顔を洗う
    - タオルで拭く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/ec291b61-0122-735c-7a05-eded35e2362e.png)
- トイレに行く
    -　トイレに行って。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/08351747-96b4-fae6-adf9-d3224501eda7.png)

効率化を考えると、
- 歯を磨きながら、トイレに行けそう
- 口をゆすいで顔を洗えば、タオルで拭くは一度で良さそう

## 並行タスクとマージタスクの2つが出来た。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/d6aee272-d6ca-fd89-586e-549a6d68b27e.png)

## 次に並行タスクの分析
「歯磨く」と「トイレに行く」は平行タスクですが、これは、後続タスクに「口をゆすぐ」があります。
「歯磨く」と「トイレに行く」の両方が終わらないと「口をゆすぐ」が開始できません。
歯磨きが終わってないのに口はゆすげないし、トイレが終わらないと、トイレでは、口をゆすげない。
これでクリティカルパスが出来た。全体スケジュールに影響を及ぼす可能性がある工程を繋いだ物がクリティカルパスとなります。

## クリティカルパスから全体時間を計算する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/6139f5d1-4de3-45e1-5325-f7feefab34b6.png)
従って、前提時間としては、5秒＋2分(120秒）＋20秒＋30秒＋20秒 =　195秒で3分15秒となる

## ここから短縮を検討する 
歯を磨くのが2分なのでトイレを30秒にしても全体の工程は短くならない。従って、歯磨きの短縮を検討する。
単に手抜きだと虫歯になるので、電動歯ブラシやマウスウオッシュを使って効率化を検討する。
歯ブラシが1分になれば、全体時間が135秒となり2分15秒と品質を落とさずに短縮される。

# 最後に
プロジェクト管理でクリティカルパスを引けてない人がよくいます。この分析をしておかないとプロジェクト管理が出来ません。概念をこの機会にしっかりと理解して欲しいと思い朝のルーチンで例えてみました。
僕の場合は、いつも、全ての行動にクリティカルパスを意識してます。エレベーターのボタンを押した後に玄関の鍵を閉めに戻ったりとか。日頃から意識して生活するとクリティカルパスに慣れてくると思います。

今後も続けていきますので、フォロー、イイね、シェアお願いします。
下記、説明会もご参加下さい。
[エンジニア年収アップ講習(転職サポート付き！)　無料説開会　12月6日　19時開催](https://cto-can-be.hp.peraichi.com/)
お勧めのフォルダ構成について(ナレッジ)

# はじめに
本記事は[Angular Advent Calendar 2022](https://qiita.com/advent-calendar/2022/angular)の3日目の記事になります。
約4年Angularの開発を行っており、
その中での個人的ベストと感じたフォルダ構成について
ナレッジ含め共有します。

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# そもそもフォルダ構成のベストプラクティスを公式は公開しているか？
残念ながら、フォルダ構成について公開されておらず、
各々のプロジェクトに任せるとのことです。。
そのため、各種案件に参加するたびにフォルダ構成にバラツキが発生する。。

<a id="#Chapter2"></a>
# 構成の考え方
AngularはモジュールのLazy Loadが存在するため
モジュール単位での構成を立てるのが良いかと思います。


<a id="#Chapter3"></a>
# 実際の構成
```
.vscode ・・・ VsCodeの各種設定ファイルを管理
src
　└app
　　└ modules
　　　　└ 各種モジュールフォルダ
　　　　　└ components
　　　　　└ models
　　　　　└ servies
　　　　└ shared・・ 共通モジュール

　　└ shared
　　　└ models
　　└ utils・・各種ユーティリティ機能を管理

assets ・・・ 静的ファイルを管理
　└css
　└i18n
　└images

environments ・・・ 環境設定ファイルを管理
```
<a id="#Chapter4"></a>
# フォルダ構成を適切に管理するツール
npmパッケージにls-lintがあります。
ls-lintは所定のフォルダに拡張子単位で正しいファイル名で配置しているかを
チェックしてくれます。

公式URL
[ls-lint](https://ls-lint.org/)

<a id="#Chapter5"></a>
# Angularの構成管理出力ツール
余談になりますが、Angularのソースを元にAngularの構成を出力するnpmパッケージがあるので紹介します。

・モジュールの依存度
・Router情報
・ドキュメントのカバレッジ
・クラスやディレクティブの情報など

詳しくは以下でご参照ください。
[Compodoc](https://compodoc.app/)

<a id="#Chapter5"></a>
# 最後に

フォルダ構成は、その時々のプロジェクトに合った構成がありますので
あくまで参考にしてもらえればと思います。
もしくはもっといい構成があれば、教えてください。

明日は、[Jialipassion](https://qiita.com/Jialipassion)さんです
【Ruby】フィボナッチ数列を出力する方法

# 問
**フィボナッチ数列をn=10まで出力しなさい**
ただしフィボナッチ数列とは
f[0] = 0
f[1] = 1
f[n] = f[n-1] + f[n-2] (n >= 2)
の数列である。

# 結論と解説
## コード
```ruby
# 空のハッシュfを作る
f = Hash.new

# 0~10の数列に対してeach文を回す
(0..10).each do |n|
  if n == 0
    f[n] = 0 # n = 0のとき、値は0
  elsif n == 1 # n = 1のとき、値は1
    f[n] = 1
  else
    f[n] = f[n-1] + f[n-2] # n >= 2のときは前項と前々項の値の和
  end
end

puts f # ハッシュの出力
```

## 出力結果
```ruby
{0=>0, 1=>1, 2=>1, 3=>2, 4=>3, 5=>5, 6=>8, 7=>13, 8=>21, 9=>34, 10=>55}
```

### おまけ
**i項目の値が知りたいとき**
```ruby
puts f[i] # 0 < i <= n

# 例
puts f[7]
# => 13
```

**ある値がフィボナッチ数列の何項目なのかを知りたいとき**
```ruby
puts f.key(val) # valはフィボナッチ数列内の値

# 例
puts f.key(55)
# => 10
```

# 日記的メモ
下の記事を書いたとき、他に有名な数列といえば、、と思いついたのがフィボナッチ数列でした。
一回作っとけば今後聞かれたときに安心ですね。

https://qiita.com/ysk91_engineer/items/128e023d008330fbb874
Ubuntu22.04 php8からphp7.4へダウングレード

参考: https://www.how2shout.com/linux/how-to-install-php-7-4-on-ubuntu-22-04-lts-jammy-linux/

```
apt install software-properties-common

add-apt-repository ppa:ondrej/php -y

apt install php7.4

apt install php7.4-{cli,common,curl,zip,gd,mysql,xml,mbstring,json,intl}

update-alternatives --config php
```
【パソコン初心者】デスクトップのフォルダ名を黒にしたい

# 結論
できない。
アップル公式のウェブサイトにて背景を暗くするか、応急処置としてcmand+aで全選択すると見やすくなるって書いてあった。
参考までに : [appleQA](https://discussionsjapan.apple.com/thread/250695652)
【Ruby】1~100の数字の中から素数を出力する方法

# 問
**1～100の数字の中から、素数を出力するコードを書きなさい**

# 結論と解説

## コード
```ruby
num = [*1..100] # 1~100の数をもつ配列numを作成
non_prime_number = [] # 素数ではない数を入れるように空の配列non_prime_numberを作成

num.each do |n| # numに対してeachを回し、素数ではない数を探す
  non_prime_number << n if n == 1 # 1は素数ではない
  # 2は素数なので処理なし
  if n >= 3
    i = 1 # while文内で使う
    while true # 無限ループを作る
      i += 1 # iは2からスタートさせる
      # iを2~nで変化させ、n / iの余りが0であったらnは素数と判定
      non_prime_number << n if n % i == 0
      # iがnのひとつ前の数になるか、nが素数でない数であったらループ終了 
      break if i == n -1 || n % i == 0 
    end
  end
end

# 全ての数から素数でない数を引いて出力
puts num - non_prime_number
```

## 出力結果
```ruby
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
```

# 日記的メモ
転職活動において、面接で出されたコーディングテストです。
面接時に答えられなかったので、復習のために作成しました。
こういった数学の有名な数列について作成できるようにしとかなきゃな～と思いました。
#22 Bootstrapの各機能まとめ3 [Tables]

# ##2 Bootstrapの各機能まとめ3 [Tables]
Bootstrapを機能毎にまとめて行きます。
今回は第3弾として今回はTablesをまとめます。

# 前回まで
前回はNavbar, Dropdown, Containersの機能を中心にまとめました。

https://qiita.com/Jackoguro/items/d9e3ef1203bd79234610

## 1. Tables
https://getbootstrap.jp/docs/5.0/content/tables/

Tablesの使い方として、``<Table>``タグに基本形クラス``.table``を追加した上で任意でオプションを付けていきます。

### 1. Variants
表、表の行、表の項目等に色を付けることができます。
```html
<!-- 表全体に色を付ける 例) 青色 -->
<table class="table table-primary"></table>

<!-- 表の行に色を付ける 例) 緑色 -->
<tr class="table table-success"></tr>

<!-- 表の項目に色を付ける 例) 赤色 -->
<td class="table table-Danger"></td>
<th class="table table-Danger"></th>
```

### 2. Striped rows
``tabel-striped``を追加することで縞模様を表現することができます。
```html
<!-- 縞模様 -->
<table class="table table-striped"></table>

<!-- 縞模様(黒色) -->
<table class="table table-dark table-striped"></table>
```

### 3. Hoverable rows
``table-hover``を追加することでマウスが乗っている際にホバー状態になる

```html
<table class="table table-hover"></table>
```

### 4. Table borders
``table-bordered``を追加することでテーブルとセルの四方に境界線をつけることができる

```html
<!-- 境界線の作成 -->
<table class="table table-bordered"></table>

<!-- 境界線の作成(青線) -->
<table class="table table-bordered border-primary"></table>

<!-- 境界線の削除 -->
<table class="table table-borderless"></table>
```

### 5. Responsive tables
``table-responsive``を追加することで一定のブレークポイントを超えるとスクロールバーが表示される

```html
<!-- 全てのブレークポイントでスクロールバー表示 -->
<div class="table-responsive">
  <table class="table">
    ...
  </table>
</div>

<!-- 576以下でスクロールバー表示 -->
<div class="table-responsive-sm">
  <table class="table">
    ...
  </table>
</div>

<!-- 768以下でスクロールバー表示 -->
<div class="table-responsive-md">
  <table class="table">
    ...
  </table>
</div>

<!-- 992以下でスクロールバー表示 -->
<div class="table-responsive-lg">
  <table class="table">
    ...
  </table>
</div>

<!-- 1200以下でスクロールバー表示 -->
<div class="table-responsive-xl">
  <table class="table">
    ...
  </table>
</div>

<!-- 1400以下でスクロールバー表示 -->
<div class="table-responsive-xxl">
  <table class="table">
    ...
  </table>
</div>
```
Pythonをこれから学びたい人向けのおすすめ本

# プログラミングの学習ってどこから始める？
## Hello Worldでつまづく。
　今一番ホットで初心者向けのプログラミング言語「Python」ですが、いざ始めようと思っても何から始めればいいのか、どうやって学んで行けばいいのか悩むハズ。
　かく言う私も、プログラミングには以前から興味はありましたが、どこから初めていいのかわからず困っていました。「Hello Worldまではわかるが、その後が何もわからない。」「そもそもプログラミングってどうやったら始められるの？」など、プログラミング始めたての頃はよく思いました。
## プログラミングを学びたいのなら、本屋に行け
　プログラミング言語を学びたいなら、解説本を買うのがおすすめです。
もちろん、インターネットの情報をもとに学んでもいいのでしょうが、以下の理由から解説本をおすすめします。

**インターネットの情報は、特定の情報（関数の使い方やエラーの対処方法など）を探すのには大変便利だが、断片的な情報しか得られない。何を学べば（調べれば）いいかわからない状況で、インターネットは不向き**

　とはいえ、いざ書店に解説本を買いに行っても、自分に合った1冊を見つけるのは大変難しい。特に、プログラミングの基礎も身についていない人に、その本の良し悪しを判断するのは大変難しいはずです。

この記事では、私が初心者におすすめできる本を随時追加していきます。
# おすすめプログラミング本
## Python1年生 第2版 体験してわかる！会話でまなべる！プログラミングのしくみ

https://www.shoeisha.co.jp/book/detail/9784798170381

私はこの本を読んでPythonを学びました。
変数やモジュールなどといったプログラミング初心者にとってわかりにくいものも丁寧に解説されています。

この本を一通り学び終えたら以下の本でステップアップしてもいいかもしれません。

https://www.shoeisha.co.jp/book/detail/9784798161914

https://www.shoeisha.co.jp/book/detail/9784798170305

誰かのお役に立てれば幸いです。
PHPでできたWebサーバ「BayServer for PHP」のインストール方法

# PHPでできたWebServer
BayServerは[横浜ベイキット](https://baykit.yokohama "Baykit Home")が開発しているオープンソースの爆速Webサーバーです。
Java版、Ruby版、Python版、PHP版が存在し、すべて同じロジックで動作しています。

ここではPHP版のインストール方法を解説します。

Webサーバ自体がPHPでできているので、ApacheやNginxなどをインストールすることなく、WordPressなどを動かすことができます。
PHPだけあれば動くというのがポイントかと思います。

なお、BayServerはFCGIのクライアントにもサーバーにもなれるので、Apache + BayServerのような構成も可能ですし、BayServer + PHP-FPMという構成も可能です。


# 前提条件
BayServer for PHPはWindows/Mac/Unixいずれのプラットフォームでも動作します。

BayServer for PHPを実行するのに必要なのは PHP7.4 以上の実行環境です。
インストールされていなかったらインストールしておきましょう。


# ダウンロードと解凍

ここからダウンロードします。執筆時点のバージョンは2.0.2でした。
https://baykit.yokohama/download/

解凍し、ディレクトリの移動をします。

```
$ tar zxf BayServer_PHP-2.0.2.tgz
$ cd BayServer_PHP-2.0.2/
```


# 実行

```
$ bin/bayserver.sh
Cannot load Xdebug - it was already loaded
[Wed, 30 Nov 2022 19:52:18 +0900] INFO . BayServer Home: /home/mp/Downloads/BayServer_PHP-2.0.2/bin/.. (at BayServer.php:139)
[Wed, 30 Nov 2022 19:52:18 +0900] INFO . BayServer Plan: /home/mp/Downloads/BayServer_PHP-2.0.2/bin/../plan/bayserver.plan (at BayServer.php:167)
[Wed, 30 Nov 2022 19:52:18 +0900] INFO . PHP interpreter: php-cgi (at PHPCGIDocker.php:31)
[Wed, 30 Nov 2022 19:52:18 +0900] INFO . 町を初期化しています: /cgi-demo/ 場所: /home/mp/Downloads/BayServer_PHP-2.0.2/www/cgi-demo (at BuiltInCityDocker.php:77)
[Wed, 30 Nov 2022 19:52:18 +0900] INFO . 町を初期化しています: / 場所: /home/mp/Downloads/BayServer_PHP-2.0.2/www/root (at BuiltInCityDocker.php:77)
        ----------------------
       /     BayServer        \
-----------------------------------------------------
 \                                  Version 2.0.2  /
  \           Copyright (C) 2021 Yokohama Baykit  /
   \                     http://baykit.yokohama  /
    ---------------------------------------------
[Wed, 30 Nov 2022 19:52:18 +0900] INFO . TCPポートを開いています: :2020 [h1] (at BayServer.php:217)
[Wed, 30 Nov 2022 19:52:18 +0900] INFO . TCPポートを開いています: :2024 [h1] (at BayServer.php:217)
[Wed, 30 Nov 2022 19:52:18 +0900] INFO . TCPポートを開いています: :2025 [ajp] (at BayServer.php:217)
[Wed, 30 Nov 2022 19:52:18 +0900] INFO . TCPポートを開いています: :2029 [fcgi] (at BayServer.php:217)
[Wed, 30 Nov 2022 19:52:18 +0900] INFO . グランドエージェントを開始します: Agt1 (at GrandAgent.php:164)
[Wed, 30 Nov 2022 19:52:18 +0900] INFO . グランドエージェントを開始します: Agt2 (at GrandAgent.php:164)
[Wed, 30 Nov 2022 19:52:18 +0900] INFO . グランドエージェントを開始します: Agt3 (at GrandAgent.php:164)
[Wed, 30 Nov 2022 19:52:18 +0900] INFO . グランドエージェントを開始します: Agt4 (at GrandAgent.php:164)
```

# ブラウザから確認

http://localhost:2020/ にアクセスしてみます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2993333/f8415104-0d1e-bd6e-607b-10ac6c40b8b2.png)

トップページが表示されればOKです。
ちなみに、ドキュメントルートは www/root になります。

# BayServerの使い方

BayServerの使い方は[本家サイト](https://baykit.yokohama/bayserver-documents/)にたくさんドキュメントがあるのでこちらを参照してください。
MATLAB で Digital Lossy VST プラグインを作る ～ 聴覚心理特性とは？ ～ 非同期バッファで MDCT（予告編3）

[<B>MATLAB/Simulink Advent Calendar 2022</B>](https://qiita.com/advent-calendar/2022/matlab) に参加予定です。
<br>
勢いあまって、ピッチシフトを追加しました。
<br>

・使用ツール
<dt>　MATLAB</dt>
－Audio Toolbox
<br>
<br>

・デモ動画
<B>[Digital Lossy VST プラグイン (Mode7-8)]</B><iframe width="704" height="692" src="https://www.youtube.com/embed/SH7uxVvHbow" title="" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<br>
<br>
<br>
<H4>[<B>note</B>]<a href="https://note.com/leftbank/"</a> にUpします。</H4>
【AWS】AmazonConnectとLex間で変数をやり取りする方法

# 1.はじめに
どうも、ARIの名古屋支社に勤務している愛知県民こと、
新藏（にいくら）と申します♪
(/・ω・)/

何本かLexに関する記事を書きましたが、今回も同様のシリーズとなります。
**今回はAmazonConnectとLex間で変数をやり取りする方法について**記事にしたいと思います！
AWS、AmazonConnect、Lexについて勉強中の方の参考になれば幸いです。
(*^^)v

ちなみに、12月は**ARIのアドベントカレンダ**もやっていますので、
もしよろしければ、こちらも応援お願いします♪

https://qiita.com/advent-calendar/2022/ari-group

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

# 2.AmazonConnectのコンタクト属性をLexで使用する

2.1.Lexを呼び出す「顧客の入力を取得する」ブロックのセッション属性にて、Lexに渡したい情報を設定します。

:::note info
以下の画像は、コンタクト属性「Balance」に「5000」という値を入れてLexに渡す設定となります。
:::

|![010_顧客の入力を取得するブロックの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/4a34622c-b443-042b-1605-e9e9413d16a0.png)|
|:--|

2.2.Lexのプロンプトにて[★宛先キー名★]とすることでLexにて使用することができます。

:::note info
以下の画像は「残高5000円を支払う処理を受け付けます。よろしいですか。」
というプロンプトを流す設定となります。
:::

|![020_Lexでコンタクト属性を使用する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/62c03512-8aec-dfcd-3de7-480b04f07c1e.png)|
|:--|

# 3.Lexが聞き取った情報をAmazonConnectで使用する

3.1.Lexのスロット名を確認します。

:::note info
以下の画像は、Lexのスロット名が「NewPostCode」の場合です。
:::

|![110_Lexのスロット名.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/c53ae6b9-0219-3964-8f29-8c49c4dafe35.png)|
|:--|

3.2.AmazonConnectにて、タイプを「Lex」、属性を「スロット」、
スロット名を「前手順で確認したスロット名」とすることで、AmazonConnectで使用することができます。

:::note info
AmazonConnectで以下の設定をすると、
顧客が回答した「NewPostCode」の値（郵便番号）を使用することができます。
:::

|![120_AmazonConnectでLexの情報を使用する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/052488c2-6bbd-363e-7e48-d2f24ca1c78d.png)|
|:--|

# 4.おわりに
ここまで読んで下さり、ありがとうございます！！！
(^^)

今回の設定をすることで、より柔軟にAmazonConnectとLexを使えると思いました♪
次回も何かしら記事にしたいと思います！
(:3_ヽ)_
【AWS】Lexのボイスボットに数字をそのまま読ませる方法（「123」を「イチニイサン」と読ませる）

# 1.はじめに
どうも、ARIの名古屋支社に勤務している愛知県民こと、
新藏（にいくら）と申します♪
(/・ω・)/

先日、Lexのボイスボットを作成したのですが、
「123」を「イチニイサン」と読ませるのに少々苦労しました・・・

:::note info
デフォルトの場合「123」は「ヒャクニジュウサン」と読まれます。
:::

そこで**今回はLexのボイスボットに数字をそのまま読ませる方法について**記事にしたいと思います！
AWSやLexについて勉強中の方の参考になれば幸いです。
(*^^)v

ちなみに、12月は**ARIのアドベントカレンダ**もやっていますので、
もしよろしければ、こちらも応援お願いします♪

https://qiita.com/advent-calendar/2022/ari-group

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

# 2.前提条件
前提条件は以下となります。

* Lexボットが作成済であること

# 3.Lexの設定
では、早速設定していきましょう！
数字をそのまま読ませるためには、SSMLという音声の読ませ方を定義するプログラミング言語を使用します。

3.1.Lexボットの管理画面を開き、ボット名、インテント名の順番に選択します。

3.2.スロットや確認プロンプトにて「詳細オプション」を選択します。

:::note info
以下の画像は確認プロンプトの場合となります。
:::

|![010_スロットや確認プロンプトで詳細オプションを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/de2ecdfd-06a2-fe1b-c12e-e83a86fc7b4c.png)|
|:--|

3.3.「その他の応答オプション」を選択します。

|![020_その他のプロンプトオプションを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/39666c9a-2010-b304-42ff-f35a19520e2c.png)|
|:--|

3.4.メッセージグループの「×」を選択し、「追加」を選択し、「SSML言語を追加」を選択します。

|![030_メッセージグループを削除し、SSMLを追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/a0363e31-2a8d-568e-9133-11839f790f6e.png)|
|:--|

3.4.以下の書式でSSMLを入力し、設定を保存します。

```
<speak xml:lang="ja-JP">
    ★通常のプロンプトの内容★
    <say-as interpret-as="spell-out">★数字として読ませたい数字★</say-as>
    ★通常のプロンプトの内容★
</speak>
```

```<speak xml:lang="ja-JP"></speak>```
の部分が日本語で読むという設定となり、

```<say-as interpret-as="spell-out"></say-as>```
の部分が中にある単語を1文字ずつ読むという設定となります。

:::note info
例として以下のSSMLを設定すると
「郵便番号はヨンヨンレイレイレイニイロクでよろしいでしょうか。」
と読ませることができます。
:::

|![040_SSMLを入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/16b01bd4-02f9-307a-e7e1-aca77799ecf3.png)|
|:--|

:::note info
「プレイ」を選択することで、実際に読まれる音声を確認することができます。
:::

また、以下の様に設定することで、スロットに保存された値を使用することができます。

```
<speak xml:lang="ja-JP">
    郵便番号は
    <say-as interpret-as="spell-out">{★スロット名★}</say-as>
    でよろしいでしょうか。
</speak>
```

3.5.「インテントを保存」を選択し、「構築」を選択します。

|![100_インテントを保存、構築.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/9c1aa7b1-64e4-ed38-2b25-eaccf5e0726f.png)|
|:--|

3.6.以上で設定は完了です。

# 4.おわりに
ここまで読んで下さり、ありがとうございます！！！
(^^)

最初はSSMLがよく分からずに、沼りましたが何とか設定することができました。
次回も何か気になったことがあれば投稿します♪
(:3_ヽ)_
シンボリックリンクの作成／削除

### シンボリックリンクとは

ファイルを別のファイル名でリンク（参照）させるもの。
シンボリックリンクを削除してもリンク先のファイルは削除されない。
（ファイルだけでなく、ディレクトリも可能）

### シンボリックリンクの作成コマンド
```
ln -s <リンク先> <シンボリックリンク名>
```
リンク先は、シンボリックリンクの場所からの相対パス、または絶対パス。
<シンボリックリンク名>は省略可（省略した場合、リンク先のファイル名（ディレクトリ名）と同じ名前のシンボリックリンクが作成される）


### シンボリックリンクを作成

`my_links`ディレクトリの中に`hello.txt`へのシンボリックリンクを作成する。


《作成前の状態》
```
directory
├── my_links
│   └── // ここにシンボリックリンクを作成
├── target
│   └── hello.txt
```



シンボリックリンクを作成
```
$ cd my_links // 分かりやすいので移動
$ ln -s ../target/hello.txt link.txt // 作成コマンド
```

《作成後》
```
directory
├── my_links
│   └── link.txt -> ../target/hello.txt // できた！
├── target
│   └── hello.txt
```

### シンボリックリンクの削除
```
$ cd my_links
$ unlink link.txt // 削除コマンド
```

《削除後》
```
directory
├── my_links
│  
├── target
│   └── hello.txt
```

### 参考

https://www-creators.com/archives/5941
PowerShell上で実行するCLIアプリケーションでのエスケープ文字

# なんで気になった？

私はgoで作成していたCLIアプリケーションを時々微改修していたのですが、ふと思い立って、多数のファイルを逐次処理する箇所にプログレスバーを表示しようとしていました。コマンドライン上でプログレスバーを更新するとなった時、簡単かつ正攻法である方法といえば、既にプログレスバーが表示されている行で、キャリッジリターンで行頭に飛び、全て上書きするというものが挙げられると思います。
普段私はそのアプリケーションをPowerShell上で動かしており、それに対応できる、最悪それだけには対応していれば良いという方針で方法を探っていました。
その中で、 *PowerShellでは、キャリッジリターンは`` `r ``で表現する* という文を見つけました。PowerShell内で試してみたところ、実際そのようだと思わえました。

```powershell
Write-Host "ab`rc" # Output: cb
```

なので……

```go
func processFiles(fileNames []string) {
  fileNum := len(fileNames)// ファイル数は2000とかそのくらいです
  d := int(float64(fileNumber) / 100)
  for index, fileName := range fileNames {
    // ファイル処理
    if (index+1) % 100 == 0 {
      fmt.Print("`r") // PowerShell専用対応

      astCount := int((index+1) / 100)
      barCount := d - astCount
      fmt.Print(strings.Repeat("*", astCount))
      fmt.Print(strings.Repeat("-", barCount))
      fmt.Printf(
        "[%d/%d done.]",
        index + 1,
        fileNum
      )
    }
  }
}
```
　
　
```go
      fmt.Print("`r") // PowerShell専用対応
```
　
　
　
　
　
```go
      fmt.Print("`r") // 元凶
```
　
　
　
　
　

# どんどん伸びるプログレスバーになるはずだったもの

まあ、コンソールが中々のことになりました。

```
*--------[100/1000 done.]`r**--------[200/1000 done.]`r***-------[300/1000 done.]`r
...
```

実際はもっと酷かったです。

# 実際どうするべきだったか

一回頭がリセットされた後で、原因を探ろうと考えました。
とりあえず、まずは同じくCLIアプリケーションを作成でき、その中でも速やかに作成できる部類に入るJavaScriptで同様の現象が起こるか確かめてみました。

```test.js
console.log('ab`rc');
```

```powershell
# PowerShell

node test.js

# 宗派によってはこちらでも
deno run test.js

# Output: ab`rc
```

どうも、PowerShell上で実行だからといって、PowerShellで文字列を`echo` なり `Write-Host` した時とは状況が異なるようです。

そういうことなので、他の手段を試してみました。

```test.js
console.log('ab\rc');
```

```powershell
# PowerShell
deno run test.js # 私の宗派はこっちです

# Output: cb
```

一発目でビンゴ。
という訳でgoでもサクッとテスト用のコードを書いて実行してみました。

```test.go
package main

import (
	"fmt"
)

func main() {
	fmt.Println("ab\rc")
}

```

```powershell
# PowerShell
go run test.go

# Output: cb
```

やったぜ。

# おまけ

他のシェルで使えるキャリッジリターンの記法が使えるならば、他のものも試したくなってきます。

```test.js
console.log('\u001b[31mThis is red text.\u001b[0m');
// Outputは赤文字
```

```test.go
package main

import (
	"fmt"
)

func main() {
	fmt.Println("\u001b[31mThis is red text.\u001b[0m")
}

// Outputは赤文字
```

:+1:

# 最後に

PowerShellの `echo` なり `Write-Host` に`` `r ``を入れ込んだ時の挙動と、コンソールアプリケーションのコードで`` `r ``を標準出力させた時の挙動の差について、自分の中で納得する理屈が分からないのが現状です。
このあたりについて詳しい方がいらっしゃったら、コメントなどして頂けると有り難いです！

ここまで読んでくださり、ありがとうございます！
DjangoでのDTLの利用と画面遷移

○DTL(Django Template Language)
デザインを容易にするPythonのテンプレートエンジン。PythonをHTMLで利用するためのツール。
変数、リスト、辞書型をHTMLの中で表示できる。

#app/views.py
```
def home(request):
    my_name = 'Yamamoto Taro'
    favorite_fruits = ['Apple', 'Grape', 'Lemon']
    my_info = {
        'name': 'Taro',
        'age': '24'
    }
    
    return render(request, 'home.html', context={
        'my_name':my_name,
        'favorite_fruits':favorite_fruits,
        'my_info':my_info,
    })
```

#templates/home.html
```
<h1>Name: {{my_name}}</h1>
<h2>果物: {{favorite_fruits.2}}</h2>
<h3>Age: {{my_info.age}}</h3>
```
こうするとそれぞれの要素を表示することが出来る。

また、インスタンスも変数として呼び出しに利用することが出来る。

#app/views.py
```
class Country:
    def __init__(self, name, population, capital):
        self.name = name
        self.population = population
        self.capital = capital


def sample3(request):
    country = Country('Japan', 100000000, 'Tokyo')
    return render(request, 'sample3.html', context={
        'country': country,
    })
```
#templates/sample3.html
```
国名：{{country.name}} <br>
人口：{{country.population}}<br>
首都：{{country.capital}}
```


○DTLでの制御文
・{% %}:if、forなどの制御文
・{{}}:値をアウトプットする
・{# #]:コメント文

for文
{% for value in mylist %}
<p>{{value}}</p>
{% endfor %}

if文
{% if value in mylist %}
<p>somethimg</p>
{% elif 式 %}

{% else %}
<p>somesomething</p>
{% endif %}

#templates/home.html
```
{#<h1>Name: {{my_name}}</h1>#}
{#<h2>果物: {{favorite_fruits.2}}</h2>#}
{#<h3>Age: {{my_info.age}}</h3>#}


<ul>
  {% for fruit in favorite_fruits%}
      <li>{{fruit}}</li>
  {% endfor %}
</ul>

{% if 'grape' in favorite_fruits %}
 <p>Grapeあります</p>
{% elif 'lemon' in favorite_fruits %}
<p>Lemonあります</p>
{% else %}
<p>Not Found </p>
{% endif %}

{% if 'age' in my_info %}
<p> age in my info</p>
  {%if my_info.age < 20 %}
  <p>未成年</p>
  {% else%}
  <p>成人</p>
  {% endif %}
{% endif %}

{% if my_info.name == 'Taro' %}
 <p>Taro</p>
{% endif%}

{% if my_info.name != 'Taro' %}
 <p>not Taro</p>
{% endif%}
```

○Templateでの画面遷移
aタグのhrefの部分に{% url 'url' %}を入れ込むことで画面遷移が可能。

```
<a href="{% url 'template_app:home'%}" > home </a>
```
ここでのtemplate_appにあたる部分はappディレクトリ内のurls.pyに存在するapp_name = 'template_app'である。この部分に対応する値を入力する。そして、homeの部分はpath内のhomeである。
以下の画像は、app_nameの部分はtemplate_appではなく、appとなっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2971002/50265156-6e92-3840-ac51-40624a5f3561.png)

引数がある場合、

#templates/sample.html
```
<a href="{% url 'template_app:home' first_name='Hina' last_name='Kawata'%}" > home </a>
```

#TemplateApp/urls.py
```
path('home/<first_name>/<last_name>', views.home, name='home'),
```


#TemplateApp/views.py
```
def home(request, first_name, last_name):
    my_name = f'{first_name} {last_name}'
    favorite_fruits = ['Apple', 'Grape', 'Lemon']
    my_info = {
        'name': 'Taro',
        'age': '24'
    }
    status = 20

    return render(request, 'home.html', context={
        'my_name':my_name,
        'favorite_fruits':favorite_fruits,
        'my_info':my_info,
        'status': status,
    })
```
それぞれの引数に対して空白を開けて代入してやる必要がある。
gitアカウントをリポジトリ毎に変更する方法

先日GitHubへコミットした際、会社のGitLab用のアカウントでコミットしてしまい
GitHub上で本名を晒してしまったので同じ過ちを起こしてもすぐ修正できるようにメモ。

# 原因

globalの.gitconfigに登録されていたuserでcommitしてしまったのが原因でした。
globalには会社のGitLab用のアカウントが登録されていたのですが、
特に何の設定もせずにGitHubへcommitしちゃったので前述した本名でのコミットに繋がりました…

ちなみにglobalで設定してある内容は以下のコマンドか`~/.gitconfg`を開く事で確認が可能です

```tsx
git config --global -l
```

```tsx
...
user.name=グローバルの.gitconfigに登録してあるアカウント名
user.email=グローバルの.gitconfigに登録してあるメールアドレス
```

# 対応方法
## リポジトリ毎に.git/configを設定する

変更したい対象のリポジトリのディレクトリに移動して以下のコマンドを叩くと設定可能です

```tsx
git config --local user.name "変更したい対象のリポジトリで使いたいアカウント名"
git config --local user.email "変更したい対象のリポジトリで使いたいメールアドレス"
```

設定が変更されたかどうかは以下のコマンドで確認可能です

```
git config -l

...
[user]
user.name=先程設定変更したアカウント名
user.email=先程設定変更したメールアドレス
```

## 間違えたユーザー名を全部書き換える

これでコミット時にglobalのgitconfigに登録されているアカウント名が使われることはなくなりましたが、
すでに行ってしまったコミットのアカウントは自動で変更されません。
過去全てのコミットで名前とメールアドレスを変更したい場合、以下のコマンドで対応可能です

```
git filter-branch -f --env-filter \
  "GIT_AUTHOR_NAME='変更後のアカウント名'; \
   GIT_AUTHOR_EMAIL='変更後のメールアドレス'; \
   GIT_COMMITTER_NAME='変更後のアカウント名'; \
   GIT_COMMITTER_EMAIL='変更後のメールアドレス';" \
  HEAD
```


# 参考
[複数のgitアカウントを使い分ける](https://qiita.com/0084ken/items/f4a8b0fbff135a987fea)
[GitのCommitユーザを修正する方法](https://qiita.com/y10exxx/items/dcea0e39788d649ca8ba)
CSS関連のリンクをメモ

### React で CSS を触ることになったので参考になりそうなリンクを自分用にまとめ

- [CSS Grid Layout を極める！（基礎編）](https://qiita.com/kura07/items/e633b35e33e43240d363#%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%EF%BC%93---%E6%96%B9%E6%B3%95%EF%BD%82-%E3%82%A8%E3%83%AA%E3%82%A2%E3%81%AB%E5%90%8D%E5%89%8D%E3%82%92%E4%BB%98%E3%81%91%E3%81%A6%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B)
↑色々なサイトみた中で個人的に一番わかりやすかった記事

- [【CSS】プロパティチートシートTECH](https://korenarawakaru.com/tech/css/property-cheatsheet)

- [【JS】React の className の色々な書き方紹介](https://jsnotice.com/posts/2020-06-04/)

- [【JS】React の style の使い方、書き方いろいろ](https://jsnotice.com/posts/2020-07-13/)

- [URLからチートシートを入手可能](https://meganelog.site/cheat-sheet/#HTML_5)
jarで実行するSpringBoot(Java)アプリケーションで、resources配下のExcelファイルを扱う方法

#### 　jarに圧縮してデプロイするタイプのSpringBootアプリケーションで、resourcesフォルダ内のExcelファイルを使用したい
　以下のようにPathクラスを使用しても、jarに圧縮するアプリケーションでは取得できず、NoSuchFileExceptionが吐かれます。

```java:Pathクラスで取得するソース.java
    // resourceフォルダ内に存在するファイルのパスを変数:pathに代入　<--NoSuchFileExceptionがスローされる
    Path path = Paths.get("example/src/main/resources/Excel.xlsx");

    // パスのファイルを操作（Excelを操作するWorkbookクラスを使用）
    Workbook wb = WorkbookFactory.create(new File(path.toString()));
```

#### 　なぜ例外が発生するのか？
　Javaプロジェクト内に存在するresourceフォルダ内のリソースファイルは、jar化するとBOOT-INFフォルダ内に格納されるため、アプリケーションはそのパスを辿ってリソースファイルを取得します。
　そのため、src/main/resources～という風にパスを指定しても.jar内にはそのパスは存在しないため例外発生となります。（.jarの拡張子を.zipに変更すると何がjar内に圧縮されているのか見ることができます）

　BOOT-INF内に入っているファイルを取得する方法は何個かありそうですが、私は以下の方法を採用しました。

<br>

## 　解決方法：URLクラスとInputStreamクラスを使用する
#### 　実際のソースコード

```URLクラスとInputStreamクラスで取得するソース.java
    // ファイルURLからリソースファイルの情報を取得
    URL url = resourceLoader.getResource("classpath:" + "Excel.xlsx").getURL();

    // URLクラスのインスタンスでストリームを作成する
    InputStream fileStream = url.openStream();

    // ストリームを使用してWorkbookクラスのインスタンスを作成
    Workbook wb = WorkbookFactory.create(fileStream);
```

　以上の方法で、jarに圧縮したSpringBoot(Java)アプリケーション内でもExcelシートやその他の拡張子を持つファイルを扱えます。
Oracle Analytics Cloud：分析をはじめる。データセットに条件を設定する

はじめに
---
Oracle Analytics Cloud(OAC)で分析をして、分析の対象となるデータセットの表で検索条件（WHERE句）をセットしたいとなることがあります。
分析対象となる表のデータが数千万件や数億件あり、この年だけで絞ってデータを使いたいとなると、検索条件を指定することで絞り込みができます。
「分析用のデータをととのえる。データセットに表を追加する。」の記事で作成したデータセットで、SALES表に対して、検索条件（WHERE句）をセットする方法を紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/18421151-e14f-52ee-58ed-804164825642.png)



データセットを開く
---
対象となるデータセットを開きます
結合ダイアグラムが開きますので、条件をセットした表をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/b68ae7ea-c1aa-cf8a-e015-39d7a2281bac.png)

定義の編集をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/b25d000a-00db-9c4c-a23c-4d3e922a1353.png)

左上部、データセットのアイコンをクリックし、条件セットしたい項目をドラッグ、「ここにドロップしてフィルタを追加」を記載あるところにドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/9edb4494-901c-c38b-6e2c-eb642a45f699.png)

条件を入力します。
条件入力のダイアグラムの外でクリックすると、ダイアグラムが消えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/433a1f68-c68e-c475-41d1-c39c55645779.png)

条件の項目にマウスカーソルを合わせると、セットした条件値が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/4e92dff6-7e38-6643-9a20-d688e99b0bde.png)

OKをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/7fcda15b-b2c0-43c7-404f-98041d08c501.png)

保存し、変更を反映します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/c5acf854-c387-ce77-e4da-d04b402513dd.png)

以上で、データセットのSALES表に条件が設定されました。
おまえは今までショートカット以外でターミナルやVisual Studio Codeを開いた回数をおぼえているのか？

※この記事で紹介しているショートカットはMacの方向けの記事になります

# 経緯
使いたいフォルダがある際は、今までターミナルを開いて「cd (移動先のフォルダのパス)」と打ったり、Visual Studio Codeを立ち上げてからフォルダーを開くを選択したり、ウインドウ上にドラッグ&ドロップしていました。
ですが、タイトルみたいなことを言われた(おそらく幻想)ので、もっとスピーディに上記２種類のアプリをファインダーの特定のフォルダから開く方法を突き詰めたとある青年の冒険譚となります。

## エピソード1 ~最短距離を追い求めて~
使いたいアプリを開いてからそのアプリで使いたいフォルダを指定するというやり方に疲れと苛立ちを感じていたので、ここで思いついたのはアイコンの上にFinderから開きたいフォルダをドラッグ&ドロップ(DnD)して開くという方法です。これはとっても分かりやすくて楽ちんでした。
ただ、そのうち思うのです
*「このDnDのクリックしたままのストロークめんどくせえな」* と。
画面の端から端だと一度でターミナルやVSCodeのアプリアイコンの上まで持っていけないこともあります。
そこでさらに思いました。
*「2本指クリックした時のショートカットメニューで使えればいいんだ」* と。
そこでショートカットメニューに表示するための方法を探すわけです。
そこで使えるのがAutomaterです。
それまでAutomaterなんて何に使うんだ、と言うかどう使うんだ？と思っていたんですが、ここで大活躍です。
詳しいことは別の記事で詳しい人が紹介しているのでそちらを読んでみてください。
これでメニューバーまでの移動からより最短距離でターミナルやVSCodeが開けるようになりました。


参考記事：　
[macOSで右クリックメニューに「〇〇で開く」を追加](https://qiita.com/KickJune/items/d0b5230a5292490d88ad)
[Macの右クリックメニューでサービスに「○○で開く」を追加する方法](https://it-web-life.com/mac_open_application_context_menu/)




## エピソード2 ~ゼロ距離の先を夢見て~
ここで数ヶ月過ごしていたんですが、この十数ピクセルの移動すら数十回、いや、数百回繰り返しているうちに憎しみが生まれてきてしまうわけです。
自分のことではありますが、人間というものは本当にあくなきズボラな存在だなと思いました。そりゃDI◯様も「そんなことを覚えているのか？」と聞いてくるわけです。
ここでショートカットコマンドに辿り着きました。
```
システム環境設定 > キーボード > ショートカット
```
という項目があります。そのショートカットの項目にショートカットコマンドとして登録したターミナルで開く、VSCodeで開くというものがあります。
その項目に実はショートカットコマンドを割り当てすることができるようでした。
今回私は頻繁に使うこともあり、
**ターミナルを開く： ⌘⌥.**
**VS Codeを開く： ⌘⌥⇧.** 
として登録してみました。
それを割り当ててショートカットで開いた動画が以下の通りになります。

![output3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566867/8a73a02a-b92d-d20c-1dce-3928f1ab5761.gif)

<システム環境設定詳細画面>
![システム環境設定詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566867/cb97a649-f3bf-fa43-5926-88d00064dc1d.png)

みなさんも街中でDI◯様に言い放たれる前にやってやりましょう！！
Kotlin TestのParameterizedなTestを可読性/メンテナビリティ高く実装する方法

# 概要

ロジックや仕様をテストで守っていると開発がしやすいですよね。
リファクタが気軽にできるようになったり、デグレをテストが教えてくれたり、画面試験の前にエラーに気づけたり。

そんなテストを実践で使っているなか、可読性を大きく改善した取り組みがあったので紹介します。

結論を言うと Parameterized Test を使うのですが、最初から入っているものは可読性/メンテナビリティにストレスがあったので使いません！
とてもシンプルな関数を足すことで Parameterized Test 的なことを可読性/メンテナビリティ高く実現できましたので紹介します。

[JUnit 4](https://junit.org/junit4/) でも
[JUnit 5](https://junit.org/junit5/) でも使えます。


# Parameterized Test

テストの可読性をあげるなら Parameterized Test の思想は欠かせません。
Parameterized Test というのは複数のケースを1つにまとめて記載する方法で、差分だけを引数で渡す形でテストできるものです。
重複コードが減りますし、確認するコードが引数によってどういう変化を起こすのか直感的にわかるようにできます。

JUnit5 にはこれを行うための `@ParameterizedTest` という仕組みがありますが（JUnit4 でもモジュールを入れることで同等のことができるのですが）、ここではさらに見やすくするために行ったことをご紹介します。

# `@ParameterizedTest` の何が不満だったのか

たとえばこういうイメージ:
```kotlin:JUnit5 の ParameterizedTest
@ParameterizedTest
@ArgumentsSource(TestCase::class)
fun hoge(value: Int, expected: Int) {
    val actual = hoge.aaa(value)
    Assert.assertEquals(expected, actual)
}

private class TestCase : ArgumentsProvider {
    override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> = Stream.of(
            arguments(1, 101),
            arguments(2, 102),
    )
}
```

テストの記述とテストケースの記述が離れてしまうんですよね。
これがテストケースがたくさん並んでくると結構ストレスでした。


# 改善版

これを解決するために下記のクラスを作成しました。

```kotlin:ParameterizedTest を改善するために作った関数
abstract class TestBase {
    open setUp() {
    }
 
    fun <T> cases(
        vararg cases: T,
        block: (T) -> Unit
    ): List<DynamicTest> {
        return cases.map { case ->
            DynamicTest.dynamicTest("CASE = $case") {
                setUp()
                try {
                    block(case)
                } catch (e: Throwable) {
                    System.err.println("FAILED CASE = $case")
                    throw e
                } finally {
                    clearAllMocks()
                }
            }
        }
    }
}
```

このシンプルなクラスを作るだけで Parameterized Test が可読性高く書けるようになります。

```kotlin
// TestBase を継承して利用します。
// 注意: @Test の代わりに @TestFactory を使います

@TestFactory
fun hoge() = cases(
    1 to 101,
    2 to 102,
) { (value, expected) ->
    val actual = hoge.aaa(value)
    Assert.assertEquals(expected, actual)
}
```

エラーの場合は、どのケースでエラーが出たのかは冒頭で出力されるので特定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29899/c724b414-d96c-bac5-a09e-2c076c93e579.png)

簡単ですね！


# たくさんのデータを引数で渡したいなら

data class 作ればOKです。

```kotlin
@TestFactory
fun hoge() = cases(
    HogeData(1, 2, 3, 101),
    HogeData(4, 5, 6, 102),
) { c ->
    val actual = hoge.aaa(c.x, c.y, c.z)
    Assert.assertEquals(c.expected, actual)
}

data class HogeData(
    val x: Int,
    val y: Int,
    val z: Int,
    val expected: Int,
)
```

簡単ですよね！