OmniAICreator/Qiita-1.07M huggingface dataset:
Excelアドインで無効にしたアドインファイルが復活してしまう不具合

無効にできないアドインによる不具合
--
Excel-DNAで作ったアドインを無効にして、xllファイルを削除後に再びExcelを起動すると、なぜか有効に戻ってしまい、その後に開くブックが全て読み取り専用になってしまうという現象に見舞われた。あー最悪:scream:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294209/010111b3-ea60-a737-35cb-790c97d5a4af.png)

普通なら以下で解決するのだろうが、今回は素直にいかなかったので、やったことを書き残しておく。

https://qiita.com/Mount/items/4fe085731e99e3fcb2c7

レジストリのエントリ削除で解決
--
先ずは、レジストリエディタを開く。

`Windows`+`R` を押して「ファイル名を指定して実行」を開き、`regedit`と入力して、`OK`をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294209/a3884684-50d8-0d2d-c682-c1227cdb0bf3.png)

`はい`をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294209/9a50723e-0dc2-e82b-dd3b-630d8b92ec8f.png)


左側のペインの**コンピューター**をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294209/29816e6a-7622-5299-ef2f-b6c389931fe6.png)

 [編集] -> [検索]をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294209/3ceccabe-60ec-3bc8-676a-9d5b17066b14.png)

アドインファイル名で検索する。（ここではRibbon-AddInがファイル名の一部分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294209/03495072-1375-dbe6-6b92-81566967a289.png)


結構待たされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294209/05468060-00fe-7d5a-8f51-bb3306dddaa5.png)

以下、OptionsというキーにあるOPEN1とOPEN2というエントリの中にファイル名を発見。
![registry1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294209/bbee104a-c220-2aa0-8a6c-0d06739af1f4.png)


これらを削除する。
![registry2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294209/7ab14463-a711-717a-a222-2a44ee233945.png)


削除後のOPENで始まるエントリは順番が必要らしい。（未検証）

https://docs.oracle.com/cd/F86965_01/intsv/hstbar_error_after_uninstall_100x520150e8.html


これで読み取り専用の問題は解決するが、Excelアドインのリストにアドイン名が残り続ける事がある。その場合は参照していたアドインファイルを削除すると以降はリストから消える。

**環境など**
+ Windows10（x64）
+ Microsoft365の64ビット版Excel
+ Excel-DNAで作成したxllファイル

今回の現象がExcel-DNA固有のものなのかは不明。~~それにしても変なキーができ上がったものだ:thinking:~~

「HKEY_USERS」直下にある「S-」で始まるキー
--
今回削除したキーの上位階層である「HKEY_USERS」直下にある「S-」で始まるキーは、いったい何でしょう？

![registry3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294209/dbe10126-5f1e-1ea4-acb6-fb867595e7aa.png)


ChatGPT大先生によると、これはユーザーのセキュリティ識別子（SID）を表し、Windowsが各ユーザーアカウントを識別するために使用する一意のもので、`S-1-5-21-...` のような形式となり、そのキーの中には、ユーザーに関連する設定（デスクトップの構成やアプリケーション設定など）が格納されているとのことです。

以上、レジストリの書き換えは自己責任で:bow_tone1:
チーム開発の挑戦と成長：TEAM WEEKLY REPORTの開発

## **はじめに**

プログラミングを学び始めたばかりの私が、初めてのチーム開発プロジェクトに参加した経験をシェアしたいと思います。このプロジェクトは、チームでの作業をスムーズに進めるためのタスク管理アプリ、「TEAM WEEKLY REPORT」の開発でした。開発に直接大きく貢献できたわけではありませんが、チームメンバーのサポートとプロジェクトを通じて学んだことを残します。

## **プロジェクトの背景**

多くのチーム開発では、進捗の可視化やメンバー間のコミュニケーションが大きな課題となります。「他のメンバーの細かい進捗がわからない」「プロジェクトの全体像が把握しにくい」「助けが必要でも、なかなか言い出せない」などの悩みを解決するために、TEAM WEEKLY REPORTは生まれました。このアプリは、チームメンバーのタスクを週単位で可視化し、プロジェクトの進行度を一目で確認できるようにするものです。

## **使用技術と選定理由**

本プロジェクトの開発に当たり、私たちはHTML、CSS、JavaScript、PHPを主要な技術として選択しました。この決定には、プロジェクトの基本要件とチーム内の学習状況が大きく影響しています。

### **プロジェクトの要件**

プロジェクトの目的は、フレームワークを使用せずに、生の言語だけで開発することにありました。フレームワークを使わないことで、HTML、CSS、JavaScript、PHPなどの基本技術に対する理解を深めることが今回のプロジェクトの狙いでした。

### **技術選定の理由**

- **HTML/CSS**: ウェブページの構造とスタイルを定義する基本的な技術です。これらはウェブ開発の入門に最適で、私たちのように学び始めたばかりのメンバーにとっても使いやすいものでした。
- **JavaScript**: クライアントサイドのプログラミング言語で、ウェブページに動的な要素を加えることができます。この言語を使うことで、ユーザーインタラクションの実現が可能になります。
- **PHP**: サーバーサイドのプログラミング言語で、データベースとのやり取りやサーバー上でのデータ処理に適しています。シンプルながら強力なこの言語は、私たちが求める機能を実装するのに役立ちました。

### **ローカル環境での開発とDockerの導入**

プロジェクト要件の一つに、アプリケーションがローカル（手元のPC上）で動作することが挙げられていました。これは、開発環境をシンプルにし、チームメンバー全員が開発プロセスに容易に参加できるようにするためです。実際の開発では、メンバー各自の環境の違いを考慮して、Dockerを用いた環境構築を行いました。

Dockerの導入は、異なる開発環境間での互換性問題を解消し、誰もが同じ条件下で開発作業を進められるようにするための選択でした。これにより、OSや依存関係による問題を避けることができ、プロジェクトの立ち上げ速度も向上しました。

しかしながら、全メンバーがスムーズにDocker環境を設定できたわけではありませんでした。一部のメンバーは設定に苦戦し、最後まで原因を特定することができないケースもありました。このような状況に対応するため、チーム内で様々な工夫を凝らしました。例えば、より詳細な設定ガイドの共有、個別サポートを強化するなどの対策を講じました。

この経験から、技術的な障壁を乗り越えることの難しさと、それを克服するためのチームワークの重要性を改めて実感しました。Dockerを用いることで基本的には開発環境を統一し、効率的な協業を促進することができましたが、全てのメンバーが同じスタートラインに立てるよう、更なる支援と理解が必要だと感じました。

## **チーム構成と役割分担**

私を含むチームメンバーは、各々が特定のタスクを担当しました。私の主な役割は、プロジェクトのドキュメント作成と、学んだばかりの技術を用いた簡単なフロントエンドの作業でした。時間を十分に確保できなかった私の分を、チームメンバーがサポートしてくれたことは非常にありがたかったです。

## **開発で直面した課題とその解決策**

### **タスク管理の可視化**

メンバーの進捗が一目でわかるUIを作ることは挑戦でした。Figmaでワイアーフレームを作成し、ブレインストーミングを通じて機能要件を精査しました。JavaScriptを用いて、タスクの追加や評価がリアルタイムで反映されるように工夫しました。

### **プロジェクト進行度の表示**

全体の進捗を表すプログレスバーの実装には、PHPとJavaScriptを駆使しました。各タスクの完了度に応じて、プログレスバーが更新される仕組みを作りました。

## **プロジェクトを通じて得た学び**

技術的なスキルだけでなく、チームで協力して何かを作り上げる経験は、私にとって大きな学びとなりました。特に、自分の弱点を補ってくれる仲間の存在の大切さを実感しました。

## **今後の展望と改善点**

今回の経験を活かして、より多くの技術を学び、次のプロジェクトではもっと大きな貢献ができるようになりたいです。また、UI/UXの改善や追加機能の開発も計画しています。

## **さいごに**

この記事が、これからチーム開発に挑戦する方々の参考になれば幸いです。学び始めたばかりでも、チームの一員として貢献できることはたくさんあります。時間が限られている方でも、小さな一歩から始めてみてください。
Kubernetes The Hard Wayをやってみた

# はじめに

Kubernetes The Hard Wayをやってみました。
詳しい手順はさておき、やってみてどうだったかをまとめておきます。

# 手順

