OmniAICreator/Qiita-1.07M huggingface dataset:
久々にGoogle Cloud 認定資格の試験を遠隔監視オンラインで受けたらトラブった


# はじめに
2022年に一度Google Cloudの認定資格試験を遠隔オンライン試験で受けていました。
その際はスムーズにいけて問題にならなかったため、今回(2024年6月)新しいGoogle Cloud認定資格試験をこれまた遠隔オンライン試験で受けようとしたらトラブルで**1時間半から2時間ほど時間を取られた**ので、同じ思いをする人が減ればいいかなというので何したかを記載しようと思います。

:::note info
テストを終わって思ったこと
* この件があったので、次からはテストセンターにしようと思いました
* 今回はProfessional Data Engineer試験を受けましたが、去年から準備をしていたので悲劇を生みました
:::

# 今回の原因(流れ見たくない人用)
**Google Chrome**でwebassessorを開いて、サイトの設定を開き、マイクを許可しているかを確認しておきましょう。**許可**ではなく「**確認**」になっていたら許可にしておきましょう。
(ついでにカメラもしておきましょう)

# 今回の試験の流れ 
試験の流れとしては以下の通りです。
ややうろ覚えの部分がありますので、順番は前後する可能性があります。
ちなみに今回は梅雨寸前でしたが、**お風呂場**で受けました。
このこともあって、夏場などに遠隔監視オンラインを受けるのはおすすめしないです。

#### 試験前
* 試験登録
* セキュアブラウザインストール
* 生体情報入力
(前回実施してたため登録画面は出てきませんでした。)

#### 試験10分前
1. 試験用起動ボタンが表示される
2. EdgeやChromeを落とすプロンプトが表示される
3. 部屋の状態などは問題ないかのチェック項目が表示される
4. カメラやマイクを選択する画面が表示される
5. 生体情報の照合・確認が実施される
6. スマホ用のQRコードが表示される
ここから**スマホ操作です。**
7. スマホでパソコン周辺環境の撮影しろと言われる
パソコンの画面後ろや左、右、後ろなど順番に撮影しろと表示されます
8. 本人確認用のIDの撮影を求められます
私は免許証とマイナンバーカードでいけました
(どちらかを最初で、そのあと別のIDも求められるのでその時にもう一つのをパソコン越しに映せばOKでした。
ただ、最初は解像度が悪かったみたいなので、スマホで取って名前のところを拡大して見せろと言われました。)
ここからパソコンに戻ります。
9. しばらく待つとチャット画面とカメラ・マイクを選択する画面が表示される
10. チャットに英語(前は日本語だったのに...)で別の本人確認用IDを見せろと言われる
11. 見せたら名前がよく見えないからスマホで取って名前部分を拡大しろと言われる
12. 自分の周囲をWebカメラで3～5秒ずつ映せと言われる
13. 自分の名前を大きな声で言えと言われる
ここから**問題発生**
14. こちらの声が聞こえないといわれる
15. ヘッドセットがあるか聞かれたので、取りに行って繋いで話すもダメ
16. そもそもマイクとカメラの選択肢にヘッドセットが出てこず、なぜか双方Webカメラしか出てこない
17. そのことを話すとPC再起動する旨がチャットで書かれる
18. PC再起動し、もう一回起動させる
19. なんと、No.2からNo.9までもう一度実施...
20. もう一度自分の名前を大きな声で言えと言われる
→聞こえない（そりゃそーだろ...）
このあたりから相手側がGoogle翻訳みたいなのを使って日本語でチャットしてくれる。
21. 試験画面を閉じて、KRYTERIONのページに言って専門家に聞けと言われる
22. KRYTERIONのページに遷移、チャット画面を開く
23. 氏名などを聞かれる
24. 一つ一つ設定を確認される
25. 設定からアプリにマイクを許可してるかなどを確認される
26. **Google Chrome**でwebassessorを開いて、サイトの設定を開き、マイクを許可しているかを確認される
→多分これが原因でした。**許可ではなく「確認」**になってました。
27. このあたりの設定を実施後、試験に戻る
28. No.2からNo.12まで実施し、トイレなど大丈夫かと言われてOKと返したら試験開始でした
ここまでで大体1時間半から2時間風呂場でずっと過ごしました
mod p で N 以下の正整数の逆元を動的計画法を用いてO(N)で列挙する方法！【競技プログラミング】

## はじめに

こんにちは！！競技プログラミングをやっている高校生のButterFlvです！今回は $\pmod{p}$ で $N$ 以下の正整数の逆元を $O(N)$ で列挙する方法を書いていきます。かなり有名な手法ですが備忘録として書きます。証明がかなり面白いです！！

## 忙しい人向け

1. 配列 $\mathrm{inv}$ を用意します.
1. $\mathrm{inv}[1]=1$ を初期値として与えます.
1. 以下のループを $i=2,3,\cdots ,N$ で実行します.
    * $\mathrm{inv}[i]=-(p\ /\ i)\cdot \mathrm{inv}[p\ \\% \ i]\ \\% \ p$
1. $\mathrm{inv}[i]$ にアクセスすれば$\pmod{p}$ における $i\ (1\le i\le N)$ の逆元を $O(1)$ でとってくることができます.

## 証明

$a$ を $b$ で割った商を $a\ /\ b$ , 余りを $a\  \\% \ b$ とする.

逆元を考えたい正整数 $a\ (\ge 2)$ についての動的計画法を考える. 今回は正整数 $1,2,\cdots ,a-1$ についてこれらの$\pmod{p}$における逆元 $1^{-1},2^{-1},\cdots ,(a-1)^{-1}$ がすでに求まっているとする.

$q=p\ /\ a,\ r=p\ \\% \ a$ とおくと $p=a\cdot q + r$ が成立するので, この両辺の$\pmod{p}$を考えると

$$
\begin{align}
p&\equiv a\cdot q + r \\\\
0&\equiv a\cdot q + r \\\\
r&\equiv -a\cdot q \\\\
a^{-1}&\equiv -q\cdot r^{-1}
\end{align}
$$

以上より $r^{-1}$ が求まっていれば $a^{-1}$ は求まる. ここで, $r=p\ \\% \ a$ としたことから $1\le r\le a-1$ が成立しており, $r^{-1}$ は動的計画法の仮定からすでに求まっている.

したがって, 乗算および剰余演算の時間計算量 $O(1)$ を仮定すれば $a^{-1}$ は $O(1)$ で計算できた. $a=2,3,\cdots ,N$ と順に計算していけばすべて合わせて $O(N)$ である.

## おわりに

* この方法を使えば$\pmod{p}$における $N$ 以下の正整数の階乗の列挙が $O(N)$ でできるため正整数 $0\le a\le b\le N$ について $\_ {a}\mathrm{C}\_{b}$ を $O(1)$ で求めるための前計算も $O(N)$ でできます！！
* $a^{-1}\pmod{p}$ を求める他の有名な手法としては $a^{p-2}\pmod{p}$ を繰り返し二乗法で求めたり, 拡張ユークリッド互除法を用いて $ax+py=1$ の $x$ の解として求めたりする方法があります. （どちらも $O(\log p)$ ですが繰り返し二乗法が $\Theta (\log p)$ なのに対してユークリッド互除法で $\log p$ かかるのは最悪ケースの場合でほとんどの場合はもっと早く計算が終了するので拡張ユークリッド互除法のほうが早いとされています.）
Markdown AIを使ってみよう

