OmniAICreator/Qiita-1.07M huggingface dataset:
EC2インスタンス起動テンプレートの作り方

## EC2インスタンス起動テンプレートの作り方

AWSのEC2インスタンスを手早く起動するためのテンプレートを作る。

### 起動テンプレートって何？

ざっくりEC2インスタンスのセッティングやスペックを保存したもの。AMIやインスタンスタイプ、ネットワーキング設定が含まれてるので注意。

### 実際にやってみる（Python3）

```python
import boto3


ec2 = boto3.client('ec2')

# 起動テンプレートの設定を指定
template_data = {
    'ImageId': 'ami-xxxxxxxxxxxxxxxxx',  # AMIのID
    'InstanceType': 't2.micro',           # インスタンスタイプ
    'Keyname': 'your-key-pair',           # キーペアの名前
    'SecurityGroupIds': ['sg-xxxxxxxx'],  # セキュリティグループのID
    'SubnetId': 'subnet-xxxxxxxx',        # サブネットのID
}

# 起動テンプレートを作成
response = ec2.create_launch_template(
    LaunchTemplateName='QiiraTemplate',
    VersionDescription='Initial version',
    LaunchTemplateData=template_data
)

# 作ったテンプレートのIDを取得
template_id = response['LaunchTemplate']['LaunchTemplateId']
print(f'起動テンプレートができたよ！ テンプレートID: {template_id}')

# 実際にEC2インスタンスを起動
print('EC2インスタンスを起動するには、以下のコマンドを実行:')
print(f'aws ec2 run-instances --launch-template LaunchTemplateName=QiiraTemplate,Version=Initial version')
```



Pythonスクリプトとしてローカル環境またはAWS CLIの用意が必要
【備忘録】開発未経験者がAzure open AIとエンハンス開発業務をした話

# 注意事項
本記事は「富士通株式会社 デジタルシステムプラットフォーム本部 Advent Calendar 2023」の20日目の記事です。
記事の掲載内容は私自身の見解であり、所属する組織を代表するものではありません（お約束）。

# はじめに
>アプリのエンハンス企画は少し経験があります。開発は未経験です。JavaとJavaScriptがイチゴとイチゴミルクぐらい違うことは知っています。ﾊｲ、ｽﾐﾏｾﾝ。

面接で迷言を残し後悔していた中、採用メールを受け取り晴れて私はエンジニアになりました。がしかし、現実では次から次へとよく分からないことが降ってくるのでアラ大変！
20日近い奮闘で一旦山場を乗り越えられたので、記事に残しておきます。

# Azure Open AI　studioとは

そんな生まれたての小鹿状態の私を救ってくれたのがAzure open AI serviceです。
早速自己紹介していただきましょう。
![画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570149/017e8e4d-716c-fb4e-2f09-6a5a2f106592.png)

OpenAI との違いは以下の通りです。

1.セキュリティ面
<dd>Azure open AI Serviceは入力情報がAIのトレーニングに利用されず、Microsoft Azureのセキュリティ機能を利用できます。入力内容がトレーニングに利用される可能性があるSaaS版のOpenAIよりも、高い機密性を確保できると言えます。</dd>

2.アクセスに申請が必要
<dd>AIの悪用や思わぬ損害を防ぐために、Azure openAI Serviceへのアクセスは制限されています。
Microsoft社との関係が構築されているパートナー企業や顧客が利用可能対象となっています。アクセスを希望する場合は社内での利用方法について、管理者に確認が必要です。</dd>

# 活用方法

1.エラー文の調査
<dd>例えば、現在のプロジェクトをビルドをするために、開発用のビルドコマンドを打ちます。

```diff_javascript
npm run dev
```
さてさて。。。。
![画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570149/a8f1caaf-89cc-ac08-de49-2d154bcc49c6.png)
※パスは編集で非表示にしています。
**ギャ！！！！！怖い！！！！（泣）**
もっと優し～く教えてほしいんですけど・・・

というシチュエーションではAIに聞くのがうってつけなのです。方法は簡単で、エラー文をコピーして、Azure open AIのチャットエリアにペーストするだけ。

![画像 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570149/e1fbba9f-cba8-62d9-275c-9167721e6749.png)

・・・ありがとうございます！！
なるほど、現在いるディレクトリが悪いということが分かりました。移動する方法まで教えてくれるんですね。
慣れてくると自分で解決できるようになるのですが、一番最初のなにがなんだか分からない期には大いに助けられました。</dd>


2.基本的な単語を質問する
<dd>個人的にはここが一番助けられました。例えば・・・

![画像 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570149/0db6fee0-69f7-f925-de0a-cf8ab6848bd9.png)
上司に聞くまでもない（もはや聞けない）ことも、AI相手ならなんでも、何回でも聞くことができます。ありがたいですね。

</dd>

3.コード生成
<dd>もちろん、コード生成もお手の物です。たとえば、ボタンを押した時の挙動を制御するhogehogeClick()メソッドの作り方を聞いてみます。

![画像 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570149/37a90034-4c4d-c3c9-c07f-534aa1a65ec2.png)
エンハンス開発なので、既存のコードと生成されたコードを確認しながらコーディングを進めていくことができます。※鵜吞みにするのは危険ですので、参考程度に確認するのが吉です。</dd>

## まとめ
こうしてなんとか開発業務を完了させることができました。

初心者でも開発がしやすい時代になったではないでしょうか。

開発は難しいですが、書けたときの達成感が気持ちいいですね。。

もちろん、知識や経験を増強していく必要がありますので引き続き精進します！

おしまい
laravel cashier hasDefaultPaymentMethod()は使わないほうがいいかも・・？

## 概要

laravel cashierの`hasDefaultPaymentMethod()`の仕様を調べていたところ若干不安になる仕様だったのでまとめる。

## メソッドの仕様

当該のメソッドは`vendor/laravel/cashier/src/Concerns/ManagesPaymentMethods.php`に定義されている。

```vendor/laravel/cashier/src/Concerns/ManagesPaymentMethods.php
/**
 * Determines if the customer currently has a default payment method.
 *
 * @return bool
 */
public function hasDefaultPaymentMethod()
{
    return (bool) $this->pm_type;
}
```

ようはpm_typeに値が入っていればtrue、入っていなければfalseが返るっぽい。

じゃあpm_typeの出処はどこなのかというとusersテーブルのpm_typeのカラムっぽい。
ただ、このカラムの値はどうやら「最終支払いの支払い方式を保存する」というものらしい。ようはSetup IntentなどでクレカIDと顧客を紐付ける処理を行ったときにpm_typeは特に更新されないっぽい。

このとき何が問題かというと、下記のようなケースで「true」になって欲しいのに「false」になる。

「Setup Intentを使ってクレカを登録した。支払い前にデフォルト支払い方法が設定されているか確認したくて`hasDefaultPaymentMethod()`を実行した。

`hasDefaultPaymentMethod`という名前が誤解を招いている気がする。

## 所感

`hasDefaultPaymentMethod()`ではなく`hasPaymentMethod()`を使ったほうがいいかも。

## 参考文献

https://readouble.com/laravel/10.x/ja/billing.html#check-for-a-payment-method
工学的な軌道力学が理学物理と大きく異なる点

Advent Calendarも残り1週間を切りました．
さてと，私が書く最後の記事になります．今回は，航空宇宙工学の軌道力学が理学物理と異なる点を少しだけ紹介しようと思います．

## 導入：万有引力の法則
下図に示す物体１・物体２について，万有引力の法則を用いて運動方程式を立ててみます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627337/3a006aad-d8f7-5e10-17c8-af3f42a3a7af.png)

```math
\begin{align}

\text{物体１：}\ &m_1 \frac{d^2 \mathbf{r}_1}{dt^2} = \frac{Gm_1 m_2}{|\mathbf{r}_2 -\mathbf{r}_1|^3} (\mathbf{r}_2 -\mathbf{r}_1)
 &\cdots \ \text{①}\\

\text{物体２：}\ &m_2 \frac{d^2 \mathbf{r}_2}{dt^2} = \frac{Gm_1 m_2}{|\mathbf{r}_1 -\mathbf{r}_2|^3} (\mathbf{r}_1 -\mathbf{r}_2)
 &\cdots \ \text{②}

\end{align}
```
ここで，②から①を引くことで，物体２の物体１に対する相対的な運動方程式を求めることが出来ます．
```math
\begin{align}

&\frac{d^2 \mathbf{r}}{dt^2} = -\frac{G(m_1 +m_2)}{r^3} \mathbf{r}
 &\left( \because \left\{ \text{②}/m_2 \right\} \ - \ \left\{ \text{①}/m_1 \right\} \right)

\end{align}
```

## 人工衛星工学の世界では
ここで，物体１が地球や太陽といった質量の大きい自然天体，物体２を人工衛星や探査機といった質量の小さい人工天体とします．このとき，
```math
m_1 \gg m_2
```
となります．よって，
```math
m_1 + m_2 \fallingdotseq m_1 = m_E
```
と近似することが出来ます．よって，前節で求めた物体２の物体１に対する相対的な運動方程式を書き直すと，
```math
\begin{align}

&\frac{d^2 \mathbf{r}}{dt^2} = -Gm_E \frac{\mathbf{r}}{r^3} = -\mu \frac{\mathbf{r}}{r^3}
&\cdots \ \text{③}

\end{align}
```
となります．ここで，
```math
\mu \mathrm{：}重力定数
```
となります．

航空宇宙工学における軌道力学では，以上の近似を用いることができる場合がほとんどです．従って，質量要素を考慮することは殆どありません．よって，例えば軌道力学における角運動量は，質量をかけずに，
```math
\mathbf{h} = \mathbf{r} \times \mathbf{v}
```
と表現します．

