OmniAICreator/Qiita-1.07M huggingface dataset:
新卒エンジニア　エラーLogが怖いので、調べ方を考える

# はじめに
出力されたエラー文をうまく理解できず 、行き詰ってしまったことにより、エラーLogに対して苦手意識がありました。しかし、エンジニアとエラーLogは切っても切れない関係です。
そこでエラーLogと仲良くするために、解決するまでの流れを考えて、まとめてみようと思います。
 
# まず、エラーLogを読む
### エラー文をコピペ翻訳する
英語のエラー内容を理解するために、出力されたエラー文を翻訳します。私はDeepLをよく使用します。うまく翻訳できない時もありますが、エラーを解決するためのコマンドが記載されていたり、エラー発生の原因を推測する為のヒントがあるので、しっかり読み込みます。
注意点として、ログに個人情報などの機密情報が載っていることがあります。情報漏洩しないように機密情報の有無を確認してから、翻訳サイトを使うようにします。
### ログレベルから、ログの重要度を確認する
エラーが発生した際は、ログレベルも参考にしています。ログレベルを確認することで、エラーLogの重大度を把握することができます。複数のエラーが発生しているとき、どれから手を付けて良いか分からなくなる時があります。私はそんな時にログレベルを確認することで、優先順位をつけて対応するようにしています。

 以下は例として、syslogを挙げています。
|値| 重大度 |キーワード| 説明 |
|:-:|:-:|:-:|:-:|
|0|  Emergency	　| emerg|  システム使用不可 |
|1| Alert  | alert |早急な対処が必要 |
|2| Critical  | crit|致命的な状態  |
|3|  Error | err|エラー状態  |
|4|  Warning | warning|警告状態  |
|5|  Notice | notice|正常だが注意が必要な状態  |
|6|  Informational |info |通知メッセージ  |
|7|  Debug | debug|デバッグメッセージ  |

# 検索エンジン、公式ドキュメントを調査する
### 単語の組み合わせを意識して、なるべく可変的な部分を除いて検索をかける
エラー文を原文のままで検索しても、満足のいく結果が得られません。自分で決めた名前(ファイル名など)が含まれているからですね。
 
そこで、私は以下を意識して検索ワードを考えています。
* エラーコードがあればそれを含める
* ソフトウェアやフレームワーク、プログラム言語名を検索に入れる
* プログラム内で定義したファイル名やクラス名、メソッド名などを除く

また、「バージョンアップで仕様変更がある」「そもそも使い方、設定が間違っている」という原因も多いので、調査に含めます。

### 公式ドキュメントで確認する
調査をして仮説が立てば、Stack Overflowや技術系記事で見つけた方法が正しいのか、公式ドキュメントで確認します。私は公式ドキュメントを読むのが苦手です。Qiitaの様に読みやすくなく情報量が多いので、中々知りたい情報にたどり着けない為です。しかし、公式ドキュメントはエンジニアをする上で避けては通れない道なので、知りたい単語を全体検索するなどで対象を絞ることで、サボらずに目を通すようにしています。
 
また、公式サイト自体を見つけられない時は、グーグルのサイト指定検索を使うとスムーズに見つけることができます。
  
  ``[検索ワード] site:[検索したいサイト]``で検索したいサイトを指定することができます。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656638/4e8473ab-b7c0-0eb6-5c56-2001d4659df0.png)
# デバックする、仮設の実施
経験則的にデバックが一番解決に近づくように感じます。コードのエラーであれば、一番初めにデバックしてプログラムの動きが想定通りか確認する方が良いと思います。また仮説を試す際には、それ以上悪化しないようにバックアップを取るなどをして、後戻りできる状況を確保します。
 
 # 最後に
エラーの被害を最小限で抑える為に、重要な事が二つあると考えています。一つ目は常に書跡を残しておくことです。多くの場合、直前の操作からエラーが発生しますし、他人に相談する際に書跡があれば、最低限の事を伝えることができます。二つ目はシステムの理解です。全体のコンポーネントを把握していれば、どこでコケてしまっているかを簡単に推測でき、調査の範囲を小さくすることができます。

また、コメントに皆さんがしているエラーLog検索のコツを教えて頂けると嬉しいです!
API開発について

## API とは？

API は "Application Programming Interface" の略称で、ソフトウェア同士が通信するための仕組みです。

**例:**

* 天気予報アプリ: 気象庁の API を使って、現在の天気や予報を取得
* 地図アプリ: Google Maps API を使って、地図を表示
* EC サイト: Amazon API を使って、商品情報を取得

## API 開発をマスターするためのロードマップ

1. **基礎知識**

    * HTTP プロトコル
    * JSON データ形式
    * RESTful アーキテクチャ
    * OAuth 認証

2. **API 設計**

    * エンドポイント設計
    * リクエスト/レスポンス設計
    * エラーハンドリング
    * ドキュメント作成

3. **API 開発**

    * 言語選択 (Python, Java, etc.)
    * フレームワーク選択 (Django, Spring Boot, etc.)
    * テスト
    * デプロイ

4. **セキュリティ**

    * 認証
    * 認可
    * CSRF 対策
    * SQL インジェクション対策

5. **テスト**

    * 単体テスト
    * 統合テスト
    * パフォーマンステスト

6. **ドキュメント**

    * API 仕様書
    * チュートリアル
    * リファレンス

7. **公開**

    * API ゲートウェイ
    * デベロッパーポータル

**参考資料**