## はじめに
**Markdown**と**AI**の融合は、現代の技術進歩を象徴する魅力的な取り組みです。特にMarkdownは、そのシンプルさと使いやすさから、プログラマーやライターに愛用されています。AIは、この使いやすさをさらに向上させるために不可欠なツールとなります。この記事では、MarkdownとAIを組み合わせた新しいサービス、[**Markdown AI**](https://mdown.ai/content?id=335b81b2-bcb0-4dbb-83d0-531aa132181f)を紹介します。

Markdown AIは、テキストを簡単に構造化し、Webページを作成するためのツールです。本記事では、以下のイベントテーマに沿った記事となっております。

https://qiita.com/official-events/142fdd0d69ff6bb2d547

## Markdown記法とは
Markdown（マークダウン）記法は、テキストを構造的に記述するためのマークアップ言語の一種です。特定の記号を使って、見出しやリスト、リンクなどを簡単に作成できます。例えば、プログラミングのコードを共有できるGitHubやここQiitaでもMarkdownが使われています。

この記法はHTMLに比べて非常に簡易的で、**普段のテキスト入力でも無意識に使っていることがあるくらい**です。例えば、次のように書くだけで、
```
- 算数
    - 掛け算
    - 割り算
- 国語
    - 漢字
    - 読解
- 理科
    - 植物の観察
    - 空気砲の作成

```
このように表示されます：

- 算数
    - 掛け算
    - 割り算
- 国語
    - 漢字
    - 読解
- 理科
    - 植物の観察
    - 空気砲の作成

太字が使いたいなら、普通文字を飾りたくなりますよね。なので、**太字** は `**太字**` と書くだけでOKです。

このように直感的であり修得も比較的容易な点がMarkdownの特徴です。

## Markdown AIとは
Markdownが簡単であるとはいえ、最初からスラスラと書き始められる人はいません。なぜなら、覚えるべきルールが色々とあるからです。そこで、Markdownの記述を補助してくれるのが**AI**の存在です。しかし、AIをうまく活用するのもまた難しいことです。そんな時に役立つのがMarkdownとAIを掛け合わせた[**Markdown AI**](https://mdown.ai/content?id=335b81b2-bcb0-4dbb-83d0-531aa132181f)です。Markdown AIは、文章作成からWebページの公開までの一連の操作を非常にスムーズに行えるツールです。

### Markdown AIの利点
Markdown AIを使うことで、以下のような利点があると思います（AIの部分は実装されていないため、推測を含みます）。
- **簡単に始められる**：Googleアカウントでサインインするだけで、すぐにMarkdownの記述を始めることができます。
- **質問しやすい**：AIがサポートしてくれるので、Markdownの使い方や書き方で困った時にすぐに質問できます。また、Markdownに特化したAIなので、的確なアドバイスがもらえます。
- **効率的にWebページを作成**：Markdownを使って素早くWebページを作成し、公開することができます。
- **スマホでの操作も可能**：スマホ一つでMarkdownの編集やWebページの作成ができるので、場所を選ばず作業ができます。

詳しくは[Markdown AI公式](https://mdown.ai/content?id=335b81b2-bcb0-4dbb-83d0-531aa132181f)や[markdown AI記述方法](https://qiita.com/tanaka_yaruo/items/9a8e7542f0c527499ed2)をご覧ください。


## 使ってみた
こちらに使ってみた記録を公開します。

https://storage.googleapis.com/topdowncom/content/6xhTAiDQHNWAfAmbIRs90j3WR8X2/e174f081-9672-4190-8d50-878c0c2f3988/index.html


こんな感じで簡単に共有できるのも、Markdwon AIの優れた点です。


## 感想
個人的にあるとより便利だと思った機能を列挙します。
- MarkDown記述ページについて
    - ページの左右でのプレビュー機能：すでに別の方も述べている通りで、あった方がより活用しやすいと思います。
    - ページ内リンク機能：`[表示内容](#ページの見出し)`のようにページ内リンクが使えた方が良いかもしれません。
- MarkDown AIのUIについて
    - 削除アイテムの色変更：現在の白黒のシンプルなデザインは良いのですが、`Del`アイテムが他のアイテムと同じ色だと誤って消してしまう危険性があります。赤系の色を付けると良いかもしれません。
    - ダークモード：好みになりますがダークモードが選べても良いかもしれません。
    - 記事の作成日時と更新履歴：記事の作成日時や更新履歴（diff）などの機能があると便利です。Qiitaのように、第三者が記事の変更履歴にアクセスできるようにしておくのも良いかもしれません。
    - Markdown形式での本文表示機能：Markdown形式で本文を表示する機能があると、第三者が情報を活用する際に便利です。例えば、Markdown形式でのソースを確認できれば、どのように書かれているのかを効率的に学習できます。
    - 記事の概要表示：Webページが増えてくると、記事を探すのが難しくなっていきます。AIを活用して記事の一覧に概要を記載しておくと良いかもしれません。

## まとめ
[使ってみた](#使ってみた)で紹介したように、**Markdown AI**はシンプルで使いやすいマークアップ言語であるMarkdownを誰もが簡単に使うことができ、公開まで非常にスムーズな点が魅力です。

さらに、Markdown AIはHTMLやCSSにも対応しているため、より高度なカスタマイズやスタイリングも可能です。言い換えれば、**Markdown AIはMarkdownからHTMLとCSSを学ぶための橋渡しにもなる**と思います。

**Markdown AI**を使って、文章をより見やすく、美しく、構造的に表現し、楽しくWebページを作成スキルを磨いていきましょう！

## 参考

https://mdown.ai/content?id=335b81b2-bcb0-4dbb-83d0-531aa132181f

https://qiita.com/tanaka_yaruo/items/9a8e7542f0c527499ed2
ジンバルモーター、SimpleFOCで動かす(1) - 組み立て編

# はじめに

バイラテラル制御、ハプティクスの学習を目的として制作しました。その過程を記録します。

# 開発環境

* macOS Sonoma 14.5 (Intel & Apple silicon)
* PlatformIO Core 6.1.15
* PlatformIO Home 3.4.4
* Simple FOC 2.3.3
* Visual Studio Code 1.90.2

# パーツリスト

* Arduino Uno R4 Minima
* MARSPOWER Brushless Gimbal Motor 2208 80T
* SimpleFOCMini V1.0 (DRV8313) (公式のものではなくAliexpressで売っている製品)
* 磁気エンコーダ AS5600
* YAHATA スペーサー 5x15 ニッケルめっき
* バッテリー LiPo 3Cell 800mAh 65C

# 接続図

![BLDC_SimpleFOC_AS5600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/fc481c46-e237-f3de-40cb-9ae2ba4667e7.png)
 
# BLDCへ磁気エンコーダを固定

磁気エンコーダ用の磁石をジンバルモーターに接続します。
磁石はこんな感じだと思います。同じ形の磁石でも磁化方向はいろいろあるようですので、付属の磁石を使うか仕様をよく確認します。

![mag_NS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/9bd6a8e8-f584-c1fa-b611-38187255cc39.png)

1. ジンバルモーターの下側、シャフトが1mmほど出っ張っています。ここがローターと一緒に回ります。回転するローターのことをベルと言うこともあります。
2. シャフトの終端に磁気エンコーダが読み取るための磁石を固定します。
3. シャフトと磁石を固定するジョイントを設置します。
4. 外側に防磁のために鉄のリングで囲ってあげます。

![mag1-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/dee724c5-4cbe-2341-5e33-2efb13396b24.png)

防磁はホームセンターでスペーサーを買ってきて、2mmの高さになるように金鋸で切り出しました。

当初、防磁しないでモーターを動かしたところ、磁気エンコーダが値を読み取らなくなりました。

![IMG_6689.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/b61245ec-8e2e-46d0-6dba-fd17ebfbbc93.jpeg)

ジョイントは3Dプリンタで作りました。こんな感じで接続しました。磁石と防磁リングはちょっと緩かったのですが、磁力でくっついてくれました。回転速度によっては接着したほうがいいかもしれません。

![IMG_6669.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/f53592da-54cf-4f2c-0b8d-71d07a61b68c.jpeg)

モーターに台座をネジ止めします。磁石と磁気エンコーダを1mm弱くらいの距離で設置しました。できれば、AS5600をI2Cでステータス・レジスタ(0x0B)を読んで確認します。磁力が強すぎ(BIT3)・弱すぎ(BIT4)だとビットが立ちます。Bit5が立っていれば正常です。（詳細はマニュアルを参照してください。）

![mag5-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/508e20f4-13b3-1330-5038-7d93da68b2df.png)

横から見るとこんな感じになります。 ~~ネジが邪魔で磁石がちょっとしかみえませんね…~~ ネジを非表示にして、チップを追加した画像に差し替えました。

![bldc_cg2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/ae193dbd-0e77-9a55-92eb-c310396d944d.png)

# 組付け

CGだとこんな感じになります。

![bldc_cg1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/3e4de2d7-c1bf-4cef-20ed-b0b6ba076080.png)

動きがわかるようにステーをつけてます。

![IMG_6679.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/a789449c-13b0-60dd-7d4c-85b1bdf0c1ec.jpeg)

サイドビュー

![IMG_6685.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/6ec2da53-0405-99bf-41c7-0db7da28fb38.jpeg)

SimpleFOCMiniにピンヘッダーをつけ、それぞれケーブルで接続したところです。

![IMG_6687.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/ffe17b4a-cd22-f703-f07a-e102e49138a8.jpeg)

# 失敗談

当初、ドローン用ブラシレスモーターで動かそうとしていました。しかし、全く動きませんでした。

なぜ動かないか。ドローン用ブラシレスモーターは高速回転のためにホルマル線のターン数（巻数）を10〜20回くらいにしているようです。ターン数が少ないと高回転・低トルク・高電流になるそうです。SimpleFOCMiniはジンバルモーターを動かす目的なので、最大電流は3Aということで動かなかったわけです。

なおドローン用のESCは、高電流に耐えられるMOSFETが使われています。

そのあと購入した、今回使っているブラシレスモーターは、80ターンの低速・高トルクタイプです。

![IMG_6691.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/e9352401-f2dc-ab11-4fe0-d06910a1e3b5.jpeg)

# おわりに

モジュールをつなぐところまでいきました。

次回、コーディングしていきます。

https://qiita.com/8ga3/items/9448e5cb4ce6a69effb0
.comや.jpなどのトップレベルドメインを選ぶ際に気を付けること

おはようございます、しなもんです。

インターネットの世界において、ウェブサイトの住所となるのがドメインです。
そのドメインを構成する重要な要素が、**トップレベルドメイン**（TLD）です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927831/aeeabbc5-d0fa-1be8-433f-c10710dbfb72.png)


一般的に「.com」や「.jp」として知られるTLDは、実は数え切れないほど存在します。

世の中にはまだあまり知られていないTLDもたくさんあります。
* .dad（父）
* .foo（Googleが持つ開発用TLD）
* .ing（eat.ingのように、英単語動詞にバリエーションを付けられる。Google所有）
* .mobi（モバイル端末に対応したサイト専用）
* .pro（特別な申請が必要らしい）
* .shiksha（ヒンディー語で「教育」）

**これらのように変な？TLDがたくさん選べる現代において、選ぶときの注意点をまとめました。**

# SEOについてGoogleの見解

https://developers.google.com/search/blog/2015/07/googles-handling-of-new-top-level?hl=ja

> Q: 新しい gTLD は検索に影響しますか？Google は、新しい TLD が有利になるようアルゴリズムを変更しているのですか？検索において、新しい TLD はどの程度重視されるのですか？

> A: 基本的に、新しい gTLD も他の gTLD（.com、.org など）と同じように処理されます。検索において、特定の TLD のキーワードが有利に働くことも不利に働くこともありません。

新しいgTLDというのは、「技術的・財務的な要件を満たす組織が新しいgTLDの創設を申請できる仕組み」で誕生した新しいTLDのことです。

具体的には、`.music`や`.love`などが挙げられます。
Googleは、**これらのTLDについてSEOには関係が無い**と主張しているということです。

つまりは基本的にgTLDならSEOに影響はないという判断で大丈夫でしょう。

**ただ、ccTLD（`.jp`などの国別ドメイン）はSEOに関連するようです。**

# TLDによっては大きな問題がある

### 迷惑メールに飛ばされる
`.xyz`なんかは迷惑メールに分類されてしまうことが多いようです。

### リンクがブロック・ファイアウォールに引っかかる
TLDによっては、FacebookなどのSNSやRedditなどのオンライン掲示板でリンクがブロックされてしまう事例があるようです。
お手頃なドメインはスパム業者に使われがちということです。

### **SEO**

先ほどGoogleの見解で述べた通り、TLDによるSEOへの影響は限定的と考えられています。
しかし、.comや.jpなどの主要なTLDの方が、検索エンジンに有利とされる意見もあるようです。
 
### **費用**

TLDによっては、取得費用や維持費が高額な場合があります。

# 費用面で選びたくなっちゃうけど...

.tkや.mlなどの無料TLDも存在しますが、認知度が低く、信頼性が低いと判断される可能性があります。
実際、容易に取得が可能という点から、フィッシングサイトなどの温床となっています。
（実際に不正利用が絶えなさすぎてMetaがレジストラを訴えた事例がある）

# トラブルにあわないために（まとめ）

金銭面やジャンルで考えることも重要ですが、
やっぱりTDLは`.com`, `.org`, `.net`など人気で安定したドメインを選んでおけば間違いない気がします。

また、`.ing`, `.ai`などベンチャー企業が多く使っていたり信用できるレジストラのドメインも良いと思います。

`.xyz`などの格安ドメインは避けるべきです。
Node.js でキー入力を利用した効果音ポン出しをやってみる： Readline と play-sound を利用

ライブで映像配信を行う際やイベントを行っている中で、手動でボタンなどを押下したタイミングで効果音を鳴らすということができる、ポン出しと言われるものがあります。

ポン出しについて、業務用などに、それ用の機材もあったり、ソフトウェアベースのものもあったりします。

●ポン出し 機材 - Google 検索
　https://www.google.com/search?q=%E3%83%9D%E3%83%B3%E5%87%BA%E3%81%97+%E6%A9%9F%E6%9D%90&

今回は、そのような「ボタン押下で効果音を鳴らす」といった仕組みを、直近で試していた以下の内容を組み合わせて作ってみます。

●Mac で Node.js ＋ play-sound を使って MP3ファイルを再生してみる - Qiita
　https://qiita.com/youtoy/items/a744e3ca1d52cc9609c5

●【Node.js】入力されたキーが何かを音声で返すプログラムを作ってみる： Readline と Mac の Sayコマンドの組み合わせ - Qiita
　https://qiita.com/youtoy/items/a9efe31249760a4a3022

具体的には、「特定の 5つのキーのどれかを押すと、それに対応した効果音が鳴る」という動作のものを試作してみます。

## 利用する効果音
今回、お試しで使う効果音は、以下の Springin’ Sound Stock のものを使いました。

●演出 | 無料 BGM・効果音のフリー音源素材 | Springin’ Sound Stock
　https://www.springin.org/sound-stock/category/staging/

用いたものは、具体的には上記で提供されている効果音の中の、以下の 5つです。

- アナウンスチャイム1.mp3
- ジャジャーン1.mp3
- 笛ピー1.mp3
- スクラッチ4.mp3
- キュピーン1.mp3

## 実際に試してみる
それでは、実際に試してみます。

### プログラム
プログラムは、以下のとおりです。基本的に、冒頭で紹介していた 2つの記事で実装した内容を、混ぜ込んだような感じです。

動作としては、数字の 0 から 4 のキーのどれかを押すと、それに対応した効果音のファイルが再生される、というものです。

```javascript
const player = require("play-sound")((opts = {}));
const readline = require("node:readline");

const soundFiles = [
  "アナウンスチャイム1.mp3",
  "ジャジャーン1.mp3",
  "笛ピー1.mp3",
  "スクラッチ4.mp3",
  "キュピーン1.mp3",
];

function playSound(index) {
  if (index >= 0 && index < soundFiles.length) {
    const filePath = soundFiles[index];
    player.play(filePath, (err) => {
      if (err) {
        console.log(`エラーが発生しました: ${err}`);
      } else {
        console.log(
          `音声 ${index}（${soundFiles[index]}）の再生が完了しました`
        );
      }
    });
    console.log(`音声 ${index}（${soundFiles[index]}）の再生を開始しました`);
  } else {
    console.log("無効な選択です");
  }
}

readline.emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);

process.stdin.on("keypress", (str, key) => {
  if (key.ctrl && key.name === "c") {
    console.log("終了します");
    process.exit();
  }

  const num = parseInt(str);
  if (num >= 0 && num <= 4) {
    playSound(num);
  } else {
    console.log(`"${str}" は無効なキーです。0から4のキーを押してください。`);
  }
});

console.log("0から4のキーを押して効果音を再生してください（Ctrl + c で終了）");
```

上記で使われている処理に関する説明は、冒頭に記載した 2つの記事のほうをご参照ください。

### 動作確認
それでは、キー入力で効果音を鳴らす仕組みの動作確認です。

以下が動作確認中の様子で、数字の 0 から 4 のキーのどれかを押すと、それに合わせてそれぞれ別の効果音が鳴っていることが確認できます。

https://x.com/youtoy/status/1807387678478074145

今回は 1台の PC で完結させた構成にしましたが、外部デバイスとの通信の仕組みを組み合わせて、他デバイスからのポン出しを行えるようにしても良さそうに思いました。

また、以下の記事に書いた内容を組み合わせると、インターネット越しに効果音を鳴らすというようなこともできそうです。

●HTTPリクエストをトリガーに効果音がなる仕組みを Node.js で作ってみる（play-sound と Node.jsの標準モジュールの組み合わせ） - Qiita
　https://qiita.com/youtoy/items/5858fe378c42a705d2b4

#### 余談：プログラムの作成過程
余談ですが、上記を作る際には Anthropic の「Claude 3.5 Sonnet」を使って、2つのプログラムを混ぜ込むというのをやりました（プロンプトは、少し雑な感じのものになっていますが...）。
その結果に対しては、自分でさらに手を加えて、上記の最終版の内容としています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f59880f4-914b-9408-2f2a-2d6ec4281b21.png)

2つの個別に作った内容を、整合性をとりつつ 1つにする、という部分が楽に行えて便利でした。
情報検索の未来を探る：クロスエンコーダーの理解を深めるための統合勾配法

# 情報検索における重要なニューロンとは？クロスエンコーダーの理解を深めるための統合勾配法の応用

今回は、最新の研究成果である「Which Neurons Matter in IR? Applying Integrated Gradients-based Methods to Understand Cross-Encoders」という論文をご紹介します。この研究は、情報検索（Information Retrieval, IR）の分野において、クロスエンコーダーモデルの内部メカニズムを解明することを目指しています。

### 論文情報
- **タイトル**: Which Neurons Matter in IR? Applying Integrated Gradients-based Methods to Understand Cross-Encoders
- **リンク**: https://arxiv.org/abs/2406.19309v1
- **発表日**: 2024年6月28日
- **著者**: Mathias Vast, Basile Van Cooten, Laure Soulier, Benjamin Piwowarski
- **DOI**: [10.1145/3664190.3672528](https://doi.org/10.1145/3664190.3672528)

## 背景と目的
情報検索の分野は、BERTなどのトランスフォーマーモデルの登場により大きな進化を遂げました。しかし、これらのモデルは高い性能を発揮する一方で、その内部メカニズムがブラックボックスとして理解しにくいという問題があります。この論文では、統合勾配（Integrated Gradients）という手法を用いて、クロスエンコーダーモデル（具体的にはMonoBERT）の内部ニューロンの役割を解明しようとしています。

## 研究の焦点
この研究は以下の3つの質問に答えることを目指しています：
1. **特定のクエリに対して「関連性がある」または「関連性がない」と分類するニューロンを特定できるか？**
2. **ドメイン内（ID）データとドメイン外（OOD）データに関連するニューロンを区別できるか？**
3. **IRタスクにおいて重要なニューロンを特定できるか？**

## 実験の概要と結果
### 特定のニューロンの特定
研究の結果、クエリに対して「関連性がある」または「関連性がない」と分類する際に特定のニューロンが一貫して重要であることが確認されました。

### ドメイン内外のニューロンの違い
ドメイン内（ID）データとドメイン外（OOD）データに関連するニューロンは異なることが示されました。これは、IRモデルがトレーニングデータのドメイン外のデータに対して異なるニューロンを使用していることを示唆しています。

### 重要なニューロンの特定
統合勾配法を使用して特定した重要なニューロンを除去すると、モデルの性能が有意に低下することが確認されました。これにより、統合勾配法がIRタスクにおいて重要なニューロンを特定するのに有効であることが示されました。

## 結論と今後の展望
この研究は、クロスエンコーダーモデルにおけるニューロンの役割を理解する一助となるものであり、今後のIRシステムの設計に貢献することが期待されます。ただし、本研究はMonoBERTモデルに限定されているため、他のモデルにも適用することでさらなる理解が進むでしょう。

### 論文情報
- **発表日**: 2024年6月28日
- **著者**: Mathias Vast, Basile Van Cooten, Laure Soulier, Benjamin Piwowarski
- **DOI**: [10.1145/3664190.3672528](https://doi.org/10.1145/3664190.3672528)

### 賛否両論
**賛成意見**
- 統合勾配法をIRタスクに適用することで、モデルの解釈可能性が向上する
- 重要なニューロンを特定することで、モデルの性能向上や異常検知に寄与する可能性がある

**反対意見**
- 研究がMonoBERTに限定されているため、他のモデルにも適用する必要がある
- 統合勾配法の計算コストが高く、大規模なデータセットでの適用には課題がある

## まとめ
この論文は、情報検索におけるモデルの理解を深めるための重要な一歩です。IRシステムの性能をさらに向上させるための貴重な洞察を提供しており、今後の研究に大きな影響を与えることでしょう。興味を持った方は、ぜひ論文全文を読んでみてください！

この記事が皆さんの研究や実務に役立つことを願っています。ご質問やフィードバックがありましたら、コメント欄にお寄せください。
ECRのタグ付け方法

## はじめに
ECRを触ってみた際に、タグのつけ方が曖昧だったのでまとめてみます。

## ECRのタグ付け方法
前提として、AWS CLIをインストールしており、ECRのリポジトリは作成済みとします。

### sampleというリポジトリを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/44fc188c-707a-a34b-0112-33deb50784e5.png)

### ECRに認証するためのトークンを取得
以下のコマンドを実行することで、DockerクライアントはECRに対して認証され、ECRからイメージをプルしたり、ECRにプッシュしたりすることができるようになります。
このコマンドは「プッシュコマンドを表示」からも確認できます。
```sh
aws ecr get-login-password --region <your-region> | docker login --username AWS --password-stdin <your-account-id>.dkr.ecr.<your-region>.amazonaws.com
```

### イメージをbuild
```sh
$ docker build -t sample_image .
```

### イメージを確認
sample_imageという名前でTAGがlatestのimageが作成されていることが確認できます。
```sh
$ docker images

REPOSITORY               TAG       IMAGE ID       CREATED         SIZE
sample_image             latest    6bf51095a382   9 hours ago     43.2MB
```

### イメージにタグ付けする
新しくver1というタグが付いたものを作成します。
- sample_image:latest
sample_imageのlatestタグが付いているイメージを使用
- sample:ver1
sampleリポジトリにpushする際のタグをver1とする
```sh
docker tag sample_image:latest <aws_account_id>.dkr.ecr.<region>.amazonaws.com/sample:ver1
```

### 新しく作成したタグのイメージを確認
`<aws_account_id>.dkr.ecr.<region>.amazonaws.com/sample`でver1というタグをもつイメージが`sample_image`とは別に作成されています。
```sh
$ docker images

REPOSITORY                                                 TAG       IMAGE ID       CREATED         SIZE
<aws_account_id>.dkr.ecr.<region>.amazonaws.com/sample   ver1      6bf51095a382   10 hours ago    43.2MB
sample_image                                               latest    6bf51095a382   10 hours ago    43.2MB
```

### ECRにpushする
```sh
$ docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/sample:ver1

The push refers to repository [<aws_account_id>.dkr.ecr.<region>.amazonaws.com/sample]
9368046b8500: Pushed 
a51b172d7184: Pushed 
b7486fe26981: Pushed 
320c8baef084: Pushed 
d2cef4a1b224: Pushed 
4275164ce225: Pushed 
6e92270dbfe6: Pushed 
b5d2e1fcf1ad: Pushed 
af9a70194aa4: Pushed 
```

### ECRを確認
イメージタグがver1のものがpushされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/28e9b193-eda7-e839-6be5-acc961b43a8c.png)


## まとめ
今回はver1という名前にして、pushしましたが、タグ付けする際にver2やver3といったものを作成して、pushすればそれぞれのタグのイメージがpushされます。
タグでversionを管理したい方には便利だと思います。
【2024マラソン14】notゲーミングPCでPCVRを起動するとどうなるのか

# 何の記事？
quest単機でVRを楽しんでいた人が、PC VRに憧れを持ち、ゲーミングじゃないPCでPC VRを繋いでみました。

# 誰向け？ どんな役にたつ？
- ゲーミングPCではないけれどPC VRを体験してみたい人
- ゲーミングPCじゃなくてもPC VRできるんじゃない?試してみよーぜ!……と思う人
- 課金をせず試しにバーチャルデスクトップをやってみたい人

# あらすじ
quest単機でメタバースのclusterでの交流を楽しんでいたところ、「PC VRでログインをすると画質がとてもきれい」と言う話をしましたので、何とかPC VRでのログインができないかどうかを検索してみました。

# 繋がるまでにやったこと
### immersedでできるか
最初に試したのはimmersedというアプリ。
しかしこのアプリは、デスクトップの映像をVR空間に投影するものなので、VR機材側からPCの操作をすることはできませんでした。
実際、immersedとsteamVRを立ち上げてclusterを立ち上げるとVRでログインというボタンが出現することもあるのですが、結局ログインはできませんでした。

### 鉄板はVirtual Desktop
検索すると大体出てくるのか、Virtual Desktopと言うアプリです。
これを使うと、steamVRなどのパソコンを経由したVRゲームをプレイすることができます。
ただし、これは課金アプリのため、ゲーミングPC未所持の状態で買う気にはなりませんでした。

### questのデフォルト機能で繋げる?
quest linkやair linkなどの機能が使えるか模索しました。
調べてみると、どうやらパソコンの要求スペックがそれなりに高かったので、今回は接続を試すことすらできませんでした。

# 具体的に何を使ったか
#### ALVR

https://github.com/alvr-org/ALVR

今回調べていた際にバーチャルデスクトップと一緒に出てきたのがコレです。
git hubでダウンロードすればPCスペックなどで弾かれず、とりあえず試すことができる!

#### steamVR

https://store.steampowered.com/app/250820/SteamVR/?l=japanese

PC VRをする際に必須のようなので入れておきます。

#### sidequest

https://sidequestvr.com/

quest側にアプリケーションを落とす際に利用します。
これを使うと、questでDiscordをみたりもできます。
 
# 何をやったか
1. ALVRのインストール手順に沿ってPCとquestにそれぞれインストール
1. PC側でsteam vrを起動
1. quest側でALVRを起動
1. questでALVRが起動したら、左メニューボタンでPCのデスクトップを表示し、clusterを起動
1. clusterのVRでログインをクリック

# 結果
PCスペックが足りませんでした……！
画面が終始ガタ付き、ギリギリ画質を最低に下げればいけるか……？位。
参考までにガクツキ具合を録画したかったんですが、もはや録画起動もままならなかったので諦めました。
やはりゲーミングPCは偉大……orz
【2024マラソン13】BlenderやUnityいらず！cluster公式ツールでアクセサリを作った話

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/e3579162-c3a0-ee18-0bbb-3d0bd39bf228.png" width=300>

# 何これ？
これが……こうじゃ！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/5dd0c2ff-2922-cdbf-4bd2-57db4bbed128.jpeg" width=300>

# 何の記事？
cluster公式が、公式アップロードツールを使ってアクセサリを作るキャンペーンがあったので作成・応募してみました。

# 誰向け？ どんな役にたつ？
- clusterでアクセサリを作ってみたい人
- BlenderやUnityは詳しくないけclusterで使えるアイテムを作ってみたい人
- cluster公式ツールでどんなものが作れるのか気になる人

# あらすじ
BlenderやUnity、使えなくはないのですが、使わずに済めばこれ程楽なこともなく。
今回、お題企画とともに画像をアップするだけでアクセサリを作れるツールを出していたので、使って作ってみることにしました。

# clusterとは
VRゴーグルだけでなく、スマホやPCからもログインできるメタバースです。

https://cluster.mu

アバターを使って交流を楽しむのですが、そのアバターが身につけるアクセサリをcluster内にアップロードすることができます。

# 具体的に何を使ったか
#### cluster公式アップロードツール

https://creator.cluster.mu/2023/10/13/image2item/

テンプレートに添ってデザイン画像を作り、アップロードすることだけ!
簡単に3Dアクセサリが作れます。
BlenderやUnityの使い方を調べながら……えっと……とならずに済むので、とても助かるツールです。

#### clip studio

https://www.clipstudio.net/ja/

お絵描きソフトの1つです。
私がよく使っているのはこのソフトですが、今回の作成にあたっては、レイヤ分けできるペイントソフトであればなんでも構いません。

# 何をやったか
#### 1. 公式アップロード内の見本画像をclip studioで開く
作成ツールをダウンロードすると、sample画像や参考画像が入っているので、それをクリスタで開きます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/3bcf2114-c80d-7f0e-ac0c-3a9f5637643f.png" width=300>

#### 2. 見本画像に添って画像が繋がるように書き込む
sample画像を参考に、自分が作りたいデザインを描いていきます。
円形のデザインなどは左右が繋がるように気をつけて作ります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/5dfec0c4-e731-bd27-4548-f7d52139f0ea.png" width=300>

#### 3. 見本画像を消したものを保存
描き終わったら、参考にしたsample画像のレイヤを消したものを保存します。
ファイル形式はjpgかpngにします。

#### 4. アップロードツールを使用してアップロード
画像を選択後、透過の処理をどうするかを選択します。
選択したらアップロード。すぐにclusterで使えるようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/bc9ed8d2-a63c-c141-b429-acad7e70dd30.png" width=300>

#### 5. ゲーム内で使う
clusterのホームにログインし、アクセサリ編集画面に行って、【つくったもの】欄自分が作ったアクセサリが入っています。
cluster内で販売などを行わず、自分だけが使用する場合はここで終わりです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/88d91b55-68d3-27a3-42d3-88e63c784291.png" width=300>

透過処理などによって仕上がりが変わるので、同じ画像でもパターン違いをアップして仕上がりを確認するのもいいかと思います。

#### 6. ゲーム内で販売する
cluster内で他の人も使えるようにする場合、別途申請が必要です。
clusterのwebページを開き、申請しましょう。
問題なければ数日で審査が通ります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/766b5586-d2f6-0ff4-53d3-b185340ce37f.png" width=300>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/1e6858f5-3427-3470-c0a3-c83f5b8a5554.png" width=300>

#### 7. ストアで販売
申請が通ったら、すぐにストアに並ぶわけではなく、自分でストア販売を開始する必要があります。
申請が通るとcluster内のメッセージで公式からも案内がありますので、それを確認して、自分のタイミングで販売しましょう。
Twitterなどで宣伝できるタイミングに合わせて公開するのがいいかと思います。


# 結果
アクセサリを作りたい！……となった時にデザイン画像だけを作ることに集中できるのがとても助かりました。
また、作成イベントの他、直近でクリエイターさん応援イベントもあったので出店したところ、沢山の方の手にとって貰えて嬉しかったです。
自分が作った物が他の人に手に取ってもらえるのはやはり嬉しいですし、それを他の人がアクセサリとしてみにつけてくれるというのは他のことでは味わえない喜びがありました。
また、宣伝はTwitterなどでも行いましたが、やはりイベントで他の人の目に留まる機会を増やすのが効果が大きいと感じました。

# 余談
クリスタでタイムラプスや画像出力時にウォーターマークを入れて出力することができるようになっていました。
冒頭の画像はその機能を使ったものですが、マークを繰り返しにせず、端に一箇所かけるなども可能です。
クリスタの便利機能などについても書いていければと思います。
ABC360 日記

　新人競プロerの山田です。
　結果はABCDEの5完(5完以上は初)、1015位、perf1506でした。

### [A問題](https://atcoder.jp/contests/abc360/tasks/abc360_a)
　味噌汁問題。
　文字列の範囲をミスってバグとりで何十秒かこずっていたが3分18秒に提出。

### [B問題](https://atcoder.jp/contests/abc360/tasks/abc360_b)
　話題の出題ミス問題。
　山田はたまたまWAが出ることなく普通にAC。ただ山田はこういった「変数が多くなる問題」は苦手で、変数を書き間違えたりするミスにより15分12秒までかかった。

### [C問題](https://atcoder.jp/contests/abc360/tasks/abc360_c)
　荷物入れ替え問題。
　うわー苦手な動的計画法だと一瞬思ったが貪欲でいけることにすぐ気づいてすぐAC。B問題より簡単に感じた。所要時間約5分。

### [D問題](https://atcoder.jp/contests/abc360/tasks/abc360_d)
　蟻問題。
　こういう競プロ特有の問題（二分探索系）ですぐ思いつくようになったのは成長を感じる。所要時間約10分。

　4完達成時刻が21:29:59で、この時に順位見てみたら700位ぐらいだった記憶。今日は以前より調子がいいと思った。

### [E問題](https://atcoder.jp/contests/abc360/tasks/abc360_e)
　黒いボールの期待値問題。
　今日こそ5完してやるぞと開いたE問題。
　まず黒いボールがa回(0 <= a <= k)選ばれる確率とそのときの期待値を考え、aを動かして全部足すということを思いついた（後から気づいたが、aなどという変数を用意する必要は全くなかった）。2からn番目のボールの性質が同値であることを利用し、確率漸化式を駆使して、いろいろゴチャゴチャやって実装した。
 
　プログラムは完成したが入出力例が合わない。問題文を誤読していた。同じボールを選ぶことがないと思っていたが、実際は同じボールを選ぶことがあった。この時点で22時ジャストぐらいだった。

　確率の問題でミスったらプログラムのほとんどを書き直さなければならない。このまま時間切れとかなったら最悪だーっと思いながら計算しなおす。その途中で「黒ボールが選ばれる回数は考える必要がなく、確率漸化式オンリーで解けること」にも気が付いた。

　どうせまたどっかバグってるんだろうなと思いながらコードテストしたら全部合ってそのまま提出してACしてやったーーーー5完だーーってなった。

　22:22:20にAC。ペナルティはゼロ（奇跡）。
　この後F問題もちょっと考えたけど十数分でACできるわけないと思って離脱。
学習記事投稿の目的

## はじめに
この記事では、私がエンジニアリングに関する学習記事を投稿する目的、概要、および期待する効果について説明します。

## 目的
主な目的は、記事の作成を通じて自身の技術知識を深め、その知識を他者に伝えられるようになることです。加えて、新たなスキルを身につけ、特定の技術領域に関する専門知識を体系的かつ実践的な形でアウトプットとして共有することを目指しています。

## 対象読者
Webアプリケーション開発を行っている初学者から中級者のエンジニアに向けたものです。

### 期待する成果
記事を投稿することで以下のような成果を期待しています。

### 自身の知識向上:
記事を作成する過程で調査や実践を行うことで、技術的な理解を深めることができます。

### 新たなスキルの獲得:
記事を書くためには、調査や実装を通じて新しい技術やツールを学ぶ必要があります。この過程で新たなスキルを獲得することができます。

### コミュニティへの貢献:
自身の学びを共有することで、他のエンジニアの助けになり、コミュニティ全体の知識の向上に貢献することができます。

## まとめ
今後、私はエンジニアリングに関するさまざまな記事を投稿していく予定です。初学者から中級者のエンジニアに向けて、実践的で役立つ情報を提供し、共に成長していけるよう努力していきます。どうぞよろしくお願いいたします。
SOA模擬試験2-1

## SNS トピックの作成
以下追加だけではS3のイベント通知の設定で以下エラーが発生。
「Unable to validate the following destination configurations」


  "Condition": {
      "ArnLike": {
　      "aws:SourceArn": "arn:aws:s3:*:*:<S3バケット名>"
    }



## 結論
{
    "Version": "2012-10-17",
    "Id": "example-ID",
    "Statement": [
        {
            "Sid": "Example SNS topic policy",
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": [
                "SNS:Publish"
            ],
            "Resource": "<SNSのARN>",
            "Condition": {
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:s3:*:*:<S3バケット名>"
                },
                "StringEquals": {
                    "aws:SourceAccount": "<アカウントID>"
                }
            }
        }
    ]
}
Sequence Makerで文字化け👻が起きた時

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence MakerはExcelのシートにコマンドを書くだけで、測定器と通信できる手軽さがあります。ところで、測定器との通信をやっていると、時々文字化けに遭遇することがあります。応答データが何かおかしい・・・この記事ではそんな時の対応方法を解説します。Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## 文字化け👻
### 例
文字化けの多くは、測定器から日本語が含まれるデータを受信した際に起きます。例えばこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/833e0c80-8e89-5d65-008d-9adfa26c33dd.png)

これでは全くもって意味不明です。

### 原因
文字化けの原因は、文字コードが合っていないためです。Sequence Makerのデフォルトの文字コードはASCIIになっており、日本語の表示には対応していません。上記のケースでは測定器がUTF-8の文字コードでデータを送ってきているので、意味不明な表示になっています。

### 対応
Sequence Makerの文字コード設定を変更すれば解決します。「インターフェイス」設定の右下にある矢印をクリックして、詳細設定画面を表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/c43c0831-341b-bc82-ac76-cb8735ca90e8.png)