## さいごに
今回は，航空宇宙工学の軌道力学が理学物理と異なる点を少しだけ紹介しました．今まで３回，航空宇宙工学についてのテーマで記事を書いてきましたが，如何だったでしょうか？この機会に，航空宇宙工学に興味を持って頂けたら嬉しいです！

(注)記事の内容は私個人の見解であり，所属する学科組織またはサークルを代表するものではありません．
(注)**記事の内容を無断転載・複製する行為は禁じます．**
Quick Start: Dynamic Forms > Upgrade to Dynamic Forms


https://trailhead.salesforce.com/content/learn/projects/quick-start-dynamic-forms/upgrade-to-dynamic-forms


+ [In the More Information tab, we can’t find the ‘System Information’ section.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UsIi1SAF)


# 実際にやってみた

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

:::note alert
Be sure to upgrade the Lightning Record Page for the Account Object to use Dynamic Forms.
:::


何で？

有効化の設定を間違っていました。

:::note alert
Be sure to activate and Assign the Account record page as Org Default for forms factors desktop and phone.
:::
Next 13 + scss でインポートエイリアスを設定する

# はじめに
最近Next 13とscssを用いてWebアプリを作る機会があり、SCSSにエイリアスを設定をする際詰まったのでその方法を紹介します

# お悩み
```scss:variables.scss
$breakpoints: (
  'sm': 576px,
  'md': 768px,
  'lg': 992px,
  'xl': 1200px,
);

@mixin mq($size) {
  @media screen and (max-width: #{map-get($breakpoints, $size)}) {
    @content;
  }
}
```

```scss:sample.scss
@use '../../../../variables' as *;
```

`variables.scss` の`@mixin`を使いたい時、相対パスを使うのが煩わしい...


# 環境
```shell
npx create-next-app プロジェクト名
```
![スクリーンショット 2023-12-19 10.45.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2839531/5642c3d5-8bde-1917-cc6a-414c5474f613.png)

いろいろ聞かれますが、上記のように選択してください



# 本題

ここからインポートエイリアスについて説明していきます

まずはモジュールのインストールから〜

```shell
npm i -D sass
```

今回は`src/app/styles`配下にグローバルに当てたいscssファイルを追加していきます

```shell
.
├── src
│   └── app
│       ├── favicon.ico
│       ├── layout.tsx
│       ├── page.tsx
│       ├── style.module.scss
│       └── styles
│           └── variables.scss
└── tsconfig.json
```

エイリアスを設定するためには`tsconfig.json`に以下のように追記してください
```json:tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "bundler",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve",
    "incremental": true,
    "plugins": [
      {
        "name": "next"
      }
    ],
    "paths": {
      "@/*": ["./src/*"],
      "@variables": ["./src/app/styles/variables.scss"], // ここを追加
    }
  },
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
  "exclude": ["node_modules"]
}
```

実際に使いたい時は以下のようにします

```scss:sample.scss
@use '@variables' as *;

.wrapper {
  @include mq('md') {
    display: flex;
    justify-content: space-around;
    text-align: center;
    align-items: center;
  }
}
```
九九表 Python3編

https://paiza.jp/works/mondai/array_utilization_primer/array_utilization_primer__reduse_easy


これ自体は前回もやったけども

https://qiita.com/Atsulabo/items/4051922d6961bb954ad3

今回は配列を使うってことで
違う方法で。
もっとも答えは配列を使っていない前回と同じ方法だったが。。。

```py
A = [i for i in range(1,10)]
B = [i for i in range(1,10)]
for i in A:
    for j in B:
        if j >= 9:
            print(A[i-1] * B[j-1])
        else:
            print(A[i-1] * B[j-1],end=" ")

```
デザインシステムを作りたいなら、実はコンポーネントライブラリ「以外」を作った方が良いのではないか？

## この記事の概要

デザインシステムという概念は随分普及しました。

ただ、まだまだ「デザインシステムがあってこその価値ある開発」ができている組織は少ない気がします。

個人的に考える、価値を発揮しやすいデザインシステムの在り方を記事にしてみました。

## デザインシステムがあってこその価値とは？

:::note warn
あくまで筆者による定義であり、一般的なものではないと思います。
ご了承ください。
:::

デザインシステムの価値がちゃんと発揮できているのは「事業において、デザインシステムがあるからこその変化が起こせている」という場合だと思っています。

具体的な変化として、例をあげてみます。

- 新機能開発において複数案が出たが、デザイン原則に則り適切な選定ができた
- サポートの拡充において、統一されたユビキタス言語により、顧客の迷いが減った
- プロモーション戦略策定において、ルックとトーンオブボイスをもとに認知拡大の経路を考えた

逆に「便利なコンポーネントライブラリとして使っているけど、Material Design でも Chakra UI でも、トーンが合えばどれでも代替できる」ような場合、それはデザインシステムだからこその価値だとは言いづらいと思います。

こういった前置きの上で、より良く機能するデザインシステムの構成を考えてみます。

:::note warn
もちろんコンポーネントライブラリはコンポーネントライブラリで有用です。

ただ、デザインシステムとコンポーネントライブラリの立ち位置は違うので、はじめから「自分達に必要なのはどちらなのか」を意識する必要があると思います。

その上で、コンポーネントライブラリを求めるのであれば「（デザインシステムではなく）コンポーネントライブラリを作る」と宣言した方が効果的なはずです。
:::

## デザイントークン

実利的には、デザイントークンのセットを用意するとコストパフォーマンスが良いと思います。

色、文字、余白を整理して統一できれば、コンポーネント間に多少差異があったとて、意外と統一感ある印象は生み出せます。

デザイントークン単体でどうのこうのというより、足切り回避的な意味合いで有用です。
昨今ではあまりにも統一感のないサービスはそれだけで怪しいと思われることすらあるため、まずはトークンを整理するのが良いと思います。

はじめから重厚なものを用意する必要もなく、かなり軽めのものであっても結構役立ちます。

