OmniAICreator/Qiita-1.07M huggingface dataset:
The Saliency of Anomalies in Animated Human Characters(2010)

### The Saliency of Anomalies in Animated Human Characters(Jessica, 2010)

http://graphics.cs.cmu.edu/projects/MMM/mmm_files/HumanCharacters.pdf



#### Q:この論文の概要を教えてください
#### A:
この論文は、アニメーションされた人間のキャラクターにおける異常の顕著性について調査したものです。研究者たちは、アニメーションされたカップルの口論を描いた3つのビネットを作成し、それぞれに異なる種類のアニメーション異常を含めました。短いクリップを使用した2AFCタスクと、長いビネットを使用したアンケート調査を行い、異常の種類がどの程度顕著であるかを比較しました。研究結果は、顔の異常が最も顕著であること、音声や顔のアニメーションの有無が感情的影響に影響を与えること、Uncanny Valleyが多次元的なものであることを示しています。これらの結果は、将来のバーチャルキャラクターの設計に役立つことが期待されます。

#### Q:この論文の主な貢献を3つ挙げてください
#### A:
この論文の主な貢献は以下の通りです。

1. 顔の異常が最も顕著であることを明らかにしたこと。
2. 音声や顔のアニメーションの有無が感情的影響に影響を与えることを示したこと。
3. Uncanny Valleyが多次元的なものであることを示し、将来のバーチャルキャラクターの設計に役立つことを示したこと。

#### Q:この研究の限界と今後の課題はなんですか
#### A:
この研究の限界と今後の課題は以下の通りです。

1. 研究は比較的小規模であり、より多くの参加者を含めた研究が必要であること。

2. 研究は1つのジャンルに焦点を当てており、他のジャンルにおけるアニメーションの異常の顕著性については調査していないこと。

3. 研究はアニメーションの異常の顕著性についてのみ調査しており、Uncanny Valleyのメカニズムについてのより包括的な理解には至っていないこと。

4. 研究は静止画像ではなく動画を使用しているため、静止画像におけるアニメーションの異常の顕著性については調査していないこと。

5. 研究はアニメーションの異常の顕著性についてのみ調査しており、アニメーションの異常を修正するための具体的な方法については議論していないこと。

今後の課題としては、より大規模な研究を行い、異なるジャンルにおけるアニメーションの異常の顕著性について調査すること、Uncanny Valleyのメカニズムについてより包括的な理解を得ること、静止画像におけるアニメーションの異常の顕著性について調査すること、アニメーションの異常を修正するための具体的な方法について議論することが挙げられます。

#### Q: 「不気味の谷」仮説とは何か、そしてバーチャル・ヒューマン・キャラクターとの関係は？
#### A:
1970年に森によって提唱された「不気味の谷」仮説は、バーチャルな人間のキャラクターがよりリアルになるにつれて、視聴者の感情的反応が共感から反発や拒絶に変わるポイントがあることを示唆している。このポイントは「不気味の谷」と呼ばれ、キャラクタの外見や動きがほとんど人間に似ているが、まったく似ていないときに発生するという仮説が立てられている。これは、映画やゲーム、その他のアプリケーションにおけるバーチャル・キャラクターのデザイナーにとって問題となる可能性がある。

#### Q:研究者たちは、実験に使われたアニメーション・ヴィネットをどのように作成し、どのような異常が含まれていたのだろうか？
#### A:

研究者たちは、モーションキャプチャーのデータを使って、顔、目、髪、体の詳細な動きを持つ、言い争うカップルの3つのアニメーションを作成した。その中には、誤った視線、固い体の動き、左右非対称や誤った唇の同期などの顔の異常など、登場人物の動きにいくつかの異常が含まれていた。研究者たちはまた、どの異常が最も視聴者の注意を引くかをテストするために、異なる異常の組み合わせでビネットのバリエーションを作成した。ビネットは感情的な内容（怒り）で、長さは約30秒である。研究者たちはまた、ビネットから3～5秒を抜粋した短い「クリップ」を作成し、2AFC（二者択一強制選択）課題において、さまざまな顔や体の異常を描いた短いクリップにおけるバーチャル「俳優」のパフォーマンスを比較した。

#### Q:知覚実験の主な結果はどのようなもので、今後のバーチャル・キャラクターのデザインにどのように役立つのでしょうか？
#### A:
知覚実験の主な結果は以下の通り：


1. 顔の異常は、特にベル麻痺のような病状に似ている場合に最も顕著であり、アニメーションにおいて最も力を入れるべき場所であることが示された。
2. 音や顔のアニメーションの有無の相互作用は、感情的な影響に関する質問に対する回答に影響を及ぼし、不気味の谷をモデル化する試みは、複数の次元を考慮に入れなければならないことを示している。
3. 顔の異常は、体の動きの異常よりもはるかに不穏であり、不気味の谷が注意の影響を受ける可能性があることを示している。
4. この結果は、不気味さの複雑で多次元的なモデルを指し示すものであり、谷である可能性は低く、むしろパラメータ化可能な空間である。


これらの知見は、リアルな顔のアニメーションを作成する努力を優先すること、アニメーションの異なる次元（音や顔のアニメーションなど）の相互作用を理解すること、バーチャルキャラクターにおける不気味さの多次元的な性質を考慮することの重要性を強調することによって、今後のバーチャルキャラクターのデザインに役立てることができる。さらに、この分野での今後の研究は、バーチャル・キャラクターのデザインの指針となる、より包括的な不気味さのモデルを開発することに焦点を当てるべきであることが示唆された。
【SwiftUI】ScrollViewのインジゲーターを意図的に表示させる（iOS17）

# はじめに
iOS17で`scrollIndicatorsFlash`というモディファイアが追加されました。
これはScrollViewのインジゲーターを意図的に表示させることができる機能になります。

# サンプルアプリ
ボタンをタップするとScrollViewのインジゲーターが表示されることがわかります。

![Simulator Screen Recording - iPhone 15 - 2024-01-25 at 21.06.26.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/ff442f1c-c77e-5e41-1b24-0b8135cd04c7.gif)

# 実装
```diff_swift
import SwiftUI

struct ContentView: View {
    @State private var trigger = true
    
    var body: some View {
        ScrollView(showsIndicators: true) {
            VStack {
                Button {
                    trigger.toggle()
                } label: {
                    Text("ScrollViewのインジゲーターを点滅させる")
                }
                
                ForEach(0..<100) { _ in
                    Text("テキスト")
                }
            }
            .frame(maxWidth: .infinity)
        }
+       .scrollIndicatorsFlash(trigger: trigger)
    }
}
```

# おわり
機能としてはかなり地味ですね笑
使う場面としては、ScrollViewだとわかりにくいUIなどの時にインジゲーターを点滅させてあげて知らせるとかですかね
【StreamDiffusion】TensorRTをオンにするまでのエラー対応備忘録

# 環境
Windows 11 Pro
CPU：Core i9-13900KF
GPU：GeForce RTX 4090 24GB
メモリ：64GB

Python：3.10.11
CUDA：11.8
cuDNN：8.9.7
PyTorch：2.1.1

# StreamDiffusionインストール
これ通りに進める。

https://github.com/cumulo-autumn/StreamDiffusion

問題なく動かせたけど、conda環境でもvenv環境でもTensorRTをONにするための
`python -m streamdiffusion.tools.install-tensorrt`
で
```
python.exe エントリポイントが見つかりません
.conda\envs\NAME\lib\site-packages\nvidia\cudnn\bin\cudnn_cnn_infer64_8.dll
```
のようなエラーが出る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/2f25ecea-4881-9a7b-bc12-58e41d711476.png)
![https3A2F2Fprod-files-secure.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/6215b263-6cf2-7be8-6a92-25caaff83f47.jpeg)

CUDAとかのパスとかはちゃんと通ってたので困ってたところ、

:::note info
「StreamDiffusion\venv\Lib\site-packages\nvidia\」にある「cudnn」ディレクトリの名前を、「cudnn.bak」等に変更してください。これによって参照されるcuDNNの場所が変更されて、エラーのダイアログが出現しなくなると思います。
:::

https://note.com/mayu_hiraizumi/n/nd163c54bf333

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/b82444ce-5d2f-d17e-f0cf-bc66af3fd0fe.png)

ありがとうございます。


# 出たエラー集
結果的にフォルダ名の変更で全部解決できたのですが、記録として以下を残しておきます。

「python.exe エントリポイントが見つかりません」と表示されていたけど`tensorrt`をオンでやってみた
```
ModuleNotFoundError: No module named 'polygraphy' Acceleration has failed. Falling back to normal mode.
```
→`polygraphy`をインストールしてみるか。

`pip install polygraphy==0.47.1`とするとそんなバージョンないよというエラー。
```
ERROR: Could not find a version that satisfies the requirement polygraphy==0.47.1 (from versions: 0.0.1.dev4, 0.0.1.dev5, 0.48.1, 0.49.0)
ERROR: No matching distribution found for polygraphy==0.47.1
```

じゃあ`0.48.1`か`0.49.0`をインストールすると
```
AttributeError: module 'polygraphy.backend.trt.util' has no attribute 'get_bindings_per_profile'
```
→polygraphyのバージョンが合ってないと起こるらしいエラー。