文字コードの設定があるので、適切な文字コードを選択します。よくわからない場合はとりあえずUTF-8で試してみて、それでもダメならShift-JISにしてみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/534def95-b396-00b3-0062-ddae938ab7b3.png)

### 結果
今回はUTF-8にしてみました。その結果、正常に表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/46a8934c-e2e4-b205-523d-07b1fc08e34f.png)


## まとめ
今回はSequence Makerで文字化けしたときの対応方法を解説してみました。文字コードはいろいろとややこしいですが、最近の測定器の多くはUTF-8でいろいろな言語に対応していると思います。少し古めの測定器だとShift-JISのものもあるかもしれません。文字化けが起きたときは参考にしていただければと思います。
業務知識の習得のために証券外務員二種を取得した話

## 経緯
1. 新しい配属先が証券業務の知識が求められる現場だった。
1. 配属前の面談で、証券外務員資格の勉強を通して業務知識を身につけた方が良いと勧められる。
1. 折角なので、資格を取ることにする

## 受験資格
- 誰でも受験可能
- CBT方式での受験（○×問題 or 5肢選択問題）
- ただし、平日しか受験できない（受けるには有給や振休の取得が必要）

## 申し込み方法
1. プロメトリックのIDを登録 [ID登録ページ](https://j7.prometric-jp.com/IdGet/IdNew?CN=JA&LC=JA)
1. ログインして受験会場、受験日を選択して申し込む [ログインページ](https://j7.prometric-jp.com/Reserve/Login?CN=JA&LC=JA)

日本証券協会のページは不親切で登録・ログインページまで行くのが面倒なので、上記のリンクから飛んだ方が良い。

## 勉強時間
- 期間は3週間ほど（割と場当たり的な受験だったため）
- 毎日電車での移動中にテキストを読む（1日あたり40分程度）
- 帰宅後はテキストを読むか問題集を解く（1日あたり1~2時間程度）

## 受験した所感
- 以下を頭に入れておけば、そこそこ推測できる
    - 顧客に不用意にリスクを負わせてはいけない
    - 自信の優位性を利用して儲けようとしてはいけない
- 計算問題もそこそこ出る
- 5肢選択問題をなるべく落とさないようにする
    - ○×問題：1問2点
    - 5肢選択問題：1問10点

## 結果と今後
- 無事合格（合格ライン：70%、結果：75%ぐらい）
- まだ仕事に繋げられている実感はあまりない（資料の語句の意味が理解できるようになった程度）
- そのうち一種も受けたい
【読書メモ】新人マネージャーの心得

明日から光栄にも管理職なのですが、管理職何もわからんので以下の本を読みました。
その読書メモです。
同じような人の参考になれば。

```
1.マネージャーの全仕事
2.エンジニアリングマネージャーのしごと
```

## 1.新しい職権を振りかざさない:scream:
- **権威や権限の扱い方をしくじる**のは新人マネージャーにありがちな失敗。権威は貯めて必要な時に使おう
- 相談しやすい関係を構築するために、**初回面談を2ヶ月以内**に行おう。部下が上司の存在になれるまで1週目からやらない方がいい
- 毎週1on1をしよう
- **自分の発言に気負いすぎるな。人の話をしっかり聞くのが重要**
- 準備ができていないチームに権限を与えるのは失敗あるある
- 主導権を握っているように見せようとして自分以外の誰かになってしまう。**素のままでいよう**

## 2.チームに自信と信頼を構築しよう:construction_worker_tone4:
- 意思決定のプロセスに入ってもらうとよい。組織や部署のビジョンを共有するのも効果的
- コミュニケーションは自分のタイミングで決めない。**相手にとってベスト**なタイミングで
- カルチャーフィットなどない。自分たちで合わせていこう

## 4.公私の時間を分けよう:house:
- 仕事は職場で終わらせる能力と意思を持つ。部下にも連絡がつかない時間は分かってもらおう
- 自分で実践することによってロールモデルになれる！

## 5.コツ:sparkles:
- 仕事の量は自分のキャパシティの85%にして。残りは緊急時に使えるように
- 評価面談で驚かれないように普段からフィードバックを返そう
- チームの進捗を常に見せる

## 6.マネージャーの目的:star:
- アウトプット = **チームのアウトプット + あなたが影響を与えた他のチームのアウトプット**
- タスクの説明責任、つまりタスクを**求められる品質で完了させることがミッション**
- **人を介してレバレッジをかける**
- 破壊的なものをチームに入れる盾となる

## 7.感想
謙虚さが一番大事なのかなと思いました。メンバーに仕えるイメージ。
引っ張っていくリーダーシップとの匙加減が難しそうです。
人を通してタスクを大きく終わらしていくってのは新しい目線でした。
気になったのは、
1on1を毎週やろうってどちらの本にも書いてあったけど部下目線だと嫌な気がする..
.ymlと.yaml、結局どっちが正しいのか問題にケリをつける

# 読み飛ばしてください

おはようございます、しなもんです。

yamlっていいですよね。読みやすいし、コメント書けるし。

実際、yaml形式のファイルは、構造化されたデータを記述するためのシンプルな言語であり、設定ファイルやデータファイルの記述に広く利用されるようになってきています。

しかし、そのファイルの拡張子として、`.yml`と`.yaml`の2種類が存在し、どちらを使うべきか悩む方も多いのではないでしょうか。

実際に3文字とそれ以外の拡張子が混合することで引き起こされる問題についてはこちらで述べています。

https://qiita.com/CinnamonSea2073/items/6ea8d2df624575bbf487

この記事では、業界におけるそれぞれの拡張子の使用状況、名前の由来、具体的な使い方などをまとめ、**結局どちらを使うべきなのか**調べてみます。

# 業界の使用状況

近年、様々な調査結果や統計データによると、`.yaml`より`.yml`の方がも広く使用されていることが分かっています。

調査会社RedMonkによる調査「State of DevOps」では、世界中のGithubリポジトリにおいて
**約7割のYAMLファイルが`.yml`拡張子を使用していることが報告**されています。

これらの結果から、業界全体では`.yml`の方が主流であると言えそうです。

# 由来

公式サイトによると、
> YAML (a recursive acronym for “YAML Ain’t Markup Language”) is a data serialization language designed to be human-friendly and work well with modern programming languages for common everyday tasks.

意訳すると、

YAML（"YAML Ain't Markup Language"（YAMLはマークアップ言語ではない）の頭文字）は、
人間にやさしく、一般的な日常的タスクのための最新のプログラミング言語とうまく動作するように設計されたデータ・シリアライズ言語である。

です。

そのまま拡張子にするのであれば、`.yaml`が正しいように思えます。

# 使用について

どちらもyamlファイルとして正しく認識され、問題なく処理できます。

ただ、以下のようなケースでは`.yaml`を使用するほうが良いと感じました。
* 正式なドキュメントや仕様書（あくまで正式名称はyamlであるため）
* xml等の似ている拡張子と区別し可読性を高めるため（4文字である利点を生かす）

# 結論

業界における使用状況や利便性を考慮すると、**基本的に`.yml`拡張子の使用が推奨されるべき**かなと思います。

ただし、上記で紹介したようなケースでは、`.yaml`拡張子の方が適切となる場合があります。

まあ最終的には、プロジェクトの規約やチームの慣習などを考慮し、チーム内でどちらにするかを規約として決め、それに従うのが良いかなと感じました。

迷ったら`.yml`って感じです。
Github Actionで草が生えてるか定期的にチェックする

## 概要

先日、以下の記事がトレンドに上がっているのを見ました。

https://qiita.com/_ken_/items/f3a5386287311fcc99fe

試しにやってみたのですが、contributes数を取得できておらず、うまく動作していなかったので改善してみました。

:::note warn
LINE Notifyの仕組みについてはこの記事では説明していないので、[元記事](https://qiita.com/_ken_/items/f3a5386287311fcc99fe)を参照してください。
:::

## Exploreで試してみる

https://docs.github.com/ja/graphql/overview/explorer

ここで実験的に試してみることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156096/b63e49a4-abfb-4e48-31b1-61059bf9f30c.png)

contributionCalendarのtotalContributionsでContributions数を取得することができます。contributionsCollectionの`from`と`to`は日程しか見ていないので、両方とも現在時刻で大丈夫です。ちなみに、`from`と`to`を省略すると全Contributions数、日にちを跨ぐとその期間の合計Contributions数が出力されます。

```graphql
query ($DATE: DateTime, $USER: String!){
  user(login: $USER) {
    contributionsCollection(from: $DATE, to: $DATE) {
      contributionCalendar {
        totalContributions
      }
    }
  }
}
```

Variablesの値は適当に変えてください。

```json:Variables
{
  "DATE": "2024-06-30T00:00:00Z",
  "USER": "tomo1227"
}
```

## Github Actionで実装

[元記事](https://qiita.com/_ken_/items/f3a5386287311fcc99fe)では、curlで行っていましたが、今回はGithub CLIを使用して書いていきます。Github CLIで書いた方が、シンプルに書くことができます。

また、[元記事](https://qiita.com/_ken_/items/f3a5386287311fcc99fe)では、本日中のコミットの中にmainまたはmasterブランチへのコミットがあるかどうかを確認していますが、本記事では、ブランチは関係なく、草が生えているかどうかをチェックしております。


```yaml
name: Check GitHub Contributions and Notify

on:
  schedule:
    - cron: "0 13 * * *" # 毎日22時に実行

jobs:
  check-and-notify:
    runs-on: ubuntu-latest
    steps:
      - name: Check for Contributions
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          DATE=$(date -u +"%Y-%m-%dT00:00:00Z")
          RESPONSE=$(gh api graphql -F DATE=$DATE -F USER=$GITHUB_REPOSITORY_OWNER -f query='
            query ($DATE: DateTime, $USER: String!){
              user(login: $USER) {
                contributionsCollection(from: $DATE, to: $DATE) {
                  contributionCalendar{
                    totalContributions
                  }
                }
              }
            }
            '
          )
          echo "Response: $RESPONSE"
          TOTAL_CONTRIBUTIONS=$(echo $RESPONSE | jq '.data.user.contributionsCollection.contributionCalendar.totalContributions')
          echo "Total contributions: $TOTAL_CONTRIBUTIONS"
          echo "TOTAL_CONTRIBUTIONS=$TOTAL_CONTRIBUTIONS" >> $GITHUB_ENV

      # LINEに通知(元記事から環境変数名と文言だけ変えました)
      - name: Send LINE Notification if No Contributions
        if: env.TOTAL_CONTRIBUTIONS == '0'
        env:
          LINE_TOKEN: ${{ secrets.LINE_TOKEN }}
          MESSAGE: "👮今日はまだコミットできていません!今すぐコミットしよう!!"
        run: |
          curl -X POST -H "Authorization: Bearer $LINE_TOKEN" -F "message=$MESSAGE" https://notify-api.line.me/api/notify
```

:::note info
以下のように`workflow_dispatch:`を追加すると、Github Actionを手動で試すことができます。

```yaml
on:
  schedule:
    - cron: "0 13 * * *"
  workflow_dispatch:
```
:::

実際にGithub Actionで動かした例です。

https://github.com/tomo1227/line-notify/actions/runs/9732317616/job/26857818135
「開発生産性の観点から考える自動テスト」を拝聴して

## 発表
「開発生産性の観点から考える自動テスト」：和田卓人 さん（[X](https://x.com/t_wada?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor)）

## 講演資料はこちら
https://speakerdeck.com/twada/automated-test-knowledge-from-savanna-202406-findy-dev-prod-con-edition

## 気づいたこと
- 前半部分はどこかで聞いた話を復習している感覚でしたが、改めて目的をちゃんと意識してテストコードをかけているか再確認する良い内容でした。
- 偽陽性と偽陰性の話も再認識した内容でしたが、最近直面したCITestの不具合などがこれにあたり対策の方向性の確認をしたり、また偽陰性の自作自演については、対象となるコードのロジックがテストコード側にも侵食してしまっている状態をたまに見かけたり、やってしまったりしていて、テストコードを後から書く場合に陥りがちなパターンだと、最近書いたテストをふりかえりと思いました。
- ユニットテストとテストサイズの話では、これまでユニットテストはテストコードで書き、結合テスト以上は、手動テストorE2Eテストで書くものだとふんわりとしたイメージをもっていましたが、そのイメージが壊され、テスト対象ごとに考えていく必要があると再認識することができました。
- モックを使うのか、実物を使うのかの話について、最近、AIを使ってモックを多用したテストコード量産していた際にあまり意味のあるテストをかけてない意識があったのですが、テストコードの目的をちゃんと考えテスト対象ごとに、変更しやすいテストにしていく必要があると再認識できました。

## メモしたこと
（画像はスライドより抜粋）
### 自動テストは生産性のエンジン
- 自動テストをコスト削減を目的に導入するとアンチパターンです
- 導入コスト、学習コストが嵩み、狙い通りにはいかない
- システム開発ではアジリティが大事
- アジリティとは世の中の変化についていくスピードのこと
- 自動テストは現状を固定するものではなく、変化を可能とするためにあるもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/815054/011c0bbd-7ebe-e6b9-3c20-b1067fbc07d8.png)

- 自動テストは信頼性の高い状態に保たなければならない
- テスト全体の1%に不具合があると信頼が損なわれる（Google本）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/815054/7893e09b-aeb3-ca5b-089b-a800a214a83f.png)

-　信頼を損ねる2つの状態 偽陽性と偽陰性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/815054/79a2ce4f-26d3-6db3-ec4a-700391b15da0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/815054/10d21662-f3b3-e57a-ac4e-ff9660413872.png)

### テストの実行結果は「情報」
-　信号機
-　失敗は２種類ある 例外とアサーション失敗
-　問題の特定「どこで、なにが、どのように」
### ユニットテストの定義がバラバラ
-　代わりに「テストサイズ」という考えを使うと良い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/815054/aed0db7d-746f-e715-beb2-44fc1e79674a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/815054/eb610fc5-1878-00ef-748b-e501383cf996.png)

## スライド内の参照書籍
https://booklog.jp/item/1/4873119650

https://booklog.jp/item/1/B07L2R3LTN

https://booklog.jp/item/1/4873119847

http://xunitpatterns.com/

https://booklog.jp/item/1/B0BLTG8Z9K

## さいごに
- オフラインでのエンジニア系イベントは初参加でした。
- オフラインだからこそ、発表者のプレゼンスキルの高さなどを体感することできました。
- 熱量のインプット量もオフラインの方が多かったので、足を運んで参加する価値があったと感じました。

以上です。
開発生産性カンファレンス参加レポート

## 初参加
- オフラインでのこういったエンジニアイベントの参加は初でした。
- 目的はTDDで有名な和田さんの講演を直に聞いてみたかったからです。そちらについては別の記事で感想を書かいております。


## 開発生産性カンファレンス2024
https://dev-productivity-con.findy-code.io/2024

開催日時
2024年6月28日（金）29日（土）9:40〜19:00（受付 9:00 ~ ）

開催場所
虎ノ門ヒルズフォーラム

## 会場の様子など
### セッション
- 各会場満員になるくらい多数の参加者の方がいました。
- 最初の基調講演は少し硬めの印象でしたが、他のセッションでは皆さんラフな格好で参加されている方が多かったです。
- 基調講演は英語でしたが、通訳機器の準備があり、しっかりと話を理解することができました。
![IMG20240629101813.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/815054/d58190c2-353d-9d7f-a50c-3285bb922199.jpeg)

- 基調講演の質問には[Slido](https://www.slido.com/jp)という質問ツールが導入されていて質問しやすさ、時間調整など配慮されていました。

- 講演会場は４箇所で、2日渡っての50のセッションが開催されてました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/815054/a773ad4e-fed3-a5b1-e7c7-4143ede05b4e.png)

### 企業ブース
- 講演以外にも企業ブースがあり、E2Eのテストツールを提供する会社やオライリーさん、Qiitaさんもブースを出されていました。
- 各ブースで簡単なアンケートに答えることでステッカーやお菓子、中には宇宙食があたるブースもありました。
- 企業ブースの間にはコーヒーコーナーが設置されていて、お茶やお弁当の配布までありました！すごい！
- 各講演のあとには、直接講演者に質問できる「Ask the Speaker」コーナーも設置されていて、直接質問できるとてもいいチャンスがあります。 毎回長蛇の列ができておりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/815054/8e6071cd-96af-31b0-ca6c-29f9b573ce31.png)

