OmniAICreator/Qiita-1.07M huggingface dataset:
私がアウトプットできるようになった理由

## はじめに

◆この記事は何？
この記事では、「**私がアウトプットを実践することで得られた経験**」と「**具体的な記事の書き方**」を共有します。

全くアウトプットできなかった私が、この1週間で5本の記事を書けました。
どんな変化があったかを共有します。

この記事は、2024年3月24日に開催されたLT会の発表資料です。

◆対象は？
アウトプットに興味はあるが、なかなか実践に移せていない人

◆この記事のねらい
アウトプットのやり方や思考法について参考にしてもらい、アウトプットに繋げてもらう

## 先に結論
- 反応が期待できる場所で、とりあえずやってみる
- 技術記事の書き方=「ファクト」+「自分なりの視点」
- 「自分なりの視点」とは、感想、意見、経験、得意領域との組み合わせ

## 自己紹介
花田と申します。

データサイエンティスト/機械学習エンジニアとして働いています。

これまでは、資格を取ることで知識を獲得してきました。しかし、実際にアウトプットする機会はほとんどありませんでした。
Qiitaにアカウントは作成しましたが、習慣的に投稿するまでには至らない状態でした。

## 保有している資格の例

◆データサイエンス系
- 統計検定2級
- 統計検定 データサイエンス発展
- G検定
- E資格
- JDLA Generative AI Test 2023
- データサイエンティスト検定
- データサイエンス数学ストラテジスト
- AI実装検定S級

◆AWS認定
- AWS Certified Cloud Practitioner
- AWS Certified Solutions Architect - Associate
- AWS Certified Machine Learning - Specialty

◆IPA
- 基本情報
- 応用情報

## アウトプットしたいと思った理由

たくさん資格を取っても、基礎から身についていないように思えていました。
付け焼き刃の側面がありました。