[本家](https://github.com/kelseyhightower/kubernetes-the-hard-way)の手順は英語なので、[日本語訳](https://springmt.github.io/kubernetes-the-hard-way-ja/kubernetes_the_hard_way/#0)の方を参考にしました。
ただこちらは作業した時点での最新版はKubernetes 1.31なのに対し、日本語訳版はKubernetes 1.12.0のKubernetesクラスタを作成する手順になっていました。
そのため、最新の環境で実行するためには読み替えが必要でした。

# 作成したクラスタの仕様

プラットフォームはGCPを仕様しました。
最終的に作成したクラスタは以下です。

|コンポーネント|バージョン|備考|
|------------|--------|---|
| Kubernetes | 1.31.0 | 現時点でのlatest |
| containerd | 1.7.12 |Ubuntu 24.04|
| CNI Container Networking | 1.0.0 | 現時点でのlatest |
| etcd | 3.5.15 | 現時点でのlatest |

# つまづいた点

* 無料枠にもかかわらず、日本のリージョンでインスタンスを立ち上げようとしてしまった
  * GCPを使うのは今回が初めてで、無料枠で実施しました
  * 無料枠でGCEのインスタンスが立ち上げられるリージョンに制限があることを知らず、そこでつまづいてしまいました
* Worker Nodeを構築している最中にコンソールが使えなくなった
  * コンポーネントを最新にしつつ、手順通りに実施すると、ワーカーノードでインストールした後にssh接続ができなくなる事象に遭遇しました
  * シリアルコンソール接続も試しましたが、ログインプロンプトが出るもののログインができませんでした
  * そのため、インスタンスの削除/作成を何度か繰り返しました
  * いろいろと切り分けた結果、containerdのlatestのバイナリではなく、Ubuntu 24.04でインストールできるcontainerdを使うとこの事象が発生しないことがわかりました
* 挙動が期待通りではないときはsystemdのサービスのログを見る
　* 設定の読み替えが必要なときには、まずsystemctl status サービス名でサービスの状態を確認し、activeでない場合はjournalctlを使ってログをみるようにしました
　* オプションが廃止されたり、逆に足りなかったりする原因はだいたいログを見れば判断できました

# 所感

今回の目的はKubernetesのコンポーネントについて詳しくなることでしたが、個々のコンポーネントを設定していくことによって、どんなコンポーネントで構成されているかを掴むことができました。
意味にフォーカスしたモデリング

## この記事におけるモデリング
今の私にとってなじみ深いモデリングは、だいたい以下の3種類になります。
- データベースモデリング
    - ER図とか
- プログラミングレベルのモデリング
    - オブジェクト指向とか
- データ分析におけるモデリング
    - データ側のモデリング+手法としてのモデリング

モデリングは、各分野で重要な役割を果たしますが、共通して「意味をしっかり捉える」ことが成功の鍵だと思います。
モデリングは現実世界の問題や対象を理解し、それをシステムや分析に反映させる作業であり、正確に意味を把握しないと、効果的な解決策を導き出すことができません。
一方で、私は短い職歴の中でありがたいことに2回もパッケージの開発に携わっており、「現実の反映」と「拡張性を意識した共通化・抽象化」の中で悩みつづけました。

## TM(T字型ER)
佐藤正美氏が考案したデータベースモデリングである「TM（Theory of Models）」。
私が出会ったのは社会人2年目の2016年のことで、2024年の今でもこの技術は自分にとっての主力の立ち位置にあります。
この手法はただのデータベース設計にとどまらず、事業解析手法の側面も持っており、もっと広まってほしいと思っています。この手法により、L-真だけでなくF-真も含めてエンジニア同士で共通理解を持つことが可能だと思います。興味がある方は[この本](https://www.amazon.co.jp/%E4%BA%8B%E6%A5%AD%E5%88%86%E6%9E%90%E3%83%BB%E3%83%87%E3%83%BC%E3%82%BF%E8%A8%AD%E8%A8%88%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E4%BD%9C%E6%88%90%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80-%E4%BD%90%E8%97%A4-%E6%AD%A3%E7%BE%8E/dp/4297129469/)などを買ってみてください。
扱い方も簡単で、いわゆる正規化も簡単にできます。
~~おかげさまで、第n正規形がそれぞれなんなのか、いつまでたっても覚えられない体になりました。とある抜き打ちの口頭の技術試験で第1正規形から第3正規形まで訊かれたけど、結果は通ってたからたぶん問題ないやろ。~~
ちなみに今の職場の人は私がTM使ってるの見たことないと思うんですけど、全部脳内で完結してるからですね（属人化は控えるようにしましょう）。

L-真とF-真については[こちらの説明](https://www.sei-info.co.jp/framework/column/data-modeling/)をお借りします。自分の言葉で説明した方がいいとは思っていますが、記事が長くなりすぎるのでサボります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885700/88f4037c-390e-76d8-6f3c-b29897a08a2a.png)

具体的な事例に当てはめると、製造業における部品表である「BOM」に工程を含めて管理したいとき、これだけでさまざまなL-真のモデルが考えられます。「親品目と工程＋工程と子品目」という形で管理すれば柔軟性に焦点が行ったモデリングでしょうし、「品目構成+工程」という形で管理すれば現場に優しいモデリングでしょう。ここまで書いて思ったんですけど、「L-真とF-真」の話とはちょっと違うかもしれないですね。

## 適切なアーキテクチャの模索
この話は次回の記事で別の角度から触れる予定なんですが、ビジネスに合った技術選定を行うべきだと思っています。そのために、エンジニアはビジネス背景を深く理解し、技術の専門家という立ち位置でビジネスに貢献すべきだと考えています。
たとえば、「マイクロサービスが流行っているから」という安易な理由でマイクロサービスを選択してはいけません。動くものはできると思いますが、現実の意味をとらえずに選択すると長期的な技術的負債を抱えることになると思います。
対象のドメインの特性、言語化されていないビジネスサイドの要件、後でつらい思いをしないように開発サイドとして担保したい要素など、総合的に判断して「技術の専門家としてこう考えている」ということを伝えていくべきだと思います。そのためには世の中の技術を常にキャッチアップし、どのような工夫がされているかを知っておく必要があります。
とはいえ、初めて手を動かす段階において、最適なアーキテクチャがわかることはほとんどないと思っています。特にパッケージ開発という文脈においては、実例を確認しながら局所解に陥らないように、継続的にリファクタリングして改善していくという方法を取っていくべきではないかと思っています。

## データ分析モデリング
完全に趣味ではありますが、私はbeatmania IIDXという音楽ゲームのデータ分析をしています。
特に譜面のモデリングが難しく、実態に合わせたモデリングができないと納得感の得られない分析結果になってしまいます。過去、本家からノーツレーダーが出る前に譜面の特徴をレーダー化してみたり、ディープラーニングを使って譜面からCPIの難易度値を推定したりしてみましたが、なかなか苦戦しました。
- たとえば、0.01秒などの単位で表現しようとすると、特徴量が少ない上にデータ量が多くて計算が難しい
- ソフラン・CN・皿など、特殊要素の扱いが難しい
- ランダムなどの要素をどのように扱うかが難しい

手法に目を向けると、たとえばbeatmania IIDXの☆12の難易度推定の方法として、イロレーティングなどを使ってらっしゃる方や、おそらくIRTを使ってらっしゃる方などがいると思います。その手法ごとの結果を比較すると、感覚レベルではありますが違いも何となく分かります。
どれが良いとか悪いとかではなく、そこには分析者のこだわりがあると思われます。

## モデリングで大事だと思っていること
いろんなところに話を飛ばし過ぎてまとまらなくなってきましたが、モデリングで大事なことは現実をしっかりとらえることになると思っています。現実で何がしたくて、モデリングを行うのかを深く理解する必要があります。そのために、「意味レベルでの理解」というのを意識すればいいのではないかと思っています。
そう考えると、前回の記事で取り上げた20年選手は、時間のない中でオンプレ版のコード行数だけ見て見積もりを立てたのではないかと感じます。

これから特に、「DX」という文脈でシステムの周辺に対する解像度を上げていかないと、エンジニアも価値提供ができない時代になってくると感じています。
エンジニア組織だけで机上で設計していくのではなく、実際のビジネスサイドの方とコミュニケーションを取りながら、ビジネスの課題を明確にし、それを解決するためのシステムを構築していくことが今後求められるのではないかと思います。
正規化の手順

## **第1正規形 (1NF)**

- **目的**: データベースの各カラムに原子性を持たせる。
- **手順**: 各カラムに複数の値が含まれている場合、それを分割し、一つのカラムには一つの値のみが入るようにします。
- **例**: 一人の学生が複数の電話番号を持っている場合、電話番号ごとにレコードを分ける。

## **第2正規形 (2NF)**

- **目的**: 部分的関数依存性を排除する。
- **手順**: 全てのカラムが、主キー全体に依存していることを確認します。主キーの一部だけに依存しているカラムがある場合、それらを別のテーブルに移動します。
- **例**: 学生IDと授業IDが複合主キーである場合、授業名は授業IDのみに依存しているので、授業IDと授業名を持つ新たなテーブルを作成します。

## **第3正規形 (3NF)**

- **目的**: 推移的関数依存を排除する。
- **手順**: 非キーカラムが他の非キーカラムに依存している場合、その依存関係を排除します。これは、依存しているカラムを別のテーブルに移動させることで実現できます。
- **例**: 「学生」テーブルに学生ID、学生名、学部名、学部所在地がある場合、学部名と学部所在地は学生IDではなく学部名に依存しているので、これらを「学部」テーブルとして分離します。

## **ボイスコッド正規形 (BCNF)**

- **目的**: 第3正規形で解決されない関数依存を排除する。
- **手順**: すべての決定因子が候補キーであることを確認します。これには、主キー以外でレコードを一意に識別できるカラムの関数依存関係を見直し、必要に応じてテーブルを再構成します。
PHPのオブジェクト指向プログラミング: トランプゲームを作成する過程で学んだこと

## **はじめに**

この記事では、PHPのオブジェクト指向の概念を理解するために、トランプゲームのクラスとインスタンス、メソッドとプロパティをどのように実装し、それらの技術要素がどのように連携してゲームを構築するのかについて共有します。

## **オブジェクト指向の基礎**

### **クラスとインスタンスの例: デッキとトランプカード**

```php
class Card {
    public $suit;
    public $value;
    function __construct($suit, $value) {
        $this->suit = $suit;
        $this->value = $value;
    }
}

class Deck {
    public $cards = [];
    function __construct() {
        $suits = ['Hearts', 'Diamonds', 'Clubs', 'Spades'];
        $values = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'];
        foreach ($suits as $suit) {
            foreach ($values as $value) {
                $this->cards[] = new Card($suit, $value);
            }
        }
    }
}
```

### **メソッドとプロパティの例: プレーヤーとカードを引く動作**

```php
class Player {
    public $name;
    public $hand = [];
    function __construct($name) {
        $this->name = $name;
    }
    public function drawCard($deck) {
        $this->hand[] = array_shift($deck->cards);
    }
}
```

## **実践: 技術要素の関連性**

### **インスタンス化されたオブジェクトの連携**

- **`Deck`** クラスのインスタンス化により、52枚のカードを持つデッキが作成されます。
- プレーヤーが **`drawCard`** メソッドを使用してデッキからカードを引く動作は、クラスとインスタンス、メソッドとプロパティの連携を示す良い例です。

### **小さなプロジェクトでの統合**

- プレーヤーがカードを引くプロセスは、オブジェクト指向プログラミングの基本的な概念（カプセル化、継承、ポリモーフィズム）を実際のプロジェクトでどのように適用できるかを示します。

## **まとめ**

トランプゲームの実装を通じて、PHPのオブジェクト指向プログラミングの基本から応用までの流れを探求しました。技術の各要素の理解だけでなく、それらがどのように相互作用して機能するかを理解することが、実用的なアプリケーションを構築する上のポイントだと思います。

---
電卓を作りながら勉強ー2

お疲れ様です。

昨日は寝かしつけが終わったら勉強しようと計画していましたが、そのまま寝てしまいましたので、今日続きをしています:sweat_smile:

早速ですが進捗です。
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="JjQqzWP" data-pen-title="Untitled" data-user="mtzkmy" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/mtzkmy/pen/JjQqzWP">
  Untitled</a> by mtzkmy (<a href="https://codepen.io/mtzkmy">@mtzkmy</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

電卓のモデルは私物の電卓を利用しましたので、見本とは異なります。
現在、数字を押すと画面に表示されるところまできましたが、イコールを押すと計算結果が出ず、エラーが続出しているところです…
他の勉強もありますので、一旦終了し、エラーの解消はまた明日に:raised_hand:
ここまで来たので、あとは計算結果が出てくれたら…！
ちなみに所要時間は2時間ほどかかっています。
<br>
**今回勉強になったこと**
:point_up:**pointer-events: none;**
　↳cssの疑似クラス（:hover や :active）を無効にする。
 　今回 :hover を反映させたいのは、画面以外のボタンのみのため、個別に無効化。
　 こんな便利なプロパティがあったとは！
   参考：[MDN](https://developer.mozilla.org/ja/docs/Web/CSS/pointer-events)
<br>
:point_up:**eval（イーバル、エバル） について**
　↳見本のJavaScripのコードで「eval」とあり、知らなかったため検索したところ、
 　現在ではセキュリティやパフォーマンスの観点から推奨されないとのことでしたので、
  new Function を代替案として紹介されているページがあったので、使い方を調べ、
  実装させてみました。
【初心者向け】Python　仮想環境起動まで（Windows）

## はじめに
こんにちは！初心者プログラマーのジンです！
今日はいつも、Pythonプロジェクトを進める上で、
仮想環境を立ち上げるコマンドを忘れてしまうので、
ここにまとめようと思い記事にしました！
(Windowsです)


## コマンド
Windowsの
コマンドプロンプト
もしくは
PowerShellを開く。

プロジェクトフォルダに入る。
（自分はいつもcd+半角スペース ドラッグ＆ドロップで移動してます）
```
cd Python-app(任意のフォルダ名)
```

コマンドプロンプトでは
```
C:\○○\△△\Python-app(任意のフォルダ名)>
```
となってればよい。
そこで下のコマンド

```
python -m venv 仮想環境名
```

これで仮想環境はできています。
例えば
```
python -m venv venv
```
と入力すると
venvという仮想環境名で
仮想環境が立ち上がります。

後は
```
venv(任意の仮想環境名)\Scripts\activate
```
を入力すると
```
(venv) C:\○○\△△\Python-app(任意のフォルダ名)>
```
となってると仮想環境が
有効化されます。

最後に、
```
(venv) C:\○○\△△\Python-app(任意のフォルダ名)>Python app.py(任意のファイル名）
```
を開くとその後出力されるポート 
```
* Running on http://○○○○:5000(この場合localhost:5000)
```
にて仮想環境に入れます。

終わる時は
```
deactivate
```
として仮想環境を終了。
↑
正味、そのままコマンドプロンプトやターミナルを閉じると基本的に終了しているので私はあまりこれはやらないです。

## 最後に
既に5回は調べたので同じように何回も調べている方いらっしゃるのではないでしょうか。
また、
仮想環境内でライブラリをインストール

→翌日フォルダを開き　ライブラリのコマンド入力

→**ライブラリがインストールされていません**。となる。

→！！？（昨日インストールしたはず？？）

→模索・・・（コマンドの最初に（venv）ついてないな？）

→あ、**仮想環境内でインストールしたから入ってない今はインストールされていないのか**

→無事仮想環境内でライブラリ使用可能

ともなったので、逆に失敗に気づけたので
結果オーライでした。

明日からも忘れず頑張ります！
M5Stamp S3でコンデンサーマイク入力、Grove - Sound Sensorで遊ぶ


x 過去ログを見ょ!!


参考



![o_coq411.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c53293e0-b59e-11ac-16b7-b1188671f847.jpeg)



https://wiki.seeedstudio.com/Grove-Sound_Sensor/

Grove Starter Kit for BeagleBone Green


https://wiki.seeedstudio.com/Grove_Starter_Kit_for_BeagleBone_Green/


販売コード 109796


https://akizukidenshi.com/catalog/g/g109796/





結果


![o_coq414.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/36aa1850-c8d8-7786-f70f-64a8c9ba883c.jpeg)

![o_coq415.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/acea9747-1e72-25e1-4869-e24d41ce5c88.jpeg)


![o_coq416.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0bd28fd8-bda7-96c0-064a-ff870c545655.jpeg)



プログラム
pinAdcを変更した


```c++


// test code for Grove - Sound Sensor
// loovee @ 2016-8-30

const int pinAdc = 15;

void setup()
{
    Serial.begin(115200);
    //Serial.println("Grove - Sound Sensor Test...");
}

void loop()
{
    long sum = 0;
    for(int i=0; i<32; i++)
    {
        sum += analogRead(pinAdc);
    }

    sum >>= 5;

    Serial.println(sum);
    delay(10);
}



```
3Dプリンターでイカサマしたい！！

かつて在籍していたサークルのアドベントカレンダーで書いた記事です。
ネットの海に沈んじゃうのが悲しいので、ここにおいておきます。

https://www.jackapp.jp/blog/5a063eb4-50eb-43e1-b072-be0550c20f16
DockerにUbuntu環境を構築

Dockerについてですが
正直、名前は知ってましたけど
初めて使うんでよくわかってないです😇

まず、手始めにDockerにUbuntu環境を構築してみることにします

参考にした方↓

https://qiita.com/yasuoka_dev/items/073f7e8c7dba75993323

docker hubのubuntuイメージを確認

https://hub.docker.com/_/ubuntu/

最新安定版の24.04版を使うことにします
```
% docker pull ubuntu:24.04

24.04: Pulling from library/ubuntu
31e907dcc94a: Pull complete 
Digest: sha256:8a37d68f4f73ebf3d4efafbcf66379bf3728902a8038616808f04e34a9ab63ee
Status: Downloaded newer image for ubuntu:24.04
docker.io/library/ubuntu:24.04
```

インストールしたimagesの確認
```
% docker images

REPOSITORY                 TAG       IMAGE ID       CREATED         SIZE
ubuntu                     24.04     edbfe74c41f8   6 weeks ago     78.1MB
docker/welcome-to-docker   latest    c1f619b6477e   10 months ago   18.6MB
```

docker desktopでも確認
![スクリーンショット 2024-09-13 16.21.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2790258/b287a85b-3ef2-0209-2b08-43b309969ac4.png)

■ubuntuが入ったら
まずはubuntuの起動をする

```
docker run -it -d --name ubuntu ubuntu:24.04

fb29493b8e55f8565d7fa409b06d63c9b43539559f31c001a2010cfaff4adfbe
```

何かidっぽい文字列が出てきましたね
これがコンテナのIDですかね？

正しく起動されてるか確認する
```
docker ps

CONTAINER ID   IMAGE          COMMAND       CREATED              STATUS              PORTS     NAMES
fb29493b8e55   ubuntu:24.04   "/bin/bash"   About a minute ago   Up About a minute             ubuntu
```

docker desktopも確認
![スクリーンショット 2024-09-13 16.54.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2790258/bf670874-bc85-35f3-6d22-166e2a4bd6b4.png)

statusがRunningになってますね

じゃあコンテナ内に入りましょう
```
docker exec -it ubuntu /bin/bash

root@fb29493b8e55:/# 
```

root権限で入れましたね

抜けたい時は
```
exit
```

コンテナの停止は
docker stop コンテナ名なので

```
docker stop ubuntu
```

![スクリーンショット 2024-09-13 17.01.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2790258/436949c3-65ae-e4fa-06c5-42625377a2e7.png)

statusがExitedになってますね

コンテナに再度入りたい場合は
コンテナを起動してログイン

```
docker start ubuntu
docker exec -it ubuntu /bin/bash
```

とりあえず今日はここまで😊

その他のDockerImageを試したいよ〜って人は
下記を参照

https://hub.docker.com/search?image_filter=official

先人の知恵って凄い😹
[Joke]ディレクトリをグゥーっと深く掘って自分自身を移動するプログラム 'digger'

ジョークプログラムです。
「ディレクトリを掘って、自分自身をそこに移し、自分自身を呼び出す」ことを延々と繰り返すプログラムです。

bashで書かれています。unixシステムだったら動くと思います。昔、MS-DOSで作ったジョークプログラムのリライトですが、linuxシステムではmvで移動しても、プロセスが生きていればファイルは削除されなくて、止めた時に初めて削除されます。

copilotに聞いてみたら、
「Linuxのディレクトリの階層の深さには、特に制限はありません。理論上は無限にディレクトリをネストすることができますが、実際にはファイルシステムやカーネルの制限、そしてパフォーマンスの問題が影響します。」
と、恐ろしいことを言っています。

システムを破壊する可能性がある危険なプログラムです。実行はご自分の責任においてやってください。

Ctrl-Cで止めてください。多分、限界が来たらエラーが出て止まると思いますが、僕は怖くて限界までできませんでした。

このプログラムを使用した結果、いかなる損害を受けたとしても、筆者は全くその責を負わないものとします。

`chmod +x digger`として実行権を付け、`./digger`で動かしてください。

```bash:digger
#!/usr/bin/bash
    mkdir dir
    mv digger dir
    cd dir
    ./digger
```
【Ruby】演算子優先順一覧

| 順位 | カテゴリ                     | 演算子                     |
|------|------------------------------|----------------------------|
| 1    | スコープ                     | x::y                        |
| 2    | 配列                         | [x, y, z]                 |
| 3    | 正、否定                     | +x、!x、~x                  |
| 4    | べき乗                       | x ** y                       |
| 5    | 負                           | -x                         |
| 6    | 乘算、除算、剩余             | x * y、x / y、x % y             |
| 7    | 加算、減算                  | x + y、x - y                   |
| 8    | シフト演算                  | x << y、x >> y                |
| 9    | 論理積                      | x & y                     |
| 10   | 論理和、排他的論理和        | x | y、x ^ y                 |
| 11   | 比較                        | x > y、x >= y、x < y、x <= y       |
| 12   | 等しい、等しくない          | x == y、x === y、 x != y、x =~ y、x !~ y |
| 13   | 論理積                      | x && y                    |
| 14   | 論理和                      | x || y                    |
| 15   | 範囲式                      | x .. y、x ... y                   |
| 16   | 条件                        | x ? y : z                 |
| 17   | 代入、自己代入              | x = y、x += y、x -= y など     |
| 18   | 論理否定                    | not x                     |
| 19   | 論理積、論理和              | x and y、x or y           |

https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html
Oracleファイングレイ監査とAudit Vaultの違いは？

Oracleのファイングレイン監査（FGA）とOracle Audit Vaultは、どちらもデータベースの監査機能を強化するためのツールですが、それぞれの目的やアプローチ、機能において大きく異なります。以下は、その違いについての詳細です。

**1. 目的**
- **Oracleファイングレイン監査（FGA）**
FGAの主な目的は、特定の条件に基づいてデータベース内のアクセスや操作を監視し、詳細な監査を行うことです。特定の列や行へのアクセスがあった場合にのみ監査を行うといった、きめ細かい制御が可能です。これは、特定のデータに対する不正アクセスや不適切な操作を検出するために使われます。

- **Oracle Audit Vault**
Oracle Audit Vaultの目的は、データベース内外の監査データを一元的に収集し、保管、管理、分析することです。Audit Vaultは、複数のデータベースやシステム（Oracle以外のデータベースやOSなど）から監査データを集め、統一された監査レポートとアラート機能を提供します。これにより、セキュリティインシデントの迅速な検出と対応が可能になります。

**2. 機能とアプローチ**
- **FGAのアプローチ**
  - **条件付き監査:** FGAは、特定の行や列に対する操作や、特定の条件が満たされた場合にのみ監査を行います。例えば、給与情報に対するSELECT文を実行した場合や、特定のユーザーが機密データにアクセスした際にのみ、監査が発生します。
  - **行・列レベルの監査:** FGAはテーブルやビューの特定の行や列に対するアクセスを監査できるため、細粒度の監査が可能です。
  - **SQL文のキャプチャ:** 監査ポリシーが発動した際に、FGAは実際に実行されたSQL文やそのコンテキスト（ユーザー名、時間など）を詳細に記録します。

- **Audit Vaultのアプローチ**
  - **監査ログの収集と集中管理:** Audit Vaultは、複数のデータベースやシステム（Oracle、SQL Server、MySQL、ファイルシステムなど）から監査ログを一元的に収集し、保管、分析します。これは、複数の環境にまたがるシステムのセキュリティを一括して監視するためのものです。
  - **分析とレポート生成:** Audit Vaultは、収集した監査データを基に統一された監査レポートを生成し、異常な動作を発見した場合にはリアルタイムでアラートを出すことができます。
  - **セキュリティログの改ざん防止:** Audit Vaultは監査ログを別のセキュリティ領域で保管し、ログの改ざんや削除から保護します。これは、内部関係者の不正操作や攻撃者によるログの隠蔽を防ぐための重要な機能です。

**3. 用途の違い**
-  FGAは、特定のデータに対する細かい監査が必要な場合に使用されます。例えば、ある特定のユーザーが機密データにアクセスした際に、そのアクションを記録したり、不正アクセスを検出したい場合に効果的です。また、特定の行や列に対してアクセスする操作をターゲットにできます。

-  Audit Vaultは、全体的な監査データの管理と保護に使用されます。Audit Vaultは、複数のシステムにわたる広範な監査情報を収集し、中央で管理する必要がある場合に有効です。これは特に、異なるデータベースやシステムを監査対象にしたい場合や、複数システムでのコンプライアンス対応が求められる場面で重要です。

**4. 適用範囲**
-  FGAは、主にOracleデータベース内の特定のテーブルや列に対する監査に適用されます。特定のデータに対するアクセスや操作を細かく監視し、記録するための機能です。

-  Audit Vaultは、Oracleデータベース以外にも対応し、複数のデータベースやシステムの監査データを統合して管理するために使用されます。Audit VaultはOracleデータベースだけでなく、他のデータベースやOSからも監査データを収集できます。

**5. 導入と管理**
-  FGAは、監査対象のテーブルや列に対して監査ポリシーを設定することで導入されます。ポリシーはSQL文やユーザーアクションに基づいて発動されるため、柔軟に設定することが可能です。導入の際には、特定の操作に対する監査の範囲を決めて実装します。

-  Audit Vaultは、集中管理型の監査プラットフォームとして導入されます。複数のシステムやデータベースから監査ログを収集するために、監査データの収集エージェントを各システムに配置し、それをAudit Vaultサーバーで一元管理します。大規模なインフラや複雑なシステム全体で監査を統一的に管理する際に効果的です。

**6. セキュリティ強化のレベル**
-  FGAは、データベース内の特定のデータに対する監査を強化し、機密データへの不正アクセスを検出することに重点を置いています。特定の状況に応じてアクセスログを細かく取得することができます。

-  Audit Vaultは、広範なシステムの監査データの保護と管理に重点を置いており、特に監査ログの保管や分析、改ざん防止に役立ちます。特定のデータベースやシステムの境界を越えて、包括的なセキュリティ監査の枠組みを提供します。

**まとめ**
-  Oracleファイングレイン監査（FGA）は、特定のデータへの細かい条件付きの監査を行い、不正アクセスやデータの不適切な操作を監視するのに適しています。データベース内の特定の行や列に対するアクセスを記録する場合に効果的です。

-  Oracle Audit Vaultは、複数のデータベースやシステムから監査データを一元的に収集・管理・分析するためのツールで、広範な監査ログの管理やセキュリティインシデントの早期検出に適しています。システム全体でのコンプライアンス対応や監査データの保護が重要な場合に有効です。

それぞれのツールは異なる用途と範囲を持つため、特定の監査要件に応じて使い分けたり、必要に応じて組み合わせて使用することができます。
Oracle VPDとDatabase Vaultの違いは？

Oracle Virtual Private Database（VPD）とOracle Database Vaultは、どちらもデータベースのセキュリティを強化するための技術ですが、それぞれの目的やアプローチは異なります。以下に、それぞれの機能と違いについて詳しく説明します。

**1. 目的**
- **Oracle Virtual Private Database (VPD)**
VPDの主な目的は、データベース内の行レベルおよび列レベルでのアクセス制御を提供することです。特定のユーザーがアクセスできるデータを動的に制限することにより、データのプライバシーを保護します。VPDは、ユーザーやコンテキストに基づいて異なるデータセットを見せる、いわゆる「仮想的なプライベートデータベース」を作り出すことが可能です。

- **Oracle Database Vault**
Database Vaultの目的は、特権ユーザーやDBAによる不正アクセスの制限およびデータベースのセキュリティを強化することです。これにより、従来は完全なアクセス権を持つDBAでも、特定のデータや操作に対してアクセス制限をかけることができます。内部からの脅威に対応するための強力なアクセス制御機能を提供します。

**2. 機能とアプローチ**
- **VPDのアプローチ**
  - **行・列レベルのアクセス制御:** VPDはユーザーごとに動的にSQLクエリを修正し、そのユーザーがアクセスできるデータのみを返すようにします。例えば、ユーザーAは「部門X」のデータしか見られないが、ユーザーBは「部門Y」のデータしか見られないといった制御が可能です。
  - **セキュリティポリシー:** VPDは、特定のテーブルやビューに対してセキュリティポリシーを定義し、これに基づいてアクセスを制限します。このポリシーはユーザーやアプリケーションのコンテキスト（例えば、IPアドレスやログイン時間）に基づいて動作します。

- **Database Vaultのアプローチ**
  - **特権ユーザーのアクセス制御:** Database Vaultは、データベース管理者やシステム管理者といった特権ユーザーのアクセスを制限することに重点を置いています。DBAが特定のスキーマやデータにアクセスできないようにするなど、アクセス制御を細かく設定できます。
  - **セキュリティ領域とポリシー:** Database Vaultでは、保護領域（Realm）を作成し、その領域内のデータやアプリケーションに対するアクセスを制限します。また、コマンドルールを使って特定のSQL操作（CREATE, ALTER, DROPなど）に対してポリシーを設定することができます。

**3. 用途の違い**
- VPDは、データの細粒度なアクセス制御が必要な場面で使用されます。たとえば、異なる部署のユーザーが同じテーブルにアクセスするが、部署ごとに異なるデータしか見られないようにしたい場合などです。VPDはアプリケーションやユーザーごとに異なるビューを提供し、データのプライバシーを保護します。

- Database Vaultは、特に内部からの脅威に対する保護が求められる場合に使用されます。これは、DBAやその他の特権ユーザーが誤って、あるいは意図的に重要なデータにアクセスできないように制限するための機能です。また、複数の役割や責任の分離を実施する際に重要な役割を果たします。

**4. 適用範囲の違い**
- VPDは、主に行レベルや列レベルでのデータアクセス制御に特化しており、ユーザーやアプリケーションのコンテキストに基づいてSQLの結果を動的にフィルタリングします。特定のユーザーに特定のデータのみを見せたい場合に最適です。

- Database Vaultは、データベース全体や管理操作に対する制御を提供します。特権ユーザーを含むすべてのユーザーに対するセキュリティポリシーを定義し、データベース自体へのアクセスや操作を制限することに重点を置いています。

**5. 導入と管理**
- VPDは、アプリケーションや個々のテーブル、ビューに対してポリシーを設定し、それらのデータに対するアクセスをフィルタリングします。VPDの設定は比較的シンプルで、アプリケーションの設計段階で導入しやすいです。

- Database Vaultは、データベース全体に対してより広範なセキュリティ制御を提供するため、導入には慎重な計画が必要です。既存の業務プロセスや管理体制に影響を与える可能性があるため、導入には管理者の調整と計画が不可欠です。

**6. セキュリティ強化のレベル**
- VPDは、主にデータの閲覧や操作に関する制限を提供し、アクセスするデータ自体に焦点を当てています。VPDを使うと、異なるユーザーが同じSQL文を実行しても、その結果が異なるデータを返す可能性があります。

- Database Vaultは、データベースの管理操作や特権ユーザーのアクセスそのものを制御するため、より高いレベルでのセキュリティ強化を目指しています。データの閲覧だけでなく、管理上の操作を制限することができるため、システム全体の保護を強化します。

**まとめ**
- VPDは、ユーザーごとのデータアクセス制御に特化しており、特定のユーザーや状況に応じて、どのデータを見せるかを動的に制御するのに適しています。
- Database Vaultは、データベースの管理操作や特権ユーザーのアクセス制御に重点を置き、内部脅威に対する高度な保護を提供します。DBAによる不正な操作や誤ったアクセスを防ぐことに特化しています。

両者は目的や適用範囲が異なるため、セキュリティ要件に応じて適切なツールを選択、または組み合わせて利用することで、より強力なデータベースセキュリティを実現できます。
QIIME2にてProtist Ribosomal Referenceデータベースを用いて18S rRNA遺伝子配列の分類割当を行う

## 18S rRNA遺伝子配列の分類割当を行う

QIIME2で18S rRNA遺伝子配列の分類割当を実行する際、公式にはSILVAデータベースが16S/18S rRNAのどちらの配列も内包しているためこちらを使うことが推奨されている（[リンク](https://docs.qiime2.org/2024.5/data-resources/)）。
ただ、実際にこのデータベースを用いて分類すると細菌に配列が割当されることが多くある。
18S rRNAデータベースである[The PR2 databases](https://pr2-database.org/)は現在、version 5.0.0まで公開されており、こちらのデータベースをQIIME2で分類可能な形に変換していく。

## 実行コマンド

2024年9月時点で最新のバージョンである[PR2 version 5.0.0](https://github.com/pr2database/pr2database/releases/tag/v5.0.0)では、
マイクロバイオーム解析ツールであるmouturに互換性のある形式で18S rRNA遺伝子配列のfastaファイルと、それに対応するtaxonomyファイルが用意されているため、これらを用いる。

```bash
# 1. PR2データベースのダウンロード
wget https://github.com/pr2database/pr2database/releases/download/v5.0.0/pr2_version_5.0.0_SSU_mothur.fasta.gz
wget https://github.com/pr2database/pr2database/releases/download/v5.0.0/pr2_version_5.0.0_SSU_mothur.tax.gz

gunzip pr2_version_5.0.0_SSU_mothur.fasta.gz
gunzip pr2_version_5.0.0_SSU_mothur.tax.gz
```

ダウンロートが完了したら、得られた配列からtaxonomy.txtを作成し、fastaファイルとともにQIIME2にqza形式で入力する。

```bash
# タクソノミーファイルの処理
awk 'BEGIN{FS="\t"; OFS="\t"} 
     {
        gsub(/;/, ";", $2);  # セミコロンの前後のスペースを削除
        gsub(/^;|;$/, "", $2);  # 先頭と末尾のセミコロンを削除
        if ($2 == "") $2 = "Unclassified";  # 空の場合は"Unclassified"を設定
        print $1, $2;
     }' pr2_version_5.0.0_SSU_mothur.tax > pr2_taxonomy.txt

# QIIME 2アーティファクトの作成
qiime tools import \
  --type 'FeatureData[Sequence]' \
  --input-path pr2_version_5.0.0_SSU_mothur.fasta \
  --output-path pr2_sequences.qza

qiime tools import \
  --type 'FeatureData[Taxonomy]' \
  --input-format HeaderlessTSVTaxonomyFormat \
  --input-path pr2_taxonomy.txt \
  --output-path pr2_taxonomy.qza

# 分類器の学習（オプション）
qiime feature-classifier fit-classifier-naive-bayes \
  --i-reference-reads pr2_sequences.qza \
  --i-reference-taxonomy pr2_taxonomy.qza \
  --o-classifier pr2_classifier.qza
  ```

Naive baysで分類器を作成したら、こちらを用いて18S rRNA遺伝子配列の分類割当を実施する。
Oracleのファイングレイン監査とは？

Oracleのファイングレイン監査（FGA: Fine-Grained Auditing）とは、特定の条件に基づいてデータベースのアクセスや操作を詳細に監視する機能です。通常の監査機能がデータベースレベルやテーブルレベルでの操作（SELECT、INSERT、UPDATE、DELETEなど）を監視するのに対し、FGAは特定の条件に基づいたアクセスや操作を監査できるため、より柔軟かつ細かい制御が可能です。

**ファイングレイン監査の特徴**
**1. 条件に基づく監査** FGAでは、SQLクエリの中で特定の条件が満たされた場合にのみ監査を実行します。たとえば、特定の列に対して特定のユーザーがアクセスした場合のみ、または特定の時間帯に行われた操作だけを監査対象とすることができます。

**2. 行・列レベルの監査** ファイングレイン監査では、特定の行や列に対する操作を監査できます。これにより、特定のデータに対してのみ監査を行い、全体的なパフォーマンスへの影響を最小限に抑えることができます。

**3. コンテキスト依存の監査** ユーザーのコンテキスト（ユーザー名、接続時間、IPアドレスなど）に応じて監査条件を設定できるため、特定のユーザーがリモートからアクセスした際にのみ監査を行うといった高度な監査設定が可能です。

**4. ポリシーベースの管理** FGAは監査ポリシーとして設定され、管理者はポリシーを定義して監査を適用することができます。ポリシーは、どのテーブルや列を監査するか、どの条件で監査を実行するか、どのユーザーに適用するかなどを細かく指定します。

**5. SQLの詳細なキャプチャ** 条件が満たされた場合、FGAはそのSQL文の詳細をキャプチャします。これには、実際に実行されたSQL文、ユーザー情報、実行されたタイミングなどが含まれます。これにより、特定のデータへの不正なアクセスや操作があった場合に詳細な証跡を残せます。

**ファイングレイン監査の活用例**
- **機密データへのアクセス監視**
例えば、従業員データベース内の給与情報や個人情報といった機密データにアクセスした場合にのみ監査を行い、不要な監査データの生成を避けることができます。

- **特定ユーザーの行動監査**
特定の役職や権限を持つユーザーが高感度データにアクセスした場合にのみ監査を行い、不正な操作を検出するために使用されます。

- **規制準拠の強化**
FGAは、GDPRやHIPAAなどの規制に対応するために使用され、個人データや医療情報へのアクセスに対する厳格な監査を可能にします。

**まとめ**
Oracleのファイングレイン監査は、特定の条件に基づいてアクセスや操作を細かく監視できる機能で、従来の監査機能よりも柔軟かつ強力です。これにより、パフォーマンスへの影響を最小限に抑えつつ、重要なデータや特定の条件に対するアクセスを厳密に監査できるため、セキュリティやコンプライアンスの要件に対応するために有効です。
Oracleの統合監査ではなく、Audit Vaultを導入するメリットは？

Oracle Audit Vault（OAV）を導入するメリットは、Oracleの統合監査（Unified Auditing）と比較して、監査管理とデータ保護の面でより強力な機能を提供することです。具体的なメリットは以下の通りです：

**1. 複数データソースの監査**
Oracleの統合監査はOracleデータベース内での監査を中心としていますが、Audit Vaultは異なるデータベースやシステム（Oracleデータベース、SQL Server、MySQL、OS、ファイルシステムなど）からの監査データを集約できます。これにより、複数のシステムにわたる統一的な監査が可能です。

**2. 集中管理と分析**
Audit Vaultは、複数のデータソースから収集した監査データを一元管理し、高度な分析やレポート機能を提供します。これにより、監査レポート作成の効率化や、データセキュリティに関するインサイトを得ることができます。

**3. セキュリティ強化**
Audit Vaultは監査データを別のサーバーに保存するため、万が一のデータベース侵害時にも監査ログの改ざんや削除を防ぐことができます。統合監査では、監査データは通常データベース内に保存されるため、データベースへの攻撃者が監査ログを改ざんするリスクがあります。

**4. 自動アラート機能**
Audit Vaultには、不正アクセスや異常な動作が検出された場合にリアルタイムでアラートを発信する機能があります。これにより、セキュリティインシデントに対して迅速な対応が可能になります。

**5. コンプライアンス対応**
複数のデータソースを監査し、一元的に管理できるため、GDPR、SOX、PCI-DSSなどのコンプライアンス要件への対応が容易になります。また、事前定義されたレポートやアラートテンプレートがあるため、監査要件に迅速に適応できます。

**6. ログの圧縮と長期保存**
Audit Vaultは監査ログを効率的に圧縮し、長期間保存する機能を持っています。データベースのパフォーマンスに影響を与えずに監査データを安全に保管できる点も大きな利点です。

これらの理由から、高度なセキュリティ監査や複数システムにまたがる監査要件がある場合、Audit Vaultの導入は統合監査に比べて優れた選択肢となります。
(ABC371)D - 1D Country

## はじめに
9/14開催のABC371のD問題です。

https://atcoder.jp/contests/abc371/tasks/abc371_d

## 問題文
### 解釈
N個の村があって、$i$番目の村は座標$X_i$で$P_i$人の村人がいる。
以下の計算をして、返却する。
- 整数$L_i,R_i$が与えられるので$L_i \leq X_i \leq R_i$に含まれる村すべての村人を合計

### 制約
- $1 \leq N,Q \leq 2 \times 10^5$
- $-10^9 \le X_1 < X_2 < \cdots < X_N \le 10^9$
- $1 \le P_i \le 10^9$
- $-10^9 \le L_i \le R_i \le 10^9$

## 考え方
制約の数値が非常に大きいので、$X_i$を１つずつ見つけたり、加えたりすると恐怖のTLEになるのは目に見えてます。

村をさっと見つけて、合計を少ない計算で出す方法を検討する。

村をさっと見つける => 二分探索
合計を少ない計算　=> 累積和

これは数少ない私の知っているアルゴリズムでなんとかなりそうです。

## 自分の解答
```py:ABC371_D.py
def binary_search(nums ,x):
  left , right = 0 , len(nums)
  while left < right:
    mid = (left + right) // 2
    if nums[mid][0] < x:
      left = mid + 1
    else:
      right = mid
  return left

N = int(input())
X = list(map(int,input().split()))
P = list(map(int,input().split()))
Q = int(input())

#クエリをまとめて配列にする
queries = [list(map(int, input().split())) for _ in range(Q)] 

#村の座標と人口をまとめて配列にする
villages = list(zip(X, P)) 

#累積和を計算
cumulative_sum = [0] * (N + 1)
for i in range(N):
  cumulative_sum[i + 1] = cumulative_sum[i] + villages[i][1]

#クエリを処理
for L, R in queries:
    left = binary_search(villages, L)
    right = binary_search(villages, R + 1)
    print(cumulative_sum[right] - cumulative_sum[left])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296985/b58f5ab3-f2c1-abf9-6b19-8c0792faa156.png)

アルゴリズムの勉強をしてきて、初めてちゃんと使えたので、解けた時、脳汁噴出したのがわかりました。

## おわりに
勉強したアルゴリズムが身についているのかを確認するため、説明する記事を今後は書いていきたいと思います。
【考え方】直感型志向の為にならない実装方法

# 何考えて実装してるんですか？
現在、別プロジェクトで新人の面倒をチョロっと見ながら実装をしているお陰で、
更新頻度がアホほど下がって企業ランキングも下がりまくり、
ネタを探すのに右往左往しております。
どうも、え～すけさんです。

## 新人教育って難しい
どこまでの知識を持ってて、どんな考え方をしてるかわからない人に、
実務で使えるレベルのプログラムを教えるって結構難しく、
説明が上手く伝わらずに新人に疲労困憊な日々を送らせてしまっている気がして非常に申し訳ないと反省の日々を過ごしているわけで、
しまいには出だしのタイトルみたいなことを言われてしまう始末となってしまったため、
じゃあ自分って何を考えてプログラムしてるんだろうというのを文章化してみる試みです。

# こんなことを考えて仕事してる
あくまで個人的な思考を文章化しただけなので、
この考え方が必ずしも正解とかじゃなく、こんな事考えてるやつが居るんだなぁぐらいの感じで読んでもらえれば幸いです。

とりあえず実装部分（例としてJavaでSpringを使ったWebアプリ想定）をメインにした内容となっているため、設計とかテストとかはちょっと置いといての考えです。

## まず実装をする前に
### システムの全体像をざっくり把握
実装自体は機能単位でタスクが振られるかと思いますが、
その機能ってどこでどう使われるんだろうというところを簡単にでも理解してないと、
データのつながり（整合性）とかがキチンとしてるかもアレになっちゃうので、
簡単に全体でこんなことやるんだ　とか　DB（テーブル）ってこういう繋がりなんだ的な大まかな全体像を抑えてから作業をしてます。

### 実装する機能の仕様理解
基本的に以下の順で機能の仕様理解を行います。
- インプットで何が来るのか？
→画面とか起動パラメータでどんな形式の値が渡されるのかなど
- アウトプットとして何を返すのか？
→どんな形式（JSON、バイナリ、文字列など）の値を返すのか
- チェック処理はどうする？
→何を、どうチェックするのか？（パラメータとか処理の途中でのチェック処理周り）
- どんなデータを取ってきて、どう加工するのか？
→日付だったらフォーマットは？数値はカンマ区切りとかするのか？などなど

上記が理解できれば、大体の処理の中身が検討付くのですが、
ココが新人とかにとってはネックらしい（後述

## 後はノリと勢いで
仕様が理解できた時点でとりあえず以下の順番で実装を始めます。
1. Form/DTOの作成
→Input/Outputの情報を元にFormとController←→Serviceへのデータ連携用のInputDto・OutputDtoの作成
　面倒くさがりなので場合によっては、設計書をコピーすればプロパティを生成するようなExcelとかを作ったりします。
1. Controller・Serviceクラスとメソッドの作成
→とりあえずガワだけ。
　Formの中身をDTOに詰め替えてControllerからServiceを呼び出し、
　Serviceからの戻りをレスポンスに設定する処理を記述
　→この時点でControllerの実装はほぼ終わり
1. Serviceクラスをゴリゴリに書く
→入力チェック・データ取得・加工など設計書に合わせて実装
　基本的にこう書いたらこう動くだろうな的なことを考えながら
　こう書いたら保守のとき読みにくいだろうから記述レベル落とすか。。。とかを考慮し、
　極力処理が読みやすいように実装してるはず。。。
1. 微調整的なアレ
→コードの分割（長い・似たような処理の部分をメソッド化）だったり、
　JavaDocやコメントちょこちょこ書いたり、
　コードゴルフしだしたりしてソースをきれいに整形して終わり

## ってな具合で
こうやって自分の作業を文章化すると、
如何に「とりあえずやってみるか」の精神で仕事してるかがよく分かるね！
そりゃ新人にとって「コイツ、何考えてるのかわからん？」ってなるわな。。。

# 新人は何がわからないのか？
> 仕様が理解できれば、大体の処理の中身が検討付くのですが、
> ココが新人とかにとってはネックらしい（後述

プログラムの書き方的な知識がまだまだ乏しいこともそうですが、
まずなにより仕様の理解が結構難しいらしい。

設計書にもよりますが、In/Outとチェック処理しか記載の内容な粗い設計書だった場合、
どんなデータをどういう条件で取ってきて、どんな風に加工してみたいな部分が全くイメージつかないということがわかりまして。。。

自分の場合だと、
とりあえずER図とかでデータの繋がり見て、こんな条件で取ってくればいいのね。
で、こうOutしたいから取ってきたソレをゴニョゴニョ加工すればいいのね。
って言うことが、なんとなくで思いつくわけですが。。。

## 結局、公式（パターン）なんだよね。。。
プログラムって、人によって書き方は違うかもしれないけど、
やってることって結構パターン化されたものだと自分は思っていて、
如何にそれをいっぱい知ってるかどうかで実装や考え方の幅が決まってくるのかなと感じてます。
仕様的に〇〇したい→ならこう作る　っていうパターンをいくつもこなして身に付けないと、
急に何かが降りてきて覚醒することとかはモブな一般社員には普通ないので、
いっぱいタスクこなして、いっぱい先輩に聞いて教えてもらって、どんどん理解していくしか無いのかなぁって。。。

### 例えばString型のnull or 空文字チェックの場合
`String a;`って言う変数があった時のaがnull or 空文字かチェックする場合
```java:教科書通り
if(a == null || a.length == 0)
```

```java:普通
if(a == null || a.isEmpty())
```

```java:ライブラリの使い方知ってる
if(StringUtils.isEmpty(a))
```
と、同じ処理なのに書き方が3つ（もっとあると思うけど）も有るけど、
どの書き方が分かりやすいかとか、スマートかとか、実装方針に沿ってるかとかで、
【書かなきゃいけない書き方】が変わってくるわけで。。。

## 経験しかないのかな？
こういったパターンってどこでどう覚えるかって言うと、
結局のところQiitaとかStackOverFlowとかの誰かさんが書いたコードを読んで、
なるほどと身につけていくしか無いのかなって。。。
あとはそれを **どれだけ自分で噛み砕いてカスタマイズできるか** ってところも大事かなと。

# 強火で一気ではなく、じっくりコトコト
最初は何言ってるかわからないかもしれないけど、
いつか急に色々と繋がって分かる時が来るはずなので、
出来る・分かることをちょっとずつ増やしていこうねって話でした。
なので、これからの新人教育も地道に少しずつ色々と **優しく(大事)** 伝授していくしか無いのかなって。。。
※出来ないからって圧をかけない、コッチが先にイライラしちゃいけない（と言い聞かせながら。。。

ね、微塵もためにならないでしょ？
隔離性水準を覚えるためのメモ

何度見ても覚えられずいつまでも間違えるので自分の言葉でまとめることにしました。

## 隔離性水準(ISOLATION LEVEL)とは
トランザクションの独立性もしくは分離性のレベルを表している。

トランザクションの独立性もしくは分離性・・・
　複数のトランザクションが同時実行されても他のトランザクションの影響を受けずに、単独で実行した場合と同じ結果が得られること
　＊Isolationは分離という意味を持つ

 独立性阻害要因というものがいくつかあり、どれの発生を防ぐかでレベルが変わってくる。
 レベルは下記の4種類。
 ①→②→③→④の順番で分離レベルが高く、強力な隔離レベルと言える。

## 分離レベル
#### ①READ UNCOMMITTED
　4つのレベルの中で一番分離レベルが低い。コミットされていないデータを読み取るので、他トランザクションのコミット前のデータを読んでしまう。
 
　**メリット**　：トランザクションのスループット(時間あたりの処理能力)が高い。
　**デメリット**：独立性阻害要因が発生する。(ダーティリード、ノンリピータブルリード、ファントムリード)

#### ②READ COMMITTED
　コミットされたデータだけを読むので、他トランザクションの変更はコミットされるまで読めない。
 
　**メリット**　：独立性阻害要因のダーティリードを阻止できる。
　**デメリット**：独立性阻害要因が発生する。(ノンリピータブルリード、ファントムリード)

#### ③REPEATABLE READ
　トランザクションで読み取ったデータは、他のトランザクションで更新できなくなるので、同じデータを繰り返し読み取っても、同じ内容であることが保証される。
　＊該当のテーブルに追加や削除は可能
 
　**メリット**　：独立性阻害要因のダーティリード、ノンリピータブルリードを阻止できる。
　**デメリット**：独立性阻害要因が発生する。(ファントムリード)

#### ④SERIALIZABLE
　複数のトランザクションをどれだけ実行しても、単独で実行した結果と同じものが得られることを保証する。
　4つのレベルの中で一番分離レベルが高いが、排他制御による待ち時間が発生しやすい。
 
　**メリット**　：独立性阻害要因が発生しない。(ダーティリード、ノンリピータブルリード、ファントムリード)
　**デメリット**：トランザクションのスループットが低い。


 ## ISOLATION LEVELと独立阻害要因
 ![2024-09-16 20.35の画像.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3886753/9eeba817-9c6a-7231-4926-74592698de94.jpeg)


 ## 独立性阻害要因

 #### ・ダーティリード
　他トランザクションで更新された**コミット前**のデータを読み込んでしまうこと。
　コミット前にトランザクションがロールバックされて取り消された場合、結果的に更新されなかったデータに対して、処理をしてしまうことになる。

 #### ・ノンリピータブルリード(ファジーリード)
　**同じデータ**を2回読み込んだ時、1回目と2回目とで異なったデータを読んでしまうこと。
　初回の読み込みの後に他トランザクションによってデータの更新がされて、不整合が発生すること。
 
 #### ・ファントムリード
　データの読み込みを行った時、1回目と2回目との間でデータの数が異なっていること。
　初回の読み込みの後に他トランザクションによってデータの追加などがされて、不整合が発生すること。
　**幻(ファントム)のデータ**を読み込んでしまった状態。
【リーダーの頭の中を覗く】目線を合わせる

# まえがき

どうも～キンカメです！チームリーダーとして、とりまとめ役をする中で、後輩社員などによく話す内容をまとめていこうと思います！
リーダーはいつも何を考えているのかよくわからないという人は、少しでも参考になればうれしいです！

# 目線を合わせることは成果物に左右する

今日のテーマは、「目線を合わせる」です！
例えば、本番システムでバグが起き、リーダーから「バグ調査」を依頼されたとします。
あなたは、どんな調査結果を報告しますか？（直感で思い描いてください）

1. そのバグが発生した原因を報告する
2. そのバグが発生した原因と、類似機能の影響も調査して報告する
3. そのバグが発生した原因と、類似機能の影響、改修が必要になる場合は、おおよそかかる時間を報告する

リーダーはどの成果物を求めていると思いますか！？
これは、リーダーが見ている目線によって変わります。

キンカメの場合は、「目線を合わせるために、リーダーと認識合わせてしてください」です！

# 認識合わせが必要な理由は？

先ほどの三択の中で、直感的に「3」が一番いいのでは？と考え、作業を進める人が多いと感じます。
しかし、必ずしもそうではありません。
なぜなら、「3」が一番作業に時間がかかるからです。

「バグ調査」を依頼したとき、リーダーが次に見ている目線は、「いつバグの調査状況を上層部（またはお客様）に報告できるか」です。

作業指示をした時点で、不明確な点は以下が多いです。
* バグの緊急度（→影響範囲が広いのか局所的なのか）
* 改修が必要なのか否か（→データが起因かもしれません）
* 調査にかかる時間（→すぐ終わると思ってません）

これを踏まえ、指示を受けた人が、ついやってしまう行動例に対して、リーダーの心の声を当てはめてみます。

| ついやってしまう行動例 | リーダーの心の声 |
|:-|:-|
| 途中経過を報告しない | 作業は順調と判断でいんだよね！？あとどれくらい時間が必要か知りたいな。。。  |
| 報告内容が的外れている。成果物が何も出てこない | 難しい作業だったら、早く相談して欲しかった。。。  |
| 既に修正まで実施していた  | 修正は他の人に任せて、違う調査を依頼したかった。。。 てか、修正にどれくらい時間かかったのかな？ |

リーダーは、「いつバグの調査状況を報告できるか」に目線を合わせているので、「いつ」を重要視します。

再現ができないような難しい内容ではあれば、それだけ時間がかかります。
そのような状況は、調査を依頼された人しか分かりません。
なので、報告をされた時点で、改修箇所まで分かっている必要が無いことも多いです。

途中経過を報告し、状況を常にリーダーに伝え、「リーダーにどこまで作業するべきか判断してもらう=認識合わせをする」作業をしてくれると、とても助かります！

# まとめ

目線を合わせる重要性について、まとめると以下です。

* 自分の作業範囲が明確になる
* 認識の違いを防げる
JavaのStreamAPIでソートとgroup byのようなことをする

SQLではよくやりますが、Java側でソートとGROUP BYを行うことがあったので書き留めておきます。


# ソート
``` java
list.stream()
.sorted(Comparator.comparing(TestClass::getId)
.thenComparing(TestClass::getName)
.collect(Collectors.toList())
```
やっていることは
1,listをstreamに渡し、TestClass.getIdで比較します。
2,1で比較して同じ順位だった場合、TestClass::getNameで比較します。
3,listに戻して返します。

SQLでいうと
```sql
ORDER BY ID,NAME
```
のようなイメージです。

# group by
``` java
list.stream()
.collect(
    Collectors.groupingBy(
    TestClass::getId, 
    Collectors.groupingBy(TestClass::getName)
    )
)
.collect(Collectors.toList())
```

やっていることは
1,listをstreamに渡し、TestClass.getIdでグルーピングします。
2,1で集計した後、TestClass::getNameでグルーピングします。
3,listに戻して返します。

SQLでいうと
```sql
GROUP BY ID,NAME
```
のようなイメージです。

# 番外編
検索してもなかなかやり方が見つからず苦労したので、記載しておきます。
1:Nの関係のデータにおいて以下のようなMapを作りたい時があります。
```java
Map<String, List<Int>>
```
これを実現するには上記のgroupingbyと同時に、Collectors.mappingを使用します。
以下の通りTestObjectがあるとして、
```java
// 伝票番号と明細番号を持つだけのクラスです
public class TestObject {

    private String slipNo;
    private int detailNo;

    public SlipDetail(String slipNo, int detailNo) {
        this.slipNo = slipNo;
        this.detailNo = detailNo;
    }

    public String getSlipNo() {
        return slipNo;
    }

    public int getDetailNo() {
        return detailNo;
    }

    public void setSlipNo(String slipNo) {
        this.slipNo = slipNo;
    }

    public void setDetailNo(int detailNo) {
        this.detailNo = detailNo;
    }
}
```
このクラスのデータを持つListが以下のイメージであるとします。
```java
// 同一の伝票番号に複数の明細番号が紐づくデータがいくつかある状態
List<TestObject> testObjectList =
{{1000,1},{1000,2},{1001,1},{1001,2},{1002,1}}
```

これらを{伝票番号、明細番号のリスト}のようにMap化すると
```java
Map<String,List<Int>> testObjectMap =
testObjectList
.stream()
.collect(
    Collectors.groupingBy(
        test -> test.getSlipNo(),
        Collectors.mapping(
            test -> test.getDetailNo, 
            Collectors.toList()
        )
    )
)

// 上記で作成されるtestObjectMapの中身
// {{1000,{1,2}},{1001,{1,2}},{1002,{1}}}
```
やっていることは
1,listをstreamに渡し、TestObject.getSlipNoでグルーピングします。
2,1で集計したグループに対して、
さらにTestObject.getDetailNoで明細番号を取り出し、それらをListにします。



ご指摘などあればお待ちしております！


### 参考

https://blog1.mammb.com/entry/2019/04/12/223737#Lambda-%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E5%86%97%E9%95%B7%E3%81%AA%E3%82%BD%E3%83%BC%E3%83%88

https://scrawledtechblog.com/java-groupingby/
AWS Client VPN のハンズオン

# はじめに
以下のハンズオンを実施した。

https://catalog.us-east-1.prod.workshops.aws/workshops/be2b90c2-06a1-4ae6-84b3-c705049d2b6f/ja-JP


以下のAWSのドキュメントを踏まえて、実施内容を簡単に記載した。

https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/cvpn-getting-started.html



# ステップ 1: サーバーおよびクライアント証明書とキーの生成

ハンズオンの以下の場所が該当する

https://catalog.us-east-1.prod.workshops.aws/workshops/be2b90c2-06a1-4ae6-84b3-c705049d2b6f/ja-JP/03-hands-on/03-01-common/04-certificate

easy-rsa で生成したファイルを ACM に取り込む。

```
# find | grep -e crt -e key
./pki/issued/server.crt
./pki/issued/client1.domain.tld.crt
./pki/private/ca.key
./pki/private/server.key
./pki/private/client1.domain.tld.key
./pki/ca.crt
#
```


# ステップ 2: クライアントVPNエンドポイントを作成する

ハンズオンの以下の『2.クライアントVPCエンドポイントの作成』が該当する
エンドポイントが利用可能になるまで15分以上かかったので、後続の作業も実施しておく。

https://catalog.us-east-1.prod.workshops.aws/workshops/be2b90c2-06a1-4ae6-84b3-c705049d2b6f/ja-JP/03-hands-on/03-02-mutal/02-vpn-endpoint


# ステップ 3: ターゲットネットワークを関連付ける

ハンズオンの以下の『3.ターゲットネットワークへのクライアント VPN の関連付けの作成』が該当する

https://catalog.us-east-1.prod.workshops.aws/workshops/be2b90c2-06a1-4ae6-84b3-c705049d2b6f/ja-JP/03-hands-on/03-02-mutal/02-vpn-endpoint


# ステップ 4: の承認ルールを追加する VPC

ハンズオンの以下の『4.認証ルールの追加』が該当する

https://catalog.us-east-1.prod.workshops.aws/workshops/be2b90c2-06a1-4ae6-84b3-c705049d2b6f/ja-JP/03-hands-on/03-02-mutal/02-vpn-endpoint


# ステップ 5: インターネットへのアクセスを提供する

ハンズオンの以下の『5.ルートテーブルを確認』が該当する

https://catalog.us-east-1.prod.workshops.aws/workshops/be2b90c2-06a1-4ae6-84b3-c705049d2b6f/ja-JP/03-hands-on/03-02-mutal/02-vpn-endpoint


# ステップ 6: セキュリティグループの要件を検証する

ハンズオンのように ping 実行を実行するだけであれば不要。必要に応じて変更。

# ステップ 7: クライアントVPNエンドポイント設定ファイルをダウンロードする

ハンズオンの以下の『7.クライアント設定のダウンロード』が該当する

https://catalog.us-east-1.prod.workshops.aws/workshops/be2b90c2-06a1-4ae6-84b3-c705049d2b6f/ja-JP/03-hands-on/03-02-mutal/02-vpn-endpoint


# ステップ 8: クライアントVPNエンドポイントに接続する

ハンスオンの以下が該当する

https://catalog.us-east-1.prod.workshops.aws/workshops/be2b90c2-06a1-4ae6-84b3-c705049d2b6f/ja-JP/03-hands-on/03-02-mutal/03-vpn-connection



# 参考URL
以下なども参考
https://dev.classmethod.jp/articles/aws-client-vpn-perfect-understand-2/
https://dev.classmethod.jp/articles/aws-client-vpn-perfect-understand/
HTMLフォームのaction属性エラーの対策法：リンク未設定時に役立つコツ〜初学者のエラー奮闘記〜

## はじめに
こんにちは、未経験からエンジニア転職を目指しているものです。
オンラインスクールで本格的に学習して4ヶ月目に入りました。勉強し始めの頃の自分が疑問に思っていたことを整理してみようと思い記事を書いております。今回はHTML,CSSでウェブサイトを模倣してみた時、Errorを読む時のコツについて考えてみました。

## 直面したエラー

Webサイトを作成した時に、自分で書いたコードにエラーが無いかチェックしました。その時は下記のサイトを使用しました。

https://html5.validator.nu/

その際に下記のエラーと直面しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846051/82ae9cfd-756b-e516-2578-1563f94b1cdd.png)

エラーが発生した時の状況について説明します。
`エラー発生箇所`：formタグのaction属性部分
`エラーの概要`：action属性が空のままでフォームを作成しており発生 

## エラーメッセージの読み方
エラーメッセージをどのように読むと読みやすいか考えてみました。
エラーメッセージは通常、以下のように「:」で区切られて構成されています。

```csharp
Bad value for attribute action on element form: Must be non-empty
```
**「:」より左に、今の状況についての説明があります。**
今回だと「要素のアクション属性の値が悪い」になります。
**「:」より右に、どのような状態が正しいか示してくれます。**
今回だと「空であってはいけません」になります。

要するに、formタグのaction属性が空であるために問題が発生していることを示しています。

action属性は、フォーム送信時にデータを送るURLを指定する重要な部分です。

## エラーの原因
このエラーは主に、フォームを作成した際にaction属性を設定しなかった、または設定する予定だったリンクを忘れてしまったときに発生します。

例えば、以下のようなコードでは、action属性が空であるためにエラーが発生します。

```html
<form action="">
  <!-- フォーム内容 -->
</form>
```

## 対策：仮のリンクを設定する方法
開発中にaction属性をまだ指定できない場合は、仮のリンクを設定することが推奨されます。action="#"のように設定すると、リンクがクリックされた際にページのトップに移動します。これにより、フォーム送信時のエラーを回避できます。

```html
<form action="#">
  <!-- フォーム内容 -->
</form>
```
これは仮の設定であり、後から実際のリンク先に変更する必要があります。

## 注意点：バリデーションエラーになることも
一部のバリデーションツールやブラウザによっては、#が適切なURLでないと認識され、エラーとして扱われることがあります。これを避けたい場合は、プレースホルダーのURLを指定する方法もあります。

```html
<form action="https://example.com/submit">
  <!-- フォーム内容 -->
</form>
```
開発中であれば、ダミーのURLを指定しておくことも効果的です。

## バリデーションエラーとは？
`バリデーションエラー`は、Web開発やプログラミングにおいて、入力データやコードが定められた基準や規則に合致していない場合に発生するエラーのことを指します。具体的には、以下のような状況でバリデーションエラーが発生することがあります：

-  HTMLバリデーションエラー: HTMLのコードがW3C（World Wide Web Consortium）の仕様に準拠していない場合に発生します。例えば、属性が正しく設定されていない、必須の属性が欠落している、またはタグが正しく閉じられていないなどのケースです。これにより、ブラウザやバリデーターがエラーを報告します。

```html
<form action="">
  <!-- フォーム内容 -->
</form>
```
上記のコードでは、action属性が空であるため、HTMLバリデーションツールでエラーが発生することがあります。

- 入力データのバリデーションエラー: フォームに入力されたデータが、指定された形式やルールに合致しない場合に発生します。たとえば、メールアドレスが無効である、必須フィールドが未入力である、データが指定された範囲外である場合などです。

```html
<input type="email" required>
```
上記のコードで、ユーザーが正しいメールアドレスを入力しなかった場合に、バリデーションエラーが発生します。

- JavaScriptのバリデーションエラー: フロントエンドでJavaScriptを使用して入力データを検証する際に、期待された条件を満たしていない場合に発生します。例えば、数値の範囲や文字列の長さをチェックするスクリプトでエラーが発生することがあります。

```javascript
if (age < 0 || age > 120) {
  console.error("Invalid age");
}
```
上記のスクリプトで、ageが0未満または120を超えている場合にエラーが報告されます。


## まとめ
エラー文をどのように読むかわからないと、エラーから逃げたくなります。エラーがどのように書かれているかを理解する事で少しだけエラーと仲良くなれた気がします。今回直面したシチュエーションでは、HTMLフォームのaction属性が空だと、エラーメッセージが発生しました。エラーの意味を理解し自分の今の状況に当てはめて考えてみて、仮に#を使用することで今回はエラーを回避できました。







最後までご覧いただき本当にありがとうございました！！
クイックソート、ヒープソート、マージソートのメリット ~実際のソートを添えて~

自分は実際にC++でソートアルゴリズムの速さを計ったのでそれについて話します。
実際に計った結果は、100万の長さの**ランダムな**配列を揃えさせた場合です。
ms、ミリ秒単位です。
多少誤差があります。
## クイックソート
- とりあえずインプレース(配列の2か所を入れ替える作業を使って完結する)ソート内でかなり速い
- 特定のパターン等に弱く、計算量が最大`O(n^2)`になってしまう
- 再帰呼出がある
実際の結果は、372msです。
## ヒープソート
- クイックソートと同じくインプレースソートである
- 再帰呼出がある
- クイックソートと違い、安定して計算量`O(n logn)`を出せる
- 計算量的にはクイックソートより速いが実際はそれよりちょっと遅い
実際の結果は505msです。
## マージソート
- インプレースではなく、揃える配列の長さ分の追加の配列が必要
- 再帰呼出がある
- 揃えた後、揃える前の状態が、同じ要素の相対的な順序が同じになる(安定ソート)
- まあまあ遅い(`O(n^2)`よりは速い)
実際の結果は727msです。
## 基数ソート(LSD)
:::note alert
ここのLSDは、薬物ではなく、Least Significant Digitの略、
最下位桁の意味で、最下位桁から揃えるという意味です。
:::
- マージソートと同じく、揃えた後、揃える前の状態が、同じ要素の相対的な順序が同じになる(安定ソート)
- 圧倒的に速い
- メモリが必要で、バージョンによるが揃える配列の長さの揃える基数倍ぐらい必要
実際の結果は195msです。(速い。)
## スムースソート
- ヒープソートの亜種
- 安定ソートではない
- 複雑
- 結構遅いが計算量的には最適計算量が`O(n)`なので速いはず
実際の結果は1769msです。(遅い。)
## まとめ
| 名前 | 安定? | 結果 | メモリについて | 
|:-:|:-:|:-:|:-:|
| クイックソート | いいえ | 372ms | インプレース | 
| ヒープソート | いいえ | 505ms | インプレース |
| マージソート | はい | 727ms | 配列の長さ分 | 
| 基数ソート(LSD) | はい | 195ms | 配列の長さ分x揃える基数 |
| スムースソート | いいえ | 1769ms | インプレース | 

好評でしたら増やします。最後まで見てくれてありがとうございます。
[react-testing-library]Element type is invalid: expected a string (for built-in components) or a class/function~ というエラーの解決法

## 発生したエラー
Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.

# 原因
* Appコンポーネントをnamedでexportしているにも関わらず、テストを実行するファイルではdefalutexportをしたときのimportの記述方法になってしまっている為です。

# エラーが発生する原因になっている箇所
```componenteSample.spec.jsx
import App from "../App";
import React from "react";
import '@testing-library/jest-dom'
import { render, screen, fireEvent, waitFor } from "@testing-library/react";

describe("Title Test",() => {
  it("タイトルが学習記録であること", async () => {
    // testId(title)を指定して取得
        render(<App />);
        const title = await screen.findByTestId("title");
        expect(title).toHaveTextContent("学習記録");
         });
});

```
```App.jsx
export const App = () => {
//中身は省略します
｝;

```
```main.jsx
import { App } from './App';
```

# 解決方法
Appのimportをnamed形式に変更しました。
```componenteSample.spec.jsx
import { App } from "../App";
import React from "react";
import '@testing-library/jest-dom'
import { render, screen, fireEvent, waitFor } from "@testing-library/react";

describe("Title Test",() => {
  it("タイトルが学習記録であること", async () => {
    // testId(title)を指定して取得
        render(<App />);
        const title = await screen.findByTestId("title");
        expect(title).toHaveTextContent("学習記録");
         });
});
```        

## さいごに
問題が発生したファイルだけではなく今やっていることに関連したファイルもエラー調査の際には見る必要があることを今回のエラーで実感しました。
CSSのappearanceプロパティとベンダープリフィックスの使い方 -webkit-appearanceと-moz-appearanceの役割とは？

## はじめに
こんにちは、未経験からエンジニア転職を目指しているものです。
オンラインスクールで本格的に学習して4ヶ月目に入りました。勉強し始めの頃の自分が疑問に思っていたことを整理してみようと思い記事を書いております。HTML,CSSでウェブサイトを模倣してみた時、sanitize.cssを使用しました。その中で-webkit-appearanceという表記があり、どういう意味なのか気になりまとめてみました。

## appearanceプロパティ、ベンダープリフィックスについて
Webページのデザインを統一するために、CSSのappearanceプロパティを使うことがあります。しかし、ブラウザごとに見た目が異なることがあるため、ベンダープリフィックスを使って対応することが必要です。

**1.CSSのappearanceプロパティとは？**
appearanceプロパティは、HTML要素の見た目をブラウザの標準スタイルに合わせるために使われます。例えば、buttonのような要素にこのプロパティを適用すると、どのブラウザでも同じようなボタンとして表示されるようになります。

```css
appearance: button;
```
**2.ベンダープリフィックスとは？**
ベンダープリフィックスとは、特定のブラウザ専用のCSSプロパティに追加される接頭辞のことです。これにより、各ブラウザがまだ標準化されていない機能を独自に実装できるようにしています。

有名なベンダープリフィックスには以下のものがあります：

- `-webkit-`: Chrome や Safari など、WebKitエンジンを使ったブラウザ用
- `-moz-`: Firefox 用
- `-ms-`: Internet Explorer や Edge 用

これらのプリフィックスを使うことで、ブラウザごとに異なる見た目を統一することができます。

**3.-webkit-appearance と -moz-appearance の違い**
`-webkit-appearance`
-webkit-appearance は、主にChromeやSafariなどのブラウザで使われます。例えば、-webkit-appearance: button; と書くと、要素がChromeやSafariで標準的なボタンのように見えるようになります。

```css
-webkit-appearance: button;
```

`-moz-appearance`
-moz-appearance は、Firefox用の命令です。-moz-appearance: button; と書くと、Firefoxでボタンが標準の見た目で表示されるようになります。

```css
-moz-appearance: button;
```

**4. 実際の使い方の例**
複数のブラウザで見た目を統一するためには、複数のベンダープリフィックスを併用するのが一般的です。以下のように書くことで、どのブラウザでも要素がボタンのように表示されるようになります。

```css
/* SafariやChrome用 */
-webkit-appearance: button;

/* Firefox用 */
-moz-appearance: button;

/* 標準的なプロパティ（最近のブラウザ用） */
appearance: button;
```

これにより、古いブラウザにも対応しつつ、最新のブラウザでも標準の見た目が適用されます。
基本は、`appearance: button;`を使用しておけば問題ないかと思います。

## まとめ
appearance プロパティは、HTML要素の標準的な見た目を設定するために使います。
ベンダープリフィックス（-webkit- や -moz-）は、古いブラウザや特定のブラウザで見た目を統一するために使用します。
-webkit-appearance は主にChromeやSafari用、-moz-appearance はFirefox用の命令です。
ベンダープリフィックスの使い方を理解することで、どんなブラウザでも同じように表示されるWebページを作ることができます。


最後までご覧いただき本当にありがとうございました！！