### 日程や配慮
- 「勤務時間内だと参加できない」「土日だと子育て世代が参加しづらい」両方の立場の方を考えて、金土２日間のこの日程になったそうです。
- このようなカンファレンスでは珍しく託児コーナーが設置されておりました。未就学児のみならず、小学生まであずかってくれるそうです。託児所のおかげで参加できた方も多いようで、このような取り組みが他の技術カンファレンスにも広がっていくといいですね！
- ワークスペースも用意されていて、講演の間に作業されている人たちがいました。なんともエンジニアらしいコーナーです笑


## また参加したい
- 直接聞くからこその熱量を感じられて学び多く楽しいイベントでした。また次回も参加したいと思います。


めっちゃ都会の中のオアシスが見えてました
![IMG20240629165603.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/815054/2140f6af-6565-27ff-1348-3b85ca6056a4.jpeg)
みんなの考えた最強のデータアーキテクチャの備忘録

# みんなの考えた最強のデータアーキテクチャの備忘録

2022/11/08開催、[みんなの考えた最強のデータアーキテクチャ](https://datatech-jp.connpass.com/event/258157/)の備忘録です。

内容としては、名前の通り最強のデータアーキテクチャはどういったツールを使用してどういう構成になるのか、発表者の方々が発表して議論するというものでした。  
登録者数は1224人で、当日は700名以上の方が参加されていました。

結論として、このデータアーキテクチャが最強！というものはなかったのですが、ツールとしては「dbt」と「snowflake」を使用した基盤が多いようでした。

> **dbt:** データ変換のツール。ELT※, ETL処理のTに当たる部分と言われることが多い。  
> [dbt公式サイト](https://www.getdbt.com/)
> 
> **snowflake:** DWH(データウェアハウス)に該当するもの。  
> [snowflake公式サイト](https://www.snowflake.com)
> 
> ※ Extract, Load, Transform の頭文字をとってELT

## イベントの中で印象に残った内容

- データ基盤は組織によって最適解が変わる
- データ基盤構築を目的にしてはいけない、あくまでデータ分析の手段
- 最適なアーキテクチャを作るための最適な組織づくりに関する話題
  - 「逆コンウェイの法則」に基づき組織のアーキテクチャを考える
    - **コンウェイの法則:** システムはそれを設計する組織の構造を模倣したものになる
    - **逆コンウェイの法則:** 望ましいアーキテクチャを導くような組織を作る
- BigQuery(GCP) vs snowflake
  - サポートが充実しているのはsnowflake。BigQueryはサポートがあまりよくない印象。(発表者A)
  - BigQueryだとAWSが使えない。(発表者A)

業界的に技術の移り変わりが激しいので、引き続きキャッチアップしていきたいなと思います。また、前職ではMongoとPython、個人ではPythonとGCPでの簡易的なデータ基盤構築をしたことしかないので、時間を見つけて「dbt」と「snowflake」を使用した基盤も作っていきたいです。
社内のAPI仕様書とにらめっこして認証APIを切り替えたお話

# はじめに

ひょんなことから担当システムの認証APIを切り替えることになりました。
別APIを利用することになるので仕様書を見つめる日々が続きました。この経験は初めてだったので所感をまとめておきたいと思います。


# 仕様書があるって素晴らしい
仕様書を作ってくれてありがとうございます。に尽きます。
既存の処理とあまり変わらない部分もあれば、パラメータ周りが大きく変更されていたりしました。

# 必要な処理が未実装だったり、レスポンス内容が十分でなかった
APIを切り替える話が挙がった時点で判明していた点もあれば、切り替え作業中に判明した点もありましたが、API開発チームの方に都度質問や相談を行い対応いただきました。

# API切り替えのタイミングでリファクタリングもしてしまおう
共通化されていなかったり、テストが書かれていなかったのでこの機会で一緒にやっつけました


# おわりに
仕様書を見ながらテスト駆動開発で実装していくのは楽しかったです。
こちらから改修依頼のマージリクエストを送れるくらいの力が欲しかったです。
Sequence Makerで測定器に送るコマンドを書く時のコツ

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence MakerはExcelのシートにコマンドを書くだけで良いのですが、書き方にちょっとしたコツがあります。この記事では送信と受信をうまくコントロールする方法を解説します。Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## コマンドの基本的な書き方
### 測定器の設定など送信だけするコマンド
送信だけをする場合は、そのコマンドをExcelのシートに書くだけでOKです。例えば周波数を1kHzに設定するようなコマンドは、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/20275464-790e-f566-3d64-36defa700c23.png)
のように書きます。電圧を123Vに設定するようなコマンドは、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/d9a2ed28-8957-c28b-cce0-725aa133ccc0.png)
のように書きます。なお、コマンド名は測定器によって異なりますので、制御したい測定器の通信コマンド取説などを参照しましょう。

### 測定器から測定値を取得するなど送信と受信をするコマンド（クエリー）
送信と受信したい場合も、Excelのシートに書くだけでOKです。多くの測定器では、データを受信するコマンドは「?」が付いています。Sequence Makerでは「?」が含まれていると、自動的に受信もしてくれるので、そのまま書けば良いというわけです。例えば、測定値を受信するコマンドは、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/98fd466a-dd1b-a4f3-dbe4-c221ca04699e.png)
のように書けば「MEAS?」というコマンドを測定器に送った後、測定器からのデータを受信し、結果を右側のセルに表示します。上記の例では「123456」という値が返ってきたことになります。