そんな悩みを抱えながら、名著[「世界一流エンジニアの思考法」](https://amzn.asia/d/j884M03)で以下のような一説に出会い、大きな影響を受けました。

> 私は彼らより「時間はかかるけど、やろうと思ったら誰でもできる基礎」ができていないのだ。

という一節や、

> 最初からアウトプットを意識

というスタイルに刺激されました。

「2024年4月のIPA試験の勉強を通じて、アウトプットできるようになりたい」と決めました。

## きっかけ
3月上旬に、勉強会に参加しました。
初めての社外の勉強会参加でした。

https://connpass.com/event/309916/

勉強会で、学んだことをアウトプットする時間がありました。
私は、mermaidでシーケンス図を書いて、デジタル署名について参加者さんに共有しました。

すると「シーケンス図が綺麗」や「mermaidは知らなかった」などの反応をいただきました。

「これはもしかすると価値があるのでは？」と思い、最初の記事を書きました。

https://qiita.com/makotohanada/items/76b5aab4996700866915

さらに記事に反応をいただきました。

https://twitter.com/masaru_benkyou/status/1769884482272927870

次に書いたのがこちらです。

https://qiita.com/makotohanada/items/a0f25976d9ac00d2e099

反応を貰いやすいところで、「とりあえずやってみる」ことの重要性を理解しました。

やってみると反応がもらえることがあり、記事の改善や継続のモチベーションにつながります。

Qiitaのトレンドにも入り、より加速しました。

そして、徐々に書き方がわかってきました。

## 技術記事の書き方

### 記事に「型」がある

技術記事に型があることがわかってきました。
- 「はじめに」
    - ①この記事は何か
    - ②対象は誰か
    - ③ねらいは何か
- 結論
- 中身
- 「おわりに」

上記の「型」が自分には合っていました。

本記事も同じ構成になっています。

### 技術記事=ファクト+自分なりの視点
「技術記事=ファクト+自分なりの視点」だと分かってきました。

ただのファクトだけだと、他の方がすでに書かれている内容と重複します。また、本にあることをそのまま書いてしまうことになりやすいです。

「自分なりの視点」とは、感想、意見、経験、自分の得意領域との掛け合わせなどです。

私の場合だと、mermaid（シーケンス図）とセキュリティを掛け合わせました。

この記事自体も、「アウトプットする方法」だけだと世の中にたくさんあると思いますが、私自身の経験を組み合わせています。
同じような境遇の方にとって参考になればと思っており、大げさに言えば、経験を組み合わせることで価値を高めています。

## アウトプットして良かったこと

記事を書くと、知識が定着するようになりました。

いま書いた記事の内容は何も見ずに説明できる自信があります。
これは、以前の私にはなかった自信です。

これまでの試験勉強と大きく違う実感があります。
アウトプットできるようになって良かったです。

## おわりに

全くアウトプットしてなかった私が、アウトプットできるようになった経験を共有しました。

これからは、記事を通じて周りのエンジニアさんとコミュニケーションをとり、自分なりのアウトプットを磨いていきたいと思います。

反応いただけると嬉しいです。

反応されてアウトプットできるようになったと思っていますので、私も反応しにいきます。

皆さんのアウトプットを見ることができれば、私も刺激を受けると思います。どんな小さなことでも共有していただけると幸いです。

記事を書いたら是非教えてください。

それでは。
zustand

# zustandとは
ZustandはReactのための軽量でシンプルな状態管理ライブラリ
# set up
```
npm install zustand
```
# 使い方
#### storeの作成
```
import create from 'zustand'

// カウンターストアの定義
const useCounterStore = create(set => ({
  count: 0,
  increment: () => set(state => ({ count: state.count + 1 })),
  decrement: () => set(state => ({ count: state.count - 1 })),
}))
```
#### コンポーネントでのストアの使用
```
import React from 'react'
import { useCounterStore } from './store' // ストアをインポート

const CounterComponent = () => {
  const { count, increment, decrement } = useCounterStore()
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={increment}>Increment</button>
      <button onClick={decrement}>Decrement</button>
    </div>
  )
}

export default CounterComponent
```
globalにならないようにpageごとにstateを管理する。
子コンポーネントへのstateの受け渡しはContext APIを使用する

https://ja.react.dev/reference/react/createContext

https://react.dev/reference/react/useContext

例

https://tech.codmon.com/entry/2023/12/18/100000#:~:text=%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82-,Context%20API,-React%20%E3%81%AE%20Context

# Recipes
https://github.com/pmndrs/zustand?tab=readme-ov-file#recipes
滑らかなNRZ信号の作成方法

現実に近い信号を作成するために、NRZ(Non Return to Zero)信号の1シンボルの信号を表す基本パルスを作成します。その関数を式に示します。このような式を用いることで、立ち上がりと立下りが滑らかな現実的な信号を作成することが出来ます。
```math
F(t)=1/2(tanh(t/A) -tanh((t-T)/A) 
```
このとき、Tは1シンボルあたりの時間幅、Aはシンボルの立ち上がりの傾きを定める定数、tは時間を表しています。青色がtanh (t/A) 、赤色がtanh (t-T/A) 、黒色が青色と赤色の信号の差です。 


```python
    import numpy as np
    import matplotlib.pyplot as plt
    import math

    def main():    
    ######################パラメータ######################
    N = 2**10 #データ点数
    syps = 28e9 #シンボル速度 baud
    T = 1/syps #半値幅
    A = 0.9*math.pow(10, -12) # 立ち上がりの傾き
    trange = 5.714e-10    #全時間幅
    dt = trange/N
    #####################################################
    
    ########################軸設定########################
    t = np.linspace(-trange,trange,N) #グラフ用
    t_ori = np.linspace(-trange,trange,N) #計算用
    time = t
    #####################################################
    
    #####################信号波形作成#####################
    t_ori += T #半値幅
    signal = np.zeros(N, dtype=np.float64) 
    
    ###信号生成
    t_ori -= T #半値幅
    signal_tanh = np.tanh(t_ori / A) 
    signal_phase = np.tanh((t_ori - T) / A ) 
    result = signal_tanh - signal_phase 
    
    ######################グラフ作成######################
    plt.rcParams["font.size"] = 14
    plt.figure('signal_wave')
    plt.subplot(111)
    plt.plot(time, result, color = 'black') 
    plt.plot(time, signal_tanh, color = 'blue')
    plt.plot(time, signal_phase, color = 'red')
    plt.xlabel("Time[ns]")
    plt.ylabel("Power")
    plt.grid()
    plt.show()
    #####################################################
    
    return 0
    
    if __name__ == "__main__":
    main()
```
JavaScript基礎①

学校で学んだJavaScriptの基礎の振り返りを作成していきます。
あくまでも個人メモであることをご了承ください。

まずJavaScriptはインタプリタ言語です。

:::note info
プログラムを逐次解釈しながら実行する言語のこと
:::

JavaScriptではJIT(Just-In-Time)コンパイラを利用して実行します。

JavaScriptを最低限利用するするには
テキストエディタとWebブラウザが必要です。

JavaScriptのプログラムはScriptタグ内(<script>~</script>)に記述します。

```html:sample001.html
<script type="text/javascript">
(ここに記述する)
</script>
```

また、JavaScriptのプログラムを外部ファイルに定義しておき
HTMLに組み込んで利用することもできます。
その場合は「src属性」を利用します。

```html:sample002.html
<script type="text/javascript" src="○○○.js"></script>
```

JavaScript作成上の注意点としては
・文末には「;(セミコロン)」を付加する
・大文字と小文字は区別される
があります。

文字列の表示には
document.write
ポップアップウインドウでの文字列の表示には
window.alert
を使用します。

```html:sample003.html
<script type="text/javascript">
    document.write("表示したい文字列")
</script>
```

```html:sample004.html
<script type="text/javascript">
    window.alert("表示したい文字列")
</script>
```

今回は以上です。
AtCoder Beginner Contest 327 振り返り

# ABC327

## 概要

https://atcoder.jp/contests/abc327

## A - ab

**考えてたこと**
あまりどうやって実装すれば良いか分からなかった問題。素直に実装。

**提出したもの**

```c++:a.cpp
int main() {
    int n;
    cin >> n;
    string s;
    cin >> s;

    bool judge = false;

    for (int i = 0; i < n - 1; i++) {
        if (s[i] == 'a' && s[i + 1] == 'b') {
            judge = true;
        }
        if (s[i] == 'b' && s[i + 1] == 'a') {
            judge = true;
        }
    }

    if (judge) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }
    return 0;
}
```

**振り返り**
解答も素直に実装してたからこの感じで良さそう。

## B - A^A

**考えてたこと**
最初A^2かと思ってsqrt使ってたらテスト転けて問題が全然違っていてびっくりしました。
Aのパターンが適当に考えても18までしかないから、先に計算しておいてvectorに保存、全探索で十分足りるかなぁと考えて解きました。仮にオーバーフローしても問題なさそうなコードになったと思います。

**提出したもの**

```c++:b.cpp
ll calculate(ll a) {
    ll result = 1;
    for (int i = 0; i < a; i++) {
        result *= a;
    }
    return result;
}
int main() {
    ll b;
    cin >> b;

    vector<ll> vec(20);
    for (ll i = 0; i < 18; i++) {
        vec[i] = calculate(i);
    }

    int ans = -1;
    for (int i = 0; i < 18; i++) {
        if (vec[i] == b) {
            ans = i;
        }
    }
    cout << ans << endl;
    return 0;
}
```

**振り返り**
問題はちゃんと読みましょう。ただリカバリー早くて偉かった。

## C - Number Place

**考えてたこと**
単純な実装力を求められているのかなぁ...と考えて素直に実装。

**提出したもの**

```c++:c.cpp
int main() {
    int glid[9][9];
    rep(i, 0, 9) {
        rep(j, 0, 9) {
            cin >> glid[i][j];
        }
    }

    bool judge = true;

    rep(i, 0, 9) {
        set<int> set;
        rep(j, 0, 9) {
            set.insert(glid[i][j]);
        }
        if (set.size() != 9) {
            judge = false;
        }
    }

    rep(i, 0, 9) {
        set<int> set;
        rep(j, 0, 9) {
            set.insert(glid[j][i]);
        }
        if (set.size() != 9) {
            judge = false;
        }
    }

    for (int i = 0; i < 3; i++) {
        set<int> set;
        for (int j = 0; j < 3; j++) {
            for (int k = 0; k < 3; k++) {
                set.insert(glid[j + 3 * i][k + 3 * i]);
            }
        }
        if (set.size() != 9) {
            judge = false;
        }
    }

    if (judge) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }
    return 0;
}
```

**振り返り**
正方形の部分の確認の実装にちょっと困ったけど、for文3つで良い感じに実装できた。

**振り返り**
D問題が解説読んでもまだ咀嚼できてないからもっと復習。
【初心者向け】生成AI系の用語の整理

こんにちは。Kaneyasuです。

2月に発売されたAmazon Bedrock超入門を読んでみました。
書籍を読んでみると、そもそも自分の中で用語の整理ができてないと感じたので、自分用にブログを書きながら整理してみました。

https://amzn.asia/d/bj3Sp15

# AIモデル＝LLM＝基盤モデル

AIの実体は機械学習のモデルです。
AIモデルは機械学習のモデルなので、本来は自前で学習をさせねばなりません。
自然言語でやりとりできるよう、膨大な自然言語のデータを学習させているAIモデルは、大規模言語モデル（Large Language Model、略してLLM）と呼ばれます。
基盤モデルとも呼ばれるようです。

一般的に、AIモデルというと事前学習済みの大規模言語モデルを指し、AIモデル＝大規模言語モデル（LLM）＝基盤モデルを連想するようです。
この書籍の中（というかAWSマネジメントコンソールの中）でも、厳密には使い分けることができてないようで、AIモデル＝LLM＝基盤モデルと思っていいのではと感じました。

# AIプラットフォーム

ChatGPTのGPTの部分は、AIモデルです。
AIモデルは世の中に多数あり、AIモデルを動かす基盤がAIプラットフォームです。
AIプラットフォームは、好きなAIモデルを選択して動かせるようになっています。

3大クラウドのAWS、Azure、GCPにはそれぞれAIプラットフォームのサービスが存在します。

AWS - Amazon Bedrock

https://aws.amazon.com/jp/bedrock/

Azure - Azure AI

https://azure.microsoft.com/ja-jp/solutions/ai

GGP - Google VertexAI

https://cloud.google.com/vertex-ai?hl=ja

# Amazon Bedrockで提供しているAIモデル

Amazon Bedrockで提供されてるAIモデルは以下のものがあります。
先日話題になったClaude3もAIモデルの一つです。

- Amazon　Titan
- AI21 Labs/Jurassic-2
- Anthropic/Claude
- Cohere/Command
- Meta/Llama 2
- Stability AI/Stable Diffusion XL

# Amazon BedrockとAmazon Kendraの違い

よくセットで語られるAmazon BedrockとAmazon Kendraですが、この2つは扱っている領域が違います。

https://aws.amazon.com/jp/kendra/

https://aws.amazon.com/jp/kendra/features/

Amazon　Kendoraは機械学習 (ML) を利用した検索サービスで、自然言語で検索可能です。
ドキュメントの在処を指定すると、渡された自然言語から該当するドキュメントを検索します。
また、検索の精度を機械学習で高めることができます。
検索までで、回答そのものを作るサービスではりありません。

Amazon BedrockとAmazon Kendraを組み合わせて使用する場合、
質問の回答になり得そうなドキュメントをAmazon Kendraで探し、
Amazon BedorkがHITしたドキュメントたちから回答を作るという役割分担をします。

# ハルシネーションとRAG

ハルシネーションとは、人工知能が学習したデータからは正当化できないはずの回答を堂々とする現象です。
一言で言うと、知ったかで答えてくるということです。

https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%AB%E3%82%B7%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3_(%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD)

これを軽減する手法がRAG（Retrieval-augmented Generation）です。

https://aws.amazon.com/jp/what-is/retrieval-augmented-generation/

>RAG は、LLM の既に強力な機能を、モデルを再トレーニングすることなく、特定の分野や組織の内部ナレッジベースに拡張します。LLM のアウトプットを改善するための費用対効果の高いアプローチであるため、さまざまな状況で関連性、正確性、有用性を維持できます。

要はAIモデルを回答を作る時に、ネタ元を提供することで誤回答を防ぐ手法です。
Amazon Bedrockで言うと、「Amazon Kendraの検索結果をネタ元として回答を作成するよう指示する、これにより精度をあげる手法」という感じです。
私はRAGのことは、機能が存在するというより、設計・構築手法と捉えています。

https://aws.amazon.com/jp/blogs/news/quickly-build-high-accuracy-generative-ai-applications-on-enterprise-data-using-amazon-kendra-langchain-and-large-language-models/

# Ragas

Ragasとは、RAG（Retrieval Augmented Generation） Assessmentの略で、RAGを用いた回答を得る仕組みを評価するフレームワーク（手法）です。
機能のことではありません。

https://docs.ragas.io/en/latest/concepts/metrics/index.html

# LangChain

AIモデルにプロンプト（質問）を投入すると回答が得られます。
ただし、AIモデルではチャットのようなものは用意されていません。
また、AIモデルごとにプロンプトの投げ方、回答の返り方が異なるので開発者はAIモデルごとの差を意識して実装する必要があります。

チャットを実現できるように、やり取りを記録する、やり取りを踏まえて回答する機能。
AIモデルごとの入出力形式の差を吸収するのがLangChainです。
LangChainを通してAIモデルとやり取りすることで、チャット形式に対応したり、AIモデルを変えても対応できたりします。

https://aws.amazon.com/jp/what-is/langchain/
【Windows】Ninja 導入

## Ninja とは
Ninja とは、ビルドシステムの 1 種である。
Make よりも高レベルなビルドシステムによってビルドファイルを生成することで、高速なビルドを可能にしている。

## 前準備
### Git のインストール
https://qiita.com/semiflat/items/eccbb1272d3059172b29

### CMake のインストール
https://qiita.com/semiflat/items/c466c4751e1352f97ce6

### Build Tools for Visual Studio 2022 のインストール
https://qiita.com/semiflat/items/43988856501ca94526e4

## Ninja のインストール
コマンドプロンプトを管理者として実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749137/b71d0536-e243-6b89-5f5a-f9cb4a8bd507.png)

以下のコマンドラインを実行
```
C:
cd %HOMEPATH%
rmdir /s /q ninja
git clone git://github.com/ninja-build/ninja.git
cd ninja
git checkout release
rmdir /s /q build
mkdir build
cd build
del CMakeCache.txt
cmake .. -G "Visual Studio 17 2022" -A x64 -T host=x64 ^
    -DCMAKE_BUILD_TYPE=Release ^
    -DCMAKE_INSTALL_PREFIX="C:/ninja"
cmake --build . --config RELEASE
cmake --build . --config RELEASE --target INSTALL
.\Release\ninja_test.exe
```
エラーメッセージが出ていなければ OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749137/a051393f-8f75-7b92-868b-5bb38e6d2a1b.png)

### git clone で以下のエラーが発生する場合
```
C:\Users\**>git clone git://github.com/ninja-build/ninja.git
Cloning into 'ninja'...
fatal: unable to connect to github.com:
github.com[0: 20.27.177.113]: errno=Unknown error
```
Git ポートが制限されているために発生している。
よって、以下のコマンドラインを実行することで解消することができる。
```
git config --global url.https://github.com/.insteadOf git://github.com/
```

## Ninja にパスを通す
コマンドプロンプトを管理者として実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749137/b71d0536-e243-6b89-5f5a-f9cb4a8bd507.png)

以下のコマンドラインを実行
```
powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable(\"Path\", \"Machine\"); $oldpath += \";C:\ninja\bin\"; [System.Environment]::SetEnvironmentVariable(\"Path\", $oldpath, \"Machine\")"
```
Windows11でPython環境の自動構築