この記事では具体的なトークンの作り方には言及しませんが、最近読んだ中では[デザイントークンのつくりかた](https://putchom.square.site/product/how-to-create-design-tokens/1)という本が詳細で分かりやすかったのでおすすめします。

## トーンオブボイス[^1]

[^1]: ボイスアンドトーンと呼ばれることも多いみたいです。

使う語彙や、語尾の雰囲気、文章であれば漢字をひらくひらかないか、などを指します。

ユビキタス言語がちゃんと制定できていると尚堅牢になると思いますが、そうでなくてもある程度は決められると思います。

サービスに人格を感じやすくなるので「ウチのサービスがいつもの語り口調でこの施策を実施するか？違和感があるだろう」みたいな観点で考えられます。

もちろん大きな機能リリースのときと謝罪のときでは声のトーンは変わるでしょうから、常に一定にするのが正しいというわけではありません。
ただ、サービスがどういう人格として顧客に触れるか？を考えられるのは、デザインシステムがあるからこその意味と言いやすいです。

## デザイン原則

これが本命です。

とは言え、ときどき目にする「信頼感のある」とか「ユーザーに寄り添う」みたいな、どこにでも当てはまりそうな内容では効果が薄いです。
信頼されなくても良いサービスとか、ユーザーを無視しても大丈夫なサービスなんてこの世には存在しないはずだからです。

そうではなく、サービスの特性やポジショニングまで加味して、事業戦略や企画、要件を決めるときに役立つようなものを作る方が効果的です。

例えば「高齢の方や障害のある方も使える」が原則なのであれば、アクセシビリティの低い機能は企画会議の時点で弾かれるようになります。
逆に、対象を絞って「○○の人にだけ刺さる」であれば、対象の人以外が振り落とされるような施策はむしろ歓迎ということになります。

説明のためにやや極端な対比をしましたが、こういった原則が事業戦略や企画、要件定義時に機能すると「デザインシステムがあってこそ」と言えるはずです。

## 逆になぜ、コンポーネントライブラリの重要度を低く見ているのか

例えば、Bootstrap が今でも無名であり続けたら、コンポーネントライブラリ（的な役割）として Bootstrap だけでやっていける気がします。
しかし、Bootstrap は有名になりすぎたため「このサイト、なんだか Bootstrap っぽい見た目だ」なんて感想を持たれがちです。

別の例として、Material Design の場合も同じです。
MUI や Vuetify を採用すれば 1 からコンポーネントライブラリを作る必要はありません。
しかし「Material っぽすぎる」と捉えられることも多いです。

「デザインシステムを作りたい」という言葉が出る時点で、その裏には「独自性ある見た目を作りたい」という意図が多かれ少なかれ存在します。
そのため、Bootstrap や Material Design など、あまりにもよく見るものが却下され、オリジナルのコンポーネントライブラリを作られ始めるのだと思います。

この際、既存のライブラリの主たるデメリットは「よく見る見た目」であることです。

デザイン原則やトーンオブボイスは自プロダクトに固有であるべきで、代替が難しいです。
というかもし代替が容易なのであれば、一度考え直した方が良いまであります。

それと比べると、コンポーネントライブラリは（見た目の話に目を瞑れば）かなり代替可能性が高いです。
「コンポーネントライブラリを作らないのが正解」とまでは思いませんが、効果的なデザインシステムを作るために、どこに時間を割くべきか、固定観念を取り払ってみても良いと思います。

## まとめ

デザインシステムが必要になった際、コンポーネントライブラリよりもデザイン原則やトーンオブボイスなど、サービスの意思決定に関わるものを作った方が効果的かもしれない。

見た目の統一感を作りたい場合、重厚なコンポーネントライブラリまで行かずとも、デザイントークンの定義で十分な場合もありそう。
エンジニアはもっと他職種から学んでください

## ある日、非エンジニアの同僚から学んだこと

今年の5月に、Qiitaの中の人たちと直接会う機会がありました。
（ポッドキャストの収録）

初対面ということもあり、私はなかなか打ち解けられずにモジモジしていました。

しかし、私の同僚の[福太郎（本名）](https://twitter.com/fukutaro_yumemi)[^1]という男は、超ハイテンションで───

> 福太郎「初めましてギュン！」

───と挨拶し、とにかく相手を褒めて、場を温めてくれました。

そのおかげで、いい感じの雰囲気でポッドキャストの収録が進みました。

（しかも、なんとその日の福太郎は謎の頭痛でメチャクチャ体調が悪かったといいます。）

## コミュニケーション能力の大切さに気づいた

ちょっとした振る舞いの違いで、仕事の進み方がこんなに違うんだなぁ、と感じました。

なんというか「感情の因果応報」のようなものを見せつけられた気持ちになりました。

そして「自分も少しは見習わないとなぁ」と思いました。

でも、ワイのような陰キャがコミュ力を磨くと言っても、何をしていいか分かりません。

## そこでAIを活用

そこで、エンジニアの味方「ChatGPT」を使って、他職種の人のいい所を学んでみようと考えました。

どうせなら面白く学びたいので───

> ウエストランド風の「あるなしクイズ」形式で出力してもらおう！

───と考えました。

そして、ChatGPTに以下のプロンプトを入力しました。

> 「営業マンにあって、プログラマーにないもの」をセリフ形式で列挙してください。

（その他もろもろ、ウエストランドっぽくなるように調整しました）

さて、うまいこと他職種の人の良い所を学べるのでしょうか・・・！？

以下が、ChatGPTの出力結果です。

## 営業マンにあって、プログラマーにないもの①

![「日焼け跡！営業マンは外での活動で日焼けしてるけど、プログラマーはモニターの光しか浴びてない。真っ白すぎるだろ！」](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295452/23a70baf-1e47-9013-38e4-abb312b5f2c8.png)

### 偏見が強い

ウエストランド風になるように調整しすぎたせいか、私の心をえぐるようなセリフが出力されました。

### 学び

日光を浴びると、幸せホルモン「セロトニン」が出るらしいです。
私も外に出ようと思います。

## 営業マンにあって、プログラマーにないもの②
![プレゼンスキル！営業マンは顧客を引きつけるプレゼンができるのに、プログラマーはコードの説明すらまともにできない！そもそも無口すぎるんだよ！](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295452/c3437c95-d792-78e1-158b-a5ead85d3048.png)


### 無茶を言うな

プログラミングのコードは専門的だから、説明は難しいんじゃ・・・！

### 学び

でも確かに「良い仕事をすること」と同じくらい「それを相手に伝えること」も大事だと思います。
意識しようと思いました。

## 営業マンにあって、プログラマーにないもの③
![空気を読む力！営業マンは会話の中で微妙なニュアンスを察知するが、プログラマーが読むのはコードとエラーメッセージくらい！もっと空気も読めよ！](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295452/9c65660f-3263-68dd-b705-c22a1913a8eb.png)

### コードや技術書ばかり読んでいた

確かに、井口の言う通りかもしれません。

### 学び

コードやエラーメッセージだけでなく、感情の因果応報も読めるようになりたい。
そう思いました。

## 営業マンにあって、プログラマーにないもの④
![運動！営業マンは常に動き回ってるけど、プログラマーはずっと座ってる。あいつらみんな痔なんだから！](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295452/6a4644aa-1c04-e4fe-3608-964cc68e422b.png)

### みんな痔ではない

私がそうなるように指示したというのもありますが、それにしてもAIってこんなに偏見まみれの意見を生成できるんですね・・・！

### 学び

適度な運動も、幸せホルモン「セロトニン」の分泌を促すそうです。
取り入れようと思いました。

## 営業マンにあって、プログラマーにないもの⑤
![建設的なSNS利用！営業マンはSNSをビジネス拡大に利用しているけど、プログラマーはSNSでただ人と揉めてばっかじゃねぇか！もっと自分自身と戦えよ！](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295452/8defa168-af12-d251-6385-07afebebd9a7.png)

### 確かに

> 「もっと自分自身と戦えよ！」

その通りだと思いました。

### 学び

でもまぁ、衣食住が確保されている状況で、スマホやPCを持っていて、SNSで揉めていられる・・・それは平和な証拠ですからね！
今のままでヨシ！

## 営業マンにあって、プログラマーにないもの⑥
![表情の豊かさ！営業マンは感情を表情に出すけど、プログラマーは無表情。あいつら、感情のないロボットなんだよ！!](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295452/d32080c1-f20b-a4cb-40ac-f53a599d58ea.png)


### 言い過ぎ

感情のないロボットではないだろ。

### 学び

「感謝の気持ちを表現する」とか、そう言う行動は、愛情ホルモン「オキシトシン」の分泌を促すそうです。
私もどちらかというと無表情な方なので、気をつけようと思いました。

## 営業マンにあって、プログラマーにないもの⑦
![健康的な食生活！営業マンは健康に気を使ってるが、プログラマーは夜更かし・エナドリ・ジャンクフード！来年くらいに死ぬぞ！
](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295452/7d0cd976-a551-01cc-4e68-93589c2f524b.png)

### 営業マンだって不健康だろ

あいつらだって、飲み会ばっかしてて不健康だろ！

### 学び

健康的な食生活も、幸福ホルモン「セロトニン」の分泌を促すらしいです。
野菜とか食べようって思いました。

## まとめ

なんか、AIのオススメしてくることを習慣化したら凄く脳が健康になりそう

## 宣伝

プログラミングの記事も書いてるから読んでね。

- [8歳娘「パパ、関数を合成して？」](https://qiita.com/Yametaro/items/18e533945e44283eefc8)

[^1]: 福太郎さんは営業マンではなく広報の人です
NEXT.jsでUncaught SyntaxError: Identifier 'Audio' has already been declared

# はじめに
Udemyで「【AIチャットアプリ開発】Next.js & Firebase & ChatGPT APIを使ったWebアプリ開発講座」の講座を受け、最後Firebaseにデプロイするとことで、
デプロイはできたが、開発環境ではでなかったエラーが出て対応に時間がかかったので備忘として残します。

結論から先にいうと、build時にwarningが出ていてそのwarinigを直してデプロイしなおしたらうまくいきました


# 問題
（解決までの流れをつらつら書きます。）

コンソールにこんなエラーが出た
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037238/e7fe4ed1-60c0-6a97-ede7-116b97c2acc6.png)
４つほど出て１つづつ調べた。

### １つめのエラー
```jsx
Uncaught SyntaxError: Identifier 'Audio' has already been declared
```


「Audio」なんて変数使ってないぞと。
https://qiita.com/TRyota/items/d5a7a39da551612dbfd9
Scriptを二度呼ぶとそのようなエラーが起きると記述がある。
しかしそのような記述自分のコードでは見当たらない。

https://github.com/vercel/next.js/discussions/35678

### 2つ目のエラー

```jsx
Uncaught Error: Minified React error #423;
visit https://reactjs.org/docs/error-decoder.html?invariant=423 
for the full message or use the non-minified dev environment 
for full errors and additional helpful warnings.
```

```jsx
キャッチされないエラー: 縮小された React エラー #423;
完全なメッセージについては https://reactjs.org/docs/error-decoder.html?invariant=423 
にアクセスしてください。
完全なエラーと追加の役立つ警告については、縮小されていない開発環境を使用してください。
```

リンクのドキュメントを見に行って本当のエラーをみる

https://legacy.reactjs.org/docs/error-decoder.html/?invariant=423

```jsx
There was an error while hydrating. Because the error happened outside of a Suspense boundary, the entire root will switch to client rendering.
```

```jsx
水分補給中にエラーが発生しました。エラーはサスペンス境界の外側で発生したため、ルート全体がクライアント レンダリングに切り替わります。
```

何を言ってるんだ？水分補給？水必要なの？笑

エラー内容でググったら　HTMLタグの忘れでエラーになるという記事を発見
で、ちょっと違うかなと思ったものの、page.tsx、Layout.tsxを調べたがちゃんと`<HTML><body>`タグの記載がある

[App Routerの落とし穴 HTMLタグ忘れる編 [Next.js]](https://zenn.dev/temasaguru/articles/546f0fcdd9d131)


Udemyの完成形のソースコードと比較しても差が見当たらない。
とほほ

# 解決方法
ここまで調べても見つからないのかとあきらめて

**build時のログ**を眺めていたら、warningが出ていたことを発見。

warningなので気にしていなかったが、この警告を修正し、useEffectの依存配列を修正したら、うまくデプロイでき、エラーも消えた。

```jsx
./src/app/components/Sidebar.tsx
61:6  Warning: React Hook useEffect has a missing dependency: 'user'. Either include it or remove the dependency array.  react-hooks/exhaustive-deps

./src/context/AppContext.tsx
68:6  Warning: React Hook useEffect has a missing dependency: 'router'. Either include it or remove the dependency array.  react-hooks/exhaustive-deps
```

# おわりに
build時の警告は気にしないとだめ。

# 参考
https://www.udemy.com/course/chatgpt-api-chatapplication-webapp/
Next.jsでImageタグを使うとWidthとHeightが必須になるのをどうにかしたい

# はじめに

個人開発でもNextを利用しているのですが、長年悩んできたことをチームの詳しい方に聞いたところ初めて知ったことがあったのでまとめます

# 問題

```ts
                <img
                  alt=""
                  src="/static/images/thank.png"
                />
```

これを`<Image>`に置き換えようとしたところ`Width`と`Height`のプロパティが必須なのでいれてくださいと怒られてしまいました

```ts
                <Image
                  alt=""
                  src="/static/images/thank.png"
                />
```

ここでWidthとHeightに数字をいれるとマジックナンバーになるのでどうすればよいかと悩みました

# 解決方法

すべてはドキュメントに書いてありました

```ts
import Image from 'next/image'
import profilePic from '../public/me.png'
 
export default function Page() {
  return (
    <Image
      src={profilePic}
      alt="Picture of the author"
      // width={500} automatically provided
      // height={500} automatically provided
      // blurDataURL="data:..." automatically provided
      // placeholder="blur" // Optional blur-up while loading
    />
  )
}
```

このように静的にパスを指定するのではなくダイナミックインポートすれば高さも幅も不要で、なおかつ画像が表示されるまではサスペンスのような小さい画像の表示をしてくれるようです

# おわりに

やはりドキュメントをしっかり読むことが大切だなと気づきました

# 参考

https://nextjs.org/docs/pages/building-your-application/optimizing/images#local-images
（初学者向け）同期処理と非同期処理の違いついて簡単なまとめ

## 同期処理と非同期処理の違い

**同期処理**ってのは、一つの仕事が終わるまで、ほかの仕事が待たなきゃいけないやつ。例えば、以下のJavaScriptコードを見てみる。

```javascript
function 同期処理() {
  console.log("タスク1");
  console.log("タスク2");
  console.log("タスク3");
}

同期処理();
```

**非同期処理**はもうちょっとフリータイムがあって、待たなくてもいい感じ。JavaScriptでこんな感じに書ける。

```javascript
function 非同期処理() {
  console.log("タスク1");

  setTimeout(function() {
    console.log("タスク2（非同期）");
  }, 1000);

  console.log("タスク3");
}

非同期処理();
```

### いいところと悪いところ

**同期処理**はシンプルでわかりやすいけど、タスクが長いと待ち時間ができちゃう。

**非同期処理**はパフォーマンスが上がるし、待ち時間が発生しない。でも、ちょっとデバッグが難しいってのがあるから初学者は気をつけて。
指定要素の挿入・削除 Python3編

https://paiza.jp/works/mondai/array_utilization_primer/array_utilization_primer__insert

前にもやった内容の問題なのだが、
insertとpopとでちょっと違いがあるので注意
追加する要素番号と、削除する要素番号とでちょっと違いがある


```py
N = int(input())
A = [int(input()) for _ in range(N)]
n,B = map(int,input().split())
A.insert(n,B)
print(*A,sep='\n')

```

https://paiza.jp/works/mondai/array_utilization_primer/array_utilization_primer__delete

```py
N = int(input())
A = [int(input()) for _ in range(N)]
n = int(input())
A.pop(n-1)
print(*A,sep='\n')

```
[Ubuntu]ユーザを追加して、sudo権限を付与する方法等

## 要　旨
Ubuntuにおいてユーザを追加して、sudo権限を付与する方法等について記述します。
## 実施要領等
新規ユーザの追加
```python3
sudo adduser USER1
```
ユーザにsudo権限を付与する。
```python3
sudo gpasswd -a USER1 sudo
```
ユーザの一覧を確認する
```python3
cat /etc/passwd
```
または
```python3
getent passwd
```
不要なユーザを削除する
```python3
sudo userdel -r USER2
```
グループと所属ユーザの一覧を表示する。
```python3
cat /etc/group
```
または
```python3
getent group
```
ユーザが「所属するグループを確認する。
```python3
groups USER1
```
ユーザをあるグループに追加する。
```python3
sudo gpasswd -a USER3 NAME_OF_GROUP
```
## 結 言
今回は、Ubuntuにおいてユーザを追加して、sudo権限を付与する方法等について記述しました。
クロスサイトスクリプティングについて（XSS）

## XSSって何？

XSS攻撃は、ウェブサイトが抱えるセキュリティの甘さを突いた攻撃手法。攻撃者が悪質なスクリプトを仕込んで、他のユーザーがそれを見るときに実行される。

### もしXSSが成功したらどうなる

XSS攻撃が成功すると、ユーザーセッションが盗まれたり、個人情報が流出したりする。

### 具体的にどうやって攻撃する

攻撃者は、ウェブアプリケーションの入力フィールド（フォームやコメント欄）に悪質なスクリプトを仕込んでXSSを仕掛ける。これによって、他のユーザーがそのコンテンツを見ると、スクリプトが実行されてしまう。

### 実際の攻撃例

例えば、攻撃者がこんなスクリプトを仕込んでみる。

```html
<script>alert("XSS攻撃");</script>
```

これが表示されるページにアクセスしたユーザーは、「XSS攻撃」というアラートを見てしまうことになる。

### どうやって守るか

1. **入力データのエスケープ**
   - ユーザーからの入力データを表示する前に、エスケープ処理をしてスクリプトが実行されないようにする。

   ```html
   <?php echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8'); ?>
   ```

2. **Content Security Policy（CSP）の導入**
   - サイト内で実行を許可するスクリプトやリソースを指定するCSPを導入して、XSS攻撃を防ぐ

   ```html
   <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://trusted-scripts.com">
   ```

XSS対策は意外と超重要だから、意識しないとですね。
QAテスターの研修に関わってみて

# はじめに
はじめまして、記事を開いていただきありがとうございます！
今回、遠隔地で採用されたQAテスターの研修を行う側になり、色々思うことや反省があったので、記事を書こうと思いました！
初めて書くので、拙い箇所しかないと思いますがよろしくお願いします。

# 経緯
QAテスター研修では、実際に面と向かって会う回数は少なく、ほぼオンラインの研修を実施しました。
そのため、チャット上やオンライン会議をメインとして研修を行い、実際にQAテスターとして稼働するまでの期間中で主に関わっています。

今回は研修を通して自身で工夫したことや、反省点を書いてみました。

# 研修中に実施したもの
**研修の流れ**
今回の研修では、共通の基礎研修を事前に行い、その後過去に使用したテストケースに沿った追い検証を実施しました。

テストケースは一部変更をして不具合が発生している状態を意図的に作り、実際に「不具合を検知する」体験を行えるようにし、追い検証はOJT形式で研修を行いました。

# OJT時に実施したアプローチ
①OJT実施時の流れ

OJT実施時には下記を意識して実施しました。
・OJT実施前に注意事項やNG行為の共有を行い、実施中にトラブルが発生しないようにした
・事前に解消可能な疑問点は共有し、検証中に「わからないまま検証を進める」が発生しないようにした
・検証中に不明点があった際、都度連絡をしていただき、その都度解消を行えるようにした

②質疑シートの作成
質問や疑問点があった際、各自チャットで連携を行っていたのとは別に、質疑シートを作成してナレッジ共有の場としても使用できるようにしました。
実際に会う機会が多いと、些細な事でもすぐに聞けると思いますが、チャット上で行うのは報告が多くなると思い作成した面もあります。


# 研修を実施した振り返り

OJTメインで進行していったので、研修期間中は多くの質疑があり、その都度解消してく流れになっている状態でした。
実施したアプローチの結果としては下記になります。

①検証手順の共有(OJT)
実施してみると、事前説明後に質疑を聞いても「実際にやってみないとわからない」となる事が多く、検証している間に出た疑問を解消していく流れが一番多かったです。

実施してみた振り返りとしては、研修を行う側からすると「不明点があったら質問して欲しい」と思うことが人によってはあると思いますが、実際は研修を受ける側からすると「不明点であることがわからない」ことが多くあると感じました。
(追い検証時の細かい手順など、類似検証を複数回行った際に手順の質問が来たので、痛感しました)

早い段階から研修を行う側と受けている側で「今どの段階まで理解して検証を行っているか」のすり合わせは大切だと感じ、mtg等を行っていましたが、質問が来るまで把握できないこともあったので、次回実施することがあった際には意識して、今回の反省を活かしていきたいと考えています。


②質疑シートの作成
作成後すぐは使用されていましたが、追い検証を実施してからは手順や共有事項のナレッジ共有シートとなっており、想定していた意図とは少し異なった使い方になっていました。


# 今後の展望
・「不明点であることがわからない」箇所を研修時から減らしていく
実施していると「そもそも何を質問していいかわからない」と言った意見があったため、具体的な質問例(仕様と実機での相違や、指示されている細かい手順など)を共有し、「この箇所は質問して欲しい」箇所を研修時に設けることで、解消していきたいと考えています。
→経験に伴って質問の数や質は上がってくるので、早い段階でそのレベルに持っていけるようなアプローチが必要だと考えています。

・「実際にやってみないとわからない」箇所を事前に共有し、手順を理解したうえで研修を行う。
今回の研修で実際に発生した箇所をもとに、事前に共有する事で、検証時に予想される質問を事前に解消する
→しかし、アプローチの仕方次第で質疑の場を減らしてしまう可能性があると考えているため、検討していこうと思います。

# さいごに
リモートメインの研修を行いましたが、実際に想定していたよりも連携面で支障が出ていたかな…と感じています。
ナレッジ共有の面で自分からアプローチを行ったり、不明点の解消には向き合ったものの、実際に研修を受けている側からの意見や事象共有がないと難しいと思った点も複数あったため、アプローチの方法は改善の余地がありだなと考えました。

この記事が何かのお役に立てれば幸いです。
ここまで読んでいただき、ありがとうございました！
Evernoteを無料でもう少しだけ使う方法

# 要約
Evernoteの無料ユーザは50個までしかノートを作成できなくなったが、Web Clipper経由ならその制限はない。
（2023年12月20日現在）

# Evernoteとは
Evernoteはわりと古くからあるメモ系のサービスです。
私の場合は開発時に詰まった箇所を解決した際、解決に役立ったWebサイトを[Chrome拡張のWeb Clipper](https://chromewebstore.google.com/detail/evernote-web-clipper/pioclpoplcdbaefihamjohnefbikjilc?hl=ja)でテキストごと保存していく形で、スクラップブックのように使っています。
テキストで保存することでEvernote内で検索できるので、前に詰まった箇所にもう1度詰まってもすぐに解決できるわけです。
（同じ箇所に詰まることが前提なので威張って言うことじゃないですね）

# プラン改定で移行を考える
ですが、2023年12月4日に無料ユーザのプランが変更されました。

https://evernote.com/ja-jp/blog/evernote-free-note-limits

> 　Evernoteは、12月4日に新規・既存の無料ユーザーで利用できる範囲を改定する。今後は、アカウントごとに最大で50のノート、1つのノートブック（複数のノートをまとめるもの）まで利用できるようになる。

無料ユーザは50個までしか記事を作成させないよ、ということです。
私の用途はスクラップブックなので50個だとどう考えても足りません。

私物アカウントで有料登録（年額9,300円）もしているのですが、プロファイルとして完全には分けられないので仕事用に流用しにくく、
かといって別途で仕事用のアカウントも有料登録できるほど裕福ではないので、他のサービスに移行しようと調べていました。

# 移行→断念
まずは以下のサービスに移行を試みましたが、どうも合いませんでした。
- OneNote -> HTML形式で簡単に移行できる。しかし、開発記事を保存するためのブラウザ拡張機能がイマイチで、振り返りには向かなそうで断念。
- Notes（Appleの純正メモアプリ）->ENEX形式で記事の画像ごと移行できるのは良いが、iCloud経由の同期に制限があるようで、1300超の記事の同期が終わらず断念。

# Web Clipper !
次はNotionやesaみたいなので移行を調べてみようかと思っていたのですが、
Chrome拡張のWeb Clipperを使うと今（2023/12/20現在）も記事が普通に保存できていることに気づきました。

Evernote上で新規ノートはやはり作れないので、無料ユーザの制限は更新されているようです。
バグかお目溢しかわかりませんが、私の使い方だとWeb Clipperが使えるうちはEvernoteを無料で継続して使えそうです。
Tableauの基礎学習と資格対策「これだけやっとけ」集

## 概要
- Tableau歴↓の私が今考える、オススメの学習方法まとめてみた
    - 実務経験約4年
    - DATA Saber認定済
    - Tableau Desktop Specialist資格保有
    - Tableau Certified Data Analyst資格保有

## ― 基礎学習編 ―
### ◆ Udemyの [データサイエンティストを目指す人のための『ゼロからの Tableau 入門』](https://www.udemy.com/course/tableau-x/)を受講する
- 迷ったらとりあえずこれを！！
- 個人的には**本よりも動画のほうが理解しやすい**と思う
    - 数ある動画の中でも私はこの講座が好き
        - 説明が丁寧でわかりやすい
        - Tableauの基礎から体系的に学べる
            - 基礎から始まって、最終的には中級レベルぐらいの内容もやってくれる
            - 演習問題もある
        - 内容がボリューミーでお得感がある
            - セールを狙って買うと良き
　
### ◆ [DATA Saber](https://datasaber.world/)に挑戦する
-  DATA SaberはTableauのユーザーコミュニティによる無償の学習プログラム
    -  DATA Saberの先輩に弟子入りし<br>**90日間で 約100問の問題と実践課題と試験をクリアする必要がある**
    -  Tableauのスキルだけでなく"データドリブン文化を伝え広める力"が求められる
-  より実践に近い形でTableauを学びたい方、短期集中で学べる/学びたい方向け
    -  私は90日間で125時間使いました
-  **他のTableauユーザーとの繋がり（コミュニティ）を得られる**のが一番のメリット！！

:::note info
**理想は『上記Udemy講座を受ける→DATA Saberにチャレンジ』の流れ**
（講座で体系的に学んで、DATA Saberで実践経験とコミュニティを得る）
:::
　
## ― 公式資格受験編 ―
### ◆［Specialist］Udemyの [はじめてのTableauデータ分析(入門・初級)～2時間でTableau Desktop Specialist資格対策～](https://www.udemy.com/course/tableautableau-desktop-specialist/) を受講する
- Tableau Desktop Specialist試験対策にはコレ！
- **Specialistの試験内容ほぼそのまま**、という驚きの精度の講座
     - おかげで試験中ずっと「これ、進●ゼミでやったとこだ！！！」状態
    - おかげで超高得点で合格できました（1000点満点中986点）
- ちなみに、Specialist試験を初手の基礎学習教材として使うのはあまりおすすめしません
    - 主にTableau用語/機能の理解を問われるので、実践に活かしづらいかと

### ◆ ［Analyst］[過去の合格者のブログ](https://note.com/tableau_kun/n/n29c69d44f861)に記載されている問題を解く
- Tableau Certified Data Analyst試験対策にはコレ！
-  **過去の合格者のブログに書いてある覚書きの問題をひたすら探して解けば十分**だと思う
    - 私はネットで買った模擬問題をひたすらやっていったけどほぼ出なかった><
    - 受験後に過去の合格者の皆さんのブログの内容を読んで<br>逆･進●ゼミ状態（あれもこれも試験に出てたヤーン！）となった
- 試験自体は Vizを使った実務寄りな内容なので、**実力チェックに良いと思う**！
    - 「Tableauの基本操作は頭でイメージできる + 便利Tipsとかもちょっと知ってる + Prepやデータソースも触ったことがある」人が合格できそう
<details><summary>わたしが受けたときの問題の覚書きはこちら↓<font color="gray">（クリックで開く）</font></summary><div>

> 箱ひげ図の読み取り
平均線のラベルのカスタム方法
画像のエクスポート方法
メニューバーのワークシートからエクスポートできる拡張子
移動平均のカスタム
分布バンドとリファレンスバンドの違い
フィールドの分割
別々の凡例の使用
データソースフィルターの設定
SQL文の穴埋め
上位Nのセット作成
結合セット作成
パラメーターを使ったCASE文の作成
パラメータを使ったセットの作成
ダッシュボードのレイアウト変更
ダッシュボードの表示/非表示の設定
フィルタアクションの設定
パラメータアクションの設定
階層（ドリルダウン）の作成
差の割合を表す計算式
ラベルの色をマークに合わせる
日付の連続/不連続の表示の違い
密度グラフ
データの結合の順序
ブレンドの結合方法
ユニオン
Desktop→Serverへのワークブックパブリッシュ
Prepの操作手順
DATEPARTとDATEPARSEとDATENAMEの違い
RANKとRANK_DENSEの違い
ZN関数
TOTAL関数
INDEX関数
</div></details>


## ― 余談 ―
### SpecialistとAnalystとDATA Saberの比較
| 　 | 内容 | 特徴 | ひとこと |
|:-:|:-|:-|:-|
| Desktop Specialist  |  機能や用語への理解度を問われる | 知識問題オンリー |実務に紐づく内容とは言いづらいが、永久資格なのがイイネ |
|  Data Analyst | データソース構築～Viz作成の<br>知識を問われる | Prepの知識も必要 | 力試しには良さそう<br>ただ受験料高い＆有効期限2年なのが残念ポイント |
| DATA Saber  | Viz作成の演習ができる<br>データ集計時の心構えを学べる | コミュニティが強い（他社ユーザーと繋がりやすくなる）、認定資格で名刺にも書けるが非公式  | 無料で満遍なく学べるのが魅力的、実践にも活かしやすい |
- Data Analystの易しい知識問題を集めたのがSpecialist、みたいなイメージ
- Data Analystの演習問題はDATA Saberの問題と同じレベルか少し易しいぐらい？
- DATA SaberはSpecialistとAnalystのいいとこどりな感じ
    - イメージ図<br><img width="250" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618352/28141863-0cb9-389b-13fb-f82e4e08378b.png">

<font color="E83929">**※※※以上全て個人の感想です※※※**</font>

----------------------------------------------------------
暗黒Lambda

## まあ失敗してるんですけど
よくないことはできないね。


## オンラインでプログラム書けるところじゃん
ここにソース流して実行した結果取れたらLambdaみたいな使い方できないかなとおもった

## 動きを見てみるか
ブラウザのデベロッパーツールで実行時のリクエスト見てみた。
### Httpの中身
#### リクエスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175961/53e6ecd6-7027-bdb2-7b54-39a04a891bda.png)
#### レスポンス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175961/78e127df-d89f-02f6-2c7b-199fdc663efd.png)

requestのbodyでプログラムを文字列で渡しててresponseのstdoutに結果が変えてくるわけね

## じゃあpythonで再現書いてみるか

```python:lambda
import requests
import json
param = '{"project":{"source_files":[{"filename":"Main.py","body":"import requests\nimport json\nr = requests.get(f\"http://www.google.co.jp")\nprint(r.text)\n","position":0}],"language":"python3","share":"private","network":true,"output_type":null},"run":true,"save":true}'
r = requests.post("https://paiza.io/api/projects.json", json = param)
j = json.loads(r.text)
print(j)

```

## 結果
```
{'status': '400', 'error': 'Bad Request'}
```
そりゃそうだ

## 結論
清く生きる
条件分岐が可能な診断機能

## はじめに
当記事は、Ruby on Railsにおいて**分岐が発生する診断機能**を実装したい方へ向けたものです。
[この記事](https://qiita.com/nakamura9atsuya20/items/f6a967c2854f769fc6d4)でも診断機能は実装することが可能ですが、どんな選択肢を選んでも同じ質問を回答することで結果が出る仕組みのため、「1問目で選ぶ選択肢によって、2問目の質問を変えたい...」という場合、活用することが難しくなってしまいます。
主に以上の悩みを抱えている人に向けて、役に立てれば幸いです。

## 実装に使う知識、及び筆者が伝えたいこと
**使う知識は「MVCの基本」**。これだけです。新規ページを作り、遷移を活用して作っていくイメージです。きちんとMVCが理解できていれば、不可解な点はなく実装できると思います。
ここで筆者が伝えたいことは、**基礎的な知識でも、使い方によっては大きなインパクトを発揮できることがプログラミングの面白さだ**ということです。
あくまで個人の感想ですが、難しいことを身に着けることに執着してしまう傾向があるなら、今ある知識を活用する路線で考えてみても面白いかもしれません。
前置きが長くなりましたが、実装していきましょう！

### 1.全体像を見てみる
ページ遷移を多用するため、以下の画像のような遷移をするイメージを持っておくとわかりやすくなるかと思います。
また、この実装においてモデルの設計をほとんど使用しないため、既存のコントローラーにアクションを加えていく形でも問題ないはずです。
しかし、ページ数が多くなることが予想されるので、あえて新規作成するのもいいかもしれますん。
![スクリーンショット (1066).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635959/5ec9011b-ec01-af31-2fb6-46d657e1cabe.png)


### 2.Routing設計
```ruby:route.rb

#省略
    get 'perfumes/question1' => 'perfumes#question1'
    get 'perfumes/question2' => 'perfumes#question2'
    get 'perfumes/question3' => 'perfumes#question3'
    get 'perfumes/question4' => 'perfumes#question4'
    get 'perfumes/show1' => 'perfumes#show1'
    get 'perfumes/show2' => 'perfumes#show2'
    get 'perfumes/show3' => 'perfumes#show3'
    get 'perfumes/show4' => 'perfumes#show4'
    get 'perfumes/show5' => 'perfumes#show5'
    get 'perfumes/show6' => 'perfumes#show6'
#省略

```
### 3.Controller設計
```ruby:perfumes_controller.rb

#省略
    def question1
    end
    
    def question2
    end
    
    def question3
    end
    
    def question4
    end
    
    def show1
    end
    
    def show2
    end
    
    def show3
    end
    
    def show4
    end
    
    def show5
    end
    
    def show6
    end
#省略

```

### 4.view設計
```ruby:perfumes/index.html.erb

<h1>診断機能 スタートページ</h1>

<%= link_to "診断する！", perfumes_question1_path %>

```
```ruby:perfumes/question1.html.erb

<h1>第1問</h1>

<%= link_to "山派", perfumes_question2_path %>
<%= link_to "海派", perfumes_question3_path %>
<%= link_to "空派", perfumes_question4_path %>

```
```ruby:perfumes/question2.html.erb

<h1>第2問 (パターン1)</h1>
<p>山にロマンを感じた瞬間を教えてください。</p>

<%= link_to "富士山にロマンを感じた", perfumes_show1_path %>
<%= link_to "険しい山道にロマンを感じた", perfumes_show2_path %>

```
```ruby:perfumes/question3.html.erb

<h1>第2問 (パターン2)</h1>
<p>海は人間にとってどんな存在だと思うか教えてください。</p>

<%= link_to "時々人に牙をむくが、その荒々しさがかっこいい存在", perfumes_show3_path %>
<%= link_to "心を落ち着かせてくれる壮大な存在", perfumes_show4_path %>

```
```ruby:perfumes/question4.html.erb

<h1>第2問 (パターン2)</h1>
<p>空を飛べるなら何をしたいか教えてください。</p>

<%= link_to "空から人間を見下ろして嘲笑う", perfumes_show5_path %>
<%= link_to "ただ気楽に、優雅に時を過ごしたい", perfumes_show6_path %>

```
```ruby:perfumes/show1.html.erb

<h4><おすすめの俳句></h4>
<p>冷えびえと 袖に入る日や 秋の山 </p>
<%= link_to "トップに戻る", perfumes_path %>

```
##### ※show2~show6はshow1と同様

以上です！

### 5.デモ動画
![無題の動画 ‐ Clipchampで作成.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635959/8634f376-a979-ebed-30e1-6147ccc53f0a.gif)


## さいごに
一見煩雑そうに見えますが、使っている知識は初歩的です。
知識を活用していくプログラミングの楽しさを経験できることに、少しでも貢献できれば幸いです。
AI-102試験対策のまとめ「Azure AI Video Indexerにおける多言語識別」

## はじめに
Azure AI Engineer Associate(AI-102)取得に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AI-102取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください
※勉強しながら投稿しているため、追加で学んだことがあれば随時投稿内容を更新します。

## 試験対策のまとめ
### Azure AI Video Indexerにおける多言語識別
* Azure AI Video Indexerでは、複数言語のコンテンツ内の下記をサポート
    - 言語識別
    - 文字起こし
* 下記の2種類の方法でインデックス作成/再作成時に多言語識別を選択可能
    - ポータルを使用
        - Video source languageドロップダウンボックスから「multi-language detection」を選択
    - APIを使用
        - `sourceLanguage`パラメーターで`multi-language detection`オプションを選択

#### **ガイドラインと制限**
* 選択した言語以外の言語を含むオーディオでは、予期しない結果が生成される
* 各言語を検出するための最小セグメント長は15秒
* プロジェクトの作成/編集は、複数言語のビデオでは使用不可
* 複数言語の検出を使用する場合、カスタム言語モデルは使用不可

<br>

* 参考
    - https://learn.microsoft.com/ja-jp/azure/azure-video-indexer/multi-language-identification-transcription

## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「Azure AI Bot Serviceにおけるメッセージのリッチカードの種類」**

https://qiita.com/fsd-jume/items/1091317bdf605c1ea45e

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d
Truth 1.2.0で追加されたisWithin().of()の使い方メモ

# 概要

[Truth 1.2.0](https://github.com/google/truth/releases/tag/v1.2.0)で新しく`isWithin().of()`が追加されたので使い方のメモです。

例えば、あるメソッドが戻り値として期待される整数値に非常に近い値を返すかをテストしたい場合、`assertThat`メソッドを使って対象の値を指定し、`isWithin`メソッドで許容範囲を設定し、`of`メソッドで期待値を指定します。


ここで、`actualValue`はテスト対象の値、`tolerance`は許容される差の範囲、`expectedValue`は期待される値を指します。

```kotlin
assertThat(actualValue).isWithin(tolerance).of(expectedValue)
```

# 具体例

具体例だとこんな感じです。

```kotlin
assertThat(20000).isWithin(0).of(20000) // OK 20000±0の範囲に期待される値が入る
assertThat(20000).isWithin(1).of(20000) // OK 20000±1の範囲に期待される値が入る
assertThat(20000).isWithin(10000).of(20000) // OK 20000±10000の範囲に期待される値が入る
assertThat(20000).isWithin(10000).of(30000) // OK 20000±10000の範囲に期待される値が入る

assertThatIsWithinFails(20000, 9999, 30000) // NG 20000±9999の範囲に期待される値が入らない
assertThatIsWithinFails(20000, 10000, 30001) // NG 20000±10000の範囲に期待される値が入らない
```

# 関連リンク

`isWithin().of()`を追加するコミットに含まれてるテストコードはこちら。
https://github.com/google/truth/commit/6464cb5ca#diff-6bb9d1ff6594320c37d2edc59edcf4dcd390dc9c6f6f926bac12c5363c2dbff4
pnpmを使ったプロジェクトでCloudFunctionsがデプロイできなくなるバグの解決策

こんにちは。[virapture株式会社](https://virapture.com)でCEOしながら[ラグナロク株式会社](https://ragna-rock.com)でもCKOとして働いている[@mogmet](https://twitter.com/mogmet)です。

本日はトラブルシュート記事になります。

## 現象
ある日突然下記のエラーと共に、cloud functionsがデプロイできなくなりました。

```
Step #2 - "build": ===> BUILDING
Step #2 - "build": Timer: Builder started at 2023-12-20T00:27:53Z
Step #2 - "build": === Node.js - Runtime (google.nodejs.runtime@1.0.0) ===
Step #2 - "build": Using runtime version from GOOGLE_RUNTIME_VERSION: 18.18.2
Step #2 - "build": ***** CACHE HIT: "nodejs"
Step #2 - "build": Node.js v18.18.2 cache hit, skipping installation.
Step #2 - "build": === Utils - Archive Source (google.utils.archive-source@0.0.1) ===
Step #2 - "build": Adding image label google.source-archive: /workspace/.googlebuild/source-code.tar.gz
Step #2 - "build": === Node.js - Pnpm (google.nodejs.pnpm@0.1.0) ===
Step #2 - "build": 2023/12/20 00:27:53 [DEBUG] GET https://registry.npmjs.org/pnpm
Step #2 - "build": ***** CACHE MISS: "pnpm_engine"
Step #2 - "build": Installing pnpm v8.13.0
Step #2 - "build": 2023/12/20 00:27:54 [DEBUG] GET https://github.com/pnpm/pnpm/releases/download/v8.13.0/pnpm-linux-x64
Step #2 - "build": --------------------------------------------------------------------------------
Step #2 - "build": failed to build: (error ID: a7b84d14):
Step #2 - "build": installing pnpm: (error ID: d089d270):
Step #2 - "build": downloading pnpm: (error ID: 484d23ae):
Step #2 - "build": fetching https://github.com/pnpm/pnpm/releases/download/v8.13.0/pnpm-linux-x64 returned HTTP status: 404
Step #2 - "build": Timer: Builder ran for 547.305417ms and ended at 2023-12-20T00:27:54Z
Step #2 - "build": ERROR: failed to build: exit status 1
```

## 原因

2023/12/20現在、pnpmの最新版は8.12.1なのですが、なぜかCloudFunctionsのビルド時には8.13.0をインストールしようとしています。
未来に生き急いでいます。
pnpmがインストールできないためビルドがこけていることがわかります。

## 対策

package.jsonのpnpmのengine指定では下記のように指定していました。

```json
...
 "engines": {
    "pnpm": ">=8.5.0",
    "node": "18",
...
```

これを下記のようにバージョン指定するように修正しました。

```json
...
  "engines": {
    "pnpm": "8.12.1",
    "node": "18",
...
```

無事にデプロイできるようになりました。

## まとめ

latestを指定していると突然動かなくなるのでバージョン指定するようにしましょう！！

最後に、スノボの楽しく滑るコツを掴める [cotsume](https://cotsume.page.link/blog) というアプリを作ってます！よかったらDLしてみてね！

https://cotsume.page.link/blog

また、[ワンナイト人狼オンライン](https://online.1nite-jinro.com/link/blog)というゲームを作ってます！よかったら遊んでね！

https://online.1nite-jinro.com/link/blog

他にも[Camecon](https://camecon.me/)や[Offcha](https://offcha.com/)、問い合わせ対応が簡単にできる[CSmart](https://csmart.jp/lp)、フリーランスのコミュニティの[NextFreelance](https://next-freelance.net/)といったサービスも作ってるのでよかったら使ってね！

https://camecon.me/

https://offcha.com/

https://csmart.jp/lp

https://next-freelance.net/

また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。

https://virapture.com/

https://menta.work/user/20565

ラグナロクでもエンジニアやデザイナーのメンバーを募集しています！！楽しくぶち上げたい人はぜひお話ししましょう！！

https://ragna-rock.com
IBM i駆け出し日記：VS CodeでIBM iを触る~コードコンパイル編~

# IBM iに接続できたので実際に使ってみる
[VS CodeでIBM iを触る~設定編~](https://qiita.com/koga39chan/items/20e9f468f3079c62472a)でIBM iとVS Codeと接続しました。

接続できたら左側にメニューバーが出ているはずで、IFSブラウザ配下の自分のユーザーライブラリが見えているはずです。
![png 2023-11-08 12.51.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/f633a875-fb1f-da9b-02dc-c693ded01ee7.png)
Get Startedに英語のマニュアルありますが、それをベースに書いていきます。

## ざっくり使い方解説
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/108c5040-3d9c-ee03-a732-ce47e3f80a31.png)

- ユーザーライブラリ：ライブラリリストが表示されている。編集してライブラリを追加することが可能
- オブジェクトブラウザ：ライブラリシステムが表示されている、フィルターで表示するライブラリーを設定してこのエリアに見せることができる
- IFSブラウザ：IFS配下にあるフォルダが表示されている、フィルターで表示するファイルのパスを設定してこのエリアに見せることができる

個人的によく使うTips
① メインのエディター以外のターミナルやデバッグコンソールを出すことができます
② Gitのブランチの切り替えができます
③ IBM iとの接続を切ることができます

# ファイルをコンパイルする
## 対象ソースファイルへのパスを設定する
カーソルをIFSブラウザにあわせ、＋ボタンでフィルターの作成します。対象ファイルへのパスを上部の検索ボックスに入力します。
![png 2023-12-20 9.41.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/7416d897-3205-dfc1-bbf2-b603fddf7363.png)

## ソースを編集する
フィルターを選択し、対象のファイルが見えました。
左側のメニューバーから編集したいソースを選択し、ソースを編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/588b344c-c03a-cc4d-0e94-9a5450890011.png)
デフォルトで自動保存になっているはずです、いちいち保存するか聞かれなくて良いのは便利

## コンパイルする
編集したソースファイルをコンパイルします。
コンパイルしたいファイルの上にカーソルを合わせ、右クリックをするとRun actionボタンがあるのでそれを押します。
![png 2023-12-20 9.44.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/c610b62a-b0e7-2e75-6e50-5e5c261edd03.png)

押すと上部にコンパイルオプションが表示されるので任意のものを選択します。
今回はコンパイル先のライブラリーを指定したいので、with inputsを選択します。
![png 2023-12-20 9.44.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/ea872326-039e-d9e3-c2a1-b195af651c16.png)

![png 2023-12-20 9.44.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/499d9ff5-c7e7-63ae-cc8c-d0984e9f427e.png)


情報を入力し、EXCECUTEを押します。右下のメッセージを確認して、うまく行ったかどうかが確認できます。successと出ればコンパイル成功です。
![png 2023-12-20 9.47.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/4c1773c1-4033-2c49-5f06-512264dd910d.png)
【解決済】Salesforceのリストでインライン編集ができなくてハマった話

# はじめに
- この記事は、[LIGHTz Advent Calendar 2023](https://qiita.com/advent-calendar/2023/lightz)の記事です。
- エンジニア関係ないSalesforceの記事です。

# 困っていたこと
- Salesforceには、リストビューでレコードを一括編集できる便利な[「インライン編集機能」](https://help.salesforce.com/s/articleView?id=sf.customviews_edit_inline_listview_lex.htm&type=5)があります。
- この機能を使いたかったのですが、**複数のレコードタイプが含まれるリストビューでは使用できない**縛りにハマっていました。
- 「インライン編集は無効になっています。編集するには、1つのレコードタイプで絞り込んでください。」というエラーが出て編集できません。
![スクリーンショット 2023-12-20 9.32.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160366/187c5f0c-6cb7-9050-8613-bb7f09a196ba.png)
- レコードタイプは使用していないはずのに絞り込めない！？どうして？


# ハマりどころ&解決方法
- レコードタイプを新規作成していない状態では、レコードはデフォルトの「マスタ」レコードタイプとして保存されています。
- この場合もリストビューを「マスタ」レコードタイプで絞り込む必要があります。
- 「マスタ」レコードタイプを選択したい場合、検索条件に
項目：「商談レコードタイプ」
演算子：「次の文字列と一致する」
値：「何も入力しない」　　で「完了」をクリックすればOKです。
![スクリーンショット 2023-12-20 9.37.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160366/80ffccb7-4327-ab64-546f-8446c0e7ed64.png)

- レコードの左側にチェックボックスが表示され、一括編集できるようになりました。
![スクリーンショット 2023-12-20 9.38.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160366/d7a0a900-116c-aafe-8db3-9cae3e526eee.png)

# まとめ
- レコードタイプを設定していない場合は、レコードタイプの値を「何も入力せず」デフォルトのマスタレコードタイプで絞り込む。
※マスタレコードタイプが見えるようになるとありがたいなぁ、と思いました。
【MSX0】RCONSOLE.PAS【Turbo Pascal】


# はじめに
『MSX0 Stack』付属の IoT BASIC サンプルを『Turbo Pascal』へ移植してみます。

 - [【MSX0】IoT BASIC サンプルの移植【Turbo Pascal】(Qiita)](https://qiita.com/ht_deko/items/2362488c5c99aec4afbf)

# RCONSOLE.BAS
◆リモートコンソールへの文字列送信

| 項目 | 説明 |
|:---|:---|
| 概要 | リモートコンソールに文字列を送信します。 |
| ファイル名 | RCONSOLE.BAS |
| 対応デバイス | |
| コメント | MSX0 上で稼働しているリモートコンソールサーバーに対して print "hello" の文字列を送信します。 <br>リモートコンソールは通常 PC やスマホなどのターミナルソフトから制御しますが、それを MSX0 から制御するプログラムになります。<br>リモートコンソールで操作される側の MSX0 の Remote 設定が OFF になっている場合は [Setup Utility](https://qiita.com/ht_deko/items/2ccf08e3014fbe46e913) などで ON にしてください。|

**See also:**

 - [『MSX0 Stack』の操作方法 - ハードウェア (Qiita)](https://qiita.com/ht_deko/items/cdb1594e9879a5e9e660)

## MSX0 Stack での挙動

:::note warn
ターミナルソフトでのリモートコンソール接続が確立している場合、事前に接続を切っておく必要があります。リモートコントロールパネルやシリアルコンソールは接続したままで大丈夫です。
:::

`RCONSOLE.BAS` をロードして、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/909e3a85-8543-427a-d74d-ec2b78f9ea9d.png)

実行してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/8b698d64-1e64-00d6-2905-e615e4878999.png)

自分自身に `print "hello"<return>` が送られました。

:::note
BASIC プログラムのコメントに typo がありますね。
:::

## Turbo Pascal へ移植

別途、MDL-LIB と `SYSUTILS.LIB`、`IOT.LIB` が必要です。

 - [MDL-LIB version 2.2 の使い方 (Qiita)](https://qiita.com/ht_deko/items/6f15aee0bd25b550e4df)
 - [【MSX0】IOT.LIB (Qiita)](https://qiita.com/ht_deko/items/a5c0bf6e7969093beb3c)

```pascal:RCONSOLE.PAS
program RCONSOLE;
type
  LibStr = string[80];
{$I SYSUTILS.LIB}
{$I IOT.LIB}
const
  PA = 'msx/me/if/NET0/';
begin
  { connect }
  IoTPutStr(PA + 'conf/addr', '127.0.0.1');
  IoTPutInt(PA + 'conf/port', 2223);
  IoTPutInt(PA + 'connect', 1);
  { check connect status }
  Delay(500);
  if IoTGetInt(PA + 'connect') <> 1 then
    { error }
    Writeln('connect fail')
  else
  begin
    { send message }
    IoTPutStr(PA + 'msg', 'print "hello"'#13#10);
    Delay(500);
  end;
  { disconnect }  
  IoTPutInt(PA + 'connect', 0);
end.
```

Turbo Pascal のオンメモリ実行だと、Turbo Pascal に文字列が送られて変な事になるので、実行形式ファイル (`*.COM`) を作って MSX-DOS 上で実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/7d430a65-70f3-d0d5-d2f3-15ff9efe1503.png)

MSX-DOS に `PRINT` なんてコマンドはないのでエラーになってしまいました。送るメッセージを変えてみましょう。

```pascal
    { send message }
    IoTPutStr(PA + 'msg', 'dir A:\TP3'#13#10);
    Delay(500);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/e7641511-bf5f-0725-b78b-de8804b84e62.png)

`dir A:\TP3` が実行されました。

### 解説
コードがスッキリ読みやすい事位しか特筆すべき点はないというか…。

# おわりに
今回の移植に関して難しい所は特にありませんでした。
新人PjM必見！ “ごきげん” にプロジェクトを進めるための3つのステップ


本記事は[リンクアンドモチベーションAdvent Calender2023](https://qiita.com/advent-calendar/2023/lmi) の21日目です。



# はじめに

はじめまして！リンクアンドモチベーションのエンジニアのわたなべです。

みなさんは、2ヶ月～3ヶ月のプロジェクトを進める中で、どうしても前向きになれないことや、このまま遅延し続けてしまうのではないかと不安になること、ありませんか？
不安になると、きちんと現実に向き合えずに「まあなんとかなる」「なんとかするしかない」という思考に陥り、楽観視し始め、結果的にどんどん追い込まれていくことが多いのではないでしょうか。

何を隠そう自分も、最近プロジェクトマネージャーをし始めて、「前が見えない」「何が不安なのかわからないけどなんかできる気がしない」という気持ちになる時がありました。

そんな状態から、ポジティブにプロジェクトを進めるために意識して良かった3つのことを紹介したいと思います。

# ポジティブなチームになるためにやったこと
やったことは、日々のミーティングでどんな状態を目指すか？を意識することでした。
それぞれ**Will-Can-Mustフレームワーク**と組み合わせながら、やったこと3つを紹介したいと思います。

#### ※Will-Can-Mustフレームワークとは
- [カオナビ公式HP](https://www.kaonavi.jp/dictionary/will-can-must/)より
>Willは「今やりたいこと」・Canは「今できること」・Mustは「今やらなければならないこと」です。Will Can Mustのフレームワークで物事を考えることにより、未来や過去の話が混在せずに、今の内容を整理できるメリットもあります。

一般的には、キャリアプラン策定時に使われることの多いフレームワークですが、
仕事を進める上でのモチベーション向上にも使えることから、当てはめて整理しています。

## 1. 「これならいけそう」を作り出すプランニング
私たちのチームでは、プロジェクトのゴールから逆算して
「厳しくてもこれを全部やらないと！！！」という意識が強く、
プランニングが"やらなきゃいけないこと"を確認する時間になっていました。

”やらなきゃいけない”に支配されると、できなかった時に落ち込む、能動的になれない、と単純にモチベーションが下がってしまいます。


そこで、以下の2つを意識するようにしました。
- Mustを確認するプランニングではなく、Can(”これならいけそう”)を作り出す
（定量的に、見積とキャパシティから判断する）
- "これならいけそう"をメンバー全員が言える状態にする
（定性的に、気持ちに寄り添い効力感を醸成する）

そうすると、Canが見えることで達成意欲が高まり、「いけそう」と宣言した自分の発言を守ろうという意識が働いて、として結果的に前向きにスプリントを走れるようになりました。


## 2. 「ここまでやらないとやばい」を自覚するマイルストーン

1のプランニングの変化で、ある程度スプリントの実現可能性が見えたとします。
ただ、折角見えたCanも日々のタスクがずるずると遅延していっては元も子もありません。

そこで、プランニングの最後に以下のことを意識するようにしました。
- スプリントのCanを達成するために、デイリーのMust＝”ここまでやらないとやばい”ラインを引く
- 個人の”ここまでやらないとやばい”をチームにも共有する

「〇曜日までにこのタスクが終わっていないと、スプリントのタスク終わらないよね」というデイリー単位のマイルストーンを設定することで、決めたゴールを守る意識が高まりました。
また、それを個人でとどめず、お互いにマイルストーンを把握しておくことで、誰かが困っていないか？チームとしての進捗はどうなんだ？というチーム意識にもつながりました。

## 3. 「ここまでできた」を称賛するデイリースクラム

そして最後に、1番大事だと思ったこと。
 それは、**毎日の進捗をねぎらうこと**です。

2のようにマイルストーンを定めることで、毎日の進捗をお互いに気にするようになりました。
そこで、半分は自然発生的にではありますが、以下のことをデイリースクラムでできるようになりました。
- マイルストーンが順調に進んでいたら純粋に称賛
- 詰まっていそうだったら「大変なタスクなんだね」と認識してチームで解決に動く

出来たことに向き合うと、Will＝"次もやりたい"に繋がります。
お互いへの称賛を忘れないことで、モチベーションを高め合いながら働くことができるようになっていきました。

## チームの状態はこう変わった
3つのことを実践する前と後でのチームの状態はこんな風に変わりました。
#### Before
スプリントを重ねるごとに生まれる焦りと不安が更に疲弊感を生む状態
「またスプリントのタスクできなかった…」
「なんだか終わる気がしない…」

#### After
スプリントゴールに対して前向きに取り組み、着実に進んでいる感覚を得ている状態
「これならできそうだからやりきろう！」
「ここまでできた！来週も頑張ろう！」


# おわりに

「できない」「しんどい」と思いながら働くよりも
「できそう」「できた」「頑張れる！」と思いながら働くために
やってよかったこと3つをご紹介しました。

プランニングで進む道を決めて、日々振り返って、できたら称賛して、また次に進む。
毎日・毎週を積み重ねることで着実にプロジェクトが進むようになりました。

個人でもチームでも、ご機嫌に仕事をしていきたいですね！
X-Ray 性能の見える化：ベンチマークツールNutanix X-Ray (2023年12月時点) その1

本記事は**本記事は[Nutanix Advent Calendar 2023](https://adventar.org/calendars/8538) 12/21 分の記事です。**
2023/12時点 X-Ray 4.3.1をベースに記載しています。
* 性能評価で知られているNutanix X-Rayのご紹介となります。
    * 性能の見える化：ベンチマークツールNutanix X-Ray (202312時点) その1 ※今回の記事
    * [性能の見える化：ベンチマークツールNutanix X-Ray (202312時点) その2](https://qiita.com/matsumo2019/items/0e64021c81cc690adbfa)

## X-Rayとは
* X-RayとはI/Oパフォーマンス測定ツールとなります。ピーク性能のベンチマークやVDIの性能評価にとどまらず、多くのシナリオ(性能評価テストのこと)が標準で準備されています。たとえば、Live Migration時の性能影響、ローリングアップグレード時の性能影響などを確認することができます。また、簡単にそれらシナリオ結果を表示、分析、比較することができますので様々なシーンで利用可能です。
* ※シナリオによりクラスタに負荷を掛けたり、ノードダウンなどの障害を起こしたりしますので、実行する場合はシナリオ確認後に行ってください。

## 環境
* X-Rayは仮想アプライアンスとして無償で提供されています。AHV、ESXi、Hyper-V環境で利用できます。
* X-Ray VMは評価対象のクラスタ外にX-Rayをデプロイすることを推奨しています。これは、シナリオにより評価対象のクラスタにX-Ray VMが動作していると正確な性能値が取得できない場合があるためです（評価対象のクラスタでも動作します）。
* 動作環境イメージと手順概要は下図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543420/a03fc316-e543-8b3a-931d-f723ad13f37e.png)




## シナリオの種類

* 現在、標準シナリオは30弱のシナリオがあり、それらは5つのカテゴリに分類されています。
* 以下のカテゴリに分類されています。いろんなシーンで性能測定できることがイメージいただけるかと思います。
  * Infrastructure Performance（主に性能測定）
  * Infrastructure Resiliency（主に障害時に実行中のアプリケーションに及ぼす影響測定）
  * Application Performance（データベースやVDIをシミュレーションした測定）
  * Infrastructure Scalability（新しいVMを追加した際の影響測定）
  * Data Protection（スナップショット・クローン時などの影響測定）



## X-Rayのデプロイ方法

* Support PortalにX-Rayイメージがありますのでご自身の環境に応じたものをダウンロード＆デプロイしてください。
* X-Rayユーザガイドの手順通り簡単に導入できます。



## X-Ray画面イメージ、使い方

* メインの Tests 画面です。すべてのシナリオが確認できますので、こちらからシナリオを選択しシナリオを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543420/4455d1a3-6980-55fd-e495-83a293472ffa.png)
<BR>

* シナリオ実行前の詳細です。ここで以下を確認します。
  * テスト概要と構成イメージ図（左上）
  * Test Requirements：X-RayがどういうタイプのVMを作成するか。どの程度リソースが必要か確認しましょう。
  * Setup、Measurement：実際のシナリオを実行した際の流れ
  * シナリオによってはカスタマイズできますので負荷を調整したりすることも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543420/1bfc5d18-d3f6-caa4-e937-fd3e29d8273b.png)
<BR>
* 実行中はX-Rayが必要に応じてVMをデプロイしシナリオを実行します。
![run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543420/79b47837-e392-cc2a-ab65-f3a848cb5910.png)


* 結果のサマリと詳細なグラフを確認することが可能です。
* ここでは484.26K IOPS / スループット16.91BytesSecの結果とテスト中の負荷推移がグラフで表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543420/84a73654-c435-d0a8-66c4-46807cb6160e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543420/b17183c8-5833-2c13-4de6-bbc2d8d47b7b.png)



* 複数のシナリオ結果を重ねたグラフを作成することも可能です。以下は4つのシナリオ結果を合成したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543420/4ec4564b-d9aa-6e02-5be0-a351700bc62f.png)
<BR>

## まとめ
* X-Rayはピーク性能の性能評価にとどまらず、多くのシナリオが標準で準備されています。
* 性能の見える化のためにお試しください
* 次回はシナリオの結果や使いどころを紹介します。
<BR>

* [性能の見える化：ベンチマークツールNutanix X-Ray (202312時点) その2はこちら](https://qiita.com/matsumo2019/items/0e64021c81cc690adbfa)