## コマンドの応用的な書き方
多くの場合は上記の「基本的な書き方」で良いのですが、測定器によってはちょっと工夫が必要な場合があります。例えば…

- 通信コマンドの先頭に「#」が含まれている（Sequence Makerのコメントになってしまう）
- 設定コマンドを送った後、測定器から「OK」や「NG」などの応答が返ってくる（?が無いのに受信動作が必要）
- *TRGというコマンドを送った後に、受信動作が必要（?が無いのに受信動作が必要）
- READ?と送った後に、*TRGを送ってから受信する必要がある（送信の後、受信動作をせずに次のコマンドを送る）
- コマンドを送らずに、受信だけしたい（測定器が測定値を勝手に出力してくる）

こういったケースに対応するには、Sequence Makerの専用コマンドを使用する必要があります。コマンドの送受信に使うのは以下の専用コマンドです。

| コマンド | 内容 |
|:-|:-|
| #SEND(コマンド)  | 指定されたコマンドを送信します。<br>コマンドに?が含まれている時は受信動作を行い、受信したデータをコマンドの右側に出力します。<br>Excelのセルに直接コマンドを書いたときと同じ動作をしますが、#で始まるコマンドも送信することができます。  |
| #QUERY(コマンド)  | 指定されたコマンドを送信した後、受信動作を行い、受信したデータをコマンドの右側に出力します。<br>コマンドに?が含まれていないコマンドでデータを受信したいときに使用します。<br>#で始まるコマンドも送信することができます。  |
| #WRITE(コマンド)	  | 指定されたコマンドの送信のみ行います。コマンドに?が含まれていても受信動作を行いません。<br>送信のみ行いたいときに使用します。<br>#で始まるコマンドも送信することができます。  |
| #READ?	  | 受信動作のみ行います。<br>通常はコマンドに?が含まれていると自動的に受信を行いますが、?が含まれていなくても応答を返すようなコマンドを送った後に、#READ?と書くことで強制的に受信できます。<br>コマンドを送らずに受信のみ行いたい時にも使用できます。  |