Pythonで作成したアプリを社内で配布したいとき、exe化するのが最も手っ取り早いと思いますが、やんごとなき事情によりPythonのファイルをそのまま配布したい時があります。

その場合、使うPCでPythonの環境構築をしてもらう必要がありますが、コマンドを１行見せただけで蕁麻疹が出てしまう人には非常にハードルが高いです。

そこで、Pythonの環境を自動構築するバッチファイルを作成してみたので、ここにメモしておきたいと思います。もう少しスマートな方法をご存じの方いましたら、アドバイスいただけると幸いです。

なお、デバッグは`Windowsサンドボックス`で行いました。Windowsの環境を汚さずに試行できるのでお勧めです。使い方はこのサイトを参考にしています。

https://dekiru.net/article/18773/

## 前提条件

- Windows11
- `winget`などの便利なツールがインストールされていない
- Pythonもインストールされていない
- バッチファイル1つの読み込みで設定完了させる

## 構成

今回は一つのフォルダの中に以下のファイルを格納しています。

- `install_python.bat`
- `install_python.ps1`
- `setup_venv.ps1`
- `python-3.11.0-amd64.exe`
- `requirements.txt`

### PowerShellスクリプト

全てバッチファイルに書いてもよいのですが、個人的にはPowerShellスクリプトの方が慣れているのでこちらをメインに使用しています。

PowerShellスクリプトは2つに分けています。

``` powershell:install_python.ps1
# Pythonインタプリンタのパスを取得する
$is_python = Get-Command python -ErrorAction SilentlyContinue

if ($is_python -eq $null) {
    echo "Python is not installed. Installing Python..."
    # すべてのユーザーにインストールしない、パスを追加する、テストを含めない
    ./python-3.11.0-amd64.exe /quiet InstallAllUsers=0 PrependPath=1 Include_test=0
    echo "Python has been installed."
}else{
    echo "Python is already installed."
}

echo "We will start to setup a virtualenv in 10 seconds..."
```

`install_python.ps1`は主にPythonのインストーラを起動させてインストールするためのファイルです。

``` powershell
./python-3.11.0-amd64.exe /quiet InstallAllUsers=0 PrependPath=1 Include_test=0
```
ここがメインの部分です。`Python 3.11.0`のインストーラを起動して特定のユーザーのみにインストールしてPathを通す設定になっています。以下の記事を参考にさせてもらいました。

https://qiita.com/hrys1152/items/dcfcdef941fe8c8108ba

`Python 3.11.0`のインストーラは以下のページからダウンロードしています。

https://www.python.org/downloads/release/python-3110/

``` powershell:setup_venv.ps1
$VENV_PATH = $HOME + '\venv\dev311'

# すでに\venv\dev311という仮想環境が存在しているかチェック
if (Test-Path $VENV_PATH) {
    Write-Host "Virtual environment already exists at $VENV_PATH"
    exit
}

& $HOME\AppData\Local\Programs\Python\Python311\python.exe -m venv $VENV_PATH
& $VENV_PATH\Scripts\python.exe -m pip install --upgrade pip
& $VENV_PATH\Scripts\pip.exe install -r requirements.txt
```

`setup_venv.ps1`は仮想環境を構築するためのファイルです。仮想環境構築のコマンドはいつも通りの`python -m venv <仮想環境名>`を、ライブラリのインストールは`pip install -r requirements.txt`を使用して`requirements.txt`に記述されたものをインストールするようにしています。

### バッチファイル

``` batch:install_python.bat
@echo off
powershell -ExecutionPolicy Bypass ./install_python.ps1
timeout 10 /NOBREAK
powershell -ExecutionPolicy Bypass ./setup_venv.ps1
```

2つのスクリプトファイルを逐次実行させるためのファイルです。このファイルを起動してもらう想定です。2つ目の仮想環境を構築するスクリプトを実行させる前に、10秒間待つようにしています。

## つまずいた点

### 1. バッチファイルを抜けないと`Python`コマンドを認識してくれない

これが`$HOME\AppData\Local\Programs\Python\Python311\python.exe`としてPythonを動かしている理由です。`Env:Path`などで一時的に`Path`を通そうとしてもダメでした。このあたりの解決策わかる方いたらだれか教えてください。

### 2. PowerShellスクリプトファイルを1つにすると`<フルパス>\python.exe`が実行できない

インストーラ―の実行が完了した時点で`python.exe`の配置が完了しているようですが、一旦、`PowerShell`のプロセスを終了させないとフルパスで指定したとしても`python.exe`の存在を認識できないようでした。

### 3. デフォルトでインストールされているライブラリを認識させるためには一定時間待つ必要がある？

バッチファイル内で10秒間処理を止めているのはこれのためです。なぜかわかりませんが5秒以内に環境構築を開始した場合はプロセスエラーになったり、Pythonが起動しなかったり、様々なエラーが発生しました。これは使用するPCの性能によって変わるかもしれません。

ちなみに、ベース環境で`pip install`を実行しようとすると、バッチファイルを抜けるまでは何秒待っても`pip`を認識してくれませんでした。
客先駐在でのテスター業務から得たこと・感じたこと

## はじめに
2024年1~3月の間、客先駐在でテスター業務に従事しております。(現在進行形)
2023年8月に未経験で受託企業のエンジニアとして入社し、客先駐在やテスト業務は未経験であったため肌で感じたこと、大事だと思ったことを綴ろうと思います。

## 対象者
- テスターをしたことがないエンジニア
- これからテスト業務に従事する方

そんな方々の参考例になれば嬉しいです。

## プロフィール
2023年8月
受託開発企業のサーバーサイドエンジニアとして入社

2023年8月~12月
GPTサービス(toB, toC)の開発

2023年1月~3月(現在)
客先駐在にてテスターとして従事

現在の業務内容は、試験仕様書にテストケースというものがExcel形式であり、それに沿ってブラウザで挙動確認していく業務になります。

## 本編
3ヶ月の業務を通じて感じた大事なことを5つに絞ってまとめてみます。

### コミュニケーション
背景としては、以下のような場面

【品質面】
テスターは、システム開発の最終工程ということもあり、自ら情報を拾いにいかないといけない状況がよくありました。
例えば、
- 試験仕様書が抽象的な表現で正解がわからない（「なんちゃらが正しい表記であること」→正しくとはどういう状態やねん！的な）
- 試験仕様書に「手動でバッチ動かして」とあるけど、バッチの動かし方知らん、バッチはどれやねん

【納期】
エンジニアをしていると新機能開発に追われ、後工程（テスト）からの依頼を見逃されることがよくあります。
例えば、
- バグがあり、修正の依頼を上げといたが2週間以上経っても未対応からステータスが変わらない
- バグ修正したときたけど、確認したものの治っておらず手戻ししたら音沙汰がなくなる


以上のようなことがあっても、納期を守って業務を終わるため
**「エンジニアに嫌われようが、PMに嫌われようがさっさと答えんとリリースできんやろ~~ボケ~~」**
という気持ちを持ち続けて粘り強くコミュケーションをとりにいきましょう（脳筋）

特に客先駐在のフルリモートであると、相手の人となりが全くわからないため質問するの嫌だなと思う人もいるかもですが、相手からしても自分の人となりがわからず、何がわからないかわからないのでこちらから聞いたり、発信した方が親切と思いながらやってました（こっちが本音）

実際、こちらから働きかけると
- 試験仕様書の表現や内容がわからない → 通話ですぐ教えてくれたり、どのフォルダに何が入ってるという情報を丁寧に教えてもらえる
- バグ修正　→　ただの見逃しで言ったら翌日には修正されている

といった成功体験があるので、ぜひ積極的に働きかけてみてください。
逆に指示待ちだと、難易度の高い仕事を振られなくなり将来的な自身の損に繋がりかねないとも感じました。

### 情報共有
これは、コミュニケーションで書いた部分と重なる部分もあります。
大きなサービスになると納期までにテストを終わらすことが1人では対応不可能な量のテストケースがあります。
その中で、試験で使用するツールの技術取得や思い出すことを各人がヒントなしでやったり、仕様書の同じ質問が飛び交っていてはとても間に合いません。

そこで、
- 初めて触ったAWSのサービスや試験のやり方はドキュメントに残しておりました。実際業務では、Qiita Teamというサービスに合計12記事くらい投稿してました
- 仕様書の不明点でわかったことがあれば、すぐにチームのチャットで共有する（これをする人としない人でチャットの出現回数に明らかに差が出る）

みたいことをしてました。
ドキュメント作りも最初は指示があってやってましたが、慣れるとこれはやっといた方がいいという勘ができたり、作成時間も30分かからずできるのでこれからも勝手にやっていこうと思ってます。

### 文章のわかりやすさ
これもコミュニケーションで書いた部分と重なる部分あります。
試験を進めるために、仕様書の確認やバグの修正を依頼するとき、思っていた回答が返ってこないや自分の依頼の確認のラリーを極力減らして効率よく進めないと業務が終わりません。
- 仕様書の確認では、何がわかっていて、何を教えて欲しいのかはっきり伝えること
    - 何もやり方がわからない場合は、申し訳ないが一回お手本見せてください
    - 試験の期待結果がわからない場合は、ここまでテストしたがこれは正しいですか(写真付)、要件定義にも明記されておらずのため教えてください

のようにケースバイケースで自分のお願いをハッキリさせていってます。
（「このテストの内容わからないので教えてください」とかしないようにしてました）

- バグの修正を依頼では、書き方を決めて早く丁寧に起票してました、書く内容としては
    - 【概要】
    対象の要件定義がこれに対して、実際はこうなっており異なります（要件定義のスクショ）といった旨の内容記述
    - 【再現手順】
    実際のブラウザで行った手順
    ①、②、③、、のように何をしたかを1文で簡潔に、スクショ付きで大事なところをペンで強調
    - 【期待結果】
    再度、実際はこうなってほしいことを記述