* API 入門: [https://developer.mozilla.org/ja/docs/Web/API](https://developer.mozilla.org/ja/docs/Web/API)
* REST API 設計: [https://restfulapi.net/](https://restfulapi.net/)
* API 開発フレームワーク:
* API セキュリティ: [https://owasp.org/www-project-api-security/](https://owasp.org/www-project-api-security/)
* API テスト: [https://www.soapui.org/](https://www.soapui.org/)
* API ドキュメント: [https://swagger.io/](https://swagger.io/)

**その他**

* API 開発は、チームワークが重要
* 最新技術を常に学ぶ
* コミュニティに参加

## 学習リソース

* 書籍
* オンラインコース
* チュートリアル
* サンプルコード
* コミュニティ

## まとめ

API 開発は、Web 開発、モバイル開発、IoT など、さまざまな分野で必要とされるスキルです。

ロードマップを参考に、学習を進めて、API 開発をマスターしましょう。
JavaScriptでできること

## JavaScriptでできること

JavaScriptは、Webサイトに動きをつけるために最も広く使用されているプログラミング言語の一つです。以下、JavaScriptでできることをいくつか紹介します。

**1. Webサイトに動きをつける**

* ボタンやメニューのクリックイベント
* アニメーションやエフェクト
* スクロール時の動き
* 画像の切り替え
* ゲームやインタラクティブコンテンツ

**2. ユーザー操作で内部処理を発動する**

* フォーム入力のチェック
* 送信ボタンのクリックによるデータ送信
* リアルタイムなデータ更新
* ユーザー認証
* エラーメッセージの表示

**3. 非同期通信**

* サーバーとのデータ通信
* Ajaxによる非同期通信
* Web APIとの連携
* データのリアルタイム更新
* チャット機能

**4. サーバサイドも開発可能**

* Node.jsを用いたサーバーサイド開発
* Webアプリケーション開発
* データベースとの連携
* リアルタイムな通信
* スケーラブルなシステム

**5. IOS/Android用アプリも開発可能**

* React Nativeを用いたクロスプラットフォーム開発
* スマホアプリ開発
* ゲーム開発
* ビジネスアプリ開発
* ユーティリティアプリ開発

**6. その他**

* 画像処理
* 音声処理
* データ可視化
* 機械学習
* デスクトップアプリ開発

**JavaScriptは非常に多用途な言語であり、Webサイト制作、アプリ開発、ゲーム開発など、さまざまな分野で使用されています。**

**以下は、JavaScriptでできる具体的な例です。**

* **Webサイト:**
    * 企業サイト
    * ネットショップ
    * ブログ
    * ニュースサイト
    * ポータルサイト
* **アプリ:**
    * SNSアプリ
    * ゲームアプリ
    * ビジネスアプリ
    * ユーティリティアプリ
    * 教育アプリ
* **その他:**
    * ゲーム
    * ツール
    * データ分析
    * 機械学習
    * デスクトップアプリ

**JavaScriptを学習することで、Web開発やアプリ開発のスキルを身につけることができます。**

**参考資料**

* JavaScriptでできること: [https://school.dhw.co.jp/course/web/contents/r_JavaScript-cando.html](https://school.dhw.co.jp/course/web/contents/r_JavaScript-cando.html)
* JavaScriptのチュートリアル: [https://www.w3schools.com/js/default.asp](https://www.w3schools.com/js/default.asp)

**その他**

* JavaScriptは、初心者でも比較的学習しやすい言語です。
* JavaScriptは、フリーランスや起業にも役立つスキルです。
* JavaScriptは、今後も需要が拡大していく言語です。

**JavaScriptを学習して、Web開発やアプリ開発に挑戦してみましょう。**
IT分野のフルスタックエンジニアになるための詳細なロードマップ

フルスタックエンジニアになるには、フロントエンド、バックエンド、インフラなど、IT分野の幅広いスキルを習得する必要があります。以下は、より具体的なロードマップです。

**1. 基礎スキルの習得**

* **プログラミング言語:** HTML、CSS、JavaScript、Python、Javaなど、フロントエンド、バックエンド、インフラで使用される主要なプログラミング言語を学習します。
* **データ構造とアルゴリズム:** プログラミング効率とパフォーマンス向上に不可欠なデータ構造とアルゴリズムの基本を理解します。
* **データベース:** MySQL、PostgreSQL、MongoDBなど、主要なデータベースの種類とその使用方法を学習します。
* **ネットワーク:** OSI参照モデル、HTTP/HTTPSプロトコル、TCP/IPプロトコルなど、ネットワークの基本知識を習得します。
* **Linux:** サーバー構築や運用に広く使用されるLinuxコマンドと操作方法を学習します。

**2. フロントエンドスキル**

* **HTML/CSS:** Webページの構造とデザインを構築するためにHTMLとCSSを深く理解し、実践的なスキルを磨きます。
* **[JavaScript](https://qiita.com/K4715959155160/items/84da7fced36fcf097445):** フロントエンドのインタラクティブな動きを開発するためにJavaScriptフレームワーク（React、Vue.jsなど）を使いこなせるように学習します。
* **UI/UXデザイン:** ユーザーにとって使いやすく、魅力的なWebページを設計するためのUI/UXデザインの基礎を学習します。

**3. バックエンドスキル**

* **Python/Java:** バックエンド開発でよく使用されるPythonまたはJavaを選択し、オブジェクト指向プログラミングの概念を理解しながらフレームワーク（Django、Spring Bootなど）を使いこなせるように学習します。
* **[API](https://qiita.com/K4715959155160/items/d1631285f0c43e5a7ee6):** Webサービスとの連携やデータのやり取りを行うためにAPIの設計、開発、利用方法を学習します。
* **[セキュリティ](https://qiita.com/K4715959155160/items/5786189facfab0a738bf):** Webアプリケーションの脆弱性対策や安全な開発手法について学習します。

**4. インフラスキル**

* **クラウド:** AWS、Azure、GCPなど、主要なクラウドサービスの機能と使用方法を学習します。
* **Docker:** コンテナ技術を用いた開発・運用環境の構築と管理方法を学習します。
* **CI/CD:** 継続的な開発と継続的なインテグレーション/継続的なデリバリー（CI/CD）の概念とツール（Jenkins、GitHub Actionsなど）を学習します。

**5. 実践経験の積み**

* **個人開発:** 実際に自分でWebアプリケーションやサービスを開発し、ポートフォリオを作成します。
* **オープンソースプロジェクト:** オープンソースプロジェクトに参加することで、実践的なスキルを磨き、コミュニティとの交流を通じて学びを得ることができます。
* **インターンシップ:** フルスタックエンジニアの仕事内容を体験するために、IT企業でインターンシップに参加するのも有効です。

**6. キャリアアップ**

* **資格取得:** ITパスポート、データベーススペシャリスト試験、クラウド技術者認定試験など、スキルアップやキャリアアップに役立つ資格を取得するのも良いでしょう。
* **転職:** フルスタックエンジニアの求人に応募し、キャリアアップを目指します。

**学習方法**

* **書籍:** 書籍やオンライン教材で基礎知識を学習します。
* **オンライン学習:** Udemy、Coursera、Udacityなどのオンライン学習プラットフォームで、ビデオチュートリアルやコースを受講することができます。
* **ブートキャンプ:** 短期間で集中的にスキルを習得できるプログラミングスクールやブートキャンプに参加するのも有効です。

**参考資料**

* フルスタックエンジニアになるためのロードマップ
* フルスタックエンジニアのスキルマップ2023年版
* フルスタックエンジニアになるためのロードマップを解説！: [https://x-tech.pasona.co.jp/media/detail.html?p=10346](https://x-tech.pasona.co.jp/media/detail.html?p=10346)
* フルスタックエンジニアの仕事内容やスキル、ロードマップを解説: [https://www.netvisionacademy.com/column/665/](https://www.netvisionacademy.com/column/665/)

**その他**

* 上記はあくまで一例であり、個人のスキルや目標に合わせて調整する必要があります。
* 常に最新の情報収集を行い、新しい技術を学び続けることが重要です。
* コミュニティに参加したり、積極的に他のエンジニアと交流することで、スキルアップや情報交換に役立ちます。
OperatorのOverLoad　成員アクセス演算子

## 概要
成員アクセス演算子をオーバーロードすることで、カプセル化されたデータメンバに対して直接アクセスする方法をカスタマイズすることができます。これは、特定のクラスや構造体がデータの内部表現を隠蔽し、データへのアクセスを制御するために使用されます。

## 使用場面

### スマートポインタ
```c++
class SmartPtr {
private:
    SomeClass* ptr;
public:
    SmartPtr(SomeClass* p) : ptr(p) {}
    
    SomeClass* operator->() {
        return ptr;
    }
};
```


### プロキシクラス
```c++
class RealObject {
public:
    void performAction() { /* 操作 */ }
};

class Proxy {
private:
    RealObject obj;
public:
    RealObject* operator->() {
        return &obj;
    }
};

```

### ライブラリのインターフェース
```c++
class LibraryInterface {
public:
    void libraryFunction1() { /* 操作libraryFunction1 */ }
    void libraryFunction2() { /* 操作libraryFunction2 */ }
};

class Library {
private:
    LibraryInterface obj;
public:
    LibraryInterface* operator->() {
        return &obj;
    }
};

```
OperatorのOverLoad　インクリメント（++）およびデクリメント（--）演算子

## 概要
C++ のインクリメント（++）およびデクリメント（--）演算子はオーバーロードでき、カスタム型の操作に使用できます。これらの演算子をオーバーロードすることで、カスタム型により柔軟で直感的な動作を提供し、さまざまなシーンや要求に適合させることができます。

## 使用シーン

### イテレータークラス
カスタムのイテレータークラスでは、インクリメントおよびデクリメント演算子をオーバーロードして、イテレーターの移動操作を実装できます。これらの演算子をオーバーロードすることで、イテレーターオブジェクトをポインターのように増分および減分できるようにし、イテレーターの使用を容易にします。

例
```c++
class Iterator {
private:
    int* ptr { nullptr };
public:
    Iterator(int* p) : ptr(p) {}
    
    Iterator& operator++()
    {
        cout << "前置" << endl;
        ++ptr;
        return *this;
    }
    
    // オーバーロード--
    Iterator& operator--() {
        --ptr;
        return *this;
    }

    // オーバーロード++
    Iterator& operator++(int){
        cout << "後置" << endl;
        auto ret = *this;
        ++ptr;
        return ret;
    }
    
    // オーバーロード
    int& operator*() {
        return *ptr;
    }
};
int main(int argc,char* args[])
{
    int arr[] = {1, 2, 3, 4, 5};
    Iterator it(arr);
    
    ++it;// 前置
    //it.operator++();//前置
    cout << *it << endl;  

    //it++;
    it.operator++(0); // 後置
    cout << *it << endl;  
    
    --it;
    cout << *it << endl;  
    return 0;
}
```

### カウンタークラス
カウンタークラスでは、インクリメントおよびデクリメント演算子をオーバーロードして、カウンターの増加および減少機能を実装できます。このようなクラスは、ループカウント、リソース管理など、さまざまなカウントシナリオに使用できます。

例
```c++
class Counter {
private:
    int count;
public:
    Counter(int c) : count(c) {}
    
    Counter& operator++() {
        ++count;
        return *this;
    }
    
    Counter& operator--() {
        --count;
        return *this;
    }
    
    int getCount() const {
        return count;
    }
};

int main() {
    Counter cnt(0);
    
    // カウント++
    ++cnt;
    cout << cnt.getCount() << endl;  // 1
    
    // カウント--
    --cnt;
    cout << cnt.getCount() << endl;  // 0
    
    return 0;
}
```

### カスタム整数型
カスタムの整数型に対して、インクリメントおよびデクリメント演算子をオーバーロードすることで、増減の動作を変更し、特定の要件により適合させることができます。たとえば、特定のステップを増加または減少させるように、カスタムの整数型を定義することができます。

### イテレーター範囲クラス
カスタムのイテレーター範囲クラスでは、インクリメントおよびデクリメント演算子をオーバーロードして、範囲の移動操作を実装できます。このようなクラスは、範囲を表し、範囲内での移動機能を提供するために使用できます。

### ステートマシンクラス
ステートマシンクラスでは、インクリメントおよびデクリメント演算子をオーバーロードして、ステートの変換操作を実装できます。このようなクラスは、ステートマシンを表し、異なるステート間の変換機能を提供するために使用できます。


## 前置インクリメント演算子（++i）と後置インクリメント演算子（i++）

後置インクリメント演算子は指摘できます。
```c++
Iterator& operator++(int);//後置インクリメント演算子
Iterator& operator--(int);//後置インクリメント演算子
```

例
```c++
class Iterator {
private:
    int* ptr { nullptr };
public:
    Iterator(int* p) : ptr(p) {}
    
    Iterator& operator++()
    {
        cout << "前置" << endl;
        ++ptr;
        return *this;
    }
    
    // オーバーロード--
    Iterator& operator--() {
        --ptr;
        return *this;
    }

    // オーバーロード++
    Iterator& operator++(int){
        cout << "後置" << endl;
        auto ret = *this;
        ++ptr;
        return ret;
    }
    
    // オーバーロード
    int& operator*() {
        return *ptr;
    }
};
int main(int argc,char* args[])
{
    int arr[] = {1, 2, 3, 4, 5};
    Iterator it(arr);
    
    ++it;// 前置
    //it.operator++();//前置
    cout << *it << endl;  

    //it++;
    it.operator++(0); // 後置
    cout << *it << endl;  
    
    --it;
    cout << *it << endl;  
    return 0;
}
```
WSL2が起動できなくなった。なんとか直した

### まえがき：
素人のセリフだが、「いつもは使えていたのに」「ある日突然」「何もしていないのに」WSLが起動しなくなったが「いろいろやっていたら」直った。
将来同じことで悩むであろう自分のためにメモを残す。
ちゃんとログを取っていないので記憶に頼って書く。
ひどくてスミマセン。

### 現象：
Windows 10 Proで、WSL2を使用し、Ubuntu 22.04を使っていた。
ふだんはショートカットをダブルクリックしたらbashのコンソールが起動していた。
しかしある日あるとき、ショートカットをダブルクリックしたら、コンソールが一瞬起動してすぐ消える。
何らかのエラーが出ているが動体視力がなくて見えないようだ。

### 検索：
「**wsl 起動しない**」で検索すると
 - wslをコマンドラインで起動して修復する
 - wslconfigをコマンドラインで起動して修復する
などという記事に当たる。
が、普通にWindowsコマンドプロンプト（cmd.exe）を起動して``wsl``、``wslconfig``と入力しても「***指定されたパスが見つかりません***」と表示される。

### 調査：
物理ファイル「**wsl.exe**」「**wslconfig.exe**」がどこにあるか調査する。
いくつか方法はあるだろうが、Everything.exeというフリーウェアで検索すると、それぞれ何箇所かで見つかった。
主要なところとしては
 - C:\Program Files\WindowsApps\WSL\wsl.exe
 - C:\Windows\System32\wslconfig.exe
などが見つかった。

### アクセスできない：
「**C:\Program Files\WindowsApps**」というフォルダーは、一般ユーザーからもAdministratorからも絶対に見つからないパスである。
一般ユーザーとしてcmd.exeから``cd \Program Files\WindowsApps``しても「**指定されたパスが見つかりません**」と言われる。

### 管理者権限でcmd.exeを起動：
cmd.exeを管理者権限で起動してみる。
いろいろやり方はあるが、以下のようにしている。
 1. スタートメニューでcmdを検索する
 2. コマンドプロンプトのアイコンをデスクトップに右クリックドラッグし、ここにショートカットを作成するを選ぶ
 3. ショートカットを右クリック＝＞プロパティを選択
 4. プロパティのショートカットタブの詳細設定ボタンをクリック
 5. 管理者として実行をチェックオン
 6. OKを2回クリック
これでこのショートカットをダブルクリックしたら、cmd.exeが管理者として起動する。

### アクセスはできた：
Administratorとしてcmd.exeから``cd \Program Files\WindowsApps``すると、cdできる。
さらに``cd WSL``とすると、wsl.exeのあるフォルダーにcdできる。
ここで``.\wsl.exe``と入力しても「***指定されたパスが見つかりません***」と言われる。
``cd \Windows\System32``として``.\wslconfig.exe``と入力してもやはり「***指定されたパスが見つかりません***」と言われる。
どういうこと？
wsl.exeおよびwslconfig.,exeを起動すると、何らかの設定（レジストリ？）によってインストールされたUbuntuを参照しようとして、そのパスが見つからないのだろうか。
（いまだに分からない）

### 効果がなかったこと：
以下はいろいろやったけど関係ないと思う。
 - コントロールパネル＝＞プログラムと機能＝＞Linux用Windowsサブシステムを無効化、再起動、最有効化、再起動
 - プログラムの追加と削除でUbuntuを削除＝＞Windows StoreからUbuntuをインストール
 - C:\Program Files\WindowsApps\WSLをシステム環境変数に追加
 - C:\Windows\System32をシステム環境変数に追加（もともと入ってた）
どうしても「指定されたパスが見つかりません」が消えない。

### たぶんこれが決め手：
 - 管理者としてcmd.exeを起動
 - ``cd \Program Files\WindowsApps\WSL``
 - ``.\wsl.exe --update``（なんかごちょごちょ言っていた）

これでなぜか一般ユーザーとしても、管理者としても、どこのパスにいても``wsl``と入力するとWSLが起動した。

### 一般ユーザーが作れない：
最初の1回、一般ユーザーのユーザー名と初期パスワードを求められる。
これは普通の現象。
だが、ここで何を入れても「***指定されたパスが見つかりません***」と言われる。
Ctrl+Cで中断。
（これもいまだになぜか分からない）

### rootとして起動してしまう：
もう1度wslで起動すると、プロンプトが「#」。
さっき一般ユーザーを作成できなかったので？rootとして起動してしまう。
以下で解決した。
 - ``# adduser ユーザー名``で一般ユーザーを追加する
 - ``# gpasswd -a ユーザー名 sudo``でsudo権限を追加する
 - /etc/wsl.confをnano（かなんか）で編集して、以下のエントリーを追加する
 ```
    [user]
    default=ユーザー名
```
以上。
原理はまだよくわからないが、とりあえず使えている。

***（この項終わり）***
抽象クラス

抽象クラスはインスタンス化の出来ないクラスです。
抽象クラスを親として継承する場合は、抽象クラス内の全てのメソッドを子クラスがオーバーライドをする必要があります。

ただし、子クラスも抽象クラスになる場合は一部を実装しなくても良いですが、newを利用する事は出来ません。

~~~:抽象クラスの宣言方法
アクセス修飾子　abstract 戻り値の型(void)　クラス名(引数);
~~~

# 利点
抽象クラスは継承時に親として利用する場合、子クラスが全ての機能を実装するように強制出来ます。

これにより
・子クラスでのオーバーライド忘れ
・親クラスを誤ってインスタンス化
などを防ぐ事が出来ます。
【The Stack】ライセンスに配慮したオープンでクリーンなソースコードデータセット

# The Stack とは？

オープンなコード LLM 用の学習データセット。

コード LLM は様々存在しており、有料 API で提供しているものも数多く存在していますが、そのような LLM はどのようなデータで学習をしているかを公開していません。
データが不透明であることはいくつかの問題があります。
- 著作権・ライセンス
- 悪意あるコードが出力される可能性はないか（そのようなデータで学習していないか）
- 自分のコードが勝手に利用されていないか
- 個人情報が含まれていないか

The Stack は透明性があり、かつ、上記のようなデータは含まない構成になっています。

## データセット詳細
The Stack は以下の手順で作成されます。
1. データのダウンロード：2015 年 1 月 1 日から 2022 年 3 月 31 日までの間に GHArchive から 2 億 2092 万のユニークなリポジトリ名を収集し、そのうちダウンロードに成功した 1 億 3736 万のリポジトリから「バイナリファイル」や「1MB を超えるファイル」、「非承認のプログラミング言語の拡張子を持つファイル」、「git ハッシュを使用して重複したが確認できるファイル」を除外する。このときのファイルサイズは、非圧縮サイズで 92.36TB です

2. ライセンス検出：GHArchive から 2640 万のリポジトリのライセンス情報が利用可能。残りの 1109 万については go-license-detector を用いてライセンス情報を検出。ただし、リポジトリの 80 ％以上でライセンスを検出できていない。MITとApache 2.0が最も頻繁に検出されたライセンス

3. 許可ライセンスデータセットの作成: 許可ライセンスのみを含むソースコードのデータセットを開発。GPL は除外。これは「機械学習モデルと推測されたアウトプットが彼らのライセンスの条件を違反しているという懸念を強く表明している」ため

4. 曖昧な重複除去：正確な重複除去だけでなく、曖昧な重複も行う。重複除去は MinHash を計算して重複を見つける。結果として、ファイルの 38.6 ％が他のファイルの重複として除外された


下の図が視覚的でわかりやすいですね。
```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer  The Stack のデータセット下処理概要図\n(出典：https://huggingface.co/datasets/bigcode/admin/resolve/main/the-stack-infographic-v11.png)
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758571/c5ed797d-aa35-9bd5-93d9-feebfaf1bd90.png>
@enduml
```
https://huggingface.co/datasets/bigcode/admin/resolve/main/the-stack-infographic-v11.png
KeycloakのDockerセットアップ（及び遭遇したエラーとその解決方法）

DockerでKeycloakをセットアップする際にいくつかの問題に直面しました。ここではそれらの問題と、それを解決するための一連の試行錯誤を共有します。

## 1. DockerでKeycloakのrunが数秒で停止する

最初に直面した問題は、`docker run`コマンドを実行した際に、Keycloakコンテナが数秒後に停止してしまうというものでした。

### 問題の状況

以下のコマンドを実行すると、コンテナがすぐに停止してしまいます。
※administrator、passwordの部分は任意の文字列
```bash
docker run -p 18080:8080 -e KEYCLOAK_USER=administrator -e KEYCLOAK_PASSWORD=password quay.io/keycloak/keycloak:latest
```

### 解決のために試したこと

以下の操作でコンテナのログをチェックしてみましたが、特定のエラーメッセージは見つかりませんでした。

```powershell
docker logs $(docker ps -q -l)
```

[補足]
コンテナのIDまたは名前を直接指定してログを表示することもできます。まず、docker ps -aコマンドを使用してすべてのコンテナのリストを取得し、関心のあるコンテナのIDまたは名前を見つけます。

```powershell
docker ps -a
```
出力からコンテナのIDまたは名前を見つけたら、以下のコマンドでログを取得します（<container_id_or_name>を実際のコンテナIDまたは名前に置き換えてください）。

```powershell
docker logs <container_id_or_name>
```


### 解決策

`KEYCLOAK_ADMIN`と`KEYCLOAK_ADMIN_PASSWORD`環境変数を使用してコンテナを実行しました。

```bash
docker run -p 18080:8080 -e KEYCLOAK_ADMIN=<admin_user_name> -e KEYCLOAK_ADMIN_PASSWORD=<admin_user_password> quay.io/keycloak/keycloak:20.0.1 start-dev
```

これにより、Keycloakコンテナは正常に起動し、数秒後に停止する問題は解決しました。

## 2. 誤ったリンクへのアクセス

Keycloakの管理コンソールにアクセスしようとした際に、誤ったリンクを使用していました。

### 問題の状況

`localhost:18080/auth`へのアクセスを試みたところ、「Page not found」エラーが表示されました。

### 正しいアクセス方法

実際には`localhost:18080/admin`が正しいURLでした。このURLをブラウザで直接入力することで、ログイン画面が表示され、ここで先ほど設定した`<admin_user_name>`と`<admin_user_password>`を入力することで、Keycloakにログインすることができました。

### 補足

Keycloakコンテナのログは以下のコマンドで確認できます。

```powershell
docker logs <container_id>
```

ログからは、Keycloakが開発モードで起動していること、ユーザー名`admin`が既に存在するため再追加できないことなどが確認できました。
2024年3月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2024年3月1日の検索結果 (リスティング広告)

![20240301_AIOps_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/b8002c36-64ff-a944-5ae5-03efbb191df1.png)

* Splunk
* IBM
* PureStorage
* ServiceNow

Splunk がトップで IBM と PureStorage が続いています。

先月の結果はこちら --> [2024年2月 AIOps 定点観測](https://qiita.com/mkodera/items/3c67f42d63a991d45794)

# 2024年3月1日の検索結果 (広告以外)

![20240301_AIOps_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/f6fb2d64-69ce-44a7-9675-47c1294c6054.png)

* HPE
* Splunk
* AWS
* IBM

先月と同じく HPE と Splunk が上位です。AWS と IBM が続いています。

先月の結果はこちら --> [2024年2月 AIOps 定点観測](https://qiita.com/mkodera/items/3c67f42d63a991d45794)
PostgreSQL + repmgr Event notificationsの使い方

# はじめに

repmgrのイベントに応じて、任意のスクリプトを実行する方法を紹介します。

PostgreSQLの検証を行っていて複数のHAツールを検証していましたが、特にこのイベント毎に任意のスクリプトを実行する機能が非常に柔軟性があり、便利な機能でした。

# repmgrとは？
まず、repmgrとは、PostgreSQLのクラスタのレプリケーション、及び、フェイルオーバーを管理するためのオープンソースソフトウェア(OSS)となります。
repmgr自体の紹介は他のブログや以下の公式HPをご覧ください。

https://www.repmgr.org/

# 環境
前提となる環境は以下の通りです。
primary 1台 + standby 1台の最もシンプルな構成を想定しています。

|#| Version |
|---|---|
| OS | Rocky Linux 8.9  |
| DB | PostgreSQL 15.4|
| HA | repmgr 5.3.3|


 # Event notifications
repmgrにはEvent notificaitonsという機能があります。

https://www.repmgr.org/docs/5.3/event-notifications.html

これは、repmgr、及び、repmgrdが内部的に生成するイベントを通知することが出来る機能です。
Event notificationsを有効にするには、repmgrの設定ファイルであるrepmgr.confに「event_notifications」と「event_notification_command」を設定します。



```toml
event_notification_command='/path_to_script/sample_tool -event_type=%e'
event_notifications='standby_promote'
```

例えば、上記の設定例の場合、standby_promoteイベントが生成された場合に、任意のスクリプトであるsample_toolを実行する、という設定になります。
※引数に渡している-event_type=%eに関しては後述の説明をご覧ください。

 # Event notificationsの引数
Event notificationsにはいくつかの引数を渡す機能が用意されています。
以下は全てのイベントに対して設定される引数です。

|引数|説明|
|---|---|
|%n|node ID|
|%e|event type|
|%s|success (1) or failure (0)|
|%t|timestamp|
|%d|details|


また、特定のイベント時のみ設定される引数もあります。
|引数|説明|設定されるイベント
|---|---|--|
|%p|node ID of the current primary|repmgr standby register, repmgr standby follow|
|  |node ID of the demoted primary|repmgr standby switchover|
|  |node ID of the former primary|repmgrd_failover_promote|
|%c|conninfo string of the primary |repmgr standby register, repmgr standby follow|
|%a|name of the current primary node |repmgr standby register, repmgr standby follow|


上の設定例では、任意のスクリプト(sample_tool)が-event_type引数を取り、それに%eを渡しています。
%eには、repmgrが生成するイベント名(standby_promote)が渡されます。
従って、以下のように任意のスクリプト側でevent_type毎に処理を書いておけば、イベント毎の処理が実装出来ます。

```golang
if event_type=="standby_promote" {
    処理内容
}
```
※golangで記載した場合の例です。

# 検証 event_notificationsの引数を出力
イメージしやすいように、実際に以下の通り設定した場合、どのように出力されるのか確認してみます。
standby_promoteイベント発生時に、どのイベント発生時でも渡される引数(%n %e %s %t %d)を、改行を入れて表示しています。

```toml
event_notifications='standby_promote'
event_notification_command='echo -e "node_id=%n\nevent_type=%e\nsuccess_or_failure=%s\ntimestamp=%t\ndetails=%d" >> /tmp/notification_command.log 2>&1'
```

notification_command.logを表示します。
```
cat /tmp/notification_command.log
node_id=2
event_type=standby_promote
success_or_failure=1
timestamp=2024-02-29 20:13:12.371955+09
details=server "node2" (ID: 2) was successfully promoted to primary
```
上記の通り、引数がちゃんと渡されている事が確認できました。

# さいごに
イベント毎に任意の処理が実行できますので、例えば、以下のように活用する事が考えられます。自分の要件に応じて柔軟に実装出来ますので、是非、お試しください。



- standby_promoteイベントが発生するとe-mailを送付する
- standby_promoteイベントが発生したらDNSのAレコードをNewPrimaryに書き換える
- child_node_disconnectイベントが発生したら同期レプリケーションから非同期レプリケーションに切り替える
- child_node_reconnectイベントが発生したら同期レプリケーションに戻す



 # 参考

 https://www.repmgr.org/
 https://www.repmgr.org/docs/5.3/event-notifications.html
Loyalty Program のトレイルヘッド


# We can’t find the two loyalty ledgers associated with the transaction journal for member CL001. Make sure to run the flow named ‘Run Batch Job for Accruals’.

+ [Configure an Accrual Loyalty Program Process Using Promotion Setup => Process Transaction Journals](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NF6BQ)

:::note
I had to open a ticket on it as they had to delete some records from a prior challenge to have the validation work.

検証を機能させるために以前のチャレンジからいくつかのレコードを削除する必要があったため、チケットを開く必要がありました。
:::

# ステップのスクリーンショットに示されているように、「購入のクレジットベースポイント」という名前のクイックプロモーションの主な詳細に設定される「対象となるアクティビティフィールド」が表示されません。

+ [Please help resolve error in "Set Up a Loyalty Program" -> "Work with promotions". Cannot find field to complete the step.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YvwQPSAZ)


# We can’t find a member group named ‘Martin Family. Make sure to set the Member Type field as Group and the Group Created By field as M001.

+ [【未解決】I am stuck on the Manage Program Members section of the Set Up a Loyalty Program Trailhead challenge. I have already created the Martin family according to the challenge but I keep getting the following message. Can anyone please help?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007igOeOSAU)

https://trailhead.salesforce.com/content/learn/projects/set-up-a-loyalty-program/add-members-and-run-flows

# 未解決

+ ["Add Product" button unable in Set Up a Loyalty Program Create Your Loyalty Program](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007CG2q4)

+ [Configure an Accrual Loyalty Program Process Using Promotion Setup => Define Rules for a Cumulative Promotion Error](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Jg3Px)


### "We can’t find the two loyalty ledgers associated with the transaction journal '00000002' for member CL005

+ ["We can’t find the two loyalty ledgers associated with the transaction journal '00000002' for member CL005](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KC7X90AL)
レシートを読み込んで家計管理をする記録 ～序章　OCRに関して～

レシートを読み込んでその日の支出額や店ごとの商品価格の比較を実施したい。

ので、ChatGPTのお力を借りつつ開発してみることにした。
なお、コストは０円で抑えたい。

まずはOCRに関して代表的なものをいくつか調査。
##### Google Vision API
・Googleが提供するクラウドベースのサービス。高精度で多言語に対応し、レシートやドキュメントのテキスト認識に強い。
・クラウドサービスなのでインターネット接続が必要。使用量に応じた課金があるが、精度は非常に高い。
・0~1000リクエスト/月は無料で、それ以上のリクエスト数だと料金発生する。
・確か昔APIキーは取得していたはずだが、ちょっと触っただけで使ってない。。

##### Tesseract
・オープンソースで無料利用可能。多言語に対応していて、カスタマイズや拡張が可能。
・精度は他と比べると劣る場合がある。
・オフラインでの使用やコスト面で優れている。

##### MMOCR
・MMLabの一環として開発されているオープンソースのプロジェクト。
・テキスト検出、認識、理解のための包括的なツールキット。
・OCR関連タスクのための多数のモデルが用意されている。
・カスタムデータセットや新しいモデルを簡単に追加できるよう設計されている。
<r>
<r>
<r>
<r>

思ったこと
・優先度は精度を基準として、Google Vision API＞MMOCR＞Tesseract
・Google Vision APIは無料で使える範囲でリクエスト数を抑えるようにする。
・とりあえず3つやってみて精度や特徴を比較してみる。
ubuntuインストールしたらやること

https://zenn.dev/sprout2000/articles/8ea4a77d81583a

# NVIDIA ドライバインストール

https://qiita.com/tf63/items/0c6da72fe749319423b4

https://qiita.com/tmasada/items/f77808c870c829c076fa


# Google Chrome インストール

https://qiita.com/porizou1/items/8c58682c454fe0f8e19e


# VSCodeインストール

https://www.fujimiya-san.com/archives/1382

# その他いろいろ

```bash
sudo apt install vim terminator git openssh* net-tools
```


# docker, docker-compose


# ROS

https://github.com/Tiryoh/ros2_setup_scripts_ubuntu
openbuddy-gemma-7b-v19.1-4kは『雪国』の冒頭をどうトークナイズするのか

[openbuddy-gemma-7b-v19.1-4k](https://huggingface.co/OpenBuddy/openbuddy-gemma-7b-v19.1-4k)という言語モデルが、9つの言語(英語・フランス語・ドイツ語・イタリア語・フィンランド語・ロシア語・中国語・韓国語・日本語)をサポートしている、とのことなので、日本語に対するトークナイザを試してみることにした。

```
>>> from transformers import AutoTokenizer
>>> tkz=AutoTokenizer.from_pretrained("OpenBuddy/openbuddy-gemma-7b-v19.1-4k")
>>> print(tkz.convert_ids_to_tokens(tkz("国境の長いトンネルを抜けると雪国であった。","夜の底が白くなった。")["input_ids"]))
['<bos>', '国', '境', 'の', '長い', 'トンネル', 'を', '抜け', 'ると', '雪', '国', 'であった', '。', '<bos>', '夜の', '底', 'が', '白', 'くなった', '。']
```

残念ながら、日本語トークナイザとしてはボロボロだ。特に「抜け」「ると」のあたりは、単語の切れ目を完全に無視していて、日本語における言語処理としては話にならない。元の[gemma-7b](https://huggingface.co/google/gemma-7b)のトークナイザを、何も考えずにそのまま使ってしまったのだろう。残念だ。
OWASP脅威モデリングワークショップに参加して

# 前提背景
去年の8月と10月にオンサイトでOWASPの脅威モデリングワークショップに参加してきた。
そこでの知見をここに残す。
脅威モデリングワークを受ける前までは、セキュリティに対して苦手意識を抱いてしまっていた部分があった。
しかし、基本的な脅威の洗い出しをモデリングベースで洗い出し、継続的に脆弱性を明らかにする工程はまるでDDDとそっくりであり、これをUAFの思考プロセスと組み合わせることで、戦略的な脆弱性対策を実現できると確信した。

# 心構え
ここではアジャイルな脅威分析を前提としている。
以下の①～④に時間をかけ過ぎて⑤の検証の時間を割けないということがないように、
DDDモデリングと同じ考えで、まずは「ここにこんな脅威がありそう」
という仮説をもとに①～④まで迅速に進めて、⑤で検証振り返りした上、
次の①～⑤のイテレーションに落とし込んでいく。

その上で継続的に信頼境界の場所を見つめ直していくことになる。
もしもコンテキスト境界の位置を「セキュリティの観点のみで考えたい」という場合には、
この信頼境界の位置がまさに、サービス境界などになることになる。

:::note warn
ただし、実際にはセキュリティ以外の品質観点も同じくらい重要な場合が多いので、実際に信頼境界の位置とコンテキスト境界の位置が完全に一致することはない。
:::

まずはモデリングするスコープなどの前提条件を明らかにした上で①に取り掛かる。
その際には事前に戦略的DDDモデリングなどによって、
ラフスケッチで構わないので、全体的なコンテキストマップを作成することをオススメする。

# ①取り組む対象のシステムデータフロー図を描く
<img width="500" alt="DFD.png (20.9 kB)" src="https://img.esa.io/uploads/production/attachments/5827/2023/09/01/135213/cdc4694e-044b-44e3-8b7a-655df7fe838c.png">

まずは上図のようなデータフロー図を描く。
この際にDFD図だけではなく、場合によってはステートマシン図なんかも使うこともある。

# ②脅威の洗い出し
STRIDE という手法を使ってまずは考えられる脅威を洗い出す。
このSTRIDEというフレームワークに沿って進めることで考慮漏れを防ぐことにもなる。

:::note info
Spoofing Identity　なりすまし
Tampering with data　改ざん
Repudiation　否認
Information disclosure　情報漏洩
Denial of service　サービス妨害
Elevation of privilege　権限昇格
:::

の頭文字をとってSTRIDE。
このフレームワークにそってまずは考えられる脅威を洗い出す。
[コチラ](https://terraconti.jp/about-stride/) 　を参照ください。


# ③脅威を洗い出した後のリスクの分析
ここではリスクの大きさを評価するフェーズであり、DREADフレームワークを用いて分析する。

:::note info
Damage potential：潜在的な損害
Reproductivity：再現可能性
Exploitability：攻撃利用可能性
Affected users：影響ユーザー
Discoverability：発見可能性
:::

詳しくは[こちら](https://hanakutoman.com/dread/)を参照ください。
最近ではBug Barという手法がメインで扱われているようです。

# ④リスクへの対策考える
リスクポイントが低いものや発生頻度が低い、優先度の低いものは
そもそも受容するなど、
リスクの大きさによって、
・受容
・移転
・低減
・回避(ハイリスクなもの)
の４つの観点で分類し、対策を考える。
[コチラ](https://hanakutoman.com/deal-with-security-risk/)を参照ください。

# ⑤振り返り
①～④を各ビューごとのステークホルダーとともに迅速に行った上で、
⑤での検証振り返りを行い、再度①からまたイテレーション回す。
１回で分析しようとし過ぎずに、①～④まではサクサクと進めて⑤の振り返りでカバー。

次のイテレーションに入った際には、
この検証振り返り結果を踏まえて「そもそもこの脅威が抜けてたよね」といった議論や、
それを踏まえて「このリスク、ポイント高いと思ってたけど違ったね」
といったように、反復するたびに仮説の精度を上げていく。

# 発見
今回はデータフローを使っての脅威モデリングであったが、この考え方は他にも転用可能であると感じた。

## PM観点での脅威
たとえば、プロジェクトマネジメント観点での脅威分析として、

### ①プロセス上の脅威
プロジェクトの遅延やヒトが欠勤してしまうor辞めてしまう
といったものが列挙できる。

遅延するリスクを抑えるために、チームトポロジーのようなタスクの割当にも設計思想を用いて、意図せず認知負荷が異常にかかるような状況を仕組みで抑止したりする方法は考えられる。

他にはプロジェクト進捗を遅らせるメテオフォールやステークホルダーの強い抵抗といったインパクトのデカい脅威を抑える考えとして、TOC(制約理論)との組み合わせによって、事前に予測できる脅威に対しては最小限に抑えられる。
ただし、それもステークホルダーとの信頼関係のない初期段階とかに関しては、継続的に行わなくてはいけない。

### ②データの観点での脅威
プロジェクトの成果物に関する重大なデータが、
社員の自宅への仕事の持ち帰りなどによって漏洩してしまうリスクなど。
このあたりは近年出てきたゼロトラストセキュリティの思想が必須になってくると読んでいる。

あとは、社外への重要データ持ち出しは罰則として減給などといった
明確な評価制度の透明化なども重要な活動になってくるであろう。

## PdM観点での脅威
自分たちが売り出したプロダクトに対して、競合他社がハックするような戦略を打ち出してくるなど、市場系のリスクが起こりうるかもしれない。

技術系リスクだけでなく、こういった外部環境リスクに対して変化をいち早くキャッチするためには、マーケティングに詳しい人との密な連携以外に何があるのか？は自分ではまだ十分に理解できていない。

## ワークフロー上の脅威
これはユーザーが本来意図された使い方の通りに使ってくれない場合や、
途中でサービスが停止してしまうことを想定した脅威分析などが相当する。
障害が起こりにくい仕組みを構築するのか？　
起きてしまった障害から迅速な復旧をするためには、障害が起きているという想定シーンでの復旧活動を事前にある程度設計しておかなくてはいけない。
進化するチームのための目標ツリー図を作成する意義

# 目標ツリーモデルを作成する意義
プロジェクトとプロジェクトが単なる点で終わってしまい、
前回のプロジェクトとの関係性が視えないほど、関係者たちの中で徐々にWhyが薄れてしまう。
たとえ１つのプロジェクトが理想の結果にならなかったとしても、
答えのない仮説ベースなのだからそれは仕方ないことだけども、
プロジェクト同士の関係性が視えない
　→何が良くて、何が効果得られたのか？　その背景は？
といったことが考察されないまま、前回プロジェクトの続きから開始という
何となくの計画では、学習した組織になっていないため現状維持バイアスが働きやすい。


# 目標トレーサビリティ図
前提として、トップゴールである大目標はむやみに拡張させたりしてはいけない。
そこが大前提条件になるので、そこが変わるとすべてが覆されてしまうリスクが高い。

目標の粒度が揃っていることが望ましいが、最初の段階では仮説ベース。
そのチェックは、同じ粒度だと思っている他の目標要素との因果関係をチェック。
しかしここで、無理に構造の粒度を揃えようとし過ぎても時間を使い過ぎてしまうので、
分からない場合には、次の工程へ進む。

<img width="900" alt="目標管理図.png (74.0 kB)" src="https://img.esa.io/uploads/production/attachments/5827/2024/01/09/135213/1b1a81c2-e39c-473c-882b-757f0b2c108a.png">


# 目標に対するCapabilityの定義
その目標を達成するためには、必ず1つ以上のCapabilityの組み合わせが必要である。
トップゴールには、当然複数のCapabilityが存在するため、
最初の段階では、どんなCapabilityが必要なのか考察しにくい場合には、
より具体化された短期目標に必要なCapabilityからまずは考える。
より細分化された短期目標であるほど、１つか２つのCapabilityから定義されている。
理想は１つのCapabilityで定義された短期目標。
その上の中期目標は、２つのCapabilityで構成されているというように、
プロジェクト単位ごとにCapabilityが１つずつ増えるようにプロジェクト設計すべき。

そしてボトムアップに、その先の目標で必要なCapabilityセットは何か？
と考えていき、最終トップゴールの大目標に必要なCapabilityセットを明らかにする。
この時も、ボトムアップとトップダウンを行き来しながらがコツ。
またその際に、必ず「この目標ならこのCapabilityセットだよね。
逆にこのCapabilityセットならきっとこんな目標のイメージだよね。」という
検証を随時しておくことで、無駄な手戻りの抑制をする。


ここまでは、あくまでも「このCapabilityセットであればこの目標が達成できるであろう。
なぜなら～～」という仮説にすぎない。
実際のプロジェクトでそのCapability指標になるまで伸ばしつつ、
細かくスプリントごとに検証しながら目標に必要なCapabilityなのかを検討する。
場合によっては、ボトムアップに必要なCapabilityが変更されたり、
軌道修正が必要な状況が出てくるので、これも相まってリスクを抑えるために、
極力１プロジェクトごとに１つのCapabilityを拡張させていく計画が望ましいと言える。

# 粒度を揃える
通常、この工程をやりつつ上記のCapability定義を進める。
Capabilityのセットが上記で明らかになったら、以下のような部分を修正する。
同じ粒度の目標だと思ってた横の目標要素は、３つのCapabilityセットからなるのに、
こちらの同じ粒度目標は２つのCapabilityセットからなるみたいな所を修正。

これには２つ修正しないといけない要因がある。
①粒度が不揃い
②もともと定義したCapabilityが単一能力を示していない。能力がマルチ責務状態。
この場合には、同じ粒度の階層に２つのCapabilityセットからなる目標と、
３つのCapabilityセットからなる目標がなぜか粒度揃っているなんてことが起きる。

# SWOT分析
ちょっと視点を変えてマーケティング視点で考えてみる。
競合のやっていることをそのままなぞらえるだけにならずにするために、
自分たち組織の強み、弱み、狙い目の機会、脅威の４象限に分けてCapabilityを配置。
ここの強みや弱みは組織文化を色濃く反映するので、
弱みをなくそうとし過ぎて強みまでなくなるといったことがないように注意する。
また、いまこの瞬間強みであっても、
脅威などによってその強みを塗り替えられる可能性が高まってきたら、その強みを別のものに変える。
つまり戦略を変える必要性がある。
この強みCapabilityを沢山の要素持っており、
かつそれに対するトレードオフの弱みを把握し、対策を立てられているほど戦略的といえる。

# イシューを見極める
自分たちの弱みであるCapabilityを伸ばそうとしても長所が下がるので、
強みであるCapabilityで構成されている。もしくは
改革を起こしたいのであれば、機会の領域のCapabilityを優先度高く実現にあたる。
参考文献として、イシューからはじめよ　の思想をベースとする。
イシュー度の高さ、解く価値が高いOpportunityと、それを実現できる解
それらが組み合わさっている状態で、初めてその目標はイシューと言える。

# 影響を考える
既存のCapabilityに対して、追加したいCapabilityを拡張した際の影響を考察。
仮にトレードオフ関係にあるCapability要素同士の組み合わせからなる場合、
既存のCapabilityに対して、指標を下げるような力学が高確率で働くから、
事前にそのリスクは考慮した上で、目標計画を立てておく。
JSTQB Foundationに合格した話

# 初めに

今回初めて独学で資格合格をしてJSTQB Foundationを取得しました。

本記事では[以前書いた記事](https://qiita.com/Naoumi1214/items/7efbc310d60023af4435)で自分が友人と勉強したことを書きます。

# そもそもJSTQB Foundationって何？

ISTQBと言うソフトウェアテスト資格の日本版です。

内容としては基本情報技術者試験のA試験(午前試験)形式でソフトウェアテストを出題されます。

問題の中にはコードを解析してカバレッジを計算するものもあります。

資格の種類としては以下があり今回は一番簡単なFoundation Levelを受験しました。

- Foundation Level
- Foundation Level スペシャリスト 自動車ソフトウェアテスト担当者
- Advanced Level(TA)
- Advanced Level(TM)

# なんで受験したの？

QA分野に興味を持っていたからです。

また会社の資格合格手当対象にもなっているからです。

# どんな勉強した？

## 1. 公式シラバスを読む

まずは試験内容を一通り頭に入れるため公式を読みます。

https://jstqb.jp/dl/JSTQB-SyllabusFoundation_Version2018.J03.pdf

内容的には普通の開発経験があれば理解できるような内容でした。

逆に言うとエンジニア未経験者やインフラエンジニアは難しそうと感じました。

また以外とアジャイル開発に対するテストについてたくさん書いていました。

## 2. 非公式問題集を解く

### テス友

バルテス社が作った問題集。

間違えた問題を復習できる機能がある。

またスマホアプリも存在している。

https://www.qbook.jp/info-testomo/

こちらの問題集を最終的には分野ごと得点を80%以上になるよう周回しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/7177e306-2bbb-4530-41e7-edffcc2970c9.png)


### スクエアリング・サービス

マイナー資格に対応した問題サイト集。

無料で使うと問題数が少ないため、課金必須。

しかし1度課金すると2年間有効になる。

問題の解説が結構細かい。

http://squaring.jp/EC03-FL/00-index.jsp

合格可能性が100%になるまで勉強しました。(画像は98.4%なのは100%状態で間違えると下がるからです。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/4c51ef0f-7fbc-751b-61d4-46743adfea1a.png)


# 受験

受験会場は職場付近にあるテストセンターで受験しました。

実際に試験を受けると複数問、問題集で見たことない内容が出てきて不安になりました。

また普段公式を使って解いている問題も表や丸を書いて数えました。

# 結果

合格しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/ea1d9234-2a04-1ac1-0110-2ae5b73d0b4a.png)

反省点としては去年の夏から勉強していたことです。

あまりにだらだら勉強していたので早めに受けたかったです。
nvndia-smiでエラー

## 急にnvidia-smiが通らなくなった

```
$ nvidia-smi
```
```
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
```

```
$ sudo apt upgrade
```

```
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
これらを直すためには 'apt --fix-broken install' を実行する必要があるかもしれません。
以下のパッケージには満たせない依存関係があります:
 nvidia-dkms-535 : 依存: nvidia-kernel-common-535 (<= 535.154.05-1) しかし、インストールされていません
                   依存: nvidia-kernel-common-535 (>= 535.154.05) しかし、インストールされていません
 nvidia-driver-535 : 依存: nvidia-kernel-common-535 (<= 535.154.05-1) しかし、インストールされていません
                     依存: nvidia-kernel-common-535 (>= 535.154.05) しかし、インストールされていません
 nvidia-kernel-common-530 : 依存: nvidia-kernel-common-535 しかし、インストールされていません
E: 未解決の依存関係です。'apt --fix-broken install' を実行してみてください (または解法を明示してください)。
```

```
$ sudo apt --fix-broken install
$ sudo apt upgrade
$ sudo ubuntu-drivers autoinstall
```

```
E: エラー、pkgProblemResolver::Resolve は停止しました。おそらく変更禁止パッケージが原因です。
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627598/2c6a49ee-93f9-f0f6-6d91-4c6d6681a0e8.png)



## nvidia-driver消す
```
$ sudo apt purge nvidia-*
```

## autoremoveでcudaも消える
```
$ sudo apt autoremove
```

## おまじない再起動
```
$ sudo reboot
```

## nvidia-driverとcudaインストール
```
$ sudo ubuntu-drivers autoinstall
$ sudo apt install nvidia-cuda-toolkit
```

## 御祈祷
```
$ sudo reboot
```

## ざわ...ざわ...

```
$ nvidia-smi
```
通った！！！！！！ﾊｯﾋﾟｰﾊｯﾋﾟｰﾊｯﾋﾟｰｰｰｰｰｰｰｰｰｰｰ


![happy-cat-happy-happy-cat.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627598/7d965eb6-2f6a-d64c-0bf7-b2c20d088af6.gif)
Hello Worldからの復習 ～オブジェクト指向編～

何でも一人で抱え込むのは良くなくて、誰かと手分けしたり、協力し合っていかないとうまくいかない。
人一人が出来ることはたかが知れていて、(まれに出来る天才はいるかもしれないが・・)
あのフェルマーの最終定理を証明したアンドリュー・ワイルズも誰かの定理を使ったり、計算の協力者がいたりと、どんな天才も一人ではできなかった。

そりゃ凡人の私は絶対一人でなんて何もできませんよ。

##### お品書き
+ オブジェクト指向って？

---

◆オブジェクト指向って？
-

ざっくり言うと、みんなで手分けしてやりましょってこと。

今までの復習はメインのクラスを作り、その中で処理をバーっと記述して処理を行ってきた。

javaのクラスには2種類のクラスがある。
**実行用クラス**と**設計図クラス**

**実行用クラス**とは``mainメソッド``があるクラス。
今まで作ってきたから何となくわかる。

**設計図クラス**とは**属性**と**操作**というものを扱う。

```mermaid
classDiagram
  メンバー --|> 大輔
  メンバー --|> 花帆
  class メンバー{
    +名前
    +誕生日
    +血液型
    +プロフィールを表示する()
    (　　　　　　　　　　　)
    (　　　　　　　　　　　)
  }
  class 大輔{
    +3月21日
    +A型
  }
  class 花帆{
    +3月24日
    +A型
  }
```
メンバーの上半分が**属性**
何の`データ`を持っているか
下半分が**操作**
何の`処理`を出来るか


一つの設計図を基に具体的なデータを入れることでたくさんの実物を作れる。

具体的なデータを入れて作った実物を**オブジェクト**っていう。
**オブジェクト**ってクラスから作られる**モノ**とか**実体**ということ。

設計図の中にデータと処理をひとまとめにし、オブジェクトを中心にしてプログラムを作る考え方。

今までのイメージ↓
```mermaid
classDiagram
  class メンバー{
    +main（Stirng～）
    +誕生日管理
    +出動管理
    +処理()
    (　　　　　　　　　　　)
    (　　　　　　　　　　　)
  }
```
オブジェクト指向↓

```mermaid
graph TD;
    実行用クラス-->誕生日クラス;
    実行用クラス-->出動情報クラス;
    誕生日クラス-->出動情報クラス;
```
処理を切り分けていく図
各クラスに情報をまとめて、実行用クラスから呼び出して利用しよう。
持っているデータや処理を分けて、クラスを組み合わせて動かしていくのが
**オブジェクト指向**の考え方。

◆オブジェクト指向の何が良いの？
-

一つのファイルで行うと、修正がいろいろな箇所で発生しミスが起こりやすい、一人でやるしかない、多工程、時間がかかる等、大変になるが、クラスごと分担できると、開発効率、スピードもあがるし、大規模なシステムをみんなで作っていけるようになる。
メンテナンス性(保守性)もUP、メモリ効率もUP、システム化もUP！

もっとメリットはたくさんあるみたいだが今日はこの辺で。
デフォルト以外の Listener が稼働するIBM MQ を Instanaで監視する


### 1. 今回 対応したい課題

IBM MQ を Instanaで監視する際のヒントです。
Instana においては、デフォルトの組込みイベント監視として、QMGRで定義されている LISTENER 全てを監視しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/155e7244-4747-be74-0e5a-162db7d5a6e7.png)

お客様によっては、IBM MQを利用する際に、デフォルトのリスナー `SYSTEM.DEFAULT.LISTENER.TCP` ではなく、別名のリスナーを定義して、利用されている環境もあるかと思います。
下図の例ですと、1515ポートで待ち受ける`MYLISTENER`を定義して、それを利用しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/3a9b95f5-e5e9-b429-4bd4-97bc4b031b81.png)

このような環境では `SYSTEM.DEFAULT.LISTENER.TCP` は 起動していず、常に`STOPPED`というステータスになっていますので、デフォルトのIBM MQ Listener の監視設定では、エラーが出続けてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/c006e902-7b20-bb03-e291-b6498db2a5b1.png)

この記事では、① 利用している特定のLISTENER用の監視定義を作り監視を行い、 ②デフォルトのIBM MQ LISTENER 監視定義を停止することによって、実際の環境にあわせた監視へと変えていきたいと思います。

### 2. 監視設定の修正

#### 2-1. 利用している特定のLISTENER用の監視定義

設定 > イベント　より`新規イベント`を選択し、 以下のように イベントを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/1e3290b4-a9d9-65b2-c132-2e42263e6819.png)

 1 イベントの詳細

|定義|設定値|備考|
|--|--|--|
|名前|IBM MQ Listener MYLISTENER が起動していません|通知されるイベントのタイトル| 
|説明|任意の文字列|イベントの説明|
|問題の重大度 | クリティカル (デフォルト監視とレベルをあわせました）|クリティカル / 警告|

 2 条件

|定義|設定値|備考|
|--|--|--|
|ソース|組込みメトリック|監視データ種類|
|エンティティ・タイプ|IBM MQ リスナー|監視対象|
|時間枠|1秒||
|メトリック|状況|IBM MQ リスナーのステータス値を取得|
|集約|avg||
|オペレーター|≠ (等しくない）||
|状況値|2 (RUNNING)|ステータス値は [こちら](https://www.ibm.com/docs/ja/instana-observability/current?topic=mq-viewing-metrics#status-2)|

 3 スコープ　 ダイナミック・フォーカス・クエリーで絞り込みます
 |定義|設定値|備考|
|--|--|--|
|選択されているエンティティのみ<br>（ダイナミック・フォーカス・クエリ）|entity.ibmmq.listener.name:MYLISTENER|特定のリスナーのみ監視 ※|

※ デフォルトのリスナー以外だけ対象から外したいのであれば
`entity.type:ibmmq.listener AND NOT entity.ibmmq.listener.name:"SYSTEM.DEFAULT.LISTNER.TCP"`
という定義でもいいかもしれません。環境にあわせて設定ください。

### 3. デフォルトの IBM MQ LISTNER の定義を停止します
デフォルトで用意された IBM MQ Listener staus の `||`のボタンをクリックして、監視を停止し グレーアウトされたことを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/264bda57-1c38-af8a-bc18-d674d0cdc5b4.png)

### 4. 監視設定の確認
以下のコマンドで、キュー・マネージャー`TESTQM`の`MYLISTENER` を停止します

```
[mqm@itz-3100008gyq-iwxo bin]$ ./runmqsc TESTQM
5724-H72 (C) Copyright IBM Corp. 1994, 2023.
Starting MQSC for queue manager TESTQM.

stop listener(MYLISTENER)
     1 : stop listener(MYLISTENER)
AMQ8706I: Request to stop IBM MQ Listener accepted.
```

新しく定義されたイベントで、 `MYLISTENER`の停止が検知されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/a67015ce-1a6f-287b-c45b-fffae9e6f652.png)

また、`SYSTEM.DEFAULT.LISTENER.TCP` の停止していても、デフォルト定義のイベントでアラートが上がらないことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/6dc60713-64ab-a7d5-8769-b69f6e017b60.png)
C# DataGridView  列の追加時、「固定」選択による横スクロールバーの消滅

C# WindowFormsにおけるDataGridViewは、デザイナーより列の追加をすることができますが、ここで固定にチェックを入れると横スクロールが不可となります。

列の１つでもチェックをいれると、すべての列のFrozenプロパティがTrueとなります。
解除するにはすべての列のFrozenプロパティをFalseにします。

デザイナーよりFrozen=trueの行を削除していくと簡単です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/3bd13b75-5edf-02c0-5cb1-744b21022230.png)
OSS開発でforkしたリポジトリ側の同期方法のメモ

# はじめに
OSS開発時に、upstream（OSS本家）のGitリポジトリ側が進んだ場合の同期方法に関するメモです。

自分のPRがマージされた時にも実行します。本手順を実行すると、forkしたGitリポジトリ側のPRも自動でクローズされます。

# 手順
```
git checkout main

git fetch upstream

git merge upstream/main --ff-only

git push origin main -u
```
【JavaScript】配列メソッド一覧

JavaScript の配列メソッドは、データを扱う際に非常に強力なツールです。
これらのメソッドを使いこなすことで、データの操作、加工、検索が格段に効率的になります。
代表的な配列メソッドを役割ごとに大まかに分け、その使用方法と役割について詳しく解説していきます

## 反復処理

### `forEach`

配列の各要素に対して引数に渡した関数を実行します。返り値を持たず、配列の各要素に対して副作用を起こす操作に適しています。

```javascript
[1, 2, 3].forEach((element) => console.log(element));
```

### `reduce`

配列の各要素に対して（左から右へ）関数を適用し、単一の出力値を生成します。アキュムレータ（累積値）と現在の値に対して関数が適用され、最終的な値を返します。

```javascript
const sum = [1, 2, 3].reduce((acc, cur) => acc + cur, 0);
console.log(sum); // 6
```

## 配列生成

### `map`

各要素に指定した処理を行った値で新たな配列を生成して返します。map はデータの変換や加工に便利です。

```javascript
const doubled = [1, 2, 3].map((element) => element * 2);
console.log(doubled); // [2, 4, 6]
```

### `filter`

条件を満たす要素だけの配列を生成して返します。データセットから特定の条件にマッチする要素のみを選択する場合に使用します。

```javascript
const even = [1, 2, 3, 4].filter((element) => element % 2 === 0);
console.log(even); // [2, 4]
```

## 検索

### `find`

条件を満たす最初の要素を返します。見つからない場合は`undefined`を返します。

```javascript
const found = [1, 2, 3, 4].find((element) => element > 2);
console.log(found); // 3
```

### `findIndex`

条件を満たす最初の要素のインデックスを返します。見つからない場合は`-1`を返します。

```javascript
const index = [1, 2, 3, 4].findIndex((element) => element > 2);
console.log(index); // 2
```

### `indexOf`

指定した要素が最初に出現するインデックスを返します。見つからない場合は`-1`を返します。主にプリミティブ値の検索に使用されます。

```javascript
const index = ["子", "丑", "寅", "卯"].indexOf("寅");
console.log(index); // 2
```

## 要素の削除、追加

### `pop`

配列の末尾の要素を削除し、その要素を返します。

```javascript
const fruits = ["apple", "banana", "cherry"];
const lastElement = fruits.pop(); // 'cherry'
console.log(fruits); // ['apple', 'banana']
```

### `shift`

配列の先頭の要素を削除し、その要素を返します。

```javascript
const fruits = ["apple", "banana", "cherry"];
const firstElement = fruits.shift(); // 'apple'
console.log(fruits); // ['banana', 'cherry']
```

### `push`

配列の末尾に一つまたは複数の要素を追加し、追加後の配列の要素数を返します。

```javascript
const arr = [1, 2, 3];
const newLength = arr.push(4, 5);
console.log(arr); // [1, 2, 3, 4, 5]
console.log(newLength); // 5
```

### `unshift`

配列の先頭に一つまたは複数の要素を追加し、追加後の配列の要素数を返します。

```javascript
const arr = [1, 2, 3];
const newLength = arr.unshift(0);
console.log(arr);
```
Azure Filesはコマンドプロンプトからでもマウントできる


Azure PortalからAzure Filesを作成後、OS上からマウントさせるためのスクリプトを表示させることができます。

![SnapCrab_No-0000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/3f522fb3-83f0-6ae5-d6ec-28ecd3bec085.png)


このスクリプトをOS上でPowerShellを起動して実行すると、
ネットワーク共有ドライブと同じようにAzure Filesを利用することができます。

Azure FilesへWEB上からファイルをアップロードして、そのファイルをOS上で使ったりすることもできるなど、用途はたくさんあるのでとっても便利です(*'▽')

Azure PortalではPowerShellを利用してマウントする場合のスクリプトのみ表示できますが、
コマンドプロンプトからでもマウント/アンマウントが可能です。

```bash
rem 資格情報の追加（毎回やる必要はない気もする）
cmdkey /add:"<ストレージアカウント名>.file.core.windows.net" /user:"localhost\<ストレージアカウント名>" /pass:"<ストレージアカウントのアクセスキー>"

rem マウント
net use w: \\<ストレージアカウント名>.file.core.windows.net\<Azure Files名>

rem アンマウント
net use w: /delete /y
```
<br>ちなみにストレージアカウントのアクセスキーは、ストレージアカウントの画面から確認可能です。
![SnapCrab_No-0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609611/57fd7ff7-385f-f15c-5915-aeaae3972033.png)


何かが起きてPowerShellが使えない場合や、バッチファイルを使ってAzure Files上のファイルを呼び出したい場合も上記で何とかなります(｀･ω･´)

***
以上です。

あれ。なんか短いけど、、自分用の備忘録なのでまあいいや、、、
PDO(PHP Data Objects)とは？

# PDOとは
PDO(PHP Data Objects)とはデータベースにアクセスするための拡張モジュール、クラスのことです。
PDOを使うことによって、異なる種類のデータベースに対して一貫した方法でアクセスすることが可能になります。
例：MySQL,PostgreSQL,SQLite

# PDOはSQLインジェクションの対策になる
PDOの特徴として**SQLインジェクションを防ぐ**ことができます。
なぜPDOを使うことでSQLインジェクションの対策になるのかよくわからなかったので調べてみました。

PDOを使ったコード例
```
$pdo = db_connect();
  try{
    $sql = 'select * from users where name = :name AND password = :passowrd';
    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(':name', $name);
    $stmt->bindParam(':password', $password);
    $stmt->execute();

  }catch(PDOException $e){
    echo 'エラー：', $e->getMessage();
    die();
  }
```
## スケープホルダーを使用しているため
PDOではSQLを実行する際にプレースホルダーを使用しています。
これによって外部からの入力を直接SQLに埋め込むことなくクエリを実行することができます。
```
    $sql = 'select * from users where name = :name AND password = :passowrd';
    $stmt = $pdo->prepare($sql);
```
プレースホルダーとは`:name` `:password`の部分で一時的に仮に入れておく値のことを指します。

## エスケープ処理をしてくれるため
SQLインジェクションの対策といえばエスケープ処理ですが、bindParam()がやってくれてるんですね。

```
$stmt->bindParam(':name', $name);
$stmt->bindParam(':password', $password);
```

# まとめ
便利！！
強化学習・転移学習・知識選択の計算式

# 強化学習
強化学習において、Q学習（Q-learning）はよく使われる手法の一つです。Q学習の更新式は以下の通りです。
```math
Q(s, a) \leftarrow (1 - \alpha) \cdot Q(s, a) + \alpha \cdot \left( r + \gamma \cdot \max_{a'} Q(s', a') \right) \
```

ここで、各記号は以下の意味を持ちます。

```math
- ( Q(s, a) ): 状態 (s) で行動 (a) を取ったときの行動価値（Q値）
```
```math
- ( alpha ): 学習率（0から1の間の値）
```
```math
- ( r ): 状態 (s) で行動 (a) を取った直後に得られる報酬
```
```math
- ( gamma ): 割引率（0から1の間の値）
```
```math
- ( s' ): 行動 (a) を取った後の次の状態
```

```math
この更新式は、現在のQ値を過去の値と新しい情報を組み合わせて更新しています。学習率 \( \alpha \) は新しい情報の重みを調整し、割引率 \( \gamma \) は将来の報酬に対する影響を調整します。 \( \max_{a'} Q(s', a') \) は次の状態 \( s' \) での最大のQ値を取得しています。
```
RikkaLayer -RNN型SSMベースでTransformerを超えた?（超えてませんでした。）パフォーマンスを発揮する新手法-

# はじめに
失敗作です。ごめんなさい。
3/6追記 大規模化しても性能があまり向上しなかったので、超えれてませんでした。
2017年に”Attention is all you need.”という論文にて提唱されたTransformerというモデルがある。Transformerは、同一文章内の単語間の関係を上手く捉えることが可能となり、以前のRNNベースのAIとは一線を画す革新的な性能を実現した。
ただ、Transformerには問題がある。RNNの計算量は単語数に比例して計算量が増えていくのに対し、Transformerは、単語数2乗に比例して計算量が増えるという問題があり、昨今大規模化がますます加速していく中で学習に使われる電力消費量故の環境負担が大きいという課題がある。本文では、その環境負担が大きいという問題を解決すべく、Transformerと同等の性能を発揮しながら、計算量が少なく済む構造を模索した結果を述べていく。

## １：Transformerの性能の理由
なぜ、TransformerはRNNベースのモデルと比べ、革新的な性能を発揮するのかについて考察をした。RNNは、入力内容に応じて潜在変数を変化させ、次の入力時に入力を引き継ぐという構造であり、視点を変えれば、入力回数=DNNの階層数とも取れる。
この構造では、入力回数が増えるごとに層が深くなってゆくので、入力回数が増えるに連れ、勾配消失が起きてゆくという問題が出てくるのは必然であり、明白である。
しかし、Transformerは、層を跨がずに全ての入力を1層で処理するので、勾配消失が起こりにくいのがわかる。層数が入力回数によって変化せず、勾配消失を起こさない層数で固定できるので、Transformerは高い性能が発揮できる。Transformerが高性能なのは、単に勾配を効率よく伝え、学習できるからであると考える。

## 2：RNNベースの利点と問題点の解消
Transformerは、Attention部分で入力と入力の対応表のようなものを作り、フィルターを生成するという構造をしてあり、表を作るということは、128個の1次元入力を入れた場合、縦128個、横128個の2次元表になるということで、計算量が入力数の2乗増えるのは明らかである。しかし、RNNでは、1次元のまま処理するので、計算量は入力数との単純な比例の関係になるので計算量が少なくなる。しかし今のRNNでは、先にあげたように勾配消失により学習できないという問題が付き纏ってしまう。そこで私は残差結合を、RNNレイヤー内の引き継ぎ変数に、残差結合を適用するというアイデアを提唱する。

## ３：提案手法
私が提案する手法は、ResNetで使用された残差結合を、従来の深さ方向に加え、時間軸方向にも使用するという手法である。ベースとなるモデルには、状態空間モデルの定数A,B,C,D,Kの代わりに全結合層を2層重ねたものを使用した手法を用いる。この構造を以後NNSSMと呼ぶ。
NNSSMの変数$y$と、$x$に残差結合を適用する。
計算式にすると、以下の通りとなる。これがRikkaLayerである。

$I_{t} = 入力$
$y_{t} = 出力$
$x_{t} =状態変数$

$LinearBlock = Linear(GELU(Linear(x)))$
$N() = Normalize()$
$A(),B(),C(),D(),K() = LinearBlock()$

$x_{t-0} = A(N(x_{t-1})) + B(N(I_{t-0})) + x_{t-1}$
$y_{t-0} = C(N(x_{t-1})) + D(N(I_{t-0})) + I_{t-1} + x_{t-1}$

構造図
![RikkaLayer -TDRNNFSSM- (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619971/2293b70e-15e3-e885-4144-17fc00ec8b67.png)

2024 3/3　構造を最適化しました。
## 3:性能
検証が不十分なのは否めませんが、Transformerと比較した
おおよその性能は以下の通り。
Transformer = 12層の隠れ層128次元
RikkaLayer = 隠れ層128次元のRikkaLayer12層
メモリ消費量(32単語時) = $\frac{1}{2}$倍
計算速度 = 2倍
最終性能　＝　1倍

## 4:実際のデータ
学習データ量が非常に少ないので、完全な状態ではない。
事前学習2000文
ファインチューニング2000文
Human: **ちゃんが好きな食べ物は？
AI : 中華が一番だよ！
Human:　嫌いな人は？
AI : 自分？。えのきだよ。
Human : 大っ嫌いだ！！
AI : 好き？。お酒は？。

## 終わりに
Transformerの強みを、入力が長くなっても勾配消失が起きないことと仮定し、RNNに勾配消失対策として、残差結合を使用した所、すぐれた性能、特性を見せたところから、Transformerの性能の由来はMetaFormerなどで提唱された構造が由来という訳ではなく、は勾配消失が起きにくいことが性能の由来ではないかと見られる。

# 参考文献
ResNet : arXiv:1512.03385
Transformer : arXiv:1706.03762
SSM : https://ja.wikipedia.org/wiki/%E7%8A%B6%E6%85%8B%E7%A9%BA%E9%96%93_(%E5%88%B6%E5%BE%A1%E7%90%86%E8%AB%96)
MetaFormer : arXiv:2111.11418
###### お願い
本記事で私の提唱する新手法を、もし商用利用する場合は、私に連絡をいただきたいです。
実績として扱わせていただきたいのでご協力お願いします。あと単純に嬉しいので。
## サンプルコード

https://github.com/NinTow/RikkaLayer-Sample
Amazon Chime SDKのデモを使ってみた。

環境
Windows11
wsl2

https://github.com/aws/amazon-chime-sdk-js
上記からプログラムコード取得

公式ドキュメントから

cd demos/serverless　

以下2行は公式ドキュメントに記載されてない
template.yamlの46行目あたりで
Runtime: nodejs14.x　=>　Runtime: nodejs20.xに変更


npm install
npm run deploy -- -r us-east-1 -b <deploy-bucekt> -i af-south-1,eu-south-1 -s <my-stack-name> -a meeting

これで、行けた！
だめなら全て削除して git colenするとなぜか行ける。
PowerShellで日本語の文字化けを直したい。

## やりたい事

パワーシェルでこのように日本語が文字化けするのを直したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686263/4402604c-32ed-16e5-afb8-89ebaba831da.png)

## 現在の文字コードを確認
chcp（CHangeCodePage ）で現在の文字コードを確認
```powershell:powershell
 chcp
```
Active code page: 65001

主な文字コード
**65001：utf-8**
**932：shift_jis**

詳しくは[こちら](https://www.ipentec.com/document/windows-codepage-list)

## 文字コードを変更
今回は **65001：utf-8** にします。
```powershell:powershell
 chcp 65001
```

## パワーシェルを一回閉じて再起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686263/184ef62e-8fbf-cf66-53f0-9ac161620823.png)

これでパワーシェルの日本語が文字化けしなくなります。
SQLでアスタリスクを使用しない理由

現在の現場で教えてもらったことについてまとめます。
今回は、一般的にSQLでアスタリスク(*)を使用しない方が良い理由について知らなかったので調べてみました。

## 1. パフォーマンスの問題
アスタリスクを使用すると、テーブルのすべての列をSELECTするため、必要のないデータも読み込むことになります。これは、特に大きなテーブルの場合、パフォーマンスの問題を引き起こす可能性があります。

```
例:
SQL
SELECT * FROM employees;
``` 

このクエリは、employeesテーブルのすべての列をすべて読み込みますが、実際にはname、email、salary列のみが必要だとすると、以下のクエリの方がパフォーマンスが向上します。

```
SQL
SELECT name, email, salary FROM employees;
```

このクエリは、必要な列のみを読み込むため、処理速度が速くなります。

## 2. コードの読みやすさの問題
アスタリスクを使用すると、どの列が選択されているのか分かりにくくなります。これは、コードの読みやすさを低下させ、メンテナンスしにくくなります。

```
例:

SQL
SELECT * FROM orders WHERE order_date > '2023-01-01';
```

このクエリは、ordersテーブルのすべての列を、order_date列が2023-01-01より大きいものすべて選択します。しかし、どの列が選択されているのか分かりにくいです。

以下のクエリの方が、コードの読みやすさが向上します。

```
SQL
SELECT order_id, customer_id, order_date, total_price
FROM orders
WHERE order_date > '2023-01-01';
```

このクエリは、選択する列を明示的に指定しているので、コードの意図が明確になります。

## 3. セキュリティの問題
アスタリスクを使用すると、意図せずに機密情報を含む列を選択してしまう可能性があります。

```
例:

SQL
SELECT * FROM users;
```

このクエリは、usersテーブルのすべての列を選択します。しかし、中にはパスワードのような機密情報を含む列があるかもしれません。

以下のクエリの方が安全です。

```
SQL
SELECT user_id, name, email
FROM users;
```

このクエリは、必要な列のみを選択しているので、機密情報が漏洩するリスクを減らすことができます。

## まとめ
SQLでアスタリスクを使用することは、パフォーマンスの問題、コードの読みやすさの問題、セキュリティの問題を引き起こす可能性があります。必要な列を明示的に指定することで、これらの問題を回避することができます。