（https://sequencemaker.hioki.com/manual/ja/#command より引用）

先ほどのケースに対応するために、専用コマンドを組み合わせて書くと以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/7f464926-02c9-35cb-e031-9950447d4758.png)

## まとめ
この記事ではSequence Makerでのコマンドの書き方のコツを解説しました。ちょっと特殊なコマンドの場合でも、専用コマンドと組み合わせることで、多くのケースに対応できるかと思います。
No module named 'pandas'の解消

### 概要
Jupyter Labでimport文を実行したところ、No module named 'pandas'という結果が返ってきたので対応します。

### 背景
miniconda×Jupyter Labでデータ分析環境を作成して、「いざ分析…」ということで、
ライブラリ（今回はPandas）をimportしようとしました。

以下のimport文を入力したところ、

```python
import pandas as pd
```
以下のエラーが出ました。

```
No module named 'pandas'
```

#### 1. Pandasのインストール状況を確認する

まず最初に、Python環境にPandasがインストールされているかどうかを確認します。
コマンドプロンプトを開いて以下を実行すると、

```bash
pip show pandas
```

以下の結果が返ってきました。
```bash
Package(s) not found: pandas
```


Pandasがインストールされていない場合、インストールする必要があります。

#### 2. Pandasのインストール

Pandasをインストールするには、以下のコマンドを使用します。