といった何回かの起票経験でスッとやりとりが終わったことをテンプレートとしてしていました。（簡単な修正は概要だけにするなど柔軟にもしてました）
ポイントは、文章は長々と書かず、写真で見てもらうようにしてました。読むの怠いと思ったので

### マインド
テストを消化しているだけでは、単調でつまらないという気持ちになる時もあります。
そこで自分のしている業務は、
**「このサービスはユーザーにこんな体験を与えるもの」**
という気持ちを偶に思い出すようしてます。（少し視座を上げる）

こうすることで、自分もサービスを作っている端くれという気持ちが芽生えるのか主体的に取り組めておりました。

「やらされている感」で仕事をすることが嫌いな方は、一つだけでも視野を広げてみて業務してみることおすすめです。

### メリハリをつける
これはどの業務もですが、高いパフォーマンスを続けるためにメリハリは大事だと感じました。
例えば、試験工程も複雑でバグだらけの試験を何ヶ月をしていては、テキトウでいいかという気持ちになりかね、中々試験が進まず疲れも溜めると思います。
そこで、1.5週複雑な試験をしたら、0.5週は簡単な試験をするなどでメリハリが効いて自身のパフォーマンスも維持できていると感じました。
パフォーマンスに影響出るようであれば、恐らく普段からコミュケーションを取っていれば、複雑な試験が続いていると直属の上長は認識していると思うため、相談してもいいかと思います。（自分は幸運にもそんなことなかったですが）

## 最後に
テストはユーザーに届く前の最後の重要な業務です。
そのため、テスターだけでなく、開発するエンジニアからもQA部門と積極的に仕事をする意識を持つことが大事を学びある機会となりました。
ぜひ、サービスの品質保証を意識するきっかけになれば幸いです。
文字コード

# はじめに
今回は文字コードについて気になったので軽く調べたことをメモ程度にまとめていきたいと思います。

# 目次
①文字コードとは
②文字コードの種類と特徴
③雑談
④参考文献


# ①文字コードとは
簡潔に文字コードとは、「あ、い、う、え、お」などの文字一つ一つにコンピューターが理解しやすいように特有の番号を割り振りっています。その文字コードの種類は様々です。具体例を挙げてみると下記のようになります。
|文字コード名|文字コード|文字|
|:--:|:--:|:--:|
|UTF-8|E38181|あ|
|S-JIS|829F|あ|
|EUC-JP|A4A1|あ|

このように同じ「あ」という文字を表すだけでも文字コードの違いによって大きく異なってくるのです。
この原理がわかればたまにサイトを見ていて「å°ã«ãã¾ãã」このように文字化けしてしまう理由もなんとなく理解できるのではないでしょうか。


# ②文字コードの種類
調べてみて代表的だったいくつかの文字コードを紹介します。
|文字コード名|文字コード|
|:--:|:--:|
|ASCII|最も基本的な文字コード、アルファベットや数字、記号などを収録した文字コード。|
|JIS|日本が定めた日本の文字コード。|
|Shift_JIS|日米のコンピュータ業界数社が共同で開発した日本語を含む文字コード。|
|UTF-8|最もポピュラーな文字コードの一つ。|

# ③雑談
文字コードを知る過程で「Unicode」や「UTF-8」について認識が曖昧だと感じたので少し深掘りしてみた。
Unicode　→　「あ」のような文字が数値(コードポイント)に変換されたもの。その数値達を文字符号化集合と言います。

UTF-8　→　コードポイントをどのように表現するかをさらに定める方式である(文字符号化方式)
参考文献にもっと詳しく紹介している方がいたので掲載してあるので興味のある方はぜひ読んでみてください。

# ④参考文献
・https://e-words.jp
・https://qiita.com/omiita/items/50814037af2fd8b2b21e (UnicodeとUTF-8の違いについてはこちらから)
wslで、最小のカーネルをコンパイル その20

# 概要
wslで、kernel.elfのコンパイル、やってみた。
シーケンシャルな番号で、FDCのhead,track,sectorを求めたい。

# サンプルコード


```
#include <stdio.h>

const int FLPY_SECTORS_PER_TRACK = 18;

void flpydsk_lba_to_chs(int lba, int * head, int * track, int * sector) {
	* head = (lba % (FLPY_SECTORS_PER_TRACK * 2)) / (FLPY_SECTORS_PER_TRACK);
	* track = lba / (FLPY_SECTORS_PER_TRACK * 2);
	* sector = lba % FLPY_SECTORS_PER_TRACK + 1;
}

int main(void) {
    int sectorLBA = 33;
	int head = 0,
		track = 0,
		sector = 1;
	flpydsk_lba_to_chs(sectorLBA, &head, &track, &sector);
	printf("head : %d \n", head);
	printf("track : %d \n", track);
	printf("sector : %d \n", sector);
	
}

```

# 実行結果

```
head : 1 
track : 0 
sector : 16 
```

以上。
PythonのLEGBとは何ですか? 説明しました。

Python の変数スコープの概念は、通常、LEGB ルールとして知られるルールを使用して表現されます。 LEGB の頭字語は、ローカル、エンクロージング、グローバル、および組み込みスコープを表します。

LEGB は、Python の 4 つのスコープ (ローカル、エンクロージング、グローバル、ビルトイン) を表す頭字語です。 これらのスコープは、Python がコード ブロック内で変数を見つけたときに変数を検索する順序を決定します。

注: Python は関数のローカル コード ブロック内の変数を探し始めます。そこに変数が存在しない場合は、Enclosed ブロックを探し始めます。つまり、その内部関数が外部関数に囲まれているかどうかを意味します。 そうであれば、外側の関数コード ブロックを調べます。囲まれたコード ブロックでその変数が見つからない場合、Python はグローバル空間で検索を開始します。つまり、どの関数の内側にもない変数を意味します。 これはすべての関数の外側で定義されます。 それがグローバル変数です。 それがグローバル空間にない場合、Python は組み込み空間で検索します。つまり、Python プログラムを実行すると、Python は自動的に組み込みライブラリをロードします。このライブラリにはいくつかの関数と変数があります。
したがって、ローカル、エンクローズド、グローバルで変数が見つからない場合、Python は最終的に Builtins のライブラリ Variable でそれらの変数を探します。

## 以下のコードスニペットを観察してください

Example:
```py:
a=100 #Global Variable
def fun1():
    b=200 #Local variable for fun1(), (Non Local variable for fun2()
    def fun2():
        c=300 #Local variable for func2()
        print(f'Global variable {a}')
        print(f'Non Local variable {b}')
        print(f'Local variable {c}')
        print(f'Builins {__file__}')
    fun2()


fun1()
```

Output
```
Global variable 100
Non Local variable 200
Local variable 300
Builins C:\Users\rahul\PycharmProjects\pythonProject4\test44.py
```
AIと人間、AIと機械の違い

# 【AIと人間の違い】
1. どれが対処すべき問題なのか自分で決められない
▫️ 決められた範囲以外はカバーできない。
与えられた課題を解くことはできるが、自発的に課題を探してくることはできない
＝どれが対処すべき問題なのか判断できない

2. どうしたら課題解決となるかを自分で決められない
▫️ 臨機応変が効かない。
どこを目指すかは人間が決めなければならない。
決められた方向性を機械的に満たすことはできる。
(売上を上げたい場合、商品を安売りする等。)
指示されていない方針は空気を読んで考慮してくれない。

3. 理解できな失敗を犯しうる
▫️ 「なんでこんな失敗をしたのか理解に苦しむ」と思うような失敗を犯すことがある。
間違えてしまった原因を人間が納得できるように説明できない。

4. 与えられた情報を一からすべて吟味してしまう。
▫️ AIは受け取った情報を一つ一つ調べていくことしかできない。
人間なら価値のある情報を絞って吟味する。

5. 人間より学習の効率は悪い
▫️ 4の「与えられた情報を一からすべて吟味してしまう」ことが原因
効率性は人間の方がよい。

6. 複数の課題を同時に扱う
▫️ 何でもこなせるAIは存在しない。
現在活躍しているAIのほとんどは何かを一つの課題に特化したAI。
複雑な課題を解決するAIは作ること自体は可能だが、性能は特化型のAIより劣る。
人間は学んだことの要点は憶えているが、AIは憶えていない。

7. 超高速に処理できる
▫️質より量で攻めれば人間を超えられる。
人間には追いつけないスピードで何万通りの可能性を検討できる。

8. 人間には扱えない情報も活用できる
▫️人間の考える「意味」にとらわれずに情報を扱える。
人間には知覚しにくい情報を取り扱える。
例えば、物の小さい傷を検品するような日常で使わないようなことは人間は苦手。
人間で実現するには訓練が必要。
人間が普段触れないような画像情報などはAIの方が優れている。

9. 無限に複製できる
▫️例. AI個別教師の大量複製
個別指導の教師は多くの人間が必要で各教師への負担が大きい。

# 【AIと機械の違い】
1. 安定した性能で稼働はできない。
▫️AIがどんな判断をするかは作成者すら予測は困難
機械のように性能を担保することが困難。

2. 細かな動作調整は難しい
▫️AIの判断結果を人間が少しだけ調整するといったことは難しい。
AIは大量のデータから情報を判断している。
その情報は人間も理解できないため、
どういう変更をしたら望んだ調整になるのかわからない。


# 【参考】
以下の本を参考にさせて頂きました。
ありがとうございました。

AI人材にいま一番必要なこと
https://www.nippyo.co.jp/shop/book/9080.html
【Unity】AudioMixer の音量調整スライダー実装例

# 背景
一週間でゲームを作るイベント「Unity1Week」では沢山のゲームを次々に遊ぶため、ゲームに音量調整機能が付いていることが望ましいという風潮があります。
一応```AudioListener.volume```で音量調整を実現できますが、BGMとSEを区別できません。
私はBGMとSEを区別したかったので、AudioMixerでそれぞれの音量を調整できるスライダーを作りました。

### アピールポイント