それで、`README`にある
`python -m streamdiffusion.tools.install-tensorrt`
だと、`polygraphy`の`0.47.1`がインストールされるみたい。

CUDAの別バージョンをインストールし直そうとしたりしたけど必要なくてよかった。

# 終わりに
エラーを検索してこの記事に辿り着いた人に幸あれ。
最近よく聞くRAGってなに？

### イントロダクション
皆さん、初めまして。ほうれん草です。
この記事は私の初投稿となりますので、まずは軽く自己紹介から始めさせてください。
私は2023年に新卒でエンジニアとしてのキャリアをスタートし、
現在はSaaSプロダクト開発のスクラムチームに所属しています。
主にC#をはじめ、JavaScript、React、AWSなどを使った幅広い業務に従事しています。
入社前はほぼ初心者でしたが、研修や日々学びながら楽しいエンジニアライフを過ごしています。

### RAGとは？
私は、生成AIのブームに興味を持ち、Twitter等でキャッチアップをしています。
その中でも最近よく耳にするのが「RAG」ではないでしょうか。


:::note info
RAGとは
Retrieval-augmented Generationの略

外部の知識ベースから事実を検索して、最新の正確な情報に基づいて大規模言語モデル（LLM）に回答を生成させることで、ユーザーの洞察をLLMの生成プロセスに組み込むというAIフレームワーク
:::

つまり、LLMの知識を補うために外部の知識を加えることでLLMの生成の質を向上させることができるのです。

RAGの利点は２つ挙げられます。
* モデルが信頼できる最新の情報にアクセスできること
* モデルの生成内容が正確であるかが保証されること

たしかに私もChatgptで生成した内容が本当に正しいのかどうかは感じたことがあり、その点RAGで情報の正確性が保証されていると安心です。

私はこのRAGを使って会社のドキュメントなどの質問をすると答えてくれるようなシステムを作りたいです。もちろんセキュリティには注意しないといけないと思います。

この記事を通じて、Retrieval-augmented Generation（RAG）という興味深い技術について少しでも理解を深めていただけたなら幸いです。

つたない文章を最後までお読みいただき、本当にありがとうございました。今後ともご愛読いただけると幸いです。皆さんからのコメントやフィードバックもお待ちしています。

次回の記事でまたお会いしましょう！
HelloWorld本 第3章

# システムコールの流れ

- アプリケーションはシステムコールラッパーを呼び出す
- システムコールラッパーはレジスタに引数を設定し、システムコール命令を実行する
- SAVE_ALLでレジスタを保存し、*sys_call_table(, %eax, 4)でドライバやファイルシステムのコードを実行する。RESTORE_REGSでレジスタを復元し、システムコールの戻り値をeaxで返す
- システムコールラッパーはシステムコールの戻り値をアプリケーションに返すが、戻り値が負の場合は符号反転した値をerrnoに設定して-1を返す

# カーネルがerrnoを変更しない理由

- errnoは標準Cライブラリのグローバル変数であり、ユーザ空間に存在する
- errnoのアドレスはアプリケーション毎に変動する

# システムコールの引数の制限

システムコールの引数はレジスタ渡しの為、個数に制限がある。
システムコールラッパーは構造体のポインタを渡すことで対処する。

# システムコールの追加

システムコールを追加する時、2つの選択肢がある。

- 既存のシステムコールは変更せず、新たな番号と名前を用意する
- 既存のシステムコールの名前を変更して、新たな番号だけ用意する

システムコールラッパーの呼び出し先(eax)を修正する必要はあるが、既存のシステムコールの番号は変更されない為、前方互換性を持つ。

# システムコールの負の戻り値

システムコールラッパーは負の戻り値をエラーと認識する為、技巧を凝らす。

- システムコールはx(-20<=x<=19)を返したいが、20-x(1<=20-x<=40)を返す
- システムコールラッパーは20-(20-x)を計算し、本来の戻り値x(-20<=x<=19)を復元できる

# システムコールの任意の戻り値

ptrace()のPTRACE_PEEKDATAは任意の値を返す。

- PTRACE_PEEKDATAを使用しない場合、成功時は0、失敗時は-1が返る
- PTRACE_PEEKDATAを使用する場合、成功時は任意の値、失敗時は-1が返る

errnoが0なら成功、それ以外は失敗と判断するのが良い。

# POSIX

LinuxカーネルはPOSIXの機能を提供し、glibcがPOSIXのインターフェースを実現する。
負の戻り値を要求するAPIに対し、システムコールだけでは実現できないが、システムコールラッパーを使用すると可能である。
Antで新規のダッシュボードとダッシュボードフォルダをリリースする時に嵌った話

# はじめに
タイトルの通りです。
普段は変更セットでのリリースが多い＆ダッシュボードのリリースは稀なのでそこそこ解決に時間がかかりました