```bash
pip install pandas
```

このコマンドを実行することで、PandasライブラリがPython環境にインストールされます。

#### 3. IDEやJupyter Notebookの再起動

Pandasをインストールした後は、使用している環境（Jupyter LabやIDE）を再起動します。
これにより、環境がPandasを認識し、正常に動作するようになる場合があります。

Jupyter Labを再起動後、以下を実行するとimport文を正常に実行することができました。

```python
import pandas as pd
```


#### 補足：仮想環境を使用している場合

もし仮想環境（virtualenvやcondaなど）を使用している場合は、その仮想環境にPandasをインストールする必要があります。
仮想環境に切り替えた後に、再度Pandasをインストールしてください。


#### まとめ

「No module named 'pandas'」のエラーは、Pandasが正しくインストールされていないか、Python環境がPandasを認識していないことが原因でした。

これでPandas等のライブラリをimportできるようになったので、使えるようになったライブラリを使って分析を行っていきます。
【VSCode】カーソルにアニメーションを設定する方法

`editor.cursorSmoothCaretAnimation`を有効にするとカーソルの移動がアニメーションになります。

```jsonc:settings.json
  "editor.cursorSmoothCaretAnimation": true
```

![画面収録 2024-07-01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/e109dbc5-cde4-d1aa-c8f2-2fbd20a69e70.gif)