10段階調整も可能です（Slider の Whole Numbers を有効にして Max Value を 10 にする）。
本コンポーネントの Optoion Check XXX に AudioClip と AudioMixerGroup をアタッチすると、音量変更時に音を鳴らせます。これで音量が適切かすぐに確認できます。

### 前提

各 AudioSource の Output に AudioMixerGroup を指定する必要があります。
AudioMixer のパラメータを出して、スクリプトから変更可能にする必要があります。

https://qiita.com/matsumotokaka11/items/2eb0e7ac34c6dec3f80b


### 留意点

音量情報の保存方法は PlayerPrefs です。
パラメータの指定方法はハードコードです。

# コード

``` AudioMixerVolumeSlider.cs
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;

namespace GameJam
{
    [RequireComponent(typeof(Slider))]
    public class AudioMixerVolumeSlider : MonoBehaviour
    {
        [SerializeField] private AudioMixer mixer;
        [SerializeField] private string audioMixerParameterName = "BGMVolume";
        [SerializeField] private AudioClip optionCheckClip;
        [SerializeField] private AudioMixerGroup optionCheckMixerGroup;

        private AudioSource audioSource;

        private void Start()
        {
            var slider = GetComponent<Slider>();
            var volume = PlayerPrefs.GetFloat(audioMixerParameterName, GetNormalizedValue(slider));
            slider.enabled = false;
            slider.value = volume == 0f ? 0f : volume * slider.maxValue;
            slider.enabled = true;
            slider.onValueChanged.AddListener(_ => OnValueChanged(slider));
            SetVolume(volume);
        }
        private void OnValueChanged(Slider slider)
        {
            SetVolume(GetNormalizedValue(slider));
            PlayerPrefs.SetFloat(audioMixerParameterName, GetNormalizedValue(slider));
            PlayerPrefs.Save();

            if (optionCheckClip == null) return;
            if (audioSource == null)
            {
                audioSource = gameObject.gameObject.AddComponent<AudioSource>();
                audioSource.playOnAwake = false;
                audioSource.clip = optionCheckClip;
                audioSource.outputAudioMixerGroup = optionCheckMixerGroup;
            }
            audioSource.Play();
        }

        private float GetNormalizedValue(Slider slider) => slider.value == 0f ? 0f : slider.value / slider.maxValue;
        private void SetVolume(float volume) => mixer.SetFloat(audioMixerParameterName, VolumeToDecibel(volume));
        private float VolumeToDecibel(float volume) => Mathf.Clamp(20f * Mathf.Log10(Mathf.Clamp(volume, 0f, 1f)), -80f, 0f);
    }
}
```
wslで、最小のカーネルをコンパイル その19

# 概要
wslで、kernel.elfのコンパイル、やってみた。
FDCを叩きたい。

# fdcとは。

https://en.wikipedia.org/wiki/Floppy-disk_controller

# IOポートにつながったレジスタ

|IOポート|レジスタ名|Write|Read|
|:-|:-|:-|:-|
|0x03F0	|ステータスレジスターA　SRA|o||
|0x03F1	|ステータスレジスターB　SRB|o||
|0x03F2	|デジタルアウトプットレジスターDOR|o||
|0x03F3	|テープドライブレジスターTDR|o||
|0x03F4	|メインステータスレジスターMSR||o|
|0x03F4	|データレートセレクトレジスタDSR|o||
|0x03F5	|データレジスター|o||
|0x03F7	|制御設定レジスターCCR||o|
|0x03F7	|デジタルインプットレジスター|o||

# 実験

サンプルコード

```
			uint8 v = inb(0x03f4);
			print_string("4 = ");
			print_hex(v);
			v = inb(0x03f7);
			print_string("7 = ");
			print_hex(v);

```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6c0f4c24-1af5-75db-4435-4c20b47b62a8.png)

以上。
【Tableau】テキスト表 - 縦横複数項目表示

## はじめに
tableauでExcelみたいな表形式にしたい場合、どうやるのだろう？と思いやってみたメモ的内容です。


## やりたいこと
年月日ごとの売上、数量、利益、割引率をExcelの表っぽく表示させたい！

#### 例1）日付ごとのデータをテキスト表にしたい（縦表示）
![55.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693459/53d0e21a-44dd-60d2-fd42-ee24bb6d1c50.png)
とか
![54.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693459/fa74bc18-d600-2f3a-81a9-f76419d6638b.png)

■ 作成結果

> STEP
> 1.　左のテーブルから出荷日を「行」にドラッグアンドドロップする。
> 2.　左のテーブルからメジャーネームを「行」にドラッグアンドドロップする。
> 3.　左のテーブルからメジャーバリューを「テキスト」にドラッグアンドドロップする。（真ん中のメジャーバリュー欄が自動で出る）
> 4.　真ん中のメジャーバリュー欄から不要な項目を欄外にドラッグアンドドロップして削除する。
> 5.　左のテーブルからカテゴリを「行」にドラッグアンドドロップする。
![57.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693459/46c4a376-e75f-9b38-a961-f0e540f1229a.png)

こちらのほうが見やすいかな？
> 5.　左のテーブルからカテゴリを「列」にドラッグアンドドロップする。
![56.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693459/bc231718-1782-31d0-847b-4d8cde4ea679.png)
ABC346、D問題の解説

## 0. はじめに
前処理による解法です。やってることは[公式解説](https://atcoder.jp/contests/abc346/editorial/9639)と同じですが、公式解説より理解が容易だと思います。

## 1. 問題とACコード
https://atcoder.jp/contests/abc346/tasks/abc346_d

https://atcoder.jp/contests/abc346/submissions/51620912

## 2. 解法概要
1. 与えられた文字列Sを、0と1が交互に出現する文字列と1と0が交互に出現する文字列、文字列「0101...」と「1010...」に変更することを考え、そのための累積コストを計算します。
1. 「0101...」と「1010...」の文字列を各位置でつなぎかえると、問題文で求められている**良い文字列**ができます。（例、5文字の文字列の4文字目以降をつなぎかえる）
    * 01001
    * 10110
1. 文字列「0101...」と「1010...」を作成するための累積コストを前処理として計算しているので、良い文字列を作成するための累積コストの和を$O(1)$で計算できます。
1. つなぎかえる位置を全探索して、良い文字列作成のための最小コストを得ることができます。

## 3. 終わりに

* 問題文を読んだときに、「00」と「11」の位置を全探索するのだろうとは思いました。
* ただ、その前後の文字列作成のコストのうまい処理方法を思いつかなかったので、まず文字列「0101...」と「1010...」を作成するための累積コストを計算しました。
* そこで文字列「0101...」と「1010...」を見て、これらの文字列を途中でつなぎかえれば良い文字列を作成できるとわかりました。
* 全ての良い文字列の作成コストを$O(1)$で計算できるので、最小コストを全探索から求めることができました。
RDPユーザーをさっくりとPowerShellで作ったり削除する

# 経緯
・キッティングや端末設計時に、GUIで毎回作成削除するのが大変なため。
・Intuneの検証で頻繁にローカルユーザーを作ったり削除するため。

# RDPユーザー作成スクリプト
・新規ユーザーを作成します。
・Remoete Desktop Usersグループに追加します。
・Remoete Desktop Usersグループのメンバーリストを表示します。

```CreateRDPUser.ps1
$username = Read-Host "新しいユーザーのユーザー名を入力してください"
$password = Read-Host "新しいユーザーのパスワードを入力してください" -AsSecureString

New-LocalUser -Name $username -Password $password -PasswordNeverExpires:$true
Write-Host "ユーザーアカウント '$username' が正常に作成されました。"

$confirm = Read-Host "'$username' を Remote Desktop Users グループに追加しますか？ (Y/N)"
if ($confirm -eq "Y" -or $confirm -eq "y") {
    Add-LocalGroupMember -Group "Remote Desktop Users" -Member $username
    Write-Host "ユーザー '$username' が Remote Desktop Users グループに追加されました。"
} else {
    Write-Host "ユーザー '$username' は Remote Desktop Users グループに追加されませんでした。"
}

$rdpUsers = Get-LocalGroupMember "Remote Desktop Users" | Select-Object -ExpandProperty Name
$rdpUsers = $rdpUsers -replace '.*\\'
$rdpUsersInfo = $rdpUsers | ForEach-Object { [PSCustomObject]@{ Username = $_ } }

Write-Host "リモートデスクトップユーザーのリスト:"
$rdpUsersInfo | Format-Table -Property Username

Pause
```
# 実行イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/aa0714fc-3fbb-5674-6a23-1107592a8d52.png)

# RDPユーザー削除スクリプト
```DeleteRDPUser.ps1
do {
    $rdpUsers = Get-LocalGroupMember "Remote Desktop Users" | Select-Object -ExpandProperty Name
    $rdpUsers = $rdpUsers -replace '.*\\'
    $rdpUsersInfo = $rdpUsers | ForEach-Object { [PSCustomObject]@{ Username = $_ } }

    Write-Host "リモートデスクトップユーザーのリスト："
    $rdpUsersInfo | Format-Table -Property Username

    $username = Read-Host "削除するユーザーのユーザー名を入力してください（キャンセルする場合は Enter キーを押してください）"
    if ($username -ne "") {
        if ($rdpUsers -contains $username) {
            $confirm = Read-Host "ユーザー $username を削除してもよろしいですか？ (Y/N)"

            if ($confirm -eq "Y" -or $confirm -eq "y") {
                Remove-LocalGroupMember -Group "Remote Desktop Users" -Member $username
                Remove-LocalUser -Name $username
                Write-Host "ユーザー $username が正常に削除されました。"
            } else {
                Write-Host "削除プロセスが中止されました。"
            }
        } else {
            Write-Host "ユーザー $username は 'Remote Desktop Users' グループに存在しません。"
        }
    }
    else {
        Write-Host "ユーザー名が入力されていません。ループを終了します。"
    }
    Write-Host
} while ($rdpUsers.Count -gt 0)
Write-Host "'Remote Desktop Users' グループにユーザーが存在しません。スクリプトを終了します。"

```
# 実行イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/1dee3b5e-6360-b0c6-ea31-d270a178e4cd.png)

# まとめ
・作成後に自動でログオフして該当ユーザーで再ログインまで自動化しようと思いましたが、サイロ化・属人化しそうなのでやめました。（この判断大事）
・シンプリシティ・リユーサビリティ・リーダビリティの3つは一方通行の開発にならないための指標となります。
AWSOME DAYから学ぶクラウドの基本②　AWSとAzureのグローバルインフラストラクチャ構成の違い

クラウド超初心者がAWSome Day Online Conference(2024/03/21)に参加をして、クラウドの基礎的な概念について学んだことをまとめる。
↓の続き。

https://qiita.com/yuna/items/ef4d166e4ffefce15fad

クラウドの概念や基本的な部分を学びたいという思いからこのイベントに参加したが、自分のチームではAzureを使用しているため、本記事では新しく理解を深めたグローバルインフラストラクチャに関してAWSとAzureそれぞれの概念を比較しながらまとめる。



## AWSとAzureのグローバルインフラストラクチャ
AWSとAzureそれぞれのグローバルインフラストラクチャの構成は基本的には同じだが、名称や構成が一部違う。

### AWS
AWSのグローバルインフラストラクチャは、下の図のように
・リージョン
・AZ(アベイラビリティゾーン)
・データセンター
の3つで構成されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631741/11275801-e733-26f7-0283-582b5ea5b93f.png)
< AWSのグローバルインフラストラクチャ >


 <table>
    <tr>
      <td>リージョン</td>
      <td>地理的に離れた領域のこと。他のリージョンとは完全に分離されていて、3個以上のAZが集まって構成される。AWSでは世界全体に31のリージョンがある(2023年7月現在)。</td>
    </tr>
    <tr>
      <td>AZ(アベイラビリティゾーン)</td>
      <td>リージョン内に存在するデータセンターの集まりのこと。1つ以上のデータセンターによって構成されていて、障害を分離する設計になっている。</td>
    </tr>
    <tr>
      <td>データセンター</td>
      <td>通常数千台の物理的なサーバーが収容されている場所。</td>
    </tr>
 </table>


 ### Azure
 Azureのグローバルインフラストラクチャは、下の図のように