# 目次
1. [package.xmlを何も考えずに作ってみたら…](#package.xmlを何も考えずに作ってみたら…)
1. [DashboardFolderじゃないの？](#DashboardFolderじゃないの？)
1. [こうしたら解決しました](#こうしたら解決しました)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#package.xmlを何も考えずに作ってみたら"></a>
# package.xmlを何も考えずに作ってみたら

とりあえずダッシュボードを取得するpackage.xmlを作ります。
```package.xml
<type>
 <members>SampleDashboardFolderName/SampleDashBoardName</members>
 <name>Dashboard</name>
</type>
```

retrieveするとdashboardsフォルダに「SampleDashboardFolderName」（ダッシュボードフォルダ名）のフォルダが作成され、配下に「SampleDashBoardName」（ダッシュボード）のmeta.xmlができていました。
そのままリリースできるのかなとdeployすると、リリース検証中にこんなエラーが出ました。

<b>Cannot find folder:SampleDashboardFolder

フォルダをpackage.xmlに追加する必要があるのねとフォルダのmetadataを落としてみるとmeta.xmlは"DashboardFolder"と。 

<a id="#DashboardFolderじゃないの？"></a>
# DashboardFolderじゃないの？

というわけでpackage.xmlに以下の行を追加しました
```package.xml
<type>
 <members>SampleDashboardFolderName</members>
 <name>DashboardFolder</name>
</type>
```
AntでRetriveしたときは特にエラーもなかったので、そのままdeployすると…

やっぱりCannot find folder:SampleDashboardFolderが。

エラーメッセージなどでググってみると、ダッシュボードフォルダとダッシュボードをAntでリリースするときに同じエラーになる人はそこそこ見つかりました。

<a id="#こうしたら解決しました"></a>
# こうしたら解決しました

```package.xml
<type>
 <members>SampleDashboardFolderName/SampleDashBoardName</members>
 <members>SampleDashboardFolderName</members>
 <name>Dashboard</name>
</type>
```

Dashboardのmemberにダッシュボードもダッシュボードフォルダも入れるんですね
retrieveするとdashboardsフォルダにダッシュボードフォルダのmeta.xmlが作成されていました。

このあとレポートでもいろいろエラーになってダッシュボードがリリースできるまでひと悶着あるんですが、フォルダがAntでリリースできない問題は解決しました。

<a id="#reference"></a>
# 質問してくれた先輩と解決してくれた先輩
- [How to deploy or retrieve dashboard folder?](https://salesforce.stackexchange.com/questions/130598/how-to-deploy-or-retrieve-dashboard-folder)
バイオインフォマティクス入門以前

### 概要
　DNA分析をしようとして、闇雲にデータをあたっても、基本的な理論がわかってない状態で正しい方向に進むことはできないとわかっていながらも、基本統計量だけでも出せないかと試行錯誤してみましたがなかなかうまくいきませんでした。

 データの分析を行うにあたって、現在わかっていることとあいまいな点を整理し、自分の中の理論的な枠組みを棚卸しようと思います。

[開始コドンから終止コドンまでを検索するプログラム<C++>](https://qiita.com/tsukuba3/items/745e6189600c44df6b15)
取り敢えず、開始コドンから終止コドンまでを抽出するコードを書いてみました。
別に難しいところはありません。
ATGで始まってTAA,TAG,TGAで終わるそれっぽいものの数を数えるプログラムです。
その中で、３の倍数になっているものもカウントしています。

そこで疑問なんですが、タンパク質をコードしているコドンは、必ず３の倍数になるのかどうかというところに確信が持てない状態です。具体的には、イントロンとは、コドン内部のタンパク質形質しない塩基の配列をさすのか、それとも、タンパク質を形質しないコドン以外の塩基配列すべてをイントロンと呼ぶのかです。


話変わりますが、Qiitaの良いところは、誰かが書いたレポートに議論できるところだと思うんですよね。
最初は、コメントに間違いを指摘されたときはカッときましたが、よくよく考えてみれば、手本を示してくれてここが違うと思うけどと言ってもらえるってことは、有難いことじゃないかと思うんです。

間違いを指摘されて、いい気持のする人は少ないと思いますが、コミュニティを健全に運営していくため、自分の知見をただすためには大切なことではないだろうかと思うようになりました。

もし、この文章を読んで、ここが間違ってる、誤解しているなどのご指摘があれば、どんどん教えていただきたいと思います。

<!--
[３の倍数の遺伝子をコードしていると思われるコドンを抜き出して、どのアミノ酸が当てはまるのかを調べてみる](http:koneko.tokyo)

 ### 用語の整理

・染色体
    核内にあるものDNAのまとまり、ヒト23対=46本

    セーターと毛糸
    
・ゲノム
    父と母から一対づつ受け取った種の形質を決定する遺伝子
    
・DNA
    リン酸・デオキシリボース・塩基、二重らせん構造、ATGC、ヌクレオチド

・RNA
    リン酸・リボース・塩基、AUGC、ヌクレオチド
    
・セントラルドグマ
    DNA転写翻訳の一連の流れ

・mRNA
    メッセンジャーRNA

・tRNA
    トランスファーRNA

    タンパク質を組み立てるためにリボソーム二アミノ酸を運ぶ特別なクラスのRNA。20アミノ酸の各々に特異的な
    tRNAが存在する

・DNAポリメラーゼ
    翻訳を触媒する酵素

・エクソン
    開始コドンと終止コドンによって形成されたタンパク質を形作るアミノ酸の配列

    アミノ酸の集まりがタンパク質をコードするなら、コドンの一つがそもそも、遺伝子ということにならないか
    つまり、一エクソン、一遺伝子に対応する概念なのか

・イントロン
    遺伝子を形成しないアミノ酸の配列
    タンパク質を作るための命令が含まれていない遺伝子の部分。
    開始コドン～終止コドンの間に、イントロンとエクソンが一緒に存在しているかどうかがわからない。
    
    コドンに含まれないものをイントロンと呼ぶのか、
    コドンに含まれているが、エクソンに該当しない部分をイントロンと呼ぶのか

・コドン
    アミノ酸の配列の暗号表

・３つの塩基(トリプレット)
    ATGCのN^3の塩基の配列３つの塩基がある特定のアミノ酸を意味する、20種類のアミノ酸がタンパク質を構成するのに用いられる

・開始コドン
    メチオニン(AUG)

・終止コドン
    UAA
    UAG
    UGA

#### 知らなかったこと
・遺伝子型
    形質の表現[表現型]を決めるDNA配列

・リボソーム
    細胞内におけるタンパク質産生の場で、タンパク質とRNAで構成される構造体、リボソームは、mRNAの脚本に基づいて、アミノ酸をつなげてたんぱく質を作る
-->
コドン抽出

### コドン抽出

```cpp:
#include <fstream>
#include <iostream>
#include <string>
#include <cstring>

using namespace std;

int main(int argc, char *argv[]){
    long max = 0;
    string code = "";

    ifstream reading_file;
    string filename = argv[1];
    reading_file.open(filename, ios::in);
    string reading_line_buffer;
    while(getline(reading_file, reading_line_buffer)){
	code += reading_line_buffer;
	max += strlen(reading_line_buffer.c_str());
    }

    int taa_count = 0;
    int tga_count = 0;
    int tag_count = 0;

   unsigned int i = 0;

   ofstream file_out("1.fa-new.sql");

   int cnt = 1;
   int cnt3 = 0;

   while(i<max-2)
   {
	if(code.c_str()[i] == 'A' && code.c_str()[i+1] == 'T' && code.c_str()[i+2] == 'G')
	{
		string str = "";

		unsigned int j = i+3;

		while(j<max-2)
		{
			str += code.c_str()[j];

			if(code.c_str()[j] == 'T' && code.c_str()[j+1] == 'A' && code.c_str()[j+2] == 'A')
			{
				cout << "start = " << i << endl;
				cout << str << "TAA" << endl;
				i = j+3;
				taa_count++;
				cnt++;
				if(strlen(str.c_str())%3 == 0)
					cnt3++;
					
				break;
			}
			else if(code.c_str()[j] == 'T' && code.c_str()[j+1] == 'G' && code.c_str()[j+2] == 'A')
			{
				cout << str << "TGA" << endl;
				i = j+3;
				tga_count++;
				cnt++;
				if(strlen(str.c_str())%3 == 0)
					cnt3++;
				break;
			}
			else if(code.c_str()[j] == 'T' && code.c_str()[j+1] == 'A' && code.c_str()[j+2] == 'G')
			{
				cout << str << "TAG" << endl;
				i = j+3;
				tag_count++;
				cnt++;
				if(strlen(str.c_str())%3 == 0)
					cnt3++;
				break;
			}

			j++;
		}
	}

	i++;
   }

   file_out.close();

   cout << "taa_count = " << taa_count << endl;
   cout << "tga_count = " << tga_count << endl;
   cout << "tag_count = " << tag_count << endl;
   cout << cnt3 << endl;

   return 0;
}

```
[GAS] シン・相手へ通知なしでファイル閲覧権限を付与する方法（Drive API V3対応）

以前どこかで、メール通知をしないで、ファイルの共有設定をするGASがあって、大いに参考にさせてもらいました。
メール通知をしないためには、DriveApiを使うんだそうです。
サンプルプログラムでは、Drive API V2を使っていました。

GASのコードエディタで、サービスにDrive APIを追加し、バージョンはV2、IDはディフォルトのDriveを設定して、以下のコードでメール通知なしで、任意のユーザを閲覧者として共有出来ます。

```js
Drive.Permissions.insert(
    {
      'role': 'reader',
      'type': 'user',
      'value': '［任意のユーザーのメールアドレス］',
    },
    ［ファイルID］,
    {
      'sendNotificationEmails': 'false',   //"false"にすると通知メールを飛ばさない（ミソ）
      'supportsAllDrives': 'true'          //仕様によりこうしないとFileNotFoundになる。
    }
);
```

今回は、これを、**Drive API V3**用に書き換えます。
V3では、パラメーターの渡し方が色々あるみたいです。今回は、とりあえず出来たレベルなのでもっと良いコードに出来ると思います。
しかし、V3に対応したコードネット上に見つからなかったため、上げておきます。

まず、GASのコードエディタで、サービスにDrive APIを追加し、バージョンは**V3**、IDはディフォルトのDriveを設定します。
そして、以下のコードでメール通知なしで、任意のユーザを閲覧者として共有出来ます。
コメントで修正箇所を明記しておきます。

```js
Drive.Permissions.create( // <- insertから変更。
    {
      'role': 'reader',
      'type': 'user',
      'emailAddress': '［任意のユーザーのメールアドレス］', // <- valueから変更。
    },
    ［ファイルID］,
    {
      'sendNotificationEmail': 'false',   // <- sendNotificationEmailsから変更。
      'supportsAllDrives': 'true'
    }
);
```
mac を再起動しないと音声入力ができなくなる問題の解決方法

# Mac Book を起動してしばらくすると音声入力ができなくなる問題の解決方法

Macを使用していると、時々音声入力が反応しなくなることがあります。

以下では、Activity Monitorを使った方法と
コマンドラインインターフェース（CLI）を使用してプロセスを終了する方法を紹介します。

## Activity Monitorを使用する方法

Activity Monitorを使用して、音声認識に関連するプロセスを再起動することで、問題が解決する場合があります。

1. `アプリケーション` > `ユーティリティ` フォルダから `Activity Monitor` を開きます。
2. 上部の検索ボックスに「speech」と入力して、音声認識に関連するプロセスを見つけます。
3. 該当するプロセスを選択し、画面左上の `×` ボタンをクリックしてプロセスを終了します。
4. プロセスが終了した後、音声入力機能が正常に動作するか確認します。

## CLIを使用する方法

Terminal.appを開いて、CLIを使用して音声認識のプロセスを強制終了することもできます。これには、zsh（デフォルトのシェル）を使用します。

1. `Terminal.app` を開きます。
2. 音声認識プロセスを探すために、以下のコマンドを入力します。

```zsh
   ps aux | grep 'speech'
```

該当するプロセスのプロセスID (PID) を特定します。

以下のコマンドを使って、そのプロセスを終了します（[PID] は該当するプロセスのPIDに置き換えてください。

```:zsh
kill -9 [PID]
```

プロセスが終了した後、音声入力機能が正常に動作するか確認します。

いずれの方法で問題が解決した場合でも、この問題が何度も発生する場合は、システムの深刻な問題を示している可能性がありますので、Appleサポートに連絡するか、Apple Storeや認定サービスプロバイダで相談することをお勧めします。

# 1行で

以下のコマンドを実行することで、grep でフィルタリングした speech に関連するプロセスを一括で終了させることができます。

```zsh
ps aux | grep '[s]peech' | awk '{print $2}' | xargs kill -9
```


エイリアスにしても良いかもしれないですね。
```zsh
alias voice_reset="ps aux | grep '[s]peech' | awk '{print $2}' | xargs kill -9"
```
X-NUCLEO-GFX01M1で温度計を作る改(マクロ変換)(MCP9701)(STM32G071)(ILI9341)


x MCP9701-E/TO 販売コード 103199

X-NUCLEO-GFX01M1で温度計を作る改(マクロ変換)(MCP9701)(STM32G071)(ILI9341)


Arduino ILI9341 MCP9701 STM32G071 X-NUCLEO-GFX01M1


x 過去ログを見よ　とりまarduinoのところにいろいろある

目的
テキストのテスト
A2に温度センサーを接続した。
変換をマクロ化した。
小数点を0,.25,.50,.75に丸めた
25で割って25で掛けると丸められる(20240125)


![o_cop892.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b338ea76-1fc8-eb97-8736-4c6a6bb70cdd.jpeg)



```c++


//ili9341_mcp9701_071_3

//インクルド
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"


//100の割り算 0から30000までは、だいたい正しい   
#define DIV100(in) ((in*(65536/100*64+24))>>22)
//25の割り算 0から30000までは、だいたい正しい   
#define DIV25(in) ((in*(65536/25*16+8))>>20)
//MCP9701の温度を求める x100
#define TMP(so) ((((so)*270769)-134432821)>>16)


//設定
#define TFT_RST 54 //A1
#define TFT_DC 3
#define TFT_CS 4

//液晶の定義
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);


//初期化
void setup() {

  //シリアルの初期化
  Serial.begin(9600);
  Serial.println("ILI9341 Test!"); 

  //液晶の初期化
  tft.begin();

  //画面のクリア
  tft.fillScreen(ILI9341_BLACK);
  
}//setup


//無限ループ
void loop(void) {


  //センサーの値を読み込む
  analogReadResolution(12); // ADC 12bit mode
  int s = analogRead(A2);   // センサーの読み取り値
  
  //センサーの値を温度に変換
  int t = TMP(s);
  int d1 = DIV100(t);
  int d01 = (t - (d1 * 100));d01 = (DIV25(d01))*25;
  

  //温度の表示

  //クリア
  tft.fillRect( 0 ,0 , 24*5 , 24 , ILI9341_BLACK);

  //表示位置を0,0にする
  tft.setCursor(0, 0);

  //テキストの表示
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(3);
  tft.print(" ");
  tft.print(d1);
  tft.print(".");
  if( d01 >= 0 && d01 <= 9 ) { tft.print("0"); }
  tft.print(d01);
  tft.print(" ");
  
  delay(1000); //1秒待つ

}//loop


````
JavaScriptのthisって何this?

## はじめに
こんにちは。[kosukein38](https://twitter.com/kosukein38)です。
JavaScriptで`this`を書いて毎回これ何参照してるんだっけ?ってなるので、軽くまとめてみました。

:::note warn
覚えきれないので、主な使用方法のみまとめてあります。アロー関数中でのthisなど他の呼び出し方もあります。
:::


## 対象者
- `this`って何this?な人

## 内容

JavaScriptにおける`this`は、現在の実行コンテキストに依存する特別なキーワードです。
その値は、関数がどのように呼び出されるかによって異なってきます。


### 単独関数内の`this`
単独関数が呼び出された場合（つまり、オブジェクトのメソッドとしてではなく）、`this`はグローバルオブジェクト（ブラウザでは`window`）を参照します。
ただし、strictモードでは`this`は`undefined`になります。

```javascript
function sayHello() {
  console.log(this);
}

sayHello();  // Window {...}
```

### オブジェクトのメソッド内の`this`
オブジェクトのメソッドとして関数が呼び出された場合、`this`はそのメソッドを持つオブジェクトを参照します。

```javascript
let obj = {
  name: 'John',
  sayHello: function() {
    console.log('Hello, ' + this.name);
  }
};

obj.sayHello();  // 'Hello, John'
```


### コンストラクタ関数内の`this`
JavaScriptにおいて、`new`キーワードを使って関数オブジェクトのインスタンスを生成する際、その関数をコンストラクタと呼びます。この場合、`this`は新しく作成されたオブジェクトを参照します。

```javascript
function Person(name) {
  this.name = name;
}

let john = new Person('John');
console.log(john.name);  // 'John'
```


### イベントハンドラ内の`this`
DOMイベントハンドラ内で`this`は、イベントを発生させた要素を参照します。

```javascript
button.addEventListener('click', function() {
  console.log(this);  // <button>...</button>
});
```

### `this`値を明示的に設定して呼び出す方法

JavaScriptには、関数を呼び出すための特別なメソッドがあり、それらはcall(), apply(), bind()です。
これらのメソッドは、`this`値を明示的に設定するために使用されます。

#### call()
`call()`メソッドは、指定したthis値と個々の引数を使用して関数を呼び出します。

```javascript

function greet(greeting, punctuation) {
  console.log(greeting + ', ' + this.name + punctuation);
}

let person = { name: 'John' };

greet.call(person, 'Hello', '!');  // 'Hello, John!'
```
#### apply()
`apply()`メソッドも`call()`と同様に、指定した`this`値で関数を呼び出しますが、引数を配列として渡します。

```javascript
function greet(greeting, punctuation) {
  console.log(greeting + ', ' + this.name + punctuation);
}

let person = { name: 'John' };

greet.apply(person, ['Hello', '!']);  // 'Hello, John!'

```

#### bind()
`bind()`メソッドは新しい関数を作成し、その関数の`this`値を指定した値に設定します。この新しい関数は後で呼び出すことができます。

```javascript
function greet(greeting, punctuation) {
  console.log(greeting + ', ' + this.name + punctuation);
}

let person = { name: 'John' };

let greetJohn = greet.bind(person, 'Hello', '!');
greetJohn();  // 'Hello, John!'

```

これらのメソッドは、特にコールバック関数やイベントハンドラで便利です。これらの関数はしばしば異なるコンテキストで呼び出され、thisが期待通りのオブジェクトを指さないことがあります。
`call()`, `apply()`, `bind()`を使用すると、`this`が常に正しいオブジェクトを指すように設定できます。


## 最後に
- 関数の呼ばれ方で`this`の指している値が変わる
- 厳密モードとそうでない時とで`this`の挙動が変わることに注意


## 参考
以下の記事が大変分かりやすかったです🙇‍♂️
https://dev-k.hatenablog.com/entry/the-this-in-javascript-keyword-dev-k
Pattern Matching パターンマッチング

## Pattern Matching パターンマッチング
パターン マッチングでは、オブジェクトが特定の構造を持っているかどうかをテストし、一致する場合はそのオブジェクトからデータを抽出します。Java ではすでにこれを行うことができます。ただし、パターン マッチングでは、より簡潔で堅牢なコードを使用してオブジェクトから条件付きでデータを抽出できるようにする新しい言語拡張機能が導入されています。
## Pattern Matching for the instanceof Operator
- The predicate is a Boolean-valued function with one argument; in this case, it’s the instanceof operator testing whether the Shape argument is a Rectangle or a Circle.
- The target is the argument of the predicate, which is the Shape value.
- The pattern variables are those that store data from the target only if the predicate returns true, which are the variables r and s.
## Pattern Matchingの実装
```java
public class Main {
  public static void main(String[] args) {
    Shape rec = new Rectangle(2.0,4.0);
    System.out.println("rec:"+getPerimeter(rec));
    Shape cir = new Circle(2.0);
    System.out.println("cir:"+getPerimeter(cir));
  }
  public static double getPerimeter(Shape shape) throws IllegalArgumentException {
    if (shape instanceof Rectangle r) {
      return 2 * r.length() + 2 * r.width();
    } else if (shape instanceof Circle c) {
      return 2 * c.radius() * Math.PI;
    } else {
      throw new IllegalArgumentException("Unrecognized shape");
    }
  }
}
interface Shape { }
record Rectangle(double length, double width) implements Shape { }
record Circle(double radius) implements Shape { }
```
## Pattern Matchingの実行結果
```console
C:\sctree\sample\test-v17\out\production\test-v17 Main
rec:12.0
cir:12.566370614359172
Process finished with exit code 0
```
Python学習4日目～関数～

## 引数
### 位置引数とキーワード引数

~~~Python:example.py
print('Hello','Python',end='')
~~~

この場合HelloとPythonは位置引数でend=''はキーワード引数となる
位置引数は引数名を書かない引数
引数=値になっている引数がキーワード引数

## 関数の定義

defを使用する
~~~Python:example.py
def 関数名(引数,...):
    文
~~~

~~~Python:example.py
def order(main,side,drink):
    print('main: ',main)
    print('side: ',side)
    print('drink: ',drink)

order('steak','salad','coffee')
~~~
~~~:実行結果
main:steak
side:salad
drink:coffee
~~~

このときのmain,side,drinkを**仮引数**
'steak','salad','coffee'を**実引数**という

### return文
関数から戻り値を返すときに使用する

~~~Python:example.py
def odd_even(n):
    if n != int(n):
        return 'error'
    return 'odd' if n%2 else 'even'

print(odd_even(5))
print(odd_even(6))
print(odd_even(7.7))
~~~
~~~:実行結果
odd
even
error
~~~

return使わない文章も考えたけどifが入れ子になりまくって正直だるかった。
素直にreturn使った方が圧倒的に簡単

### デフォルト値
関数の引数にはデフォルト値を設定することができる
実引数を省略して関数を呼び出すとデフォルト値が使用される

~~~Python:example.py
def order(main='steak',side='salad',drink='coffee')
    print('main: ',main)
    print('side: ',side)
    print('drink: ',drink)

order()
order('pizza')
order(side='soup')
~~~
~~~:実行結果
# order()の結果
main: steak
side: salad
drink: coffee

# order('pizza')の結果
main: pizza
side: salad
drink: coffee

# order(side='soup')の結果
main: steak
side: soup
drink: coffee
~~~
2021年頃に設定していたCloudWatchの請求アラームが動かなくなっていた

## はじめに
私は2021年頃からAWSの個人学習用アカウントを作成してたまに触っているのですが、アカウント作成当時に設定したアラーム設定が動作していなくて焦ったので残しておこうと思います。

## 結論
2021年頃にマイ請求ダッシュボードの設定とCloudWatch、SNSから請求アラームを設定していた方は見直しが必要かもしれません。
CostExplorer画面の確認、CloudWatchで過去に作成したアラームの状態を確認しましょう！
そして **予算を設定して請求アラート** 、**CloutWatchで請求アラーム** が出るようにしましょう！

## 気づいたきっかけ
先月Amazon Qのハンズオンを行い、リソースが空の場会のAmazon Qの料金が気になったので一か月程度放置してみようと思い放置し、そのまま忘れていたのを思い出してマネジメントコンソールを確認したところ以下のように表示されていました。

![スクリーンショット 2024-01-25 175423.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423172/107027ff-8156-8d92-0390-627810f87339.png)

ほぼすべてのコストがAmazon Qのようです。
作成から一か月経過するとコストかかるんだな～、クレジットあるしまぁいいかと思っていたのですが、そこから請求書を確認したところ請求のうち25ドルはクレジットが使用され、残りの1.3ドルは請求されるようでした。

![スクリーンショット 2024-01-25 184211.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423172/8da3d800-e0bf-2381-4a18-e338bc3342c7.png)

ここで過去に設定した請求アラームが出ないということに疑問を覚えて「請求とコスト管理」の画面をさまよっていたところ、
ホーム画面のコストモニターに **予算状況：設定が必要です** とあったので確認したところ、ここから予算超過アラームを設定できるようになっていました。
※以下の画像ではすでに予算を設定した後なので予算超過と表示されていますが、最初は下のコスト異常のステータスのように表示されていました。

![スクリーンショット 2024-01-25 185224.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423172/0039c7a6-6702-6657-9c68-efb170ae9f5c.png)


予算を作成したところアラートがされるようになり、
このアラートの設定のおかげでアラームされるようになったので過去に設定した予算超過アラートが消えてしまっていたのかもしれません。
※この予算の作成方法については多くの先人の方が記事にされているのでここでは省略します。
最後の方の参考のリンクに載せさせていただいたので気になった方や自分もアラートの設定必要かもという方はリンク先の方の記事を見ていただければと思います。

ちなみに、2023年7月頃にSkill Builderの一か月分の請求があったのですが、そのときはアラームされていたので最近アラートもしくはアラームの更新が必要になったのかもしれないですし、月末になったらアラームされていたかもしれません。

とはいえ、昔マイ請求ダッシュボードの設定とCloudWatch、SNSから請求アラームを設定していた方は念のため見直しをし、予算の作成をしておいた方がよいかもしれないですね。

## 所感
AWSのマネジメントコンソールやコスト関連の画面は定期的に確認しないといけないなと再認識しました。
このまま忘れて放置していたらとんでもない請求額が来ていたかもしれないので早く気づけて良かったです。
あとクレジットで命拾いしました。
不明点が多いのでもっと調査しようかなとも思っていたのですが、~~めんどくさ~~ひとまず当初の目的のアラームされない現象は解消できたのでここで止めておこうと思います。
気にはなるので何か分かり次第更新します。
また、**請求アラートはAWS Billing コンソール、請求アラームはCloudWatch コンソールで設定するもの** であるということを今回初めて知りました。
1ドルは犠牲にしましたが多くを学べました。

## 参考
マイ請求ダッシュボードの設定とCloudWatch、SNSから請求アラートを設定する方法の参考リンク

https://qiita.com/tmknom/items/303db2d1d928db720888#cloudwatch%E3%81%A7%E8%AB%8B%E6%B1%82%E6%83%85%E5%A0%B1%E3%81%AE%E3%82%A2%E3%83%A9%E3%83%BC%E3%83%A0%E3%82%92%E4%BD%9C%E6%88%90

https://qiita.com/i3no29/items/da8f4ccc5b195c23ed08

請求とコスト管理から予算を作成して設定する請求アラートの方法の参考リンク

https://qiita.com/moritalous/items/92a30b9cb72d30478fe6

公式ドキュメント（ここで請求アラートと請求アラームがしっかり分けて記載されています）

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html
AWS CLIを使用するためのconfigure設定方法

CLIを利用するときにConfigureの設定方法をよく忘れるので備忘で残す。（実施した環境はWindows）

### ０．事前準備するもの
　CLIを実行するためのIAMのアクセスキー

### １．初期設定（スイッチロールなし版はこの手順だけでOK）

defaultのままでよいとき
<code>aws configure</code>

プロファイルを利用するとき（IAMが複数ある場合などはプロファイルを作ってわける）
<code>aws configure --profile "プロファイル名"</code>

入力項目。準備したIAMのアクセスキーとシークレットキーを入力する
AWS Access Key ID [****************xxxx]:
AWS Secret Access Key [****************xxxx]:
Default region name [None]: ap-northeast-1
Default output format [None]: json

### ２．スイッチロールする場合のconfig修正
 手順１でプロファイルを実施したあとconfigファイルを修正する。
 configファイルの場所は下記の通り。
 --Linux または macOS <code>~/.aws/config</code>
 --Windows <code>C:\Users\USERNAME\.aws\config</code>

以下の[]のセクションに★部分を追加
[default もしくはprofile "プロファイル名"]
region = ap-northeast-1
★mfa_serial = arn:aws:iam::xxxxxxxxx:mfa/"スイッチロール元のiamユーザ名"
★role_arn = arn:aws:iam::xxxxxxxx:role/"スイッチロール先のiamロール名"
★source_profile = profile-authc　※プロファイル作っていなければ指定不要
Safari の subgrid にバグっぽい挙動があったのでメモ

以下のようなHTMLで、Safariではsubgridが期待通りに動かない。(chrome や firefox と異なる）
`overflow: hidden` を消したところ、3ブラウザで同じ表示になった。

手元のSafariのバージョンは 17.1.2 なので最新では直っているかもしれない。

```html
<!doctype html>
<style>
  .g {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
  }
  .sub {
    grid-column: 2/-1;
    display: grid;
    grid-template-columns: subgrid;
    overflow: hidden;
  }
</style>
<div class="g">
  <div>1</div>
  <div class="sub">
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
  </div>
</div>
```
msw+expressでGraphQL APIのモックサーバを建てる

以下のGQLクエリに対してレスポンスするモックサーバを建てたい

```graphql
query tasks {
  tasks {
    collection {
      id
      name
      description
      startAt
      endAt
    }
  }
}
```

サーバの実装は以下。

faker, msw, @mswjs/http-middleware, express, corsは事前に全部npmでインストールしておく必要あり。

```ts
import { faker } from "@faker-js/faker";
import { createMiddleware } from "@mswjs/http-middleware";
import cors from "cors";
import express from "express";
import { HttpResponse, graphql } from "msw";

const buildMockTask = () => {
  // mockのstartAt/endAtが正しい前後関係になるようにfakerで値を生成する
  const from = faker.date.anytime();
  const to = faker.date.future({ refDate: from });

  return {
    id: faker.string.uuid(),
    name: faker.lorem.words(),
    description: faker.lorem.paragraph(1),
    startAt: from,
    endAt: to,
  };
};

const handlers = [
  graphql.query("tasks", () => {
    return HttpResponse.json({
      data: {
        tasks: {
          // とりあえず5個生成しておく。
          collection: Array.from({ length: 5 }).map(() => buildMockTask()),
        },
      },
    });
  }),
];

const app = express();

app.use(
  cors({
    origin: [
      // ここは必要に応じて許可したいホストを追加する
      "http://localhost:4500", 
      "http://localhost:3000",
    ],
    credentials: true,
  }),
);
app.use(express.json());
app.use(createMiddleware(...handlers));
app.listen(8000, () => {
  console.log("running mock server...");
});
```

`@mswjs/http-middleware` は `createServer` というインターフェイスを提供しているのでexpressがなくても良いはずだが[TypeScriptの型定義周りにバグ](https://github.com/mswjs/http-middleware/issues/36)があり、それをts-ignoreで無視して動かそうとするとうまくうごかなかった。

あと結局CORS周りを考慮するならmiddlewareとして扱った方がいい。
package.jsonからversionを取得する

以下でできる

```js
import { createRequire } from "module";

const require = createRequire(import.meta.url);
const { version } = require("./package.json");
```

なお `require` で指定するパスは実行時のパスになるので、もし `dist` ディレクトリ配下にJSファイルとして出力しているなどのケースでは `../package.json` とかになる。
ブラウザのリアルタイム通信の変遷

# HTTP/1.1（1997年）

## ロングポーリング

クライアントがサーバーにリクエストを送信し、serverはデータが利用可能になった時点で応答する方式。

クライアントはサーバーからの応答を受け取ったら、すぐに新しいリクエストを送信することで、双方向通信を実現する。

```
function longPolling() {
    fetch('サーバーのエンドポイント').then(response => {
        return response.json();
    }).then(data => {
        console.log(data);
        longPolling(); 
    })
}

longPolling(); // 最初のリクエストを開始
```

この方式はリクエストのたびに、毎回TCP接続を確立するためオーバーヘッドが大きい。

# HTTP/2（2015年）

## SPDY
HTTP/2の前身となったSPDYプロトコルは、Googleによって開発された実験的なプロトコルで、Webページのロード時間を短縮することを目的としていた。

もともとSPDYはHTTPの代替ではなく、HTTPの上で動作するアプリケーション層のプロトコルであり、HTTPを改善することで、パフォーマンスの向上を図っていた。

SPDYの主な機能

- ストリームの多重化: 単一のTCP接続上で複数のリクエストとレスポンスを同時に送受信する
- 優先順位付け: リクエストに優先順位をつけ、重要なリソースのロードを優先する
- ヘッダー圧縮: HTTPヘッダーの冗長性を減らし、データの送信量を削減する

HTTP/2はSPDYの技術をベースにして設計されていた。HTTP/2が標準化された後、SPDYは徐々に廃れていった。

現在、主流のWebブラウザやサーバーはHTTP/2をサポートしており、SPDYは過去の技術となりましたが、そのアイデアと技術はHTTP/2の形で生き続けています。

## ストリームの多重化

HTTP/2が導入した主な機能の一つに「ストリームの多重化」がある。これは単一のTCP接続上で複数のリクエストとレスポンスが同時に、かつ非同期に行うことができる。

これは、HTTP/1.1におけるロングポーリングの主な課題の一つであった、同時接続数の制限とヘッド・オブ・ライン・ブロッキング（HOLB）を解決することになった。

# Server Sent Events（2006年）
Server Sent Events (SSE) は、サーバーからクライアントへのリアルタイムデータのプッシュをするためのAP

SSEはHTML5標準の一部として設計された。サーバー側では新しい情報が利用可能になった際に、クライアントに対して即座にデータを送信することができる。

```
var eventSource = new EventSource('サーバーのエンドポイント');
eventSource.onmessage = function(event) {
    console.log('New message from server:', event.data);
};
```


## WebSockets（2011年）

WebSocketsは、クライアントとサーバー間で双方向通信を行うためのプロトコルです。Socketという名前が示すように、WebSocketsはTCP/IPソケットの通信をブラウザ上で実現することができます。

WebSocketは2024年現在、さまざまなアプリケーションで使用されています。しかしその下位レイヤではTCP/IPを使用しているため、映像や音声などをリアルタイムに配信する場合は、次に述べるWebRTCがより適しています。

```
<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Test</title>
</head>
<body>
    <script>
        var ws = new WebSocket('ws://localhost:8080');

        ws.onopen = function() {
            console.log('Connected to the server');
            ws.send('Hello! Message From Client!!');
        };

        ws.onmessage = function(e) {
            console.log('Received message from server: ' + e.data);
        };

        ws.onerror = function(error) {
            console.log('WebSocket Error: ' + error);
        };
    </script>
</body>
</html>
```

# WebRTC (2011年～)

リアルタイム通信に特化したプロトコルで、Web上でUDPを使うことができる唯一の手段であり、主にブラウザ上で使われている。Google MeetやZoomなどのビデオ会議システムの内部ではWebRTCが使われている。

もともと映像/音声通信のために生まれたプロトコルだが、データ通信のためのDataChannelという機能もあり、その用途はビデオ通話に限らない。

詳しくはこちらの記事で書きました。

https://qiita.com/yusukem99/items/c61a62e75db79c0eb8fe
Windows バージョン情報の確認・取得方法

# 視覚的に確認
1) ```Windowsキー + R ```キーを押して、ファイル名を指定して実行のウィンドウを表示
2) ```winver ```と入力してOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/149f1a04-358b-8ce2-16b2-e22617350d13.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/1a9fff10-395d-bba1-1d44-35a0a98adb3b.png)

# PowerShell で 取得
 ```20H2  ```よりも前か、 ``` 20H2 (以降)  ```か でやり方がちょっと異なります。
 ## Windows 10 20H2 よりも前
 ```ps1
 $CurrentVersion = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
"Version " + $CurrentVersion.ReleaseId + " (OS Build " + $CurrentVersion.CurrentBuild + "." + $CurrentVersion.UBR + ")"
```
結果
```
Version 2009 (OS Build 19045.3803)
```

 ## Windows 10 20H2 よりも前
 ```ps1
 $CurrentVersion = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
"Version " + $CurrentVersion.DisplayVersion + " (OS Build " + $CurrentVersion.CurrentBuild + "." + $CurrentVersion.UBR + ")"
```
またはワンライナーに（セミコロンで区切っているだけ）
```ps1
$CurrentVersion = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"; "Version " + $CurrentVersion.DisplayVersion + " (OS Build " + $CurrentVersion.CurrentBuild + "." + $CurrentVersion.UBR + ")"
```
結果
```
Version 22H2 (OS Build 19045.3803)
```

# 両方まとめると
```ps1
$CurrentVersion = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" 
if ($CurrentVersion.DisplayVersion -ne $null) { $DispVersion = $CurrentVersion.DisplayVersion } else { $DispVersion = $CurrentVersion.ReleaseId }
"Version " + $DispVersion + " (OS Build " + $CurrentVersion.CurrentBuild + "." + $CurrentVersion.UBR + ")"
```

結果
```
Version 22H2 (OS Build 19045.3803)
```
SFTP

```
using Renci.SshNet;
using System;

class SftpExample
{
    static void Main()
    {
        string host = "SFTP_HOST";
        string username = "USERNAME";
        // ppkファイルはpemに変換しておく
        string privateKeyFilePath = "path/to/your/privatekey.pem";
        string privateKeyPassphrase = "PRIVATE_KEY_PASSPHRASE"; // パスフレーズがある場合

        using (var client = new SftpClient(host, username, new PrivateKeyFile(privateKeyFilePath, privateKeyPassphrase)))
        {
            client.Connect();

            // ここでSFTP操作を行います

            client.Disconnect();
        }
    }
}
```
【CRM Analyticsグラフ】4月から始まるグラフの作成


## レシピの加工
1. レシピで変換ノードのカスタム数式で関数month()を利用し、月分を抽出します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/de7383c2-8f12-f8ad-e8f9-4cf63baa1db5.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/90e5d024-0b16-ad93-5376-dc144fc92f96.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/a560c4c3-5dd2-4f43-5120-d16573b3c313.png)


2.カスタム数式を再度利用して、月分の数値を変更します。
以下の通り、月分が1-3の場合は、12を加算します。
※「month」はステップ1で作成した項目のAPI名です。

```case 
	when "month"<4 
	then 
	"month" + 12
	else
	"month"
end
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/3a2329ff-b667-3bb8-b9fe-5a9b5eb4af2f.png)

3.データセットを出力します。
※元のデータセットを置き換える場合は、名前とAPI名を元のデータセットと同じにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/8bb6e965-fd03-c151-97b6-4f84d8db0e47.png)

## グラフの設定

1. 作りたいグラフ種類を選択してください。

例として、縦棒グラフを作成してみます。
棒の長さには、先ほどのステップ2で作成した月次ランクの項目の平均値を選択してください。
さらに、昇順に設定し、月分が4月から始まるようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/77b6ff23-cba1-515c-04da-d53cac6687a8.png)

2. ランク列を非表示にします。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/887e692f-1598-0262-74c9-3c2c9a76d56e.png)


これで、4月から始まるグラフが完成しました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/54139d9a-1a29-1977-bb67-43bffd1cc4ec.png)
アイヌ語の干支