`editor.cursorBlinking`でカーソルのアニメーションを変更できます。

```jsonc:settings.json
"editor.cursorBlinking": "expand"
```

![画面収録 2024-07-01 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/1e181bda-38e8-f903-ba2a-f0c2c402228d.gif)
クローンアプリを作ってみたーNetflixクローン④

# はじめに
初めまして！
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい！自分が学んだ足跡を残していきたい！と思い記事を書きました！
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:
その中でもこれってどういう意味？とかつまづいたところを念入りに書いていこうかと思います。:fist:

# 今回の目的
nextjsはまだですが、実際のアプリ開発からどう作られていくかを学んでいくためにクローンアプリを開発します。
とは言っても自分で考えることは特になくYoutubeを見てやっていきます。
その中で覚えておきたい部分を分類ごとに記載していきます。なので、その時々に知ったことを小出しにしていく形になります。

前回

https://qiita.com/mr_noppo/items/0d90ac88f3477ffbb371

# 使用したものや事前準備
・Macbook Pro
・Visual Studio Code

# 使用にさせていただいた動画

https://www.youtube.com/watch?v=mqUN4N2q4qY&t=4201s

# Next.jsの知識
### bcrypt
#### compare
ハッシュ化されたパスワードと平文パスワードを比較する。
```ts
await compare(
    credentials.password, 
    user.hasehdPassword
);
```
bcryptはハッシュ値にソルトされた回数が記載されているので、それを元に平文パスワードと比較ができる
下記の場合、bcryptのバージョンが2で12回ソルトされている。
```ts
$2a$12$saltsaltsaltsalt$hashvaluehashvalue
```
### next-auth
#### signIn
api/auth/[...nextauth].jsで設定したプロバイダー(今回で言うとCredentials)を呼び出して認証処理をする。
redirectをfalseにしているため、callbackUrlにはリダイレクトしない。
```ts
await signIn("credentials", {
    email,
    password,
    redirect: false,
    callbackUrl: "/"
});
```
### import NextAuth from "next-auth/next";
設定オプション（必須ではない）
#### pages
デフォルトの認証ページをカスタマイズするURL
``ts
// サインインページのURLをデフォルトのものから "/auth" に変更
pages: {
    signIn: "/auth" 
},
```
#### debug
デバッグログを有効にするか
```ts
debug: process.env.NODE_ENV === "development"
```

#### session
セッション管理の設定
WT（JSON Web Tokens）形式でクライアントサイドに保存

#### jwt
JWTトークンを生成する際の設定

#### secret
next-auth 全体で使用される秘密鍵を指定

### import { useRouter } from "next/router";
内部リンクとして利用する
```
const router = useRouter();
...
router.push('/about');
```

### react-icons
豊富なアイコンをそろえたライブラリ

https://react-icons.github.io/react-icons/

### GithubProvider | GoogleProvider
[...nextauth].tsでプロバイダーに記述。

```ts
import GithubProvider from "next-auth/providers/github";
import GoogleProvider from "next-auth/providers/google";


providers: [
    GithubProvider({
        clientId: process.env.GITHUB_ID || '',
        clientSecret: process.env.GITHUB_SECRET || '',
    }),
    GoogleProvider({
        clientId: process.env.GOOGLE_ID || '',
        clientSecret: process.env.GOOGLE_SECRET || '',
    }),
...
```

### npm install @next-auth/prisma-adapter
外部認証後にユーザー情報などをprismaに保存するライブラリ

# 次
まだ
Azure Load Balancer Admin Stateを試してみる

Azure Load Balancerでバックエンドプール内の特定のVMにアクセスさせたくない場合、これまではVMのNSGをいじるなどLoad Balancer外で制御する必要がありました。
Admin Stateを使うことで、Load Balancer側から簡単にアクセス制御をすることができるようになったため、この機能を実際に試してみます。

# 構成
* バックエンドプールには3台のVMを配置し負荷分散する構成としています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/d7474552-9a35-a0f3-aa43-2d122c2147e4.png)

# Admin State
* Up,Down,Noneの3つの状態を指定できます。デフォルトはNoneです
    * none：正常性プローブに従う
    * Down：正常性プローブを無視して通信を拒否する
    * Up：正常性プローブを無視して通信を許可する

# プレビュー機能オプトイン
* 2024年6月時点ではプレビュー機能なのでオプトインします
* Azure Portalからサブスクリプションを選択、左メニューから[プレビュー機能]を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/0a5dc312-2c3d-5b56-dda7-9e62a40dc54a.png)

* [Allow Admin State for Azure Load Balancer]をチェックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/0667ec93-f1d0-8ff0-c8ff-41b90583c804.png)

* [登録]を押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/00737403-86b7-4776-7323-873085d08676.png)

* 状態が[登録済み]になればOKです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/17b687f4-7ff3-1f45-607f-248194fd7d36.png)

# down設定
* down設定では **正常性プローブを無視してインスタンスへの接続を拒否** します
* ロードバランサーの左メニューより[バックエンドプール]を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/b4cdae93-9947-037f-7755-a742aece1156.png)

* 今回はバックエンドプールにVM3台を準備しました。一番右の列の[管理者の状態]に注目です
    * プレビューだからなのか、列が表示されたり表示されなかったりといった挙動になりました。リロードすれば表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/e226de1e-f6b5-6345-ac56-0f6dfba5b6a4.png)

* [なし]を選択すると、管理者状態を編集できる画面に遷移します。プルダウンで選択できるため、まずは[down]の挙動を試してみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/b6f55571-649f-b27b-70ee-0ad720aa2e93.png)

* 左メニューから[分析情報]を見てみると、downにしたVMがアクセス不可になっていることが分かります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/a1f3b862-aaaf-ea8a-a20d-c963c41ff3f7.png)

* Health statusは[Unhealthy]となり、正常性プローブが失敗したときと同じ挙動となりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/ac9a36ef-f2f7-45fe-a724-5d1eb2e7715c.png)

# Up設定
* 次にUp設定を試してみます。Up設定では **正常性プローブを無視してインスタンスへの接続を許可** します
* まずは、VM1がNone、VM2がNone、VM3がDownの状態から、VM2の正常性プローブを異常状態にしてみます
* 当然VM2がUnhealthyになり、VM3もDown状態のままです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/de8985ed-1b3f-a4cb-3b6e-6150258359cd.png)

* 次にVM2をNoneからUpに変更します。正常性プローブは異常ですが、Admin StateはUpという状態です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/475a6e58-67dc-cab0-ec7c-b16ed508607b.png)

* 正常性プローブがうまくいっていないにも関わらず、正常な状態になっています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/b4f99c62-40f2-3abd-bf9f-92d466e9aa26.png)

# まとめ
* Admin Stateを用いることで、Load Balancer側から通信許可、拒否の制御をすることができました
Load Balancerだけで制御できるのはとても便利ですね
動作的には正常性プローブと同じ挙動を示すので、正常性プローブが失敗しているのか、Admin Stateが設定されているのかは見極める必要があるかなと思います