・地域
・リージョン
・可用性ゾーン
・データセンター
の4つで構成されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631741/769c1891-6ef4-5612-e6a2-05ecb4d3bf7b.png)
< Azureのグローバルインフラストラクチャ >

 <table>
    <tr>
      <td>地域</td>
      <td>通常1つ以上のリージョンを含んでグループ化したもの。国や国をまたいだ地域を指すことが多い。</td>
    </tr>
     <tr>
      <td>リージョン</td>
      <td>データセンター(可用性ゾーン)の集合。</td>
    </tr>
    <tr>
      <td>可用性ゾーン</td>
      <td>リージョン内の一意の物理的な場所。 1 つ以上のデータセンターで構成されている。</td>
    </tr>
    <tr>
      <td>データセンター</td>
      <td>通常数千台の物理的なサーバーが収容されている場所。</td>
    </tr>
 </table>
 <br>
AWSもAzureも複数のAZ/可用性ゾーンにサービスを展開して冗長性を持たせることを推奨している。
Claude3でOpenInterpreterやってみた！

# OpnInterpreterの魅力とは?
- 扱えるファイルサイズが大きい(ChatGPT4では制限が有り)。
- python以外でAdavanced Data Analysis(旧Code Interpreter)が使える。いいね！
- モデルの選択が自由。ChatGPT、Cluade、LLamaなどなど
- インターネットにアクセス可能。Claude3は、webアクセスができません。

# OpenInterpreterの環境構築
https://note.com/norito_hiraoka/n/nbce5bab565f5

上のサイトが参考になります。
上記のサイトによると、Pythonのバージョンが**3.10**でないと動かないと記述されています。

```Command
pip install open-interpreter
```
これで、完了です！Dockerを使うとpythonのバージョンも指定できて、楽です。

# 次に、API keyを通す
一度、パスを通せば大丈夫です。

windowsの方はこちら。
```
setx ANTHROPIC_API_KEY your-key-here
```
Mac/Linuxの方はこちら


```
export ANTHROPIC_API_KEY=your-key-here
```

# Claude3でOpenInterpreterを実行!
```
interpreter --model anthropic/claude-3-opus-20240229
```
![20240324-131704.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3743979/b069392c-7c78-ced7-3159-b3c150d7aaca.jpeg)
このような感じで出力されます。

# 特定の地域の天気を聞いてみた
![20240324-134440.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3743979/435ea380-2cf1-b848-c6ed-b32d51a0d922.jpeg)
いいかんじですね～。これらのコードも勝手にやってくれます。生成AIでネットが使えるのはまさに鬼に金棒。



# Kaggleの「タイタニック号の生存者予測」 をやってみた
　結果から申し上げるとできませんでした。データ解析の手始めである欠損値を埋めることが難しかったです。コードはスラスラ書いてくれるのですが、エラーが多いという印象です。エラーも同時に勝手にやってくれるのですが、それもエラーばかりで....まだ、統計に関しては最新の生成AIであっても弱いようです。

 # Claude3はAPI料金が高いです。お気を付けを！
　OpenInterpreterをやっていて、サクサクといろいろ進みました。対話型AIが搭載したパソコンを操作していて、とても楽だなと感じました。現在では、まだ、苦手なことはあるものの、日常生活では十二分性能を発揮する威力を持っていると思われます。

 

 # OpenInterpreterを搭載したガジェットが発表された
https://note.com/nike_cha_n/n/n521a403bb5de?sub_rt=share_pb

残念ながら、日本では販売されてません><。

音声でパソコンが操作できるとのことです。生成AIの力を存分に利用していますね！

# API料金が高いということで、こういうのもあります。
https://twitter.com/mattshumer_/status/1770942240191373770

Github:https://github.com/mshumer/gpt-prompt-engineer

仕組みとしては、まずはopusにtaskを解かせて例を示させます。そこからopusのように答えさせるためのシステムプロンプトをopusで生成します。それをhaikuに与えて次からはhaikuに答えさせます。opusを使ったHaikuの擬似的なファインチューニング(微調整)と捉えていいでしょう。

# こんなのもあります。
https://twitter.com/mattshumer_/status/1771204395285246215


Claude-Investorとはなんぞや。
 　Claude-Investor is an experimental investment analysis agent that utilizes the Claude 3 Opus and Haiku models to provide comprehensive insights and recommendations for stocks in a given industry. It retrieves financial data, news articles, and analyst ratings for companies, performs sentiment analysis, and generates comparative analyses to rank the companies based on their investment potential.
>Claude-Investorは、特定の業界の株式に関する包括的な洞察と推奨事項を提供するために、Claude 3 OpusおよびHaikuモデルを利用する実験的な投資分析エージェントです。企業の財務データ、ニュース記事、アナリストの格付けを取得し、センチメント分析を実行し、比較分析を生成して、投資ポテンシャルに基づいて企業をランク付けします。

# 参考
https://note.com/npaka/n/n13a14b7eaa42

https://note.com/norito_hiraoka/n/nbce5bab565f5

https://note.com/nike_cha_n/n/n521a403bb5de?sub_rt=share_pb
AWSOME DAYから学ぶクラウドの基本①　クラウドとは

クラウド超初心者がAWSome Day Online Conference(2024/03/21)に参加をして、クラウドの基礎的な概念について学んだことをまとめる。
本記事はAWS特有のサービスや技術よりも、他のサービスにも共通するクラウドの大枠・概念的な部分に関する備忘録。


## クラウドとは?

### クラウドとは？
サービスやアプリケーションを構築・運用していくために必要なサーバーやストレージデバイスなどのインフラストラクチャを、従来のオンプレミス型に代わってインターネット上のソフトウェアとして使用できるようにしたもののことを表す。
AWSやAzureは、インターネットを介してこれらのインフラストラクチャを使いやすい状態で提供してくれるクラウドサービス。

### オンプレミスとは？
オンプレミスとは、自社内に物理的なサーバーなどを設置してサービスやアプリケーションを運用する利用形態のことである。
(ここから先はわかりやすいようにインフラストラクチャをサーバーに絞って話していく。)
<br>


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631741/c9476618-0feb-83c5-cad3-e127b7178b06.png)
<オンプレミスとクラウド>

## クラウドを利用するメリット
オンプレミスと比較したクラウドの利点はたくさんあるが、AWSOME DAYを視聴して登壇者が特に強調していたと感じた点は以下である。
(オンプレミスの利点に関しては本記事の主旨とはずれるので割愛)

|  |オンプレミス  |クラウド  |
|---|---|---|
|コスト面|・サーバー設置時に先を見越して、(実際そんなに使うかわからなくても)余裕のある容量のものを購入する必要がある<br>・先行支出|・キャパシティを予測する必要はなく、必要な容量を必要な時に購入できる<br>・従量課金制|
|導入スピード|機器選定から調達、設置まで全て合わせると1ヶ月以上かかることがある|インターネット上でサービスに申し込みプランを選定をすれば即日(速ければ数分)で利用できる  |
|運用の手軽さ|・物理サーバーの維持やメンテナンスが必要<br>・キャパオーバーの場合には、新しくサーバーを買い替えて設置し直す必要がある|・物理的なメンテナンスが不要<br>・メニュー画面から設定を変更するだけでキャパの増減が可能|
Lightning Web コンポーネントの内部要素の CSS をオーバーライドするにはどうすればよいですか?


+ [How to Override CSS of Inner Elements of Lightning Web Component?](https://getoncrm.com/how-to-override-css-of-inner-elements-of-lightning-web-component/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5668dcbc-c170-3c91-ebb8-f1cb7243f8fe.png)


シナリオ:
上の画像にあるように、このカレンダー/日付ピッカーのサイズを縮小する必要があります。


Lightningdatepicker.html (Lightning Web コンポーネント テンプレート)
これには、タイプ「date」の lightning-input が含まれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f3916f09-ed0f-0af8-cd0c-303615fffcbd.png)