🐭 [エルㇺ (erum)](https://ainugo.nam.go.jp/siror/dictionary/detail.php?page=book&book_id=A0285)
🐮 [ペコ (peko)](https://ainugo.nam.go.jp/siror/dictionary/detail.php?page=book&book_id=A0292)
🐯 [イワイサルㇱペ (iwaysaruspe)](https://www.google.co.jp/books/edition/%D0%90%D0%B8%D0%BD%D1%81%D0%BA%D0%BE_%D1%80%D1%83%D1%81%D1%81%D0%BA%D1%96%D0%B9_%D1%81%D0%BB%D0%BE%D0%B2%D0%B0%D1%80/_r4wAQAAMAAJ?hl=ja&gbpv=1&pg=RA1-PA73&printsec=frontcover)
🐰 [イセポ (isepo)](https://ainugo.nam.go.jp/siror/dictionary/detail.php?page=book&book_id=A0284)
🐲 [カンナカムイ (kanna-kamuy)](https://ainugo.nam.go.jp/siror/dictionary/detail.php?page=book&book_id=A0426)
🐍 [タンネカムイ (tanne-kamuy)](https://ainugo.nam.go.jp/siror/dictionary/detail.php?page=book&book_id=A0421)
🐴 [ウンマ (umma)](https://ainugo.nam.go.jp/siror/dictionary/detail.php?page=book&book_id=A0293)
🐏 [メンヨ (men-yo)](https://www.google.co.jp/books/edition/%E3%82%A2%E3%82%A4%E3%83%8C%E8%AA%9E%E6%B2%99%E6%B5%81%E6%96%B9%E8%A8%80%E8%BE%9E%E5%85%B8/vNypPgAACAAJ?hl=ja&gbpv=1&RA1-PA385&printsec=frontcover)
🐵 [サロ (saro)](https://www.google.co.jp/books/edition/%E8%9D%A6%E5%92%8C%E8%8B%B1%E4%B8%89%E5%B0%8D%E8%BE%AD%E6%9B%B8/OcE1AQAAIAAJ?hl=ja&gbpv=1&pg=RA1-PA216&printsec=frontcover)
🐥 [チカㇷ゚ (cikap)](https://dl.ndl.go.jp/pid/993685/1/89)
🐶 [セタ (seta)](https://ainugo.nam.go.jp/siror/dictionary/detail.php?page=book&book_id=A0268)
🐗 [トントネッポ (tontoneppo)](https://www.google.co.jp/books/edition/%E8%9D%A6%E5%92%8C%E8%8B%B1%E4%B8%89%E5%B0%8D%E8%BE%AD%E6%9B%B8/OcE1AQAAIAAJ?hl=ja&gbpv=1&pg=RA1-PA253&printsec=frontcover)

私(安岡孝一)なりにアイヌ語訳を拾ってみたが、もちろん、どれも議論の余地がある。イワイサルㇱペは[昨日の記事](https://qiita.com/KoichiYasuoka/items/ce5ab0d376478e5b3aa8)を読んでもらうとして、十二支これでいいかなあ。あと十干は、[曜日の新表現](https://www.city.sapporo.jp/shimin/ainushisaku/minapa/documents/ainugoitiran.pdf#page=2)を借りてみたけど、こんなものかしら。

* ニユピヒ (ni-yupihi)
* ニアキヒ (ni-akihi)
* アペユピヒ (ape-yupihi)
* アペアキヒ (ape-akihi)
* トイユピヒ (toy-yupihi)
* トイアキヒ (toy-akihi)
* カニユピヒ (kani-yupihi)
* カニアキヒ (kani-akihi)
* ワッカユピヒ (wakka-yupihi)
* ワッカアキヒ (wakka-akihi)
Laravel Sailでmailpitを有効にする

お疲れ様ですGroです。

最近Laravel Sailの仕様が変わったのか、情報が少なかったor埋もれていたので備忘録で記事にしておきます。
Sailをデフォルトでインストールすると、どのサービスも選択されていない状態なので、
「Sailを使っていればmailpitが入っているので〜」みたいな記事の通りに動かずつまずきます。

結論、sailのinstall時に、利用するサービスを選択できるのですが、その中にmailpitがありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103853/a6452d90-8f2f-0c3c-e659-670260aeab3e.png)

↓スペースキーで選択すると複数サービスを選択できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103853/7fccd664-6078-42eb-817d-c4a99bbcf4ac.png)

これで無事docker-compose.ymlにmailpitが入りました。

```docker-compose.yml
    mailpit:
        image: 'axllent/mailpit:latest'
        ports:
            - '${FORWARD_MAILPIT_PORT:-1025}:1025'
            - '${FORWARD_MAILPIT_DASHBOARD_PORT:-8025}:8025'
        networks:
            - sail
```
sharp の「Could not load the "sharp" module using the win32-x64 runtime」エラーの解決方法

## 現象

Node.js の画像処理モジュールの sharp をバージョンアップしたら以下エラーが発生。

```powershell:Error
Could not load the "sharp" module using the win32-x64 runtime
```

https://www.npmjs.com/package/sharp

## 原因

sharp のバージョンを `0.33.x` にすると発生。

## 解決方法

Windows x64用の sharp（`@img/sharp-win32-x64`）  をインストールします。

https://www.npmjs.com/package/@img/sharp-win32-x64

警告が表示されますが、エラーは発生しなくなりました:blush:

```powershell
npm i -D @img/sharp-win32-x64

npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@img/sharp-win32-x64@0.33.2',
npm WARN EBADENGINE   required: {
npm WARN EBADENGINE     node: '^18.17.0 || ^20.3.0 || >=21.0.0',
npm WARN EBADENGINE     npm: '>=9.6.5',
npm WARN EBADENGINE     yarn: '>=3.2.0',
npm WARN EBADENGINE     pnpm: '>=7.1.0'
npm WARN EBADENGINE   },
npm WARN EBADENGINE   current: { node: 'v20.10.0', npm: '8.15.0' }
npm WARN EBADENGINE }
```
Python 3 エンジニア認定基礎試験対策14 - 対話入力編集と履歴置換

# はじめに
Python3エンジニア認定基礎試験の対策として自分用に執筆しています。

:::note warn
この記事はPython・執筆学びたての初心者が執筆しています。間違いがあるかもしれませんので、ぜひ各項目にある**参考文献**も確認してください。また、誤りがあればコメントで教えていただけると幸いです。
:::

# 対話入力編集と履歴置換

## タブ補完と履歴編集

Tabキーを押すと補完機能を呼びだし、Pythonの文の名前、現在のローカル変数、利用可能なモジュール名を検索する。

## 対話的インタープリタの代替

IPythonはタブ補完やオブジェクト探索、先進的な履歴管理といった機能を持っている。他にはbpyhonなどがあげられる。

# 参考文献

https://docs.python.org/ja/3.9/tutorial/interactive.html
非同期処理

Powershellで非同期処理のテストを行いました。
テストコードを下記に示します。

```Powershell
# 開始時間の表示
Get-Date
# バックグラウンドで動かすジョブ
$task1 = {
 Start-Sleep 20
 write-host "task1終了"
}

$task2 = {
 sleep 3
 Write-Host "hogehoge"
 sleep 7
 write-host "task2終了"
}

function function3() {
 Start-Sleep 10
 write-host "function3終了"
}

# バックグラウンドジョブ
$job1 = Start-Job -ScriptBlock $task1
$job2 = Start-Job -ScriptBlock $task2
# 関数２を呼び出して10秒スリープ
function3
# バックグラウンドジョブ終了まで待ちます
Wait-Job $job1.Id
Wait-Job $job2.Id
# 終了時間の表示
Get-Date
```

テスト結果の画像です。

***結果***

![title1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/3a98f68c-6569-3158-1237-32fd0d3f0324.jpeg)

![title2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/cca5f449-7450-8d5f-d103-cf32e443a93b.jpeg)

![title3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/20b3bab3-bda9-e841-4a37-e69cf27d46a4.jpeg)

![title4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/14b4a185-bcf2-3cef-1435-78086278d1da.jpeg)
Python 3 エンジニア認定基礎試験対策12 - 仮想環境とパッケージ

# はじめに
Python3エンジニア認定基礎試験の対策として自分用に執筆しています。

:::note warn
この記事はPython・執筆学びたての初心者が執筆しています。間違いがあるかもしれませんので、ぜひ各項目にある**参考文献**も確認してください。また、誤りがあればコメントで教えていただけると幸いです。
:::

# 仮想環境とパッケージ

`venv`モジュールで仮想環境の作成と管理を行う

`python3 -m venv tutorial-env`

`pip`は"install", "uninstall", "freeze", "list"などのサブコマンドを持つ。

## インストール

パッケージ指定で最新版をインストール

`python3 -m pip install requests`

パッケージ名の後ろに`==`とバージョン番号をつけると指定したバージョンをインストールできる

`python3 -m pip install requests==2.6.0`

既にインストールされている場合だと何も起こらないが、`pip install --upgrade`を実行すると最新版に更新する。

## 情報表示

指定したパッケージの情報

```
(tutorial-env)  $  pip  show  requests
---
Metadata-Version:  2.0
Name:  requests
Version:  2.7.0
Summary:  Python  HTTP  for  Humans.
Home-page:  http://python-requests.org
Author:  Kenneth  Reitz
Author-email:  me@kennethreitz.com
License:  Apache  2.0
Location:  /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages
Requires:
```

インストールされたすべてのパッケージを表示する

```
(tutorial-env)  $  pip  list
novas  (3.1.1.3)
numpy  (1.9.2)
pip  (7.0.3)
requests  (2.7.0)
setuptools  (16.0)
```

# 参考文献

https://docs.python.org/ja/3.9/tutorial/venv.html
Python 3 エンジニア認定基礎試験対策11 - 標準ライブラリミニツアー2

# はじめに
Python3エンジニア認定基礎試験の対策として自分用に執筆しています。

:::note warn
この記事はPython・執筆学びたての初心者が執筆しています。間違いがあるかもしれませんので、ぜひ各項目にある**参考文献**も確認してください。また、誤りがあればコメントで教えていただけると幸いです。
:::

# 標準ライブラリミニツアー - 2

## 出力のフォーマット

`reprlib`モジュールは大きなコンテナや深くネストしたコンテナを省略して表示する

```Python
>>> import reprlib
>>> print(reprlib.repr(set('hello world')))
{' ', 'd', 'e', 'h', 'l', 'o', ...}
```

`pprint`モジュールはわかりやすく表示するために使われる。"pretty printer"が改行をインデントを追加する

```Python
>>> import
>>>t = [[['black', 'white'], 'cat', 'doc'], 'plant']
[[['black', 'white'],
  'cat',
  'doc'],
 'plant']
 ```

## 文字列テンプレート

`string`モジュールは`Template`クラスが入っている。

```Python
>>> from string import Template
>>> t = Template('${hoge} is True')
>>> print(t.substitute(hoge="foo"))
foo is True
```

## バイナリデータレコードの操作

`struct` モジュールでは、様々な長さのバイナリレコード形式を操作する`pack()`や`unpack()`といった関数を提供する

## マルチスレッディング

`threading, zipfile`はスレッド処理を行う

## ログ記録

`logging`モジュールでは、数多くの機能を備えた柔軟性のあるログ記録システムを提供する

## リスト操作

`array`モジュールではarray()オブジェクトを提供する

## 10進浮動小数演算

`decimal`モジュールは10進浮動小数の算術演算をサポートするDecimalデータ型を提供する

# 参考文献

https://docs.python.org/ja/3.9/tutorial/stdlib2.html
java sealed class

## sealed class
Sealed クラスとインターフェイスは、他のどのクラスやインターフェイスがそれらを拡張または実装できるかを制限します。
permits句は、シールされたクラスを拡張できるクラスを指定します。
## sealed classの宣言
```java
public sealed class Person permits Student, Teacher, Worker {
}
```
## 許可されるサブクラスの制約
- final: Cannot be extended further
- sealed: Can only be extended by its permitted subclasses
- non-sealed: Can be extended by unknown subclasses; a sealed class cannot prevent its permitted subclasses from doing this
## 許可されるサブクラスの宣言
```java
non-sealed class Teacher extends Person {
}
final class Student extends Person {
}
sealed class Worker extends Person permits RailwayWorker {
}
final class RailwayWorker extends Worker {
}
```
【phaser】吹き出しをつくる

# 目的
キャラクターに吹き出しをつける機能を実装する

# コード

キャラクターの位置に応じて吹き出しを更新して、一定時間が経過したら吹き出しを消すようにします。


```
class SpeechBubble {
  constructor(scene, x, y, text) {
    this.scene = scene;
    this.x = x;
    this.y = y;
    this.text = text;
    this.bubble = this.createBubble();
    this.bubbleText = this.createBubbleText();
    this.hideBubble();
  }

  createBubble() {
    let bubble = this.scene.add.graphics({ x: this.x, y: this.y });
    bubble.fillStyle(0xffffff, 1);
    bubble.fillRoundedRect(0, 0, 160, 40, 16);
    return bubble;
  }

  createBubbleText() {
    let text = this.scene.add.text(this.x + 20, this.y + 10, this.text, {
      fontSize: '16px',
      color: '#000000'
    });
    return text;
  }

  updatePosition(newX, newY) {
    this.bubble.x = newX;
    this.bubble.y = newY;
    this.bubbleText.x = newX + 20;
    this.bubbleText.y = newY + 10;
  }

  // 5秒後に自動的に消える
  showBubble() {
    this.bubble.setVisible(true);
    this.bubbleText.setVisible(true);
    this.scene.time.delayedCall(5000, this.hideBubble, [], this);
  }

  hideBubble() {
    this.bubble.setVisible(false);
    this.bubbleText.setVisible(false);
  }
}

class MyScene extends Phaser.Scene {
  constructor() {
    super();
    this.character = null;
    this.speechBubble = null;
  }

  create() {
    this.character = this.add.sprite(100, 100, 'characterSprite');
    this.speechBubble = new SpeechBubble(this, 100, 80, 'Hello!');

    // キャラクターを動かすコード
    // キャラクターの動きに応じて吹き出しの位置を更新するコードもここに追加
  }

  update() {
    // キャラクターが動いたら、吹き出しを表示
    if (this.characterMoved) {
      this.speechBubble.updatePosition(this.character.x, this.character.y - 20);
      this.speechBubble.showBubble();
    }
  }
}

// Phaserゲームインスタンスの作成とシーンの追加
const gameConfig = {
  type: Phaser.AUTO,
  width: 800,
  height: 600,
  scene: MyScene
};

const game = new Phaser.Game(gameConfig);

```

# セリフをランダムにしたい場合

```
class SpeechBubble {
  // ...（前のコードと同じ）

  showBubble() {
    this.bubble.setVisible(true);
    this.bubbleText.setVisible(true);
    this.bubbleText.setText(this.getRandomSpeech());
    this.scene.time.delayedCall(5000, this.hideBubble, [], this);
  }

  getRandomSpeech() {
    const speeches = [
      'Hello!',
      'How are you?',
      'Nice to meet you!',
      'I love Phaser!',
      // 他にもセリフを追加できます
    ];
    return speeches[Math.floor(Math.random() * speeches.length)];
  }
}

class MyScene extends Phaser.Scene {
  // ...（前のコードと同じ）

  update() {
    // キャラクターが動いたら、新しいセリフを表示
    if (this.characterMoved) {
      this.speechBubble.updatePosition(this.character.x, this.character.y - 20);
      this.speechBubble.showBubble();
    }
  }
}

// Phaserゲームインスタンスの作成とシーンの追加
// ...（前のコードと同じ）

```



## 課題
### 吹き出しのカスタマイズ
吹き出しの形状、色、またはサイズを変更しましょう

### セリフに応じた吹き出しの調整
セリフの長さによって吹き出しの大きさが調整されるように修正しましょう
【Splunk】Splunk Enterpriseの構成についてざっくりまとめる

こんにちは。torippy1024です。Splunkについて勉強中です。

今日は、Splunk Platformのオンプレ版であるSplunk Enterpriseについて、
基盤観点で、構成要素や各要素の役割について説明します。(つまり、私の勉強メモです。。)

## 参照先資料
本記事は、Splunk Docに記載されていることをまとめたものです。
より詳しい情報が欲しい時はSplunk Docを参照してください。

Splunk Docs
https://docs.splunk.com/Documentation

Splunk Conponent
https://docs.splunk.com/Splexicon:Component

Components that help to manage your deployment
https://docs.splunk.com/Documentation/Splunk/9.1.3/Deploy/Manageyourdeployment

Splunk Validated Architectures(日本語版)
https://www.splunk.com/pdfs/ja_jp/technical-briefs/splunk-validated-architectures.pdf

## Splunk Enterpriseについて
Splunk Enterpriseは、Splunk Platformのオンプレ版製品です。
クラウド(PaaS?SaaS?)版としてSplunk Cloudという製品もあります。
Splunk Cloudを使う場合、ユーザー側にとって必要な情報はSplunkの利用方法であり、基盤構成などの情報はあまり重要ではないかもしれません。

本記事では、基盤構成などについて書いていきます。


### Splunk Enterpriseの構成要素
Splunk Enterpriseの主な構成要素は以下となります。


業務コンポーネント(Splunkの機能を利用するために必要なコンポーネント)
- Search Head(SH)
- Indexer
- Forwarder(Universal Forwarder/Heavy Forwarder)

管理コンポーネント(Splunkを管理するために必要なコンポーネント)
- Search Head Cluster Deployer(SHC-D)
- Indexer Cluster Manager Node(Cluster Manager/CM)
- Deployment Server(DS)
- Monitoring Console(MC)
- License Master(LM)

![スクリーンショット 2024-01-25 15.03.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/94ddaa31-f65a-a0cf-b793-d844c0818e0e.png)
※上図にはCluster Manager(CM)は含まれていません

以下資料　P9より引用
https://www.splunk.com/en_us/pdfs/tech-brief/splunk-validated-architectures.pdf

最も基本的なコンポーネントがSearch Head, Indexer, Forwarderの3つです。

それ以外のコンポーネントはManagement用のコンポーネントであり、デプロイ管理やクラスター管理、ライセンス管理や監視などの役割を持っています。

### Search Head
ユーザーにUIを提供します。UIから、ユーザーはサーチを実行できます。
サーチ処理をスケジュール化したり、サーチ処理の結果を参照してアラートを設定することもできます。

### Indexer
Forwarderから取得したデータを処理し、インデックスと呼ばれるバケツに保管します。
またSearch Headからのサーチ処理司令を受け取り、結果を変換する機能を持ちます。

### Forwarders
いわゆるエージェントです。サーバーやネットワーク機器にこのエージェントをインストールし、ログをIndexerに転送させることで、splunkはデータを収集します。
軽量だが最低限の機能しか備えていないUniversal Forwarderと、重量で追加ライセンスも必要だがデータの加工などの追加機能があるHeavy Forwarderの二種類があります。


### Search Head Cluster Deployer
Search Headをクラスター環境でデプロイおよび利用する場合に必要なコンポーネントです。
Search HeadへSplunk Appや設定を配信する役割を持ちます。
Search Head Clusterを構築するためには、3台以上のSearch Headが必要です。

### Cluster Manager(Indexer Cluster Manager Node)
Indexerをクラスター環境でデプロイおよび利用する場合に必要なコンポーネントです。
Indexerをクラスタ化した場合、インデックスをどのサーバー上に作成させるか、また障害発生時の処理などを行います。
Indexer Clusterを構築するためには、2台以上のIndexerが必要です。
以前はManagerではなくMasterと呼ばれていた時期もあるようです。名前が複雑なコンポーネントです。

### Deployment Server
多数あるForwarderの設定管理や、Splunk Appの配信をするコンポーネントです。
データソースであるForwarderは、多種多様で複数の機器にインストールされているため、これらに対して一つ一つ設定変更作業を行うのは手間がかかります。
Deployment Serverを利用することで、それらForwarderに対する一括の設定変更、管理をすることができます。

### Monitoring Console
Splunkのサーチやインデックス作成処理などの利用状況の監視やアラート、ヘルスチェックを行うコンポーネントです。ユーザーはSearch HeadをUIとしてMonitoring Consoleを利用します。

### License Master
Splunkのライセンス管理を行うコンポーネントです。Splunkのライセンスはデータ量によって課金が発生するため、そのデータ量を計測し、ライセンスが問題ないかをこのコンポーネントが管理しています。
あまり処理負荷が高い機能を持たないため、他コンポーネント、例えばMonitoring Consoleなどと同一サーバー上で動作させることを推奨します。