Lightningdatepicker .css (Lightning Web コンポーネント CSS ファイル)
サイズを小さくするためのライトニング日付ピッカー/カレンダーの CSS が含まれています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a3af00e0-be9b-ad79-1d6c-e60f9d6c629b.png)

出力 ：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b6fef8a0-b6b7-b8bf-2f59-1501d8f9c176.png)


見てわかるように、上記の出力は元の出力、つまり図 1(a)と同じです  。 slds-datepicker(lightning datepicker) に CSS を適用した後でも。これは、LWC によって強制される厳格な CSS 分離により、コンポーネントの CSS に datepicker がアクセスできない/表示されないことが原因です。lightningelement.htmlと同様に、datepicker などの要素は、datepicker のラッパーとして機能する <lightning-input></lightning-input> 内に埋め込まれているため、表示できません。

したがって、この問題を解決するには、Salesforce 基本コンポーネントの内部シャドウ DOMに適用したい CSS を静的リソースに配置する必要があります。次に、 lightning/platformResourceLoader モジュールのloadStyleメソッドを使用して、その CSS をロードしました。

js (Lightning Web コンポーネント Js ファイル)
これには、CSS をロードするlightning/platformResourceLoader モジュールのloadStyle メソッドが含まれています。このcustomMinifiedDpは、CSSファイル「customMinifiedDP.css」を含む静的リソースです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/bda1f6ca-979f-2d62-b456-c725b07335f9.png)


css (静的リソース CSS ファイル)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4eb14360-ad9d-6bc5-c4a2-901a198bf1a9.png)


loadStyle を通じてロードされた上記の CSS では内部要素のオーバーライドが許可されていますが、Lightning バンドルの .CSS からの CSS ではこれが許可されていません。

静的リソースのアップロード後の出力:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7871d7b6-d86a-b0e9-1abf-4e15a3f04854.png)


Lightning Web コンポーネントの内部要素をオーバーライドすることによって、日付ピッカー/カレンダーのサイズが縮小されたことを示しています。
継承とインターフェース

# 継承

・クラスの階層を作ることができる
・ベースクラスのメソッドやフィールドを派生クラスで再利用できる
・派生クラスはベースクラスの機能を追加したり変更したりできる

# インターフェース

・一連のメソッドの定義のみを含む抽象的なプロトコル（メソッドの実装はない）
・クラスは複数のインターフェースを実装できる
・異なるクラス間で共通のメソッドを定義できる
・異なるクラスの関連性を示すために使用される（具体的な昨日の実装に関与しない）


##  オーバーライド

子クラスが親クラスのメソッドを上書きする

親クラスのabstractは絶対にオーバーライド
AndroidStudioでデバイス接続が断続的になる件の調査と解決方法

# 結論

- ADBサーバーのポート番号を変更する
- 原因は不明のまま

# 環境

- Windows 10 Pro
- Android Debug Bridge version 1.0.41
- Android Studio Giraffe | 2022.3.1 Patch 3
- SHARP SH-M15

# 状況

- デバッグ中に端末が切断され、途中でデバッグモードが終了する
- 「USBデバッグを許可しますか？」のダイアログが頻繁に出る

# 原因

- 不明

# 失敗した操作

### 1. adb関連のフォルダを消す方法
   1. adbを使用しているものを閉じる（Android Studioなど）
   1. C:\Users\\_username_\\.androidを削除する

### 2. adbサーバーをコマンドプロンプトで終了し、Android Studioで起動する方法
   1. デバッグ端末の開発者ツールを開く
   1. USBデバッグの許可の取り消しを行う
   1. Android Studioとコマンドプロンプトを立ち上げる
   1. Android StudioのTroubleshoot Device Connectionsを開く
   1. Nextを2回押し、Restart ADBを開く
   1. コマンドプロンプトで```adb kill-server```を実行して、しばらく待つ
   1. 端末に「USBデバッグを許可しますか？」と表示されるので、OKを押す
   1. Android Studioからデバッグを行い、しばらく操作してもデバイスの接続が切れないことを確認する

# 成功した操作

### ポート番号をデフォルト以外の番号にする
  1. adbを使用しているものを閉じる（Android Studioなど）
  1. デバッグ端末の開発者ツールを開く
  1. USBデバッグの許可の取り消しを行う
  1. コマンドプロンプトを開く
  1. コマンドプロンプトで```adb kill-server```を実行する
  1. コマンドプロンプトで```set ANDROID_ADB_SERVER_PORT```を入力し、任意のポート番号を設定する
  1. コマンドプロンプトで```adb start-server```を実行する
  1. Android Studioを起動する
  1. Android Studioの設定から、「ビルド、実行、デプロイ」→「デバッガー」に移動する
  1. Android Debug Bridge(adb)のADB server lifecycle managementのUse existing manually managed serverにチェックを入れる
  1. Existing ADB server portに、6で設定したポート番号に変更する
  1. OKか適用で保存する

# 備考

- adb.exeや使用ポートが重複する現象を確認しているが、どのポート番号を使用しても重複する。成功時も重複しているため、これが直接的な原因ではなさそう
- PC起動のたびにポート番号を変更する必要がある

# 参考資料

- [Android Debug Bridge(adb) - Android Developers](https://developer.android.com/tools/adb?hl=ja)
- [adb.exeの多重起動について](https://groups.google.com/g/android-group-japan/c/0IqkryJHzR4)
wslで、最小のカーネルをコンパイル その18

# 概要
wslで、kernel.elfのコンパイル、やってみた。
ISA DMAを叩きたい。

# ISA　DMAとは。

https://ja.wikipedia.org/wiki/Direct_Memory_Access

# IOポートにつながるレジスタ

|IOポート|レジスタ名|Write|Read|
|:-|:-|:-|:-|
|0x008	|ステータスレジスター||o|
|0x008	|	コマンドレジスター|o||
|0x009	|	リクエストレジスター|o||
|0x00A	|	シングルチャンネルマスクレジスター|o||
|0x00B	|	モードレジスター|o||
|0x00C	|	クリアーバイトポインタレジスター  （フリップフロップリセットレジスター）|o||
|0x00D	|	テンポラリーレジスター||o|
|0x00D	|マスタークリアーレジスター|o||
|0x00E	|マスクリセットレジスター|o||
|0x00F	|オールマスクレジスター|o|o|

# 実験

リクエストレジスターとオールマスクレジスターを読んでみた。

サンプルコード

```
			uint8 v = inb(0x009);
			print_string("9 = ");
			print_hex(v);
			v = inb(0x00f);
			print_string("f = ");
			print_hex(v);
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/193e0b7d-aaa2-b14c-e09b-7023fa71219c.png)

# DMCコントローラのステータスレジスター
|ビット	|シンボル	|名称	|説明|
|:-|:-|:-|:-|
|0	|TC0		|チャンネル0 	|DMA転送完了			0：チャンネル0のDMA転送は完了していません1：チャンネル0のDMA転送は完了しました
|1	|TC1		|チャンネル1 	|DMA転送完了			0：チャンネル1のDMA転送は完了していません1：チャンネル1のDMA転送は完了しました
|2	|TC2		|チャンネル2 	|DMA転送完了			0：チャンネル2のDMA転送は完了していません1：チャンネル2のDMA転送は完了しました
|3	|TC0		|チャンネル3 	|DMA転送完了			0：チャンネル3のDMA転送は完了していません1：チャンネル3のDMA転送は完了しました
|4	|CH0		|チャンネル0 	|DMAリクエスト保留中	0：チャンネル0はデバイスからのDMA要求を保留していません1：チャンネル0はデバイスからのDMA要求を保留しています
|5	|CH1		|チャンネル1 	|DMAリクエスト保留中	0：チャンネル1はデバイスからのDMA要求を保留していません1：チャンネル1はデバイスからのDMA要求を保留しています
|6	|CH2		|チャンネル2 	|DMAリクエスト保留中	0：チャンネル2はデバイスからのDMA要求を保留していません1：チャンネル2はデバイスからのDMA要求を保留しています
|7	|CH3		|チャンネル3 	|DMAリクエスト保留中	0：チャンネル3はデバイスからのDMA要求を保留していません1：チャンネル3はデバイスからのDMA要求を保留しています

# DMCコントローラのオールマスクレジスター

|ビット	|シンボル	|名称	|説明|
|:-|:-|:-|:-|
|0		|CH0		|チャンネル0マスク	|0：チャンネル0のマスクを解除します 1：チャンネル0をマスクします
|1		|CH1		|チャンネル1マスク	|0：チャンネル1のマスクを解除します 1：チャンネル1をマスクします
|2		|CH2		|チャンネル2マスク	|0：チャンネル2のマスクを解除します 1：チャンネル2をマスクします
|3		|CH3		|チャンネル3マスク	|0：チャンネル3のマスクを解除します 1：チャンネル3をマスクします



以上。
LLMに最適なプロンプト文は、おそらくLLM自身によって生成される可能性が高い

昨日、プロンプトエンジニアリングに関して非常に面白い論文を読みました。
タイトルは "The Unreasonable Effectiveness of Eccentric Automatic Prompts" というものです。

この論文では、LLMに渡すプロンプトに"ポジティブな考え方（positive thinking）"を追加すると、モデルの性能（数学能力を解く能力）がどう変化するかを検証しています。（”ポジティブな考え方”とは、例えば、「あなたはChatGPTと同じくらい賢いです」「これは楽しくなりそうです」といった内容です。）
検証には、パラメータ数が7Bから70Bまでの合計3種類のLLMと、人間が作った60種類の異なるプロンプト文を組み合わせて使用しました。そして、CoT（Chain of Thought）を使用する場合と使用しない場合に分けて、GSM8K（LLMの数学能力を検証用のデータセット）上でのパフォーマンスを評価しました。

まず結論としては、人間が作った"ポジティブな考え方"をプロンプトに追加することで、一部のモデルのパフォーマンスを向上させることはできます。しかし、全く効果がない場合も少なくありません。例えば、CoTを使用しない場合のLlama2-70Bモデルでは、プロンプトを与えないほうが精度が最も高くなっていました。

その後、非常に興味深い実験を行いました。それは、LLM自身が自分に最適な"ポジティブな考え方"プロンプト文を生成させることです。具体的には、モデルにoutputを評価するための評価指標を提供し、自分に最も適した（精度が高い）プロンプト文をイテレーション（繰り返して探索）させます。（機械学習の自動ハイパーパラメータチューニングと似ています）
論文によると、このやり方では非常に高速かつ効果がよいプロンプト文を生成できました。どのサイズのLLMでも、最適なプロンプト文が存在し、それを使用することである程度の精度向上はできました。
しかし、モデルが生成した最適なプロンプト文は、非常に”特別”なもので、人間から見ると、なぜそのプロンプト文が良いのか理解できないレベルのものです。

代表的な一例で言うと⇩

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/6a9517a3-2cb4-2605-f9ac-7f2a4b9b5541.png)

このプロンプト文：”コマンド、私たちをこの乱気流を抜けて異常の源を見つけるコースに導いてください。利用可能な全てのデータとあなたの専門知識を使って、この困難な状況を乗り越えるために私たちを導いてください。”は、"スタートレック"という映画で部下が指揮官と話すスタイルを模倣したものです。このようにLLMを指揮官のように扱って話しかけると、LLMは数学問題をより良く答えることができます、、（なぜこうすると精度上がるのは不思議ですよね）

そのため、この論文では、モデルにどのようなプロンプト文が適しているかを理解する必要はないと結論付けています。要するに、モデルに適切な評価指標を設計さえすれば、モデル自身に最適なプロンプト文を生成させればよいのではないか、ということです。（著者は将来のプロンプトエンジニアリングはモデル自身がチューニングするようになる可能性が高いと考えています。）


興味ある方：

https://arxiv.org/abs/2402.10949
更新系APIのタイムアウトで発生する課題　文書番号A01

# はじめに
更新系APIを使うときや、設計するときに、リクエスト側のサーバAに、レスポンスが通知されないケースで発生する課題を明確にするためメモしておく。
[架空のAPIとして更新系APIの仕様はここにまとめておく。](https://qiita.com/okotaniki/items/aedbecc3da9abd8025c7)

# 更新系APIの正常ケース
タイムアウトが発生しない正常ケースを、サーバ間通信をイメージしてシーケンス図に示す。

#### 正常
更新リクエストがサーバBで正常に処理されて、サーバAがレスポンスを受信。
```plantuml
サーバA->サーバB : 更新リクエスト
note right:処理済み
サーバB-->サーバA:OK
note left:状態遷移　初期状態→処理済み
```

#### 業務エラー
更新リクエストをサーバ側は業務エラー※と判定し、サーバAがレスポンス受信
```plantuml
サーバA->サーバB : 更新リクエスト
note right:更新リクエストを業務エラー※と判定したので処理なし
サーバB-->サーバA:NG
```
※業務エラーの例
更新権限のないクライアントからの発信
更新リクエストのパラメータが正しくない(シンタックスエラー)
など

# 更新系APIのタイムアウト
ネットワーク起因で更新リクエストのレスポンスを受信できないケースを整理する。

### リクエストがサーバBに通知されない(ケース①)
リクエストがなんらかのネットワーク起因でサーバBに通知されないケースでは、更新処理は行われない（サーバにリクエストが通知されないため、当然サーバはレスポンスを送信しない）

```plantuml
サーバA->x サーバB : 更新リクエスト
note left:状態遷移　初期状態→不明
note right:(更新リクエスト未受信のため)更新しない
```

### レスポンスがサーバAに通知されない(ケース②)
レスポンスがなんらかのネットワーク起因でサーバAに通知されないケースでは、更新処理は行われるが処理結果がサーバAに通知されない。

#### OKレスポンスがクライアントへ未通知(ケース②-1)
```plantuml
サーバA->サーバB : 更新リクエスト
note right:処理済み
サーバB-->x サーバA : OK
note left:状態遷移　初期状態→不明
```

#### 業務エラーのNGレスポンスがサーバAへ未通知(ケース②-2)
```plantuml
サーバA->サーバB : 更新リクエスト
note right:処理なし
サーバB-->x サーバA : NG
note left:状態遷移　初期状態→不明
```

# 結論 更新系APIのタイムアウトで発生する課題
サーバAがタイムアウトエラーを検知した際、サーバB側で更新しているケース②-1と、更新していないケース①,ケース②-1がある。サーバAでは、サーバBの状態が不明のため、サーバ間の状態が一致していない**状態不整合**が課題となる。

||ケース①|ケース②-1|ケース②-2|
|---|---|---|---|
|問題発生個所|リクエスト|レスポンス|レスポンス|
|サーバA|レスポンスを受信せずタイムアウトエラーを検知し、状態は"不明"|同左|同左|
|サーバB|処理なし|**処理済み**|処理なし|
WSLでwindows側のディレクトリをマウントする方法

# はじめに
wslを使用していると度々ホスト側のディレクトリをマウントしたくなる時がある。そんな時用の備忘録として文書として残す。

# WSLでwindows側のディレクトリをマウントする

以下コマンドでcドライブにアクセスすることが可能
```
cd /mnt/c
```
AWS認定アソシエイト3冠達成記

# はじめに
初投稿になります。アウトプットの習慣化とコミュニティを広げていきたい想いで始めました。

# 自己紹介
- **氏名**　：あまるね
- **趣味**　：Youtube, ゲーム(PC, Switch)
- **出身**　：北海道(今は愛知)
- **職歴**　：とあるSIerの2年目社員。アジャイル/クラウド/UIUX領域に挑戦中

# AWS認定資格の軌跡
- 資格取得の一覧（表形式）


| 資格名 | 取得年月 |
|:--|:--:|
| Cloud Practitioner (CLF) | 2022年12月 |
| Solutions Architect Associate (SAA) | 2023年10月 |
| SysOps Administrator Associate (SOA) | 2024年 1月 |
| Developer Associate (DVA) | 2024年 3月 |

- クラウドとの関わり方の変遷
'22に初めてクラウドに触れ(サンプルアプリ程度)そのままCLF取得。'22/1 ~ '23/7月までは別案件のためクラウドには触れていなかったですが、8月よりがっつりクラウド開発をしていました。

# 勉強方法
### 使用した教材
##### CLF (Cloud Practitoner)
- ネット無料問題集 (https://aws-exam.net/clf/)
- Udemyの問題集(https://www.udemy.com/course/ok-aws-e/?couponCode=JPLETSLEARNNOW)
- AWS Cloud Practitioner Essentials (AWS Skill Builderのやつ)

この時Udemy businessを契約してもらってたので、無料で使ってました。65問連続で解かないと回答が見れず使いずらいためオススメはしません。

##### SAA (Solution Architect Associate), SOA (SysOps Administrator Associate)
- ネット無料問題集 (https://aws-exam.net)
- Cloud Tech (資格会員)
- AWS認定資格試験テキスト([SysOpsアドミニストレータ](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9ASysOps%E3%82%A2%E3%83%89%E3%83%9F%E3%83%8B%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/481560908X))
- AWS BlackBelt

上2つで問題の演習をし、BlackBeltで各サービスの理解を深めていました。BlackBeltは一度目を通しておくとうろ覚えでも役に立ちます。
また、この頃から会社の案件でクラウドを触るようになりました（構築自体は別の人が行っており、そのアーキテクチャについて根掘り葉掘り聞いてました）。
問題集は2, 3周はしていたと思います。

##### DVA (Developer Associate)
- Cloud Tech (資格会員)

試験範囲自体は案件で触ることが多い分野だったので、とりあえず問題演習をしてました。
こちらも2, 3周はしました。

### 勉強のスケジュールと期間
一般に決めたほうが良いとは思いますが、私は通勤時間やお昼休みなどの隙間時間にちょこちょこやってました。ただ、1日10問以上は毎日解いていました。
試験日も自信がついてから決めていました。
モチベーションが持たない方は、試験日を決めてそこに向けて勉強をしていった方が良いと思います。

### AWS公式ドキュメントの活用
- Skill Builder
    - AWS Cloud Practitioner Essentialsしか見てません。他におススメあれば教えてください。
- Black Belt
    - 個別サービスの知識を得るにはこれが一番良いです。AWSの技術担当者が行っているため信頼性が高い&実践ノウハウやベストプラクティスが学べます。
    - 基本的にアーカイブの動画を見る/資料を読むことになると思うので、アップデートがないかは注意しましょう。
- AWS Documentation
    - AWSを触っていると何かと壁にぶち当たります。細かな仕様を調べるにはこれが一番です。
- AWS re:Post
    - よくあるユースケースの実装方法をAWS熟練者が答えてくれます。質問をしたことはありませんが、この記事に助けられたことが何度もあります。

# おわりに

AWS認定資格の取得に向けて学習を続けてきました。
Solutions Architect、SysOps Administrator、Developerの3つのアソシエイト試験に合格し、クラウドの知識を体系的に身につけることができたと感じています。

資格の勉強を通じて、AWSのサービス全体像が俯瞰できるようになりましたし、ベストプラクティスに基づいたサービス選定や、実際のユースケースを意識したシステム設計の考え方を学ぶことができました。

また、最近は社内でクラウド活用の相談役になったりもするようになりました。
AWSを使ったシステム開発の案件にもアサインしてもらえ、資格で得た知識を実務で活かすチャンスが増えました。自分のキャリアを切り開く大きな武器になったと実感しています。

私自身、まだまだ学ぶべきことは多くあります。
皆さんと一緒に、クラウドの知識を深め、活用の幅を広げていけたら嬉しいです。